}\r\n />\r\n );\r\n};\r\n\r\nexport default Dropdown;\r\n","/**\r\n * Color intention that you want to used in your theme\r\n * @param {JsonObject} theme Theme customization object\r\n */\r\n\r\nexport default function themePalette(theme) {\r\n return {\r\n mode: theme?.customization?.navType,\r\n common: {\r\n black: theme.colors?.darkPaper\r\n },\r\n primary: {\r\n light: theme.colors?.primaryLight,\r\n main: theme.colors?.primaryMain,\r\n dark: theme.colors?.primaryDark,\r\n 200: theme.colors?.primary200,\r\n 800: theme.colors?.primary800\r\n },\r\n secondary: {\r\n light: theme.colors?.secondaryLight,\r\n main: theme.colors?.secondaryMain,\r\n dark: theme.colors?.secondaryDark,\r\n 200: theme.colors?.secondary200,\r\n 800: theme.colors?.secondary800\r\n },\r\n error: {\r\n light: theme.colors?.errorLight,\r\n main: theme.colors?.errorMain,\r\n dark: theme.colors?.errorDark\r\n },\r\n orange: {\r\n light: theme.colors?.orangeLight,\r\n main: theme.colors?.orangeMain,\r\n dark: theme.colors?.orangeDark\r\n },\r\n warning: {\r\n light: theme.colors?.warningLight,\r\n main: theme.colors?.warningMain,\r\n dark: theme.colors?.warningDark\r\n },\r\n success: {\r\n light: theme.colors?.successLight,\r\n 200: theme.colors?.success200,\r\n main: theme.colors?.successMain,\r\n dark: theme.colors?.successDark\r\n },\r\n grey: {\r\n 50: theme.colors?.grey50,\r\n 100: theme.colors?.grey100,\r\n 500: theme.darkTextSecondary,\r\n 600: theme.heading,\r\n 700: theme.darkTextPrimary,\r\n 900: theme.textDark\r\n },\r\n dark: {\r\n light: theme.colors?.darkTextPrimary,\r\n main: theme.colors?.darkLevel1,\r\n dark: theme.colors?.darkLevel2,\r\n 800: theme.colors?.darkBackground,\r\n 900: theme.colors?.darkPaper\r\n },\r\n text: {\r\n primary: theme.darkTextPrimary,\r\n secondary: theme.darkTextSecondary,\r\n dark: theme.textDark,\r\n hint: theme.colors?.grey100\r\n },\r\n background: {\r\n paper: theme.paper,\r\n default: theme.backgroundDefault\r\n }\r\n };\r\n}\r\n","/**\r\n * Typography used in theme\r\n * @param {JsonObject} theme theme customization object\r\n */\r\n\r\nexport default function themeTypography(theme) {\r\n return {\r\n fontFamily: theme?.customization?.fontFamily,\r\n h6: {\r\n fontWeight: 500,\r\n color: theme.heading,\r\n fontSize: '0.75rem'\r\n },\r\n h5: {\r\n fontSize: '0.875rem',\r\n color: theme.heading,\r\n fontWeight: 500\r\n },\r\n h4: {\r\n fontSize: '1rem',\r\n color: theme.heading,\r\n fontWeight: 600\r\n },\r\n h3: {\r\n fontSize: '1.25rem',\r\n color: theme.heading,\r\n fontWeight: 600\r\n },\r\n h2: {\r\n fontSize: '1.5rem',\r\n color: theme.heading,\r\n fontWeight: 700\r\n },\r\n h1: {\r\n fontSize: '2.125rem',\r\n color: theme.heading,\r\n fontWeight: 700\r\n },\r\n subtitle1: {\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n color: theme.textDark\r\n },\r\n subtitle2: {\r\n fontSize: '0.75rem',\r\n fontWeight: 400,\r\n color: theme.darkTextSecondary\r\n },\r\n caption: {\r\n fontSize: '0.75rem',\r\n color: theme.darkTextSecondary,\r\n fontWeight: 400\r\n },\r\n body1: {\r\n fontSize: '0.875rem',\r\n fontWeight: 400,\r\n lineHeight: '1.334em'\r\n },\r\n body2: {\r\n letterSpacing: '0em',\r\n fontWeight: 400,\r\n lineHeight: '1.5em',\r\n color: theme.darkTextPrimary\r\n },\r\n button: {\r\n textTransform: 'capitalize'\r\n },\r\n customInput: {\r\n marginTop: 1,\r\n marginBottom: 1,\r\n '& > label': {\r\n top: 23,\r\n left: 0,\r\n color: theme.grey500,\r\n '&[data-shrink=\"false\"]': {\r\n top: 5\r\n }\r\n },\r\n '& > div > input': {\r\n padding: '30.5px 14px 11.5px !important'\r\n },\r\n '& legend': {\r\n display: 'none'\r\n },\r\n '& fieldset': {\r\n top: 0\r\n }\r\n },\r\n mainContent: {\r\n backgroundColor: theme.background,\r\n width: '100%',\r\n minHeight: 'calc(100vh - 88px)',\r\n flexGrow: 1,\r\n padding: '20px',\r\n marginTop: '88px',\r\n marginRight: '20px',\r\n borderRadius: `${theme?.customization?.borderRadius}px`\r\n },\r\n menuCaption: {\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n color: theme.heading,\r\n padding: '6px',\r\n textTransform: 'capitalize',\r\n marginTop: '10px'\r\n },\r\n subMenuCaption: {\r\n fontSize: '0.6875rem',\r\n fontWeight: 500,\r\n color: theme.darkTextSecondary,\r\n textTransform: 'capitalize'\r\n },\r\n commonAvatar: {\r\n cursor: 'pointer',\r\n borderRadius: '8px'\r\n },\r\n smallAvatar: {\r\n width: '22px',\r\n height: '22px',\r\n fontSize: '1rem'\r\n },\r\n mediumAvatar: {\r\n width: '34px',\r\n height: '34px',\r\n fontSize: '1.2rem'\r\n },\r\n largeAvatar: {\r\n width: '44px',\r\n height: '44px',\r\n fontSize: '1.5rem'\r\n }\r\n };\r\n}\r\n","import { createTheme } from '@mui/material/styles';\r\n\r\n// assets\r\nimport colors from 'assets/scss/_themes-vars.module.scss';\r\n\r\n// project imports\r\nimport componentStyleOverrides from './compStyleOverride';\r\nimport themePalette from './palette';\r\nimport themeTypography from './typography';\r\n\r\n/**\r\n * Represent theme style and structure as per Material-UI\r\n * @param {JsonObject} customization customization parameter object\r\n */\r\n\r\nexport const theme = (customization) => {\r\n const color = colors;\r\n\r\n const themeOption = {\r\n colors: color,\r\n heading: color.grey900,\r\n paper: color.paper,\r\n backgroundDefault: color.paper,\r\n background: color.primaryLight,\r\n darkTextPrimary: color.grey700,\r\n darkTextSecondary: color.grey500,\r\n textDark: color.grey900,\r\n menuSelected: color.secondaryDark,\r\n menuSelectedBack: color.secondaryLight,\r\n divider: color.grey200,\r\n customization\r\n };\r\n\r\n const themeOptions = {\r\n direction: 'ltr',\r\n palette: themePalette(themeOption),\r\n mixins: {\r\n toolbar: {\r\n minHeight: '48px',\r\n padding: '16px',\r\n '@media (min-width: 600px)': {\r\n minHeight: '48px'\r\n }\r\n }\r\n },\r\n typography: themeTypography(themeOption)\r\n };\r\n\r\n const themes = createTheme(themeOptions);\r\n themes.components = componentStyleOverrides(themeOption);\r\n\r\n return themes;\r\n};\r\n\r\nexport default theme;\r\n","export default function componentStyleOverrides(theme) {\r\n const bgColor = 'white';\r\n return {\r\n MuiButton: {\r\n styleOverrides: {\r\n root: {\r\n fontWeight: 500,\r\n borderRadius: '4px'\r\n }\r\n }\r\n },\r\n MuiPaper: {\r\n defaultProps: {\r\n elevation: 0\r\n },\r\n styleOverrides: {\r\n root: {\r\n backgroundImage: 'none'\r\n },\r\n rounded: {\r\n borderRadius: `${theme?.customization?.borderRadius}px`\r\n }\r\n }\r\n },\r\n MuiCardHeader: {\r\n styleOverrides: {\r\n root: {\r\n color: theme.colors?.textDark,\r\n padding: '24px'\r\n },\r\n title: {\r\n fontSize: '1.125rem'\r\n }\r\n }\r\n },\r\n MuiCardContent: {\r\n styleOverrides: {\r\n root: {\r\n padding: '24px'\r\n }\r\n }\r\n },\r\n MuiCardActions: {\r\n styleOverrides: {\r\n root: {\r\n padding: '24px'\r\n }\r\n }\r\n },\r\n MuiListItemButton: {\r\n styleOverrides: {\r\n root: {\r\n color: theme.darkTextPrimary,\r\n paddingTop: '10px',\r\n paddingBottom: '10px',\r\n '&.Mui-selected': {\r\n color: theme.menuSelected,\r\n backgroundColor: theme.menuSelectedBack,\r\n '&:hover': {\r\n backgroundColor: theme.menuSelectedBack\r\n },\r\n '& .MuiListItemIcon-root': {\r\n color: theme.menuSelected\r\n }\r\n },\r\n '&:hover': {\r\n backgroundColor: theme.menuSelectedBack,\r\n color: theme.menuSelected,\r\n '& .MuiListItemIcon-root': {\r\n color: theme.menuSelected\r\n }\r\n }\r\n }\r\n }\r\n },\r\n MuiListItemIcon: {\r\n styleOverrides: {\r\n root: {\r\n color: theme.darkTextPrimary,\r\n minWidth: '36px'\r\n }\r\n }\r\n },\r\n MuiListItemText: {\r\n styleOverrides: {\r\n primary: {\r\n color: theme.textDark\r\n }\r\n }\r\n },\r\n MuiInputBase: {\r\n styleOverrides: {\r\n input: {\r\n color: theme.textDark,\r\n '&::placeholder': {\r\n color: theme.darkTextSecondary,\r\n fontSize: '0.875rem'\r\n }\r\n }\r\n }\r\n },\r\n\r\n MuiOutlinedInput: {\r\n styleOverrides: {\r\n root: {\r\n // background: bgColor,\r\n borderRadius: `${theme?.customization?.borderRadius}px`,\r\n '& .MuiOutlinedInput-notchedOutline': {\r\n borderColor: theme.colors?.grey400\r\n },\r\n '&:hover $notchedOutline': {\r\n borderColor: theme.colors?.primaryLight\r\n },\r\n '&.MuiInputBase-multiline': {\r\n padding: 1\r\n },\r\n '&:hover fieldset': {\r\n borderColor: 'GREEN'\r\n },\r\n '&.Mui-focused ': {\r\n backgroundColor: '#E8F0FE'\r\n }\r\n },\r\n input: {\r\n fontWeight: 500,\r\n // background: bgColor,\r\n padding: '15.5px 14px',\r\n borderRadius: `${theme?.customization?.borderRadius}px`,\r\n '&.MuiInputBase-inputSizeSmall': {\r\n padding: '10px 14px',\r\n '&.MuiInputBase-inputAdornedStart': {\r\n paddingLeft: 0\r\n }\r\n }\r\n },\r\n inputAdornedStart: {\r\n paddingLeft: 4\r\n },\r\n notchedOutline: {\r\n borderRadius: `${theme?.customization?.borderRadius}px`\r\n }\r\n }\r\n },\r\n MuiSlider: {\r\n styleOverrides: {\r\n root: {\r\n '&.Mui-disabled': {\r\n color: theme.colors?.grey300\r\n }\r\n },\r\n mark: {\r\n backgroundColor: theme.paper,\r\n width: '4px'\r\n },\r\n valueLabel: {\r\n color: theme?.colors?.primaryLight\r\n }\r\n }\r\n },\r\n MuiDivider: {\r\n styleOverrides: {\r\n root: {\r\n borderColor: theme.divider,\r\n opacity: 1\r\n }\r\n }\r\n },\r\n MuiAvatar: {\r\n styleOverrides: {\r\n root: {\r\n color: theme.colors?.primaryDark,\r\n background: theme.colors?.primary200\r\n }\r\n }\r\n },\r\n MuiChip: {\r\n styleOverrides: {\r\n root: {\r\n '&.MuiChip-deletable .MuiChip-deleteIcon': {\r\n color: 'inherit'\r\n }\r\n }\r\n }\r\n },\r\n MuiTooltip: {\r\n styleOverrides: {\r\n tooltip: {\r\n color: theme.paper,\r\n background: theme.colors?.grey700\r\n }\r\n }\r\n }\r\n };\r\n}\r\n","import PropTypes from 'prop-types';\r\nimport { forwardRef } from 'react';\r\n\r\n// material-ui\r\nimport { useTheme } from '@mui/material/styles';\r\nimport { Card, CardContent, CardHeader, Divider, Typography } from '@mui/material';\r\n\r\n// constant\r\nconst headerSX = {\r\n '& .MuiCardHeader-action': { mr: 0 }\r\n};\r\n\r\n// ==============================|| CUSTOM MAIN CARD ||============================== //\r\n\r\nconst MainCard = forwardRef(\r\n (\r\n {\r\n border = true,\r\n boxShadow,\r\n children,\r\n content = true,\r\n contentClass = '',\r\n contentSX = {},\r\n darkTitle,\r\n secondary,\r\n shadow,\r\n sx = {},\r\n title,\r\n ...others\r\n },\r\n ref\r\n ) => {\r\n const theme = useTheme();\r\n\r\n return (\r\n \r\n {/* card header and action */}\r\n {!darkTitle && title && }\r\n {darkTitle && title && (\r\n {title}} action={secondary} />\r\n )}\r\n\r\n {/* content & header divider */}\r\n {title && }\r\n\r\n {/* card content */}\r\n {content && (\r\n \r\n {children}\r\n \r\n )}\r\n {!content && children}\r\n \r\n );\r\n }\r\n);\r\n\r\nMainCard.propTypes = {\r\n border: PropTypes.bool,\r\n boxShadow: PropTypes.bool,\r\n children: PropTypes.node,\r\n content: PropTypes.bool,\r\n contentClass: PropTypes.string,\r\n contentSX: PropTypes.object,\r\n darkTitle: PropTypes.bool,\r\n secondary: PropTypes.oneOfType([PropTypes.node, PropTypes.string, PropTypes.object]),\r\n shadow: PropTypes.string,\r\n sx: PropTypes.object,\r\n title: PropTypes.oneOfType([PropTypes.node, PropTypes.string, PropTypes.object])\r\n};\r\n\r\nexport default MainCard;\r\n","import { createContext, useContext, useState, useRef } from 'react';\r\nimport { Stack, Box, Typography, Button } from '@mui/material';\r\nimport ErrorIcon from '@mui/icons-material/Error';\r\nimport WarningIcon from '@mui/icons-material/Warning';\r\nimport InfoIcon from '@mui/icons-material/Info';\r\nimport QuestionMarkOutlinedIcon from '@mui/icons-material/QuestionMarkOutlined';\r\nimport { Popup } from '@grapecity/wijmo.react.input';\r\nimport { styleExplorer } from 'qubCommon/qubStyles';\r\nimport '@grapecity/wijmo.styles/wijmo.css';\r\nimport { FlexGrid } from '@grapecity/wijmo.react.grid';\r\n\r\nconst ModalImages = {\r\n Warning: 1,\r\n Question: 2,\r\n Error: 3,\r\n Info: 4\r\n};\r\n\r\nconst ModalButtons = {\r\n OkCancel: 1,\r\n YesNo: 2,\r\n YesNoCancel: 3,\r\n OK: 4,\r\n Yes: 5,\r\n No: 6,\r\n Cancel: 7\r\n};\r\n\r\nconst ModalContext = createContext({});\r\n\r\nconst ModalImage = ({ imageType }) => {\r\n if (imageType === ModalImages.Error) return ;\r\n if (imageType === ModalImages.Warning) return ;\r\n if (imageType === ModalImages.Info) return ;\r\n if (imageType === ModalImages.Question) return ;\r\n return <>>;\r\n};\r\n\r\nfunction getbuttonsArray(buttons) {\r\n let buttonsArray;\r\n switch (buttons) {\r\n case ModalButtons.YesNo:\r\n buttonsArray = [\r\n { label: 'Ναι', command: ModalButtons.Yes },\r\n { label: 'Οχι', command: ModalButtons.No }\r\n ];\r\n break;\r\n case ModalButtons.OK:\r\n buttonsArray = [{ label: 'OK', command: ModalButtons.OK }];\r\n break;\r\n case ModalButtons.OkCancel:\r\n buttonsArray = [\r\n { label: 'OK', command: ModalButtons.OK },\r\n { label: 'Cancel', command: ModalButtons.Cancel }\r\n ];\r\n break;\r\n case ModalButtons.YesNoCancel:\r\n buttonsArray = [\r\n { label: 'Ναι', command: ModalButtons.Yes },\r\n { label: 'Οχι', command: ModalButtons.No },\r\n { label: 'Ακύρωση', command: ModalButtons.Cancel }\r\n ];\r\n break;\r\n default:\r\n buttonsArray = [{ label: 'OK', command: ModalButtons.OK }];\r\n break;\r\n }\r\n\r\n return buttonsArray;\r\n}\r\n\r\nfunction ModalProvider({ children }) {\r\n const [title, setTitle] = useState(null);\r\n const [message, setMessage] = useState('');\r\n const [imageType, setImageType] = useState(null);\r\n const [defaultButton, setDefaultButton] = useState(null);\r\n const [isGrid, setIsGrid] = useState(false);\r\n const [gridData, setGridData] = useState(null);\r\n const popupRef = useRef();\r\n\r\n const popupInitialized = (popup) => {\r\n popup.isDraggable = true;\r\n popup.isResizable = true;\r\n popup.fadeOut = false;\r\n popup.fadeIn = false;\r\n\r\n popupRef.current = popup;\r\n };\r\n\r\n const gridLoadedRows = (flex) => {\r\n flex.autoSizeColumns();\r\n };\r\n\r\n const [buttons, setButtons] = useState([]);\r\n const ref = useRef();\r\n\r\n function openGrid(props) {\r\n setIsGrid(true);\r\n const { title, gridData } = props;\r\n setTitle(title);\r\n setGridData(gridData);\r\n\r\n popupRef.current.show(true);\r\n popupRef.current.centerPopup();\r\n }\r\n function openModal(props) {\r\n const { title, message, imageType, buttons, callback, defaultButton } = props;\r\n\r\n ref.current = {\r\n callback\r\n };\r\n setIsGrid(false);\r\n setDefaultButton(defaultButton);\r\n setButtons(getbuttonsArray(buttons));\r\n popupRef.current.show(true);\r\n console.log(popupRef.current.hostElement.offsetHeight);\r\n console.log(popupRef.current.hostElement.offsetWidth);\r\n setTitle(title);\r\n setMessage(message);\r\n setImageType(imageType);\r\n popupRef.current.hostElement.style.top = `calc(50% - ${popupRef.current.hostElement.offsetHeight / 2}px)`;\r\n popupRef.current.hostElement.style.left = `calc(50% - ${popupRef.current.hostElement.offsetWidth / 2}px)`;\r\n }\r\n\r\n const handleButtonClick = (command) => {\r\n setTitle(null);\r\n popupRef.current.hide();\r\n ref.current.callback(command);\r\n setIsGrid(false);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n
{title}
\r\n \r\n
\r\n
\r\n {!isGrid ? (\r\n <>\r\n \r\n \r\n \r\n \r\n {message}\r\n \r\n \r\n \r\n\r\n \r\n {buttons.map((b) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n >\r\n ) : (\r\n \r\n )}\r\n \r\n \r\n\r\n {children}\r\n \r\n );\r\n}\r\n\r\nfunction useModal() {\r\n const modalContext = useContext(ModalContext);\r\n if (!modalContext) {\r\n throw new Error('useModal must be used within LoadingProvider');\r\n }\r\n\r\n return modalContext;\r\n}\r\n\r\nexport { ModalProvider, useModal, ModalButtons, ModalImages };\r\n","import PropTypes from 'prop-types';\r\nimport { Grid } from '@mui/material';\r\nimport { FormProvider } from 'react-hook-form';\r\nimport Dropdown from './Dropdown';\r\nimport TextInput from './TextInput';\r\nimport DatePicker from './DatePicker';\r\nimport Checkbox from './Checkbox';\r\n\r\nconst DynamicField = (props) => {\r\n const { name, type, isReadOnly, value, label, id, ...rest } = props;\r\n switch (type) {\r\n case 'string':\r\n return ;\r\n case 'date':\r\n return ;\r\n case 'boolean':\r\n return ;\r\n case 'dropdown':\r\n return (\r\n \r\n );\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nDynamicField.propTypes = {\r\n id: PropTypes.number,\r\n name: PropTypes.string.isRequired,\r\n type: PropTypes.string.isRequired,\r\n isReadOnly: PropTypes.bool,\r\n value: PropTypes.any,\r\n label: PropTypes.string.isRequired\r\n};\r\n\r\nconst DynamicForm = ({ form, methods }) => (\r\n \r\n \r\n {form.map((field) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n);\r\n\r\nDynamicForm.propTypes = {\r\n form: PropTypes.array,\r\n methods: PropTypes.object.isRequired\r\n};\r\n\r\nexport default DynamicForm;\r\n","import axiosInstance from '../axiosInstance';\r\n\r\nexport const apiEntitiesApi = {\r\n post: (path, params, cancelToken) =>\r\n axiosInstance\r\n .post(`/apiEntities${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n // if (res?.data?.error || res?.data?.status === 'error') throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n }),\r\n get: (path, params, cancelToken) =>\r\n axiosInstance\r\n .get(`/apiEntities${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n })\r\n};\r\n\r\nexport const getData = async (params) => apiEntitiesApi.post('/getData', params);\r\n","import { styled } from '@mui/material/styles';\r\nimport { TextField } from '@mui/material';\r\n\r\nexport const CssTextField = styled(TextField)({\r\n // '& .MuiOutlinedInput-root': {\r\n // '&:hover fieldset': {\r\n // borderColor: 'GREEN'\r\n // },\r\n // '&.Mui-focused ': {\r\n // backgroundColor: 'yellow',\r\n // borderColor: 'green'\r\n // },\r\n // '&.Mui-focused fieldset ': {\r\n // borderColor: '#66C3A8'\r\n // }\r\n // }\r\n});\r\n","import { Box } from '@mui/material';\r\nimport propTypes from 'prop-types';\r\n\r\nconst Spice = ({ color = '#2196f3', ...rest }) => ;\r\n\r\nSpice.propTypes = {\r\n color: propTypes.string\r\n};\r\n\r\nexport default Spice;\r\n","import propTypes from 'prop-types';\r\n\r\nconst greetings = (time) => (time.getHours() >= 12 ? 'Καλησπέρα' : 'Καλημέρα');\r\n\r\ngreetings.propTypes = {\r\n time: propTypes.time\r\n};\r\n\r\nexport default greetings;\r\n","import { memo } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\n// mui\r\nimport { Stack, Typography, useMediaQuery, useTheme } from '@mui/material';\r\n\r\n// project impors\r\nimport Spice from './Spice';\r\n\r\n// utils\r\nimport { greetings } from 'utils';\r\n\r\n// i18n\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst FullName = memo(() => {\r\n const { firstName, lastName } = useSelector((state) => state.auth);\r\n const theme = useTheme();\r\n const matchUpMd = useMediaQuery(theme.breakpoints.up('sm'));\r\n const date = new Date();\r\n const { t } = useTranslation();\r\n\r\n // Responsive Text Size\r\n const textVariant = () => (matchUpMd ? 'h2' : 'h4');\r\n return (\r\n \r\n \r\n {`${t(greetings(date), greetings(date))},`}\r\n \r\n {`${firstName} ${lastName}`}\r\n \r\n \r\n );\r\n});\r\n\r\nexport default FullName;\r\n","import React from 'react';\r\n\r\n// material ui\r\nimport { Button, DialogTitle, Dialog, DialogContent, DialogActions, DialogContentText } from '@mui/material';\r\nimport { TextInput } from '@qubiteq/qublib';\r\n// i18n\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n// React Crop\r\n// import 'react-image-crop/dist/ReactCrop.css';\r\n\r\n// proptypes\r\nimport propTypes from 'prop-types';\r\n\r\nconst CustomDialog = ({ open, onClose, onAccept, meta, content, ...props }) => {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nCustomDialog.propTypes = {\r\n open: propTypes.bool,\r\n onClose: propTypes.func,\r\n onAccept: propTypes.func,\r\n meta: propTypes.object,\r\n content: propTypes.element,\r\n props: propTypes.any\r\n};\r\n\r\nexport default CustomDialog;\r\n","export default __webpack_public_path__ + \"static/media/pdf.ea368c58.png\";","import { memo, createContext, useEffect } from 'react';\r\nimport propTypes from 'prop-types';\r\nimport { useQuery } from 'react-query';\r\nimport { useSelector } from 'react-redux';\r\nimport { auth } from 'apis';\r\nimport { useLogout } from 'hooks/useLogOut';\r\nimport { useSnackbar } from 'notistack';\r\nimport { defineAbility } from '@casl/ability';\r\nimport { createContextualCan } from '@casl/react';\r\nimport { useNavigate } from 'react-router';\r\n\r\nconst UserContext = createContext();\r\n\r\nconst minutesToMSeconds = ({ minutes }) => minutes * 60 * 1000;\r\n\r\nconst UserProvider = memo(({ children }) => {\r\n const { isLoggedIn } = useSelector((state) => state.auth);\r\n const { enqueueSnackbar } = useSnackbar();\r\n const navigate = useNavigate();\r\n const { logout } = useLogout();\r\n\r\n const meQuery = useQuery(\r\n 'me',\r\n async () => {\r\n try {\r\n const res = await auth.getMe();\r\n const organization = null;\r\n // const organization = await person.getUserClub().catch((error) => console.error('org error', error));\r\n const formatedPermissions = res.permissions.map((dbPermission) => {\r\n const [subject, action] = dbPermission.split('.');\r\n return {\r\n action,\r\n subject\r\n };\r\n });\r\n const abilities = defineAbility((can) => {\r\n formatedPermissions.forEach((element) => {\r\n can(element.action, element.subject);\r\n });\r\n });\r\n return { ...res, organization, permissions: abilities };\r\n } catch (error) {\r\n console.info('res', error);\r\n if (error?.status === 400) {\r\n enqueueSnackbar('Your connection has expired, please login again', {\r\n variant: 'error'\r\n });\r\n logout();\r\n }\r\n if (error?.status === 503) {\r\n navigate('site-is-temporarily-unavailable');\r\n }\r\n throw error;\r\n }\r\n },\r\n {\r\n refetchOnWindowFocus: false\r\n },\r\n {\r\n retry: 1,\r\n refetchInterval: minutesToMSeconds({ minutes: 120 })\r\n /// enabled: isLoggedIn\r\n }\r\n );\r\n\r\n useEffect(() => {\r\n if (isLoggedIn) {\r\n meQuery.refetch();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isLoggedIn]);\r\n return {children};\r\n});\r\n\r\nUserProvider.propTypes = {\r\n children: propTypes.node\r\n};\r\n\r\nexport { UserProvider, UserContext };\r\nexport const Can = createContextualCan(UserContext.Consumer);\r\n","import { useCallback } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useQueryClient } from 'react-query';\r\nimport axiosInstance from 'apis/axiosInstance';\r\nimport { RESET_MENU, LOGOUT } from 'store/actions';\r\nimport { store } from 'store';\r\nimport { auth } from 'apis';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nexport const useLogout = () => {\r\n const dispatch = useDispatch();\r\n const queryClient = useQueryClient();\r\n const authState = useSelector((state) => state.auth);\r\n const navigate = useNavigate();\r\n const logout = useCallback(async () => {\r\n const refreshToken = authState.refreshToken;\r\n // notify backend to blacklist token\r\n await auth.logout({ refreshToken }).catch((err) => console.error(err));\r\n // reset store\r\n dispatch({ type: RESET_MENU });\r\n dispatch({ type: LOGOUT });\r\n // reset axios interceptors\r\n axiosInstance.interceptors.request.use((config) => {\r\n const state = store.getState();\r\n config.headers = {\r\n ...config.headers,\r\n Authorization: `Bearer ${state.auth.token}`\r\n };\r\n return config;\r\n });\r\n // cancel queries\r\n queryClient.cancelQueries('me');\r\n navigate('/');\r\n }, [authState, dispatch, queryClient]);\r\n\r\n return { logout };\r\n};\r\n","import { Suspense } from 'react';\r\n\r\n// project imports\r\nimport Loader from './Loader';\r\n\r\n// ==============================|| LOADABLE - LAZY LOADING ||============================== //\r\n\r\nconst Loadable = (Component) => (props) =>\r\n (\r\n }>\r\n \r\n \r\n );\r\n\r\nexport default Loadable;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst Conditional = ({ condition, children, hide }) => {\r\n if (hide) {\r\n return {children}
;\r\n }\r\n return condition ? <>{children}> : null;\r\n};\r\n\r\nConditional.propTypes = {\r\n condition: PropTypes.bool.isRequired,\r\n children: PropTypes.node\r\n};\r\n\r\nexport default Conditional;\r\n","import React, { createContext, useRef, useState, useContext, useEffect, useCallback } from 'react';\r\nimport { Dialog, DialogContent, DialogContentText, DialogActions, DialogTitle, Button, Stack } from '@mui/material';\r\nimport propTypes from 'prop-types';\r\nimport { useForm } from 'react-hook-form';\r\nimport { DynamicForm, useYupValidationResolver } from '@qubiteq/qublib';\r\n\r\nconst DialogContext = createContext();\r\n\r\nfunction useDialog() {\r\n const dialogContext = useContext(DialogContext);\r\n const handleSubmit = dialogContext?.form?.handleSubmit;\r\n const reset = dialogContext?.form?.reset;\r\n\r\n const openDialog = (props) => {\r\n const { title, description, acceptButtonTitle, cancelButtonTitle, onClose, onAccept, form, validationSchema, render, watchField } =\r\n props;\r\n\r\n dialogContext.setOpen(true);\r\n dialogContext.setTitle(title);\r\n dialogContext.setDescription(description);\r\n dialogContext.setAcceptButtonTitle(acceptButtonTitle);\r\n dialogContext.setCancelButtonTitle(cancelButtonTitle);\r\n dialogContext.setFormJSON(form);\r\n dialogContext.setValidationSchema(validationSchema);\r\n if (watchField) {\r\n dialogContext.watch(watchField);\r\n }\r\n dialogContext.mutateOnClose(() => {\r\n if (onClose) {\r\n onClose();\r\n }\r\n dialogContext.watchersUnsubscribe();\r\n dialogContext.mutateRender(null);\r\n dialogContext.setOpen(false);\r\n if (reset !== undefined || reset !== null) {\r\n dialogContext.setFormJSON([]);\r\n reset({});\r\n }\r\n });\r\n if (onAccept) {\r\n dialogContext.mutateOnAccept(\r\n handleSubmit((data) => {\r\n onAccept(data);\r\n dialogContext.setOpen(false);\r\n if (reset !== undefined || reset !== null) {\r\n reset({});\r\n }\r\n })\r\n );\r\n }\r\n if (render) {\r\n dialogContext.mutateRender(render);\r\n }\r\n };\r\n // dialogContext.onClose.current();\r\n return { openDialog, form: dialogContext?.form, setForm: dialogContext.setFormJSON, formJSON: dialogContext.formJSON };\r\n}\r\n\r\nconst DialogProvider = ({ children }) => {\r\n const [open, setOpen] = useState(false);\r\n const [title, setTitle] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [acceptButtonTitle, setAcceptButtonTitle] = useState('');\r\n const [cancelButtonTitle, setCancelButtonTitle] = useState('');\r\n const [formJSON, setFormJSON] = useState([]);\r\n const [validationSchema, setValidationSchema] = useState(null);\r\n const [render, setRender] = useState(null);\r\n const onAccept = useRef(() => setOpen(false));\r\n const onClose = useRef(() => setOpen(false));\r\n const watchers = useRef([]);\r\n\r\n const mutateOnAccept = (callBack) => {\r\n onAccept.current = callBack;\r\n };\r\n\r\n const mutateOnClose = (callBack) => {\r\n onClose.current = callBack;\r\n };\r\n\r\n const mutateRender = useCallback((render) => {\r\n setRender(render);\r\n }, []);\r\n\r\n const watchersUnsubscribe = () => {\r\n watchers.current.forEach((watcher) => watcher.unsubscribe());\r\n };\r\n\r\n const resolver = useYupValidationResolver(validationSchema);\r\n\r\n const form = useForm({ resolver: validationSchema ? resolver : null });\r\n\r\n const watch = (watchFunction) => {\r\n const watcher = form?.watch(watchFunction);\r\n watchers.current.push(watcher);\r\n };\r\n\r\n useEffect(() => {\r\n return watchersUnsubscribe;\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n \r\n {children}\r\n \r\n >\r\n );\r\n};\r\n\r\nDialogProvider.propTypes = {\r\n children: propTypes.node\r\n};\r\n\r\nconst DialogConsumer = DialogContext.Consumer;\r\n\r\nexport { DialogProvider, DialogConsumer, useDialog };\r\n","import jwt from 'jwt-decode';\r\n\r\nexport default (token) => jwt(token);\r\n","import axiosInstance from '../axiosInstance';\r\n\r\nexport const eventApi = {\r\n post: (path, params, cancelToken) =>\r\n axiosInstance\r\n .post(`/event${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n }),\r\n get: (path, params, cancelToken) =>\r\n axiosInstance\r\n .get(`/event${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n })\r\n};\r\n\r\nexport const getEvents = async (params) => eventApi.get('/getEvents', { params });\r\nexport const createOrUpdate = async (params) => eventApi.post('/CreateOrUpdate', params);\r\nexport const addParticipation = async (params) => eventApi.get('/AddParticipation', { params });\r\nexport const sendGuestParticipationEmail = async (params) => eventApi.post('/SendGuestParticipationMail', params);\r\n","import { Grid, Skeleton } from '@mui/material';\r\n\r\nconst DynamicFormSkeleton = () => (\r\n \r\n {[1, 2, 3, 4, 5, 6, 7, 8].map((row) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n);\r\n\r\nexport default DynamicFormSkeleton;\r\n","import { useEffect, useState, useCallback, useRef, useImperativeHandle } from 'react';\r\nimport { useSnackbar } from 'notistack';\r\nimport { useFormContext } from 'react-hook-form';\r\nimport { backoffice } from 'apis';\r\nimport { useBringValue } from '@qubiteq/datagrid';\r\nimport { isFunction } from 'lodash';\r\n\r\nconst useBringValueInput = ({ props, ref, runOnInit }) => {\r\n const { enqueueSnackbar } = useSnackbar();\r\n const { register, formState, setValue, getValues } = useFormContext();\r\n const { errors } = formState;\r\n const { name, rules, defaultIdValue, defaultDescriptionValue, dataKey, searchField, additionalFilters, onSelected, onNotFound } = props;\r\n const paramsRef = useRef(null);\r\n\r\n const handleBringValue = useCallback(\r\n async ({ dataKey, filters, ...rest }) => {\r\n try {\r\n const result = await backoffice\r\n .getData({\r\n dataKey,\r\n pageSize: 20,\r\n filters,\r\n additionalFilters,\r\n ...rest\r\n })\r\n .catch((err) => {\r\n throw err;\r\n });\r\n\r\n if (!result) {\r\n throw new Error('No data');\r\n }\r\n\r\n const { itemsCount, items } = result;\r\n if (itemsCount === 0) {\r\n if (onNotFound && isFunction(onNotFound)) onNotFound();\r\n enqueueSnackbar('Δεν βρέθηκε εγγραφή', {\r\n variant: 'warning'\r\n });\r\n setValue(name, null);\r\n setValue(`${name}Description`, '');\r\n }\r\n\r\n return {\r\n itemsCount,\r\n items\r\n };\r\n } catch (err) {\r\n console.error(err);\r\n return {};\r\n }\r\n },\r\n [additionalFilters]\r\n );\r\n\r\n const handleSelectBringValue = ({ item }) => {\r\n setValue(name, item[paramsRef.current.primaryKeyName]);\r\n setValue(`${name}Description`, item[searchField]);\r\n if (onSelected) {\r\n onSelected(item);\r\n }\r\n };\r\n\r\n const bringValue = useBringValue(handleBringValue, backoffice.getParams, handleSelectBringValue);\r\n\r\n useEffect(() => {\r\n const initialFetch = async () => {\r\n const filters = [];\r\n const idValue = getValues()[name] || defaultIdValue;\r\n\r\n const params = await backoffice.getParams({ dataKey });\r\n paramsRef.current = params.params;\r\n if (idValue) {\r\n if (params?.params) {\r\n filters.push({\r\n filter: idValue,\r\n operation: 'custom',\r\n searchField: paramsRef.current.primaryKeyName\r\n });\r\n }\r\n }\r\n const result = await handleBringValue({ dataKey, filters });\r\n if (result?.itemsCount === 1 && runOnInit) {\r\n handleSelectBringValue({ item: result.items[0] });\r\n }\r\n };\r\n\r\n initialFetch();\r\n }, [handleBringValue]);\r\n\r\n useEffect(() => {\r\n setValue(name, defaultIdValue);\r\n }, [setValue, name, defaultIdValue]);\r\n\r\n useEffect(() => {\r\n setValue(`${name}Description`, defaultDescriptionValue);\r\n }, [defaultDescriptionValue]);\r\n\r\n const onChange = (e) => {\r\n // setValue(`${name}Description`, e.target.value);\r\n if (e.target.value === '') {\r\n setValue(name, null);\r\n }\r\n };\r\n\r\n const onKeyDown = async (e) => {\r\n if (e.key === 'Enter') {\r\n const filter = [\r\n {\r\n searchField,\r\n filter: `${e.target.value}*`,\r\n operation: 'custom'\r\n }\r\n ];\r\n await bringValue.bringValue({ e }, dataKey, filter);\r\n }\r\n };\r\n\r\n const clear = () => {\r\n setValue(name, null);\r\n setValue(`${name}Description`, '');\r\n if (onNotFound && isFunction(onNotFound)) onNotFound();\r\n };\r\n\r\n return {\r\n bringValue,\r\n registerProps: register(name, rules),\r\n descriptionRegisterProps: register(`${name}Description`, rules),\r\n errors,\r\n onKeyDown,\r\n onChange,\r\n clear\r\n };\r\n};\r\n\r\nexport default useBringValueInput;\r\n","import React, { useEffect, useRef } from 'react';\r\nimport { Stack, TextField, Typography, InputAdornment } from '@mui/material';\r\nimport PropTypes from 'prop-types';\r\nimport { BringValueView, GridPropsProvider } from '@qubiteq/datagrid';\r\nimport { IconSearch, IconX } from '@tabler/icons';\r\n\r\nimport useBringValueInput from './useBringValueInput';\r\n/* eslint-disable react/jsx-no-duplicate-props */\r\n\r\nconst BringValueInput = (props, ref) => {\r\n const { name, rules, runOnInit = true, label, ...other } = props;\r\n const { registerProps, descriptionRegisterProps, errors, bringValue, onKeyDown, onChange, clear } = useBringValueInput({\r\n props,\r\n ref,\r\n runOnInit\r\n });\r\n\r\n delete other.defaultDescriptionValue;\r\n delete other.defaultIdValue;\r\n delete other.searchField;\r\n delete other.dataKey;\r\n delete other.additionalFilters;\r\n delete other.onNotFound;\r\n delete other.onSelected;\r\n\r\n return (\r\n <>\r\n {/* Temporary fix */}\r\n null }}>\r\n \r\n \r\n \r\n \r\n {typeof label === 'string' ? {label} : label}\r\n \r\n \r\n \r\n ),\r\n // eslint-disable-next-line react/destructuring-assignment\r\n endAdornment: !props?.disabled && (\r\n \r\n \r\n \r\n )\r\n }}\r\n InputLabelProps={{ shrink: true }}\r\n error={!!errors[name]}\r\n helperText={errors[name]?.message}\r\n required={rules?.required}\r\n size=\"small\"\r\n fullWidth\r\n {...other}\r\n />\r\n \r\n >\r\n );\r\n};\r\n\r\n// BringValueInput.propTypes = {\r\n// name: PropTypes.string,\r\n// rules: PropTypes.any,\r\n// label: PropTypes.string\r\n// };\r\n\r\nexport default React.forwardRef(BringValueInput);\r\n","import BringValueInput from './BringValueInput';\r\n\r\nexport default BringValueInput;\r\n","import axios from 'axios';\r\n\r\nconst baseURL = window.urlAPI;\r\nconst reportsAxiosInstance = axios.create({\r\n baseURL\r\n});\r\n\r\nexport default reportsAxiosInstance;\r\n","import reportsAxiosInstance from 'apis/reportsAxiosInstance';\r\n\r\nconst qubiteqSubKey = window.qubSubKey;\r\n\r\nexport const reportsApi = {\r\n post: (path, params, options, cancelToken) =>\r\n reportsAxiosInstance\r\n .post(`${path}`, params, {\r\n ...options,\r\n cancelToken: cancelToken?.token,\r\n headers: {\r\n 'qubiteq-subscription-key': qubiteqSubKey,\r\n 'Access-Control-Allow-Origin': '*'\r\n }\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n }),\r\n get: (path, params, cancelToken) =>\r\n reportsAxiosInstance\r\n .get(`/event${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n })\r\n};\r\n\r\nexport const getQubReport = async (params, options) => reportsApi.post('/Report/GetPDF', params, options);\r\n\r\nexport const getQubReportExcel = async (params, options) => reportsApi.post('/Report/GetExcel', params, options);\r\n\r\nexport const saveFile = async (params, options) => reportsApi.post('/File/UploadFile', params, options);\r\n\r\nexport const getFile = async (params, options) => reportsApi.post('/File/GetFile', params, options);\r\n","// action - customization reducer\r\nexport const SET_MENU = '@customization/SET_MENU';\r\nexport const MENU_TOGGLE = '@customization/MENU_TOGGLE';\r\nexport const MENU_OPEN = '@customization/MENU_OPEN';\r\nexport const SET_FONT_FAMILY = '@customization/SET_FONT_FAMILY';\r\nexport const SET_BORDER_RADIUS = '@customization/SET_BORDER_RADIUS';\r\nexport const SET_LANGUAGE = '@customization/SET_LANGUAGE';\r\nexport const LOGIN = '@authentication/LOGIN';\r\nexport const LOGOUT = '@authentication/LOGOUT';\r\nexport const VERIFY_EMAIL = '@authentication/VERIFY_EMAIL';\r\nexport const LOCK_MENU = '@menu/SET_MENU_LOCKED';\r\nexport const RESET_MENU = '@menu/RESET_MENU';\r\nexport const SET_BREADCRUMBS = '@breadcrumbs/SET_BREADCRUMBS';\r\nexport const RESET_BREADCRUMBS = '@breadcrumbs/RESET_BREADCRUMBS';\r\nexport const LOADING = '@customization/LOADING';\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAMmaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzEzOCA3OS4xNTk4MjQsIDIwMTYvMDkvMTQtMDE6MDk6MDEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkE1RTY3M0Y0OUIxMUU5ODc3RkNFNkU5NjBCNkExNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMkE1RTY3NEY0OUIxMUU5ODc3RkNFNkU5NjBCNkExNSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjIyQTVFNjcxRjQ5QjExRTk4NzdGQ0U2RTk2MEI2QTE1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjIyQTVFNjcyRjQ5QjExRTk4NzdGQ0U2RTk2MEI2QTE1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Kur7lQAAABl0RVh0U29mdHdhcmUAQWRv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\"","export default __webpack_public_path__ + \"static/media/loading.87f90117.gif\";","import { useState, useRef, useEffect } from 'react';\r\nimport { useForm } from 'react-hook-form';\r\nimport { apiEntities } from 'apis';\r\n\r\nconst operators = [\r\n { id: 'contains', operator: 'Περιέχει' },\r\n { id: 'beginsWith', operator: 'Αρχίζει' },\r\n { id: 'endsWith', operator: 'Τελειώνει' },\r\n { id: '=', operator: '=' },\r\n { id: '>', operator: '>' },\r\n { id: '>=', operator: '>=' },\r\n { id: '<', operator: '<' },\r\n { id: '<=', operator: '<=' },\r\n { id: '<>', operator: '<>' },\r\n { id: 'between', operator: 'Μεταξύ' },\r\n { id: 'isNull', operator: 'NULL' },\r\n { id: 'isEmpty', operator: 'ΚΕΝΟ' }\r\n];\r\n\r\nconst useBringValue = (props) => {\r\n const [datakey, setDatakey] = useState(null);\r\n const [searchValue, setSearchValue] = useState('');\r\n const [searchField, setSearchField] = useState('');\r\n const [secondValueField, setSecondValueField] = useState(false);\r\n // const [additionalFilter, setAdditionalFilter] = useState(\"\");\r\n // const [multiSelect, setMultiSelect] = useState(false);\r\n const [title, setTitle] = useState('');\r\n const [gridData, setGridData] = useState([]);\r\n const [columns, setColumns] = useState([]);\r\n const [bvFieldSearch, setBVFieldSearch] = useState([]);\r\n const [operatorsOptions, setOperatorsOptions] = useState([]);\r\n const [dataLoading, setDataLoading] = useState(false);\r\n\r\n const bvForm = useForm();\r\n const ref = useRef();\r\n const gridRef = useRef();\r\n const popupRef = useRef();\r\n\r\n const getOperators = () => {\r\n const value = bvForm.getValues('searchFieldName');\r\n const selectedItem = bvFieldSearch?.find((field) => field?.fldSearchName === value);\r\n const dataType = selectedItem?.dataType;\r\n let availableOptions = operators;\r\n if (dataType === 'date' || dataType === 'datetime')\r\n availableOptions = operators.filter((operator) => ['=', '>', '>=', '<', '<=', '<>', 'between', 'isNull'].includes(operator.id));\r\n if (dataType === 'boolean') operators.filter((operator) => ['='].includes(operator.id));\r\n if (dataType === 'int' || dataType === 'decimal')\r\n operators.filter((operator) => ['=', '>', '>=', '<', '<=', '<>', 'between', 'isNull'].includes(operator.id));\r\n\r\n return availableOptions;\r\n };\r\n\r\n // dependent dropdown\r\n useEffect(() => {\r\n if (bvForm?.watch('searchFieldName')) {\r\n setOperatorsOptions(getOperators());\r\n bvForm.setValue('operator', getOperators()[0]?.id);\r\n } else {\r\n const defaultValue = bvForm?.getValues('searchFieldName');\r\n setOperatorsOptions(getOperators());\r\n }\r\n }, [bvForm?.watch('searchFieldName')]);\r\n\r\n // dependent dropdown\r\n useEffect(() => {\r\n if (bvForm?.watch('operator')) {\r\n if (bvForm?.watch('operator') === 'between') setSecondValueField(true);\r\n else {\r\n setSecondValueField(false);\r\n bvForm.unregister('value2');\r\n }\r\n } else {\r\n setSecondValueField(false);\r\n bvForm.unregister('value2');\r\n }\r\n }, [bvForm?.watch('operator')]);\r\n\r\n const gridInitialized = (flex) => {\r\n flex.stickyHeaders = true;\r\n flex.headersVisibility = 'Column';\r\n flex.selectionMode = 'Row';\r\n flex.keyActionEnter = 'None';\r\n flex.isReadOnly = true;\r\n gridRef.current = flex;\r\n // const view = flex.collectionView;\r\n flex.hostElement.addEventListener('dblclick', (e) => {\r\n const ht = flex.hitTest(e.pageX, e.pageY);\r\n const view = ht?.grid?.collectionView;\r\n const currentItem = view.currentItem;\r\n if (currentItem && ht.cellType === 1) {\r\n /* Runs handle select */\r\n ref.current.callback(view.currentItem);\r\n popupRef?.current?.hide();\r\n setDatakey(null);\r\n setGridData(null);\r\n }\r\n });\r\n\r\n flex.hostElement.addEventListener('keydown', (e) => {\r\n const view = flex.collectionView;\r\n if (e.code === 'Enter' && view.currentItem) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n /* Runs handle select */\r\n ref.current.callback(view.currentItem);\r\n popupRef?.current?.hide();\r\n setDatakey(null);\r\n setGridData(null);\r\n }\r\n });\r\n };\r\n\r\n const popupInitialized = (popup) => {\r\n popup.isDraggable = true;\r\n popup.isResizable = true;\r\n popup.fadeOut = false;\r\n popup.fadeIn = false;\r\n\r\n popupRef.current = popup;\r\n };\r\n\r\n const selectItem = (select) => {\r\n if (select) ref?.current?.callback(gridRef.current?.collectionView?.currentItem);\r\n else ref?.current?.callback('BringValue canceled no item selected');\r\n popupRef?.current?.hide();\r\n setDatakey(null);\r\n setGridData(null);\r\n };\r\n\r\n /* Submit Function for FieldSearch inside BringValue Modal */\r\n const onSubmit = async (data) => {\r\n const fieldSearchParams = [\r\n { fldName: data?.searchFieldName, operator: data?.operator, value1: data?.value1, value2: data?.value2 }\r\n ];\r\n setDataLoading(true);\r\n setGridData([]);\r\n const res = await apiEntities.getData({\r\n dataKey: 'QUB-BringValue-DataGet',\r\n parameters: {\r\n bringValueKey: datakey,\r\n critFldsSearch: fieldSearchParams\r\n }\r\n });\r\n setGridData(res?.data);\r\n setDataLoading(false);\r\n };\r\n\r\n return {\r\n gridInitialized,\r\n popupInitialized,\r\n ref,\r\n popupRef,\r\n datakey,\r\n setDatakey,\r\n title,\r\n setTitle,\r\n columns,\r\n setColumns,\r\n searchValue,\r\n setSearchValue,\r\n setSearchField,\r\n gridData,\r\n setGridData,\r\n bvFieldSearch,\r\n setBVFieldSearch,\r\n selectItem,\r\n bvForm,\r\n onSubmit,\r\n operatorsOptions,\r\n secondValueField,\r\n dataLoading,\r\n setDataLoading\r\n };\r\n};\r\n\r\nexport default useBringValue;\r\n","import { apiEntities } from 'apis';\r\nimport { useEffect, useState } from 'react';\r\nimport { Typography } from '@mui/material';\r\nimport { FlexGrid, FlexGridColumn } from '@grapecity/wijmo.react.grid';\r\n\r\nconst QubGenGrid = (props) => {\r\n const { columns, rowss, initialized, title } = props;\r\n\r\n return (\r\n <>\r\n \r\n {title}\r\n \r\n \r\n {columns.length > 0 &&\r\n columns.map((c, index) => (\r\n \r\n ))}\r\n \r\n >\r\n );\r\n};\r\n\r\nexport default QubGenGrid;\r\n","import { createContext, useContext, useEffect, useRef, useState } from 'react';\r\nimport { Stack, Box, Button, Typography, Grid, TextField } from '@mui/material';\r\nimport { Popup } from '@grapecity/wijmo.react.input';\r\n// import \"./bringValueModal.css\";\r\nimport '@grapecity/wijmo.styles/wijmo.css';\r\nimport useBringValue from './useBringValue';\r\nimport { apiEntities } from 'apis';\r\nimport QubGenGrid from 'qubCommon/WijmoGrid/qubGenGrid';\r\nimport { FormProvider } from 'react-hook-form';\r\nimport TextInput from 'qubCommon/Inputs/TextInput';\r\nimport { styleExplorer } from 'qubCommon/qubStyles';\r\nimport Dropdown from 'qubCommon/Inputs/Dropdown';\r\nimport themes from 'themes';\r\nimport { ThemeProvider } from '@mui/material/styles';\r\nimport { useSelector } from 'react-redux';\r\nimport { useSnackbar } from 'notistack';\r\nimport { DynamicFormSkeleton } from 'ui-component/form';\r\n// import colors from 'assets/scss/colors.scss';\r\n\r\nconst QubBringValueContext = createContext({});\r\n\r\nfunction QubBringValueProvider({ children }) {\r\n const customization = useSelector((state) => state.customization);\r\n const { enqueueSnackbar } = useSnackbar();\r\n\r\n const {\r\n gridInitialized, // grid initialization function\r\n popupInitialized, // popup initialization function\r\n ref, // ref to return callback value: selected object\r\n popupRef, // popup ref in order to hide or open the popup\r\n datakey,\r\n setDatakey,\r\n title,\r\n setTitle,\r\n columns,\r\n setColumns,\r\n searchValue,\r\n setSearchValue,\r\n setSearchField,\r\n setMultiSelect,\r\n gridData,\r\n setGridData,\r\n bvFieldSearch, // available fields to custom search inside bringValue\r\n setBVFieldSearch,\r\n selectItem,\r\n bvForm,\r\n onSubmit,\r\n operatorsOptions,\r\n secondValueField,\r\n dataLoading,\r\n setDataLoading\r\n } = useBringValue();\r\n\r\n async function openBringValue(props) {\r\n const { datakey, searchValue, searchField, additionalFilter, multiSelect, title, callback } = props;\r\n ref.current = {\r\n callback\r\n };\r\n\r\n setGridData(null);\r\n setDatakey(datakey);\r\n setSearchValue(searchValue);\r\n bvForm.setValue('value1', searchValue);\r\n setSearchField(searchField);\r\n // setAdditionalFilter(additionalFilter);\r\n\r\n setDataLoading(true);\r\n // bvParams\r\n const resParams = await apiEntities.getData({\r\n dataKey: 'QUB-BringValue-ParamsGet',\r\n parameters: { bringValueKey: datakey } // bringValueKey\r\n });\r\n const gridColumns = resParams?.data.gridColumns;\r\n const fieldSearch = resParams?.data.critFldsSearch;\r\n\r\n // const pdf = resParams?.data?.rptPdf;\r\n // const csv = resParams?.data?.rptCsv;\r\n // const excel = resParams?.data?.rptExcel;\r\n // setPdfFiles(pdf ?? []);\r\n // setCsvFiles(csv ?? []);\r\n // setExcelFiles(\r\n // excel ? [...excel, { rptId: 'default', rptTitle: 'Προεπιλογή' }] : [{ rptId: 'default', rptTitle: 'Προεπιλογή' }]\r\n // );\r\n\r\n const helpCols = [];\r\n gridColumns.forEach((column) =>\r\n column.children.forEach((child) =>\r\n helpCols.push({\r\n binding: child.fldName,\r\n header: child.fldTitle,\r\n visible: child.isVisible,\r\n format: child.fldFormat,\r\n width: '*'\r\n })\r\n )\r\n );\r\n setBVFieldSearch(fieldSearch);\r\n setColumns(helpCols);\r\n setTitle(resParams?.data?.title);\r\n bvForm.setValue('searchFieldName', searchField);\r\n bvForm.setValue('operator', 'beginsWith');\r\n\r\n const res = await apiEntities.getData({\r\n dataKey: 'QUB-BringValue-DataGet',\r\n parameters: {\r\n bringValueKey: datakey,\r\n critFldsSearch: [{ fldName: searchField, operator: 'beginsWith', value1: searchValue }]\r\n }\r\n });\r\n setDataLoading(false);\r\n setGridData(res?.data);\r\n if (!res?.data)\r\n enqueueSnackbar('Δεν βρέθηκαν εγγραφές!', {\r\n variant: 'warning'\r\n });\r\n else {\r\n popupRef.current.show(true);\r\n }\r\n if (multiSelect) setMultiSelect(multiSelect);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
{`${title}`}
\r\n\r\n
\r\n
\r\n \r\n \r\n {bvFieldSearch.length > 0 && (\r\n Πεδίο }\r\n labelName=\"title\"\r\n valueName=\"fldSearchName\"\r\n options={bvFieldSearch}\r\n defaultValue={bvFieldSearch[0]?.fldSearchName}\r\n inputProps={{ style: { height: '30px' } }}\r\n />\r\n )}\r\n {operatorsOptions.length > 0 && (\r\n Να }\r\n labelName=\"operator\"\r\n valueName=\"id\"\r\n options={operatorsOptions}\r\n defaultValue={operatorsOptions[0]?.id}\r\n inputProps={{ style: { height: '30px' } }}\r\n />\r\n )}\r\n Τιμή }\r\n defaultValue={searchValue ?? ''}\r\n inputProps={{ style: { height: '30px' } }}\r\n />\r\n {secondValueField && (\r\n Τιμή 2}\r\n defaultValue={searchValue ?? ''}\r\n inputProps={{ style: { height: '30px' } }}\r\n />\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {columns && gridData && (\r\n \r\n )}\r\n {dataLoading && }\r\n \r\n {!dataLoading && (\r\n \r\n {gridData?.length ? `Βρέθηκαν ${gridData?.length} εγγραφές.` : 'Δεν βρέθηκαν εγγραφές.'}\r\n
\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {children}\r\n \r\n );\r\n}\r\n\r\nfunction useQubBringValue() {\r\n const qubBringValueContext = useContext(QubBringValueContext);\r\n if (!qubBringValueContext) {\r\n throw new Error('useBringValueContext must be used within a QubBringValueProvider');\r\n }\r\n\r\n return qubBringValueContext;\r\n}\r\n\r\nexport { QubBringValueProvider, useQubBringValue };\r\n","import { useEffect, useRef } from 'react';\r\nimport { range } from 'lodash';\r\nimport { TextField, Stack } from '@mui/material';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst PinInput = ({ length, focus, inputStyle, type, onComplete }) => {\r\n const inputRefs = useRef([]);\r\n\r\n useEffect(() => {\r\n if (focus) {\r\n inputRefs.current[0].focus();\r\n }\r\n }, [focus]);\r\n\r\n const testPin = (value) => {\r\n const pinPattern = new RegExp(`^\\\\d{${length}}$`);\r\n return pinPattern.test(value);\r\n };\r\n\r\n const getPin = () => inputRefs.current.reduce((acc, ref) => acc + ref.value, '');\r\n\r\n const handleOnKeyDown = (e, index) => {\r\n switch (e.code) {\r\n case 'Backspace': {\r\n const currentValue = inputRefs.current[index].value;\r\n if (!currentValue && index > 0) {\r\n inputRefs.current[index - 1].value = '';\r\n inputRefs.current[index - 1].focus();\r\n }\r\n break;\r\n }\r\n case 'ArrowLeft': {\r\n e.preventDefault();\r\n if (index > 0) inputRefs.current[index - 1].focus();\r\n if (index === 0) inputRefs.current[length - 1].focus();\r\n break;\r\n }\r\n case 'ArrowRight': {\r\n e.preventDefault();\r\n if (index < length - 1) inputRefs.current[index + 1].focus();\r\n if (index === length - 1) inputRefs.current[0].focus();\r\n break;\r\n }\r\n case 'Home': {\r\n inputRefs.current[0].focus();\r\n break;\r\n }\r\n case 'End': {\r\n inputRefs.current[length - 1].focus();\r\n break;\r\n }\r\n default:\r\n }\r\n };\r\n\r\n const handleChange = (e, index) => {\r\n const newValue = e.target.value;\r\n const re = /\\d/;\r\n if (re.test(newValue)) {\r\n if (index < length - 1) {\r\n inputRefs.current[index + 1].focus();\r\n }\r\n } else {\r\n inputRefs.current[index].value = '';\r\n return false;\r\n }\r\n\r\n const pin = getPin();\r\n if (testPin(pin)) {\r\n onComplete(pin);\r\n }\r\n return true;\r\n };\r\n\r\n const handleOnPaste = (e) => {\r\n e.preventDefault();\r\n const text = e.clipboardData.getData('Text');\r\n if (testPin(text)) {\r\n text.split('').forEach((num, i) => {\r\n inputRefs.current[i].value = num;\r\n });\r\n inputRefs.current[length - 1].focus();\r\n\r\n onComplete(text);\r\n } else {\r\n console.error('Cannot paste this');\r\n }\r\n };\r\n\r\n return (\r\n \r\n {range(length).map((item, i) => (\r\n handleOnKeyDown(e, i)}\r\n onChange={(e) => handleChange(e, i)}\r\n inputRef={(el) => {\r\n inputRefs.current[i] = el;\r\n }}\r\n style={inputStyle}\r\n inputProps={{\r\n style: {\r\n padding: 12,\r\n fontSize: 20\r\n },\r\n maxLength: 1,\r\n onPaste: handleOnPaste\r\n }}\r\n type={type}\r\n />\r\n ))}\r\n \r\n );\r\n};\r\n\r\nPinInput.propTypes = {\r\n length: PropTypes.number.isRequired,\r\n focus: PropTypes.bool,\r\n inputStyle: PropTypes.object,\r\n type: PropTypes.string,\r\n onComplete: PropTypes.func\r\n};\r\n\r\nexport default PinInput;\r\n","// mui\r\nimport { Stack, Grid, Typography, Box, Button } from '@mui/material';\r\n\r\n// colors\r\nimport colors from 'assets/scss/_themes-vars.module.scss';\r\n\r\n// Apis\r\nimport { auth } from 'apis';\r\n\r\n// react-router-dom\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\n// store\r\nimport { VERIFY_EMAIL } from 'store/actions';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\n// prop types\r\nimport propTypes from 'prop-types';\r\n// eslint-disable\r\nimport PinInput from 'ui-component/form/components/PinInput';\r\n\r\nimport { useSnackbar } from 'notistack';\r\n\r\nconst Verification = ({ userIdentifier }) => {\r\n const dispatch = useDispatch();\r\n const { isLoggedIn } = useSelector((state) => state.auth);\r\n const { enqueueSnackbar } = useSnackbar();\r\n const navigate = useNavigate();\r\n\r\n const onComplete = (pin) => {\r\n auth.ValidateVerificationPin({ userIdentifier, value: Number(pin) })\r\n .then((res) => {\r\n if (res.success === 1) {\r\n if (!isLoggedIn) {\r\n navigate('/login');\r\n }\r\n dispatch({ type: VERIFY_EMAIL });\r\n enqueueSnackbar('Το email επιβεβαιώθηκε με επιτυχία', {\r\n variant: 'success'\r\n });\r\n }\r\n if (res.success === 0) {\r\n enqueueSnackbar('Το email δεν επιβεβαιώθηκε', {\r\n variant: 'error'\r\n });\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('error', error);\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Enter the verification code\r\n \r\n An email with the verification code was sent to your email account\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nVerification.propTypes = {\r\n userIdentifier: propTypes.string\r\n};\r\n\r\nexport default Verification;\r\n","import axios from 'axios';\r\nimport { store } from 'store';\r\nimport moment from 'moment';\r\nimport { LOGOUT } from 'store/actions';\r\n\r\nconst axiosInstance = axios.create({\r\n withCredentials: true,\r\n baseURL: process.env.REACT_APP_BASE_URL\r\n});\r\n\r\naxiosInstance.interceptors.response.use(\r\n (response) => response,\r\n (error) => {\r\n if (error.response.status === 401) {\r\n // place your reentry code\r\n store.dispatch({\r\n type: LOGOUT\r\n });\r\n // throw new AuthError('Redirect to login',401)\r\n }\r\n throw error;\r\n }\r\n);\r\n\r\naxiosInstance.interceptors.request.use((config) => {\r\n if (config.data) {\r\n Object.keys(config.data).forEach(async (key) => {\r\n // Find a valid date object and format it\r\n if (config.data[key] instanceof Date && !Number.isNaN(config.data[key])) {\r\n config.data[key] = moment(config.data[key]).format('YYYY-MM-DDTHH:mm:ss.SSS');\r\n }\r\n });\r\n }\r\n const state = store.getState();\r\n config.headers = {\r\n ...config.headers,\r\n Authorization: `Bearer ${state.auth.token}`\r\n };\r\n return config;\r\n});\r\n\r\n// export const setupInterceptors = () => {\r\n// const state = store.getState();\r\n\r\n// };\r\n\r\n// store.subscribe(setupInterceptors);\r\n\r\n// setupInterceptors();\r\n\r\nexport default axiosInstance;\r\n","import axiosInstance from '../axiosInstance';\r\n\r\nexport const backofficeApi = {\r\n post: (path, params, config) =>\r\n axiosInstance\r\n .post(`/backoffice${path}`, params, config)\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n }),\r\n get: (path, params, config) =>\r\n axiosInstance\r\n .get(`/backoffice${path}`, params, config)\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n })\r\n};\r\n\r\nexport const getParams = async (params) => backofficeApi.post('/getparams', params);\r\n\r\nexport const getLookUps = async (params) => backofficeApi.post('/getlookups', params);\r\n\r\nexport const getData = async (params) => backofficeApi.post('/getdata', params);\r\n\r\nexport const commitChanges = async (params) => backofficeApi.post('/commitchanges', params);\r\n\r\nexport const getForm = async (params) => backofficeApi.post('/getform', params);\r\n\r\nexport const getMenu = async (params) => backofficeApi.post('/getmenu', params);\r\n\r\nexport const getReport = async (params) =>\r\n backofficeApi.post('/getreport', params, {\r\n responseType: 'blob'\r\n });\r\nexport const getReportsMenu = async (params) => backofficeApi.get('/GetReportsMenu', { params });\r\n\r\nexport const getExplorer = async (params) =>\r\n axiosInstance\r\n .post(`/qexplorer/${params.dataKey}/get`, params)\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n });\r\n","import axiosInstance from '../axiosInstance';\r\n\r\nexport const authApi = {\r\n post: async (path, params, cancelToken) =>\r\n axiosInstance\r\n .post(`/auth${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n }),\r\n get: async (path, params, cancelToken) =>\r\n axiosInstance\r\n .get(\r\n `/auth${path}`,\r\n { params },\r\n {\r\n cancelToken: cancelToken?.token\r\n }\r\n )\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n })\r\n};\r\n\r\nexport const login = async ({ username, password }) => authApi.post('/login', { username, password });\r\n\r\nexport const resetPasswordEmail = async (email) => authApi.post('/passwordResetEmail', email);\r\n\r\nexport const resetPassword = async (newPassword) => authApi.post('/passwordReset', newPassword);\r\n\r\nexport const register = async (params) => authApi.post('/register', params);\r\n\r\nexport const sendVerificationEmail = async ({ emailTo }) => authApi.post('/sendverificationmail', { emailTo });\r\n\r\nexport const ValidateVerificationPin = async ({ userIdentifier, value }) => authApi.post('/verifyEmail', { userIdentifier, value });\r\n\r\nexport const getUserHasRoles = async (params) => authApi.post('/userhasroles', params);\r\n\r\nexport const updateUserHasRoles = async (params) => authApi.post('/updateuserhasroles', params);\r\n\r\nexport const getUserPermissionTree = async (params) => authApi.post('/userPermissionTree', params);\r\n\r\nexport const updateUserPermissionTree = async (params) => authApi.post('/updateuserPermissionTree', params);\r\n\r\nexport const getRolePermissionTree = async (params) => authApi.post('/RolePermissionTree', params);\r\n\r\nexport const updateRolePermissionTree = async (params) => authApi.post('/updateRolePermissionTree', params);\r\n\r\nexport const createTempUser = async (params) => authApi.post('/createtempuser', params);\r\n\r\nexport const activateUserFromInvitation = async (params) => authApi.post('/activateUserFromInvitation', params);\r\n\r\nexport const inviteUser = async (params) => authApi.post('/invite', params);\r\n\r\nexport const reinvite = async (params) => authApi.post('/reinvite', params);\r\n\r\nexport const getMe = async () => authApi.get('/getUserDetails');\r\n","import axiosInstance from '../axiosInstance';\r\n\r\nexport const transactionApi = {\r\n post: (path, params, cancelToken) =>\r\n axiosInstance\r\n .post(`/transaction${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n }),\r\n get: (path, params, cancelToken) =>\r\n axiosInstance\r\n .get(`/transaction${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n })\r\n};\r\n\r\nexport const getTrans = async (params) => transactionApi.get('/get', params);\r\n\r\nexport const createOrUpdate = async (transaction) => transactionApi.post('/createorupdate', transaction);\r\n\r\nexport const deleteTransaction = async (params) => transactionApi.post('/delete', params);\r\n\r\nexport const paymentLink = async (params) => transactionApi.get('/CreatePaymentLink', { params });\r\n","import axiosInstance from '../axiosInstance';\r\n\r\nexport const backofficeApi = {\r\n post: (path, params, cancelToken) =>\r\n axiosInstance\r\n .post(`/vet${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n }),\r\n get: (path, params, cancelToken) =>\r\n axiosInstance\r\n .get(`/vet${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n })\r\n};\r\n\r\nexport const createOrUpdate = async (params) => backofficeApi.post('/createorupdate', params);\r\n\r\nexport const getVet = async (params) => backofficeApi.get('/getVetById', { params });\r\nexport const getVetFromUser = async (params) => backofficeApi.get('/getvetfromuser', { params });\r\nexport const canCreateNewUserFromVet = async (params) => backofficeApi.get('/CanCreateNewUserFromVet', { params });\r\nexport const getStatistics = async (params) => backofficeApi.get('/getstatistics', params);\r\n","import axiosInstance from '../axiosInstance';\r\n\r\nexport const paymentApi = {\r\n post: (path, params, cancelToken) =>\r\n axiosInstance\r\n .post(`${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n }),\r\n get: (path, params, cancelToken) =>\r\n axiosInstance\r\n .get(`${path}`, params, {\r\n cancelToken: cancelToken?.token\r\n })\r\n .then((res) => {\r\n if (res?.data?.error) throw res.data;\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n throw err.error ? err : err?.response?.data;\r\n })\r\n};\r\n\r\nexport const pay = async (params) => paymentApi.post('/pay', params);\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\r\n);\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then((registration) => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch((error) => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' }\r\n })\r\n .then((response) => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log('No internet connection found. App is running in offline mode.');\r\n });\r\n}\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then((registration) => {\r\n registration.unregister();\r\n })\r\n .catch((error) => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import { Link } from 'react-router-dom';\r\n\r\n// material-ui\r\nimport { ButtonBase } from '@mui/material';\r\n\r\n// project imports\r\nimport config from 'config';\r\nimport Logo from 'ui-component/Logo';\r\n\r\n// ==============================|| MAIN LOGO ||============================== //\r\n\r\nconst LogoSection = () => (\r\n \r\n \r\n \r\n);\r\n\r\nexport default LogoSection;\r\n","import PropTypes from 'prop-types';\r\nimport { forwardRef } from 'react';\r\n\r\n// material-ui\r\nimport { Collapse, Fade, Box, Grow, Slide, Zoom } from '@mui/material';\r\n\r\n// ==============================|| TRANSITIONS ||============================== //\r\n\r\nconst Transitions = forwardRef(({ children, position, type, direction, ...others }, ref) => {\r\n let positionSX = {\r\n transformOrigin: '0 0 0'\r\n };\r\n\r\n switch (position) {\r\n case 'top-right':\r\n positionSX = {\r\n transformOrigin: 'top right'\r\n };\r\n break;\r\n case 'top':\r\n positionSX = {\r\n transformOrigin: 'top'\r\n };\r\n break;\r\n case 'bottom-left':\r\n positionSX = {\r\n transformOrigin: 'bottom left'\r\n };\r\n break;\r\n case 'bottom-right':\r\n positionSX = {\r\n transformOrigin: 'bottom right'\r\n };\r\n break;\r\n case 'bottom':\r\n positionSX = {\r\n transformOrigin: 'bottom'\r\n };\r\n break;\r\n case 'top-left':\r\n default:\r\n positionSX = {\r\n transformOrigin: '0 0 0'\r\n };\r\n break;\r\n }\r\n\r\n return (\r\n \r\n {type === 'grow' && (\r\n \r\n {children}\r\n \r\n )}\r\n {type === 'collapse' && (\r\n \r\n {children}\r\n \r\n )}\r\n {type === 'fade' && (\r\n \r\n {children}\r\n \r\n )}\r\n {type === 'slide' && (\r\n \r\n {children}\r\n \r\n )}\r\n {type === 'zoom' && (\r\n \r\n {children}\r\n \r\n )}\r\n \r\n );\r\n});\r\n\r\nTransitions.propTypes = {\r\n children: PropTypes.node,\r\n type: PropTypes.oneOf(['grow', 'fade', 'collapse', 'slide', 'zoom']),\r\n position: PropTypes.oneOf(['top-left', 'top-right', 'top', 'bottom-left', 'bottom-right', 'bottom']),\r\n direction: PropTypes.oneOf(['up', 'down', 'left', 'right'])\r\n};\r\n\r\nTransitions.defaultProps = {\r\n type: 'grow',\r\n position: 'top-left',\r\n direction: 'up'\r\n};\r\n\r\nexport default Transitions;\r\n","import { useState, useRef, useEffect } from 'react';\r\n\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useSelector, useDispatch } from 'react-redux';\r\n\r\nimport { LOGOUT } from 'store/actions';\r\n\r\n// material-ui\r\nimport { useTheme } from '@mui/material/styles';\r\nimport {\r\n // Avatar,\r\n Box,\r\n // Card,\r\n // CardContent,\r\n Chip,\r\n ClickAwayListener,\r\n Divider,\r\n // Grid,\r\n // InputAdornment,\r\n List,\r\n ListItemButton,\r\n ListItemIcon,\r\n ListItemText,\r\n // OutlinedInput,\r\n Paper,\r\n Popper,\r\n Stack,\r\n // Switch,\r\n Typography\r\n} from '@mui/material';\r\n\r\n// third-party\r\n// import PerfectScrollbar from 'react-perfect-scrollbar';\r\n\r\n// project imports\r\nimport MainCard from 'ui-component/cards/MainCard';\r\nimport Transitions from 'ui-component/extended/Transitions';\r\n// import UpgradePlanCard from './UpgradePlanCard';\r\n// import User1 from 'assets/images/users/user-round.svg';\r\n\r\n// assets\r\nimport { IconLogout, IconSettings } from '@tabler/icons';\r\n\r\n// ==============================|| PROFILE MENU ||============================== //\r\n\r\nconst ProfileSection = () => {\r\n const theme = useTheme();\r\n const { firstName, lastName, roles } = useSelector((state) => state.auth);\r\n const rolesStr = roles\r\n ?.map((item) => {\r\n return item.role;\r\n })\r\n .join(', ');\r\n const customization = useSelector((state) => state.customization);\r\n const dispatch = useDispatch();\r\n const navigate = useNavigate();\r\n // const [sdm, setSdm] = useState(true);\r\n // const [value, setValue] = useState('');\r\n // const [notification, setNotification] = useState(false);\r\n const [selectedIndex, setSelectedIndex] = useState(-1);\r\n const [open, setOpen] = useState(false);\r\n /**\r\n * anchorRef is used on different componets and specifying one type leads to other components throwing an error\r\n * */\r\n const anchorRef = useRef(null);\r\n const handleLogout = async () => {\r\n dispatch({ type: LOGOUT });\r\n navigate('/');\r\n };\r\n\r\n const handleClose = (event) => {\r\n if (anchorRef.current && anchorRef.current.contains(event.target)) {\r\n return;\r\n }\r\n setSelectedIndex(-1);\r\n setOpen(false);\r\n };\r\n\r\n const handleListItemClick = (event, index, route = '') => {\r\n setSelectedIndex(index);\r\n handleClose(event);\r\n\r\n if (route && route !== '') {\r\n navigate(route);\r\n }\r\n };\r\n const handleToggle = () => {\r\n setOpen((prevOpen) => !prevOpen);\r\n };\r\n\r\n const prevOpen = useRef(open);\r\n useEffect(() => {\r\n if (prevOpen.current === true && open === false) {\r\n anchorRef.current.focus();\r\n }\r\n\r\n prevOpen.current = open;\r\n }, [open]);\r\n\r\n return (\r\n <>\r\n \r\n } */\r\n label={}\r\n variant=\"outlined\"\r\n ref={anchorRef}\r\n aria-controls={open ? 'menu-list-grow' : undefined}\r\n aria-haspopup=\"true\"\r\n onClick={handleToggle}\r\n color=\"primary\"\r\n />\r\n \r\n {({ TransitionProps }) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Γειά σας,\r\n \r\n {`${firstName} ${lastName}`}\r\n \r\n \r\n {rolesStr}\r\n \r\n {/* setValue(e.target.value)}\r\n placeholder=\"Search profile options\"\r\n startAdornment={\r\n \r\n \r\n \r\n }\r\n aria-describedby=\"search-helper-text\"\r\n inputProps={{\r\n 'aria-label': 'weight'\r\n }}\r\n /> */}\r\n \r\n \r\n {/* \r\n */}\r\n {/* \r\n \r\n \r\n \r\n \r\n \r\n Start DND Mode\r\n \r\n \r\n setSdm(e.target.checked)}\r\n name=\"sdm\"\r\n size=\"small\"\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n Allow Notifications\r\n \r\n \r\n setNotification(e.target.checked)}\r\n name=\"sdm\"\r\n size=\"small\"\r\n />\r\n \r\n \r\n \r\n \r\n \r\n */}\r\n \r\n \r\n handleListItemClick(event, 0, '/user/settings')}\r\n >\r\n \r\n \r\n \r\n Ρυθμίσεις} />\r\n \r\n {/* handleListItemClick(event, 1, '/user/social-profile/posts')}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n Social Profile\r\n \r\n \r\n \r\n \r\n \r\n }\r\n />\r\n */}\r\n \r\n \r\n \r\n \r\n Αποσύνδεση} />\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n >\r\n );\r\n};\r\n\r\nexport default ProfileSection;\r\n","import Breadcrumbs from '@mui/material/Breadcrumbs';\r\nimport { Box, Typography, Stack, useMediaQuery, useTheme } from '@mui/material';\r\nimport { useSelector } from 'react-redux';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport colors from 'assets/scss/_themes-vars.module.scss';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst BreadcrumbSection = () => {\r\n const { breadcrumbs, info } = useSelector((state) => state.breadcrumbs);\r\n const { pathname } = useLocation();\r\n const navigate = useNavigate();\r\n const theme = useTheme();\r\n const matchDownMd = useMediaQuery(theme.breakpoints.up('sm'));\r\n const { t } = useTranslation();\r\n return (\r\n \r\n {matchDownMd && (\r\n \r\n \r\n {breadcrumbs?.map((item, key) => {\r\n const name = item.name ? item.name : '';\r\n const path = item.path ? item.path : pathname;\r\n return (\r\n \r\n navigate(path)}\r\n >\r\n {t(name)}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n {info}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default BreadcrumbSection;\r\n","import PropTypes from 'prop-types';\r\n\r\n// material-ui\r\nimport { useTheme } from '@mui/material/styles';\r\nimport { Avatar, Box, ButtonBase } from '@mui/material';\r\n\r\n// project imports\r\nimport LogoSection from '../LogoSection';\r\n// import SearchSection from './SearchSection';\r\nimport ProfileSection from './ProfileSection';\r\nimport BreadcrumbSection from '../BreadcrumbSection';\r\n\r\n// import NotificationSection from './NotificationSection';\r\n// import LanguageSection from './LanguageSection';\r\n\r\n// assets\r\nimport { IconMenu2 } from '@tabler/icons';\r\n\r\n// ==============================|| MAIN NAVBAR / HEADER ||============================== //\r\n\r\nconst Header = ({ handleLeftDrawerToggle }) => {\r\n const theme = useTheme();\r\n\r\n return (\r\n <>\r\n {/* logo & toggler button */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* header search */}\r\n {/* */}\r\n {/* */}\r\n {/* \r\n \r\n ΕΛΛΗΝΙΚΗ ΚΤΗΝΙΑΤΡΙΚΗ ΕΤΑΙΡΙΑ\r\n \r\n */}\r\n {/* notification & profile */}\r\n {/* */}\r\n {/* */}\r\n \r\n \r\n \r\n >\r\n );\r\n};\r\n\r\nHeader.propTypes = {\r\n handleLeftDrawerToggle: PropTypes.func\r\n};\r\n\r\nexport default Header;\r\n","import PropTypes from 'prop-types';\r\nimport { forwardRef, useEffect, lazy } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\n// material-ui\r\nimport { useTheme } from '@mui/material/styles';\r\nimport { Avatar, Chip, ListItemButton, ListItemIcon, ListItemText, Typography, useMediaQuery } from '@mui/material';\r\n\r\n// project imports\r\nimport { MENU_OPEN, SET_MENU } from 'store/actions';\r\nimport config from 'config';\r\n\r\n// assets\r\nimport FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';\r\n\r\n// i18n\r\nimport { Trans } from 'react-i18next';\r\n\r\n// react-router\r\nimport { useParams } from 'react-router';\r\n\r\nimport { Loadable } from 'ui-component';\r\n\r\n// ==============================|| SIDEBAR MENU LIST ITEMS ||============================== //\r\n\r\nconst paramsToViewKey = (x, y) => {\r\n if (x === 'vets' || y === 'vets') {\r\n return 'Vets.View';\r\n }\r\n if (x === 'roles' || y === 'roles') {\r\n return 'Roles.View';\r\n }\r\n if (x === 'subscriptions' || y === 'subscriptions') {\r\n return 'Subscriptions.View';\r\n }\r\n if (x === 'transactions' || y === 'transactions') {\r\n return 'Transactions.View';\r\n }\r\n if (x === 'users' || y === 'users') {\r\n return 'Users.View';\r\n }\r\n if (x === 'settings' || y === 'settings') {\r\n return 'AccountSettings.View';\r\n }\r\n return 'Home.View';\r\n};\r\n\r\nconst NavItem = ({ item, level }) => {\r\n const theme = useTheme();\r\n const dispatch = useDispatch();\r\n const customization = useSelector((state) => state.customization);\r\n const menu = useSelector((state) => state.menu);\r\n const matchesSM = useMediaQuery(theme.breakpoints.down('lg'));\r\n const params = useParams();\r\n const Icon = Loadable(\r\n lazy(() =>\r\n import('@tabler/icons').then((module) => {\r\n return { default: module[item.icon] };\r\n })\r\n )\r\n );\r\n const itemIcon = item?.icon ? (\r\n \r\n ) : (\r\n id === item?.id) > -1 ? 8 : 6,\r\n height: menu.isOpen.findIndex((id) => id === item?.id) > -1 ? 8 : 6\r\n }}\r\n fontSize={level > 0 ? 'inherit' : 'medium'}\r\n />\r\n );\r\n\r\n let itemTarget = '_self';\r\n if (item.target) {\r\n itemTarget = '_blank';\r\n }\r\n\r\n let listItemProps = {\r\n component: forwardRef((props, ref) => )\r\n };\r\n if (item?.external) {\r\n listItemProps = { component: 'a', href: item.url, target: itemTarget };\r\n }\r\n if (menu.lockMenu) {\r\n listItemProps = null;\r\n }\r\n\r\n const itemHandler = (id) => {\r\n if (!menu.lockMenu) {\r\n dispatch({ type: MENU_OPEN, id });\r\n }\r\n if (matchesSM) dispatch({ type: SET_MENU, opened: false });\r\n };\r\n\r\n // active menu item on page load\r\n useEffect(() => {\r\n const currentIndex = params['*'].split('/');\r\n if (currentIndex[0] === '') {\r\n dispatch({ type: MENU_OPEN, id: 'Home.View' });\r\n }\r\n if (currentIndex.length >= 2) {\r\n dispatch({ type: MENU_OPEN, id: paramsToViewKey(currentIndex[1], currentIndex[0]) });\r\n }\r\n /* if (currentIndex === -1) {\r\n dispatch({ type: MENU_OPEN, id: 'Home.View' });\r\n } else if (currentIndex > -1) {\r\n dispatch({ type: MENU_OPEN, id: item.id });\r\n } */\r\n // eslint-disable-next-line\r\n }, []);\r\n\r\n return (\r\n 1 ? 'transparent !important' : 'inherit',\r\n py: level > 1 ? 1 : 1.25,\r\n pl: `${level * 24}px`\r\n }}\r\n selected={menu.isOpen.findIndex((id) => id === item.id) > -1}\r\n onClick={() => itemHandler(item.id)}\r\n >\r\n {itemIcon}\r\n id === item.id) > -1 ? 'h5' : 'body1'} color=\"inherit\">\r\n {item.title}\r\n \r\n }\r\n secondary={\r\n item.caption && (\r\n \r\n {item.caption}\r\n \r\n )\r\n }\r\n />\r\n {item.chip && (\r\n {item.chip.avatar}}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n\r\nNavItem.propTypes = {\r\n item: PropTypes.object,\r\n level: PropTypes.number\r\n};\r\n\r\nexport default NavItem;\r\n","import PropTypes from 'prop-types';\r\nimport { useState, lazy } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\n// material-ui\r\nimport { useTheme } from '@mui/material/styles';\r\nimport { Collapse, List, ListItemButton, ListItemIcon, ListItemText, Typography } from '@mui/material';\r\n\r\n// project imports\r\nimport NavItem from '../NavItem';\r\nimport { Loadable } from '@qubiteq/qublib';\r\n// assets\r\nimport FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';\r\nimport { IconChevronDown, IconChevronUp } from '@tabler/icons';\r\n\r\n// ==============================|| SIDEBAR MENU LIST COLLAPSE ITEMS ||============================== //\r\n\r\nconst NavCollapse = ({ menu, level }) => {\r\n const theme = useTheme();\r\n const customization = useSelector((state) => state.customization);\r\n\r\n const [open, setOpen] = useState(false);\r\n const [selected, setSelected] = useState(null);\r\n\r\n const handleClick = () => {\r\n setOpen(!open);\r\n setSelected(!selected ? menu.id : null);\r\n };\r\n\r\n // menu collapse & item\r\n const menus = menu.children?.map((item) => {\r\n switch (item.type) {\r\n case 'collapse':\r\n return ;\r\n case 'item':\r\n return ;\r\n default:\r\n return (\r\n \r\n Menu Items Error\r\n \r\n );\r\n }\r\n });\r\n\r\n const Icon = Loadable(\r\n lazy(() =>\r\n import('@tabler/icons').then((module) => {\r\n return {\r\n default: module[menu.icon]\r\n };\r\n })\r\n )\r\n );\r\n\r\n const menuIcon = menu.icon ? (\r\n \r\n ) : (\r\n 0 ? 'inherit' : 'medium'}\r\n />\r\n );\r\n\r\n return (\r\n <>\r\n 1 ? 'transparent !important' : 'inherit',\r\n py: level > 1 ? 1 : 1.25,\r\n pl: `${level * 24}px`\r\n }}\r\n selected={selected === menu.id}\r\n onClick={handleClick}\r\n >\r\n {menuIcon}\r\n \r\n {menu.title}\r\n \r\n }\r\n secondary={\r\n menu.caption && (\r\n \r\n {menu.caption}\r\n \r\n )\r\n }\r\n />\r\n {open ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n {menus}\r\n
\r\n \r\n >\r\n );\r\n};\r\n\r\nNavCollapse.propTypes = {\r\n menu: PropTypes.object,\r\n level: PropTypes.number\r\n};\r\n\r\nexport default NavCollapse;\r\n","import PropTypes from 'prop-types';\r\n\r\n// material-ui\r\nimport { useTheme } from '@mui/material/styles';\r\nimport { Divider, List, Typography } from '@mui/material';\r\n\r\n// project imports\r\nimport NavItem from '../NavItem';\r\nimport NavCollapse from '../NavCollapse';\r\n\r\n// permissions\r\nimport { Can } from 'context/permissionContext';\r\n\r\n// ==============================|| SIDEBAR MENU LIST GROUP ||============================== //\r\n\r\nconst NavGroup = ({ item }) => {\r\n const theme = useTheme();\r\n // menu list collapse & items\r\n const items = item.children?.map((menu) => {\r\n switch (menu.type) {\r\n case 'collapse':\r\n return ;\r\n case 'item':\r\n return (\r\n \r\n \r\n \r\n );\r\n default:\r\n return (\r\n \r\n Menu Items Error\r\n \r\n );\r\n }\r\n });\r\n\r\n return (\r\n <>\r\n \r\n {item.title}\r\n {item.caption && (\r\n \r\n {item.caption}\r\n \r\n )}\r\n \r\n )\r\n }\r\n >\r\n {items}\r\n
\r\n\r\n {/* group divider */}\r\n \r\n >\r\n );\r\n};\r\n\r\nNavGroup.propTypes = {\r\n item: PropTypes.object\r\n};\r\n\r\nexport default NavGroup;\r\n","// material-ui\r\nimport { Typography } from '@mui/material';\r\nimport { Can } from 'context/permissionContext';\r\n\r\n// project imports\r\nimport NavGroup from './NavGroup';\r\nimport { useSelector } from 'react-redux';\r\n// import menuItems from 'menu-items';\r\n\r\n// ==============================|| SIDEBAR MENU LIST ||============================== //\r\n\r\nconst MenuList = () => {\r\n const { dashboard } = useSelector((state) => state.auth);\r\n const menuItems = {\r\n items: dashboard\r\n };\r\n // const navItems = menuItems?.items?.map((item) => {\r\n const navItems = menuItems?.items?.map((item) => {\r\n switch (item.type) {\r\n case 'group':\r\n return (\r\n \r\n \r\n \r\n );\r\n default:\r\n return (\r\n \r\n Menu Items Error\r\n \r\n );\r\n }\r\n });\r\n\r\n return <>{navItems}>;\r\n};\r\n\r\nexport default MenuList;\r\n","import { useDispatch, useSelector } from 'react-redux';\r\nimport LanguageIcon from '@mui/icons-material/Language';\r\nimport { useState, useEffect } from 'react';\r\n\r\n// material-ui\r\nimport { useTheme } from '@mui/material/styles';\r\nimport { ListItemButton, ListItemIcon, ListItemText, Typography } from '@mui/material';\r\nimport { useTranslation } from 'react-i18next';\r\n// project imports\r\n\r\nconst CustomNavItem = () => {\r\n const customization = useSelector((state) => state.customization);\r\n const theme = useTheme();\r\n const { t } = useTranslation();\r\n const [Help, setHelp] = useState('');\r\n\r\n /* eslint-disable global-require */\r\n\r\n /* eslint-enable global-require */\r\n\r\n return (\r\n {\r\n window.open('https://www.hvms.gr');\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {t('EKE Website')}\r\n \r\n }\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default CustomNavItem;\r\n","import PropTypes from 'prop-types';\r\n\r\n// material-ui\r\nimport { useTheme } from '@mui/material/styles';\r\nimport { Box, Drawer, useMediaQuery } from '@mui/material';\r\n\r\n// third-party\r\nimport PerfectScrollbar from 'react-perfect-scrollbar';\r\nimport { BrowserView, MobileView } from 'react-device-detect';\r\n\r\n// project imports\r\nimport MenuList from './MenuList';\r\nimport LogoSection from '../LogoSection';\r\n/* import MenuCard from './MenuCard'; */\r\nimport { drawerWidth } from 'store/constant';\r\nimport CustomNavItem from 'ui-component/CustomNavItem';\r\n\r\n// ==============================|| SIDEBAR DRAWER ||============================== //\r\n\r\nconst Sidebar = ({ drawerOpen, drawerToggle, window }) => {\r\n const theme = useTheme();\r\n const matchUpMd = useMediaQuery(theme.breakpoints.up('md'));\r\n\r\n const drawer = (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n >\r\n );\r\n\r\n const container = window !== undefined ? () => window.document.body : undefined;\r\n\r\n return (\r\n \r\n \r\n {drawer}\r\n \r\n \r\n );\r\n};\r\n\r\nSidebar.propTypes = {\r\n drawerOpen: PropTypes.bool,\r\n drawerToggle: PropTypes.func,\r\n window: PropTypes.object\r\n};\r\n\r\nexport default Sidebar;\r\n","import { useEffect } from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Outlet } from 'react-router-dom';\r\n\r\n// material-ui\r\nimport { styled, useTheme } from '@mui/material/styles';\r\nimport { AppBar, Box, CssBaseline, Toolbar, useMediaQuery } from '@mui/material';\r\n\r\n// project imports\r\nimport Breadcrumbs from 'ui-component/extended/Breadcrumbs';\r\nimport Header from './Header';\r\nimport Sidebar from './Sidebar';\r\nimport navigation from 'menu-items';\r\nimport { drawerWidth } from 'store/constant';\r\nimport { SET_MENU } from 'store/actions';\r\n\r\n// assets\r\nimport { IconChevronRight } from '@tabler/icons';\r\n\r\n// styles\r\nconst Main = styled('main', { shouldForwardProp: (prop) => prop !== 'open' })(({ theme, open }) => ({\r\n ...theme.typography.mainContent,\r\n ...(!open && {\r\n borderBottomLeftRadius: 0,\r\n borderBottomRightRadius: 0,\r\n transition: theme.transitions.create('margin', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen\r\n }),\r\n [theme.breakpoints.up('md')]: {\r\n marginLeft: -(drawerWidth - 20),\r\n width: `calc(100% - ${drawerWidth}px)`\r\n },\r\n [theme.breakpoints.down('md')]: {\r\n marginLeft: '20px',\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n padding: '16px'\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n marginLeft: '10px',\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n padding: '16px',\r\n marginRight: '10px'\r\n }\r\n }),\r\n ...(open && {\r\n transition: theme.transitions.create('margin', {\r\n easing: theme.transitions.easing.easeOut,\r\n duration: theme.transitions.duration.enteringScreen\r\n }),\r\n marginLeft: 0,\r\n borderBottomLeftRadius: 0,\r\n borderBottomRightRadius: 0,\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n [theme.breakpoints.down('md')]: {\r\n marginLeft: '20px'\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n marginLeft: '10px'\r\n }\r\n })\r\n}));\r\n\r\n// ==============================|| MAIN LAYOUT ||============================== //\r\n\r\nconst MainLayout = () => {\r\n const theme = useTheme();\r\n const matchDownMd = useMediaQuery(theme.breakpoints.down('lg'));\r\n\r\n // Handle left drawer\r\n const leftDrawerOpened = useSelector((state) => state.menu.opened);\r\n const dispatch = useDispatch();\r\n const handleLeftDrawerToggle = () => {\r\n dispatch({ type: SET_MENU, opened: !leftDrawerOpened });\r\n };\r\n\r\n useEffect(() => {\r\n dispatch({ type: SET_MENU, opened: !matchDownMd });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [matchDownMd]);\r\n\r\n return (\r\n \r\n \r\n {/* header */}\r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* drawer */}\r\n \r\n\r\n {/* main content */}\r\n \r\n {/* */}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default MainLayout;\r\n","// assets\r\nimport {\r\n IconDashboard,\r\n IconTool,\r\n IconUser,\r\n IconUsers,\r\n IconReportAnalytics,\r\n IconHome2,\r\n IconSettings,\r\n IconStethoscope,\r\n IconWallet,\r\n IconBook\r\n} from '@tabler/icons';\r\n\r\n// constant\r\nconst icons = {\r\n IconHome2,\r\n IconTool,\r\n IconUsers,\r\n IconReportAnalytics,\r\n IconDashboard,\r\n IconUser,\r\n IconSettings,\r\n IconStethoscope,\r\n IconWallet,\r\n IconBook\r\n};\r\n// ==============================|| DASHBOARD MENU ITEMS ||============================== //\r\n\r\nconst dashboard = {\r\n id: 'dashboard',\r\n title: 'Μενού',\r\n type: 'group',\r\n children: [\r\n {\r\n id: 'Home.View',\r\n title: 'Αρχική',\r\n type: 'item',\r\n url: '/',\r\n icon: icons.IconHome2,\r\n subject: 'Home'\r\n },\r\n {\r\n id: 'Vets.View',\r\n title: 'Κτηνίατροι',\r\n type: 'item',\r\n url: '/view/vets',\r\n icon: icons.IconStethoscope,\r\n breadcrumbs: true,\r\n subject: 'Vets'\r\n },\r\n {\r\n id: 'Subscriptions.View',\r\n title: 'Συνδρομές',\r\n type: 'item',\r\n url: '/view/subscriptions',\r\n icon: icons.IconBook,\r\n breadcrumbs: true,\r\n subject: 'Subscriptions'\r\n },\r\n {\r\n id: 'Transactions.View',\r\n title: 'Πληρωμές',\r\n type: 'item',\r\n url: '/view/transactions',\r\n icon: icons.IconWallet,\r\n breadcrumbs: true,\r\n subject: 'Transactions'\r\n },\r\n {\r\n id: 'Users.View',\r\n title: 'Χρήστες',\r\n type: 'item',\r\n url: '/view/users',\r\n icon: icons.IconUser,\r\n breadcrumbs: true,\r\n subject: 'Users'\r\n },\r\n {\r\n id: 'Roles.View',\r\n title: 'Ρόλοι',\r\n type: 'item',\r\n url: '/view/roles',\r\n icon: icons.IconUsers,\r\n breadcrumbs: true,\r\n subject: 'Roles'\r\n },\r\n {\r\n id: 'AccountSettings.View',\r\n title: 'Ρυθμίσεις',\r\n type: 'item',\r\n url: '/user/settings',\r\n icon: icons.IconSettings,\r\n subject: 'AccountSettings'\r\n },\r\n {\r\n id: 'Webinars.View',\r\n title: 'Εκδηλώσεις',\r\n type: 'item',\r\n url: '/view/webinars',\r\n icon: icons.IconBook,\r\n subject: 'Webinars'\r\n }\r\n ]\r\n};\r\n\r\nexport default dashboard;\r\n","import BringValueInput from 'common/BringValueInput';\r\nimport { Typography, Stack, Box, Grid, Divider, Button } from '@mui/material';\r\nimport { FormProvider, useForm } from 'react-hook-form';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useState } from 'react';\r\nimport { useNavigate } from 'react-router';\r\nimport { vet } from 'apis';\r\nimport Conditional from 'common/Conditional';\r\n\r\nconst Search = () => {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation();\r\n const methods = useForm({});\r\n const [selectedItem, setSelectedItem] = useState(null);\r\n const [hideInfo, setHideInfo] = useState(true);\r\n const [canCreateNewUser, setCanCreateNewUser] = useState(false);\r\n\r\n const handleSelected = async (item) => {\r\n setSelectedItem(item);\r\n setHideInfo(false);\r\n const res = await vet.canCreateNewUserFromVet({ Id: item?.Id });\r\n setCanCreateNewUser(item?.Id ? await vet.canCreateNewUserFromVet({ Id: item?.Id }) : true);\r\n };\r\n\r\n return (\r\n \r\n \r\n {t('Search')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {selectedItem?.LastName} {selectedItem?.FirstName}\r\n \r\n \r\n {' | '}\r\n \r\n\r\n \r\n {selectedItem?.AM}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {'Ημερομηνία Γένησης: '}\r\n \r\n \r\n {selectedItem?.DateOfBirth ?? 'Άγνωστο'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {'Πατρώνυμο: '}\r\n \r\n \r\n {selectedItem?.FatherName ?? 'Άγνωστο'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {'Μητρώνυμο: '}\r\n \r\n \r\n {selectedItem?.MotherName ?? 'Άγνωστο'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {'ΑΦΜ: '}\r\n \r\n \r\n {selectedItem?.Afm ?? 'Άγνωστο'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {'ΑΜΚΑ: '}\r\n \r\n \r\n {selectedItem?.Amka ?? 'Άγνωστο'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {'ΔΟΥ: '}\r\n \r\n \r\n {selectedItem?.Doy ?? 'Άγνωστο'}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('Email')}\r\n {': '}\r\n \r\n \r\n {selectedItem?.Email ?? 'Άγνωστο'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {'Κινητό: '}\r\n \r\n \r\n {selectedItem?.MobileNumber ?? 'Άγνωστο'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {'Τηλέφωνο: '}\r\n \r\n \r\n {selectedItem?.PhoneNumber ?? 'Άγνωστο'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {'Διεύθυνση: '}\r\n \r\n \r\n {selectedItem?.City ?? 'Άγνωστο'}\r\n {selectedItem?.City && selectedItem?.Street ? ', ' : ''}\r\n {selectedItem?.Street ?? ''} {selectedItem?.StreetNumber ?? ''}\r\n {selectedItem?.Street && selectedItem?.Zip ? ', ' : ''}\r\n {selectedItem?.Zip ?? ''}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {'Ποσό Συνδρομών: '}\r\n \r\n \r\n {selectedItem?.SubscriptionsAmount ?? 'Άγνωστο'}\r\n {selectedItem?.SubscriptionsAmount ? ' €' : ''}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {'Υπόλοιπο: '}\r\n \r\n \r\n {selectedItem?.Balance ?? 'Άγνωστο'}\r\n {selectedItem?.Balance ? ' €' : ''}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Search;\r\n","// permissions\r\nimport { usePermissions } from 'context/permissionContext';\r\n\r\n// store\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { MENU_OPEN } from 'store/actions';\r\n\r\n// mui\r\nimport { Grid, Stack, Typography, Dialog } from '@mui/material';\r\n\r\n// icons\r\nimport { IconLockAccess } from '@tabler/icons';\r\n\r\n// colors\r\nimport colors from 'assets/scss/_themes-vars.module.scss';\r\nimport { useEffect } from 'react';\r\n\r\n// project imports\r\nimport VerificationPrompt from 'views/verification';\r\nimport loadingGif from 'assets/loading.gif';\r\n\r\nexport const PermissionDenied = () => {\r\n const dispatch = useDispatch();\r\n\r\n useEffect(() => {\r\n dispatch({ type: MENU_OPEN, id: null });\r\n }, [dispatch]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Restricted permission\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const withPermission =\r\n (Component, { action, subject }) =>\r\n (props) => {\r\n const permissions = usePermissions();\r\n const { isEmailVerified, username } = useSelector((state) => state.auth);\r\n const hasPermission = permissions.can(action, subject);\r\n if (!isEmailVerified) {\r\n return ;\r\n }\r\n if (!hasPermission) {\r\n return ;\r\n }\r\n return ;\r\n };\r\n\r\nexport const LoadingDialog = () => {\r\n const { loading } = useSelector((state) => state.menu);\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default LoadingDialog;\r\n","import { lazy } from 'react';\r\nimport { Link, Navigate } from 'react-router-dom';\r\n\r\n// project imports\r\nimport MainLayout from 'layout/MainLayout';\r\nimport Loadable from 'ui-component/Loadable';\r\n\r\nimport Search from 'views/dashboard/Search';\r\n// permission\r\nimport { withPermission } from 'hoc';\r\n// import Events from 'views/dashboard/Events';\r\n\r\n// dashboard routing\r\nconst UsersView = withPermission(Loadable(lazy(() => import('views/dashboard/Users').then((module) => ({ default: module.ModernView })))), {\r\n action: 'View',\r\n subject: 'Users'\r\n});\r\n\r\nconst UsersManage = withPermission(Loadable(lazy(() => import('views/dashboard/Users').then((module) => ({ default: module.Manage })))), {\r\n action: 'Manage',\r\n subject: 'Users'\r\n});\r\n\r\nconst UsersCreate = withPermission(Loadable(lazy(() => import('views/dashboard/Users').then((module) => ({ default: module.Create })))), {\r\n action: 'Create',\r\n subject: 'Users'\r\n});\r\n\r\nconst RolesView = withPermission(Loadable(lazy(() => import('views/dashboard/Roles').then((module) => ({ default: module.View })))), {\r\n action: 'View',\r\n subject: 'Roles'\r\n});\r\n\r\nconst RoleManage = withPermission(Loadable(lazy(() => import('views/dashboard/Roles').then((module) => ({ default: module.Manage })))), {\r\n action: 'Manage',\r\n subject: 'Roles'\r\n});\r\n\r\nconst SubscriptionsManage = withPermission(\r\n Loadable(lazy(() => import('views/dashboard/Subscriptions').then((module) => ({ default: module.Manage })))),\r\n {\r\n action: 'Manage',\r\n subject: 'Subscriptions'\r\n }\r\n);\r\n\r\nconst TransactionsView = withPermission(\r\n Loadable(lazy(() => import('views/dashboard/Transactions').then((module) => ({ default: module.View })))),\r\n {\r\n action: 'View',\r\n subject: 'Transactions'\r\n }\r\n);\r\n\r\nconst EventsView = withPermission(Loadable(lazy(() => import('views/dashboard/Events').then((module) => ({ default: module.View })))), {\r\n action: 'View',\r\n subject: 'Webinars'\r\n});\r\n\r\nconst EventsManage = withPermission(Loadable(lazy(() => import('views/dashboard/Events').then((module) => ({ default: module.Manage })))), {\r\n action: 'View',\r\n subject: 'Webinars'\r\n});\r\n\r\nconst EventsCreate = withPermission(Loadable(lazy(() => import('views/dashboard/Events').then((module) => ({ default: module.Create })))), {\r\n action: 'Create',\r\n subject: 'Webinars'\r\n});\r\n\r\nconst TestView = withPermission(Loadable(lazy(() => import('views/dashboard/Test').then((module) => ({ default: module.View })))), {\r\n action: 'View',\r\n subject: 'Vets'\r\n});\r\n\r\nconst TestManage = withPermission(Loadable(lazy(() => import('views/dashboard/Test').then((module) => ({ default: module.Manage })))), {\r\n action: 'View',\r\n subject: 'Vets'\r\n});\r\n\r\nconst AdminEventsView = withPermission(\r\n Loadable(lazy(() => import('views/dashboard/AdminEvents').then((module) => ({ default: module.View })))),\r\n {\r\n action: 'View',\r\n subject: 'Webinars'\r\n }\r\n);\r\n\r\nconst ParticipationsView = withPermission(\r\n Loadable(lazy(() => import('views/dashboard/Participations').then((module) => ({ default: module.View })))),\r\n {\r\n action: 'View',\r\n subject: 'Webinars'\r\n }\r\n);\r\n\r\nconst ParticipationsManage = withPermission(\r\n Loadable(lazy(() => import('views/dashboard/Participations').then((module) => ({ default: module.Manage })))),\r\n {\r\n action: 'Manage',\r\n subject: 'Webinars'\r\n }\r\n);\r\n\r\nconst PaymentIndexView = withPermission(\r\n Loadable(lazy(() => import('views/dashboard/Transactions2').then((module) => ({ default: module.View })))),\r\n {\r\n action: 'View',\r\n subject: 'Transactions2'\r\n }\r\n);\r\n\r\nconst PaymentIndexManage = withPermission(\r\n Loadable(lazy(() => import('views/dashboard/Transactions2').then((module) => ({ default: module.Manage })))),\r\n {\r\n action: 'Manage',\r\n subject: 'Transactions2'\r\n }\r\n);\r\n\r\nconst FaqView = withPermission(Loadable(lazy(() => import('views/dashboard/Faq').then((module) => ({ default: module.View })))), {\r\n action: 'View',\r\n subject: 'FAQ'\r\n});\r\n\r\nconst FaqManage = withPermission(Loadable(lazy(() => import('views/dashboard/Faq').then((module) => ({ default: module.Manage })))), {\r\n action: 'Manage',\r\n subject: 'FAQ'\r\n});\r\n\r\nconst HomeView = withPermission(Loadable(lazy(() => import('views/dashboard/Home'))), { action: 'View', subject: 'Home' });\r\n\r\nconst Analytics = Loadable(lazy(() => import('views/dashboard/Analytics')));\r\nconst AccountSettings = Loadable(lazy(() => import('views/settings/Account Settings')));\r\nconst EventDetails = Loadable(lazy(() => import('views/dashboard/Events/Manage/Details')));\r\nconst EventParticipations = Loadable(lazy(() => import('views/dashboard/Events/Manage/Participations')));\r\nconst EventEdit = Loadable(lazy(() => import('views/dashboard/Events/Manage/Edit')));\r\nconst Transaction = Loadable(lazy(() => import('views/dashboard/Payment')));\r\nconst FaqEdit = Loadable(lazy(() => import('views/dashboard/Faq/Manage/Edit')));\r\nconst SubscriptionsEdit = Loadable(lazy(() => import('views/dashboard/Subscriptions/Manage/Edit')));\r\n\r\n// ==============================|| MAIN ROUTING ||============================== //\r\n\r\nconst MainRoutes = () => ({\r\n path: '/*',\r\n element: ,\r\n children: [\r\n {\r\n path: '/',\r\n element: \r\n },\r\n {\r\n path: '/api/success',\r\n element: \r\n },\r\n {\r\n path: '/api/fail',\r\n element: \r\n },\r\n {\r\n path: '/search',\r\n element: \r\n },\r\n {\r\n path: '/view/users',\r\n element: \r\n },\r\n {\r\n path: '/manage/user/:id',\r\n element: \r\n },\r\n {\r\n path: '/create/user',\r\n element: \r\n },\r\n {\r\n path: '/create/user/:existingPersonId',\r\n element: \r\n },\r\n {\r\n path: '/vets/view',\r\n element: \r\n },\r\n {\r\n path: '/vets/manage/:id',\r\n element: \r\n },\r\n {\r\n path: '/view/roles',\r\n element: \r\n },\r\n {\r\n path: '/subscriptions/view',\r\n element: \r\n },\r\n {\r\n path: '/subscriptions/manage',\r\n element: \r\n },\r\n {\r\n path: '/subscriptions/edit/:id',\r\n element: \r\n },\r\n {\r\n path: '/view/transactions',\r\n element: \r\n },\r\n {\r\n path: '/view/transactions/manage',\r\n element: \r\n },\r\n {\r\n path: '/manage/transactions/:id',\r\n element: \r\n },\r\n {\r\n path: '/manage/transactions/:id/:type',\r\n element: \r\n },\r\n {\r\n path: '/transactions/view',\r\n element: \r\n },\r\n {\r\n path: '/transactions/payment',\r\n element: \r\n },\r\n {\r\n path: '/manage/roles/:id',\r\n element: \r\n },\r\n {\r\n path: '/analytics',\r\n element: \r\n },\r\n {\r\n path: '/user/settings',\r\n element: \r\n },\r\n {\r\n path: '/invite',\r\n element: (\r\n \r\n Παρακαλώ αποσυνδεθείτε για να αποδεχθείτε την πρόσκληση!\r\n
\r\n )\r\n },\r\n {\r\n path: '/webinars/view',\r\n element: \r\n },\r\n {\r\n path: '/webinar/create',\r\n element: \r\n },\r\n {\r\n path: '/webinar/:id',\r\n element: ,\r\n children: [\r\n // {\r\n // path: '',\r\n // element: \r\n // },\r\n {\r\n path: 'details',\r\n element: \r\n },\r\n {\r\n path: 'participations',\r\n element: \r\n },\r\n {\r\n path: 'edit',\r\n element: \r\n }\r\n ]\r\n },\r\n {\r\n path: '/test/view',\r\n element: \r\n },\r\n {\r\n path: '/events/view',\r\n element: \r\n },\r\n {\r\n path: '/participations/view',\r\n element: \r\n },\r\n {\r\n path: '/participations/manage/:id',\r\n element: \r\n },\r\n {\r\n path: '/faq/manage',\r\n element: \r\n },\r\n {\r\n path: '/faq/edit/:id',\r\n element: \r\n },\r\n {\r\n path: '/faq/view',\r\n element: \r\n },\r\n {\r\n path: '*',\r\n element: \r\n }\r\n ]\r\n});\r\n\r\nexport default MainRoutes;\r\n","import { Outlet } from 'react-router-dom';\r\n\r\n// ==============================|| MINIMAL LAYOUT ||============================== //\r\n\r\nconst MinimalLayout = () => (\r\n <>\r\n \r\n >\r\n);\r\n\r\nexport default MinimalLayout;\r\n","import { lazy } from 'react';\r\nimport { Navigate } from 'react-router-dom';\r\n\r\n// project imports\r\nimport Loadable from 'ui-component/Loadable';\r\nimport MinimalLayout from 'layout/MinimalLayout';\r\n\r\n// login option 3 routing\r\nconst AuthLogin3 = Loadable(lazy(() => import('views/authentication/authentication3/Login3')));\r\nconst AuthRegister3 = Loadable(lazy(() => import('views/authentication/authentication3/Register3')));\r\nconst ResetPassword = Loadable(lazy(() => import('views/authentication/forgotPassword')));\r\nconst UserInvitation = Loadable(lazy(() => import('views/authentication/userInvitation')));\r\nconst EventsPublicView = Loadable(lazy(() => import('views/authentication/Events').then((module) => ({ default: module.View }))));\r\nconst EventsPublicManage = Loadable(lazy(() => import('views/authentication/Events').then((module) => ({ default: module.Manage }))));\r\n// ==============================|| AUTHENTICATION ROUTING ||============================== //\r\n\r\nconst AuthenticationRoutes = () => ({\r\n path: '/*',\r\n element: ,\r\n children: [\r\n {\r\n path: '/login',\r\n element: \r\n },\r\n {\r\n path: '/invite',\r\n element: \r\n },\r\n {\r\n path: '/register',\r\n element: \r\n },\r\n {\r\n path: '/reset/:token',\r\n element: \r\n },\r\n {\r\n path: '/events/public',\r\n element: \r\n },\r\n {\r\n path: '/events/public/details/:id',\r\n element: \r\n },\r\n {\r\n path: '*',\r\n element: \r\n }\r\n ]\r\n});\r\n\r\nexport default AuthenticationRoutes;\r\n","import { memo } from 'react';\r\nimport { useRoutes } from 'react-router-dom';\r\n\r\n// routes\r\nimport MainRoutes from './MainRoutes';\r\nimport AuthenticationRoutes from './AuthenticationRoutes';\r\nimport config from 'config';\r\n\r\n// store\r\nimport { useSelector } from 'react-redux';\r\n\r\n// ==============================|| ROUTING RENDER ||============================== //\r\n\r\nconst Routes = memo(() => {\r\n const { isLoggedIn } = useSelector((state) => state.auth);\r\n\r\n /* useEffect(() => {\r\n if (!isLoggedIn) {\r\n navigate('/login');\r\n }\r\n }, [isLoggedIn, navigate]); */\r\n\r\n const routes = isLoggedIn ? MainRoutes() : AuthenticationRoutes();\r\n return useRoutes([routes], config.basename);\r\n});\r\n\r\nexport default Routes;\r\n","import PropTypes from 'prop-types';\r\nimport { useEffect } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\n\r\n// ==============================|| NAVIGATION SCROLL TO TOP ||============================== //\r\n\r\nconst NavigationScroll = ({ children }) => {\r\n const location = useLocation();\r\n const { pathname } = location;\r\n\r\n useEffect(() => {\r\n window.scrollTo({\r\n top: 0,\r\n left: 0,\r\n behavior: 'smooth'\r\n });\r\n }, [pathname]);\r\n\r\n return children || null;\r\n};\r\n\r\nNavigationScroll.propTypes = {\r\n children: PropTypes.node\r\n};\r\n\r\nexport default NavigationScroll;\r\n","import { useSelector } from 'react-redux';\r\n\r\nimport { ThemeProvider } from '@mui/material/styles';\r\nimport { CssBaseline, StyledEngineProvider, Slide } from '@mui/material';\r\n\r\nimport { QBringValueProvider } from '@qubiteq/datagrid';\r\n\r\n// routing\r\nimport Routes from 'routes';\r\n\r\n// defaultTheme\r\nimport themes from 'themes';\r\n\r\n// project imports\r\nimport NavigationScroll from 'layout/NavigationScroll';\r\n\r\nimport { QueryClient, QueryClientProvider } from 'react-query';\r\n\r\nimport { SnackbarProvider } from 'notistack';\r\n\r\nimport { DialogProvider } from 'context/dialogContext';\r\n\r\n// permissions\r\nimport { PermissionProvider } from 'context/permissionContext';\r\nimport '@grapecity/wijmo.cultures/wijmo.culture.de';\r\nimport 'font-awesome/css/font-awesome.min.css';\r\n\r\nimport { UserProvider } from 'context/userContext';\r\n\r\nimport { PayPalScriptProvider } from '@paypal/react-paypal-js';\r\nimport { LoadingDialog } from 'hoc';\r\nimport { ModalProvider } from 'context/modalContext';\r\nimport { QubBringValueProvider } from 'qubCommon/context/bringValueContext';\r\n\r\nconst queryClient = new QueryClient();\r\n\r\n// ==============================|| APP ||============================== //\r\n\r\nconst App = () => {\r\n const customization = useSelector((state) => state.customization);\r\n const initialOptions = {\r\n 'client-id': process.env.REACT_APP_PAYPAL_CLIENT_ID,\r\n currency: 'USD',\r\n intent: 'capture',\r\n components: 'buttons,marks,funding-eligibility'\r\n };\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default App;\r\n","import i18n from 'i18next';\r\nimport { initReactI18next } from 'react-i18next';\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\n\r\ni18n.use(LanguageDetector)\r\n .use(initReactI18next)\r\n .init({\r\n debug: false,\r\n fallbackLng: 'gre',\r\n lng: 'gre',\r\n interpolation: {\r\n escapeValue: false\r\n },\r\n resources: {\r\n en: {\r\n translation: {\r\n Home: 'Home',\r\n Users: 'Users',\r\n Roles: 'Roles',\r\n Analytics: 'Analytics',\r\n AccountSettings: 'Account Settings',\r\n GoodMorning: 'Good Morning',\r\n GoodEvening: 'Good Evening',\r\n SelectLanguage: 'Select language',\r\n Vets: 'Vets',\r\n Transactions: 'Transactions',\r\n Subscriptions: 'Subscriptions',\r\n Income: 'Income',\r\n Subscribed: 'Subscribed',\r\n Unsubscribed: 'Unsubscribed',\r\n Statistics: 'Statistics',\r\n MyRoles: 'My Roles',\r\n UserDetails: 'User Details',\r\n AddRoles: 'Add Roles',\r\n Lastname: 'Lastname',\r\n Firstname: 'Firstname',\r\n Gender: 'Gender',\r\n DOB: 'Date Of birth',\r\n Back: 'Back',\r\n Next: 'Next',\r\n Submit: 'Submit',\r\n CreateUserMsg: 'Please follow the steps to invite a new user',\r\n InvitationSuccess: 'Invitation sent',\r\n InvitationError: 'An error occured while sending invitation, please try again later',\r\n ActivateUserMsg: 'User created successfully.',\r\n SomethingWrong: 'Something went wrong!',\r\n UserRegistration: 'User Registration',\r\n FillFormToRegister: 'Plaese fill the form to register',\r\n Password: 'Password',\r\n ConfirmPassword: 'Confirm Password',\r\n Agree: 'I hereby declare that I have read and accept the',\r\n AcceptTerms: 'Terms & Conditions',\r\n ResendInvitation: 'Resend invitation',\r\n EventDetails: 'Details',\r\n Participations: 'Participations',\r\n EditEvent: 'Edit',\r\n Title: 'Title',\r\n Abbreviation: 'Abbreviation',\r\n Branch: 'Branch',\r\n From: 'From',\r\n To: 'To',\r\n Schedule: 'Schedule',\r\n Location: 'Location',\r\n Speakers: 'Speakers',\r\n EventType: 'Event Type',\r\n TicketFee: 'Ticket Fee',\r\n EventDescription: 'Description',\r\n ManageEvent: 'Access',\r\n AllowEntries: 'Allow Entries',\r\n ShowToUsers: 'Show to events',\r\n Save: 'Save',\r\n Participate: 'Participate',\r\n Attachments: 'Attachments',\r\n RequiredField: 'Required',\r\n InvalidDate: 'Invalid Date',\r\n HasParticipated: 'You have applied for the event',\r\n Search: 'Search',\r\n AfterStartDate: 'The date should not preceed the start date',\r\n SubmitParticipation: 'Submit Participation',\r\n SubmitParticipationConfirmation: 'Are you sure you would like to participate?',\r\n Yes: 'Yes',\r\n No: 'No',\r\n ChangeEmailIfRequired: 'Change email if required',\r\n rolesUpdateSuccessful: 'Roles updated successfully',\r\n CreateNewUser: 'New user',\r\n ChangeEmailAlert: \"Invitation email change will change user's email as well\",\r\n FilesNotFound: 'Files not found',\r\n AddFile: 'Add File',\r\n Transaction: 'Transaction',\r\n Vet: 'Vet',\r\n Code: 'Code',\r\n Address: 'Address',\r\n OrganizationContactPhone: 'Contact Phone',\r\n TransactionNumber: 'Trans. Number',\r\n TransactionDate: 'Date',\r\n TransType: 'Type',\r\n ColumnPicker: 'Column Picker',\r\n ChooseColumn: 'Columns',\r\n TransactionCategory: 'Transaction',\r\n PaymentMethod: 'Payment Method',\r\n Comments: 'Comments',\r\n Remarks: 'Remarks',\r\n Summary: 'Total',\r\n Cancel: 'Cancel',\r\n NewRecord: 'New Record',\r\n ContinueToPayment: 'Proceed To Payment',\r\n Price: 'Price',\r\n CancelParticipation: 'Cancel Participation',\r\n SubmitParticipationCancelation: 'Are you sure you would like to cancel your participation?',\r\n ParticipationCancellationSuccess: 'Your participation is cancelled!',\r\n PaymentsStep1: 'Transactions',\r\n PaymentsStep2: 'Payment Method',\r\n PaymentsStep3: 'Payment Details',\r\n PaymentsStep4: 'Review',\r\n PaymentFailed: 'Payment Failed',\r\n PaymentSuccess: 'Payment Success',\r\n TransactionID: 'Transaction ID',\r\n Date: 'Date',\r\n Amount: 'Total Amount',\r\n ErrorCode: 'Error Code',\r\n SignUp: 'Sign Up',\r\n CancelTransaction: 'Cancel Transaction',\r\n CancelTransactionConfirmation: \"Are you sure you'd like to cancel the transaction?\",\r\n MyProfile: 'My Profile',\r\n NumericField: 'The field should be a numeric value',\r\n EmailField: 'The field should be a valid e-mail address',\r\n AtLeastOnePhoneNumber: 'Enter at least one phone number',\r\n AfterRegistrationToDate: 'Registration dates should be before event conduction dates',\r\n FullName: 'Full Name',\r\n UsersIndex: 'Users Index',\r\n NoUsersFound: 'No users found',\r\n SearchField: 'Search Field',\r\n Status: 'Status',\r\n Show: 'Show',\r\n Active: 'Active',\r\n NewUser: 'New User',\r\n MinDate: 'Date should be minimum',\r\n FormErrorsDescription: 'Please correct the errors in the form before submiting',\r\n PaymentMethods: 'Payment Methods',\r\n SearchVets: 'Search Vets',\r\n IsCategory: 'Is Category',\r\n MakeVisible: 'Make Visible',\r\n Question: 'Question',\r\n Answer: 'Answer',\r\n Parent: 'Parent',\r\n Position: 'Position',\r\n Category: 'Category',\r\n ParticipationSuccess: 'Participation registered successfully',\r\n FormErrors: 'Form Errors',\r\n EventTitle: 'Event Title',\r\n EventAbbr: 'Event Abbreviation',\r\n DateFrom: 'Date From',\r\n Event: 'Event',\r\n FAQCode: 'Code'\r\n }\r\n },\r\n gre: {\r\n translation: {\r\n Home: 'Αρχική',\r\n Users: 'Χρήστες',\r\n Roles: 'Ρολοι',\r\n Analytics: 'Aναλυτικά στοιχεία',\r\n AccountSettings: 'Ρυθμίσεις λογαριασμού',\r\n GoodMorning: 'Καλημέρα',\r\n GoodEvening: 'Καλησπέρα',\r\n Vets: 'Κτηνίατροι',\r\n Transactions: 'Συναλλαγές',\r\n Subscriptions: 'Συνδρομές',\r\n SelectLanguage: 'Επιλέξτε γλώσσα',\r\n Income: 'Έσοδα',\r\n Subscribed: 'Ενεργή Συνδρομή',\r\n Unsubscribed: 'Ανενεργή Συνδρομή',\r\n Statistics: 'Στατιστικά',\r\n MyRoles: 'Οι ρόλοι μου',\r\n UserDetails: 'Στοιχεία χρήστη',\r\n AddRoles: 'Προσθήκη ρόλων',\r\n Lastname: 'Επώνυμο',\r\n Firstname: 'Όνομα',\r\n Gender: 'Φύλο',\r\n DOB: 'Ημ/νία Γέννησης',\r\n Back: 'Πίσω',\r\n Next: 'Επόμενο',\r\n Submit: 'Υποβολή',\r\n CreateUserMsg: 'Παρακαλούμε ακολουθήστε την διαδικασία για να προσκαλέσετε νέο χρήστη',\r\n InvitationSuccess: 'Η πρόσκληση στάλθηκε επιτυχώς',\r\n InvitationError: 'Σφάλμα στην αποστολή πρόσκλησης. Παρακαλούμε προσπαθήστε αργότερα',\r\n ActivateUserMsg: 'Ο χρήστης δημιουργήθηκε με επιτυχία.',\r\n SomethingWrong: 'Κάτι πήγε λάθος',\r\n UserRegistration: 'Εγγραφή χρήστη',\r\n FillFormToRegister: 'Συμπληρώστε την φόρμα για να εγγραφείτε',\r\n Password: 'Κωδικός πρόσβασης',\r\n ConfirmPassword: 'Επιβεβαιώση κωδικού πρόσβασης',\r\n Agree: 'Δηλώνω υπέθυνα οτι διάβασα και αποδέχομαι',\r\n AcceptTerms: 'τους Όρους Χρήσης',\r\n ResendInvitation: 'Επαναποστολή πρόσκλησης',\r\n EventDetails: 'Πληροφορίες',\r\n Participations: 'Συμμετοχές',\r\n EditEvent: 'Τροποποίηση',\r\n Title: 'Τίτλος',\r\n Abbreviation: 'Σύντμηση',\r\n Branch: 'Branch',\r\n From: 'Από',\r\n To: 'Έως',\r\n Schedule: 'Πρόγραμμα',\r\n Location: 'Τοποθεσία',\r\n Speakers: 'Ομιλητές',\r\n EventType: 'Τύπος',\r\n TicketFee: 'Τιμή',\r\n EventDescription: 'Περιγραφή',\r\n ManageEvent: 'Διαχείριση Πρόσβασης',\r\n AllowEntries: 'Ανοιχτές συμμετοχές',\r\n ShowToUsers: 'Εμφάνιση στις Εκδηλώσεις',\r\n Save: 'Αποθήκευση',\r\n Participate: 'Δήλωση Συμμετοχής',\r\n Attachments: 'Αρχεία',\r\n RequiredField: 'Υποχρεωτικό πεδίο',\r\n InvalidDate: 'Μη έγκυρη ημερομηνία',\r\n HasParticipated: 'Έχετε ήδη δηλώσει συμμετοχή',\r\n Search: 'Αναζήτηση',\r\n AfterStartDate: 'Η ημερομηνία πρέπει να μην προηγείται της ημερομηνίας έναρξης',\r\n SubmitParticipationConfirmation: 'Είστε σίγουροι ότι θέλετε να δηλώσετε συμμετοχή;',\r\n SubmitParticipation: 'Δήλωση συμμετοχής',\r\n Yes: 'Ναι',\r\n No: 'Όχι',\r\n ChangeEmailIfRequired: 'Αλλαγή email',\r\n rolesUpdateSuccessful: 'Οι ρόλοι ενημερώθηκαν επιτυχώς',\r\n CreateNewUser: 'Νέος χρήστης',\r\n ChangeEmailAlert: 'Η αλλαγή του email πρόσκλησης θα προκαλέσει αλλαγή του email του user',\r\n Cancel: 'Ακύρωση',\r\n FilesNotFound: 'Δεν βρέθηκαν αρχεία',\r\n AddFile: 'Προσθήκη Αρχείου',\r\n Transaction: 'Συναλλαγή',\r\n Vet: 'Κτηνίατρος',\r\n Code: 'AM',\r\n Address: 'Διεύθυνση',\r\n OrganizationContactPhone: 'Τηλ.Επικοινωνίας',\r\n TransactionNumber: 'Αρ. Συναλλαγής',\r\n TransactionDate: 'Ημ/νία',\r\n TransType: 'Τύπος',\r\n ColumnPicker: 'Επιλογές Στηλών',\r\n ChooseColumn: 'Στήλες',\r\n TransactionCategory: 'Συναλλαγή',\r\n PaymentMethod: 'Μέθοδος πληρωμής',\r\n Comments: 'Σχόλια',\r\n Remarks: 'Παρατηρήσεις',\r\n Summary: 'Σύνολο',\r\n ProductServiceDescription: 'Περιγραφή',\r\n NewRecord: 'Νέα Εγγραφή',\r\n ManageEvents: 'Διαχείριση Εκδηλώσεων',\r\n Events: 'Εκδηλώσεις',\r\n ContinueToPayment: 'Συνέχεια στην Πληρωμή',\r\n Price: 'Τιμή',\r\n CancelParticipation: 'Ακύρωση συμμετοχής',\r\n SubmitParticipationCancelation: 'Είστε σίγουροι οτι θέλετε να ακυρώσετε την συμμετοχή σας;',\r\n ParticipationCancellationSuccess: 'Η συμμετοχή σας ακυρώθηκε!',\r\n PaymentsStep1: 'Συναλλαγές',\r\n PaymentsStep2: 'Τρόπος Πληρωμής',\r\n PaymentsStep3: 'Λεπτομέρειες Πληρωμής',\r\n PaymentsStep4: 'Προεπισκόπηση',\r\n PaymentFailed: 'Αποτυχία Πληρωμής',\r\n PaymentSuccess: 'Επιτυχής Πληρωμή',\r\n TransactionDetails: 'Λεπτομέρειες Συναλλαγής',\r\n TransactionID: 'Κωδικός συναλλαγής',\r\n Date: 'Ημερομηνία',\r\n Amount: 'Σύνολο',\r\n ErrorCode: 'Κωδικός Σφάλματος',\r\n SignUp: 'Εγγραφή',\r\n CancelTransaction: 'Ακύρωση συναλλαγής',\r\n CancelTransactionConfirmation: 'Είστε σίγουροι πως θέλετε να ακυρώσετε την παρούσα συναλλαγή;',\r\n MyProfile: 'Τα στοιχεία μου',\r\n NumericField: 'Το πεδίο πρέπει να είναι αριθμητικό',\r\n EmailField: 'Το πεδίο πρέπει να περιέχει μία έγκυρη διεύθυνση e-mail',\r\n AtLeastOnePhoneNumber: 'Πληκτρολογήστε τουλάχιστον έναν τηλεφωνικό αριθμό',\r\n AfterRegistrationToDate: 'Οι ημερομηνίες εγγραφής πρέπει να προηγούνται των ημερομηνιών διεξαγωγής της εκδήλωσης',\r\n FullName: 'Ονοματεπώνυμο',\r\n UsersIndex: 'Ευρετήριο Χρηστών',\r\n NoUsersFound: 'Δεν βρέθηκαν χρήστες',\r\n SearchField: 'Πεδίο Αναζήτησης',\r\n Status: 'Κατάσταση',\r\n Show: 'Προβολή',\r\n Active: 'Ενεργός',\r\n NewUser: 'Νέος Χρήστης',\r\n MinDate: 'Η ημερομηνία πρέπει να είναι τουλάχιστον',\r\n FormErrorsDescription: 'Υπάρχουν λάθη στα πεδία της φόρμας. Παρακαλώ διορθώστε τα πριν υποβάλετε.',\r\n PaymentMethods: 'Μέθοδοι Πληρωμής',\r\n SearchVets: 'Αναζήτηση Κτηνιάτρων',\r\n IsCategory: 'Είναι Κατηγορία',\r\n MakeVisible: 'Να εμφανίζεται',\r\n Question: 'Ερώτηση',\r\n Answer: 'Απάντηση',\r\n Parent: 'Κατηγορία',\r\n Position: 'Θέση',\r\n Category: 'Κατηγορία',\r\n ParticipationSuccess: 'Η συμμετοχή καταχωρήθηκε επιτυχώς!',\r\n FormErrors: 'Σφάλματα Φόρμας',\r\n EventTitle: 'Τίτλος Εκδήλωσης',\r\n EventAbbr: 'Σύντμηση Εκδήλωσης',\r\n DateFrom: 'Ημερομηνία Έναρξης',\r\n Event: 'Εκδήλωση',\r\n FAQCode: 'Κωδικός'\r\n }\r\n }\r\n }\r\n });\r\n\r\nexport default i18n;\r\n","/* eslint-disable import/no-extraneous-dependencies */\r\nimport ReactDOM from 'react-dom';\r\n\r\n// third party\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport { Provider } from 'react-redux';\r\nimport { PersistGate } from 'redux-persist/integration/react';\r\nimport { Helpers } from '@qubiteq/datagrid';\r\nimport { setLicenseKey } from '@grapecity/wijmo';\r\n\r\n// project imports\r\nimport * as serviceWorker from 'serviceWorker';\r\nimport App from 'App';\r\nimport { store, persistor } from 'store';\r\nimport './assets/main.css';\r\n\r\n// style + assets\r\nimport 'assets/scss/style.scss';\r\nimport '@qubiteq/datagrid/dist/datagrid.cjs.development.css';\r\nimport '@grapecity/wijmo.cultures/wijmo.culture.el';\r\n\r\n// i18n\r\nimport './i18n';\r\n/* eslint-disable */\r\n// ==============================|| REACT DOM RENDER ||============================== //\r\n\r\nsetLicenseKey(window.WIJMO_LICENSE_KEY);\r\n// Helpers.licenseWj(window.WIJMO_LICENSE_KEY);\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}