\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t) : (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{t('Some enterprise profiles may have this intentionally left blank')}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t>\r\n\t);\r\n};\r\n\r\nexport default CompanyProfile;\r\n","import { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport dayjs from 'dayjs';\r\nimport utc from 'dayjs/plugin/utc';\r\nimport { Modal, Form, Input, Select, DatePicker, Switch, notification } from 'antd';\r\nimport { useI18nLocalization } from '../../i18nLocalization/useI18nLocalization';\r\nimport { useNotificationsLogic } from '../useNotificationsLogic';\r\nimport { useApplicationsLogic } from '../useApplicationsLogic';\r\nimport { title } from '../../validation/regex';\r\n\r\nconst CreateNotificationModal = ({ isVisible, onSaveCallback, onCloseCallback }) => {\r\n\tdayjs.extend(utc);\r\n\r\n\tconst notificationsLogic = useNotificationsLogic();\r\n\tconst applicationsLogic = useApplicationsLogic();\r\n\r\n\tconst [form] = Form.useForm();\r\n\tconst [isSaving, setIsSaving] = useState(false);\r\n\tconst [areFormErrors, setAreFormErrors] = useState(true);\r\n\r\n\tconst { t, getDateFormat, getAntLocale } = useI18nLocalization();\r\n\r\n\t//-- defaultChecked doesn't play nice with the form, so I'll track it manually\r\n\tconst [isEnabled, setIsEnabled] = useState(true);\r\n\r\n\tconst [notificationTypes, setNotificationTypes] = useState(null);\r\n\tconst [applications, setApplications] = useState(null);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!notificationTypes) {\r\n\t\t\tgetNotificationTypes();\r\n\t\t}\r\n\t}, [JSON.stringify(notificationTypes)]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!applications) {\r\n\t\t\tgetApplications();\r\n\t\t}\r\n\t}, [JSON.stringify(applications)]);\r\n\r\n\tconst getNotificationTypes = async () => {\r\n\t\tconst nts = await notificationsLogic.getNotificationTypes();\r\n\t\tsetNotificationTypes(nts);\r\n\t};\r\n\r\n\tconst getApplications = async () => {\r\n\t\tconst apps = await applicationsLogic.getApplications();\r\n\t\tsetApplications(apps);\r\n\t};\r\n\r\n\t//-- Gather the form data\r\n\tconst getNewNotification = (formValues) => {\r\n\t\tconst newNotificationObj = {\r\n\t\t\tenabled: isEnabled,\r\n\t\t\tnotificationType: formValues.notificationType,\r\n\t\t\tbanner: formValues.displayType,\r\n\t\t\ttitle: formValues.title,\r\n\t\t\tmessage: formValues.message,\r\n\t\t\tnotifyThroughDateUtc: formValues.notifyThroughDateUtc.utc().format(),\r\n\t\t\tdismissable: formValues.dismissable ? true : false,\r\n\t\t\tapplicationId: formValues.applicationId\r\n\t\t};\r\n\t\treturn newNotificationObj;\r\n\t};\r\n\r\n\tconst handleOnSave = async (formValues) => {\r\n\t\tsetIsSaving(true);\r\n\t\tconst newNotification = getNewNotification(formValues);\r\n\t\tconst successful = await notificationsLogic.createNotification(newNotification);\r\n\t\tif (successful) {\r\n\t\t\tnotification['success']({\r\n\t\t\t\tmessage: `${t(`NotificationCreated`)}!`\r\n\t\t\t});\r\n\r\n\t\t\tclearForm();\r\n\t\t\tonSaveCallback();\r\n\t\t} else {\r\n\t\t\tnotification['error']({\r\n\t\t\t\tmessage: t('CreateNotificationError'),\r\n\t\t\t\tduration: 10\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tsetIsSaving(false);\r\n\t};\r\n\r\n\tconst handleOnCancel = () => {\r\n\t\tsetIsSaving(false);\r\n\t\tclearForm();\r\n\t\tonCloseCallback();\r\n\t};\r\n\r\n\tconst clearForm = () => {\r\n\t\tform.resetFields();\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t {\r\n\t\t\t\t\t//-- Will trigger the form's onFinish event\r\n\t\t\t\t\tform.submit();\r\n\t\t\t\t}}\r\n\t\t\t\tokButtonProps={{ disabled: areFormErrors }}\r\n\t\t\t\tconfirmLoading={isSaving}\r\n\t\t\t\tonCancel={handleOnCancel}\r\n\t\t\t\tcancelText={t('Cancel')}\r\n\t\t\t>\r\n\t\t\t\t\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tsetIsEnabled(checked);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tif (!value) {\r\n\t\t\t\t\t\t\t\t\t\treturn Promise.reject(new Error(t('Notify Through Date is required')));\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn Promise.resolve();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t]}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tif (!value) {\r\n\t\t\t\t\t\t\t\t\t\treturn Promise.reject(new Error(t('Title is required')));\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\tif (!value.match(title)) {\r\n\t\t\t\t\t\t\t\t\t\treturn Promise.reject(new Error(`1-50 ${t('alpha and some special chars (inclusive)')}`));\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn Promise.resolve();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t]}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tif (!value) {\r\n\t\t\t\t\t\t\t\t\t\treturn Promise.reject(new Error(t('MessageRequired')));\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn Promise.resolve();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t]}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t>\r\n\t);\r\n};\r\n\r\nCreateNotificationModal.propTypes = {\r\n\tisVisible: PropTypes.bool.isRequired,\r\n\tonSaveCallback: PropTypes.func.isRequired,\r\n\tonCloseCallback: PropTypes.func.isRequired\r\n};\r\n\r\nexport default CreateNotificationModal;\r\n","import { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport dayjs from 'dayjs';\r\nimport utc from 'dayjs/plugin/utc';\r\nimport { Modal, Form, Input, Select, DatePicker, Switch, notification } from 'antd';\r\nimport { useNotificationsLogic } from '../useNotificationsLogic';\r\nimport { title } from '../../validation/regex';\r\nimport { useI18nLocalization } from '../../i18nLocalization/useI18nLocalization';\r\n\r\nconst EditNotificationModal = ({ isVisible, onSaveCallback, onCloseCallback, ntificn }) => {\r\n\tdayjs.extend(utc);\r\n\r\n\tconst notificationsLogic = useNotificationsLogic();\r\n\r\n\tconst [form] = Form.useForm();\r\n\tconst [isSaving, setIsSaving] = useState(false);\r\n\tconst [areFormErrors, setAreFormErrors] = useState(false);\r\n\r\n\tconst { t, getDateFormat, getAntLocale } = useI18nLocalization();\r\n\r\n\tconst [notificationTypes, setNotificationTypes] = useState(null);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!notificationTypes) {\r\n\t\t\tgetNotificationTypes();\r\n\t\t}\r\n\t}, [JSON.stringify(notificationTypes)]);\r\n\r\n\tconst getNotificationTypes = async () => {\r\n\t\tconst nts = await notificationsLogic.getNotificationTypes();\r\n\t\tsetNotificationTypes(nts);\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tform.setFieldsValue({\r\n\t\t\tenabled: ntificn?.enabled,\r\n\t\t\tnotificationType: ntificn?.notificationType,\r\n\t\t\tdisplayType: ntificn?.banner,\r\n\t\t\ttitle: ntificn?.title,\r\n\t\t\tmessage: ntificn?.message,\r\n\t\t\tnotifyThroughDateUtc: dayjs(ntificn?.notifyThroughDateUtc),\r\n\t\t\tdismissable: ntificn?.dismissable\r\n\t\t});\r\n\t}, [JSON.stringify(ntificn)]);\r\n\r\n\tconst getUpdatedNotification = (formValues) => {\r\n\t\tconst updatedNotificationObj = {\r\n\t\t\tenabled: formValues.enabled,\r\n\t\t\tnotificationType: formValues.notificationType,\r\n\t\t\tbanner: formValues.displayType,\r\n\t\t\toldTitle: ntificn.title,\r\n\t\t\ttitle: formValues.title,\r\n\t\t\tmessage: formValues.message,\r\n\t\t\toldNotifyThroughDateUtc: ntificn.notifyThroughDateUtc,\r\n\t\t\tnotifyThroughDateUtc: formValues.notifyThroughDateUtc.utc().format(),\r\n\t\t\tdismissable: formValues.dismissable ? true : false\r\n\t\t};\r\n\t\treturn updatedNotificationObj;\r\n\t};\r\n\r\n\tconst handleOnSave = async (formValues) => {\r\n\t\tsetIsSaving(true);\r\n\t\tconst updatedNotification = getUpdatedNotification(formValues);\r\n\t\tconst successful = await notificationsLogic.updateNotification(updatedNotification);\r\n\t\tif (successful) {\r\n\t\t\tnotification['success']({\r\n\t\t\t\tmessage: `${t(`NotificationSaved`)}!`\r\n\t\t\t});\r\n\r\n\t\t\tclearForm();\r\n\t\t\tonSaveCallback();\r\n\t\t} else {\r\n\t\t\tnotification['error']({\r\n\t\t\t\tmessage: t('UpdateNotificationError'),\r\n\t\t\t\tduration: 10\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tsetIsSaving(false);\r\n\t};\r\n\r\n\tconst handleOnCancel = () => {\r\n\t\tsetIsSaving(false);\r\n\t\tclearForm();\r\n\t\tonCloseCallback();\r\n\t};\r\n\r\n\tconst clearForm = () => {\r\n\t\tform.resetFields();\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t {\r\n\t\t\t\t\t//-- Will trigger the form's onFinish event\r\n\t\t\t\t\tform.submit();\r\n\t\t\t\t}}\r\n\t\t\t\tokButtonProps={{ disabled: areFormErrors }}\r\n\t\t\t\tconfirmLoading={isSaving}\r\n\t\t\t\tonCancel={handleOnCancel}\r\n\t\t\t\tcancelText={t('Cancel')}\r\n\t\t\t\tforceRender //-- Needed b/c of using form.setFieldsValue to set the value of the fields\r\n\t\t\t>\r\n\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tif (!value) {\r\n\t\t\t\t\t\t\t\t\t\treturn Promise.reject(new Error(t('NotifyThroughDateRequired')));\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn Promise.resolve();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t]}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tif (!value) {\r\n\t\t\t\t\t\t\t\t\t\treturn Promise.reject(new Error(t('Title is required')));\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\tif (!value.match(title)) {\r\n\t\t\t\t\t\t\t\t\t\treturn Promise.reject(new Error(`1-50 ${t('alpha and some special chars (inclusive)')}`));\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn Promise.resolve();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t]}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tif (!value) {\r\n\t\t\t\t\t\t\t\t\t\treturn Promise.reject(new Error(t('MessageRequired')));\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn Promise.resolve();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t]}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t>\r\n\t);\r\n};\r\n\r\nEditNotificationModal.propTypes = {\r\n\tisVisible: PropTypes.bool.isRequired,\r\n\tonSaveCallback: PropTypes.func.isRequired,\r\n\tonCloseCallback: PropTypes.func.isRequired,\r\n\tntificn: PropTypes.object\r\n};\r\n\r\nexport default EditNotificationModal;\r\n","import { useEffect, useState } from 'react';\r\nimport dayjs from 'dayjs';\r\nimport utc from 'dayjs/plugin/utc';\r\nimport { Row, Col, Spin, Empty, Typography, Space, Divider, Affix, Button, Tooltip, Modal, notification } from 'antd';\r\nimport { PlusOutlined, ExclamationCircleOutlined } from '@ant-design/icons';\r\nimport { useAuthZ } from '../../authZ/useAuthZ';\r\nimport PageContent from '../../structure/PageContent';\r\nimport { useNotificationsLogic } from '../useNotificationsLogic';\r\nimport CreateNotificationModal from './CreateNotificationModal';\r\nimport EditNotificationModal from './EditNotificationModal';\r\nimport { useI18nLocalization } from '../../i18nLocalization/useI18nLocalization';\r\n\r\nconst Notifications = () => {\r\n\tdayjs.extend(utc);\r\n\r\n\tconst authZ = useAuthZ();\r\n\tconst notificationsLogic = useNotificationsLogic();\r\n\r\n\t//-- Used for translations of text\r\n\tconst { t } = useI18nLocalization();\r\n\r\n\t//-- Data source\r\n\tconst [notifications, setNotifications] = useState(null);\r\n\tconst [selectedNotification, setSelectedNotification] = useState(null);\r\n\r\n\tconst [createNotificationModalIsVisible, setCreateNotificationModalIsVisible] = useState(false);\r\n\tconst [editNotificationModalIsVisible, setEditNotificationModalIsVisible] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!notifications) {\r\n\t\t\tgetNotifications();\r\n\t\t}\r\n\t}, []);\r\n\r\n\t//-- Get notifications from the API\r\n\tconst getNotifications = async () => {\r\n\t\tlet nots = await notificationsLogic.getNotifications();\r\n\r\n\t\tnots = _.map(nots, (n) => {\r\n\t\t\tif (n.enabled && dayjs().isSameOrBefore(dayjs(n.notifyThroughDateUtc))) {\r\n\t\t\t\treturn _.extend({}, n, { status: 'active' });\r\n\t\t\t} else {\r\n\t\t\t\treturn _.extend({}, n, { status: 'inactive' });\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tsetNotifications(nots);\r\n\t};\r\n\r\n\tconst deleteNotification = async (title, notifyThroughDateUtc) => {\r\n\t\tconst successful = await notificationsLogic.deleteNotification(title, notifyThroughDateUtc);\r\n\r\n\t\tif (successful) {\r\n\t\t\tnotificationsLogic.refreshCurrentNotifications(); //-- Update displayed notifications\r\n\t\t\tgetNotifications(); //-- Get new list for notifications page\r\n\r\n\t\t\tnotification['success']({\r\n\t\t\t\tmessage: t(`NotificationDeleted`)\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tnotification['error']({\r\n\t\t\t\tmessage: t('DeleteNotificationError'),\r\n\t\t\t\tduration: 10\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\treturn !notifications ? (\r\n\t\t\r\n\t\t\t