@deviceinsight/ng-ui-scale-lib 10.2.2 → 10.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AccessEditModal-kndFZDt-.js → AccessEditModal-C_Ymwezb.js} +17 -17
- package/dist/{AccessEditModal-kndFZDt-.js.map → AccessEditModal-C_Ymwezb.js.map} +1 -1
- package/dist/{BundleManagementContainer-vMlhg6fJ.js → BundleManagementContainer-ChHU9uVM.js} +4 -4
- package/dist/{BundleManagementContainer-vMlhg6fJ.js.map → BundleManagementContainer-ChHU9uVM.js.map} +1 -1
- package/dist/{BundlesContainer-CaC__bAh.js → BundlesContainer-C1myE7uh.js} +40 -40
- package/dist/{BundlesContainer-CaC__bAh.js.map → BundlesContainer-C1myE7uh.js.map} +1 -1
- package/dist/{DatapointImport-Cq8cifAI.js → DatapointImport-Cyt0hdP-.js} +10 -10
- package/dist/DatapointImport-Cyt0hdP-.js.map +1 -0
- package/dist/{FileUploadInput-DSyHVZUT.js → FileUploadInput-BU6ttAuK.js} +2 -2
- package/dist/{FileUploadInput-DSyHVZUT.js.map → FileUploadInput-BU6ttAuK.js.map} +1 -1
- package/dist/{Files-CJ7EHXzr.js → Files-mFzfngqf.js} +3 -3
- package/dist/{Files-CJ7EHXzr.js.map → Files-mFzfngqf.js.map} +1 -1
- package/dist/{GlobalPowerBiReports-PsiWcApU.js → GlobalPowerBiReports-DWXwL_TH.js} +2 -2
- package/dist/{GlobalPowerBiReports-PsiWcApU.js.map → GlobalPowerBiReports-DWXwL_TH.js.map} +1 -1
- package/dist/{JsonSettingWidget-CpZmTuBe.js → JsonSettingWidget-BbYyUBtl.js} +9 -9
- package/dist/JsonSettingWidget-BbYyUBtl.js.map +1 -0
- package/dist/{LicensesEditPage-CwGor2gV.js → LicensesEditPage-wa-EEvag.js} +11 -11
- package/dist/{LicensesEditPage-CwGor2gV.js.map → LicensesEditPage-wa-EEvag.js.map} +1 -1
- package/dist/{LicensesList-DWQlVNdR.js → LicensesList-ihwXeJ0k.js} +2 -2
- package/dist/{LicensesList-DWQlVNdR.js.map → LicensesList-ihwXeJ0k.js.map} +1 -1
- package/dist/{PropertiesEditPage-C4jjCoPp.js → PropertiesEditPage-CsrU5lnR.js} +29 -29
- package/dist/{PropertiesEditPage-C4jjCoPp.js.map → PropertiesEditPage-CsrU5lnR.js.map} +1 -1
- package/dist/{PropertiesList-CBLvLopM.js → PropertiesList-DJ3hDmSL.js} +5 -5
- package/dist/{PropertiesList-CBLvLopM.js.map → PropertiesList-DJ3hDmSL.js.map} +1 -1
- package/dist/{TemplateEditPage-d-3_n4YW.js → TemplateEditPage-DPJ5MJpd.js} +25 -25
- package/dist/{TemplateEditPage-d-3_n4YW.js.map → TemplateEditPage-DPJ5MJpd.js.map} +1 -1
- package/dist/{TemplateTextInput-CQ6XJiql.js → TemplateTextInput-CmCxL3xj.js} +2 -2
- package/dist/{TemplateTextInput-CQ6XJiql.js.map → TemplateTextInput-CmCxL3xj.js.map} +1 -1
- package/dist/{TemplatesListPage-roTvuqft.js → TemplatesListPage-HwJpI4I0.js} +13 -13
- package/dist/{TemplatesListPage-roTvuqft.js.map → TemplatesListPage-HwJpI4I0.js.map} +1 -1
- package/dist/{UserGroupAssignments-DTXRBp_V.js → UserGroupAssignments-2ZrZXU8K.js} +10 -10
- package/dist/{UserGroupAssignments-DTXRBp_V.js.map → UserGroupAssignments-2ZrZXU8K.js.map} +1 -1
- package/dist/{UserGroupTheme-CAHBWb9Q.js → UserGroupTheme-DJut0WZe.js} +5 -5
- package/dist/{UserGroupTheme-CAHBWb9Q.js.map → UserGroupTheme-DJut0WZe.js.map} +1 -1
- package/dist/api.js +23 -23
- package/dist/index.js +567 -562
- package/dist/index.js.map +1 -1
- package/dist/{setTitle-CjnK8p-J.js → setTitle-Dij-z9p9.js} +4547 -4543
- package/dist/setTitle-Dij-z9p9.js.map +1 -0
- package/package.json +12 -11
- package/dist/DatapointImport-Cq8cifAI.js.map +0 -1
- package/dist/JsonSettingWidget-CpZmTuBe.js.map +0 -1
- package/dist/setTitle-CjnK8p-J.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateEditPage-d-3_n4YW.js","sources":["../ng-ui-scale/src/components/template/LocalePicker.tsx","../ng-ui-scale/src/modules/templates/templateForm/FooterButtons.tsx","../ng-ui-scale/src/components/template/VariablePicker.tsx","../ng-ui-scale/src/modules/templates/templateForm/NotificationContent.tsx","../ng-ui-scale/src/modules/templates/templateForm/NotificationInfo.tsx","../ng-ui-scale/src/modules/templates/templateForm/TemplateForm.tsx","../ng-ui-scale/src/modules/templates/useInitialFormData.ts","../ng-ui-scale/src/modules/templates/TemplateEditPage.tsx"],"sourcesContent":["import type {$PropertyType} from 'utility-types';\n\nimport {Button, Modal} from '@deviceinsight/ng-ui-basic-components';\nimport {ReactableWithClientSidePagination} from '@deviceinsight/ng-ui-components';\n\nimport {Trans} from 'i18n';\nimport messages from 'i18n/messages';\n\ntype Props = {\n\tlocales: Array<string>;\n\tonSelect: (language: string) => any;\n\tonCancel: () => any;\n};\n\nconst getColumnDefs = (onSelect: $PropertyType<Props, 'onSelect'>) => [\n\t{\n\t\tname: 'locale',\n\t\tlabel: <Trans i18nKey=\"notificationTemplate.localePicker.localeCode\">Locale code</Trans>,\n\t\tsortable: true,\n\t\trender: ({locale}: Record<string, string>) => (\n\t\t\t<div onClick={() => onSelect(locale)} className=\"clickable\">\n\t\t\t\t{locale}\n\t\t\t</div>\n\t\t),\n\t},\n];\n\nexport const LocalePicker = ({locales, onSelect, onCancel}: Props) => {\n\tconst items = locales.map(locale => ({\n\t\tlocale,\n\t}));\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"di notification-template-modal\"\n\t\t\theader={<Trans i18nKey=\"notificationTemplate.localePicker.title\">Select locale</Trans>}\n\t\t\tcontent={\n\t\t\t\t<ReactableWithClientSidePagination\n\t\t\t\t\tcolumnDefs={getColumnDefs(onSelect)}\n\t\t\t\t\tuniqueItemKey={item => `${item.locale}`}\n\t\t\t\t\titems={items}\n\t\t\t\t\tpaginationSettings={{\n\t\t\t\t\t\tpage: 0,\n\t\t\t\t\t\tsize: items.length,\n\t\t\t\t\t\tsort: {\n\t\t\t\t\t\t\tproperty: 'locale',\n\t\t\t\t\t\t\tdirection: 'ASC',\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tisLoading={false}\n\t\t\t\t\ttableName={'localePicker'}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tfooter={\n\t\t\t\t<Button onClick={onCancel}>\n\t\t\t\t\t<Trans i18nKey={messages.cancel.id}>{messages.cancel.defaultValue}</Trans>\n\t\t\t\t</Button>\n\t\t\t}\n\t\t\twidth={600}\n\t\t/>\n\t);\n};\n","import {Button, ButtonRow} from '@deviceinsight/ng-ui-basic-components';\n\nimport {Trans} from 'i18n';\nimport messages from 'i18n/messages';\n\ntype Props = {\n\tonCancel: () => void;\n\tonSubmit: () => Promise<any> | void;\n\tdisabled: boolean;\n};\n\nexport default function FooterButtons({onCancel, onSubmit, disabled}: Props) {\n\treturn (\n\t\t<ButtonRow dividing>\n\t\t\t<Button primary onClick={onSubmit} disabled={disabled}>\n\t\t\t\t<Trans i18nKey={messages.save.id}>{messages.save.defaultValue}</Trans>\n\t\t\t</Button>\n\t\t\t<Button onClick={onCancel}>\n\t\t\t\t<Trans i18nKey={messages.cancel.id}>{messages.cancel.defaultValue}</Trans>\n\t\t\t</Button>\n\t\t</ButtonRow>\n\t);\n}\n","import type {$PropertyType} from 'utility-types';\n\nimport type {Property} from '@deviceinsight/ng-ui-api-client';\nimport {Button, Modal} from '@deviceinsight/ng-ui-basic-components';\nimport {ReactableWithClientSidePagination} from '@deviceinsight/ng-ui-components';\n\nimport useProperties from 'hooks/useProperties';\nimport {Trans} from 'i18n';\nimport messages from 'i18n/messages';\n\ntype Props = {\n\tonSelect: (variable: string) => any;\n\tonCancel: () => any;\n};\n\nconst generateVariables = (assetProperties: Array<Property>, assetGroupProperties: Array<Property>) => [\n\t'asset.name',\n\t...assetProperties.map(({key}) => `asset.properties.${key}`),\n\t...assetGroupProperties.map(({key}) => `assetGroup.${key}`),\n\t'event.key',\n\t'event.ruleId',\n\t'event.timestamp?datetime',\n];\n\nconst getColumnDefs = (onSelect: $PropertyType<Props, 'onSelect'>) => [\n\t{\n\t\tname: 'variable',\n\t\tlabel: <Trans i18nKey=\"notificationTemplate.variablePicker.variable\">Variable</Trans>,\n\t\trender: (variable: string) => (\n\t\t\t<div onClick={() => onSelect(variable)} className=\"clickable\">\n\t\t\t\t{variable}\n\t\t\t</div>\n\t\t),\n\t},\n];\n\nconst useFilteredProperties = () => {\n\tconst {assetProperties, assetGroupProperties} = useProperties();\n\treturn {\n\t\tassetProperties: assetProperties.filter(property => !property.key.startsWith('_') && property.deletable),\n\t\tassetGroupProperties: assetGroupProperties.filter(\n\t\t\tproperty => !property.key.startsWith('_') && property.deletable,\n\t\t),\n\t};\n};\n\nexport const VariablePicker = ({onSelect, onCancel}: Props) => {\n\tconst {assetProperties, assetGroupProperties} = useFilteredProperties();\n\tconst items = generateVariables(assetProperties, assetGroupProperties);\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"di notification-template-modal\"\n\t\t\theader={<Trans i18nKey=\"notificationTemplate.variablePicker.title\">Select variable</Trans>}\n\t\t\tcontent={\n\t\t\t\t<ReactableWithClientSidePagination\n\t\t\t\t\tcolumnDefs={getColumnDefs(onSelect)}\n\t\t\t\t\tuniqueItemKey={item => item}\n\t\t\t\t\titems={items}\n\t\t\t\t\tpaginationSettings={{\n\t\t\t\t\t\tpage: 0,\n\t\t\t\t\t\tsize: 10,\n\t\t\t\t\t\tsort: {\n\t\t\t\t\t\t\tproperty: 'locale',\n\t\t\t\t\t\t\tdirection: 'ASC',\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tisLoading={false}\n\t\t\t\t\ttableName={'variablePicker'}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tfooter={\n\t\t\t\t<Button onClick={onCancel}>\n\t\t\t\t\t<Trans i18nKey={messages.cancel.id}>{messages.cancel.defaultValue}</Trans>\n\t\t\t\t</Button>\n\t\t\t}\n\t\t\twidth={600}\n\t\t/>\n\t);\n};\n","import type {EditorView} from '@codemirror/view';\nimport {lazy, useRef, useState} from 'react';\nimport {Controller, useFormContext} from 'react-hook-form';\n\nimport {Accordion, AccordionItem, Button, Icon, useConfirm} from '@deviceinsight/ng-ui-basic-components';\n\nimport {VariablePicker} from 'components/template/VariablePicker';\nimport {Trans, useTranslation} from 'i18n';\nimport warningIcon from '../../../assets/svg/icon_warning.svg';\nimport type {LocaleData, TemplateFormData} from '../types';\n\nconst TemplateTextInput = lazy(() => import('components/template/TemplateTextInput'));\n\nconst compareSelectedLocalesDefaultFirst = (locale1: LocaleData, locale2: LocaleData) => {\n\tif (locale1.locale === 'default') {\n\t\treturn -1;\n\t}\n\n\tif (locale2.locale === 'default') {\n\t\treturn 1;\n\t}\n\n\treturn locale1.locale.localeCompare(locale2.locale);\n};\n\nfunction NotificationContent() {\n\tconst confirm = useConfirm();\n\tconst [variablePickerVisible, setVariablePickerVisible] = useState<boolean>(false);\n\tconst [focusedField, setFocusedField] = useState<'subject' | 'message' | 'text'>('message');\n\tconst {\n\t\twatch,\n\t\tcontrol,\n\t\tsetValue,\n\t\tformState: {errors},\n\t} = useFormContext<TemplateFormData>();\n\tconst {t} = useTranslation();\n\tconst subjectEditorRef = useRef<EditorView | null>(null);\n\tconst messageFieldRef = useRef<EditorView | null>(null);\n\n\tconst locales = watch('locales');\n\n\tasync function handleDelete(locale: string) {\n\t\tconst confirmed = await confirm({\n\t\t\ttitle: t('notificationTemplate.form.confirmDeleteTitle', {defaultValue: 'Delete translation'}),\n\t\t\tmessage: t('notificationTemplate.form.confirmDeleteMessage', {\n\t\t\t\tdefaultValue: 'Do you really want to delete this translation?',\n\t\t\t}),\n\t\t});\n\n\t\tif (confirmed) {\n\t\t\tsetValue(\n\t\t\t\t'locales',\n\t\t\t\tlocales.filter(localeData => localeData.locale !== locale),\n\t\t\t\t{shouldDirty: true},\n\t\t\t);\n\t\t}\n\t}\n\n\tfunction handleShowVariablePicker() {\n\t\tsetVariablePickerVisible(true);\n\t}\n\n\tfunction handleSelectVariable(variable: string) {\n\t\tconst editor = focusedField === 'subject' ? subjectEditorRef.current : messageFieldRef.current;\n\t\tif (editor) {\n\t\t\tconst transaction = editor.state.update({\n\t\t\t\tchanges: {\n\t\t\t\t\tfrom: editor.state.selection.main.head,\n\t\t\t\t\tinsert: `\\${${variable}}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\teditor.dispatch(transaction);\n\t\t\tsetVariablePickerVisible(false);\n\t\t} else {\n\t\t\tthrow new Error('Codemirror field not found');\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"notification-content\">\n\t\t\t<h2>{<Trans i18nKey=\"notificationTemplates.form.languages\">Languages</Trans>}</h2>\n\t\t\t<Accordion>\n\t\t\t\t{[...locales].sort(compareSelectedLocalesDefaultFirst).map(localeData => {\n\t\t\t\t\tconst {locale} = localeData;\n\t\t\t\t\tconst textLabel = <Trans i18nKey=\"notificationTemplate.form.message\">Message</Trans>;\n\t\t\t\t\tconst index = locales.indexOf(localeData);\n\t\t\t\t\tconst isError = !!errors.locales?.[index];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<AccordionItem\n\t\t\t\t\t\t\tkey={locale}\n\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t<span className=\"notification-locale-header\">\n\t\t\t\t\t\t\t\t\t{locale}\n\t\t\t\t\t\t\t\t\t{isError && <img src={warningIcon} alt=\"\" />}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttools={[\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tnaked\n\t\t\t\t\t\t\t\t\tdisabled={locale === 'default'}\n\t\t\t\t\t\t\t\t\tonClick={() => handleDelete(locale)}\n\t\t\t\t\t\t\t\t\tdata-testid=\"delete-locale-button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon del large />\n\t\t\t\t\t\t\t\t</Button>,\n\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"notification-content-fields\">\n\t\t\t\t\t\t\t\t<div className=\"notification-content-fields-wrapper\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<Controller\n\t\t\t\t\t\t\t\t\t\t\tname={`locales.${index}.subject`}\n\t\t\t\t\t\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\t\t\t\t\t\trules={{\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\trender={({field: {value, onChange}, fieldState: {error}}) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<TemplateTextInput\n\t\t\t\t\t\t\t\t\t\t\t\t\tonFocus={() => setFocusedField('subject')}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\terror={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\terror\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('notificationTemplates.form.subjectRequired', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Please input subject',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"notificationTemplate.form.subject\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSubject\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\t\t\t\t\t\trefField={field => (subjectEditorRef.current = field)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tmarginTop: 10,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Controller\n\t\t\t\t\t\t\t\t\t\t\tname={`locales.${locales.indexOf(localeData)}.text`}\n\t\t\t\t\t\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\t\t\t\t\t\trules={{\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\trender={({field: {value, onChange}, fieldState: {error}}) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<TemplateTextInput\n\t\t\t\t\t\t\t\t\t\t\t\t\tonFocus={() => setFocusedField('text')}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\terror={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\terror\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('notificationTemplates.form.messageRequired', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Please input message',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={textLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\trefField={field => (messageFieldRef.current = field)}\n\t\t\t\t\t\t\t\t\t\t\t\t\trenderAs=\"textarea\"\n\t\t\t\t\t\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"notification-content-variables-wrapper\">\n\t\t\t\t\t\t\t\t\t<Button naked onClick={handleShowVariablePicker} data-testid=\"add-button\">\n\t\t\t\t\t\t\t\t\t\t<Icon add />\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"notificationTemplate.form.addVariables\">\n\t\t\t\t\t\t\t\t\t\t\t\tAdd variables...\n\t\t\t\t\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</AccordionItem>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</Accordion>\n\n\t\t\t{variablePickerVisible && (\n\t\t\t\t<VariablePicker onSelect={handleSelectVariable} onCancel={() => setVariablePickerVisible(false)} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport default NotificationContent;\n","import {Controller, useFormContext} from 'react-hook-form';\n\nimport FormRow from 'components/inputs/formRow/FormRow';\nimport TextInput from 'components/inputs/textInput/TextInput';\nimport {Trans, useTranslation} from 'i18n';\n\nfunction NotificationInfo() {\n\tconst {t} = useTranslation();\n\tconst {control} = useFormContext();\n\n\treturn (\n\t\t<FormRow>\n\t\t\t<Controller\n\t\t\t\tcontrol={control}\n\t\t\t\tname=\"displayName\"\n\t\t\t\trules={{\n\t\t\t\t\trequired: true,\n\t\t\t\t}}\n\t\t\t\trender={({field, fieldState: {error}}) => (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\terror={\n\t\t\t\t\t\t\terror\n\t\t\t\t\t\t\t\t? t('notificationTemplates.form.nameRequired', {\n\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Please enter a name',\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\trequired\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"notificationTemplate.form.name\">Name</Trans>}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<Controller\n\t\t\t\tcontrol={control}\n\t\t\t\tname=\"name\"\n\t\t\t\trender={({field}) => (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"notificationTemplate.form.technicalName\">Technical Name</Trans>}\n\t\t\t\t\t\tdisabled\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t</FormRow>\n\t);\n}\n\nexport default NotificationInfo;\n","import {useContext, useState} from 'react';\nimport {FormProvider, useForm} from 'react-hook-form';\nimport {Prompt} from 'react-router-dom';\n\nimport {Button, Icon} from '@deviceinsight/ng-ui-basic-components';\nimport {nanoid10} from '@deviceinsight/ng-ui-components';\n\nimport {LocalePicker} from 'components/template/LocalePicker';\nimport {GlobalResourcesContext} from 'contexts/globalResources/GlobalResourcesContext';\nimport {Trans} from 'i18n';\nimport type {TemplateFormData} from '../types';\nimport AccessEditModal from './AccessEditModal';\nimport FooterButtons from './FooterButtons';\nimport NotificationContent from './NotificationContent';\nimport NotificationInfo from './NotificationInfo';\nimport './templateForm.scss';\n\ntype Props = {\n\tonCancel: () => void;\n\tonSubmit: (formValues: TemplateFormData) => Promise<void>;\n\teditedTemplateData: TemplateFormData | undefined;\n};\n\nfunction createEmptyTemplateFormData(): TemplateFormData {\n\treturn {\n\t\tname: `__${nanoid10()}`,\n\t\tlocales: [\n\t\t\t{\n\t\t\t\tlocale: 'default',\n\t\t\t\tsubject: '',\n\t\t\t\ttext: '',\n\t\t\t\tid: 0,\n\t\t\t},\n\t\t],\n\t\tdisplayName: '',\n\t};\n}\n\nexport default function TemplateForm({onCancel, onSubmit, editedTemplateData}: Props) {\n\tconst {locales: availableLocales} = useContext(GlobalResourcesContext);\n\tconst formContext = useForm<TemplateFormData>({\n\t\tdefaultValues: editedTemplateData ?? createEmptyTemplateFormData(),\n\t});\n\tconst {\n\t\thandleSubmit,\n\t\tsetValue,\n\t\twatch,\n\t\tformState: {isSubmitting, isDirty},\n\t} = formContext;\n\tconst [accessPickerVisible, setAccessPickerVisible] = useState<boolean>(false);\n\tconst [localePickerVisible, setLocalPickerVisible] = useState<boolean>(false);\n\tconst formLocales = watch('locales');\n\n\tfunction submit(): Promise<void> {\n\t\treturn handleSubmit(onSubmit, errors => {\n\t\t\tconsole.warn('Validation error', errors);\n\t\t})();\n\t}\n\n\tasync function handleAccountGroupsSelect(accountGroupIdsWithAccess: number[]) {\n\t\tsetAccessPickerVisible(false);\n\t\tsetValue('accountGroupsWithAccess', accountGroupIdsWithAccess);\n\t\tawait submit();\n\t}\n\n\tfunction handleSelectLocale(locale: string) {\n\t\tsetLocalPickerVisible(false);\n\t\tsetValue('locales', [...formLocales, {locale, id: 0, text: '', subject: ''}], {shouldDirty: true});\n\t}\n\n\tfunction getUnusedLocales() {\n\t\treturn availableLocales.filter(locale => !formLocales.some(localeData => localeData.locale === locale));\n\t}\n\n\treturn (\n\t\t<FormProvider {...formContext}>\n\t\t\t<div className=\"template-form\">\n\t\t\t\t<NotificationInfo />\n\t\t\t\t<NotificationContent />\n\t\t\t\t<div className=\"di button-row add-locale\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={() => setLocalPickerVisible(true)}\n\t\t\t\t\t\tdata-testid=\"add-locale-button\"\n\t\t\t\t\t\tdisabled={!getUnusedLocales().length}\n\t\t\t\t\t\tnaked\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon add />\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t<Trans i18nKey=\"notificationTemplate.form.addLocale\">Add locale...</Trans>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t<FooterButtons\n\t\t\t\t\tonCancel={onCancel}\n\t\t\t\t\tonSubmit={editedTemplateData ? submit : () => setAccessPickerVisible(true)}\n\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t/>\n\t\t\t\t{localePickerVisible && (\n\t\t\t\t\t<LocalePicker\n\t\t\t\t\t\tlocales={getUnusedLocales()}\n\t\t\t\t\t\tonSelect={handleSelectLocale}\n\t\t\t\t\t\tonCancel={() => setLocalPickerVisible(false)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{accessPickerVisible && (\n\t\t\t\t\t<AccessEditModal\n\t\t\t\t\t\tonSave={handleAccountGroupsSelect}\n\t\t\t\t\t\tonCancel={() => setAccessPickerVisible(false)}\n\t\t\t\t\t\tloading={isSubmitting}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<Prompt message=\"\" when={isDirty && !isSubmitting} />\n\t\t\t</div>\n\t\t</FormProvider>\n\t);\n}\n","import type {AxiosError} from 'axios';\nimport {useEffect, useState} from 'react';\nimport {useParams} from 'react-router-dom';\n\nimport {fetchEmailTemplateById, fetchEmailTemplates} from '@deviceinsight/ng-ui-api-client';\n\nimport type {LocaleData, TemplateFormData} from './types';\n\ntype InitialFormDataContainer = {\n\tinitialFormData: TemplateFormData | undefined;\n\terror: AxiosError | undefined;\n\tloading: boolean;\n};\n\ntype UrlParams = {\n\ttemplateId: string;\n};\n\nexport default function useInitialFormData(): InitialFormDataContainer {\n\tconst {templateId} = useParams<UrlParams>();\n\tconst [initialData, setInitialData] = useState<TemplateFormData | undefined>(undefined);\n\tconst [error, setError] = useState<AxiosError | undefined>(undefined);\n\tconst [loading, setLoading] = useState<boolean>(true);\n\n\tuseEffect(() => {\n\t\tif (!templateId || templateId === 'create') {\n\t\t\tsetLoading(false);\n\t\t\treturn;\n\t\t}\n\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tconst defaultTemplate = await fetchEmailTemplateById(parseInt(templateId));\n\t\t\t\tconst fetchedTemplates = await fetchEmailTemplates({\n\t\t\t\t\tname: defaultTemplate.name,\n\t\t\t\t\tpage: 0,\n\t\t\t\t\tsize: 2000,\n\t\t\t\t});\n\t\t\t\tconst allTemplateVersions = fetchedTemplates // filter must be performed because the backend returns all templates starting with the given name\n\t\t\t\t\t.filter(template => template.name === defaultTemplate.name);\n\n\t\t\t\tconst locales = allTemplateVersions.map<LocaleData>(template => ({\n\t\t\t\t\tid: template.id,\n\t\t\t\t\tlocale: template.locale ?? 'default',\n\t\t\t\t\ttext: template.text,\n\t\t\t\t\tsubject: template.subject ?? '',\n\t\t\t\t}));\n\n\t\t\t\tsetInitialData({\n\t\t\t\t\taccountGroupsWithAccess: undefined,\n\t\t\t\t\tname: defaultTemplate.name,\n\t\t\t\t\tdisplayName: defaultTemplate.displayName,\n\t\t\t\t\tlocales,\n\t\t\t\t});\n\t\t\t} catch (e: any) {\n\t\t\t\tsetError(e);\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t})();\n\t}, [templateId]);\n\n\treturn {\n\t\tloading,\n\t\terror,\n\t\tinitialFormData: initialData,\n\t};\n}\n","import {useContext, useEffect} from 'react';\nimport {useHistory, useLocation} from 'react-router-dom';\n\nimport {\n\tcreateEmailTemplate,\n\tdeleteEmailTemplate,\n\ttype NotificationTemplate,\n\ttype NotificationTemplateNew,\n\tupdateEmailTemplate,\n} from '@deviceinsight/ng-ui-api-client';\nimport {SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\nimport {ContentHeader, messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport PageNotFound from 'components/page/misc/PageNotFound';\nimport {ContextInfoContext} from 'contexts/contextInfo/ContextInfoContext';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {Trans, useTranslation} from 'i18n';\nimport TemplateForm from './templateForm/TemplateForm';\nimport type {LocaleData, TemplateFormData} from './types';\nimport useInitialFormData from './useInitialFormData';\n\nfunction addEmailTemplates(templates: NotificationTemplateNew[]) {\n\treturn templates.map(template => createEmailTemplate(template));\n}\n\nfunction updateEmailTemplates(templates: NotificationTemplate[]) {\n\treturn templates.map(template => updateEmailTemplate(template));\n}\n\nfunction deleteEmailTemplates(templates: number[]) {\n\treturn templates.map(id => deleteEmailTemplate(id));\n}\n\nfunction transformLocaleFormDataToNotificationTemplateNew(\n\tlocale: string,\n\ttemplateFormData: TemplateFormData,\n): NotificationTemplateNew {\n\tconst {name, displayName, accountGroupsWithAccess} = templateFormData;\n\tconst localeData = templateFormData.locales.find(localeData => localeData.locale === locale);\n\tif (!localeData) {\n\t\tthrow new Error(`Locale ${locale} not found`);\n\t}\n\tconst {subject, text} = localeData;\n\treturn {\n\t\taccountGroupsWithAccess,\n\t\tname,\n\t\tdisplayName,\n\t\ttenant: UIConfiguration.getTenant(),\n\t\tlocale: locale === 'default' ? null : locale,\n\t\tsubject,\n\t\ttext,\n\t\tscope: 'CONDITION_MONITORING',\n\t};\n}\n\nfunction transformLocaleFormDataToNotificationTemplate(id: number, locale: string, formValues: TemplateFormData) {\n\treturn {\n\t\tid,\n\t\t...transformLocaleFormDataToNotificationTemplateNew(locale, formValues),\n\t};\n}\n\nconst isNotificationChanged = (prevNotification: LocaleData, currentNotification: LocaleData) =>\n\tprevNotification.subject !== currentNotification.subject || prevNotification.text !== currentNotification.text;\n\nexport default function TemplateEditPage() {\n\tconst {t} = useTranslation();\n\tconst {setContextInfo} = useContext(ContextInfoContext);\n\tconst history = useHistory();\n\tconst {pathname} = useLocation();\n\tconst {initialFormData, error, loading} = useInitialFormData();\n\n\tasync function saveChanges(toAdd: NotificationTemplateNew[], toUpdate: NotificationTemplate[], toRemove: number[]) {\n\t\tconst addPromises = addEmailTemplates(toAdd);\n\t\tconst updatePromises = updateEmailTemplates(toUpdate);\n\t\tconst removePromises = deleteEmailTemplates(toRemove);\n\t\tawait Promise.all([...addPromises, ...updatePromises, ...removePromises]);\n\t}\n\n\tfunction createTemplates(formValues: TemplateFormData) {\n\t\tconst {locales} = formValues;\n\t\treturn saveChanges(\n\t\t\tlocales.map(({locale}) => transformLocaleFormDataToNotificationTemplateNew(locale, formValues)),\n\t\t\t[],\n\t\t\t[],\n\t\t);\n\t}\n\n\tfunction updateTemplates(formValues: TemplateFormData) {\n\t\tconst {locales: newLocales} = formValues;\n\t\tconst previousName = initialFormData?.displayName;\n\t\tconst previousLocales = initialFormData?.locales ?? [];\n\t\tconst toRemove = previousLocales.filter(\n\t\t\t({locale}) => !newLocales.some(localeData => localeData.locale === locale),\n\t\t);\n\t\tconst toAdd = newLocales.filter(\n\t\t\t({locale}) => !previousLocales.some(localeData => localeData.locale === locale),\n\t\t);\n\t\tconst toUpdate =\n\t\t\tpreviousName === formValues.displayName\n\t\t\t\t? newLocales.filter(newLocaleData => {\n\t\t\t\t\t\tconst previousLocaleData = previousLocales.find(\n\t\t\t\t\t\t\tlocaleData => localeData.locale === newLocaleData.locale,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn previousLocaleData && isNotificationChanged(previousLocaleData, newLocaleData);\n\t\t\t\t\t})\n\t\t\t\t: newLocales.filter(newLocaleData =>\n\t\t\t\t\t\tpreviousLocales.some(previousLocaleData => previousLocaleData.locale === newLocaleData.locale),\n\t\t\t\t\t);\n\t\treturn saveChanges(\n\t\t\ttoAdd.map(({locale}) => transformLocaleFormDataToNotificationTemplateNew(locale, formValues)),\n\t\t\ttoUpdate.map(({locale, id}) => transformLocaleFormDataToNotificationTemplate(id, locale, formValues)),\n\t\t\ttoRemove.map(({id}) => id),\n\t\t);\n\t}\n\n\tasync function handleSubmit(formData: TemplateFormData) {\n\t\ttry {\n\t\t\tif (initialFormData) {\n\t\t\t\tawait updateTemplates(formData);\n\t\t\t} else {\n\t\t\t\tawait createTemplates(formData);\n\t\t\t}\n\n\t\t\tgoToTemplatesList();\n\t\t} catch (e: any) {\n\t\t\tconsole.error('An error occured while trying to submit the template(s): ', e);\n\n\t\t\tif (e.response && e.response.status === 400) {\n\t\t\t\tmessageBoxError(\n\t\t\t\t\t<Trans i18nKey=\"notificationTemplates.form.nameOccupied\">\n\t\t\t\t\t\tTemplate with this name already exists\n\t\t\t\t\t</Trans>,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmessageBoxError(<Trans i18nKey=\"notificationTemplates.form.unknownError\">Unknown error occured</Trans>);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction goToTemplatesList() {\n\t\thistory.push('/portaladmin/templates');\n\t}\n\n\tuseEffect(() => {\n\t\tsetContextInfo({\n\t\t\ttype: 'string',\n\t\t\tvalue: initialFormData?.displayName || initialFormData?.name || '',\n\t\t\tpathname,\n\t\t});\n\t}, [initialFormData, pathname, setContextInfo]);\n\n\tuseEffect(() => {\n\t\treturn () => setContextInfo();\n\t}, [setContextInfo]);\n\n\tuseEffect(() => {\n\t\tif (error) {\n\t\t\tconsole.error(error);\n\t\t\tmessageBoxError(\n\t\t\t\t<Trans i18nKey=\"notificationTemplates.form.fetchFailed\">\n\t\t\t\t\tAn error occurred while trying to fetch the template(s)\n\t\t\t\t</Trans>,\n\t\t\t);\n\t\t}\n\t}, [error]);\n\n\tif (error) {\n\t\treturn <PageNotFound />;\n\t}\n\n\treturn (\n\t\t<SpinnerContainer show={loading}>\n\t\t\t<ContentHeader\n\t\t\t\tparentPageLink\n\t\t\t\tsubPagePathPrefixArray={['/email', '/sms']}\n\t\t\t\ttitle={\n\t\t\t\t\tinitialFormData\n\t\t\t\t\t\t? t('notificationTemplate.form.editTemplate', {\n\t\t\t\t\t\t\t\tdefaultValue: 'Edit Template',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: t('notificationTemplate.form.createTemplate', {\n\t\t\t\t\t\t\t\tdefaultValue: 'Create Template',\n\t\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{!loading && (\n\t\t\t\t<TemplateForm\n\t\t\t\t\tonCancel={goToTemplatesList}\n\t\t\t\t\tonSubmit={handleSubmit}\n\t\t\t\t\teditedTemplateData={initialFormData}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</SpinnerContainer>\n\t);\n}\n"],"names":["getColumnDefs","onSelect","jsx","Trans","locale","LocalePicker","locales","onCancel","items","Modal","ReactableWithClientSidePagination","item","Button","messages","FooterButtons","onSubmit","disabled","jsxs","ButtonRow","generateVariables","assetProperties","assetGroupProperties","key","variable","useFilteredProperties","useProperties","property","VariablePicker","TemplateTextInput","lazy","compareSelectedLocalesDefaultFirst","locale1","locale2","NotificationContent","confirm","useConfirm","variablePickerVisible","setVariablePickerVisible","useState","focusedField","setFocusedField","watch","control","setValue","errors","useFormContext","t","useTranslation","subjectEditorRef","useRef","messageFieldRef","handleDelete","localeData","handleShowVariablePicker","handleSelectVariable","editor","transaction","Accordion","textLabel","index","isError","AccordionItem","warningIcon","Icon","Controller","value","onChange","error","field","NotificationInfo","FormRow","TextInput","createEmptyTemplateFormData","nanoid10","TemplateForm","editedTemplateData","availableLocales","useContext","GlobalResourcesContext","formContext","useForm","handleSubmit","isSubmitting","isDirty","accessPickerVisible","setAccessPickerVisible","localePickerVisible","setLocalPickerVisible","formLocales","submit","handleAccountGroupsSelect","accountGroupIdsWithAccess","handleSelectLocale","getUnusedLocales","FormProvider","AccessEditModal","Prompt","useInitialFormData","templateId","useParams","initialData","setInitialData","setError","loading","setLoading","useEffect","defaultTemplate","fetchEmailTemplateById","fetchEmailTemplates","template","e","addEmailTemplates","templates","createEmailTemplate","updateEmailTemplates","updateEmailTemplate","deleteEmailTemplates","id","deleteEmailTemplate","transformLocaleFormDataToNotificationTemplateNew","templateFormData","name","displayName","accountGroupsWithAccess","subject","text","UIConfiguration","transformLocaleFormDataToNotificationTemplate","formValues","isNotificationChanged","prevNotification","currentNotification","TemplateEditPage","setContextInfo","ContextInfoContext","history","useHistory","pathname","useLocation","initialFormData","saveChanges","toAdd","toUpdate","toRemove","addPromises","updatePromises","removePromises","createTemplates","updateTemplates","newLocales","previousName","previousLocales","newLocaleData","previousLocaleData","formData","goToTemplatesList","messageBoxError","PageNotFound","SpinnerContainer","ContentHeader"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TemplateEditPage-DPJ5MJpd.js","sources":["../ng-ui-scale/src/components/template/LocalePicker.tsx","../ng-ui-scale/src/modules/templates/templateForm/FooterButtons.tsx","../ng-ui-scale/src/components/template/VariablePicker.tsx","../ng-ui-scale/src/modules/templates/templateForm/NotificationContent.tsx","../ng-ui-scale/src/modules/templates/templateForm/NotificationInfo.tsx","../ng-ui-scale/src/modules/templates/templateForm/TemplateForm.tsx","../ng-ui-scale/src/modules/templates/useInitialFormData.ts","../ng-ui-scale/src/modules/templates/TemplateEditPage.tsx"],"sourcesContent":["import type {$PropertyType} from 'utility-types';\n\nimport {Button, Modal} from '@deviceinsight/ng-ui-basic-components';\nimport {ReactableWithClientSidePagination} from '@deviceinsight/ng-ui-components';\n\nimport {Trans} from 'i18n';\nimport messages from 'i18n/messages';\n\ntype Props = {\n\tlocales: Array<string>;\n\tonSelect: (language: string) => any;\n\tonCancel: () => any;\n};\n\nconst getColumnDefs = (onSelect: $PropertyType<Props, 'onSelect'>) => [\n\t{\n\t\tname: 'locale',\n\t\tlabel: <Trans i18nKey=\"notificationTemplate.localePicker.localeCode\">Locale code</Trans>,\n\t\tsortable: true,\n\t\trender: ({locale}: Record<string, string>) => (\n\t\t\t<div onClick={() => onSelect(locale)} className=\"clickable\">\n\t\t\t\t{locale}\n\t\t\t</div>\n\t\t),\n\t},\n];\n\nexport const LocalePicker = ({locales, onSelect, onCancel}: Props) => {\n\tconst items = locales.map(locale => ({\n\t\tlocale,\n\t}));\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"di notification-template-modal\"\n\t\t\theader={<Trans i18nKey=\"notificationTemplate.localePicker.title\">Select locale</Trans>}\n\t\t\tcontent={\n\t\t\t\t<ReactableWithClientSidePagination\n\t\t\t\t\tcolumnDefs={getColumnDefs(onSelect)}\n\t\t\t\t\tuniqueItemKey={item => `${item.locale}`}\n\t\t\t\t\titems={items}\n\t\t\t\t\tpaginationSettings={{\n\t\t\t\t\t\tpage: 0,\n\t\t\t\t\t\tsize: items.length,\n\t\t\t\t\t\tsort: {\n\t\t\t\t\t\t\tproperty: 'locale',\n\t\t\t\t\t\t\tdirection: 'ASC',\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tisLoading={false}\n\t\t\t\t\ttableName={'localePicker'}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tfooter={\n\t\t\t\t<Button onClick={onCancel}>\n\t\t\t\t\t<Trans i18nKey={messages.cancel.id}>{messages.cancel.defaultValue}</Trans>\n\t\t\t\t</Button>\n\t\t\t}\n\t\t\twidth={600}\n\t\t/>\n\t);\n};\n","import {Button, ButtonRow} from '@deviceinsight/ng-ui-basic-components';\n\nimport {Trans} from 'i18n';\nimport messages from 'i18n/messages';\n\ntype Props = {\n\tonCancel: () => void;\n\tonSubmit: () => Promise<any> | void;\n\tdisabled: boolean;\n};\n\nexport default function FooterButtons({onCancel, onSubmit, disabled}: Props) {\n\treturn (\n\t\t<ButtonRow dividing>\n\t\t\t<Button primary onClick={onSubmit} disabled={disabled}>\n\t\t\t\t<Trans i18nKey={messages.save.id}>{messages.save.defaultValue}</Trans>\n\t\t\t</Button>\n\t\t\t<Button onClick={onCancel}>\n\t\t\t\t<Trans i18nKey={messages.cancel.id}>{messages.cancel.defaultValue}</Trans>\n\t\t\t</Button>\n\t\t</ButtonRow>\n\t);\n}\n","import type {$PropertyType} from 'utility-types';\n\nimport type {Property} from '@deviceinsight/ng-ui-api-client';\nimport {Button, Modal} from '@deviceinsight/ng-ui-basic-components';\nimport {ReactableWithClientSidePagination} from '@deviceinsight/ng-ui-components';\n\nimport useProperties from 'hooks/useProperties';\nimport {Trans} from 'i18n';\nimport messages from 'i18n/messages';\n\ntype Props = {\n\tonSelect: (variable: string) => any;\n\tonCancel: () => any;\n};\n\nconst generateVariables = (assetProperties: Array<Property>, assetGroupProperties: Array<Property>) => [\n\t'asset.name',\n\t...assetProperties.map(({key}) => `asset.properties.${key}`),\n\t...assetGroupProperties.map(({key}) => `assetGroup.${key}`),\n\t'event.key',\n\t'event.ruleId',\n\t'event.timestamp?datetime',\n];\n\nconst getColumnDefs = (onSelect: $PropertyType<Props, 'onSelect'>) => [\n\t{\n\t\tname: 'variable',\n\t\tlabel: <Trans i18nKey=\"notificationTemplate.variablePicker.variable\">Variable</Trans>,\n\t\trender: (variable: string) => (\n\t\t\t<div onClick={() => onSelect(variable)} className=\"clickable\">\n\t\t\t\t{variable}\n\t\t\t</div>\n\t\t),\n\t},\n];\n\nconst useFilteredProperties = () => {\n\tconst {assetProperties, assetGroupProperties} = useProperties();\n\treturn {\n\t\tassetProperties: assetProperties.filter(property => !property.key.startsWith('_') && property.deletable),\n\t\tassetGroupProperties: assetGroupProperties.filter(\n\t\t\tproperty => !property.key.startsWith('_') && property.deletable,\n\t\t),\n\t};\n};\n\nexport const VariablePicker = ({onSelect, onCancel}: Props) => {\n\tconst {assetProperties, assetGroupProperties} = useFilteredProperties();\n\tconst items = generateVariables(assetProperties, assetGroupProperties);\n\treturn (\n\t\t<Modal\n\t\t\tclassName=\"di notification-template-modal\"\n\t\t\theader={<Trans i18nKey=\"notificationTemplate.variablePicker.title\">Select variable</Trans>}\n\t\t\tcontent={\n\t\t\t\t<ReactableWithClientSidePagination\n\t\t\t\t\tcolumnDefs={getColumnDefs(onSelect)}\n\t\t\t\t\tuniqueItemKey={item => item}\n\t\t\t\t\titems={items}\n\t\t\t\t\tpaginationSettings={{\n\t\t\t\t\t\tpage: 0,\n\t\t\t\t\t\tsize: 10,\n\t\t\t\t\t\tsort: {\n\t\t\t\t\t\t\tproperty: 'locale',\n\t\t\t\t\t\t\tdirection: 'ASC',\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tisLoading={false}\n\t\t\t\t\ttableName={'variablePicker'}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tfooter={\n\t\t\t\t<Button onClick={onCancel}>\n\t\t\t\t\t<Trans i18nKey={messages.cancel.id}>{messages.cancel.defaultValue}</Trans>\n\t\t\t\t</Button>\n\t\t\t}\n\t\t\twidth={600}\n\t\t/>\n\t);\n};\n","import type {EditorView} from '@codemirror/view';\nimport {lazy, useRef, useState} from 'react';\nimport {Controller, useFormContext} from 'react-hook-form';\n\nimport {Accordion, AccordionItem, Button, Icon, useConfirm} from '@deviceinsight/ng-ui-basic-components';\n\nimport {VariablePicker} from 'components/template/VariablePicker';\nimport {Trans, useTranslation} from 'i18n';\nimport warningIcon from '../../../assets/svg/icon_warning.svg';\nimport type {LocaleData, TemplateFormData} from '../types';\n\nconst TemplateTextInput = lazy(() => import('components/template/TemplateTextInput'));\n\nconst compareSelectedLocalesDefaultFirst = (locale1: LocaleData, locale2: LocaleData) => {\n\tif (locale1.locale === 'default') {\n\t\treturn -1;\n\t}\n\n\tif (locale2.locale === 'default') {\n\t\treturn 1;\n\t}\n\n\treturn locale1.locale.localeCompare(locale2.locale);\n};\n\nfunction NotificationContent() {\n\tconst confirm = useConfirm();\n\tconst [variablePickerVisible, setVariablePickerVisible] = useState<boolean>(false);\n\tconst [focusedField, setFocusedField] = useState<'subject' | 'message' | 'text'>('message');\n\tconst {\n\t\twatch,\n\t\tcontrol,\n\t\tsetValue,\n\t\tformState: {errors},\n\t} = useFormContext<TemplateFormData>();\n\tconst {t} = useTranslation();\n\tconst subjectEditorRef = useRef<EditorView | null>(null);\n\tconst messageFieldRef = useRef<EditorView | null>(null);\n\n\tconst locales = watch('locales');\n\n\tasync function handleDelete(locale: string) {\n\t\tconst confirmed = await confirm({\n\t\t\ttitle: t('notificationTemplate.form.confirmDeleteTitle', {defaultValue: 'Delete translation'}),\n\t\t\tmessage: t('notificationTemplate.form.confirmDeleteMessage', {\n\t\t\t\tdefaultValue: 'Do you really want to delete this translation?',\n\t\t\t}),\n\t\t});\n\n\t\tif (confirmed) {\n\t\t\tsetValue(\n\t\t\t\t'locales',\n\t\t\t\tlocales.filter(localeData => localeData.locale !== locale),\n\t\t\t\t{shouldDirty: true},\n\t\t\t);\n\t\t}\n\t}\n\n\tfunction handleShowVariablePicker() {\n\t\tsetVariablePickerVisible(true);\n\t}\n\n\tfunction handleSelectVariable(variable: string) {\n\t\tconst editor = focusedField === 'subject' ? subjectEditorRef.current : messageFieldRef.current;\n\t\tif (editor) {\n\t\t\tconst transaction = editor.state.update({\n\t\t\t\tchanges: {\n\t\t\t\t\tfrom: editor.state.selection.main.head,\n\t\t\t\t\tinsert: `\\${${variable}}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\teditor.dispatch(transaction);\n\t\t\tsetVariablePickerVisible(false);\n\t\t} else {\n\t\t\tthrow new Error('Codemirror field not found');\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"notification-content\">\n\t\t\t<h2>{<Trans i18nKey=\"notificationTemplates.form.languages\">Languages</Trans>}</h2>\n\t\t\t<Accordion>\n\t\t\t\t{[...locales].sort(compareSelectedLocalesDefaultFirst).map(localeData => {\n\t\t\t\t\tconst {locale} = localeData;\n\t\t\t\t\tconst textLabel = <Trans i18nKey=\"notificationTemplate.form.message\">Message</Trans>;\n\t\t\t\t\tconst index = locales.indexOf(localeData);\n\t\t\t\t\tconst isError = !!errors.locales?.[index];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<AccordionItem\n\t\t\t\t\t\t\tkey={locale}\n\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t<span className=\"notification-locale-header\">\n\t\t\t\t\t\t\t\t\t{locale}\n\t\t\t\t\t\t\t\t\t{isError && <img src={warningIcon} alt=\"\" />}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttools={[\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tnaked\n\t\t\t\t\t\t\t\t\tdisabled={locale === 'default'}\n\t\t\t\t\t\t\t\t\tonClick={() => handleDelete(locale)}\n\t\t\t\t\t\t\t\t\tdata-testid=\"delete-locale-button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon del large />\n\t\t\t\t\t\t\t\t</Button>,\n\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"notification-content-fields\">\n\t\t\t\t\t\t\t\t<div className=\"notification-content-fields-wrapper\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<Controller\n\t\t\t\t\t\t\t\t\t\t\tname={`locales.${index}.subject`}\n\t\t\t\t\t\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\t\t\t\t\t\trules={{\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\trender={({field: {value, onChange}, fieldState: {error}}) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<TemplateTextInput\n\t\t\t\t\t\t\t\t\t\t\t\t\tonFocus={() => setFocusedField('subject')}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\terror={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\terror\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('notificationTemplates.form.subjectRequired', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Please input subject',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"notificationTemplate.form.subject\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSubject\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\t\t\t\t\t\trefField={field => (subjectEditorRef.current = field)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tmarginTop: 10,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Controller\n\t\t\t\t\t\t\t\t\t\t\tname={`locales.${locales.indexOf(localeData)}.text`}\n\t\t\t\t\t\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\t\t\t\t\t\trules={{\n\t\t\t\t\t\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\trender={({field: {value, onChange}, fieldState: {error}}) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<TemplateTextInput\n\t\t\t\t\t\t\t\t\t\t\t\t\tonFocus={() => setFocusedField('text')}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\terror={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\terror\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t('notificationTemplates.form.messageRequired', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Please input message',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={textLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\trefField={field => (messageFieldRef.current = field)}\n\t\t\t\t\t\t\t\t\t\t\t\t\trenderAs=\"textarea\"\n\t\t\t\t\t\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"notification-content-variables-wrapper\">\n\t\t\t\t\t\t\t\t\t<Button naked onClick={handleShowVariablePicker} data-testid=\"add-button\">\n\t\t\t\t\t\t\t\t\t\t<Icon add />\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"notificationTemplate.form.addVariables\">\n\t\t\t\t\t\t\t\t\t\t\t\tAdd variables...\n\t\t\t\t\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</AccordionItem>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</Accordion>\n\n\t\t\t{variablePickerVisible && (\n\t\t\t\t<VariablePicker onSelect={handleSelectVariable} onCancel={() => setVariablePickerVisible(false)} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport default NotificationContent;\n","import {Controller, useFormContext} from 'react-hook-form';\n\nimport FormRow from 'components/inputs/formRow/FormRow';\nimport TextInput from 'components/inputs/textInput/TextInput';\nimport {Trans, useTranslation} from 'i18n';\n\nfunction NotificationInfo() {\n\tconst {t} = useTranslation();\n\tconst {control} = useFormContext();\n\n\treturn (\n\t\t<FormRow>\n\t\t\t<Controller\n\t\t\t\tcontrol={control}\n\t\t\t\tname=\"displayName\"\n\t\t\t\trules={{\n\t\t\t\t\trequired: true,\n\t\t\t\t}}\n\t\t\t\trender={({field, fieldState: {error}}) => (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\terror={\n\t\t\t\t\t\t\terror\n\t\t\t\t\t\t\t\t? t('notificationTemplates.form.nameRequired', {\n\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Please enter a name',\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\trequired\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"notificationTemplate.form.name\">Name</Trans>}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<Controller\n\t\t\t\tcontrol={control}\n\t\t\t\tname=\"name\"\n\t\t\t\trender={({field}) => (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"notificationTemplate.form.technicalName\">Technical Name</Trans>}\n\t\t\t\t\t\tdisabled\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t</FormRow>\n\t);\n}\n\nexport default NotificationInfo;\n","import {useContext, useState} from 'react';\nimport {FormProvider, useForm} from 'react-hook-form';\nimport {Prompt} from 'react-router-dom';\n\nimport {Button, Icon} from '@deviceinsight/ng-ui-basic-components';\nimport {nanoid10} from '@deviceinsight/ng-ui-components';\n\nimport {LocalePicker} from 'components/template/LocalePicker';\nimport {GlobalResourcesContext} from 'contexts/globalResources/GlobalResourcesContext';\nimport {Trans} from 'i18n';\nimport type {TemplateFormData} from '../types';\nimport AccessEditModal from './AccessEditModal';\nimport FooterButtons from './FooterButtons';\nimport NotificationContent from './NotificationContent';\nimport NotificationInfo from './NotificationInfo';\nimport './templateForm.scss';\n\ntype Props = {\n\tonCancel: () => void;\n\tonSubmit: (formValues: TemplateFormData) => Promise<void>;\n\teditedTemplateData: TemplateFormData | undefined;\n};\n\nfunction createEmptyTemplateFormData(): TemplateFormData {\n\treturn {\n\t\tname: `__${nanoid10()}`,\n\t\tlocales: [\n\t\t\t{\n\t\t\t\tlocale: 'default',\n\t\t\t\tsubject: '',\n\t\t\t\ttext: '',\n\t\t\t\tid: 0,\n\t\t\t},\n\t\t],\n\t\tdisplayName: '',\n\t};\n}\n\nexport default function TemplateForm({onCancel, onSubmit, editedTemplateData}: Props) {\n\tconst {locales: availableLocales} = useContext(GlobalResourcesContext);\n\tconst formContext = useForm<TemplateFormData>({\n\t\tdefaultValues: editedTemplateData ?? createEmptyTemplateFormData(),\n\t});\n\tconst {\n\t\thandleSubmit,\n\t\tsetValue,\n\t\twatch,\n\t\tformState: {isSubmitting, isDirty},\n\t} = formContext;\n\tconst [accessPickerVisible, setAccessPickerVisible] = useState<boolean>(false);\n\tconst [localePickerVisible, setLocalPickerVisible] = useState<boolean>(false);\n\tconst formLocales = watch('locales');\n\n\tfunction submit(): Promise<void> {\n\t\treturn handleSubmit(onSubmit, errors => {\n\t\t\tconsole.warn('Validation error', errors);\n\t\t})();\n\t}\n\n\tasync function handleAccountGroupsSelect(accountGroupIdsWithAccess: number[]) {\n\t\tsetAccessPickerVisible(false);\n\t\tsetValue('accountGroupsWithAccess', accountGroupIdsWithAccess);\n\t\tawait submit();\n\t}\n\n\tfunction handleSelectLocale(locale: string) {\n\t\tsetLocalPickerVisible(false);\n\t\tsetValue('locales', [...formLocales, {locale, id: 0, text: '', subject: ''}], {shouldDirty: true});\n\t}\n\n\tfunction getUnusedLocales() {\n\t\treturn availableLocales.filter(locale => !formLocales.some(localeData => localeData.locale === locale));\n\t}\n\n\treturn (\n\t\t<FormProvider {...formContext}>\n\t\t\t<div className=\"template-form\">\n\t\t\t\t<NotificationInfo />\n\t\t\t\t<NotificationContent />\n\t\t\t\t<div className=\"di button-row add-locale\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={() => setLocalPickerVisible(true)}\n\t\t\t\t\t\tdata-testid=\"add-locale-button\"\n\t\t\t\t\t\tdisabled={!getUnusedLocales().length}\n\t\t\t\t\t\tnaked\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon add />\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t<Trans i18nKey=\"notificationTemplate.form.addLocale\">Add locale...</Trans>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t<FooterButtons\n\t\t\t\t\tonCancel={onCancel}\n\t\t\t\t\tonSubmit={editedTemplateData ? submit : () => setAccessPickerVisible(true)}\n\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t/>\n\t\t\t\t{localePickerVisible && (\n\t\t\t\t\t<LocalePicker\n\t\t\t\t\t\tlocales={getUnusedLocales()}\n\t\t\t\t\t\tonSelect={handleSelectLocale}\n\t\t\t\t\t\tonCancel={() => setLocalPickerVisible(false)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{accessPickerVisible && (\n\t\t\t\t\t<AccessEditModal\n\t\t\t\t\t\tonSave={handleAccountGroupsSelect}\n\t\t\t\t\t\tonCancel={() => setAccessPickerVisible(false)}\n\t\t\t\t\t\tloading={isSubmitting}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<Prompt message=\"\" when={isDirty && !isSubmitting} />\n\t\t\t</div>\n\t\t</FormProvider>\n\t);\n}\n","import type {AxiosError} from 'axios';\nimport {useEffect, useState} from 'react';\nimport {useParams} from 'react-router-dom';\n\nimport {fetchEmailTemplateById, fetchEmailTemplates} from '@deviceinsight/ng-ui-api-client';\n\nimport type {LocaleData, TemplateFormData} from './types';\n\ntype InitialFormDataContainer = {\n\tinitialFormData: TemplateFormData | undefined;\n\terror: AxiosError | undefined;\n\tloading: boolean;\n};\n\ntype UrlParams = {\n\ttemplateId: string;\n};\n\nexport default function useInitialFormData(): InitialFormDataContainer {\n\tconst {templateId} = useParams<UrlParams>();\n\tconst [initialData, setInitialData] = useState<TemplateFormData | undefined>(undefined);\n\tconst [error, setError] = useState<AxiosError | undefined>(undefined);\n\tconst [loading, setLoading] = useState<boolean>(true);\n\n\tuseEffect(() => {\n\t\tif (!templateId || templateId === 'create') {\n\t\t\tsetLoading(false);\n\t\t\treturn;\n\t\t}\n\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tconst defaultTemplate = await fetchEmailTemplateById(parseInt(templateId));\n\t\t\t\tconst fetchedTemplates = await fetchEmailTemplates({\n\t\t\t\t\tname: defaultTemplate.name,\n\t\t\t\t\tpage: 0,\n\t\t\t\t\tsize: 2000,\n\t\t\t\t});\n\t\t\t\tconst allTemplateVersions = fetchedTemplates // filter must be performed because the backend returns all templates starting with the given name\n\t\t\t\t\t.filter(template => template.name === defaultTemplate.name);\n\n\t\t\t\tconst locales = allTemplateVersions.map<LocaleData>(template => ({\n\t\t\t\t\tid: template.id,\n\t\t\t\t\tlocale: template.locale ?? 'default',\n\t\t\t\t\ttext: template.text,\n\t\t\t\t\tsubject: template.subject ?? '',\n\t\t\t\t}));\n\n\t\t\t\tsetInitialData({\n\t\t\t\t\taccountGroupsWithAccess: undefined,\n\t\t\t\t\tname: defaultTemplate.name,\n\t\t\t\t\tdisplayName: defaultTemplate.displayName,\n\t\t\t\t\tlocales,\n\t\t\t\t});\n\t\t\t} catch (e: any) {\n\t\t\t\tsetError(e);\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t})();\n\t}, [templateId]);\n\n\treturn {\n\t\tloading,\n\t\terror,\n\t\tinitialFormData: initialData,\n\t};\n}\n","import {useContext, useEffect} from 'react';\nimport {useHistory, useLocation} from 'react-router-dom';\n\nimport {\n\tcreateEmailTemplate,\n\tdeleteEmailTemplate,\n\ttype NotificationTemplate,\n\ttype NotificationTemplateNew,\n\tupdateEmailTemplate,\n} from '@deviceinsight/ng-ui-api-client';\nimport {SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\nimport {ContentHeader, messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport PageNotFound from 'components/page/misc/PageNotFound';\nimport {ContextInfoContext} from 'contexts/contextInfo/ContextInfoContext';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {Trans, useTranslation} from 'i18n';\nimport TemplateForm from './templateForm/TemplateForm';\nimport type {LocaleData, TemplateFormData} from './types';\nimport useInitialFormData from './useInitialFormData';\n\nfunction addEmailTemplates(templates: NotificationTemplateNew[]) {\n\treturn templates.map(template => createEmailTemplate(template));\n}\n\nfunction updateEmailTemplates(templates: NotificationTemplate[]) {\n\treturn templates.map(template => updateEmailTemplate(template));\n}\n\nfunction deleteEmailTemplates(templates: number[]) {\n\treturn templates.map(id => deleteEmailTemplate(id));\n}\n\nfunction transformLocaleFormDataToNotificationTemplateNew(\n\tlocale: string,\n\ttemplateFormData: TemplateFormData,\n): NotificationTemplateNew {\n\tconst {name, displayName, accountGroupsWithAccess} = templateFormData;\n\tconst localeData = templateFormData.locales.find(localeData => localeData.locale === locale);\n\tif (!localeData) {\n\t\tthrow new Error(`Locale ${locale} not found`);\n\t}\n\tconst {subject, text} = localeData;\n\treturn {\n\t\taccountGroupsWithAccess,\n\t\tname,\n\t\tdisplayName,\n\t\ttenant: UIConfiguration.getTenant(),\n\t\tlocale: locale === 'default' ? null : locale,\n\t\tsubject,\n\t\ttext,\n\t\tscope: 'CONDITION_MONITORING',\n\t};\n}\n\nfunction transformLocaleFormDataToNotificationTemplate(id: number, locale: string, formValues: TemplateFormData) {\n\treturn {\n\t\tid,\n\t\t...transformLocaleFormDataToNotificationTemplateNew(locale, formValues),\n\t};\n}\n\nconst isNotificationChanged = (prevNotification: LocaleData, currentNotification: LocaleData) =>\n\tprevNotification.subject !== currentNotification.subject || prevNotification.text !== currentNotification.text;\n\nexport default function TemplateEditPage() {\n\tconst {t} = useTranslation();\n\tconst {setContextInfo} = useContext(ContextInfoContext);\n\tconst history = useHistory();\n\tconst {pathname} = useLocation();\n\tconst {initialFormData, error, loading} = useInitialFormData();\n\n\tasync function saveChanges(toAdd: NotificationTemplateNew[], toUpdate: NotificationTemplate[], toRemove: number[]) {\n\t\tconst addPromises = addEmailTemplates(toAdd);\n\t\tconst updatePromises = updateEmailTemplates(toUpdate);\n\t\tconst removePromises = deleteEmailTemplates(toRemove);\n\t\tawait Promise.all([...addPromises, ...updatePromises, ...removePromises]);\n\t}\n\n\tfunction createTemplates(formValues: TemplateFormData) {\n\t\tconst {locales} = formValues;\n\t\treturn saveChanges(\n\t\t\tlocales.map(({locale}) => transformLocaleFormDataToNotificationTemplateNew(locale, formValues)),\n\t\t\t[],\n\t\t\t[],\n\t\t);\n\t}\n\n\tfunction updateTemplates(formValues: TemplateFormData) {\n\t\tconst {locales: newLocales} = formValues;\n\t\tconst previousName = initialFormData?.displayName;\n\t\tconst previousLocales = initialFormData?.locales ?? [];\n\t\tconst toRemove = previousLocales.filter(\n\t\t\t({locale}) => !newLocales.some(localeData => localeData.locale === locale),\n\t\t);\n\t\tconst toAdd = newLocales.filter(\n\t\t\t({locale}) => !previousLocales.some(localeData => localeData.locale === locale),\n\t\t);\n\t\tconst toUpdate =\n\t\t\tpreviousName === formValues.displayName\n\t\t\t\t? newLocales.filter(newLocaleData => {\n\t\t\t\t\t\tconst previousLocaleData = previousLocales.find(\n\t\t\t\t\t\t\tlocaleData => localeData.locale === newLocaleData.locale,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn previousLocaleData && isNotificationChanged(previousLocaleData, newLocaleData);\n\t\t\t\t\t})\n\t\t\t\t: newLocales.filter(newLocaleData =>\n\t\t\t\t\t\tpreviousLocales.some(previousLocaleData => previousLocaleData.locale === newLocaleData.locale),\n\t\t\t\t\t);\n\t\treturn saveChanges(\n\t\t\ttoAdd.map(({locale}) => transformLocaleFormDataToNotificationTemplateNew(locale, formValues)),\n\t\t\ttoUpdate.map(({locale, id}) => transformLocaleFormDataToNotificationTemplate(id, locale, formValues)),\n\t\t\ttoRemove.map(({id}) => id),\n\t\t);\n\t}\n\n\tasync function handleSubmit(formData: TemplateFormData) {\n\t\ttry {\n\t\t\tif (initialFormData) {\n\t\t\t\tawait updateTemplates(formData);\n\t\t\t} else {\n\t\t\t\tawait createTemplates(formData);\n\t\t\t}\n\n\t\t\tgoToTemplatesList();\n\t\t} catch (e: any) {\n\t\t\tconsole.error('An error occured while trying to submit the template(s): ', e);\n\n\t\t\tif (e.response && e.response.status === 400) {\n\t\t\t\tmessageBoxError(\n\t\t\t\t\t<Trans i18nKey=\"notificationTemplates.form.nameOccupied\">\n\t\t\t\t\t\tTemplate with this name already exists\n\t\t\t\t\t</Trans>,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmessageBoxError(<Trans i18nKey=\"notificationTemplates.form.unknownError\">Unknown error occured</Trans>);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction goToTemplatesList() {\n\t\thistory.push('/portaladmin/templates');\n\t}\n\n\tuseEffect(() => {\n\t\tsetContextInfo({\n\t\t\ttype: 'string',\n\t\t\tvalue: initialFormData?.displayName || initialFormData?.name || '',\n\t\t\tpathname,\n\t\t});\n\t}, [initialFormData, pathname, setContextInfo]);\n\n\tuseEffect(() => {\n\t\treturn () => setContextInfo();\n\t}, [setContextInfo]);\n\n\tuseEffect(() => {\n\t\tif (error) {\n\t\t\tconsole.error(error);\n\t\t\tmessageBoxError(\n\t\t\t\t<Trans i18nKey=\"notificationTemplates.form.fetchFailed\">\n\t\t\t\t\tAn error occurred while trying to fetch the template(s)\n\t\t\t\t</Trans>,\n\t\t\t);\n\t\t}\n\t}, [error]);\n\n\tif (error) {\n\t\treturn <PageNotFound />;\n\t}\n\n\treturn (\n\t\t<SpinnerContainer show={loading}>\n\t\t\t<ContentHeader\n\t\t\t\tparentPageLink\n\t\t\t\tsubPagePathPrefixArray={['/email', '/sms']}\n\t\t\t\ttitle={\n\t\t\t\t\tinitialFormData\n\t\t\t\t\t\t? t('notificationTemplate.form.editTemplate', {\n\t\t\t\t\t\t\t\tdefaultValue: 'Edit Template',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: t('notificationTemplate.form.createTemplate', {\n\t\t\t\t\t\t\t\tdefaultValue: 'Create Template',\n\t\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{!loading && (\n\t\t\t\t<TemplateForm\n\t\t\t\t\tonCancel={goToTemplatesList}\n\t\t\t\t\tonSubmit={handleSubmit}\n\t\t\t\t\teditedTemplateData={initialFormData}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</SpinnerContainer>\n\t);\n}\n"],"names":["getColumnDefs","onSelect","jsx","Trans","locale","LocalePicker","locales","onCancel","items","Modal","ReactableWithClientSidePagination","item","Button","messages","FooterButtons","onSubmit","disabled","jsxs","ButtonRow","generateVariables","assetProperties","assetGroupProperties","key","variable","useFilteredProperties","useProperties","property","VariablePicker","TemplateTextInput","lazy","compareSelectedLocalesDefaultFirst","locale1","locale2","NotificationContent","confirm","useConfirm","variablePickerVisible","setVariablePickerVisible","useState","focusedField","setFocusedField","watch","control","setValue","errors","useFormContext","t","useTranslation","subjectEditorRef","useRef","messageFieldRef","handleDelete","localeData","handleShowVariablePicker","handleSelectVariable","editor","transaction","Accordion","textLabel","index","isError","AccordionItem","warningIcon","Icon","Controller","value","onChange","error","field","NotificationInfo","FormRow","TextInput","createEmptyTemplateFormData","nanoid10","TemplateForm","editedTemplateData","availableLocales","useContext","GlobalResourcesContext","formContext","useForm","handleSubmit","isSubmitting","isDirty","accessPickerVisible","setAccessPickerVisible","localePickerVisible","setLocalPickerVisible","formLocales","submit","handleAccountGroupsSelect","accountGroupIdsWithAccess","handleSelectLocale","getUnusedLocales","FormProvider","AccessEditModal","Prompt","useInitialFormData","templateId","useParams","initialData","setInitialData","setError","loading","setLoading","useEffect","defaultTemplate","fetchEmailTemplateById","fetchEmailTemplates","template","e","addEmailTemplates","templates","createEmailTemplate","updateEmailTemplates","updateEmailTemplate","deleteEmailTemplates","id","deleteEmailTemplate","transformLocaleFormDataToNotificationTemplateNew","templateFormData","name","displayName","accountGroupsWithAccess","subject","text","UIConfiguration","transformLocaleFormDataToNotificationTemplate","formValues","isNotificationChanged","prevNotification","currentNotification","TemplateEditPage","setContextInfo","ContextInfoContext","history","useHistory","pathname","useLocation","initialFormData","saveChanges","toAdd","toUpdate","toRemove","addPromises","updatePromises","removePromises","createTemplates","updateTemplates","newLocales","previousName","previousLocales","newLocaleData","previousLocaleData","formData","goToTemplatesList","messageBoxError","PageNotFound","SpinnerContainer","ContentHeader"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { javascript as u } from "@codemirror/lang-javascript";
|
|
|
3
3
|
import h from "@uiw/react-codemirror";
|
|
4
4
|
import x from "classnames";
|
|
5
5
|
import * as g from "react";
|
|
6
|
-
import {
|
|
6
|
+
import { Y as b } from "./setTitle-Dij-z9p9.js";
|
|
7
7
|
const T = g.forwardRef(
|
|
8
8
|
({ onFocus: c, onChange: r, refField: l, renderAs: i, ...n }, e) => {
|
|
9
9
|
function s() {
|
|
@@ -42,4 +42,4 @@ const T = g.forwardRef(
|
|
|
42
42
|
export {
|
|
43
43
|
T as default
|
|
44
44
|
};
|
|
45
|
-
//# sourceMappingURL=TemplateTextInput-
|
|
45
|
+
//# sourceMappingURL=TemplateTextInput-CmCxL3xj.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateTextInput-
|
|
1
|
+
{"version":3,"file":"TemplateTextInput-CmCxL3xj.js","sources":["../ng-ui-scale/src/components/template/TemplateTextInput.tsx"],"sourcesContent":["import {javascript} from '@codemirror/lang-javascript';\nimport type {EditorView, ViewUpdate} from '@codemirror/view';\nimport Controlled from '@uiw/react-codemirror';\nimport classNames from 'classnames';\nimport type {ReactNode} from 'react';\nimport * as React from 'react';\n\nimport FieldDecorator from 'components/inputs/FieldDecorator';\n\ntype Props = {\n\tonChange?: (value: string, viewUpdate: ViewUpdate) => void;\n\tonFocus: () => void;\n\tlabel?: ReactNode | string;\n\trequired?: boolean;\n\trenderAs?: 'textarea' | 'input';\n\trefField: (editor: EditorView) => void;\n\tvalue: string;\n\terror?: string;\n};\n\nconst TemplateTextInput = React.forwardRef<EditorView, Props>(\n\t({onFocus, onChange, refField, renderAs, ...rest}, forwardedRef) => {\n\t\tfunction handleFocus() {\n\t\t\tonFocus();\n\t\t}\n\t\tconst handleChange = (value: string, viewUpdate: ViewUpdate) => {\n\t\t\tif (!renderAs || renderAs === 'input') {\n\t\t\t\tonChange?.(value.replace(/\\n/g, ''), viewUpdate);\n\t\t\t} else {\n\t\t\t\tonChange?.(value, viewUpdate);\n\t\t\t}\n\t\t};\n\n\t\tconst {label, ...decoratorProps} = rest;\n\n\t\treturn (\n\t\t\t<FieldDecorator {...decoratorProps} label={label}>\n\t\t\t\t<div\n\t\t\t\t\tclassName={classNames('di notification-template-field', {\n\t\t\t\t\t\ttextarea: renderAs === 'textarea',\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<Controlled\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\tbasicSetup={{\n\t\t\t\t\t\t\tlineNumbers: false,\n\t\t\t\t\t\t\thighlightActiveLine: false,\n\t\t\t\t\t\t\tfoldGutter: false,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonChange={(value: string, viewUpdate: ViewUpdate) => handleChange(value, viewUpdate)}\n\t\t\t\t\t\tonCreateEditor={(editor: EditorView) => {\n\t\t\t\t\t\t\trefField(editor);\n\t\t\t\t\t\t\tif (forwardedRef) {\n\t\t\t\t\t\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\t\t\t\t\t\tforwardedRef(editor);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t(forwardedRef as React.MutableRefObject<EditorView | null>).current = editor;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\t\textensions={[javascript()]}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</FieldDecorator>\n\t\t);\n\t},\n);\n\nexport default TemplateTextInput;\n"],"names":["TemplateTextInput","React","onFocus","onChange","refField","renderAs","rest","forwardedRef","handleFocus","handleChange","value","viewUpdate","label","decoratorProps","jsx","FieldDecorator","classNames","Controlled","editor","javascript"],"mappings":";;;;;;AAoBA,MAAMA,IAAoBC,EAAM;AAAA,EAC/B,CAAC,EAAC,SAAAC,GAAS,UAAAC,GAAU,UAAAC,GAAU,UAAAC,GAAU,GAAGC,EAAA,GAAOC,MAAiB;AACnE,aAASC,IAAc;AACtB,MAAAN,EAAA;AAAA,IACD;AACA,UAAMO,IAAe,CAACC,GAAeC,MAA2B;AAC/D,MACCR,IADG,CAACE,KAAYA,MAAa,UAClBK,EAAM,QAAQ,OAAO,EAAE,IAEvBA,GAF0BC,CAAU;AAAA,IAIjD,GAEM,EAAC,OAAAC,GAAO,GAAGC,EAAA,IAAkBP;AAEnC,WACC,gBAAAQ,EAACC,GAAA,EAAgB,GAAGF,GAAgB,OAAAD,GACnC,UAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,WAAWE,EAAW,kCAAkC;AAAA,UACvD,UAAUX,MAAa;AAAA,QAAA,CACvB;AAAA,QAED,UAAA,gBAAAS;AAAA,UAACG;AAAAA,UAAA;AAAA,YACC,GAAGX;AAAA,YACJ,YAAY;AAAA,cACX,aAAa;AAAA,cACb,qBAAqB;AAAA,cACrB,YAAY;AAAA,YAAA;AAAA,YAEb,UAAU,CAACI,GAAeC,MAA2BF,EAAaC,GAAOC,CAAU;AAAA,YACnF,gBAAgB,CAACO,MAAuB;AACvC,cAAAd,EAASc,CAAM,GACXX,MACC,OAAOA,KAAiB,aAC3BA,EAAaW,CAAM,IAElBX,EAA2D,UAAUW;AAAA,YAGzE;AAAA,YACA,SAASV;AAAA,YACT,YAAY,CAACW,EAAA,CAAY;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1B;AAAA,IAAA,GAEF;AAAA,EAEF;AACD;"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsx as e, jsxs as O, Fragment as v } from "react/jsx-runtime";
|
|
2
2
|
import { flatten as M, unionBy as z } from "lodash";
|
|
3
3
|
import { useContext as j, useState as T, useCallback as W, useEffect as H } from "react";
|
|
4
|
-
import { Link as
|
|
5
|
-
import { fetchUserGroupById as D, fetchEmailTemplates as L, fetchEmailTemplateAccessById as
|
|
6
|
-
import { Label as S, Button as w, Icon as
|
|
4
|
+
import { Link as $, useLocation as q } from "react-router-dom";
|
|
5
|
+
import { fetchUserGroupById as D, fetchEmailTemplates as L, fetchEmailTemplateAccessById as Y, updateEmailTemplate as Z, deleteEmailTemplate as J } from "@deviceinsight/ng-ui-api-client";
|
|
6
|
+
import { Label as S, Button as w, Icon as Q, Modal as X, withConfirm as ee } from "@deviceinsight/ng-ui-basic-components";
|
|
7
7
|
import { MultiMenu as te, MultiMenuItem as ae, InfoBox as ne, messageBoxError as _, ContentHeader as oe } from "@deviceinsight/ng-ui-components";
|
|
8
|
-
import { a as i,
|
|
8
|
+
import { a as i, t as y, c1 as ie, Z as x, u as le, b7 as se, aD as re, bN as ce, bO as me } from "./setTitle-Dij-z9p9.js";
|
|
9
9
|
import "react-i18next";
|
|
10
|
-
import { A as ue } from "./AccessEditModal-
|
|
10
|
+
import { A as ue } from "./AccessEditModal-C_Ymwezb.js";
|
|
11
11
|
function de(r, s, c, h, m) {
|
|
12
12
|
return [
|
|
13
13
|
{
|
|
@@ -19,7 +19,7 @@ function de(r, s, c, h, m) {
|
|
|
19
19
|
filterType: "text",
|
|
20
20
|
filterFn: (t, n) => (t.displayName || t.name).toLowerCase().indexOf(n.toLowerCase()) >= 0
|
|
21
21
|
},
|
|
22
|
-
render: (t) => t.id ? /* @__PURE__ */ e(
|
|
22
|
+
render: (t) => t.id ? /* @__PURE__ */ e($, { to: `./${t.id}`, children: t.displayName || t.name }) : "-"
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
name: "message",
|
|
@@ -108,7 +108,7 @@ function de(r, s, c, h, m) {
|
|
|
108
108
|
naked: !0,
|
|
109
109
|
onClick: () => r(t),
|
|
110
110
|
"data-testid": "delete-notification-template-button",
|
|
111
|
-
children: /* @__PURE__ */ e(
|
|
111
|
+
children: /* @__PURE__ */ e(Q, { del: !0 })
|
|
112
112
|
}
|
|
113
113
|
)
|
|
114
114
|
] })
|
|
@@ -122,7 +122,7 @@ function pe({ onCancel: r, onSave: s, template: c }) {
|
|
|
122
122
|
defaultValue: "You are about ot remove the last User Groups from a Template. Please note that you wouldn't be able to see it as you do not have the required Authorities. Please contact your Administrator."
|
|
123
123
|
});
|
|
124
124
|
return /* @__PURE__ */ e(
|
|
125
|
-
|
|
125
|
+
X,
|
|
126
126
|
{
|
|
127
127
|
onOutsideClick: r,
|
|
128
128
|
header: /* @__PURE__ */ e(i, { i18nKey: "notificationTemplate.access.delete.modal.title", children: "Remove all authorised User Groups from this Template" }),
|
|
@@ -150,7 +150,7 @@ async function Te() {
|
|
|
150
150
|
const r = await L(he);
|
|
151
151
|
return await Promise.all(
|
|
152
152
|
r.map(async (s) => {
|
|
153
|
-
const { accountGroupIds: c } = await
|
|
153
|
+
const { accountGroupIds: c } = await Y(s.id);
|
|
154
154
|
return Promise.resolve({
|
|
155
155
|
...s,
|
|
156
156
|
accountGroupsWithAccess: c,
|
|
@@ -160,7 +160,7 @@ async function Te() {
|
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
162
|
function ye({ confirm: r }) {
|
|
163
|
-
const { setContextInfo: s } = j(re), { pathname: c } =
|
|
163
|
+
const { setContextInfo: s } = j(re), { pathname: c } = q(), [h, m] = T([]), [t, n] = T(!0), [g, l] = T(!1), [u, A] = T(!1), [C, b] = T([]), [I, P] = T(), U = /* @__PURE__ */ e(i, { i18nKey: "portalAdmin.sidebarElements.templates.create", children: "Create new notification template" }), N = W(
|
|
164
164
|
(a) => {
|
|
165
165
|
s({
|
|
166
166
|
type: "search",
|
|
@@ -181,7 +181,7 @@ function ye({ confirm: r }) {
|
|
|
181
181
|
page: 0,
|
|
182
182
|
size: 2e3
|
|
183
183
|
});
|
|
184
|
-
await Promise.all(o.map((p) =>
|
|
184
|
+
await Promise.all(o.map((p) => J(p.id)));
|
|
185
185
|
const d = C.filter((p) => p.name !== a.name);
|
|
186
186
|
b(d), N(d);
|
|
187
187
|
} catch (o) {
|
|
@@ -215,7 +215,7 @@ function ye({ confirm: r }) {
|
|
|
215
215
|
}), p = { ...o, accountGroupsWithAccess: a }, f = z([p], C, "id");
|
|
216
216
|
await Promise.all(
|
|
217
217
|
d.map(
|
|
218
|
-
(E) =>
|
|
218
|
+
(E) => Z({
|
|
219
219
|
...E,
|
|
220
220
|
accountGroupsWithAccess: a
|
|
221
221
|
})
|
|
@@ -327,4 +327,4 @@ const _e = ee(ye);
|
|
|
327
327
|
export {
|
|
328
328
|
_e as default
|
|
329
329
|
};
|
|
330
|
-
//# sourceMappingURL=TemplatesListPage-
|
|
330
|
+
//# sourceMappingURL=TemplatesListPage-HwJpI4I0.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplatesListPage-roTvuqft.js","sources":["../ng-ui-scale/src/modules/templates/getColumnDefinitions.tsx","../ng-ui-scale/src/modules/templates/templateForm/AccessInfoModal.tsx","../ng-ui-scale/src/modules/templates/TemplatesListPage.tsx"],"sourcesContent":["import {Link} from 'react-router-dom';\n\nimport type {NotificationTemplate, UserGroup} from '@deviceinsight/ng-ui-api-client';\nimport {Button, Icon, Label} from '@deviceinsight/ng-ui-basic-components';\nimport {MultiMenu, MultiMenuItem, type ReactableColumnDef} from '@deviceinsight/ng-ui-components';\n\nimport iconDark from 'assets/svg/icon_key.svg';\nimport {Trans} from 'i18n';\nimport {hasAuthorities} from 'utils/hasAuthorities';\nimport {nonNull} from 'utils/tsUtils';\n\nexport default function getColumnDefinitions(\n\tonDeleteTemplate: (template: NotificationTemplate) => any,\n\tonSaveAccess: (accountGroupIds: number[], template: NotificationTemplate) => any,\n\tonEditAccess: (template: NotificationTemplate) => any,\n\tonEditLastAccess: (template: NotificationTemplate) => any,\n\taccountGroups: UserGroup[],\n): Array<ReactableColumnDef<NotificationTemplate>> {\n\treturn [\n\t\t{\n\t\t\tname: 'displayName',\n\t\t\tlabel: <Trans i18nKey=\"notificationTemplates.columns.name\">Name</Trans>,\n\t\t\twidth: '10%',\n\t\t\tsortable: true,\n\t\t\tfilterable: {\n\t\t\t\tfilterType: 'text' as const,\n\t\t\t\tfilterFn: (item: NotificationTemplate, value: string) =>\n\t\t\t\t\t(item.displayName || item.name).toLowerCase().indexOf(value.toLowerCase()) >= 0,\n\t\t\t},\n\t\t\trender: (item: NotificationTemplate) =>\n\t\t\t\titem.id ? <Link to={`./${item.id}`}>{item.displayName || item.name}</Link> : '-',\n\t\t},\n\t\t{\n\t\t\tname: 'message',\n\t\t\tlabel: <Trans i18nKey=\"notificationTemplates.columns.message\">Message</Trans>,\n\t\t\twidth: '40%',\n\t\t\tsortable: true,\n\t\t\twhiteSpace: 'normal',\n\t\t\trender: ({text}: NotificationTemplate) => text,\n\t\t},\n\t\t{\n\t\t\tname: 'subject',\n\t\t\tlabel: <Trans i18nKey=\"notificationTemplates.columns.subject\">Subject</Trans>,\n\t\t\twidth: '20%',\n\t\t\tsortable: true,\n\t\t\twhiteSpace: 'normal',\n\t\t\trender: ({subject}: NotificationTemplate) =>\n\t\t\t\tsubject ? <span>{subject}</span> : <Trans i18nKey=\"notificationTemplates.noSubject\">None</Trans>,\n\t\t},\n\t\thasAuthorities(['READ_ACCOUNT_GROUP'] as string[])\n\t\t\t? {\n\t\t\t\t\tname: 'userGroups',\n\t\t\t\t\tlabel: <Trans i18nKey=\"notificationTemplates.columns.userGroups\">Authorised User Groups</Trans>,\n\t\t\t\t\twidth: '10%',\n\t\t\t\t\twhiteSpace: 'normal',\n\t\t\t\t\tfilterable: {\n\t\t\t\t\t\tfilterType: 'text' as const,\n\t\t\t\t\t\tfilterFn: (item: NotificationTemplate, value: string) =>\n\t\t\t\t\t\t\titem.name.toLowerCase().includes(value.toLowerCase()),\n\t\t\t\t\t},\n\t\t\t\t\trender: (item: NotificationTemplate) => {\n\t\t\t\t\t\tconst {accountGroupsWithAccess} = item;\n\n\t\t\t\t\t\tif (!accountGroupsWithAccess || !accountGroupsWithAccess.length) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfunction getAccountGroupById(id: number) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\taccountGroups.find(accountGroup => accountGroup.id === id) ||\n\t\t\t\t\t\t\t\t({\n\t\t\t\t\t\t\t\t\tdisplayName: '-',\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t} as UserGroup)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (accountGroupsWithAccess.length > 1) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<MultiMenu\n\t\t\t\t\t\t\t\t\tmenuButton={<Label text={`${accountGroupsWithAccess.length} User Groups`} />}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{accountGroupsWithAccess.map(id => {\n\t\t\t\t\t\t\t\t\t\tconst accountGroup = getAccountGroupById(id);\n\t\t\t\t\t\t\t\t\t\tconst accountGroupIds = accountGroupsWithAccess.filter(\n\t\t\t\t\t\t\t\t\t\t\taccess => access !== accountGroup.id,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<MultiMenuItem key={accountGroup.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Label\n\t\t\t\t\t\t\t\t\t\t\t\t\ttext={accountGroup.displayName || accountGroup.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonDelete={() => onSaveAccess(accountGroupIds, item)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</MultiMenuItem>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</MultiMenu>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst accountGroup = getAccountGroupById(accountGroupsWithAccess[0]);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Label\n\t\t\t\t\t\t\t\t\ttext={accountGroup.displayName || accountGroup.name}\n\t\t\t\t\t\t\t\t\tonDelete={() => onEditLastAccess(item)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: null,\n\t\thasAuthorities([['DELETE_NOTIFICATION_TEMPLATE'], ['READ_ACCOUNT_GROUP']] as string[][])\n\t\t\t? {\n\t\t\t\t\tname: 'actions',\n\t\t\t\t\tlabel: '',\n\t\t\t\t\twidth: '10%',\n\t\t\t\t\talign: 'right' as const,\n\t\t\t\t\trender: (template: NotificationTemplate) => (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{hasAuthorities([['READ_ACCOUNT_GROUP']] as string[][]) && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tnaked\n\t\t\t\t\t\t\t\t\tonClick={() => onEditAccess(template)}\n\t\t\t\t\t\t\t\t\tdata-testid=\"edit-notification-template-access-button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<img className=\"di icon\" src={iconDark} alt=\"key\" />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{hasAuthorities(['DELETE_NOTIFICATION_TEMPLATE'] as string[]) && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tnaked\n\t\t\t\t\t\t\t\t\tonClick={() => onDeleteTemplate(template)}\n\t\t\t\t\t\t\t\t\tdata-testid=\"delete-notification-template-button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon del />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: null,\n\t].filter(nonNull);\n}\n","import type {NotificationTemplate} from '@deviceinsight/ng-ui-api-client';\nimport {Button, Modal} from '@deviceinsight/ng-ui-basic-components';\nimport {InfoBox} from '@deviceinsight/ng-ui-components';\n\nimport warning_icon from 'assets/svg/icon_warning_triangle.svg';\nimport {Trans, useTranslation} from 'i18n';\nimport {hasAuthorities} from 'utils/hasAuthorities';\n\ntype Props = {\n\tonCancel: () => void;\n\tonSave: (accountGroupIds: number[], template: NotificationTemplate) => Promise<void>;\n\ttemplate: NotificationTemplate;\n};\n\nfunction AccessInfoModal({onCancel, onSave, template}: Props) {\n\tconst {t} = useTranslation();\n\tconst hasAccess = hasAuthorities(['ACCESS_TO_ALL_NOTIFICATION_TEMPLATES'] as string[]);\n\tconst message = hasAccess\n\t\t? t('notificationTemplate.access.delete.authorized', {\n\t\t\t\tdefaultValue:\n\t\t\t\t\t\"You are about to remove all User Groups from a Template. Please note that for all other Users who don't have such Authorities like you (ACCESS_TO_ALL_NOTIFICATION_TEMPLATES), this Template will then be completely hidden!\",\n\t\t\t})\n\t\t: t('notificationTemplate.access.delete.unauthorized', {\n\t\t\t\tdefaultValue:\n\t\t\t\t\t\"You are about ot remove the last User Groups from a Template. Please note that you wouldn't be able to see it as you do not have the required Authorities. Please contact your Administrator.\",\n\t\t\t});\n\treturn (\n\t\t<Modal\n\t\t\tonOutsideClick={onCancel}\n\t\t\theader={\n\t\t\t\t<Trans i18nKey=\"notificationTemplate.access.delete.modal.title\">\n\t\t\t\t\tRemove all authorised User Groups from this Template\n\t\t\t\t</Trans>\n\t\t\t}\n\t\t\tcontent={<InfoBox type={hasAccess ? 'warning' : 'error'} icon={warning_icon} message={message} />}\n\t\t\tfooter={\n\t\t\t\t<>\n\t\t\t\t\t{hasAccess && (\n\t\t\t\t\t\t<Button onClick={() => onSave([], template)}>\n\t\t\t\t\t\t\t<Trans i18nKey=\"general.actions.save\">Save</Trans>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t<Button onClick={() => onCancel()}>\n\t\t\t\t\t\t<Trans i18nKey=\"general.actions.cancel\">Cancel</Trans>\n\t\t\t\t\t</Button>\n\t\t\t\t</>\n\t\t\t}\n\t\t/>\n\t);\n}\n\nexport default AccessInfoModal;\n","import {flatten, unionBy} from 'lodash';\nimport {type ComponentType, useCallback, useContext, useEffect, useState} from 'react';\nimport {useLocation} from 'react-router-dom';\n\nimport {\n\tdeleteEmailTemplate,\n\tfetchEmailTemplateAccessById,\n\tfetchEmailTemplates,\n\tfetchUserGroupById,\n\ttype NotificationTemplate,\n\ttype PaginationSettings,\n\ttype UserGroup,\n\tupdateEmailTemplate,\n} from '@deviceinsight/ng-ui-api-client';\nimport {type ConfirmProps, withConfirm} from '@deviceinsight/ng-ui-basic-components';\nimport {ContentHeader, messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport {ReactableClientSidePaginationWithSizeSave} from 'components/reactable/ReactableClientSidePaginationWithSizeSave';\nimport {ContextInfoContext} from 'contexts/contextInfo/ContextInfoContext';\nimport {Trans} from 'i18n';\nimport {hasAuthorities} from 'utils/hasAuthorities';\nimport {nonNull} from 'utils/tsUtils';\nimport {SidebarElementsCreateButton} from '../../utils/portalAdminUtils';\nimport getColumnDefinitions from './getColumnDefinitions';\nimport AccessEditModal from './templateForm/AccessEditModal';\nimport AccessInfoModal from './templateForm/AccessInfoModal';\n\nconst INITIAL_PAGINATION_SETTINGS: PaginationSettings = {\n\tpage: 0,\n\tsize: 10,\n\tsort: {\n\t\tproperty: 'name',\n\t\tdirection: 'ASC',\n\t},\n};\n\nconst FETCHING_PARAMS = {\n\tlocale: 'null',\n\tpage: 0,\n\tsize: 2000,\n};\n\nasync function fetchEmailTemplatesWithAccesses(): Promise<NotificationTemplate[]> {\n\tconst emailTemplates = await fetchEmailTemplates(FETCHING_PARAMS);\n\treturn await Promise.all(\n\t\temailTemplates.map(async template => {\n\t\t\tconst {accountGroupIds: accountGroupsWithAccess} = await fetchEmailTemplateAccessById(template.id);\n\t\t\treturn Promise.resolve({\n\t\t\t\t...template,\n\t\t\t\taccountGroupsWithAccess,\n\t\t\t\ttype: 'email',\n\t\t\t} as NotificationTemplate);\n\t\t}),\n\t);\n}\n\nfunction TemplatesListPage({confirm}: ConfirmProps) {\n\tconst {setContextInfo} = useContext(ContextInfoContext);\n\tconst {pathname} = useLocation();\n\tconst [accountGroups, setAccountGroups] = useState<UserGroup[]>([]);\n\tconst [loading, setLoading] = useState<boolean>(true);\n\tconst [editModalVisible, setEditModalVisible] = useState<boolean>(false);\n\tconst [infoModalVisible, setInfoModalVisible] = useState<boolean>(false);\n\tconst [templates, setTemplates] = useState<NotificationTemplate[]>([]);\n\tconst [template, setTemplate] = useState<NotificationTemplate | null | undefined>();\n\tconst tooltip = (\n\t\t<Trans i18nKey=\"portalAdmin.sidebarElements.templates.create\">Create new notification template</Trans>\n\t);\n\tconst updateHeader = useCallback(\n\t\t(templates: NotificationTemplate[]) => {\n\t\t\tsetContextInfo({\n\t\t\t\ttype: 'search',\n\t\t\t\telements: templates.length,\n\t\t\t\ttotalElements: templates.length,\n\t\t\t\ttotalElementsAccurate: undefined,\n\t\t\t\tcontext: 'notificationtemplates',\n\t\t\t\tpathname,\n\t\t\t});\n\t\t},\n\t\t[pathname, setContextInfo],\n\t);\n\n\tasync function deleteTemplate(template: NotificationTemplate) {\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tconst templatesToDelete = await fetchEmailTemplates({\n\t\t\t\tname: template.name,\n\t\t\t\tpage: 0,\n\t\t\t\tsize: 2000,\n\t\t\t});\n\t\t\tawait Promise.all(templatesToDelete.map(template => deleteEmailTemplate(template.id)));\n\t\t\tconst updatedTemplates = templates.filter(tpl => tpl.name !== template.name);\n\t\t\tsetTemplates(updatedTemplates);\n\t\t\tupdateHeader(updatedTemplates);\n\t\t} catch (e) {\n\t\t\tconsole.error('error occured while trying to delete the template', e);\n\t\t\tmessageBoxError(\n\t\t\t\t<Trans i18nKey=\"notificationTemplate.list.deleteTemplate.error\">\n\t\t\t\t\tAn error occurred while trying to delete the template\n\t\t\t\t</Trans>,\n\t\t\t);\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}\n\n\tfunction handleDeleteTemplate(template: NotificationTemplate) {\n\t\tconfirm(\n\t\t\t{\n\t\t\t\tid: 'notificationTemplate.list.confirmDeleteTitle',\n\t\t\t\tdefaultValue: 'Delete template',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'notificationTemplate.list.confirmDeleteMessage',\n\t\t\t\tdefaultValue: 'Do you really want to delete this template?',\n\t\t\t},\n\t\t).then(() => deleteTemplate(template));\n\t}\n\n\tasync function handleSaveAccess(accountGroupsWithAccess: number[], template?: NotificationTemplate): Promise<any> {\n\t\tif (!template) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetLoading(true);\n\n\t\ttry {\n\t\t\tconst templatesToUpdate = await fetchEmailTemplates({\n\t\t\t\tname: template.name,\n\t\t\t\tpage: 0,\n\t\t\t\tsize: 2000,\n\t\t\t});\n\t\t\tconst updatedTemplate = {...template, accountGroupsWithAccess};\n\t\t\tconst updatedTemplates = unionBy([updatedTemplate], templates, 'id');\n\t\t\tawait Promise.all(\n\t\t\t\ttemplatesToUpdate.map(template =>\n\t\t\t\t\tupdateEmailTemplate({\n\t\t\t\t\t\t...template,\n\t\t\t\t\t\taccountGroupsWithAccess,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst accountGroupIds = [\n\t\t\t\t...new Set(\n\t\t\t\t\tflatten(\n\t\t\t\t\t\tupdatedTemplates.map(({accountGroupsWithAccess}) => accountGroupsWithAccess).filter(Boolean),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t] as number[];\n\t\t\tconst accountGroups = await Promise.all(accountGroupIds.map(id => fetchUserGroupById(id)));\n\t\t\tsetTemplates(updatedTemplates);\n\t\t\tsetAccountGroups(accountGroups);\n\t\t\tupdateHeader(updatedTemplates);\n\t\t} catch (e) {\n\t\t\tconsole.error('error occured while trying to save access on template: ', e);\n\t\t\tmessageBoxError(\n\t\t\t\t<Trans i18nKey=\"notificationTemplate.list.updateTemplate.error\">\n\t\t\t\t\tAn error occured while trying to save access\n\t\t\t\t</Trans>,\n\t\t\t);\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t\tsetInfoModalVisible(false);\n\t\t\tsetEditModalVisible(false);\n\t\t}\n\t}\n\n\tfunction handleEditAccess(template: NotificationTemplate) {\n\t\tsetTemplate(template);\n\t\tsetEditModalVisible(true);\n\t}\n\n\tfunction handleEditLastAccess(template: NotificationTemplate) {\n\t\tsetTemplate(template);\n\t\tsetInfoModalVisible(true);\n\t}\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: It's ok\n\tuseEffect(() => {\n\t\tlet canceled = false;\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tconst templates = await fetchEmailTemplatesWithAccesses();\n\t\t\t\tif (canceled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetTemplates(templates);\n\t\t\t\tupdateHeader(templates);\n\n\t\t\t\tif (hasAuthorities(['READ_ACCOUNT_GROUP'] as string[])) {\n\t\t\t\t\tconst accountGroupIds = [\n\t\t\t\t\t\t...new Set(flatten(templates.map(({accountGroupsWithAccess}) => accountGroupsWithAccess))),\n\t\t\t\t\t].filter(nonNull);\n\t\t\t\t\tconst accountGroups = await Promise.all(accountGroupIds.map(id => fetchUserGroupById(id)));\n\t\t\t\t\tsetAccountGroups(accountGroups);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('error occured while trying to fetch templates: ', e);\n\t\t\t\tmessageBoxError(\n\t\t\t\t\t<Trans i18nKey=\"notificationTemplate.list.fetchTemplates.error\">\n\t\t\t\t\t\tAn error occured while trying to fetch templates\n\t\t\t\t\t</Trans>,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t})();\n\n\t\treturn () => {\n\t\t\tcanceled = true;\n\t\t\tsetContextInfo();\n\t\t};\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\treturn (\n\t\t<div className=\"template-list\">\n\t\t\t<ContentHeader\n\t\t\t\ttitle={{\n\t\t\t\t\tid: 'route.label.templates.name',\n\t\t\t\t\tdefaultValue: 'Notification Templates',\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<SidebarElementsCreateButton\n\t\t\t\ttooltip={tooltip}\n\t\t\t\tauthorities=\"WRITE_NOTIFICATION_TEMPLATE\"\n\t\t\t\tpath=\"/portaladmin/templates/create\"\n\t\t\t\tdataTestId=\"create-template-button\"\n\t\t\t/>\n\t\t\t<ReactableClientSidePaginationWithSizeSave\n\t\t\t\tcolumnDefs={getColumnDefinitions(\n\t\t\t\t\thandleDeleteTemplate,\n\t\t\t\t\thandleSaveAccess,\n\t\t\t\t\thandleEditAccess,\n\t\t\t\t\thandleEditLastAccess,\n\t\t\t\t\taccountGroups,\n\t\t\t\t)}\n\t\t\t\tuniqueItemKey={(item: NotificationTemplate) => `${item.id}`}\n\t\t\t\tpaginationSettings={INITIAL_PAGINATION_SETTINGS}\n\t\t\t\titems={templates}\n\t\t\t\tisLoading={loading}\n\t\t\t\tdata-testid=\"notification-templates-table\"\n\t\t\t\ttableName={'notificationTemplates'}\n\t\t\t/>\n\t\t\t{editModalVisible && template && (\n\t\t\t\t<AccessEditModal\n\t\t\t\t\tonCancel={() => setEditModalVisible(false)}\n\t\t\t\t\tonSave={handleSaveAccess}\n\t\t\t\t\tloading={loading}\n\t\t\t\t\ttemplate={template}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{infoModalVisible && template && (\n\t\t\t\t<AccessInfoModal\n\t\t\t\t\tonCancel={() => setInfoModalVisible(false)}\n\t\t\t\t\tonSave={handleSaveAccess}\n\t\t\t\t\ttemplate={template}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport default withConfirm(TemplatesListPage) as ComponentType;\n"],"names":["getColumnDefinitions","onDeleteTemplate","onSaveAccess","onEditAccess","onEditLastAccess","accountGroups","jsx","Trans","item","value","Link","text","subject","hasAuthorities","accountGroupsWithAccess","getAccountGroupById","id","accountGroup","MultiMenu","Label","accountGroupIds","access","MultiMenuItem","template","jsxs","Fragment","Button","iconDark","Icon","nonNull","AccessInfoModal","onCancel","onSave","t","useTranslation","hasAccess","message","Modal","InfoBox","warning_icon","INITIAL_PAGINATION_SETTINGS","FETCHING_PARAMS","fetchEmailTemplatesWithAccesses","emailTemplates","fetchEmailTemplates","fetchEmailTemplateAccessById","TemplatesListPage","confirm","setContextInfo","useContext","ContextInfoContext","pathname","useLocation","setAccountGroups","useState","loading","setLoading","editModalVisible","setEditModalVisible","infoModalVisible","setInfoModalVisible","templates","setTemplates","setTemplate","tooltip","updateHeader","useCallback","deleteTemplate","templatesToDelete","deleteEmailTemplate","updatedTemplates","tpl","e","messageBoxError","handleDeleteTemplate","handleSaveAccess","templatesToUpdate","updatedTemplate","unionBy","updateEmailTemplate","flatten","fetchUserGroupById","handleEditAccess","handleEditLastAccess","useEffect","canceled","ContentHeader","SidebarElementsCreateButton","ReactableClientSidePaginationWithSizeSave","AccessEditModal","TemplatesListPage_default","withConfirm"],"mappings":";;;;;;;;;;AAWA,SAAwBA,GACvBC,GACAC,GACAC,GACAC,GACAC,GACkD;AAClD,SAAO;AAAA,IACN;AAAA,MACC,MAAM;AAAA,MACN,OAAO,gBAAAC,EAACC,GAAA,EAAM,SAAQ,sCAAqC,UAAA,QAAI;AAAA,MAC/D,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,QACX,YAAY;AAAA,QACZ,UAAU,CAACC,GAA4BC,OACrCD,EAAK,eAAeA,EAAK,MAAM,YAAA,EAAc,QAAQC,EAAM,YAAA,CAAa,KAAK;AAAA,MAAA;AAAA,MAEhF,QAAQ,CAACD,MACRA,EAAK,uBAAME,GAAA,EAAK,IAAI,KAAKF,EAAK,EAAE,IAAK,UAAAA,EAAK,eAAeA,EAAK,MAAK,IAAU;AAAA,IAAA;AAAA,IAE/E;AAAA,MACC,MAAM;AAAA,MACN,OAAO,gBAAAF,EAACC,GAAA,EAAM,SAAQ,yCAAwC,UAAA,WAAO;AAAA,MACrE,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,QAAQ,CAAC,EAAC,MAAAI,QAAgCA;AAAA,IAAA;AAAA,IAE3C;AAAA,MACC,MAAM;AAAA,MACN,OAAO,gBAAAL,EAACC,GAAA,EAAM,SAAQ,yCAAwC,UAAA,WAAO;AAAA,MACrE,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,QAAQ,CAAC,EAAC,SAAAK,EAAA,MACTA,IAAU,gBAAAN,EAAC,QAAA,EAAM,UAAAM,EAAA,CAAQ,IAAU,gBAAAN,EAACC,GAAA,EAAM,SAAQ,mCAAkC,UAAA,OAAA,CAAI;AAAA,IAAA;AAAA,IAE1FM,EAAe,CAAC,oBAAoB,CAAa,IAC9C;AAAA,MACA,MAAM;AAAA,MACN,OAAO,gBAAAP,EAACC,GAAA,EAAM,SAAQ,4CAA2C,UAAA,0BAAsB;AAAA,MACvF,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,YAAY;AAAA,QACX,YAAY;AAAA,QACZ,UAAU,CAACC,GAA4BC,MACtCD,EAAK,KAAK,cAAc,SAASC,EAAM,YAAA,CAAa;AAAA,MAAA;AAAA,MAEtD,QAAQ,CAACD,MAA+B;AACvC,cAAM,EAAC,yBAAAM,MAA2BN;AAElC,YAAI,CAACM,KAA2B,CAACA,EAAwB;AACxD,iBAAO;AAGR,iBAASC,EAAoBC,GAAY;AACxC,iBACCX,EAAc,KAAK,CAAAY,MAAgBA,EAAa,OAAOD,CAAE,KACxD;AAAA,YACA,aAAa;AAAA,YACb,IAAAA;AAAA,UAAA;AAAA,QAGH;AAEA,YAAIF,EAAwB,SAAS;AACpC,iBACC,gBAAAR;AAAA,YAACY;AAAA,YAAA;AAAA,cACA,YAAY,gBAAAZ,EAACa,GAAA,EAAM,MAAM,GAAGL,EAAwB,MAAM,gBAAgB;AAAA,cAEzE,UAAAA,EAAwB,IAAI,CAAAE,MAAM;AAClC,sBAAMC,IAAeF,EAAoBC,CAAE,GACrCI,IAAkBN,EAAwB;AAAA,kBAC/C,CAAAO,MAAUA,MAAWJ,EAAa;AAAA,gBAAA;AAEnC,yCACEK,IAAA,EACA,UAAA,gBAAAhB;AAAA,kBAACa;AAAA,kBAAA;AAAA,oBACA,MAAMF,EAAa,eAAeA,EAAa;AAAA,oBAC/C,UAAU,MAAMf,EAAakB,GAAiBZ,CAAI;AAAA,kBAAA;AAAA,gBAAA,EACnD,GAJmBS,EAAa,EAKjC;AAAA,cAEF,CAAC;AAAA,YAAA;AAAA,UAAA;AAGG;AACN,gBAAMA,IAAeF,EAAoBD,EAAwB,CAAC,CAAC;AACnE,iBACC,gBAAAR;AAAA,YAACa;AAAA,YAAA;AAAA,cACA,MAAMF,EAAa,eAAeA,EAAa;AAAA,cAC/C,UAAU,MAAMb,EAAiBI,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QAGxC;AAAA,MACD;AAAA,IAAA,IAEA;AAAA,IACHK,EAAe,CAAC,CAAC,8BAA8B,GAAG,CAAC,oBAAoB,CAAC,CAAe,IACpF;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAACU,MACR,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,QAAAZ,EAAe,CAAC,CAAC,oBAAoB,CAAC,CAAe,KACrD,gBAAAP;AAAA,UAACoB;AAAA,UAAA;AAAA,YACA,OAAK;AAAA,YACL,SAAS,MAAMvB,EAAaoB,CAAQ;AAAA,YACpC,eAAY;AAAA,YAEZ,4BAAC,OAAA,EAAI,WAAU,WAAU,KAAKI,IAAU,KAAI,MAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAGnDd,EAAe,CAAC,8BAA8B,CAAa,KAC3D,gBAAAP;AAAA,UAACoB;AAAA,UAAA;AAAA,YACA,OAAK;AAAA,YACL,SAAS,MAAMzB,EAAiBsB,CAAQ;AAAA,YACxC,eAAY;AAAA,YAEZ,UAAA,gBAAAjB,EAACsB,GAAA,EAAK,KAAG,GAAA,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACX,EAAA,CAEF;AAAA,IAAA,IAGD;AAAA,EAAA,EACF,OAAOC,CAAO;AACjB;AC/HA,SAASC,GAAgB,EAAC,UAAAC,GAAU,QAAAC,GAAQ,UAAAT,KAAkB;AAC7D,QAAM,EAAC,GAAAU,EAAA,IAAKC,GAAA,GACNC,IAAYtB,EAAe,CAAC,sCAAsC,CAAa,GAC/EuB,IAAUD,IACbF,EAAE,iDAAiD;AAAA,IACnD,cACC;AAAA,EAAA,CACD,IACAA,EAAE,mDAAmD;AAAA,IACrD,cACC;AAAA,EAAA,CACD;AACH,SACC,gBAAA3B;AAAA,IAAC+B;AAAA,IAAA;AAAA,MACA,gBAAgBN;AAAA,MAChB,QACC,gBAAAzB,EAACC,GAAA,EAAM,SAAQ,kDAAiD,UAAA,wDAEhE;AAAA,MAED,2BAAU+B,IAAA,EAAQ,MAAMH,IAAY,YAAY,SAAS,MAAMI,IAAc,SAAAH,EAAA,CAAkB;AAAA,MAC/F,QACC,gBAAAZ,EAAAC,GAAA,EACE,UAAA;AAAA,QAAAU,KACA,gBAAA7B,EAACoB,GAAA,EAAO,SAAS,MAAMM,EAAO,CAAA,GAAIT,CAAQ,GACzC,UAAA,gBAAAjB,EAACC,GAAA,EAAM,SAAQ,wBAAuB,kBAAI,GAC3C;AAAA,QAED,gBAAAD,EAACoB,GAAA,EAAO,SAAS,MAAMK,EAAA,GACtB,UAAA,gBAAAzB,EAACC,GAAA,EAAM,SAAQ,0BAAyB,UAAA,SAAA,CAAM,EAAA,CAC/C;AAAA,MAAA,EAAA,CACD;AAAA,IAAA;AAAA,EAAA;AAIJ;ACtBA,MAAMiC,KAAkD;AAAA,EACvD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,IACL,UAAU;AAAA,IACV,WAAW;AAAA,EAAA;AAEb,GAEMC,KAAkB;AAAA,EACvB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AACP;AAEA,eAAeC,KAAmE;AACjF,QAAMC,IAAiB,MAAMC,EAAoBH,EAAe;AAChE,SAAO,MAAM,QAAQ;AAAA,IACpBE,EAAe,IAAI,OAAMpB,MAAY;AACpC,YAAM,EAAC,iBAAiBT,EAAA,IAA2B,MAAM+B,EAA6BtB,EAAS,EAAE;AACjG,aAAO,QAAQ,QAAQ;AAAA,QACtB,GAAGA;AAAA,QACH,yBAAAT;AAAA,QACA,MAAM;AAAA,MAAA,CACkB;AAAA,IAC1B,CAAC;AAAA,EAAA;AAEH;AAEA,SAASgC,GAAkB,EAAC,SAAAC,KAAwB;AACnD,QAAM,EAAC,gBAAAC,EAAA,IAAkBC,EAAWC,EAAkB,GAChD,EAAC,UAAAC,EAAA,IAAYC,EAAA,GACb,CAAC/C,GAAegD,CAAgB,IAAIC,EAAsB,CAAA,CAAE,GAC5D,CAACC,GAASC,CAAU,IAAIF,EAAkB,EAAI,GAC9C,CAACG,GAAkBC,CAAmB,IAAIJ,EAAkB,EAAK,GACjE,CAACK,GAAkBC,CAAmB,IAAIN,EAAkB,EAAK,GACjE,CAACO,GAAWC,CAAY,IAAIR,EAAiC,CAAA,CAAE,GAC/D,CAAC/B,GAAUwC,CAAW,IAAIT,EAAA,GAC1BU,IACL,gBAAA1D,EAACC,GAAA,EAAM,SAAQ,gDAA+C,UAAA,oCAAgC,GAEzF0D,IAAeC;AAAA,IACpB,CAACL,MAAsC;AACtC,MAAAb,EAAe;AAAA,QACd,MAAM;AAAA,QACN,UAAUa,EAAU;AAAA,QACpB,eAAeA,EAAU;AAAA,QACzB,uBAAuB;AAAA,QACvB,SAAS;AAAA,QACT,UAAAV;AAAA,MAAA,CACA;AAAA,IACF;AAAA,IACA,CAACA,GAAUH,CAAc;AAAA,EAAA;AAG1B,iBAAemB,EAAe5C,GAAgC;AAC7D,IAAAiC,EAAW,EAAI;AACf,QAAI;AACH,YAAMY,IAAoB,MAAMxB,EAAoB;AAAA,QACnD,MAAMrB,EAAS;AAAA,QACf,MAAM;AAAA,QACN,MAAM;AAAA,MAAA,CACN;AACD,YAAM,QAAQ,IAAI6C,EAAkB,IAAI,CAAA7C,MAAY8C,EAAoB9C,EAAS,EAAE,CAAC,CAAC;AACrF,YAAM+C,IAAmBT,EAAU,OAAO,OAAOU,EAAI,SAAShD,EAAS,IAAI;AAC3E,MAAAuC,EAAaQ,CAAgB,GAC7BL,EAAaK,CAAgB;AAAA,IAC9B,SAASE,GAAG;AACX,cAAQ,MAAM,qDAAqDA,CAAC,GACpEC;AAAA,QACC,gBAAAnE,EAACC,GAAA,EAAM,SAAQ,kDAAiD,UAAA,wDAAA,CAEhE;AAAA,MAAA;AAAA,IAEF,UAAA;AACC,MAAAiD,EAAW,EAAK;AAAA,IACjB;AAAA,EACD;AAEA,WAASkB,EAAqBnD,GAAgC;AAC7D,IAAAwB;AAAA,MACC;AAAA,QACC,IAAI;AAAA,QACJ,cAAc;AAAA,MAAA;AAAA,MAEf;AAAA,QACC,IAAI;AAAA,QACJ,cAAc;AAAA,MAAA;AAAA,IACf,EACC,KAAK,MAAMoB,EAAe5C,CAAQ,CAAC;AAAA,EACtC;AAEA,iBAAeoD,EAAiB7D,GAAmCS,GAA+C;AACjH,QAAKA,GAIL;AAAA,MAAAiC,EAAW,EAAI;AAEf,UAAI;AACH,cAAMoB,IAAoB,MAAMhC,EAAoB;AAAA,UACnD,MAAMrB,EAAS;AAAA,UACf,MAAM;AAAA,UACN,MAAM;AAAA,QAAA,CACN,GACKsD,IAAkB,EAAC,GAAGtD,GAAU,yBAAAT,EAAA,GAChCwD,IAAmBQ,EAAQ,CAACD,CAAe,GAAGhB,GAAW,IAAI;AACnE,cAAM,QAAQ;AAAA,UACbe,EAAkB;AAAA,YAAI,CAAArD,MACrBwD,EAAoB;AAAA,cACnB,GAAGxD;AAAAA,cACH,yBAAAT;AAAA,YAAA,CACA;AAAA,UAAA;AAAA,QACF;AAED,cAAMM,IAAkB;AAAA,UACvB,GAAG,IAAI;AAAA,YACN4D;AAAA,cACCV,EAAiB,IAAI,CAAC,EAAC,yBAAAxD,QAA6BA,CAAuB,EAAE,OAAO,OAAO;AAAA,YAAA;AAAA,UAC5F;AAAA,QACD,GAEKT,IAAgB,MAAM,QAAQ,IAAIe,EAAgB,IAAI,CAAAJ,MAAMiE,EAAmBjE,CAAE,CAAC,CAAC;AACzF,QAAA8C,EAAaQ,CAAgB,GAC7BjB,EAAiBhD,CAAa,GAC9B4D,EAAaK,CAAgB;AAAA,MAC9B,SAASE,GAAG;AACX,gBAAQ,MAAM,2DAA2DA,CAAC,GAC1EC;AAAA,UACC,gBAAAnE,EAACC,GAAA,EAAM,SAAQ,kDAAiD,UAAA,+CAAA,CAEhE;AAAA,QAAA;AAAA,MAEF,UAAA;AACC,QAAAiD,EAAW,EAAK,GAChBI,EAAoB,EAAK,GACzBF,EAAoB,EAAK;AAAA,MAC1B;AAAA;AAAA,EACD;AAEA,WAASwB,EAAiB3D,GAAgC;AACzD,IAAAwC,EAAYxC,CAAQ,GACpBmC,EAAoB,EAAI;AAAA,EACzB;AAEA,WAASyB,EAAqB5D,GAAgC;AAC7D,IAAAwC,EAAYxC,CAAQ,GACpBqC,EAAoB,EAAI;AAAA,EACzB;AAGA,SAAAwB,EAAU,MAAM;AACf,QAAIC,IAAW;AACf,YAAC,YAAY;AACZ,UAAI;AACH,cAAMxB,IAAY,MAAMnB,GAAA;AACxB,YAAI2C;AACH;AAKD,YAHAvB,EAAaD,CAAS,GACtBI,EAAaJ,CAAS,GAElBhD,EAAe,CAAC,oBAAoB,CAAa,GAAG;AACvD,gBAAMO,IAAkB;AAAA,YACvB,GAAG,IAAI,IAAI4D,EAAQnB,EAAU,IAAI,CAAC,EAAC,yBAAA/C,QAA6BA,CAAuB,CAAC,CAAC;AAAA,UAAA,EACxF,OAAOe,CAAO,GACVxB,IAAgB,MAAM,QAAQ,IAAIe,EAAgB,IAAI,CAAAJ,MAAMiE,EAAmBjE,CAAE,CAAC,CAAC;AACzF,UAAAqC,EAAiBhD,CAAa;AAAA,QAC/B;AAAA,MACD,SAASmE,GAAG;AACX,gBAAQ,MAAM,mDAAmDA,CAAC,GAClEC;AAAA,UACC,gBAAAnE,EAACC,GAAA,EAAM,SAAQ,kDAAiD,UAAA,mDAAA,CAEhE;AAAA,QAAA;AAAA,MAEF,UAAA;AACC,QAAAiD,EAAW,EAAK;AAAA,MACjB;AAAA,IACD,GAAA,GAEO,MAAM;AACZ,MAAA6B,IAAW,IACXrC,EAAA;AAAA,IACD;AAAA,EAED,GAAG,CAAA,CAAE,GAEJ,gBAAAxB,EAAC,OAAA,EAAI,WAAU,iBACd,UAAA;AAAA,IAAA,gBAAAlB;AAAA,MAACgF;AAAA,MAAA;AAAA,QACA,OAAO;AAAA,UACN,IAAI;AAAA,UACJ,cAAc;AAAA,QAAA;AAAA,MACf;AAAA,IAAA;AAAA,IAED,gBAAAhF;AAAA,MAACiF;AAAA,MAAA;AAAA,QACA,SAAAvB;AAAA,QACA,aAAY;AAAA,QACZ,MAAK;AAAA,QACL,YAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAEZ,gBAAA1D;AAAA,MAACkF;AAAA,MAAA;AAAA,QACA,YAAYxF;AAAA,UACX0E;AAAA,UACAC;AAAA,UACAO;AAAA,UACAC;AAAA,UACA9E;AAAA,QAAA;AAAA,QAED,eAAe,CAACG,MAA+B,GAAGA,EAAK,EAAE;AAAA,QACzD,oBAAoBgC;AAAA,QACpB,OAAOqB;AAAA,QACP,WAAWN;AAAA,QACX,eAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAEXE,KAAoBlC,KACpB,gBAAAjB;AAAA,MAACmF;AAAA,MAAA;AAAA,QACA,UAAU,MAAM/B,EAAoB,EAAK;AAAA,QACzC,QAAQiB;AAAA,QACR,SAAApB;AAAA,QACA,UAAAhC;AAAA,MAAA;AAAA,IAAA;AAAA,IAGDoC,KAAoBpC,KACpB,gBAAAjB;AAAA,MAACwB;AAAA,MAAA;AAAA,QACA,UAAU,MAAM8B,EAAoB,EAAK;AAAA,QACzC,QAAQe;AAAA,QACR,UAAApD;AAAA,MAAA;AAAA,IAAA;AAAA,EACD,GAEF;AAEF;AAEA,MAAAmE,KAAeC,GAAY7C,EAAiB;"}
|
|
1
|
+
{"version":3,"file":"TemplatesListPage-HwJpI4I0.js","sources":["../ng-ui-scale/src/modules/templates/getColumnDefinitions.tsx","../ng-ui-scale/src/modules/templates/templateForm/AccessInfoModal.tsx","../ng-ui-scale/src/modules/templates/TemplatesListPage.tsx"],"sourcesContent":["import {Link} from 'react-router-dom';\n\nimport type {NotificationTemplate, UserGroup} from '@deviceinsight/ng-ui-api-client';\nimport {Button, Icon, Label} from '@deviceinsight/ng-ui-basic-components';\nimport {MultiMenu, MultiMenuItem, type ReactableColumnDef} from '@deviceinsight/ng-ui-components';\n\nimport iconDark from 'assets/svg/icon_key.svg';\nimport {Trans} from 'i18n';\nimport {hasAuthorities} from 'utils/hasAuthorities';\nimport {nonNull} from 'utils/tsUtils';\n\nexport default function getColumnDefinitions(\n\tonDeleteTemplate: (template: NotificationTemplate) => any,\n\tonSaveAccess: (accountGroupIds: number[], template: NotificationTemplate) => any,\n\tonEditAccess: (template: NotificationTemplate) => any,\n\tonEditLastAccess: (template: NotificationTemplate) => any,\n\taccountGroups: UserGroup[],\n): Array<ReactableColumnDef<NotificationTemplate>> {\n\treturn [\n\t\t{\n\t\t\tname: 'displayName',\n\t\t\tlabel: <Trans i18nKey=\"notificationTemplates.columns.name\">Name</Trans>,\n\t\t\twidth: '10%',\n\t\t\tsortable: true,\n\t\t\tfilterable: {\n\t\t\t\tfilterType: 'text' as const,\n\t\t\t\tfilterFn: (item: NotificationTemplate, value: string) =>\n\t\t\t\t\t(item.displayName || item.name).toLowerCase().indexOf(value.toLowerCase()) >= 0,\n\t\t\t},\n\t\t\trender: (item: NotificationTemplate) =>\n\t\t\t\titem.id ? <Link to={`./${item.id}`}>{item.displayName || item.name}</Link> : '-',\n\t\t},\n\t\t{\n\t\t\tname: 'message',\n\t\t\tlabel: <Trans i18nKey=\"notificationTemplates.columns.message\">Message</Trans>,\n\t\t\twidth: '40%',\n\t\t\tsortable: true,\n\t\t\twhiteSpace: 'normal',\n\t\t\trender: ({text}: NotificationTemplate) => text,\n\t\t},\n\t\t{\n\t\t\tname: 'subject',\n\t\t\tlabel: <Trans i18nKey=\"notificationTemplates.columns.subject\">Subject</Trans>,\n\t\t\twidth: '20%',\n\t\t\tsortable: true,\n\t\t\twhiteSpace: 'normal',\n\t\t\trender: ({subject}: NotificationTemplate) =>\n\t\t\t\tsubject ? <span>{subject}</span> : <Trans i18nKey=\"notificationTemplates.noSubject\">None</Trans>,\n\t\t},\n\t\thasAuthorities(['READ_ACCOUNT_GROUP'] as string[])\n\t\t\t? {\n\t\t\t\t\tname: 'userGroups',\n\t\t\t\t\tlabel: <Trans i18nKey=\"notificationTemplates.columns.userGroups\">Authorised User Groups</Trans>,\n\t\t\t\t\twidth: '10%',\n\t\t\t\t\twhiteSpace: 'normal',\n\t\t\t\t\tfilterable: {\n\t\t\t\t\t\tfilterType: 'text' as const,\n\t\t\t\t\t\tfilterFn: (item: NotificationTemplate, value: string) =>\n\t\t\t\t\t\t\titem.name.toLowerCase().includes(value.toLowerCase()),\n\t\t\t\t\t},\n\t\t\t\t\trender: (item: NotificationTemplate) => {\n\t\t\t\t\t\tconst {accountGroupsWithAccess} = item;\n\n\t\t\t\t\t\tif (!accountGroupsWithAccess || !accountGroupsWithAccess.length) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfunction getAccountGroupById(id: number) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\taccountGroups.find(accountGroup => accountGroup.id === id) ||\n\t\t\t\t\t\t\t\t({\n\t\t\t\t\t\t\t\t\tdisplayName: '-',\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t} as UserGroup)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (accountGroupsWithAccess.length > 1) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<MultiMenu\n\t\t\t\t\t\t\t\t\tmenuButton={<Label text={`${accountGroupsWithAccess.length} User Groups`} />}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{accountGroupsWithAccess.map(id => {\n\t\t\t\t\t\t\t\t\t\tconst accountGroup = getAccountGroupById(id);\n\t\t\t\t\t\t\t\t\t\tconst accountGroupIds = accountGroupsWithAccess.filter(\n\t\t\t\t\t\t\t\t\t\t\taccess => access !== accountGroup.id,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<MultiMenuItem key={accountGroup.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Label\n\t\t\t\t\t\t\t\t\t\t\t\t\ttext={accountGroup.displayName || accountGroup.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonDelete={() => onSaveAccess(accountGroupIds, item)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</MultiMenuItem>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</MultiMenu>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst accountGroup = getAccountGroupById(accountGroupsWithAccess[0]);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Label\n\t\t\t\t\t\t\t\t\ttext={accountGroup.displayName || accountGroup.name}\n\t\t\t\t\t\t\t\t\tonDelete={() => onEditLastAccess(item)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: null,\n\t\thasAuthorities([['DELETE_NOTIFICATION_TEMPLATE'], ['READ_ACCOUNT_GROUP']] as string[][])\n\t\t\t? {\n\t\t\t\t\tname: 'actions',\n\t\t\t\t\tlabel: '',\n\t\t\t\t\twidth: '10%',\n\t\t\t\t\talign: 'right' as const,\n\t\t\t\t\trender: (template: NotificationTemplate) => (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{hasAuthorities([['READ_ACCOUNT_GROUP']] as string[][]) && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tnaked\n\t\t\t\t\t\t\t\t\tonClick={() => onEditAccess(template)}\n\t\t\t\t\t\t\t\t\tdata-testid=\"edit-notification-template-access-button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<img className=\"di icon\" src={iconDark} alt=\"key\" />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{hasAuthorities(['DELETE_NOTIFICATION_TEMPLATE'] as string[]) && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tnaked\n\t\t\t\t\t\t\t\t\tonClick={() => onDeleteTemplate(template)}\n\t\t\t\t\t\t\t\t\tdata-testid=\"delete-notification-template-button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon del />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: null,\n\t].filter(nonNull);\n}\n","import type {NotificationTemplate} from '@deviceinsight/ng-ui-api-client';\nimport {Button, Modal} from '@deviceinsight/ng-ui-basic-components';\nimport {InfoBox} from '@deviceinsight/ng-ui-components';\n\nimport warning_icon from 'assets/svg/icon_warning_triangle.svg';\nimport {Trans, useTranslation} from 'i18n';\nimport {hasAuthorities} from 'utils/hasAuthorities';\n\ntype Props = {\n\tonCancel: () => void;\n\tonSave: (accountGroupIds: number[], template: NotificationTemplate) => Promise<void>;\n\ttemplate: NotificationTemplate;\n};\n\nfunction AccessInfoModal({onCancel, onSave, template}: Props) {\n\tconst {t} = useTranslation();\n\tconst hasAccess = hasAuthorities(['ACCESS_TO_ALL_NOTIFICATION_TEMPLATES'] as string[]);\n\tconst message = hasAccess\n\t\t? t('notificationTemplate.access.delete.authorized', {\n\t\t\t\tdefaultValue:\n\t\t\t\t\t\"You are about to remove all User Groups from a Template. Please note that for all other Users who don't have such Authorities like you (ACCESS_TO_ALL_NOTIFICATION_TEMPLATES), this Template will then be completely hidden!\",\n\t\t\t})\n\t\t: t('notificationTemplate.access.delete.unauthorized', {\n\t\t\t\tdefaultValue:\n\t\t\t\t\t\"You are about ot remove the last User Groups from a Template. Please note that you wouldn't be able to see it as you do not have the required Authorities. Please contact your Administrator.\",\n\t\t\t});\n\treturn (\n\t\t<Modal\n\t\t\tonOutsideClick={onCancel}\n\t\t\theader={\n\t\t\t\t<Trans i18nKey=\"notificationTemplate.access.delete.modal.title\">\n\t\t\t\t\tRemove all authorised User Groups from this Template\n\t\t\t\t</Trans>\n\t\t\t}\n\t\t\tcontent={<InfoBox type={hasAccess ? 'warning' : 'error'} icon={warning_icon} message={message} />}\n\t\t\tfooter={\n\t\t\t\t<>\n\t\t\t\t\t{hasAccess && (\n\t\t\t\t\t\t<Button onClick={() => onSave([], template)}>\n\t\t\t\t\t\t\t<Trans i18nKey=\"general.actions.save\">Save</Trans>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t<Button onClick={() => onCancel()}>\n\t\t\t\t\t\t<Trans i18nKey=\"general.actions.cancel\">Cancel</Trans>\n\t\t\t\t\t</Button>\n\t\t\t\t</>\n\t\t\t}\n\t\t/>\n\t);\n}\n\nexport default AccessInfoModal;\n","import {flatten, unionBy} from 'lodash';\nimport {type ComponentType, useCallback, useContext, useEffect, useState} from 'react';\nimport {useLocation} from 'react-router-dom';\n\nimport {\n\tdeleteEmailTemplate,\n\tfetchEmailTemplateAccessById,\n\tfetchEmailTemplates,\n\tfetchUserGroupById,\n\ttype NotificationTemplate,\n\ttype PaginationSettings,\n\ttype UserGroup,\n\tupdateEmailTemplate,\n} from '@deviceinsight/ng-ui-api-client';\nimport {type ConfirmProps, withConfirm} from '@deviceinsight/ng-ui-basic-components';\nimport {ContentHeader, messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport {ReactableClientSidePaginationWithSizeSave} from 'components/reactable/ReactableClientSidePaginationWithSizeSave';\nimport {ContextInfoContext} from 'contexts/contextInfo/ContextInfoContext';\nimport {Trans} from 'i18n';\nimport {hasAuthorities} from 'utils/hasAuthorities';\nimport {nonNull} from 'utils/tsUtils';\nimport {SidebarElementsCreateButton} from '../../utils/portalAdminUtils';\nimport getColumnDefinitions from './getColumnDefinitions';\nimport AccessEditModal from './templateForm/AccessEditModal';\nimport AccessInfoModal from './templateForm/AccessInfoModal';\n\nconst INITIAL_PAGINATION_SETTINGS: PaginationSettings = {\n\tpage: 0,\n\tsize: 10,\n\tsort: {\n\t\tproperty: 'name',\n\t\tdirection: 'ASC',\n\t},\n};\n\nconst FETCHING_PARAMS = {\n\tlocale: 'null',\n\tpage: 0,\n\tsize: 2000,\n};\n\nasync function fetchEmailTemplatesWithAccesses(): Promise<NotificationTemplate[]> {\n\tconst emailTemplates = await fetchEmailTemplates(FETCHING_PARAMS);\n\treturn await Promise.all(\n\t\temailTemplates.map(async template => {\n\t\t\tconst {accountGroupIds: accountGroupsWithAccess} = await fetchEmailTemplateAccessById(template.id);\n\t\t\treturn Promise.resolve({\n\t\t\t\t...template,\n\t\t\t\taccountGroupsWithAccess,\n\t\t\t\ttype: 'email',\n\t\t\t} as NotificationTemplate);\n\t\t}),\n\t);\n}\n\nfunction TemplatesListPage({confirm}: ConfirmProps) {\n\tconst {setContextInfo} = useContext(ContextInfoContext);\n\tconst {pathname} = useLocation();\n\tconst [accountGroups, setAccountGroups] = useState<UserGroup[]>([]);\n\tconst [loading, setLoading] = useState<boolean>(true);\n\tconst [editModalVisible, setEditModalVisible] = useState<boolean>(false);\n\tconst [infoModalVisible, setInfoModalVisible] = useState<boolean>(false);\n\tconst [templates, setTemplates] = useState<NotificationTemplate[]>([]);\n\tconst [template, setTemplate] = useState<NotificationTemplate | null | undefined>();\n\tconst tooltip = (\n\t\t<Trans i18nKey=\"portalAdmin.sidebarElements.templates.create\">Create new notification template</Trans>\n\t);\n\tconst updateHeader = useCallback(\n\t\t(templates: NotificationTemplate[]) => {\n\t\t\tsetContextInfo({\n\t\t\t\ttype: 'search',\n\t\t\t\telements: templates.length,\n\t\t\t\ttotalElements: templates.length,\n\t\t\t\ttotalElementsAccurate: undefined,\n\t\t\t\tcontext: 'notificationtemplates',\n\t\t\t\tpathname,\n\t\t\t});\n\t\t},\n\t\t[pathname, setContextInfo],\n\t);\n\n\tasync function deleteTemplate(template: NotificationTemplate) {\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tconst templatesToDelete = await fetchEmailTemplates({\n\t\t\t\tname: template.name,\n\t\t\t\tpage: 0,\n\t\t\t\tsize: 2000,\n\t\t\t});\n\t\t\tawait Promise.all(templatesToDelete.map(template => deleteEmailTemplate(template.id)));\n\t\t\tconst updatedTemplates = templates.filter(tpl => tpl.name !== template.name);\n\t\t\tsetTemplates(updatedTemplates);\n\t\t\tupdateHeader(updatedTemplates);\n\t\t} catch (e) {\n\t\t\tconsole.error('error occured while trying to delete the template', e);\n\t\t\tmessageBoxError(\n\t\t\t\t<Trans i18nKey=\"notificationTemplate.list.deleteTemplate.error\">\n\t\t\t\t\tAn error occurred while trying to delete the template\n\t\t\t\t</Trans>,\n\t\t\t);\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}\n\n\tfunction handleDeleteTemplate(template: NotificationTemplate) {\n\t\tconfirm(\n\t\t\t{\n\t\t\t\tid: 'notificationTemplate.list.confirmDeleteTitle',\n\t\t\t\tdefaultValue: 'Delete template',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'notificationTemplate.list.confirmDeleteMessage',\n\t\t\t\tdefaultValue: 'Do you really want to delete this template?',\n\t\t\t},\n\t\t).then(() => deleteTemplate(template));\n\t}\n\n\tasync function handleSaveAccess(accountGroupsWithAccess: number[], template?: NotificationTemplate): Promise<any> {\n\t\tif (!template) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetLoading(true);\n\n\t\ttry {\n\t\t\tconst templatesToUpdate = await fetchEmailTemplates({\n\t\t\t\tname: template.name,\n\t\t\t\tpage: 0,\n\t\t\t\tsize: 2000,\n\t\t\t});\n\t\t\tconst updatedTemplate = {...template, accountGroupsWithAccess};\n\t\t\tconst updatedTemplates = unionBy([updatedTemplate], templates, 'id');\n\t\t\tawait Promise.all(\n\t\t\t\ttemplatesToUpdate.map(template =>\n\t\t\t\t\tupdateEmailTemplate({\n\t\t\t\t\t\t...template,\n\t\t\t\t\t\taccountGroupsWithAccess,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst accountGroupIds = [\n\t\t\t\t...new Set(\n\t\t\t\t\tflatten(\n\t\t\t\t\t\tupdatedTemplates.map(({accountGroupsWithAccess}) => accountGroupsWithAccess).filter(Boolean),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t] as number[];\n\t\t\tconst accountGroups = await Promise.all(accountGroupIds.map(id => fetchUserGroupById(id)));\n\t\t\tsetTemplates(updatedTemplates);\n\t\t\tsetAccountGroups(accountGroups);\n\t\t\tupdateHeader(updatedTemplates);\n\t\t} catch (e) {\n\t\t\tconsole.error('error occured while trying to save access on template: ', e);\n\t\t\tmessageBoxError(\n\t\t\t\t<Trans i18nKey=\"notificationTemplate.list.updateTemplate.error\">\n\t\t\t\t\tAn error occured while trying to save access\n\t\t\t\t</Trans>,\n\t\t\t);\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t\tsetInfoModalVisible(false);\n\t\t\tsetEditModalVisible(false);\n\t\t}\n\t}\n\n\tfunction handleEditAccess(template: NotificationTemplate) {\n\t\tsetTemplate(template);\n\t\tsetEditModalVisible(true);\n\t}\n\n\tfunction handleEditLastAccess(template: NotificationTemplate) {\n\t\tsetTemplate(template);\n\t\tsetInfoModalVisible(true);\n\t}\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: It's ok\n\tuseEffect(() => {\n\t\tlet canceled = false;\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tconst templates = await fetchEmailTemplatesWithAccesses();\n\t\t\t\tif (canceled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetTemplates(templates);\n\t\t\t\tupdateHeader(templates);\n\n\t\t\t\tif (hasAuthorities(['READ_ACCOUNT_GROUP'] as string[])) {\n\t\t\t\t\tconst accountGroupIds = [\n\t\t\t\t\t\t...new Set(flatten(templates.map(({accountGroupsWithAccess}) => accountGroupsWithAccess))),\n\t\t\t\t\t].filter(nonNull);\n\t\t\t\t\tconst accountGroups = await Promise.all(accountGroupIds.map(id => fetchUserGroupById(id)));\n\t\t\t\t\tsetAccountGroups(accountGroups);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('error occured while trying to fetch templates: ', e);\n\t\t\t\tmessageBoxError(\n\t\t\t\t\t<Trans i18nKey=\"notificationTemplate.list.fetchTemplates.error\">\n\t\t\t\t\t\tAn error occured while trying to fetch templates\n\t\t\t\t\t</Trans>,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t})();\n\n\t\treturn () => {\n\t\t\tcanceled = true;\n\t\t\tsetContextInfo();\n\t\t};\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\treturn (\n\t\t<div className=\"template-list\">\n\t\t\t<ContentHeader\n\t\t\t\ttitle={{\n\t\t\t\t\tid: 'route.label.templates.name',\n\t\t\t\t\tdefaultValue: 'Notification Templates',\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<SidebarElementsCreateButton\n\t\t\t\ttooltip={tooltip}\n\t\t\t\tauthorities=\"WRITE_NOTIFICATION_TEMPLATE\"\n\t\t\t\tpath=\"/portaladmin/templates/create\"\n\t\t\t\tdataTestId=\"create-template-button\"\n\t\t\t/>\n\t\t\t<ReactableClientSidePaginationWithSizeSave\n\t\t\t\tcolumnDefs={getColumnDefinitions(\n\t\t\t\t\thandleDeleteTemplate,\n\t\t\t\t\thandleSaveAccess,\n\t\t\t\t\thandleEditAccess,\n\t\t\t\t\thandleEditLastAccess,\n\t\t\t\t\taccountGroups,\n\t\t\t\t)}\n\t\t\t\tuniqueItemKey={(item: NotificationTemplate) => `${item.id}`}\n\t\t\t\tpaginationSettings={INITIAL_PAGINATION_SETTINGS}\n\t\t\t\titems={templates}\n\t\t\t\tisLoading={loading}\n\t\t\t\tdata-testid=\"notification-templates-table\"\n\t\t\t\ttableName={'notificationTemplates'}\n\t\t\t/>\n\t\t\t{editModalVisible && template && (\n\t\t\t\t<AccessEditModal\n\t\t\t\t\tonCancel={() => setEditModalVisible(false)}\n\t\t\t\t\tonSave={handleSaveAccess}\n\t\t\t\t\tloading={loading}\n\t\t\t\t\ttemplate={template}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{infoModalVisible && template && (\n\t\t\t\t<AccessInfoModal\n\t\t\t\t\tonCancel={() => setInfoModalVisible(false)}\n\t\t\t\t\tonSave={handleSaveAccess}\n\t\t\t\t\ttemplate={template}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport default withConfirm(TemplatesListPage) as ComponentType;\n"],"names":["getColumnDefinitions","onDeleteTemplate","onSaveAccess","onEditAccess","onEditLastAccess","accountGroups","jsx","Trans","item","value","Link","text","subject","hasAuthorities","accountGroupsWithAccess","getAccountGroupById","id","accountGroup","MultiMenu","Label","accountGroupIds","access","MultiMenuItem","template","jsxs","Fragment","Button","iconDark","Icon","nonNull","AccessInfoModal","onCancel","onSave","t","useTranslation","hasAccess","message","Modal","InfoBox","warning_icon","INITIAL_PAGINATION_SETTINGS","FETCHING_PARAMS","fetchEmailTemplatesWithAccesses","emailTemplates","fetchEmailTemplates","fetchEmailTemplateAccessById","TemplatesListPage","confirm","setContextInfo","useContext","ContextInfoContext","pathname","useLocation","setAccountGroups","useState","loading","setLoading","editModalVisible","setEditModalVisible","infoModalVisible","setInfoModalVisible","templates","setTemplates","setTemplate","tooltip","updateHeader","useCallback","deleteTemplate","templatesToDelete","deleteEmailTemplate","updatedTemplates","tpl","e","messageBoxError","handleDeleteTemplate","handleSaveAccess","templatesToUpdate","updatedTemplate","unionBy","updateEmailTemplate","flatten","fetchUserGroupById","handleEditAccess","handleEditLastAccess","useEffect","canceled","ContentHeader","SidebarElementsCreateButton","ReactableClientSidePaginationWithSizeSave","AccessEditModal","TemplatesListPage_default","withConfirm"],"mappings":"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"}
|
|
@@ -3,9 +3,9 @@ import I from "axios";
|
|
|
3
3
|
import { useState as A, useEffect as S } from "react";
|
|
4
4
|
import { Modal as w, Button as G, Icon as N, useConfirm as K, SpinnerContainer as V } from "@deviceinsight/ng-ui-basic-components";
|
|
5
5
|
import { messageBoxError as _, ReactableWithClientSidePagination as L, ContentHeader as v } from "@deviceinsight/ng-ui-components";
|
|
6
|
-
import { u as M, a as u,
|
|
7
|
-
import { useForm as
|
|
8
|
-
import { getInitialAccountGroupAssignmentRules as
|
|
6
|
+
import { u as M, a as u, Q as R, bP as k, bQ as H, an as b } from "./setTitle-Dij-z9p9.js";
|
|
7
|
+
import { useForm as q, Controller as y } from "react-hook-form";
|
|
8
|
+
import { getInitialAccountGroupAssignmentRules as x, deleteInitialAccountGroupAssignmentRule as D, updateInitialAccountGroupAssignmentRule as O, createInitialAccountGroupAssignmentRule as F } from "@deviceinsight/ng-ui-api-client";
|
|
9
9
|
function P(t) {
|
|
10
10
|
if (I.isAxiosError(t) && t.response?.data) {
|
|
11
11
|
const { fieldErrors: n } = t.response.data;
|
|
@@ -19,7 +19,7 @@ function C({ onSubmit: t, onClose: n, value: r }) {
|
|
|
19
19
|
formState: { isSubmitting: p },
|
|
20
20
|
control: m,
|
|
21
21
|
setError: g
|
|
22
|
-
} =
|
|
22
|
+
} = q({
|
|
23
23
|
defaultValues: r ?? { name: "", displayName: "", acceptedEmailHostname: "" }
|
|
24
24
|
}), { t: c } = M(), d = {
|
|
25
25
|
required: c("userGroupAssignments.ruleModal.validation.required", {
|
|
@@ -190,12 +190,12 @@ function B({ onEditRuleClick: t, onDeleteRuleClick: n, rules: r }) {
|
|
|
190
190
|
}
|
|
191
191
|
);
|
|
192
192
|
}
|
|
193
|
-
function
|
|
193
|
+
function Q() {
|
|
194
194
|
const [t, n] = A([]), [r, l] = A(!1), [p, m] = A(null);
|
|
195
195
|
S(() => {
|
|
196
196
|
l(!0);
|
|
197
197
|
let s = !1;
|
|
198
|
-
return
|
|
198
|
+
return x().then((a) => {
|
|
199
199
|
s || (n(a), l(!1));
|
|
200
200
|
}).catch((a) => {
|
|
201
201
|
s || (m(a), l(!1));
|
|
@@ -215,7 +215,7 @@ function z() {
|
|
|
215
215
|
async function c(s, a) {
|
|
216
216
|
try {
|
|
217
217
|
l(!0);
|
|
218
|
-
const i = await
|
|
218
|
+
const i = await O(s, a);
|
|
219
219
|
n(t.map((o) => o.name === s ? i : o));
|
|
220
220
|
} finally {
|
|
221
221
|
l(!1);
|
|
@@ -223,7 +223,7 @@ function z() {
|
|
|
223
223
|
}
|
|
224
224
|
async function d(s) {
|
|
225
225
|
try {
|
|
226
|
-
l(!0), await
|
|
226
|
+
l(!0), await D(s), n(t.filter((a) => a.name !== s));
|
|
227
227
|
} finally {
|
|
228
228
|
l(!1);
|
|
229
229
|
}
|
|
@@ -231,7 +231,7 @@ function z() {
|
|
|
231
231
|
return { rules: t, isLoading: r, error: p, createRule: g, editRule: c, deleteRule: d };
|
|
232
232
|
}
|
|
233
233
|
function te() {
|
|
234
|
-
const { isLoading: t, rules: n, error: r, createRule: l, editRule: p, deleteRule: m } =
|
|
234
|
+
const { isLoading: t, rules: n, error: r, createRule: l, editRule: p, deleteRule: m } = Q(), [g, c] = A(!1), [d, s] = A(null), a = K(), { t: i } = M();
|
|
235
235
|
S(() => {
|
|
236
236
|
r && I.isAxiosError(r) && (_(
|
|
237
237
|
/* @__PURE__ */ e(u, { i18nKey: "userGroupAssignments.fetchError", children: "An error occurred while loading the initial user group assignment rules" })
|
|
@@ -294,4 +294,4 @@ function te() {
|
|
|
294
294
|
export {
|
|
295
295
|
te as default
|
|
296
296
|
};
|
|
297
|
-
//# sourceMappingURL=UserGroupAssignments-
|
|
297
|
+
//# sourceMappingURL=UserGroupAssignments-2ZrZXU8K.js.map
|