`\n : `
`;\n },\n },\n { id:'kid', field: 'kid', text: t('registrationReports.grid.kid'), flex: 1},\n { id:'lastName', field: 'lastName', text: t('registrationReports.grid.lastName'), flex: 1},\n { id:'firstName', field: 'firstName', text: t('registrationReports.grid.firstName'), flex: 1},\n {\n id: 'infoButton',\n field: 'infoButton',\n text: t('registrationReports.grid.info'),\n width: 70,\n sortable: false,\n minWidth: 70,\n type: \"template\",\n template: () => {\n return `
`;\n },\n },\n {\n id:'companyName',\n field: \"companyName\",\n text: t(\"popups.registrationReports.grid.company\"),\n flex:1,\n type: \"template\",\n template: ({record}:any)=>{\n if(isNullOrUndefined(record.data.companyName)) record.data.companyName = globalStore.settings.systemCompanySettings?.companyName;\n\t\t\t\t\treturn StringHelper.xss`${record.data.companyName ?? \"\"}`;\n },\n },\n {\n id:'lastLocationName',\n field: 'lastLocationName',\n text: t('registrationReports.grid.location'),\n flex: 1\n },\n {\n id: 'lastRegisteredLocationDate',\n field : 'lastRegisteredLocationDate',\n text: t('registrationReports.grid.register'),\n flex : 1,\n sortable: true,\n type: 'template',\n template: ({record}:any)=>{\n const reg = DateToStringHelper(new Date(record.data.lastRegisteredLocationDate));\n return `${reg}`;\n }\n },\n {\n id: 'lastUnRegisteredLocationDate',\n field: 'lastUnRegisteredLocationDate',\n text: t('registrationReports.grid.unregister'),\n flex: 1,\n sortable: true,\n type: 'template',\n template: ({record})=>{\n const unreg = NullOrUndefinedHelper(record.data.lastUnRegisteredLocationDate)\n ? \"\"\n : DateToStringHelper(new Date(record.data.lastUnRegisteredLocationDate));\n return `${unreg}`;\n }\n },\n { id:'lastGuestCount', field: 'lastGuestCount',\n text: t('registrationReports.grid.guestCount'),\n width: 100,\n },\n { id:'email', field: 'email', text: t('registrationReports.grid.email'), flex: 1 },\n { id:'phoneNumber', field: 'phoneNumber', text: t('registrationReports.grid.phoneNumber'), flex: 1 },\n {\n id:'activityText',\n field: 'activityText',\n sortable: false,\n hidden: !globalStore.settings.activitySettings?.activitesEnabled,\n text: '',\n width : 36,\n type: \"template\",\n tooltipRenderer : ({ record }) =>{\n return isNullOrUndefined(record.activityText)\n ? \"\"\n : StringHelper.xss`
${t('registrationReports.grid.activity')}${record.activityText ?? \"\"}
`;\n },\n template: ({record}) => {\n return isNullOrUndefined(record.activityText)\n ? \"\"\n : record.activityText === defaultActivityText.value && globalStore.settings.activitySettings?.defaultActivitExchangeable\n ? `
`\n : `
`;\n },\n },\n {\n id:'disdi',\n text\t: \"\",\n width : 36,\n type\t: 'template',\n align: \"center\",\n hidden: !permissionService.userHasPermission(\"Disdi.Read\"),\n resizable: false,\n filterable: false,\n template : ({record}:any)=>{\n const currentRegLocation = record.data.registeredLocationInfo[0];\n return currentRegLocation.hasDisdi && record.data.disdiCount > 0\n ? `
`\n : currentRegLocation.hasDisdi && record.data.disdiCount === 0\n ? `
`\n : \"\";\n }\n },\n {\n id:'unregister',\n field: 'unregister',\n text: '',\n sortable: false,\n width : 36,\n type: \"template\",\n template: ({record}) => {\n if(permissionService.userHasPermission(\"RegistrationReport.User.Logout\")) {\n return record.data.isActive ? `
` : \"\";\n } else {\n return \"\";\n }\n },\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.register], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n async cellClick({column, record}) {\n if (column.data.field === 'infoButton' ) {\n if(permissionService.userHasPermission(\"RegistrationReport.Read\")) {\n globalStore.openPopup({\n data: record.data,\n action: globalStore.closeModal,\n title: t('registrationReports.userHistoryPopup'),\n type: PopupType.registrationUserHistory\n }, true);\n }\n return;\n }\n\n if (column.data.field === 'unregister') {\n const openReg = record.data.registeredLocationInfo.find((opr:any) => opr.lastUnRegisteredLocationDate === null);\n const answer = await dialog\n .okText(t(\"global.unregister\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"registrationReports.confirmUnregister\", { name:record.data.fullName, location:openReg.locationName}));\n\n if (answer){\n const unregResp = await registrationService.postUnRegisterUser(record.data.id, openReg.locationId);\n if(unregResp === null || unregResp === undefined || unregResp?.statusCode !== 0){\n ErrorHandler.handleError(unregResp, ErrorLocationType.table);\n return;\n }\n\n globalStore.showSuccess(t('popups.register.unregistered'));\n }\n }\n\n if (column.data.field === 'activityText' && !isNullOrUndefined(record.data.activityText)){\n if(record.data.activityText === defaultActivityText.value && globalStore.settings.activitySettings?.defaultActivitExchangeable){\n globalStore.openPopup({\n data: record.data,\n action: changeActivityForRegistration,\n resetButton: false,\n title:$t(\"popups.registrationReports.changeActivity.title\"),\n type:PopupType.changeActivityForRegistration\n })\n }\n }\n\n if(column.data.id === 'disdi'){\n const currentRegLocation = record.registeredLocationInfo[0];\n if (!currentRegLocation.hasDisdi || (currentRegLocation.hasDisdi && record.disdiCount === 0)) return;\n await router.push(`disdi/${TableType[TableType.register]}/${+record.registeredLocationInfo[0].registrationId}`)\n }\n },\n },\n}\nconst gridConfig = reactive(useGridConfig);\n\nconst defaultActivityText = ref(\"\");\nconst getDefaultActivityText = async ()=>{\n const defaultActivityResp = await settingService.getSystemSettings();\n // silent fail :(\n if (defaultActivityResp === null || defaultActivityResp === undefined || defaultActivityResp.statusCode !== 0) return;\n\n return defaultActivityResp.settingInfo\n //@ts-expect-error\n .find((ss:GroupedSystemSettings) => ss.name === \"Tätigkeiten\")?.children\n .find((s:SystemSetting) => s.name === \"Tätigkeitsgruppen: Unbestimmte Tätigkeit\")\n .value;\n}\n\nconst reapplyFilterAndHiddenCols = async ()=>{\n // apply filters\n gridStore.filter({\n id: \"userFilter\",\n filterBy: FilterService.buildFilter(TableType[TableType.register])\n });\n\n // apply hidden cols\n for(const c of grid.value.instance.value.columns.storage.values){\n const needsHiding = globalStore.userPreferences.userHiddenColumns.some((thc) => thc.attributeName === c.data.field && thc.tableName === TableType[TableType.register]);\n\n if(needsHiding && !c.hidden) {\n c.hide();\n }\n else if(!needsHiding && c.hidden && !permissionColumn.includes(c.id)) {\n c.show();\n }\n }\n\n globalStore.reorderColumns(TableType[TableType.register]);\n}\n\nconst changeActivityForRegistration = async()=>{\n const registration = globalStore.modal.contentObject as RegisteredUserInfo;\n\n //check if it is still default activity, if so dont update and leave popup open\n if(registration.activityText === defaultActivityText.value) return;\n\n // update corresponding open reg in registeredLocationInfo list\n // @ts-expect-error\n registration.registeredLocationInfo[0].activityText = registration.activityText;\n\n const changeResp = await registrationService.postChangeActivityForRegistration(registration.registeredLocationInfo[0].registrationId, registration.activityId, registration.activityText);\n if (changeResp === null || changeResp === undefined || changeResp.statusCode !== 0) {\n ErrorHandler.handleError(changeResp, ErrorLocationType.popup);\n return;\n }\n\n gridStore.add(registration);\n\n await reapplyFilterAndHiddenCols();\n\n globalStore.closeModal();\n globalStore.showSuccess(t('global.saved'));\n}\n\nconst setGridData = async ()=> {\n const regReportsResp = await registrationService.getRegistrationReports();\n if (regReportsResp === null || regReportsResp === undefined || regReportsResp.statusCode !== 0) {\n ErrorHandler.handleError(regReportsResp, ErrorLocationType.table);\n return;\n }\n\n //convert data to specific properties to make grid able to sort the data\n const convertedData = regReportsResp.registrationInfo.map(r => {\n r.lastRegisteredLocationDate = r.registeredLocationInfo[0].lastRegisteredLocationDate;\n r.lastUnRegisteredLocationDate = r.registeredLocationInfo[0].lastUnRegisteredLocationDate;\n\n if(NullOrUndefinedHelper(r.id)) r.id = Guid.create();\n\n return r\n })\n\n gridStore.setStoreData(convertedData);\n\n await reapplyFilterAndHiddenCols();\n\n globalStore.reorderColumns(TableType[TableType.register]);\n\n globalStore.closeModal();\n};\n\nconst setDisdiColumVisibility = async() =>{\n const disdiIsOn = globalStore.settings.disdiSettings?.disdi !== DisdiStateType.NoDISDI;\n\n if(!disdiIsOn){\n const hasDisdiCol = grid.value.instance.value.columns.getById(\"disdi\");\n hasDisdiCol.hidden = true;\n }\n}\n\nonMounted(async ()=>{\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n defaultActivityText.value = await getDefaultActivityText();\n\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n await setGridData();\n await setDisdiColumVisibility();\n\n // stop spinner\n globalStore.gridDataIsLoading = false;\n});\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)(\"registrationReports.title\")), 1),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", _hoisted_4, [\n _createVNode(Autorefresh, { onClick: toggleAutoRefresh })\n ])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_5, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_6, [\n _createElementVNode(\"div\", _hoisted_7, [\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n onClick: openRegisterPopup,\n title: _unref(t)('locationsReports.newLocationReport')\n }, _hoisted_10, 8, _hoisted_8)), [\n [_directive_permission, 'Registration.Manual']\n ]),\n _createElementVNode(\"div\", _hoisted_11, [\n _createVNode(_unref(GridInputFilter), {\n gridStore: _unref(gridStore),\n popupType: _unref(PopupType).registrationFilterPopup,\n hideFilterButton: false\n }, null, 8, [\"gridStore\", \"popupType\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_12, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ])\n ]))\n}\n}\n\n})","import script from \"./RegistrationReports.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RegistrationReports.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import {LocationInfo} from \"@/models/location/LocationInfo\";\n\nexport class SafetyInstructionInfo {\n isAccepted:boolean = false;\n coupledLocationId?:number = undefined;\n id:number = -1;\n displayOrder:number = 0;\n name:string = \"\";\n text:string = \"\";\n safetyInstructionLocations:Array
= [];\n\n constructor(id?:number, index?:number, name?:string) {\n this.isAccepted = false;\n this.coupledLocationId = undefined;\n this.id = id ?? -1;\n this.displayOrder = index ?? 0;\n this.name = name ?? \"\";\n this.text = \"\";\n this.safetyInstructionLocations = [];\n }\n}","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = { class: \"contentBox\" }\nconst _hoisted_3 = { class: \"block w-full\" }\nconst _hoisted_4 = { class: \"flex mb-4\" }\nconst _hoisted_5 = [\"title\"]\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_7 = [\n _hoisted_6\n]\nconst _hoisted_8 = [\"disabled\", \"title\"]\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-downlaod\" }, null, -1)\nconst _hoisted_10 = [\n _hoisted_9\n]\nconst _hoisted_11 = [\"disabled\", \"title\"]\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_13 = [\n _hoisted_12\n]\nconst _hoisted_14 = { class: \"ml-auto\" }\nconst _hoisted_15 = { class: \"text-center\" }\n\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport {BryntumGrid} from \"@bryntum/grid-vue-3\";\nimport {Menu, Store} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport {$t} from \"@/utilities/i18n/config\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport dialog from \"@/dialog\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {GeneralResponse} from \"@/models/api/Responses\";\nimport Error from \"@/components/Error\";\nimport {SafetyInstructionInfo} from \"@/models/safetyInstruction/SafetyInstructionInfo\";\nimport {SafetyinstructionCsvExport} from \"@/models/CsvExportModels\";\nimport exportFromJSON from \"export-from-json\";\nimport {useI18n} from \"vue-i18n\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {SafetyInstructionService} from \"@/utilities/services/entities/SafetyInstructionService\";\nimport {LocationService} from \"@/utilities/services/entities/LocationService\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'SafetyInstructions',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\nconst { t } = useI18n();\nconst locationService = new LocationService();\nconst safetyInstructionService = new SafetyInstructionService();\nconst permissionService = new PermissionService();\n\nlet selectedSafetyInstruction = ref([]);\nlet selectableLocations = ref([]);\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedSafetyInstruction.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"safetyInstructions.confirmDeletionMulti\", { count:selectedSafetyInstruction.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const si of selectedSafetyInstruction.value){\n const resp = await safetyInstructionService.deleteSafetyInstruction(si.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:si.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage}px`;\n};\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n relayStoreEvents: true,\n enableTextSelection: true,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n columns : {\n data: [\n { id:'name', field: 'name', text: t('safetyInstructions.grid.name'), flex: 1, },\n { id:'text', field: 'text', text: t('safetyInstructions.grid.text'), flex: 1, },\n {\n id:'locations',\n field: 'locations',\n text: '',\n width : 36,\n\t\t\t\tsortable: false,\n type: \"template\",\n template: ({ record }) => {\n if(record.data.safetyInstructionLocations.length > 0)\n\t\t\t\t\t\treturn `
`;\n\t\t\t\t\treturn\n\n\t\t\t\t},\n },\n {\n id:'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.safetyInstruction], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n selectionChange(event) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedSafetyInstruction.value = selectedSafetyInstruction.value.concat(event.selected.map(sr => sr.data))\n selectedSafetyInstruction.value = selectedSafetyInstruction.value.filter(s => !event.deselected.map(sr => sr.data).some(sr => s?.id === sr?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n cellClick({column, record}) {\n if (column.data.field === 'locations' && record.data.safetyInstructionLocations.length > 0) {\n globalStore.openPopup({\n data: record.data,\n action: globalStore.closeModal,\n title: t('safetyInstructions.title'),\n type: PopupType.safetyInstructionLocationsPopup\n });\n }\n },\n },\n height: currentWindowHeight,\n}\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: t(\"global.edit\"),\n cls: 'color',\n icon: 'icon-editieren',\n hidden: !permissionService.userHasPermission(\"SafetyInstruction.Edit\"),\n weight: 100,\n onItem : ({ menu }) => {\n globalStore.openPopup({\n data:menu.record,\n action:addOrUpdateSafetyInstruction,\n resetButton:false,\n title:$t(\"safetyInstructions.edit\"),\n type:PopupType.safetyInstructions\n });\n }\n },\n {\n text : t(\"global.delete\"),\n cls\t: 'color',\n icon: 'icon-loeschen',\n hidden: !permissionService.userHasPermission(\"SafetyInstruction.Delete\"),\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"safetyInstructions.confirmDeletionSingle\", {name: menu.record.name}));\n\n if (answer) {\n const resp = await safetyInstructionService.deleteSafetyInstruction(menu.record.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n gridStore.applyChangeset({removed:[{id:menu.record.id}]});\n\n globalStore.showSuccess(t('global.deleted'));\n }\n }\n }\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\nconst gridConfig = reactive(useGridConfig);\n\n\nconst newSafetyInstruction = () => {\n const safetyInstruction = new SafetyInstructionInfo();\n\n globalStore.openPopup({\n data: safetyInstruction,\n action: addOrUpdateSafetyInstruction,\n resetButton: false,\n title: $t(\"safetyInstructions.new\"),\n type: PopupType.safetyInstructions\n });\n}\n\nconst addOrUpdateSafetyInstruction = async () => {\n const safetyInstruction = globalStore.modal.contentObject as SafetyInstructionInfo;\n\n const safetyInstructionResp = await safetyInstructionService.addOrUpdateSafetyInstruction(safetyInstruction);\n if (safetyInstructionResp === null || safetyInstructionResp === undefined || safetyInstructionResp.statusCode !== 0){\n ErrorHandler.handleError(safetyInstructionResp as GeneralResponse, ErrorLocationType.popup);\n return;\n }\n\n if(safetyInstruction.id < 0) safetyInstruction.id = safetyInstructionResp.id;\n // fix selection when it was an update -> replace old value in selected-array\n else if(selectedSafetyInstruction.value.some(el => el.id === safetyInstruction.id)) {\n selectedSafetyInstruction.value = selectedSafetyInstruction.value.filter(el => el.id !== safetyInstruction.id);\n selectedSafetyInstruction.value.push(safetyInstruction);\n }\n\n gridStore.add(safetyInstruction);\n gridStore.sort(gridStore.sorters);\n\n globalStore.closeModal();\n globalStore.showSuccess(t('global.saved'));\n}\n\nconst exportCSV = () => {\n let data = selectedSafetyInstruction.value?.length > 0 ? selectedSafetyInstruction.value : gridStore.records;\n\n // remove unnecessary properties from csv\n data = data.map((item)=> new SafetyinstructionCsvExport(item.data ?? item));\n\n const fileName = $t('safetyInstructions.csvDownloadFilename');\n const exportType = exportFromJSON.types.csv;\n\n exportFromJSON({\n data:data,\n fileName:fileName,\n exportType:exportType,\n });\n};\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n const safetyInstructionsResp = await safetyInstructionService.getSafetyInstructions(\"display\");\n\n if (safetyInstructionsResp === null || safetyInstructionsResp === undefined || safetyInstructionsResp.statusCode !== 0) {\n ErrorHandler.handleError(safetyInstructionsResp, ErrorLocationType.table);\n return;\n }\n\n gridStore.setStoreData(safetyInstructionsResp.safetyInstructionInfo);\n selectableLocations.value = await locationService.getLocations(\"selectable\", ErrorLocationType.table);\n\n globalStore.reorderColumns(TableType[TableType.safetyInstruction]);\n\n globalStore.closeModal();\n // stop spinner\n globalStore.gridDataIsLoading = false;\n};\n\nonMounted(async () => {\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n});\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)(\"safetyInstructions.title\")), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", _hoisted_4, [\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n onClick: newSafetyInstruction,\n title: _unref(t)('safetyInstructions.new')\n }, _hoisted_7, 8, _hoisted_5)), [\n [_directive_permission, 'SafetyInstruction.Create']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedSafetyInstruction).some(()=>true),\n onClick: exportCSV,\n title: _unref(t)('safetyInstructions.csvDownload')\n }, _hoisted_10, 8, _hoisted_8)), [\n [_directive_permission, 'SafetyInstruction.Create']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedSafetyInstruction).some(()=>true),\n onClick: deleteSelection,\n title: _unref(t)('global.delete')\n }, _hoisted_13, 8, _hoisted_11)), [\n [_directive_permission, 'SafetyInstruction.Delete']\n ]),\n _createElementVNode(\"div\", _hoisted_14, [\n _createVNode(_unref(GridInputFilter), {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_15, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ])\n ], 64))\n}\n}\n\n})","import script from \"./SafetyInstructions.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SafetyInstructions.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = { class: \"contentBox\" }\nconst _hoisted_3 = { class: \"block w-full\" }\nconst _hoisted_4 = { class: \"flex mb-4\" }\nconst _hoisted_5 = [\"title\"]\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_7 = [\n _hoisted_6\n]\nconst _hoisted_8 = [\"disabled\", \"title\"]\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-downlaod\" }, null, -1)\nconst _hoisted_10 = [\n _hoisted_9\n]\nconst _hoisted_11 = [\"disabled\", \"title\"]\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_13 = [\n _hoisted_12\n]\nconst _hoisted_14 = [\"disabled\", \"title\"]\nconst _hoisted_15 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-status_bald_inaktiv\" }, null, -1)\nconst _hoisted_16 = [\n _hoisted_15\n]\nconst _hoisted_17 = { class: \"ml-auto\" }\nconst _hoisted_18 = { class: \"text-center\" }\n\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport {BryntumGrid} from \"@bryntum/grid-vue-3\";\nimport {Menu, Store, StringHelper} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {UserInfo} from \"@/models/user/UserInfo\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport FilterService from \"@/utilities/services/FilterService\";\nimport exportFromJSON from \"export-from-json\";\nimport {UserCsvExport} from \"@/models/CsvExportModels\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport dialog from \"@/dialog\";\nimport {GeneralResponse} from \"@/models/api/Responses\";\nimport {$t} from \"@/utilities/i18n/config\";\nimport Error from \"@/components/Error\";\nimport {useI18n} from \"vue-i18n\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage, permissionColumn} from \"@/AppConfig\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\nimport {UserService} from \"@/utilities/services/entities/UserService\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Users',\n setup(__props) {\n\nconst { t } = useI18n();\nconst userService = new UserService();\nconst permissionService = new PermissionService();\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\n\nlet selectedUsers = ref([]);\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedUsers.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"users.confirmDeletionMulti\", { count:selectedUsers.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const user of selectedUsers.value){\n const resp = await userService.deleteUser(user.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:user.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage}px`;\n};\n\nconst newUser = async () => {\n const user = new UserInfo();\n\n // call API-Service and set identificationNumber from next free Id\n const nextIdResp = await userService.getNextFreeUserId();\n if(nextIdResp === null || nextIdResp === undefined || nextIdResp?.statusCode !== 0){\n ErrorHandler.handleError(nextIdResp, ErrorLocationType.table);\n return;\n }\n\n user.identificationNumber = nextIdResp.identifikationNumber;\n\n globalStore.openPopup({\n data:user,\n action:addOrUpdateUser,\n resetButton:false,\n title:$t(\"popups.userEditor.title.new\"),\n type:PopupType.userPopup\n });\n}\n\nconst exportCSV = () => {\n let data = selectedUsers.value;\n\n // remove unnecessary properties from csv\n data = data.map((item)=> new UserCsvExport(item.data ?? item));\n\n const fileName = $t('users.csvDownloadFilename');\n const exportType = exportFromJSON.types.csv;\n\n exportFromJSON({\n data:data,\n fileName:fileName,\n exportType:exportType,\n });\n};\n\nconst addOrUpdateUser = async () => {\n const user = globalStore.modal.contentObject as UserInfo;\n // cleaning up empty string or null string\n user.kid = NullOrUndefinedHelper(user.kid) ? null : user.kid;\n\n const userResp = await userService.addOrUpdateUsers(user);\n if (userResp === null || userResp === undefined || userResp.statusCode !== 0){\n ErrorHandler.handleError(userResp as GeneralResponse, ErrorLocationType.popup);\n return;\n }\n\n if (user.id === \"\") {\n user.id = userResp.id\n user.isActive = true;\n }\n // fix selection when it was an update -> replace old value in selected-array\n else if (selectedUsers.value.some(el => el.id === user.id)) {\n selectedUsers.value = selectedUsers.value.filter(el => el.id !== user.id);\n selectedUsers.value.push(user);\n }\n\n user.fullName = `${user.firstName} ${user.lastName}`;\n\n // in case of an update bryntum automatically replaces the entry with the same ID\n gridStore.add(user);\n // reapply sorting\n gridStore.sort(gridStore.sorters);\n // reapply filtering\n gridStore.filter({\n id: \"userFilter\",\n filterBy: FilterService.buildFilter(TableType[TableType.user])\n });\n\n globalStore.closeModal();\n globalStore.showSuccess(t('global.saved'));\n}\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n height: currentWindowHeight,\n enableTextSelection: true,\n cellTooltipFeature: {\n hoverDelay : 300,\n textContent : true,\n hideOnDelegateChange: true,\n },\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n relayStoreEvents: true, // triggers important event (globalStore-/data-related) to get bryntum stores !\n columns :{\n data: [\n { id:'identificationNumber', field : 'identificationNumber', text: t('users.grid.identificationNumber'), flex : 2 },\n { id:'kid', field : 'kid', text: t('users.grid.kid'), flex : 1 },\n {\n id:'fullName',\n field : 'fullName',\n text: t('users.grid.fullName'),\n flex : 1,\n type: 'template',\n template: ({ record }) => {\n\t\t\t\t\treturn StringHelper.xss`${record.data.fullName ?? \"\"}
`;\n },\n },\n { id:'firstName', field : 'firstName', text: t('users.grid.firstName'), flex : 1 },\n { id:'lastName', field : 'lastName', text: t('users.grid.lastName'), flex : 1 },\n {\n id:'roles',\n field : 'roles',\n text: t('users.grid.roles'),\n flex : 1,\n type: 'template',\n template: ({ record }) => {\n // fix property array from [object] to [string] (happens after edititng user)\n if(record.data.roles.some(r => r.name !== undefined)) record.data.roles = record.data.roles.map(r => r.name)\n return record.data.roles?.join(\", \");\n },\n },\n { id:'info', field : 'info', text: t('users.grid.info'), width: 100 },\n {\n id:'isActive',\n field : 'isActive',\n text: t('users.grid.isActive'),\n width: 36,\n type: 'template',\n tooltipRenderer: ({record}) => {\n if(record.data.isActive) {\n return StringHelper.xss`${t('users.grid.activeUser')}`\n } else {\n return StringHelper.xss`${t('users.grid.inactiveUser')}`\n }\n },\n template: ({ record }) => {\n if(record.data.isActive) {\n return \"\";\n } else {\n return '
';\n }\n },\n },\n {\n id:'email',\n field : 'email',\n text: t('users.grid.email'),\n flex : 1,\n editor : false,\n type: 'template',\n template: ({ record }) => {\n if (NullOrUndefinedHelper(record.data.email)) return \"\"\n\t\t\t\t\treturn StringHelper.xss`${record.data.email ?? \"\"}`;\n },\n },\n {\n id:'phoneNumber',\n field : 'phoneNumber',\n text: t('users.grid.phoneNumber'),\n flex : 1,\n type: 'template',\n template: ({ record }) => {\n if (NullOrUndefinedHelper(record.data.phoneNumber)) return \"\"\n\t\t\t\t\treturn StringHelper.xss`${record.data.phoneNumber ?? \"\"}`;\n },\n },\n {\n id:'menu',\n text\t: '',\n minWidth: 36,\n width: 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.user], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n selectionChange(event) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedUsers.value = selectedUsers.value.concat(event.selected.map(ur => ur.data))\n selectedUsers.value = selectedUsers.value.filter(u => !event.deselected.map(ur => ur.data).some(ur => u?.id === ur?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n\t\tcellClick({column, record}) {\n\t\t\tif (column.data.field === 'isActive') {\n if(!record.data.isActive) {\n if(permissionService.userHasPermission(\"ProviderManagementPolicy.CompanyWorker.Read\")) {\n resetActivity(record);\n }\n }\n\t\t\t}\n\t\t},\n },\n}\nconst gridConfig = reactive(useGridConfig);\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: t('global.edit'),\n cls: 'color',\n icon: 'icon-editieren',\n hidden: !permissionService.userHasPermission(\"UserAdministrator.User.Edit\"),\n weight: 100,\n onItem : async ({ menu }) => {\n const fullUser = await userService.getUserById(menu.record.id, ErrorLocationType.table);\n\n if(fullUser === null || fullUser === undefined)return;\n\n fullUser.isActive = menu.record.isActive;\n\n globalStore.openPopup({\n data:fullUser,\n action:addOrUpdateUser,\n resetButton:false,\n title:$t(\"popups.userEditor.title.edit\"),\n type:PopupType.userPopup}\n );\n }\n },\n {\n text : t('users.menu.permission'),\n cls\t: 'color',\n icon: 'icon-editieren',\n hidden: true,//!permissionService.userHasPermission(\"UserAdministrator.User.Role.Edit\"),\n weight : 120\n },\n {\n text : t('users.menu.activity'),\n cls\t: 'color',\n icon: 'icon-reset',\n\t\t\t\thidden: checkUserActivityOption(record),\n weight : 130,\n onItem: async ({ menu }) => {\n await resetActivity(menu.record);\n },\n },\n {\n text : t('global.delete'),\n hidden: !permissionService.userHasPermission(\"UserAdministrator.User.Delete\"),\n cls\t: 'color',\n icon: 'icon-loeschen',\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"users.confirmDeletionSingle\", { name:menu.record.fullName}));\n\n if (answer) {\n const resp = await userService.deleteUser(menu.record.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n gridStore.applyChangeset({removed:[{id:menu.record.id}]});\n\n globalStore.showSuccess(t('users.deleted'));\n }\n }\n }\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\n\nconst checkUserActivityOption = (record) => {\n\tif(permissionService.userHasPermission(\"UserAdministrator.User.Edit\") && !record.isActive) {\n\t\treturn false;\n\t} else {\n\t\t// hide button in menu\n\t\treturn true;\n\t}\n}\nconst resetActivity = async (record) => {\n\tconst answer = await dialog\n\t\t\t.okText(t(\"global.reset\"))\n\t\t\t.cancelText(t(\"global.cancel\"))\n\t\t\t.confirm(t(\"users.resetActivity\", {name: record.name}));\n\n\tif (answer) {\n\t\tvar idList = [record.id];\n\n\t\tconst resp = await userService.resetUserActivity(idList);\n\n\t\tif (resp === null || resp === undefined || resp?.statusCode !== 0) {\n\t\t\tErrorHandler.handleError(resp, ErrorLocationType.table);\n\t\t\treturn;\n\t\t}\n\n\t\t// update table\n\t\trecord.isActive = true;\n\t\tgridStore.add(record);\n\n\t\tglobalStore.showSuccess(`${record.fullName} reaktiviert`);\n\t}\n\n}\n\nconst resetMultipleActivities = async () => {\n\n //drop call without selection\n if(!selectedUsers.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t(\"global.reset\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"users.resetMultipleActivity\", {count: selectedUsers.value.length}));\n\n\tif (answer) {\n\n var idList = [];\n\n // collect the selected user IDs\n for (const user of selectedUsers.value){\n idList.push(user.id);\n }\n\n\t\tconst resp = await userService.resetUserActivity(idList);\n\n\t\tif (resp === null || resp === undefined || resp?.statusCode !== 0) {\n\t\t\tErrorHandler.handleError(resp, ErrorLocationType.table);\n\t\t\treturn;\n\t\t}\n\n // mark newly active users\n for (const user of selectedUsers.value){\n user.isActive = true;\n gridStore.add(user);\n }\n\n\t\tglobalStore.showSuccess(t('users.inactiveUsersReactivated'));\n\t}\n\n}\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n const users = await userService.getUsers();\n if (users === null || users === undefined || users.statusCode !== 0) {\n ErrorHandler.handleError(users, ErrorLocationType.table);\n return;\n }\n\n gridStore.setStoreData(users.userInfo);\n\n // apply filters\n gridStore.filter({\n id: \"userFilter\",\n filterBy: FilterService.buildFilter(TableType[TableType.user])\n });\n\n // apply hidden cols\n for(const c of grid.value.instance.value.columns.storage.values){\n const needsHiding = globalStore.userPreferences.userHiddenColumns.some((thc) => thc.attributeName === c.data.field && thc.tableName === TableType[TableType.user]);\n\n if(needsHiding && !c.hidden) {\n c.hide();\n }\n else if(!needsHiding && c.hidden && !permissionColumn.includes(c.id)) {\n c.show();\n }\n }\n\n globalStore.reorderColumns(TableType[TableType.user]);\n\n globalStore.closeModal();\n // stop spinner\n globalStore.gridDataIsLoading = false;\n};\n\nonMounted(async () => {\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n})\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)('users.title')), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", _hoisted_4, [\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n onClick: newUser,\n title: _unref(t)('users.newUser')\n }, _hoisted_7, 8, _hoisted_5)), [\n [_directive_permission, 'UserAdministrator.User.Create']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedUsers).some(()=>true),\n onClick: exportCSV,\n title: _unref(t)('users.exportCsv')\n }, _hoisted_10, 8, _hoisted_8)), [\n [_directive_permission, 'UserAdministrator.User.CSV.Export']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedUsers).some(()=>true),\n onClick: deleteSelection,\n title: _unref(t)('global.delete')\n }, _hoisted_13, 8, _hoisted_11)), [\n [_directive_permission, 'UserAdministrator.User.Delete']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedUsers).some(()=>true),\n onClick: resetMultipleActivities,\n title: _unref(t)('global.reset')\n }, _hoisted_16, 8, _hoisted_14)), [\n [_directive_permission, 'UserAdministrator.User.Delete']\n ]),\n _createElementVNode(\"div\", _hoisted_17, [\n _createVNode(_unref(GridInputFilter), {\n gridStore: _unref(gridStore),\n popupType: _unref(PopupType).userFilterPopup\n }, null, 8, [\"gridStore\", \"popupType\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_18, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ])\n ]))\n}\n}\n\n})","import script from \"./Users.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Users.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import {LocationInfo} from \"@/models/location/LocationInfo\";\n\nexport class LevelInfo{\n id:number = -1;\n name:string = \"\";\n locations:Array = [];\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = { class: \"contentBox\" }\nconst _hoisted_3 = { class: \"block w-full\" }\nconst _hoisted_4 = { class: \"flex mb-4\" }\nconst _hoisted_5 = [\"title\"]\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_7 = [\n _hoisted_6\n]\nconst _hoisted_8 = [\"disabled\", \"title\"]\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_10 = [\n _hoisted_9\n]\nconst _hoisted_11 = { class: \"ml-auto\" }\nconst _hoisted_12 = { class: \"text-center\" }\n\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport { BryntumGrid } from \"@bryntum/grid-vue-3\";\nimport { Menu, Store } from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter.vue\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport FilterService from \"@/utilities/services/FilterService\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport {GeneralResponse} from \"@/models/api/Responses\";\nimport {LevelInfo} from \"@/models/group2/LevelInfo\";\nimport dialog from \"@/dialog\";\nimport {useI18n} from \"vue-i18n\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport { $t } from \"@/utilities/i18n/config\";\nimport Error from \"@/components/Error.vue\";\nimport {Group2Service} from \"@/utilities/services/entities/Group2Service\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Group2',\n setup(__props) {\n\nconst { t } = useI18n();\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\n\nlet selectedLevels = ref([]);\nconst group2Service = new Group2Service();\nconst permissionService = new PermissionService();\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedLevels.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t('global.delete'))\n .cancelText(t('global.cancel'))\n .confirm(t('levels.confirmDeletionMulti', {count:selectedLevels.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const level of selectedLevels.value){\n const resp = await group2Service.deleteLevel(level.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:level.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage}px`;\n};\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n enableTextSelection: true,\n height: currentWindowHeight,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n columns : {\n data: [\n { id:'id', field : 'id', text: t('levels.grid.id'), width : 100 },\n { id:'name', field : 'name', text: t('levels.grid.description'), flex : 1 },\n {\n id:'locations',\n field : 'locations',\n\t\t\t\tsortable: false,\n text: '',\n width: 36,\n type: 'template',\n template: ({ record }:any) => {\n\t\t\t\t\tif(record.data.locations.length > 0)\n\t\t\t\t\t\treturn `
`;\n\t\t\t\t\treturn\n\t\t\t\t},\n },\n {\n id:'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n //menu.setRecord(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.group2], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n selectionChange(event) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedLevels.value = selectedLevels.value.concat(event.selected.map(lr => lr.data));\n selectedLevels.value = selectedLevels.value.filter(l => !event.deselected.map(lr => lr.data).some(lr => l?.id === lr?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n cellClick({column, record}) {\n if (column.data.field === 'locations' && record.data.locations.length > 0) {\n globalStore.openPopup({\n data: record.data, // Need locations or LevelId\n action:globalStore.closeModal,\n title: \"Standorte\",\n type: PopupType.group2Locations\n });\n }\n }\n },\n}\n\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: t('global.edit'),\n cls: 'color',\n icon: 'icon-editieren',\n hidden: !permissionService.userHasPermission(\"Region.Edit\"),\n weight: 100,\n\n onItem : async ({ menu }) => {\n // Add item processing here\n globalStore.openPopup({\n data: menu.record,\n action:addOrUpdateLevel,\n title: $t('levels.edit'),\n type: PopupType.group2Popup\n });\n\n }\n },\n {\n text : t('global.delete'),\n cls : 'color',\n hidden: !permissionService.userHasPermission(\"Region.Delete\"),\n icon: 'icon-loeschen',\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText(t('global.delete'))\n .cancelText(t('global.cancel'))\n .confirm(t('levels.confirmDeletionSingle', {name:menu.record.name}));\n\n if (answer) {\n const resp = await group2Service.deleteLevel(menu.record.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n gridStore.applyChangeset({removed:[{id:menu.record.id}]});\n\n globalStore.showSuccess(t('levels.deleted'));\n }\n }\n }\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\n\nconst gridConfig = reactive(useGridConfig);\n\n\nconst newGroup2 = () => {\n const level = new LevelInfo();\n\n globalStore.openPopup({\n data: level,\n action:addOrUpdateLevel,\n title: t('levels.new'),\n type: PopupType.group2Popup\n });\n\n}\n\nconst addOrUpdateLevel = async () => {\n const level = globalStore.modal.contentObject as LevelInfo;\n\n const createResp = await group2Service.addOrUpdateLevel(level);\n if (createResp === null || createResp === undefined || createResp.statusCode !== 0){\n ErrorHandler.handleError(createResp as GeneralResponse, ErrorLocationType.popup);\n return;\n }\n\n if(level.id < 0) level.id = createResp.id;\n // fix selection when it was an update -> replace old value in selected-array\n else if(selectedLevels.value.some(el => el.id === level.id)) {\n selectedLevels.value = selectedLevels.value.filter(el => el.id !== level.id);\n selectedLevels.value.push(level);\n }\n\n // in case of an update bryntum automatically replaces the entry with the same ID\n gridStore.add(level);\n // reapply sorting\n gridStore.sort(gridStore.sorters);\n // reapply filtering\n gridStore.filter({\n id: \"userFilter\",\n filterBy: FilterService.buildFilter(TableType[TableType.user])\n });\n\n globalStore.closeModal();\n globalStore.showSuccess('Gespeichert');\n}\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n const levels = await group2Service.getLevels(\"display\");\n\n if (levels === null || levels === undefined || levels.statusCode !== 0) {\n ErrorHandler.handleError(levels, ErrorLocationType.table);\n return;\n }\n\n gridStore.setStoreData(levels.levelInfo);\n\n globalStore.reorderColumns(TableType[TableType.group2]);\n\n globalStore.closeModal();\n // stop spinner\n globalStore.gridDataIsLoading = false;\n};\n\nonMounted(async () => {\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n})\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)('levels.title')), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(Error, {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", _hoisted_4, [\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n onClick: newGroup2,\n title: _unref($t)('levels.new')\n }, _hoisted_7, 8, _hoisted_5)), [\n [_directive_permission, 'Region.Create']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedLevels).some(()=>true),\n onClick: deleteSelection,\n title: _unref(t)('global.delete')\n }, _hoisted_10, 8, _hoisted_8)), [\n [_directive_permission, 'Region.Delete']\n ]),\n _createElementVNode(\"div\", _hoisted_11, [\n _createVNode(GridInputFilter, {\n gridStore: _unref(gridStore),\n popupType: _unref(PopupType).userFilterPopup,\n hideFilterButton: true\n }, null, 8, [\"gridStore\", \"popupType\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_12, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ])\n ]))\n}\n}\n\n})","import script from \"./Group2.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Group2.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { MinimalLocationInfo } from \"@/models/location/MinimalLocationInfo\";\n\nexport class ControlCenterInfo{\n id:number = -1;\n syncId?:string = undefined;\n name:string = \"\";\n phoneNumber:string = \"\";\n locations:Array = [];\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = { class: \"contentBox\" }\nconst _hoisted_3 = { class: \"block w-full\" }\nconst _hoisted_4 = { class: \"flex mb-4\" }\nconst _hoisted_5 = [\"title\"]\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_7 = [\n _hoisted_6\n]\nconst _hoisted_8 = [\"disabled\", \"title\"]\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_10 = [\n _hoisted_9\n]\nconst _hoisted_11 = { class: \"ml-auto\" }\nconst _hoisted_12 = { class: \"text-center\" }\n\nimport { onBeforeUnmount, onMounted, reactive, ref } from \"vue\";\nimport { BryntumGrid } from \"@bryntum/grid-vue-3\";\nimport {Menu, Store, StringHelper} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter\";\nimport { useGlobalStore } from \"@/stores/GlobalStore\";\nimport { ErrorLocationType, PopupType, TableType } from '@/utilities/enums/Enums';\nimport { $t } from \"@/utilities/i18n/config\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport dialog from \"@/dialog\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport { GeneralResponse } from \"@/models/api/Responses\";\nimport Error from \"@/components/Error\";\nimport { ControlCenterInfo } from \"@/models/controlCenter/ControlCenterInfo\";\nimport {useI18n} from \"vue-i18n\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {ControlCenterService} from \"@/utilities/services/entities/ControlCenterService\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'ControlCenters',\n setup(__props) {\n\nconst { t } = useI18n();\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\n\nlet selectedControlCenters = ref([]);\nconst controlCenterService = new ControlCenterService();\nconst permissionService = new PermissionService();\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedControlCenters.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"controlCenters.confirmDeletionMulti\", { count:selectedControlCenters.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const cc of selectedControlCenters.value){\n const resp = await controlCenterService.deleteControlCenter(cc.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:cc.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage}px`;\n};\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n enableTextSelection: true,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n columns: {\n data: [\n { id:'id', field: 'id', text: t('controlCenters.grid.id'), width: 36, },\n {\n id:'syncId',\n field: 'syncId',\n text: t('controlCenters.grid.syncId'),\n flex: 1,\n type: \"template\",\n template: ({ record }) => {\n\t\t\t\t\treturn StringHelper.xss`${record.data.syncId ?? \"\"}`;\n },\n },\n { id:'name', field: 'name', text: t('controlCenters.grid.name'), flex: 1, },\n { id:'phoneNumber', field: 'phoneNumber', text: t('controlCenters.grid.phoneNumber'), flex: 1, },\n {\n id:'locations',\n field: 'locations',\n\t\t\t\tsortable: false,\n text: '',\n width : 36,\n type: \"template\",\n template: ({ record }) => {\n\t\t\t\t\tif(record.data.locations.length > 0)\n\t\t\t\t\t\treturn `
`;\n\t\t\t\t\treturn\n\t\t\t\t},\n },\n {\n id:'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.controlCenter], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n selectionChange(event) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedControlCenters.value = selectedControlCenters.value.concat(event.selected.map(cr => cr.data))\n selectedControlCenters.value = selectedControlCenters.value.filter(c => !event.deselected.map(cr => cr.data).some(cr => c?.id === cr?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n cellClick({column, record}) {\n if (column.data.field === 'locations' && record.data.locations.length > 0) {\n globalStore.openPopup({\n data: record.data,\n action: globalStore.closeModal,\n title: \"Standorte\",\n type: PopupType.group2Locations\n });\n }\n },\n },\n height: currentWindowHeight,\n}\nconst gridConfig = reactive(useGridConfig);\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: t('global.edit'),\n cls: 'color',\n icon: 'icon-editieren',\n hidden: !permissionService.userHasPermission(\"ControlCenter.Edit\"),\n weight: 100,\n onItem : ({ menu }) => {\n globalStore.openPopup({\n data:menu.record,\n action:addOrUpdateControlCenter,\n resetButton:false,\n title:$t(\"popups.controlCenterEditor.title.edit\"),\n type:PopupType.controlCenterEditor\n });\n }\n },\n {\n text: t('global.delete'),\n hidden: !permissionService.userHasPermission(\"ControlCenter.Delete\"),\n cls\t: 'color',\n icon: 'icon-loeschen',\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"controlCenters.confirmDeletionSingle\", {name:menu.record.name}));\n\n if (answer) {\n const resp = await controlCenterService.deleteControlCenter(menu.record.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n gridStore.applyChangeset({removed:[{id:menu.record.id}]});\n\n globalStore.showSuccess(t('global.deleted'));\n }\n }\n }\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\n\nconst newControlCenter = () => {\n const controlCenter = new ControlCenterInfo();\n\n globalStore.openPopup({\n data:controlCenter,\n action:addOrUpdateControlCenter,\n resetButton:false,\n title:$t(\"popups.controlCenterEditor.title.new\"),\n type:PopupType.controlCenterEditor\n });\n}\n\nconst addOrUpdateControlCenter = async () => {\n const controlCenter = globalStore.modal.contentObject as ControlCenterInfo;\n\n const ccResp = await controlCenterService.addOrUpdateControlCenter(controlCenter);\n if (ccResp === null || ccResp === undefined || ccResp.statusCode !== 0){\n ErrorHandler.handleError(ccResp as GeneralResponse, ErrorLocationType.popup);\n return;\n }\n\n if(controlCenter.id < 0) controlCenter.id = ccResp.id;\n // fix selection when it was an update -> replace old value in selected-array\n else if(selectedControlCenters.value.some(el => el.id === controlCenter.id)) {\n selectedControlCenters.value = selectedControlCenters.value.filter(el => el.id !== controlCenter.id);\n selectedControlCenters.value.push(controlCenter);\n }\n\n // in case of an update bryntum automatically replaces the entry with the same ID\n gridStore.add(controlCenter);\n // reapply sorting\n gridStore.sort(gridStore.sorters);\n\n globalStore.closeModal();\n globalStore.showSuccess(t(\"global.saved\"));\n}\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n const controlCentersResp = await controlCenterService.getControlCenters(\"display\");\n\n if (controlCentersResp === null || controlCentersResp === undefined || controlCentersResp.statusCode !== 0) {\n ErrorHandler.handleError(controlCentersResp, ErrorLocationType.table);\n return;\n }\n\n gridStore.setStoreData(controlCentersResp.controlCenterInfo);\n\n globalStore.reorderColumns(TableType[TableType.controlCenter]);\n\n globalStore.closeModal();\n // stop spinner\n globalStore.gridDataIsLoading = false;\n};\n\nonMounted(async () => {\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n})\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)('controlCenters.title')), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", _hoisted_4, [\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n onClick: newControlCenter,\n title: _unref(t)('controlcenter.newcontrolCenter')\n }, _hoisted_7, 8, _hoisted_5)), [\n [_directive_permission, 'ControlCenter.Create']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedControlCenters).some(()=>true),\n onClick: deleteSelection,\n title: _unref(t)('global.delete')\n }, _hoisted_10, 8, _hoisted_8)), [\n [_directive_permission, 'ControlCenter.Delete']\n ]),\n _createElementVNode(\"div\", _hoisted_11, [\n _createVNode(_unref(GridInputFilter), {\n gridStore: _unref(gridStore),\n popupType: _unref(PopupType).controlCenterFilter,\n hideFilterButton: true\n }, null, 8, [\"gridStore\", \"popupType\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_12, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ])\n ]))\n}\n}\n\n})","import script from \"./ControlCenters.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ControlCenters.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import {WebCallService} from \"@/utilities/services/WebCallService\";\nimport {PathHelper} from \"@/utilities/helpers/PathHelper\";\nimport {GeneralResponse, TokenResponse} from \"@/models/api/Responses\";\nimport {\n ChangePasswordRequest,\n LoginRequest,\n ResetPasswordEmailRequest,\n ResetPasswordRequest\n} from \"@/models/api/Requests\";\nimport {ErrorLocationType, HttpType} from \"@/utilities/enums/Enums\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\n\nexport class AccountService {\n private webCaller: WebCallService;\n private uriHelper: PathHelper;\n\n constructor(){\n this.webCaller = new WebCallService();\n this.uriHelper = new PathHelper();\n }\n\n public async login(email: string, password: string, rememberMe: boolean): Promise {\n const uri = this.uriHelper.account.getLoginPath();\n const requestBody = new LoginRequest(email, password, rememberMe);\n\n return await this.webCaller.HttpSend(HttpType.post, uri, requestBody);\n }\n\n public async sendResetPasswordMail(email: string, url: string): Promise {\n const uri = this.uriHelper.account.getResetPasswordMailPath();\n const requestBody = new ResetPasswordEmailRequest(email, url);\n\n return await this.webCaller.HttpSend(HttpType.post, uri, requestBody);\n }\n\n public async resetPassword(token: string, email: string, password: string, passwordRepetition: string): Promise {\n const uri = this.uriHelper.account.getResetPasswordPath();\n const requestBody = new ResetPasswordRequest(token, email, password, passwordRepetition);\n\n return await this.webCaller.HttpSend(HttpType.post, uri, requestBody);\n }\n\n public async changePassword(userId: string, oldPassword: string, newPassword: string, newPasswordRepetition: string): Promise {\n const uri = this.uriHelper.account.getChangePasswordPath();\n const requestBody = new ChangePasswordRequest(userId, oldPassword, newPassword, newPasswordRepetition);\n\n return await this.webCaller.HttpSend(HttpType.post, uri, requestBody);\n }\n\n public async exchangeToken(errorLocationType:ErrorLocationType):Promise{\n const uri = this.uriHelper.account.getExchangeTokenPath();\n\n const resp = await this.webCaller.HttpSend(HttpType.get, uri);\n console.log(resp)\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, errorLocationType);\n return null;\n }\n\n return resp.token;\n }\n\n public async logout(): Promise {\n const uri = this.uriHelper.account.getLogoutPath();\n\n return await this.webCaller.HttpSend(HttpType.get, uri);\n }\n}","export class SystemCompanySettings{\n companyIdCode:string = \"\";\n companyName:string = \"\";\n\n constructor(name:string, id:string) {\n this.companyIdCode = id;\n this.companyName = name;\n }\n}","import {OidcMetadata, User, UserManager, UserManagerSettings} from 'oidc-client';\n\nexport default class OAuthService {\n public userManager: UserManager;\n\n constructor(authority:string, clientId:string, scopes:string, callback:string, silentCallback:string, metdata:OidcMetadata|undefined = undefined) {\n const settings: UserManagerSettings = {\n authority: authority,\n client_id: clientId,\n redirect_uri: window.location.origin + callback,\n silent_redirect_uri: window.location.origin + silentCallback,\n automaticSilentRenew: true,\n response_type: 'code',\n scope: scopes,\n post_logout_redirect_uri: window.location.origin + '/logout',\n filterProtocolClaims: false,\n metadata: metdata\n };\n\n this.userManager = new UserManager(settings);\n }\n\n public async login(): Promise {\n return await this.userManager.signinRedirect();\n }\n\n public async logout(): Promise {\n return await this.userManager.signoutRedirect();\n }\n\n public async refreshTokensSilently(): Promise {\n return await this.userManager.signinSilentCallback();\n }\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, unref as _unref, vModelText as _vModelText, withDirectives as _withDirectives, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, createVNode as _createVNode, withModifiers as _withModifiers, withCtx as _withCtx, createCommentVNode as _createCommentVNode, isRef as _isRef } from \"vue\"\nimport _imports_0 from '../assets/img/anab_logo_white.png'\n\n\nconst _hoisted_1 = {\n id: \"login\",\n class: \"w-full h-full\"\n}\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"fixed anabLogo\" }, [\n /*#__PURE__*/_createElementVNode(\"img\", {\n src: _imports_0,\n alt: \"\"\n })\n], -1)\nconst _hoisted_3 = { class: \"fixed anabTeaserText\" }\nconst _hoisted_4 = { class: \"subline\" }\nconst _hoisted_5 = { class: \"headline\" }\nconst _hoisted_6 = [\"innerHTML\"]\nconst _hoisted_7 = { id: \"loginSidebar\" }\nconst _hoisted_8 = { key: 0 }\nconst _hoisted_9 = [\"onSubmit\"]\nconst _hoisted_10 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_11 = { for: \"email\" }\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_13 = [\"disabled\"]\nconst _hoisted_14 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_15 = { class: \"error-msg\" }\nconst _hoisted_16 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_17 = { for: \"password\" }\nconst _hoisted_18 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_19 = [\"disabled\"]\nconst _hoisted_20 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_21 = { class: \"error-msg\" }\nconst _hoisted_22 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_23 = [\"disabled\"]\nconst _hoisted_24 = { key: 0 }\nconst _hoisted_25 = { key: 0 }\nconst _hoisted_26 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_27 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_28 = { for: \"email-passwordreset\" }\nconst _hoisted_29 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_30 = [\"disabled\"]\nconst _hoisted_31 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_32 = { class: \"error-msg\" }\nconst _hoisted_33 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_34 = [\"disabled\"]\nconst _hoisted_35 = { key: 1 }\nconst _hoisted_36 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_37 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_38 = { key: 1 }\nconst _hoisted_39 = [\"innerHTML\"]\nconst _hoisted_40 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_41 = { for: \"password\" }\nconst _hoisted_42 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_43 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_44 = { class: \"error-msg\" }\nconst _hoisted_45 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_46 = { for: \"password\" }\nconst _hoisted_47 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_48 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_49 = { class: \"error-msg\" }\nconst _hoisted_50 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_51 = { key: 1 }\nconst _hoisted_52 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_53 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\n\nimport {computed, onMounted, reactive, ref} from 'vue';\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport router from \"@/router\";\nimport {useRoute} from \"vue-router\";\nimport {notify} from \"@kyvg/vue3-notification\";\nimport jwt_decode from \"jwt-decode\";\nimport {DisdiStateType, ErrorLocationType, NotifyType, PreferenceType, SsoType} from \"@/utilities/enums/Enums\";\nimport TabsWrapper from '@/components/tabs/TabsWrapper.vue';\nimport TabItem from '@/components/tabs/TabItem.vue';\nimport {email, helpers, minLength, required, sameAs} from '@vuelidate/validators';\nimport useVuelidate from '@vuelidate/core';\nimport {useI18n} from 'vue-i18n';\nimport Error from \"@/components/Error\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {GeneralResponse} from \"@/models/api/Responses\";\nimport {i18n} from \"@/utilities/i18n/config\";\nimport {UserPreference} from \"@/models/user/UserPreference\";\nimport {MiscService} from \"@/utilities/services/entities/MiscService\";\nimport {AccountService} from \"@/utilities/services/entities/AccountService\";\nimport {UserService} from \"@/utilities/services/entities/UserService\";\nimport TextOrSpinner from \"@/components/TextOrSpinner\";\nimport {SystemCompanySettings} from \"@/models/SystemCompanySettings\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport {anabPolicies} from \"@/AppConfig\";\nimport {usePermissionStore} from \"@/stores/PermissionStore\";\nimport OAuthService from \"@/utilities/services/OAuthService\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Login',\n setup(__props) {\n\nconst { t } = useI18n();\nconst miscService = new MiscService();\nconst accountService = new AccountService();\nconst userService = new UserService();\nconst permissionService = new PermissionService();\n\nconst globalStore = useGlobalStore();\nconst error = ref(false);\nconst loading = ref(false);\nlet activeTab = ref(0);\n\nlet token = ref(useRoute().query.token);\nlet mail = ref(useRoute().query.email);\n// let samlBackdoor = ref(useRoute().query.saml);\nlet passwordResetMailSent = ref(false);\n\nconst saveNewPassword = async () => {\n loading.value = true;\n\n const isFormCorrect = await vPassword$.value.$validate()\n if (!isFormCorrect) {\n // VALIDATOR ERROR\n loading.value = false;\n return\n }\n\n const resp = await accountService.resetPassword(token.value, mail.value, passwordForm.newPassword, passwordForm.newPasswordRepeat);\n\n if(resp?.statusCode !== 0) return;\n\n loading.value = false;\n\n notify({\n title: \"Erfolg\",\n text: t('notifications.passwordReset'),\n duration: -1,\n type: NotifyType[NotifyType.success]\n });\n\n // move back to default tab\n await router.replace(\"/login\");\n activeTab.value = 0;\n}\n\nconst abortPasswordChange = () => {\n token.value = undefined;\n mail.value = undefined;\n\n router.replace(\"/login\");\n activeTab.value = 0;\n}\n\n\nonMounted (async ()=>{\n if(token.value !== undefined && mail.value !== undefined) {\n activeTab.value = 1;\n }\n\n try{\n loading.value = true;\n const startupConfig = await miscService.getStartupConfig(ErrorLocationType.login);\n if (startupConfig === null) {\n loading.value = false;\n return;\n }\n\n globalStore.settings.defaultHiddenColumns = startupConfig.preferenceInfo;\n globalStore.settings.systemCompanySettings = new SystemCompanySettings(startupConfig.companyName, startupConfig.companyIdCode) ;\n globalStore.settings.startupConfig = startupConfig.startupInfo;\n globalStore.settings.activitySettings = startupConfig.activityInfo;\n globalStore.settings.disdiSettings = startupConfig.disdiInfo;\n globalStore.settings.disdiSettings.disdi = DisdiStateType[startupConfig.disdiInfo.disdi as unknown as keyof typeof DisdiStateType];\n globalStore.settings.enabledFeatures = startupConfig.enabledFeatures;\n\n // const skipSso = !NullOrUndefinedHelper(samlBackdoor.value) && (samlBackdoor.value as string).toLowerCase() === 'false' //TODO make saml backdoor point at digi3 AzureAD\n\n if(globalStore.settings.startupConfig.ssoType !== SsoType.none){\n switch (globalStore.settings.startupConfig.ssoType){\n case SsoType.oauth:{\n const clientId = globalStore.settings.startupConfig?.clientId as string;\n const scopes = globalStore.settings.startupConfig?.clientScopes as string;\n const metaDataUrl = globalStore.settings.startupConfig?.metaDataUrl;\n const metaData = !NullOrUndefinedHelper(metaDataUrl) ? await miscService.getOidcMetaData(metaDataUrl as string) : undefined;\n const ssoCallback = \"/sso/oAuthCallback\";\n const ssoSilentCallback = \"/sso/oAuthCallback/silent\";\n\n const oAuthService = new OAuthService(globalStore.getAuthorityUrl(), clientId, scopes, ssoCallback, ssoSilentCallback, metaData);\n await oAuthService.login();\n break;\n }\n case SsoType.saml:{\n window.location.replace(globalStore.getAuthorityUrl());\n break;\n }\n }\n }\n }\n catch (e) {\n console.log(\"CONFIG LOADING FAILED!\", e);\n }\n\n loading.value = false;\n})\n\n\nconst passwordForm = reactive({\n newPassword: '',\n newPasswordRepeat: '',\n})\nconst passwordResetForm = reactive({\n emailreset: '',\n})\nconst form = reactive({\n username: '',\n password: '',\n rememberMe: false\n});\n\nconst rules = {\n username: {\n required: helpers.withMessage(t('validators.required'), required),\n email: helpers.withMessage(t('validators.email'), email),\n },\n password: {\n required: helpers.withMessage(t('validators.required'), required),\n },\n}\n\nconst passwordResetRules = {\n emailreset: {\n required: helpers.withMessage(t('validators.required'), required),\n email: helpers.withMessage(t('validators.email'), email),\n },\n}\nconst newPasswordRules = computed(() => {\n\n const hasNoneAlphaNum = helpers.regex(/\\W/);\n const hasNumber = helpers.regex(/\\d/);\n const hasUppercaseLetter = helpers.regex(/[A-Z]/);\n const hasLowercaseLetter = helpers.regex(/[a-z]/);\n\n const rules = {\n newPassword: {\n required: helpers.withMessage(t('validators.required'), required),\n minLength: helpers.withMessage(t('validators.minLength', {amount: 8}), minLength(8)),\n hasNoneAlphaNum: helpers.withMessage(t('validators.hasNoneAlphaNum'), hasNoneAlphaNum),\n hasNumber: helpers.withMessage(t('validators.hasNumber'), hasNumber),\n hasUppercaseLetter: helpers.withMessage(t('validators.hasUppercaseLetter'), hasUppercaseLetter),\n hasLowercaseLetter: helpers.withMessage(t('validators.hasLowercaseLetter'), hasLowercaseLetter),\n },\n newPasswordRepeat: {\n required: helpers.withMessage(t('validators.required'), required),\n sameAsPassword: helpers.withMessage(t('validators.sameAs'), sameAs(passwordForm.newPassword)),\n },\n }\n return rules\n})\n\nconst v$ = useVuelidate(rules, form)\nconst vPassword$ = useVuelidate(newPasswordRules, passwordForm)\nconst vPasswordReset$ = useVuelidate(passwordResetRules, passwordResetForm)\n\nconst sendPasswordResetMail = async () => {\n\n loading.value = true;\n const isFormCorrect = await vPasswordReset$.value.$validate()\n if (!isFormCorrect) {\n // VALIDATOR ERROR\n loading.value = false;\n return\n }\n\n const resp = await accountService.sendResetPasswordMail(passwordResetForm.emailreset, `${window.location.origin}/login`);\n\n // sending failed\n if(resp === null || resp === undefined || resp?.statusCode !== 0) {\n loading.value = false;\n return;\n }\n\n passwordResetMailSent.value = true;\n loading.value = false;\n}\n\nconst addDynamicRoles= async ()=>{\n const readRoleString = globalStore.settings.disdiSettings?.permissionRead.join(\", \");\n const editRoleString = globalStore.settings.disdiSettings?.permissionEdit.join(\", \");\n\n //TODO magic string? better idea?\n permissionService.updateDynamicPolicy(\"Disdi.Read\", readRoleString as string);\n permissionService.updateDynamicPolicy(\"Disdi.LocationPropertyEdit\", editRoleString as string);\n}\n\nconst onSubmit = async () => {\n loading.value = true;\n const isFormCorrect = await v$.value.$validate();\n\n if (!isFormCorrect) {\n // VALIDATOR ERROR\n loading.value = false;\n return\n }\n\n try{\n const resp = await accountService.login(form.username, form.password, form.rememberMe);\n\n if(resp === null || resp === undefined || resp.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.login);\n\n loading.value = false;\n\n return;\n }\n\n globalStore.setToken(resp.token);\n\n const user = await userService.getUserById(jwt_decode(resp.token).id, ErrorLocationType.login);\n\n if(user === null || user === undefined){\n loading.value = false;\n return;\n }\n\n globalStore.setUser(user);\n\n // get filters for user\n const filterResp = await userService.getUserPreferences(user.id, PreferenceType.filter);\n // get hiddenColumns for User\n const columnResp = await userService.getUserPreferences(user.id, PreferenceType.hiddenColumn);\n // get general settings for User\n const genSetResp = await userService.getUserPreferences(user.id, PreferenceType.general);\n // get columnOrder settings for User\n const colOrderResp = await userService.getUserPreferences(user.id, PreferenceType.columnOrder);\n\n if(filterResp?.statusCode === 0 && columnResp?.statusCode === 0 && genSetResp?.statusCode === 0 && colOrderResp?.statusCode === 0) {\n globalStore.setUserPreferences({\n userFilters: filterResp.preferenceInfo ?? [],\n userHiddenColumns: columnResp.preferenceInfo ?? [],\n userColumnOrder: colOrderResp.preferenceInfo ?? [],\n general: {\n darkMode: genSetResp.preferenceInfo.find((pi:UserPreference) => pi.attributeName === \"darkMode\")?.attributeValue ?? false,\n userStartPage: genSetResp.preferenceInfo.find((pi:UserPreference) => pi.attributeName === \"userStartPage\")?.attributeValue ?? \"/account\",\n userLocale: genSetResp.preferenceInfo.find((pi:UserPreference) => pi.attributeName === \"userLocale\")?.attributeValue ?? \"de\",\n },\n });\n\n // set language. if not null or undefined fallback to DE\n // @ts-expect-error\n i18n.global.locale.value = globalStore.userPreferences.general.userLocale;\n }\n else{\n ErrorHandler.handleError(new GeneralResponse(6666, \"Ihre Einstellungen konnten nicht geladen werden\"), ErrorLocationType.table);\n\n loading.value = false;\n }\n\n const notifResp = await miscService.getHubNotifications();\n\n if(notifResp?.statusCode === 0){\n globalStore.notifications = notifResp.notifications;\n }\n else{\n ErrorHandler.handleError(new GeneralResponse(6667, \"Die Benachrichtigungen konnte nicht geladen werden\"), ErrorLocationType.table);\n\n loading.value = false;\n }\n\n // set new fully set policy array on permission store to make sure it survives page reloads\n const permissionStore = usePermissionStore();\n permissionStore.anabPolicies = anabPolicies;\n\n await addDynamicRoles();\n\n // @ts-expect-error\n await router.push(globalStore.userPreferences.general.userStartPage);\n\n notify({\n title: \"Erfolg\",\n text: t('login.notifySuccessfulLogin'),\n duration: 5000,\n type: \"success\"\n });\n\n loading.value = false;\n }\n catch (e){\n console.log(e);\n }\n};\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _hoisted_2,\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", _hoisted_4, _toDisplayString(_ctx.$t('login.subline')), 1),\n _createElementVNode(\"div\", _hoisted_5, [\n _createElementVNode(\"h1\", null, [\n _createElementVNode(\"span\", {\n innerHTML: _ctx.$t('login.headline')\n }, null, 8, _hoisted_6)\n ])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_7, [\n (!error.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [\n _createVNode(TabsWrapper, { activeTab: _unref(activeTab) }, {\n default: _withCtx(() => [\n _createVNode(TabItem, {\n title: _ctx.$t('login.tabs.login.tabTitle')\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"form\", {\n onSubmit: _withModifiers(onSubmit, [\"prevent\"])\n }, [\n _createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('login.tabs.login.headline')), 1),\n _hoisted_10,\n _createElementVNode(\"label\", _hoisted_11, _toDisplayString(_ctx.$t('login.tabs.login.email')), 1),\n _hoisted_12,\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: _unref(v$).username.$errors.length })\n }, [\n _withDirectives(_createElementVNode(\"input\", {\n disabled: loading.value,\n type: \"text\",\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((form.username) = $event)),\n class: \"form-control\",\n placeholder: \"E-Mail*\",\n required: \"\",\n autocomplete: \"email\"\n }, null, 8, _hoisted_13), [\n [_vModelText, form.username]\n ]),\n _hoisted_14,\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(v$).username.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_15, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2),\n _hoisted_16,\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: _unref(v$).password.$errors.length })\n }, [\n _createElementVNode(\"label\", _hoisted_17, _toDisplayString(_ctx.$t('login.tabs.login.password')), 1),\n _hoisted_18,\n _withDirectives(_createElementVNode(\"input\", {\n disabled: loading.value,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((form.password) = $event)),\n class: \"form-control\",\n type: \"password\",\n placeholder: \"Passwort*\",\n autocomplete: \"current-password\"\n }, null, 8, _hoisted_19), [\n [_vModelText, form.password]\n ]),\n _hoisted_20,\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(v$).password.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_21, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2),\n _hoisted_22,\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).login\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"button\", {\n disabled: loading.value,\n type: \"submit\",\n name: \"submit\",\n class: _normalizeClass([\"btn\", loading.value ? 'disabled' : 'primary'])\n }, [\n _createVNode(_unref(TextOrSpinner), {\n text: _unref(t)('login.tabs.login.submit'),\n spin: loading.value\n }, null, 8, [\"text\", \"spin\"])\n ], 10, _hoisted_23)\n ], 40, _hoisted_9)\n ]),\n _: 1\n }, 8, [\"title\"]),\n _createVNode(TabItem, {\n title: _ctx.$t('login.tabs.changePassword.tabTitle')\n }, {\n default: _withCtx(() => [\n (_unref(token) === undefined || _unref(token) === null || _unref(mail) === undefined || _unref(mail) === null)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [\n (!_unref(passwordResetMailSent))\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_25, [\n _createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('login.tabs.changePassword.headline')), 1),\n _hoisted_26,\n _createElementVNode(\"div\", null, _toDisplayString(_ctx.$t('login.tabs.changePassword.description')), 1),\n _hoisted_27,\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: _unref(vPasswordReset$).emailreset.$errors.length })\n }, [\n _createElementVNode(\"label\", _hoisted_28, _toDisplayString(_ctx.$t('login.tabs.changePassword.email')), 1),\n _hoisted_29,\n _withDirectives(_createElementVNode(\"input\", {\n disabled: loading.value,\n name: \"emailReset\",\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((passwordResetForm.emailreset) = $event)),\n class: \"form-control\",\n type: \"text\",\n placeholder: \"E-Mail*\",\n required: \"\"\n }, null, 8, _hoisted_30), [\n [_vModelText, passwordResetForm.emailreset]\n ]),\n _hoisted_31,\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(vPasswordReset$).emailreset.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_32, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2),\n _hoisted_33,\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).login\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"button\", {\n disabled: loading.value,\n type: \"button\",\n name: \"submit\",\n class: _normalizeClass([\"btn\", loading.value ? 'disabled' : 'primary']),\n onClick: sendPasswordResetMail\n }, [\n _createVNode(_unref(TextOrSpinner), {\n text: _unref(t)('login.tabs.changePassword.submit'),\n spin: loading.value\n }, null, 8, [\"text\", \"spin\"])\n ], 10, _hoisted_34)\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_35, [\n _createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('login.tabs.changePassword.confirmHeadline')), 1),\n _hoisted_36,\n _createElementVNode(\"div\", null, _toDisplayString(_ctx.$t('login.tabs.changePassword.confirmDescription')), 1),\n _hoisted_37,\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).login\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"button\", {\n type: \"button\",\n name: \"submit\",\n class: \"btn primary\",\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_isRef(passwordResetMailSent) //@ts-ignore\n ? passwordResetMailSent.value = false : passwordResetMailSent = false))\n }, _toDisplayString(_ctx.$t('login.tabs.changePassword.confirmButton')), 1)\n ]))\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_38, [\n _createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('login.tabs.changePassword.newPasswordHeadline')), 1),\n _createElementVNode(\"div\", {\n innerHTML: _ctx.$t('login.tabs.changePassword.newPasswordDescription')\n }, null, 8, _hoisted_39),\n _hoisted_40,\n _createElementVNode(\"form\", null, [\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: _unref(vPassword$).newPassword.$errors.length })\n }, [\n _createElementVNode(\"label\", _hoisted_41, _toDisplayString(_ctx.$t('login.tabs.changePassword.newPasswordLabel')), 1),\n _hoisted_42,\n _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((passwordForm.newPassword) = $event)),\n class: \"form-control\",\n type: \"password\",\n placeholder: \"Passwort*\",\n autocomplete: \"new-password\",\n required: \"\"\n }, null, 512), [\n [_vModelText, passwordForm.newPassword]\n ]),\n _hoisted_43,\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(vPassword$).newPassword.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_44, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2),\n _hoisted_45,\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: _unref(vPassword$).newPasswordRepeat.$errors.length })\n }, [\n _createElementVNode(\"label\", _hoisted_46, _toDisplayString(_ctx.$t('login.tabs.changePassword.newPasswordRepeatLabel')), 1),\n _hoisted_47,\n _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = ($event: any) => ((passwordForm.newPasswordRepeat) = $event)),\n class: \"form-control\",\n type: \"password\",\n placeholder: \"Passwort wiederholen*\",\n autocomplete: \"new-password\",\n required: \"\"\n }, null, 512), [\n [_vModelText, passwordForm.newPasswordRepeat]\n ]),\n _hoisted_48,\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(vPassword$).newPasswordRepeat.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_49, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2),\n _hoisted_50,\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).login\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"button\", {\n type: \"button\",\n name: \"submit\",\n class: \"btn primary mr-5\",\n onClick: saveNewPassword\n }, _toDisplayString(_ctx.$t('login.tabs.changePassword.newPasswordSave')), 1),\n _createElementVNode(\"button\", {\n type: \"button\",\n name: \"cancel\",\n class: \"btn\",\n onClick: abortPasswordChange\n }, _toDisplayString(_ctx.$t('login.tabs.changePassword.newPasswordCancel')), 1)\n ])\n ]))\n ]),\n _: 1\n }, 8, [\"title\"])\n ]),\n _: 1\n }, 8, [\"activeTab\"])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_51, [\n _createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('login.error.headline')), 1),\n _hoisted_52,\n _createElementVNode(\"div\", null, _toDisplayString(_ctx.$t('login.error.description')), 1),\n _hoisted_53,\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).login\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"button\", {\n type: \"submit\",\n name: \"submit\",\n class: \"btn primary\",\n onClick: _cache[6] || (_cache[6] = ($event: any) => (error.value = false))\n }, _toDisplayString(_ctx.$t('login.error.button')), 1)\n ]))\n ])\n ]))\n}\n}\n\n})","import script from \"./Login.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Login.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, createElementVNode as _createElementVNode, mergeProps as _mergeProps, vShow as _vShow, withDirectives as _withDirectives, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"block w-full\" }\nconst _hoisted_2 = { class: \"flex mb-4\" }\nconst _hoisted_3 = { class: \"ml-auto\" }\nconst _hoisted_4 = { class: \"text-center\" }\n\nimport {PopupType, ErrorLocationType, TableType} from '@/utilities/enums/Enums';\nimport { BryntumGrid } from \"@bryntum/grid-vue-3\";\nimport {Menu, Store} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter.vue\";\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {$t} from \"@/utilities/i18n/config\";\nimport {defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport Error from \"@/components/Error.vue\";\nimport {SettingService} from \"@/utilities/services/entities/SettingService\";\nimport {SystemSetting} from \"@/models/setting/SystemSetting\";\nimport {GeneralResponse} from \"@/models/api/Responses\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'SystemSettingsTab',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\nconst settingService = new SettingService();\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage-80}px`;\n};\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n cellTooltipFeature: {\n hoverDelay: 300,\n textContent: true,\n\t\thideOnDelegateChange: true,\n },\n groupFeature: \"groupName\",\n selectionMode: false,\n height:currentWindowHeight,\n cellEditFeature: false,\n filterBarFeature: false,\n rowReorderFeature: true,\n stripeFeature: false,\n treeFeature: false,\n columns: {\n data: [\n {\n id: 'name',\n field: 'name',\n text: $t('settings.systemSettings.name'),\n flex: 1,\n },\n\t\t\t{\n\t\t\t\tid: 'helpText',\n\t\t\t\tfield: 'helpText',\n\t\t\t\ttext: \"\",\n\t\t\t\twidth: 50,\n\t\t\t\tsortable: false,\n\t\t\t\tresizable: false,\n\t\t\t\tminWidth: 50,\n\t\t\t\ttype: \"template\",\n\t\t\t\ttooltipRenderer : ({record}) => `${record.data.helpText}`,\n\t\t\t\ttemplate: ({record}) => {\n\t\t\t\t\tif(record.data.helpText !== null)\n\t\t\t\t\t\treturn `
`;\n\t\t\t\t\treturn\n\t\t\t\t},\n\t\t\t},\n {\n id: 'value',\n field: 'value',\n text: $t('settings.systemSettings.value'),\n flex: 2,\n\t\t\t\tautoHeight: true,\n\t\t\t\tcellCls: 'multiline',\n },\n {\n id: 'groupName',\n field: 'groupName',\n isVisible: false,\n hidden:true,\n text: '',\n groupRenderer : ({groupRowFor}) => {\n return `${groupRowFor}`\n },\n },\n {\n id: 'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.systemSetting], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n}\nconst gridConfig = reactive(useGridConfig);\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: $t(\"global.edit\"),\n cls: 'color',\n icon: 'icon-editieren',\n weight: 100,\n onItem : ({ menu }) => {\n globalStore.openPopup({\n data: menu.record,\n action:updateSystemSetting,\n resetButton:false,\n title: $t(\"popups.settings.systemSettings.edit\"),\n type:PopupType.settingsEditSystemSetting\n });\n }\n }\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\n\nconst updateSystemSetting = async ()=>{\n const setting = globalStore.modal.contentObject as SystemSetting;\n\n if(setting.dataType === \"System.Boolean\" && !setting.value.match(/[tT]rue|[fF]alse/gm)) // magic string, pfui bah!\n {\n ErrorHandler.handleError(new GeneralResponse(666666666, \"\"), ErrorLocationType.popup);\n return;\n }\n\n const updateSystemSettingResp = await settingService.putUpdateSystemSetting(setting);\n if (updateSystemSettingResp === null || updateSystemSettingResp === undefined || updateSystemSettingResp.statusCode !== 0) {\n ErrorHandler.handleError(updateSystemSettingResp, ErrorLocationType.popup);\n return;\n }\n\n if(setting.name === \"Tätigkeitsgruppen: Feature eingeschaltet\")\n globalStore.settings.activitySettings.activitesEnabled = JSON.parse(setting.value.toLocaleLowerCase());\n if(setting.name === \"Tätigkeitsgruppen: Unbestimmte Tätigkeit änderbar\")\n globalStore.settings.activitySettings.defaultActivitExchangeable = JSON.parse(setting.value.toLocaleLowerCase());\n\n gridStore.add(setting);\n\n globalStore.closeModal();\n globalStore.showSuccess($t(\"global.saved\"));\n}\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n const systemSettingsResp = await settingService.getSystemSettings();\n if (systemSettingsResp === null || systemSettingsResp === undefined || systemSettingsResp.statusCode !== 0) {\n ErrorHandler.handleError(systemSettingsResp, ErrorLocationType.table);\n return;\n }\n\n // convert to flat array since treeFeature with 'children prop' is not working...\n const flatGroupableList = [];\n for (const s of systemSettingsResp.settingInfo){\n for (const c of s.children){\n c.groupName = s.name;\n flatGroupableList.push(c)\n }\n }\n\n gridStore.setStoreData(flatGroupableList);\n\n globalStore.reorderColumns(TableType[TableType.systemSetting]);\n\n // stop spinner\n globalStore.gridDataIsLoading = false;\n}\n\n\nonMounted(async () => {\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n})\n\nonBeforeUnmount(()=>{\n recalcGridHeight();\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(Error, {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createVNode(GridInputFilter, {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_4, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ], 64))\n}\n}\n\n})","import script from \"./SystemSettingsTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SystemSettingsTab.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, createElementVNode as _createElementVNode, mergeProps as _mergeProps, vShow as _vShow, withDirectives as _withDirectives, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"block w-full\" }\nconst _hoisted_2 = { class: \"flex mb-4\" }\nconst _hoisted_3 = { class: \"ml-auto\" }\nconst _hoisted_4 = { class: \"text-center\" }\n\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport { BryntumGrid } from \"@bryntum/grid-vue-3\";\nimport {Menu, Store} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter.vue\";\nimport { useGlobalStore } from \"@/stores/GlobalStore\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport { $t } from \"@/utilities/i18n/config\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport { GeneralResponse } from \"@/models/api/Responses\";\nimport Error from \"@/components/Error.vue\";\nimport {useI18n} from \"vue-i18n\";\nimport {defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {PronunciationSetting} from \"@/models/setting/PronunciationSetting\";\nimport {SettingService} from \"@/utilities/services/entities/SettingService\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'SpokenTextTab',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\n\nconst grid = ref(null);\nconst { t } = useI18n();\nconst settingService = new SettingService();\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage-80}px`;\n};\n\nconst useGridConfig = {\n headerMenuFeature: false,\n cellTooltipFeature: {\n hoverDelay: 300,\n textContent: true,\n\t\thideOnDelegateChange: true,\n },\n relayStoreEvents: true,\n enableTextSelection: true,\n selectionMode : false,\n height: currentWindowHeight,\n columns : {\n data: [\n { id: 'internalIdentification', field: 'internalIdentification', text: t('settings.grid.intern'), flex: 1, },\n\t\t\t{\n\t\t\t\tid: 'helpText',\n\t\t\t\tfield: '',\n\t\t\t\ttext: \"\",\n\t\t\t\twidth: 50,\n\t\t\t\tsortable: false,\n\t\t\t\tresizable: false,\n\t\t\t\tminWidth: 50,\n\t\t\t\ttype: \"template\",\n\t\t\t\ttooltipRenderer : ({record}) => `${record.data.helpText}`,\n\t\t\t\ttemplate: ({record}) => {\n\t\t\t\t\tif(record.data.helpText !== null || record.data.helpText !== \"\")\n\t\t\t\t\t\treturn `
`;\n\t\t\t\t\treturn\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n id: 'name',\n field: 'name',\n text: t('settings.grid.description'),\n flex: 1,\n },\n {\n id: 'value',\n field: 'value',\n text: t('settings.grid.speachText'),\n flex: 2.5,\n\t\t\t\tcellCls: \"multiline\",\n\t\t\t\tautoHeight: true,\n\t\t\t},\n {\n id: 'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.spokenText], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n }\n },\n}\nconst gridConfig = reactive(useGridConfig);\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: t(\"global.edit\"),\n cls: 'color',\n icon: 'icon-editieren',\n weight: 100,\n onItem : ({ menu }) => {\n globalStore.openPopup({\n data:menu.record,\n action:updatePronunciationSetting,\n resetButton:false,\n title:$t(\"popups.settings.spokenText.edit\"),\n type:PopupType.settingsEditSpokenText\n });\n }\n },\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\n\nconst updatePronunciationSetting = async () => {\n const pronunciationSetting = globalStore.modal.contentObject as PronunciationSetting;\n\n const pronunciationUpdateResp = await settingService.putUpdatePronunciationSetting(pronunciationSetting);\n if (pronunciationUpdateResp === null || pronunciationUpdateResp === undefined || pronunciationUpdateResp.statusCode !== 0){\n ErrorHandler.handleError(pronunciationUpdateResp as GeneralResponse, ErrorLocationType.popup);\n return;\n }\n\n gridStore.add(pronunciationSetting);\n\n globalStore.closeModal();\n globalStore.showSuccess(t('global.saved'));\n}\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n const spokenTextResp = await settingService.getPronunciationSettings();\n\n if (spokenTextResp === null || spokenTextResp === undefined || spokenTextResp.statusCode !== 0) {\n ErrorHandler.handleError(spokenTextResp, ErrorLocationType.table);\n return;\n }\n\n gridStore.setStoreData(spokenTextResp.settingInfo);\n\n globalStore.reorderColumns(TableType[TableType.spokenText]);\n\n globalStore.closeModal();\n // stop spinner\n globalStore.gridDataIsLoading = false;\n};\n\nonMounted(async () => {\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n});\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(Error, {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createVNode(GridInputFilter, {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_4, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ], 64))\n}\n}\n\n})","import script from \"./SpokenTextTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SpokenTextTab.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, vModelText as _vModelText, withDirectives as _withDirectives, vShow as _vShow, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"text-grey mb-4\" }\nconst _hoisted_2 = { class: \"grid grid-cols-1 gap-4 w-1/2 mb-5\" }\nconst _hoisted_3 = { class: \"inputTitle\" }\nconst _hoisted_4 = { class: \"inputField flex-grow\" }\nconst _hoisted_5 = { class: \"inputTitle\" }\nconst _hoisted_6 = { class: \"inputField flex-grow\" }\nconst _hoisted_7 = { class: \"flex\" }\nconst _hoisted_8 = { class: \"text-center\" }\n\nimport {onMounted, ref} from \"vue\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport Error from \"@/components/Error.vue\";\nimport {ErrorLocationType} from \"@/utilities/enums/Enums\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {$t} from \"@/utilities/i18n/config\";\nimport {SettingService} from \"@/utilities/services/entities/SettingService\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'ProviderSettingsTab',\n setup(__props) {\n\nconst currentSettings = ref({dmaPersistence:0,expiredText:\"\"});\nconst globalStore = useGlobalStore();\n\nconst settingService = new SettingService();\n\nconst saveProviderSettings = async ()=>{\n const updatePersistanceResp = await settingService.postUpdateDmaPersistance(currentSettings.value.dmaPersistence);\n if(updatePersistanceResp === null || updatePersistanceResp === undefined || updatePersistanceResp.statusCode !== 0){\n ErrorHandler.handleError(updatePersistanceResp, ErrorLocationType.table);\n return;\n }\n\n const updateExpiredTextResp = await settingService.postUpdateExpiredText(currentSettings.value.expiredText);\n if(updateExpiredTextResp === null || updateExpiredTextResp === undefined || updateExpiredTextResp.statusCode !== 0){\n ErrorHandler.handleError(updateExpiredTextResp, ErrorLocationType.table);\n return;\n }\n\n globalStore.showSuccess($t(\"global.saved\"));\n}\n\nconst setData = async ()=>{\n globalStore.gridDataIsLoading = true;\n const providerSettingsResponse = await settingService.getCompanySettings();\n if(providerSettingsResponse === null || providerSettingsResponse === undefined || providerSettingsResponse.statusCode !== 0){\n ErrorHandler.handleError(providerSettingsResponse, ErrorLocationType.table);\n return;\n }\n\n currentSettings.value.dmaPersistence = +providerSettingsResponse.dmaPersistence;\n currentSettings.value.expiredText = providerSettingsResponse.expiredText;\n\n globalStore.gridDataIsLoading = false;\n}\n\nonMounted(async ()=>{\n await setData();\n})\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(Error, {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"h4\", _hoisted_1, _toDisplayString(_unref($t)('settings.providerSettings.inactiveUsers')), 1),\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_3, _toDisplayString(_unref($t)('settings.providerSettings.elapseTime')), 1),\n _createElementVNode(\"div\", _hoisted_4, [\n _withDirectives(_createElementVNode(\"input\", {\n min: \"0\",\n max: \"30\",\n class: \"w-full\",\n type: \"number\",\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((currentSettings.value.dmaPersistence) = $event))\n }, null, 512), [\n [_vModelText, currentSettings.value.dmaPersistence]\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_5, _toDisplayString(_unref($t)('settings.providerSettings.infoText')), 1),\n _createElementVNode(\"div\", _hoisted_6, [\n _withDirectives(_createElementVNode(\"textarea\", {\n class: \"w-full\",\n rows: \"5\",\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((currentSettings.value.expiredText) = $event))\n }, null, 512), [\n [_vModelText, currentSettings.value.expiredText]\n ])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_7, [\n _createElementVNode(\"button\", {\n class: \"primary ml-auto\",\n onClick: saveProviderSettings\n }, _toDisplayString(_unref($t)('global.save')), 1)\n ])\n ])\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_8, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ], 64))\n}\n}\n\n})","import script from \"./ProviderSettingsTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ProviderSettingsTab.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","export class CoupledSystemSetting {\n id:number = -1;\n name:string = \"\";\n baseUrl:string = \"\";\n loginName:string = \"\";\n password:string = \"\";\n contactName:string = \"\";\n contactEmail:string = \"\";\n contactPhoneNumber:string = \"\";\n // only used for dynamic test column in view\n testCoupling:boolean = false;\n}","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, createElementVNode as _createElementVNode, mergeProps as _mergeProps, vShow as _vShow, withDirectives as _withDirectives, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"block w-full\" }\nconst _hoisted_2 = { class: \"flex mb-4\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_4 = [\n _hoisted_3\n]\nconst _hoisted_5 = [\"disabled\"]\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_7 = [\n _hoisted_6\n]\nconst _hoisted_8 = [\"disabled\"]\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-person\" }, null, -1)\nconst _hoisted_10 = [\n _hoisted_9\n]\nconst _hoisted_11 = { class: \"ml-auto\" }\nconst _hoisted_12 = { class: \"text-center\" }\n\nimport { onBeforeUnmount, onMounted, reactive, ref } from \"vue\";\nimport { BryntumGrid } from \"@bryntum/grid-vue-3\";\nimport { Menu, Store } from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter.vue\";\nimport { useGlobalStore } from \"@/stores/GlobalStore\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport { $t } from \"@/utilities/i18n/config\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport { GeneralResponse } from \"@/models/api/Responses\";\nimport Error from \"@/components/Error.vue\";\nimport {useI18n} from \"vue-i18n\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport dialog from \"@/dialog\";\nimport {CoupledSystemSetting} from \"@/models/system/CoupledSystemSetting\";\nimport {CoupledSystemService} from \"@/utilities/services/entities/CoupledSystemService\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'CoupledSystemsTab',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\n\nconst { t } = useI18n();\nconst coupledSystemService = new CoupledSystemService();\nconst permissionService = new PermissionService();\n\nlet selectedCoupledSystems = ref([]);\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedCoupledSystems.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"settings.coupledSystems.confirmDeletionMulti\", { count:selectedCoupledSystems.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const cs of selectedCoupledSystems.value){\n const resp = await coupledSystemService.deleteCoupledSystemSetting(cs.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:cs.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\n// during the test call the function looses the ref to the grid item, so we need to get it from the grid again\nconst updateTestCouplingColumn = (id:number, value:boolean) => {\n const found = gridStore.records.find(r => r.data.id === id);\n if(found === undefined) return;\n found.testCoupling = value;\n}\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n\tcurrentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage-80}px`;\n};\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n\trelayStoreEvents: true,\n enableTextSelection: true,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n\tcolumns : {\n data: [\n\t\t{ id: 'id', field: 'id', text: t('settings.coupledSystems.grid.id'), width: 100, },\n\t\t{ id: 'name', field: 'name', text: t('settings.coupledSystems.grid.name'), flex: 1, },\n\t\t{ id: 'baseUrl', field: 'baseUrl', text: t('settings.coupledSystems.grid.url'), flex: 1, },\n\t\t{ id: 'loginName', field: 'loginName', text: t('settings.coupledSystems.grid.loginName'), flex: 1, },\n\t\t{\n id: 'testCoupling',\n field: 'testCoupling',\n\t\t\ttext: \"\",\n\t\t\twidth : 150,\n\t\t\ttype: \"template\",\n\t\t\ttemplate: ({record}) => {\n\t\t\t\treturn record.data.testCoupling\n ? ``\n : ``;\n\t\t\t},\n\t\t},\n\t\t{\n id: 'menu',\n\t\t\ttext\t: '',\n\t\t\twidth : 36,\n\t\t\ttype\t: 'widget',\n\t\t\talign: \"center\",\n\t\t\thideable: false,\n\t\t\tresizable: false,\n\t\t\tsortable: false,\n\t\t\tfilterable: false,\n\t\t\twidgets : [{\n\t\t\t\ttype\t : 'button',\n\t\t\t\twidth: 36,\n\t\t\t\ticon\t : 'icon-kontext_horizontal',\n\t\t\t\tonAction : ({ source: btn }) => {\n\t\t\t\t\tconst menu = menuFactory(btn.cellInfo.record.data);\n\t\t\t\t\tmenu.alignTo({ target: btn })\n\t\t\t\t\tmenu.show();\n\t\t\t\t}\n\t\t\t}]\n\t\t},\n\t],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.coupledSystem], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n\tstore: gridStore,\n\tlisteners: {\n\t\tselectionChange(event) {\n\t\t\tif(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedCoupledSystems.value = selectedCoupledSystems.value.concat(event.selected.map(cr => cr.data))\n selectedCoupledSystems.value = selectedCoupledSystems.value.filter(c => !event.deselected.map(cr => cr.data).some(cr => c?.id === cr?.id));\n\t\t},\n\t\tdatachange(){\n\t\t\tglobalStore.currentItems = gridStore.count;\n\t\t\tglobalStore.allItems = gridStore.originalCount;\n\t\t},\n\t\tasync cellClick({column, record}) {\n\t\t\tif (column.data.field === 'testCoupling') {\n updateTestCouplingColumn(record.data.id, true);\n const coupledSystemResp = await coupledSystemService.getLocationsForForeignSystem(record.data.id);\n if (coupledSystemResp === null || coupledSystemResp === undefined || coupledSystemResp.statusCode !== 0){\n updateTestCouplingColumn(record.data.id, false);\n ErrorHandler.handleError(coupledSystemResp as GeneralResponse, ErrorLocationType.table);\n\n return;\n }\n\n updateTestCouplingColumn(record.data.id, false);\n\t\t\t\tglobalStore.showSuccess(t('settings.coupledSystems.testSuccessful'));\n\t\t\t}\n\t\t},\n\t},\n\theight: currentWindowHeight,\n}\nconst gridConfig = reactive(useGridConfig);\n\nconst menuFactory = (record:object) => {\n\tconst menu = new Menu({\n\t\tanchor : true,\n\t\tautoShow : true,\n\t\titems\t: [\n\t\t\t{\n\t\t\t\ttext: t(\"global.edit\"),\n\t\t\t\tcls: 'color',\n\t\t\t\ticon: 'icon-editieren',\n\t\t\t\tweight: 100,\n\t\t\t\tonItem : ({ menu }) => {\n\t\t\t\t\tglobalStore.openPopup({\n\t\t\t\t\t\tdata:menu.record,\n\t\t\t\t\t\taction:addOrUpdateCoupledSystem,\n\t\t\t\t\t\tresetButton:false,\n\t\t\t\t\t\ttitle:$t(\"popups.settings.coupledSystems.edit\"),\n\t\t\t\t\t\ttype:PopupType.settingsEditCoupledSystems\n\t\t\t\t\t});\n\t\t\t\t}\n },\n {\n text : t(\"global.delete\"),\n disabled: !permissionService.userHasPermission(\"CoupledSystem.Delete\"),\n hidden: false,\n cls\t: 'color',\n icon: 'icon-loeschen',\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"settings.coupledSystems.confirmDeletionSingle\", {name: menu.record.name}));\n\n if (answer) {\n const resp = await coupledSystemService.deleteCoupledSystemSetting(menu.record.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n gridStore.applyChangeset({removed:[{id:menu.record.id}]});\n\n globalStore.showSuccess(t('global.deleted'));\n }\n }\n\t\t\t},\n\t\t],\n\t});\n\n\tmenu.setRecord(record);\n\n\treturn menu;\n};\n\n\nconst newCoupledSystem = () => {\n\tglobalStore.openPopup({\n\t\tdata: new CoupledSystemSetting(),\n\t\taction: addOrUpdateCoupledSystem,\n\t\tresetButton:false,\n\t\ttitle:$t(\"popups.settings.coupledSystems.new\"),\n\t\ttype:PopupType.settingsEditCoupledSystems\n\t});\n}\n\nconst resetCredentials = async () => {\n\tglobalStore.openPopup({\n\t\tdata: {},\n\t\taction: () => {},\n\t\tresetButton:false,\n\t\ttitle:$t(\"popups.settings.coupledSystems.resetPassword\"),\n\t\ttype:PopupType.settingsResetCredentials\n\t});\n}\n\nconst addOrUpdateCoupledSystem = async () => {\n\tconst coupledSystem = globalStore.modal.contentObject as CoupledSystemSetting;\n\n\tconst coupledSystemResp = await coupledSystemService.addOrUpdateCoupledSystemSetting(coupledSystem);\n\tif (coupledSystemResp === null || coupledSystemResp === undefined || coupledSystemResp.statusCode !== 0){\n\t\tErrorHandler.handleError(coupledSystemResp as GeneralResponse, ErrorLocationType.popup);\n\t\treturn;\n\t}\n\n\tif(coupledSystem.id < 0) coupledSystem.id = coupledSystemResp.id;\n // fix selection when it was an update -> replace old value in selected-array\n else if(selectedCoupledSystems.value.some(el => el.id === coupledSystem.id)) {\n selectedCoupledSystems.value = selectedCoupledSystems.value.filter(el => el.id !== coupledSystem.id);\n selectedCoupledSystems.value.push(coupledSystem);\n }\n\n\tgridStore.add(coupledSystem);\n\tgridStore.sort(gridStore.sorters);\n\n\tglobalStore.closeModal();\n\tglobalStore.showSuccess(t('global.saved'));\n}\n\nconst setGridData = async ()=>{\n\t// start spinner\n\tglobalStore.gridDataIsLoading = true;\n\n\tconst coupledSystemSettingsResp = await coupledSystemService.getCoupledSystemSettings();\n\n\tif (coupledSystemSettingsResp === null || coupledSystemSettingsResp === undefined || coupledSystemSettingsResp.statusCode !== 0) {\n\t\tErrorHandler.handleError(coupledSystemSettingsResp, ErrorLocationType.table);\n\t\treturn;\n\t}\n\n // add testCouplingProperty only used in this view and not important for other steps (doesn't come from backend so needs to be set here)\n\tgridStore.setStoreData(coupledSystemSettingsResp.settingInfo.map((cs)=>{\n cs.testCoupling = false;\n return cs\n }));\n\n globalStore.reorderColumns(TableType[TableType.coupledSystem]);\n\n\tglobalStore.closeModal();\n\t// stop spinner\n\tglobalStore.gridDataIsLoading = false;\n};\n\nonMounted(async () => {\n\t// calculate grid height and sub to window resize event\n\trecalcGridHeight();\n\twindow.addEventListener('resize', recalcGridHeight);\n\n\tglobalStore.setGridStore(ref(gridStore));\n\tglobalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n\tawait setGridData();\n});\n\nonBeforeUnmount(()=>{\n\twindow.removeEventListener('resize', recalcGridHeight);\n\n\tglobalStore.setGridStore(null);\n\tglobalStore.setGridColumnStore(null);\n\n\tglobalStore.currentItems = 0;\n\tglobalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(Error, {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"button\", {\n class: \"primary mr-2\",\n onClick: newCoupledSystem\n }, _hoisted_4),\n _createElementVNode(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedCoupledSystems).some(()=>true),\n onClick: deleteSelection\n }, _hoisted_7, 8, _hoisted_5),\n _createElementVNode(\"button\", {\n class: \"special mr-2\",\n disabled: !_unref(selectedCoupledSystems).some(()=>true),\n onClick: resetCredentials\n }, _hoisted_10, 8, _hoisted_8),\n _createElementVNode(\"div\", _hoisted_11, [\n _createVNode(GridInputFilter, {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_12, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ], 64))\n}\n}\n\n})","import script from \"./CoupledSystemsTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./CoupledSystemsTab.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, vModelText as _vModelText, withDirectives as _withDirectives, vModelCheckbox as _vModelCheckbox, vShow as _vShow } from \"vue\"\n\nconst _hoisted_1 = { class: \"grid grid-cols-1 gap-4 w-1/2 mb-5\" }\nconst _hoisted_2 = { class: \"text-grey mb-4\" }\nconst _hoisted_3 = { class: \"inputTitle\" }\nconst _hoisted_4 = { class: \"inputField flex-grow\" }\nconst _hoisted_5 = { class: \"error-msg\" }\nconst _hoisted_6 = { class: \"inputTitle\" }\nconst _hoisted_7 = { class: \"inputField flex-grow\" }\nconst _hoisted_8 = { class: \"inputTitle\" }\nconst _hoisted_9 = { class: \"inputField flex-grow\" }\nconst _hoisted_10 = { class: \"inputTitle\" }\nconst _hoisted_11 = { class: \"inputField flex-grow\" }\nconst _hoisted_12 = { class: \"text-grey mb-4\" }\nconst _hoisted_13 = { class: \"inputTitle\" }\nconst _hoisted_14 = { class: \"inputField flex-grow\" }\nconst _hoisted_15 = { class: \"inputTitle\" }\nconst _hoisted_16 = { class: \"inputField flex-grow\" }\nconst _hoisted_17 = { class: \"text-grey mb-4\" }\nconst _hoisted_18 = { class: \"inputTitle\" }\nconst _hoisted_19 = { class: \"inputField flex-grow\" }\nconst _hoisted_20 = { class: \"inputTitle\" }\nconst _hoisted_21 = { class: \"inputField flex-grow\" }\nconst _hoisted_22 = { class: \"error-msg\" }\nconst _hoisted_23 = { class: \"inputTitle\" }\nconst _hoisted_24 = { class: \"inputField flex-grow\" }\nconst _hoisted_25 = { class: \"inputTitle\" }\nconst _hoisted_26 = { class: \"inputField flex-grow\" }\nconst _hoisted_27 = { class: \"inputTitle\" }\nconst _hoisted_28 = { class: \"inputField flex-grow\" }\nconst _hoisted_29 = { class: \"text-grey mb-4\" }\nconst _hoisted_30 = { class: \"inputTitle\" }\nconst _hoisted_31 = { class: \"inputField flex-grow\" }\nconst _hoisted_32 = { class: \"inputTitle\" }\nconst _hoisted_33 = { class: \"inputField flex-grow\" }\nconst _hoisted_34 = { class: \"inputTitle\" }\nconst _hoisted_35 = { class: \"inputField flex-grow\" }\nconst _hoisted_36 = { class: \"flex\" }\nconst _hoisted_37 = [\"disabled\"]\nconst _hoisted_38 = { class: \"text-center\" }\n\nimport {computed, onBeforeUnmount, onMounted, ref} from \"vue\";\nimport Error from \"@/components/Error.vue\";\nimport {DisdiMetadataType, DisdiStateType, ErrorLocationType} from \"@/utilities/enums/Enums\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {$t} from \"@/utilities/i18n/config\";\nimport {SettingService} from \"@/utilities/services/entities/SettingService\";\nimport {defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport {DisdiSetting} from \"@/models/setting/disdi/DisdiSetting\";\nimport {UserService} from \"@/utilities/services/entities/UserService\";\nimport {SelectableRoleInfo} from \"@/models/SelectableRoleInfo\";\nimport Tags from \"@/components/inputs/Tags\";\nimport Select from \"@/components/inputs/Select\";\nimport TextOrSpinner from \"@/components/TextOrSpinner\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport useVuelidate from \"@vuelidate/core\";\nimport {helpers, required} from \"@vuelidate/validators\";\nimport {LocationService} from \"@/utilities/services/entities/LocationService\";\nimport {LocationDisdiInfo} from \"@/models/location/LocationDisdiInfo\";\nimport { deepUnref } from 'vue-deepunref';\nimport { CategoryService } from \"@/utilities/services/entities/CategoryService\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'DisdiSettingsTab',\n setup(__props) {\n\nconst globalStore = useGlobalStore();\nconst categoryService = new CategoryService();\nconst settingService = new SettingService();\nconst userService = new UserService();\nconst permissionService = new PermissionService();\nconst locationService = new LocationService();\n\nconst categoryList = ref([]);\nconst settings = ref(new DisdiSetting());\nconst editRolesList = ref>([]);\nconst readRolesList = ref>([]);\n\nconst selectedRead=ref([])\nconst selectedEdit=ref([])\nconst metaTimestampValues = Object.keys(DisdiMetadataType)\n .filter((x) => Number.isNaN(Number(x)))\n .map((type,i)=>({id:i, name:$t(`settings.disdiSettingsTab.metaTimestampType.${type}`)}))\nconst disdiValues = Object.keys(DisdiStateType)\n .filter((x) => Number.isNaN(Number(x)))\n .map((type,i)=>({id:i, name:$t(`settings.disdiSettingsTab.disdiType.${type}`)}))\nconst loadingConfirm = ref(false);\nlet oldDisdiValue = null as DisdiStateType|null;\n\nconst rules = computed(()=>{\n return {\n disdi: { required: helpers.withMessage($t('validators.required'), required), },\n metaTimestamp: { required: helpers.withMessage($t('validators.required'), required), },\n }\n});\nconst validator = ref(useVuelidate(rules, settings));\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage-80}px`;\n};\n\nconst updateReadList = (value:Array)=>{\n //@ts-expect-error\n settings.value.permissionRead = value;\n}\nconst updateEditList = (value:Array)=>{\n //@ts-expect-error\n settings.value.permissionEdit = value;\n}\nconst setMetaTimestampValue = (value:DisdiMetadataType)=>{\n //@ts-expect-error\n settings.value.metaTimestamp = value;\n}\nconst setDefaultCategory = (value: string) => {\n //@ts-expect-error\n settings.value.defaultCategory = value;\n}\nconst setDisdiValue = (value:DisdiStateType)=>{\n //@ts-expect-error\n settings.value.disdi = value;\n}\nconst checkInputBounds = ({target}:any):number => {\n const min = +target.attributes[\"min\"].value;\n const max = +target.attributes[\"max\"].value;\n return target.valueAsNumber < min\n ? min\n : target.valueAsNumber > max\n ? max\n : target.valueAsNumber;\n}\n\nconst updateDisdiSettings = async ()=>{\n loadingConfirm.value = true;\n\n if(settings.value === null) {\n loadingConfirm.value = false;\n return;\n }\n\n if(!(await validator.value.$validate())){\n loadingConfirm.value = false;\n return;\n }\n\n // save current values (SelectableRoleInfo)\n const convertedRead = settings.value.permissionRead;\n const convertedEdit = settings.value.permissionEdit;\n // convert to string array\n settings.value.permissionRead = settings.value.permissionRead.map(sr => sr.name);\n settings.value.permissionEdit = settings.value.permissionEdit.map(sr => sr.name);\n\n const success = await settingService.updateDisdiSetting(settings.value, ErrorLocationType.table);\n if(!success) {\n loadingConfirm.value = false;\n return;\n }\n\n if(oldDisdiValue !== settings.value.disdi && settings.value.disdi === DisdiStateType.AllLocations){\n const locations = await locationService.getLocations(\"display\", ErrorLocationType.table)\n const newDisdiInfo = locations.map(l => new LocationDisdiInfo(l.id, true));\n await locationService.putSetLocationDisdiSettings(newDisdiInfo, ErrorLocationType.table);\n }\n\n const readRoleString = settings.value.permissionRead.join(\", \");\n const editRoleString = settings.value.permissionEdit.join(\", \");\n\n //TODO magic string? better idea?\n // update anabPolicy-Array with new permission values\n permissionService.updateDynamicPolicy(\"Disdi.Read\", readRoleString);\n permissionService.updateDynamicPolicy(\"Disdi.LocationPropertyEdit\", editRoleString);\n\n // convert array back to SelectableRoleInfo\n settings.value.permissionRead = convertedRead;\n settings.value.permissionEdit = convertedEdit;\n\n // avoid having the ref been carried over to the linked sidebar items\n // an with that this bug: sidebar changes even tough the settings werent saved yet\n globalStore.settings.disdiSettings = deepUnref(settings.value);\n\n loadingConfirm.value = false;\n\n globalStore.showSuccess($t(\"global.saved\"));\n}\n\nconst initSettings = async ()=>{\n categoryList.value = (await categoryService.getCategories(\"display\", ErrorLocationType.popup))?.map((c) => {\n c.name = c.title;\n return c;\n });\n\n settings.value = await settingService.getDisdiSettings(ErrorLocationType.table);\n\n console.log(settings.value)\n\n const roles = await userService.getUserRoles(ErrorLocationType.table) ?? [];\n // flat copy role list to prevent shared options\n readRolesList.value = roles.map(el => ({...el}));\n editRolesList.value = roles.map(el => ({...el}));\n\n //@ts-expect-error\n selectedRead.value = settings.value.permissionRead\n .filter(p => p !== '')\n .map(p => roles.find(r => r.name === p));\n\n //@ts-expect-error\n selectedEdit.value = settings.value.permissionEdit\n .filter(p => p !== '')\n .map(p => roles.find(r => r.name === p));\n\n oldDisdiValue = settings.value.disdi;\n}\n\nconst setRoleDropdowns = ()=>{\n let convertedArray = [];\n for (const r of settings.value.permissionRead){\n const convertedRole = readRolesList.value.find(cr => cr.name === r);\n convertedArray.push(convertedRole);\n\n const index = readRolesList.value.indexOf(convertedRole);\n readRolesList.value.splice(index, 1);\n }\n settings.value.permissionRead = convertedArray;\n\n convertedArray = [];\n for (const r of settings.value.permissionEdit){\n const convertedRole = editRolesList.value.find(cr => cr.name === r);\n convertedArray.push(convertedRole);\n\n const index = editRolesList.value.indexOf(convertedRole);\n editRolesList.value.splice(index, 1);\n }\n settings.value.permissionEdit = convertedArray;\n}\n\nonMounted(async () => {\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.gridDataIsLoading = true;\n\n await initSettings();\n setRoleDropdowns();\n\n globalStore.gridDataIsLoading = false;\n})\n\nonBeforeUnmount(()=>{\n recalcGridHeight();\n window.removeEventListener('resize', recalcGridHeight);\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(Error, {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"h4\", _hoisted_2, _toDisplayString(_unref($t)('settings.disdiSettingsTab.generalDisdiSettings.title')), 1),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_3, _toDisplayString(_unref($t)('settings.disdiSettingsTab.generalDisdiSettings.disdi')), 1),\n _createElementVNode(\"div\", _hoisted_4, [\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: validator.value.disdi.$errors.length })\n }, [\n _createVNode(_unref(Select), {\n options: _unref(disdiValues),\n selected: settings.value.disdi,\n onSelectChanged: setDisdiValue,\n mode: \"single\"\n }, null, 8, [\"options\", \"selected\"]),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(validator.value.disdi.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_5, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2)\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_6, _toDisplayString(_unref($t)('settings.disdiSettingsTab.generalDisdiSettings.picturesAmount')), 1),\n _createElementVNode(\"div\", _hoisted_7, [\n _withDirectives(_createElementVNode(\"input\", {\n min: \"0\",\n max: \"10\",\n step: \"1\",\n onInput: _cache[0] || (_cache[0] = ($event: any) => (settings.value.pictures = checkInputBounds($event))),\n class: \"w-full\",\n type: \"number\",\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((settings.value.pictures) = $event))\n }, null, 544), [\n [_vModelText, settings.value.pictures]\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_8, _toDisplayString(_unref($t)('settings.disdiSettingsTab.generalDisdiSettings.defaultCategory')), 1),\n _createElementVNode(\"div\", _hoisted_9, [\n _createVNode(_unref(Select), {\n options: categoryList.value,\n selected: settings.value.defaultCategory,\n onSelectChanged: setDefaultCategory,\n mode: \"single\"\n }, null, 8, [\"options\", \"selected\"])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_10, _toDisplayString(_unref($t)('settings.disdiSettingsTab.generalDisdiSettings.deleteDeadline')) + \" \" + _toDisplayString(_unref($t)('global.units.days')), 1),\n _createElementVNode(\"div\", _hoisted_11, [\n _withDirectives(_createElementVNode(\"input\", {\n min: \"0\",\n max: \"2000\",\n onInput: _cache[2] || (_cache[2] = ($event: any) => (settings.value.purgeOldDiaryEntriesIntervalDay = checkInputBounds($event))),\n step: \"1\",\n class: \"w-full\",\n type: \"number\",\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((settings.value.purgeOldDiaryEntriesIntervalDay) = $event))\n }, null, 544), [\n [_vModelText, settings.value.purgeOldDiaryEntriesIntervalDay]\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"h4\", _hoisted_12, _toDisplayString(_unref($t)('settings.disdiSettingsTab.disdiPermissionsSettings.title')), 1),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_13, _toDisplayString(_unref($t)('settings.disdiSettingsTab.disdiPermissionsSettings.readRoles')), 1),\n _createElementVNode(\"div\", _hoisted_14, [\n _createVNode(_unref(Tags), {\n selected: selectedRead.value,\n options: readRolesList.value,\n onSelectChanged: updateReadList\n }, null, 8, [\"selected\", \"options\"])\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_15, _toDisplayString(_unref($t)('settings.disdiSettingsTab.disdiPermissionsSettings.editRoles')), 1),\n _createElementVNode(\"div\", _hoisted_16, [\n _createVNode(_unref(Tags), {\n selected: selectedEdit.value,\n options: editRolesList.value,\n onSelectChanged: updateEditList\n }, null, 8, [\"selected\", \"options\"])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"h4\", _hoisted_17, _toDisplayString(_unref($t)('settings.disdiSettingsTab.metadataSettings.title')), 1),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_unref($t)('settings.disdiSettingsTab.metadataSettings.metaEditor')), 1),\n _createElementVNode(\"div\", _hoisted_19, [\n _withDirectives(_createElementVNode(\"input\", {\n type: \"checkbox\",\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((settings.value.metaEditor) = $event)),\n name: \"metaEditor\"\n }, null, 512), [\n [_vModelCheckbox, settings.value.metaEditor]\n ])\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_20, _toDisplayString(_unref($t)('settings.disdiSettingsTab.metadataSettings.metaTimestamp')), 1),\n _createElementVNode(\"div\", _hoisted_21, [\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: validator.value.metaTimestamp.$errors.length })\n }, [\n _createVNode(_unref(Select), {\n options: _unref(metaTimestampValues),\n selected: settings.value.metaTimestamp,\n onSelectChanged: setMetaTimestampValue,\n mode: \"single\"\n }, null, 8, [\"options\", \"selected\"]),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(validator.value.metaTimestamp.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_22, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2)\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_23, _toDisplayString(_unref($t)('settings.disdiSettingsTab.metadataSettings.metaInvisibleTime')) + \" \" + _toDisplayString(_unref($t)('global.units.days')), 1),\n _createElementVNode(\"div\", _hoisted_24, [\n _withDirectives(_createElementVNode(\"input\", {\n min: \"0\",\n max: \"365\",\n step: \"1\",\n onInput: _cache[5] || (_cache[5] = ($event: any) => (settings.value.metaInvisibleTime = checkInputBounds($event))),\n class: \"w-full\",\n type: \"number\",\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = ($event: any) => ((settings.value.metaInvisibleTime) = $event))\n }, null, 544), [\n [_vModelText, settings.value.metaInvisibleTime]\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_25, _toDisplayString(_unref($t)('settings.disdiSettingsTab.metadataSettings.metaInvisible')) + \" \" + _toDisplayString(_unref($t)('global.units.days')), 1),\n _createElementVNode(\"div\", _hoisted_26, [\n _withDirectives(_createElementVNode(\"input\", {\n min: \"0\",\n max: \"365\",\n step: \"1\",\n onInput: _cache[7] || (_cache[7] = ($event: any) => (settings.value.metaInvisible = checkInputBounds($event))),\n class: \"w-full\",\n type: \"number\",\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = ($event: any) => ((settings.value.metaInvisible) = $event))\n }, null, 544), [\n [_vModelText, settings.value.metaInvisible]\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_27, _toDisplayString(_unref($t)('settings.disdiSettingsTab.metadataSettings.metaDeleteAll')) + \" \" + _toDisplayString(_unref($t)('global.units.days')), 1),\n _createElementVNode(\"div\", _hoisted_28, [\n _withDirectives(_createElementVNode(\"input\", {\n min: \"0\",\n max: \"365\",\n step: \"1\",\n onInput: _cache[9] || (_cache[9] = ($event: any) => (settings.value.metaDeleteAll = checkInputBounds($event))),\n class: \"w-full\",\n type: \"number\",\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = ($event: any) => ((settings.value.metaDeleteAll) = $event))\n }, null, 544), [\n [_vModelText, settings.value.metaDeleteAll]\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"h4\", _hoisted_29, _toDisplayString(_unref($t)('settings.disdiSettingsTab.disdiAppSettings.title')), 1),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_30, _toDisplayString(_unref($t)('settings.disdiSettingsTab.disdiAppSettings.useGalleryInApp')), 1),\n _createElementVNode(\"div\", _hoisted_31, [\n _withDirectives(_createElementVNode(\"input\", {\n type: \"checkbox\",\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = ($event: any) => ((settings.value.useGallery) = $event)),\n name: \"useGallery\"\n }, null, 512), [\n [_vModelCheckbox, settings.value.useGallery]\n ])\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_32, _toDisplayString(_unref($t)('settings.disdiSettingsTab.disdiAppSettings.showInAppNr')) + \" \" + _toDisplayString(_unref($t)('global.units.days')), 1),\n _createElementVNode(\"div\", _hoisted_33, [\n _withDirectives(_createElementVNode(\"input\", {\n min: \"0\",\n max: \"50\",\n step: \"1\",\n onInput: _cache[12] || (_cache[12] = ($event: any) => (settings.value.showInAppNr = checkInputBounds($event))),\n class: \"w-full\",\n type: \"number\",\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = ($event: any) => ((settings.value.showInAppNr) = $event))\n }, null, 544), [\n [_vModelText, settings.value.showInAppNr]\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_34, _toDisplayString(_unref($t)('settings.disdiSettingsTab.disdiAppSettings.showInAppDays')) + \" \" + _toDisplayString(_unref($t)('global.units.days')), 1),\n _createElementVNode(\"div\", _hoisted_35, [\n _withDirectives(_createElementVNode(\"input\", {\n min: \"0\",\n max: \"365\",\n onInput: _cache[14] || (_cache[14] = ($event: any) => (settings.value.showInAppDays = checkInputBounds($event))),\n step: \"1\",\n class: \"w-full\",\n type: \"number\",\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = ($event: any) => ((settings.value.showInAppDays) = $event))\n }, null, 544), [\n [_vModelText, settings.value.showInAppDays]\n ])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_36, [\n _createElementVNode(\"button\", {\n disabled: loadingConfirm.value,\n class: \"primary ml-auto\",\n onClick: updateDisdiSettings\n }, [\n _createVNode(_unref(TextOrSpinner), {\n text: _unref($t)('global.save'),\n spin: loadingConfirm.value\n }, null, 8, [\"text\", \"spin\"])\n ], 8, _hoisted_37)\n ])\n ])\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_38, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ], 64))\n}\n}\n\n})","import script from \"./DisdiSettingsTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DisdiSettingsTab.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n\t\n\t\t\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n \n \n \n\t\t\t\n\t\t
\n\t
\n\n\n\n\n\n\n","import script from \"./Settings.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./Settings.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { MinimalLocationInfo } from \"@/models/location/MinimalLocationInfo\";\n\nexport class RegionInfo {\n id:number = -1;\n name:string = \"\";\n syncId:string = \"\";\n locations:Array = [];\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = { class: \"contentBox\" }\nconst _hoisted_3 = { class: \"block w-full\" }\nconst _hoisted_4 = { class: \"flex mb-4\" }\nconst _hoisted_5 = [\"title\"]\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_7 = [\n _hoisted_6\n]\nconst _hoisted_8 = [\"disabled\", \"title\"]\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_10 = [\n _hoisted_9\n]\nconst _hoisted_11 = { class: \"ml-auto\" }\nconst _hoisted_12 = { class: \"text-center\" }\n\nimport { onBeforeUnmount, onMounted, reactive, ref } from \"vue\";\nimport { BryntumGrid } from \"@bryntum/grid-vue-3\";\nimport {Menu, Store, StringHelper} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter\";\nimport { useGlobalStore } from \"@/stores/GlobalStore\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport { $t } from \"@/utilities/i18n/config\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport dialog from \"@/dialog\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport { GeneralResponse } from \"@/models/api/Responses\";\nimport Error from \"@/components/Error\";\nimport { RegionInfo } from \"@/models/group1/RegionInfo\";\nimport {useI18n} from \"vue-i18n\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {Group1Service} from \"@/utilities/services/entities/Group1Service\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Group1',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\nconst { t } = useI18n();\nconst group1Service = new Group1Service();\nconst permissionService = new PermissionService();\n\nlet selectedRegions = ref([]);\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedRegions.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t('global.delete'))\n .cancelText(t('global.cancel'))\n .confirm(t('regions.confirmDeletionMulti', {count:selectedRegions.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const region of selectedRegions.value){\n const resp = await group1Service.deleteRegion(region.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:region.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage}px`;\n};\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n relayStoreEvents: true,\n enableTextSelection: true,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n columns : {\n data: [\n { id:'id', field: 'id', text: t('regions.grid.id'), width: 36, },\n { id:'name', field: 'name', text: t('regions.grid.name'), flex: 1, },\n {\n id:'syncId',\n field: 'syncId',\n text: t('regions.grid.syncId'),\n flex: 1,\n type: \"template\",\n template: ({ record }) => {\n\t\t\t\treturn StringHelper.xss`${record.data.syncId ?? \"\"}`;\n },\n },\n {\n id:'locations',\n field: 'locations',\n text: '',\n\t\t\tsortable: false,\n width : 36,\n type: \"template\",\n template: ({ record }) => {\n\t\t\t\tif(record.data.locations.length > 0)\n\t\t\t\t\treturn `
`;\n\t\t\t\treturn\n\t\t\t},\n },\n {\n id:'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.group1], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n selectionChange(event) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedRegions.value = selectedRegions.value.concat(event.selected.map(rr => rr.data))\n selectedRegions.value = selectedRegions.value.filter(r => !event.deselected.map(rr => rr.data).some(rr => r?.id === rr?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n cellClick({column, record}) {\n if (column.data.field === 'locations' && record.data.locations.length > 0) {\n globalStore.openPopup({\n data: record.data,\n action: globalStore.closeModal,\n title: \"Standorte\",\n type: PopupType.group2Locations\n });\n }\n },\n },\n height: currentWindowHeight,\n}\nconst gridConfig = reactive(useGridConfig);\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: t('global.edit'),\n cls: 'color',\n icon: 'icon-editieren',\n\t\t\t\thidden: !permissionService.userHasPermission(\"Region.Edit\"),\n weight: 100,\n onItem : ({ menu }) => {\n globalStore.openPopup({\n data:menu.record,\n action:addOrUpdateRegion,\n resetButton:false,\n title:$t(\"popups.regionEditor.title.edit\"),\n type:PopupType.regionEditor\n });\n }\n },\n {\n text : t('global.delete'),\n\t\t\t\thidden: !permissionService.userHasPermission(\"Region.Delete\"),\n cls\t: 'color',\n icon: 'icon-loeschen',\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText(t('global.delete'))\n .cancelText(t('global.cancel'))\n .confirm(t('regions.confirmDeletionSingle', {name:menu.record.name}));\n\n if (answer) {\n const resp = await group1Service.deleteRegion(menu.record.id);\n\n if (resp === null || resp === undefined || resp?.statusCode !== 0) {\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n gridStore.applyChangeset({removed: [{id: menu.record.id}]});\n\n globalStore.showSuccess($t('regions.deleted'));\n }\n }\n }\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\n\nconst newRegion = () => {\n const region = new RegionInfo();\n\n globalStore.openPopup({\n data: region,\n action: addOrUpdateRegion,\n resetButton: false,\n title: $t(\"popups.regionEditor.title.new\"),\n type: PopupType.regionEditor\n });\n}\n\nconst addOrUpdateRegion = async () => {\n const region = globalStore.modal.contentObject;\n\n // dont send empty string as syncId (gets set automatically since input is bound to this prop)\n if (region.syncId === \"\") region.syncId = undefined;\n\n const regionResp = await group1Service.addOrUpdateRegion(region);\n if (regionResp === null || regionResp === undefined || regionResp.statusCode !== 0){\n ErrorHandler.handleError(regionResp as GeneralResponse, ErrorLocationType.popup);\n return;\n }\n\n if(region.id < 0) region.id = regionResp.id;\n // fix selection when it was an update -> replace old value in selected-array\n else if(selectedRegions.value.some(el => el.id === region.id)) {\n selectedRegions.value = selectedRegions.value.filter(el => el.id !== region.id);\n selectedRegions.value.push(region);\n }\n\n gridStore.add(region);\n gridStore.sort(gridStore.sorters);\n\n globalStore.closeModal();\n globalStore.showSuccess('Gespeichert');\n}\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n const regionsResp = await group1Service.getRegions(\"display\");\n\n if (regionsResp === null || regionsResp === undefined || regionsResp.statusCode !== 0) {\n ErrorHandler.handleError(regionsResp, ErrorLocationType.table);\n return;\n }\n\n gridStore.setStoreData(regionsResp.regionInfo);\n\n globalStore.reorderColumns(TableType[TableType.group1]);\n\n globalStore.closeModal();\n // stop spinner\n globalStore.gridDataIsLoading = false;\n};\n\nonMounted(async () => {\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n})\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)(\"regions.title\")), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", _hoisted_4, [\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n onClick: newRegion,\n title: _unref(t)('regions.new')\n }, _hoisted_7, 8, _hoisted_5)), [\n [_directive_permission, 'Region.Create']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedRegions).some(()=>true),\n onClick: deleteSelection,\n title: _unref(t)('global.delete')\n }, _hoisted_10, 8, _hoisted_8)), [\n [_directive_permission, 'Region.Delete']\n ]),\n _createElementVNode(\"div\", _hoisted_11, [\n _createVNode(_unref(GridInputFilter), {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_12, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ])\n ], 64))\n}\n}\n\n})","import script from \"./Group1.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Group1.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","export default function getBrowserLocale(options = {}) {\n const defaultOptions = { countryCodeOnly: false }\n\n const opt = { ...defaultOptions, ...options }\n\n const navigatorLocale =\n navigator.languages !== undefined\n ? navigator.languages[0]\n : navigator.language\n\n if (!navigatorLocale) {\n return undefined\n }\n\n const trimmedLocale = opt.countryCodeOnly\n ? navigatorLocale.trim().split(/-|_/)[0]\n : navigatorLocale.trim()\n\n return trimmedLocale\n}\n","export class UserPreference {\n tableName:string = \"\";\n attributeName:string = \"\";\n attributeValue:string = \"\";\n}","class PolicyHelper{\n public getPolicyFromRoute(route:string):string{\n // special case for providerDetails/companyWorkers & disdi:\n if (route.match(/\\/providermanagement\\/:?\\w+/gm)?.some(()=>true)) return \"ProviderManagementPolicy.CompanyWorker.Navigation.Show\";\n if (route.match(/\\/disdi\\/\\w+\\/\\w+/gm)?.some(()=>true)) return \"Disdi.Read\";\n\n switch(route){\n case \"/locationRegistration\":\n case \"/locationRegistration/\":\n return \"LocationReport.Navigation.Show\";\n case \"/locationManagement\":\n case \"/locationManagement/\":\n return \"LocationManagement.Navigation.Show\";\n case \"/registrationReports\":\n case \"/registrationReports/\":\n return \"RegistrationReport.Navigation.Show\";\n case \"/anabmeldung\":\n case \"/anabmeldung/\":\n return \"Registartion.Manual\";\n case \"/safetyInstructions\":\n case \"/safetyInstructions/\":\n return \"SafetyInstruction.Navigation.Show\";\n case \"/users\":\n case \"/users/\":\n return \"UserAdministrator.User.Navigation.Show\";\n case \"/controlCenter\":\n case \"/controlCenter/\":\n return \"ControlCenter.Navigation.Show\";\n case \"/settings\":\n case \"/settings/\":\n return \"Setting.Navigation.Show\";\n case \"/group1\":\n case \"/group1/\":\n return \"Region.Navigation.Show\";\n case \"/group2\":\n case \"/group2/\":\n return \"Region.Navigation.Show\";\n case \"/activity\":\n case \"/activity/\":\n return \"ActivitySets.Show\";\n case \"/providermanagement\":\n case \"/providermanagement/\":\n return \"ProviderManagementPolicy.Read\";\n case \"/notifications\":\n case \"/notifications/\":\n return \"Notification.Navigation.Show\";\n case \"/category\":\n case \"/category/\":\n return \"Category.Read\";\n default:\n return \"\";\n }\n }\n}\n\nexport default new PolicyHelper();\n","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, vModelSelect as _vModelSelect, withDirectives as _withDirectives, vModelText as _vModelText, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = {\n key: 0,\n class: \"contentBox\"\n}\nconst _hoisted_3 = { class: \"block w-full\" }\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_5 = { class: \"grid grid-cols-2 gap-4 w-full\" }\nconst _hoisted_6 = { class: \"inputTitle\" }\nconst _hoisted_7 = { class: \"inputField flex-grow\" }\nconst _hoisted_8 = { class: \"inputTitle\" }\nconst _hoisted_9 = { class: \"inputField flex-grow\" }\nconst _hoisted_10 = { class: \"inputTitle\" }\nconst _hoisted_11 = { class: \"inputField flex-grow\" }\nconst _hoisted_12 = { class: \"inputTitle\" }\nconst _hoisted_13 = { class: \"inputField flex-grow\" }\nconst _hoisted_14 = { class: \"inputTitle\" }\nconst _hoisted_15 = { class: \"inputField flex-grow\" }\nconst _hoisted_16 = { class: \"inputTitle\" }\nconst _hoisted_17 = { class: \"inputField flex-grow\" }\nconst _hoisted_18 = { class: \"contentBox\" }\nconst _hoisted_19 = { class: \"block w-full\" }\nconst _hoisted_20 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_21 = { class: \"grid grid-cols-2 gap-4 w-full\" }\nconst _hoisted_22 = { class: \"inputTitle\" }\nconst _hoisted_23 = { class: \"inputField flex-grow\" }\nconst _hoisted_24 = [\"value\"]\nconst _hoisted_25 = { class: \"inputTitle\" }\nconst _hoisted_26 = { class: \"inputField flex-grow\" }\nconst _hoisted_27 = /*#__PURE__*/_createElementVNode(\"option\", { value: \"de\" }, \"Deutsch\", -1)\nconst _hoisted_28 = /*#__PURE__*/_createElementVNode(\"option\", { value: \"en\" }, \"Englisch\", -1)\nconst _hoisted_29 = [\n _hoisted_27,\n _hoisted_28\n]\nconst _hoisted_30 = { class: \"contentBox\" }\nconst _hoisted_31 = { class: \"block w-full\" }\nconst _hoisted_32 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_33 = { class: \"grid grid-cols-2 gap-4 w-full\" }\nconst _hoisted_34 = { class: \"inputTitle\" }\nconst _hoisted_35 = { class: \"inputField flex-grow\" }\nconst _hoisted_36 = [\"disabled\"]\nconst _hoisted_37 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_38 = { class: \"error-msg\" }\nconst _hoisted_39 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_40 = { class: \"inputTitle\" }\nconst _hoisted_41 = { class: \"inputField flex-grow\" }\nconst _hoisted_42 = [\"disabled\"]\nconst _hoisted_43 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_44 = { class: \"error-msg\" }\nconst _hoisted_45 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_46 = { class: \"inputTitle\" }\nconst _hoisted_47 = { class: \"inputField flex-grow\" }\nconst _hoisted_48 = [\"disabled\"]\nconst _hoisted_49 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_50 = { class: \"error-msg\" }\nconst _hoisted_51 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_52 = [\"disabled\"]\nconst _hoisted_53 = { class: \"smallText mt-4\" }\nconst _hoisted_54 = { class: \"pl-4 pt-4\" }\nconst _hoisted_55 = [\"innerHTML\"]\nconst _hoisted_56 = { class: \"contentBox\" }\nconst _hoisted_57 = { class: \"block w-full\" }\nconst _hoisted_58 = { class: \"grid grid-cols-2 gap-4 w-full\" }\n\nimport {useGlobalStore} from '@/stores/GlobalStore'\nimport getBrowserLocale from '@/utilities/helpers/GetBrowserLanguage'\nimport {ErrorLocationType, PreferenceType} from '@/utilities/enums/Enums';\nimport Text from \"@/components/inputs/Text\";\nimport {helpers, minLength, required, sameAs} from '@vuelidate/validators';\nimport useVuelidate from '@vuelidate/core';\nimport {computed, onMounted, reactive, Ref, ref} from \"vue\";\nimport {$t, i18n} from \"@/utilities/i18n/config\";\nimport Error from \"@/components/Error\";\nimport moment from 'moment';\nimport router from '@/router';\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {UserPreference} from \"@/models/user/UserPreference\";\nimport {forbiddenStartupRouteNames} from \"@/AppConfig\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport PolicyHelper from \"@/utilities/helpers/PolicyHelper\";\nimport {RouteRecordNormalized} from \"vue-router\";\nimport {AccountService} from \"@/utilities/services/entities/AccountService\";\nimport {UserService} from \"@/utilities/services/entities/UserService\";\nimport {useI18n} from \"vue-i18n\";\nimport TextOrSpinner from \"@/components/TextOrSpinner.vue\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Account',\n setup(__props) {\n\nconst { t } = useI18n();\nconst globalStore = useGlobalStore();\nconst accountService = new AccountService();\nconst userService = new UserService();\nconst permissionService = new PermissionService();\n\nlet showChangePasswordError = ref(false);\nlet changePasswordError = ref(null);\nconst loading:Ref = ref(false);\nconst availableRoutes:Ref = ref([]);\n\nconst passwordChangedMoment = computed(()=>{\n return moment(globalStore.user?.lastPasswordChange).format('DD.MM.YYYY HH:mm') ?? \"\"\n})\n\nconst form = reactive({\n oldPassword: '',\n newPassword: '',\n confirmPassword: '',\n})\nconst newPasswordRules = computed(() => {\n\n\tconst hasNoneAlphaNum = helpers.regex(/\\W/);\n\tconst hasNumber = helpers.regex(/\\d/);\n\tconst hasUppercaseLetter = helpers.regex(/[A-Z]/);\n\tconst hasLowercaseLetter = helpers.regex(/[a-z]/);\n\n return {\n oldPassword: { required: helpers.withMessage($t('validators.required'), required), },\n newPassword: {\n\t\t\trequired: helpers.withMessage(t('validators.required'), required),\n\t\t\tminLength: helpers.withMessage(t('validators.minLength', {amount: 8}), minLength(8)),\n\t\t\thasNoneAlphaNum: helpers.withMessage(t('validators.hasNoneAlphaNum'), hasNoneAlphaNum),\n\t\t\thasNumber: helpers.withMessage(t('validators.hasNumber'), hasNumber),\n\t\t\thasUppercaseLetter: helpers.withMessage(t('validators.hasUppercaseLetter'), hasUppercaseLetter),\n\t\t\thasLowercaseLetter: helpers.withMessage(t('validators.hasLowercaseLetter'), hasLowercaseLetter),\n\t\t},\n confirmPassword: {\n required: helpers.withMessage($t('validators.required'), required),\n sameAsPassword: helpers.withMessage($t('validators.sameAs'), sameAs(form.newPassword)),\n },\n }\n})\nconst v$ = useVuelidate(newPasswordRules, form);\n\n\nconst changeUserStartPage = async({target}:any)=>{\n globalStore.userPreferences.general.userStartPage = target.value;\n\n await updateGeneralPreferences();\n\n globalStore.showSuccess($t('settings.startPageSaved'));\n}\n\nconst changeUserLocale = async({target}:any)=>{\n globalStore.userPreferences.general.userLocale = target.value;\n i18n.global.locale.value = target.value;\n\n await updateGeneralPreferences();\n\n globalStore.showSuccess($t('settings.languageSaved'));\n}\n\nconst updateGeneralPreferences = async ()=>{\n const prefList = [];\n\n // go through general prefs in globalStore and use reflection to fill array with UserPreference objects\n for (const keyValueArray of Object.entries(globalStore.userPreferences.general)){\n // skip darkMode if it is set to FALSE to make automatism in Login.vue work\n if(keyValueArray[0] === \"darkMode\" && !keyValueArray[1]) continue;\n\n let converted = new UserPreference();\n converted.attributeName = keyValueArray[0];\n // @ts-expect-error\n converted.attributeValue = keyValueArray[1];\n\n prefList.push(converted);\n }\n\n // @ts-expect-error\n const preferenceUpdateResp = await userService.setUserPreferences(globalStore.user.id, PreferenceType.general, \"\", false, prefList);\n if (preferenceUpdateResp === null || preferenceUpdateResp === undefined || preferenceUpdateResp.statusCode !== 0){\n ErrorHandler.handleError(preferenceUpdateResp , ErrorLocationType.form);\n return;\n }\n}\n\nconst isValidStartUpPage = (route:any) => {\n return !forbiddenStartupRouteNames.includes(route.name);\n}\n\nconst isPermittedForRoute = (route:any) => {\n if(route.name === \"Account\") return true;\n const permissionString = PolicyHelper.getPolicyFromRoute(route.path);\n return permissionService.userHasPermission(permissionString);\n}\n\nonMounted(async ()=>{\n availableRoutes.value = router.getRoutes()\n .filter(or => isValidStartUpPage(or))\n .filter(r => isPermittedForRoute(r))\n})\n\nconst logoutUser = async () =>{\n const resp = await accountService.logout();\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n globalStore.user = null;\n globalStore.token = \"\";\n\n globalStore.resetState();\n\n await router.push(\"/logout\");\n};\n\nconst updateUserInGlobalStore = async ()=>{\n const user = await userService.getUserById(globalStore.user.id, ErrorLocationType.login);\n if(NullOrUndefinedHelper(user)) return;\n\n globalStore.setUser(user);\n}\n\nconst resetPassword = async () => {\n loading.value = true;\n showChangePasswordError.value = false;\n\n const isFormCorrect = await v$.value.$validate()\n if (!isFormCorrect) {\n // VALIDATOR ERROR\n loading.value = false;\n return\n }\n\n // @ts-expect-error\n const resp = await accountService.changePassword(globalStore.user.id, form.oldPassword, form.newPassword, form.confirmPassword);\n\n if(resp === null || resp === undefined || resp.statusCode !== 0){\n // @ts-expect-error\n changePasswordError.value = resp;\n showChangePasswordError.value = true;\n\n // @ts-expect-error\n globalStore.error.type = \"error\";\n globalStore.error.text = resp?.statusDescription;\n // @ts-expect-error\n globalStore.error.code = resp?.statusCode;\n globalStore.error.location = ErrorLocationType.form;\n\n loading.value = false;\n return;\n }\n\n else {\n // Password changed\n globalStore.showSuccess($t('account.passwordReset'));\n loading.value = false;\n form.oldPassword = \"\";\n form.newPassword = \"\";\n form.confirmPassword = \"\";\n v$.value.$reset();\n\n await updateUserInGlobalStore();\n }\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)('account.myAccount')), 1)\n ]),\n (_unref(globalStore).user != null)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)('account.user')), 1),\n _hoisted_4,\n _createElementVNode(\"div\", _hoisted_5, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_6, _toDisplayString(_unref($t)('account.firstName')), 1),\n _createElementVNode(\"div\", _hoisted_7, [\n _createVNode(_unref(Text), {\n modelValue: _unref(globalStore).user.firstName,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_unref(globalStore).user.firstName) = $event)),\n disabled: \"disabled\"\n }, null, 8, [\"modelValue\"])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_8, _toDisplayString(_unref($t)('account.lastName')), 1),\n _createElementVNode(\"div\", _hoisted_9, [\n _createVNode(_unref(Text), {\n modelValue: _unref(globalStore).user.lastName,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((_unref(globalStore).user.lastName) = $event)),\n disabled: \"disabled\"\n }, null, 8, [\"modelValue\"])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_10, _toDisplayString(_unref($t)('account.email')), 1),\n _createElementVNode(\"div\", _hoisted_11, [\n _createVNode(_unref(Text), {\n modelValue: _unref(globalStore).user.email,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((_unref(globalStore).user.email) = $event)),\n disabled: \"disabled\"\n }, null, 8, [\"modelValue\"])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_12, _toDisplayString(_unref($t)('account.username')), 1),\n _createElementVNode(\"div\", _hoisted_13, [\n _createVNode(_unref(Text), {\n modelValue: _unref(globalStore).user.email,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((_unref(globalStore).user.email) = $event)),\n disabled: \"disabled\"\n }, null, 8, [\"modelValue\"])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_14, _toDisplayString(_unref($t)('account.roles')), 1),\n _createElementVNode(\"div\", _hoisted_15, [\n _createVNode(_unref(Text), {\n modelValue: _unref(globalStore).user.roles,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((_unref(globalStore).user.roles) = $event)),\n disabled: \"disabled\"\n }, null, 8, [\"modelValue\"])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_16, _toDisplayString(_unref($t)('account.kid')), 1),\n _createElementVNode(\"div\", _hoisted_17, [\n _createVNode(_unref(Text), {\n modelValue: _unref(globalStore).user.kid,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = ($event: any) => ((_unref(globalStore).user.kid) = $event)),\n disabled: \"disabled\"\n }, null, 8, [\"modelValue\"])\n ])\n ])\n ])\n ])\n ]))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"div\", _hoisted_18, [\n _createElementVNode(\"div\", _hoisted_19, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)('account.settings')), 1),\n _hoisted_20,\n _createElementVNode(\"div\", _hoisted_21, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_22, _toDisplayString(_unref($t)('account.startpage')), 1),\n _createElementVNode(\"div\", _hoisted_23, [\n _withDirectives(_createElementVNode(\"select\", {\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = ($event: any) => ((_unref(globalStore).userPreferences.general.userStartPage) = $event)),\n onChange: changeUserStartPage\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(availableRoutes.value, ({path, name}) => {\n return (_openBlock(), _createElementBlock(\"option\", {\n value: path,\n key: path\n }, _toDisplayString(_unref($t)(`sidebar.${name}`)), 9, _hoisted_24))\n }), 128))\n ], 544), [\n [_vModelSelect, _unref(globalStore).userPreferences.general.userStartPage]\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_25, _toDisplayString(_unref($t)('account.language')) + \" (\" + _toDisplayString(_unref($t)('account.browserLanguage')) + \": \" + _toDisplayString(_unref(getBrowserLocale)()) + \" (\" + _toDisplayString(_unref(getBrowserLocale)({ countryCodeOnly: true })) + \")) \", 1),\n _createElementVNode(\"div\", _hoisted_26, [\n _withDirectives(_createElementVNode(\"select\", {\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = ($event: any) => ((_unref(globalStore).userPreferences.general.userLocale) = $event)),\n onChange: changeUserLocale\n }, _hoisted_29, 544), [\n [_vModelSelect, _unref(globalStore).userPreferences.general.userLocale]\n ])\n ])\n ])\n ])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_30, [\n _createElementVNode(\"div\", _hoisted_31, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)('account.passwordTitle')), 1),\n _hoisted_32,\n _createElementVNode(\"div\", _hoisted_33, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_34, _toDisplayString(_unref($t)('account.passwordCurrent')), 1),\n _createElementVNode(\"div\", _hoisted_35, [\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: _unref(v$).oldPassword.$errors.length })\n }, [\n _withDirectives(_createElementVNode(\"input\", {\n disabled: loading.value,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = ($event: any) => ((form.oldPassword) = $event)),\n class: \"form-control w-full\",\n type: \"password\",\n placeholder: \"Passwort*\",\n autocomplete: \"old-password\",\n required: \"\"\n }, null, 8, _hoisted_36), [\n [_vModelText, form.oldPassword]\n ]),\n _hoisted_37,\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(v$).oldPassword.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_38, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2)\n ]),\n _hoisted_39,\n _createElementVNode(\"div\", _hoisted_40, _toDisplayString(_unref($t)('account.passwordNew')), 1),\n _createElementVNode(\"div\", _hoisted_41, [\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: _unref(v$).newPassword.$errors.length })\n }, [\n _withDirectives(_createElementVNode(\"input\", {\n disabled: loading.value,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = ($event: any) => ((form.newPassword) = $event)),\n class: \"form-control w-full\",\n type: \"password\",\n placeholder: \"Neues Passwort*\",\n autocomplete: \"new-password\",\n required: \"\"\n }, null, 8, _hoisted_42), [\n [_vModelText, form.newPassword]\n ]),\n _hoisted_43,\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(v$).newPassword.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_44, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2)\n ]),\n _hoisted_45,\n _createElementVNode(\"div\", _hoisted_46, _toDisplayString(_unref($t)('account.passwordRepeat')), 1),\n _createElementVNode(\"div\", _hoisted_47, [\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: _unref(v$).confirmPassword.$errors.length })\n }, [\n _withDirectives(_createElementVNode(\"input\", {\n disabled: loading.value,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = ($event: any) => ((form.confirmPassword) = $event)),\n class: \"form-control w-full\",\n type: \"password\",\n placeholder: \"Neues Passwort*\",\n autocomplete: \"new-password\",\n required: \"\"\n }, null, 8, _hoisted_48), [\n [_vModelText, form.confirmPassword]\n ]),\n _hoisted_49,\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(v$).confirmPassword.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_50, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2)\n ]),\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).form,\n class: \"mt-4\"\n }, null, 8, [\"errorLoc\"]),\n _hoisted_51,\n _createElementVNode(\"button\", {\n disabled: loading.value,\n onClick: resetPassword,\n class: _normalizeClass([\"btn\", loading.value ? 'disabled' : 'primary'])\n }, [\n _createVNode(TextOrSpinner, {\n text: _unref($t)('account.passwordResetButton'),\n spin: loading.value\n }, null, 8, [\"text\", \"spin\"])\n ], 10, _hoisted_52),\n _createElementVNode(\"div\", _hoisted_53, _toDisplayString(_unref($t)('account.lastPasswordChangeText')) + \": \" + _toDisplayString(_unref(passwordChangedMoment)), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_54, [\n _createElementVNode(\"div\", {\n innerHTML: _unref($t)('login.tabs.changePassword.newPasswordDescription')\n }, null, 8, _hoisted_55)\n ])\n ])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_56, [\n _createElementVNode(\"div\", _hoisted_57, [\n _createElementVNode(\"div\", _hoisted_58, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"button\", {\n class: \"btn primary\",\n onClick: logoutUser\n }, _toDisplayString(_unref($t)('account.logout')), 1)\n ])\n ])\n ])\n ])\n ]))\n}\n}\n\n})","import script from \"./Account.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Account.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import {globalProps} from '@/main';\nimport {CoupledSafetyInstructionActionType, ErrorLocationType} from \"@/utilities/enums/Enums\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {SafetyInstructionService} from \"@/utilities/services/entities/SafetyInstructionService\";\n\n/*\n this class holds & offers all the backend functions that can be run by the frontend via SignalR\n*/\nclass SignalRSender {\n public async actOnCoupledSecurityInstruction(id:number, decision:CoupledSafetyInstructionActionType){\n const connection = globalProps.signalRConnection;\n const safetyInstructionService = new SafetyInstructionService();\n\n let resp = undefined;\n switch (decision) {\n case CoupledSafetyInstructionActionType.accept:\n resp = await safetyInstructionService.AcceptCoupledSafetyInstruction(id);\n break;\n case CoupledSafetyInstructionActionType.decline:\n resp = await safetyInstructionService.deleteSafetyInstruction(id);\n break;\n default:\n return;\n }\n\n if(resp === null || resp === undefined || resp.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n console.log(`signalR is ${connection.state} with ${connection.baseUrl}`)\n connection.send(\"discardNotification\", id);\n }\n\n public discardNotification(id:number){\n const connection = globalProps.signalRConnection;\n\n console.log(`signalR is ${connection.state} with ${connection.baseUrl}`)\n connection.send(\"discardNotification\", id);\n }\n}\n\nexport default new SignalRSender();","import { defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, unref as _unref, createVNode as _createVNode, mergeProps as _mergeProps, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-81f2d22a\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = { class: \"contentBox\" }\nconst _hoisted_3 = { class: \"inputField flex-grow\" }\nconst _hoisted_4 = { class: \"float-left\" }\nconst _hoisted_5 = [\"disabled\"]\nconst _hoisted_6 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1))\nconst _hoisted_7 = [\n _hoisted_6\n]\nconst _hoisted_8 = { class: \"float-right\" }\nconst _hoisted_9 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { class: \"clear-both\" }, null, -1))\n\nimport { useGlobalStore } from '@/stores/GlobalStore'\nimport { BryntumGrid } from \"@bryntum/grid-vue-3\";\nimport {Menu, Store} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter\";\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport {useI18n} from \"vue-i18n\";\nimport moment from 'moment';\nimport {CoupledSafetyInstructionActionType, ErrorLocationType, TableType} from \"@/utilities/enums/Enums\";\nimport dialog from \"@/dialog\";\nimport SignalRSender from \"@/utilities/signalR/signalRSender\";\nimport {checkboxColumnConfig} from \"@/AppConfig\";\nimport {HubNotification} from \"@/models/HubNotification\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {MiscService} from \"@/utilities/services/entities/MiscService\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Notifications',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\nconst { t } = useI18n();\n\nconst miscService = new MiscService();\n\nconst selectedNotifs = ref>([]);\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedNotifs.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t('global.delete'))\n .cancelText(t('global.cancel'))\n .confirm(t('notifications.confirmDeletionMulti', {count:selectedNotifs.value.length}));\n\n if (answer) {\n try {\n for (const notif of selectedNotifs.value) {\n if (!hasNoSafetyInstruction(notif)) {\n // CAUTION changed from declined to accept to simplyfy and clarify work flwo and seperate SHs from Notifications\n await SignalRSender.actOnCoupledSecurityInstruction(notif.id, CoupledSafetyInstructionActionType.accept)\n } else {\n SignalRSender.discardNotification(notif.id)\n }\n\n globalStore.notifications = globalStore.notifications.filter(n => n.id !== notif.id);\n gridStore.applyChangeset({removed:[{id:notif.id}]});\n }\n }\n catch (e) {\n console.log(\"notif removal failed:\", e)\n }\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n relayStoreEvents: true,\n autoHeight : true,\n enableTextSelection: true,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n columns : {\n data: [\n {\n id:'notificationText',\n field : 'notificationText',\n text: t('notifications.text'),\n flex : 1,\n sortable: false,\n autoHeight: true,\n htmlEncode : false,\n renderer({ record }) {\n\t\t\t\t\treturn record.data.text;\n },\n },\n {\n id:'type',\n field : 'type',\n text: t('notifications.type'),\n width : 120,\n sortable: true,\n type: 'template',\n template: ({ record }) => {\n return \"\"+record.data.type+\"
\";\n },\n },\n {\n id:'date',\n field : 'date',\n text: t('notifications.date'),\n width: 200,\n sortable: true,\n type: 'template',\n template: ({ record }) => {\n return moment(record.data.date).format('DD.MM.YYYY HH:mm');\n },\n },\n\t\t\t{\n\t\t\t\tid: 'infoButton',\n\t\t\t\tfield: 'infoButton',\n\t\t\t\ttext: \"\",\n\t\t\t\twidth: 50,\n\t\t\t\tminWidth: 50,\n\t\t\t\tsortable: false,\n\t\t\t\ttype: \"template\",\n\t\t\t\ttemplate: ({record}) => {\n\t\t\t\t\tif (record.data.safetyInstruction !== null) {\n\t\t\t\t\t\treturn `
`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n {\n id:'menu',\n text : '',\n width : 36,\n type : 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [\n {\n type : 'button',\n width: 36,\n icon : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }\n ]\n }\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.notification], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n selectionChange(event) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedNotifs.value = selectedNotifs.value.concat(event.selected.map(nr => nr.data))\n selectedNotifs.value = selectedNotifs.value.filter(n => !event.deselected.map(nr => nr.data).some(nr => n?.id === nr?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n async cellClick({column, record}) {\n\n if (column.data.field === 'infoButton') {\n\n if(!hasNoSafetyInstruction(record.data)) {\n try {\n const locationNames = record.data.safetyInstruction.safetyInstructionLocations\n .map(l => l.name)\n .join(\", \");\n\n const answer = await dialog\n .okText(t(\"notifications.applySafetyInstruction\"))\n .cancelText(t(\"global.cancel\"))\n .title(t(\"notifications.promptInformationTitle\", {locationNames: locationNames}))\n .hint(t(\"notifications.promptInformationHint\"))\n .confirm(t(\"notifications.promptInformationBody\", {name: record.data.safetyInstruction.name, text: record.data.safetyInstruction.text}));\n\n if (answer) {\n await SignalRSender.actOnCoupledSecurityInstruction(record.data.id, CoupledSafetyInstructionActionType.accept);\n }\n }\n catch (e:any) {\n console.log(\"reading safetyInstruction from Hub message failed:\", e);\n }\n }\n }\n },\n },\n}\nconst gridConfig = reactive(useGridConfig);\n\nconst hasNoSafetyInstruction = (record) => {\n return record.safetyInstruction === null || record.safetyInstruction === undefined;\n}\n\nconst menuFactory = (record) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items : [\n {\n text : t('notifications.showDetails'),\n cls : '',\n hidden: hasNoSafetyInstruction(record),\n onItem : async () => {\n if(hasNoSafetyInstruction(menu.record)) return;\n\n const locationNames = menu.record.safetyInstruction.safetyInstructionLocations\n .map(l => l.name)\n .join(\", \");\n\n const answer = await dialog\n .okText(t(\"notifications.applySafetyInstruction\"))\n .cancelText(t(\"global.cancel\"))\n .title(t(\"notifications.promptInformationTitle\", {locationNames: locationNames}))\n .hint(t(\"notifications.promptInformationHint\"))\n .confirm(t(\"notifications.promptInformationBody\", {name: menu.record.safetyInstruction.name, text: menu.record.safetyInstruction.text}));\n\n if (answer) {\n await SignalRSender.actOnCoupledSecurityInstruction(record.data.id, CoupledSafetyInstructionActionType.accept);\n }\n },\n weight : 200\n },\n {\n text : t('global.delete'),\n cls : '',\n onItem : async () => {\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"notifications.confirmDeletionSingle\"));\n\n if (answer) {\n if(!hasNoSafetyInstruction(record)){\n // CAUTION changed from declined to accept to simplyfy and clarify work flwo and seperate SHs from Notifications\n await SignalRSender.actOnCoupledSecurityInstruction(menu.record.id, CoupledSafetyInstructionActionType.accept)\n }\n else {\n SignalRSender.discardNotification(menu.record.id)\n }\n\n //globalStore.notifications = globalStore.notifications.filter(n => n.id !== menu.record.id);\n gridStore.applyChangeset({removed:[{id:menu.record.id}]});\n\n globalStore.showSuccess(t('global.deleted'));\n }\n },\n weight : 200\n }\n ]})\n\n menu.setRecord(record);\n\n return menu;\n};\n\nconst setGridData = async ()=>{\n //get current backend notifs\n const notifResp = await miscService.getHubNotifications();\n if(notifResp === null || notifResp === undefined || notifResp?.statusCode !== 0){\n ErrorHandler.handleError(notifResp, ErrorLocationType.table);\n\n return;\n }\n\n // update globalStore with resp\n globalStore.notifications = notifResp.notifications;\n gridStore.setStoreData(globalStore.notifications);\n\n globalStore.reorderColumns(TableType[TableType.notification]);\n}\n\nonMounted(async () => {\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n})\n\nonBeforeUnmount(()=>{\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t('notifications.headline')), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", _hoisted_4, [\n _createElementVNode(\"button\", {\n class: \"primary mr-2\",\n disabled: !selectedNotifs.value.some(()=>true),\n onClick: deleteSelection\n }, _hoisted_7, 8, _hoisted_5)\n ]),\n _createElementVNode(\"div\", _hoisted_8, [\n _createVNode(_unref(GridInputFilter), {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ]),\n _hoisted_9,\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ])\n ])\n ]))\n}\n}\n\n})","import script from \"./Notifications.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Notifications.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./Notifications.vue?vue&type=style&index=0&id=81f2d22a&scoped=true&lang=css\"\n\nimport exportComponent from \"/Users/digi_mt/web/1ANAB_Vue_Frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-81f2d22a\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, unref as _unref, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = {\n id: \"errorpage\",\n class: \"w-full h-full\"\n}\nconst _hoisted_2 = { class: \"flex flex-col h-full justify-center items-center\" }\nconst _hoisted_3 = { class: \"description text-center\" }\nconst _hoisted_4 = [\"innerHTML\"]\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_6 = { key: 0 }\nconst _hoisted_7 = [\"href\", \"onClick\"]\nconst _hoisted_8 = { key: 1 }\nconst _hoisted_9 = [\"onClick\"]\n\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'PageNotFound',\n setup(__props) {\n\nconst globalStore = useGlobalStore();\n\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"h1\", null, _toDisplayString(_ctx.$t(\"404.headline\")), 1),\n _createElementVNode(\"h3\", null, _toDisplayString(_ctx.$t(\"404.subline\")), 1),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"span\", {\n innerHTML: _ctx.$t('404.description')\n }, null, 8, _hoisted_4),\n _hoisted_5,\n (_unref(globalStore).userPreferences.userStartPage != null)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [\n _createVNode(_component_router_link, {\n to: _unref(globalStore).userPreferences.userStartPage\n }, {\n default: _withCtx(({href, route, navigate}) => [\n _createElementVNode(\"button\", {\n href: href,\n onClick: navigate,\n class: \"btn primary\"\n }, _toDisplayString(_ctx.$t(\"404.buttonText\")) + \" (\" + _toDisplayString(route.name) + \") \", 9, _hoisted_7)\n ]),\n _: 1\n }, 8, [\"to\"])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [\n _createVNode(_component_router_link, { to: \"/login\" }, {\n default: _withCtx(({navigate}) => [\n _createElementVNode(\"button\", {\n onClick: navigate,\n class: \"btn primary\"\n }, _toDisplayString(_ctx.$t(\"404.buttonLogin\")), 9, _hoisted_9)\n ]),\n _: 1\n })\n ]))\n ])\n ])\n ]))\n}\n}\n\n})","import script from \"./PageNotFound.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./PageNotFound.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n \n\t\t\t
\n\t\t\t\t
{{ $t(\"403.headline\") }}
\n\t\t\t\t
{{ $t(\"403.subline\") }}
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n
\n\n\n\n\n\n\n","import { render } from \"./Error.vue?vue&type=template&id=69c029f9\"\nconst script = {}\n\nimport exportComponent from \"/Users/digi_mt/web/1ANAB_Vue_Frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, unref as _unref, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n id: \"errorpage\",\n class: \"w-full h-full\"\n}\nconst _hoisted_2 = { class: \"flex flex-col h-full justify-center items-center\" }\nconst _hoisted_3 = { class: \"mt-10\" }\n\nimport router from '@/router';\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Logout',\n setup(__props) {\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"h1\", null, _toDisplayString(_ctx.$t(\"logout.headline\")), 1),\n _createElementVNode(\"h3\", null, _toDisplayString(_ctx.$t(\"logout.subline\")), 1),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"button\", {\n class: \"primary\",\n onClick: _cache[0] || (_cache[0] = ($event: any) => (_unref(router).push('/login')))\n }, _toDisplayString(_ctx.$t(\"logout.buttonText\")), 1)\n ])\n ])\n ]))\n}\n}\n\n})","import script from \"./Logout.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Logout.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n \n
\n
\n
\n
{{ privacySettings.privacyHeader }}
\n
{{ privacySettings.companyName }}
\n
\n {{ privacySettings.privacyText }}\n
\n
\n\n
\n
\n
\n \n Daten werden geladen...\n
\n\n\n","import script from \"./Privacy.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./Privacy.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, createElementVNode as _createElementVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"block w-full\" }\nconst _hoisted_2 = { class: \"flex mb-4\" }\nconst _hoisted_3 = [\"title\"]\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_5 = [\n _hoisted_4\n]\nconst _hoisted_6 = [\"disabled\", \"title\"]\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_8 = [\n _hoisted_7\n]\nconst _hoisted_9 = { class: \"ml-auto\" }\nconst _hoisted_10 = { class: \"text-center\" }\n\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport {BryntumGrid} from \"@bryntum/grid-vue-3\";\nimport {Menu, Store} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter.vue\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport {$t} from \"@/utilities/i18n/config\";\nimport dialog from \"@/dialog\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport Error from \"@/components/Error.vue\";\nimport {useI18n} from \"vue-i18n\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport {ActivityInfo} from \"@/models/activity/ActivityInfo\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {ActivityService} from \"@/utilities/services/entities/ActivityService\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'ActivityTab',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\n\nlet selectedActivities = ref([]);\n\nconst { t } = useI18n();\nconst activityService = new ActivityService();\nconst permissionService = new PermissionService();\n\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedActivities.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"activity.confirmDeletionMulti\", { count:selectedActivities.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const a of selectedActivities.value){\n const resp = await activityService.deleteActivity(a.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:a.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage-75}px`;\n};\n\nconst grid = ref(null);\nconst useGridConfig = {\n relayStoreEvents: true,\n headerMenuFeature: false,\n columns : {\n data: [\n { id: 'name', field: 'name', text: t('activity.grid.name'), flex: 1, },\n {\n id: 'categoryId',\n field: 'categoryId',\n text: t('activity.grid.category'),\n flex: 1,\n type:\"template\",\n template: ({ record }:any)=>{\n const category = record.data.categoryTitle;\n const iconSpan = ``;\n return NullOrUndefinedHelper(category) ? \"\" : `${category} (${iconSpan})`;\n }\n },\n {\n id: 'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.activity], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n enableTextSelection: true,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n listeners: {\n selectionChange(event) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedActivities.value = selectedActivities.value.concat(event.selected.map(ar => ar.data))\n selectedActivities.value = selectedActivities.value.filter(a => !event.deselected.map(ar => ar.data).some(ar => a?.id === ar?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n },\n height: currentWindowHeight,\n}\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: t(\"global.edit\"),\n cls: 'color',\n icon: 'icon-editieren',\n weight: 100,\n onItem : ({ menu }) => {\n globalStore.openPopup({\n data:menu.record,\n action:addOrUpdateActivity,\n resetButton:false,\n title:$t(\"popups.activity.edit\"),\n type:PopupType.activityEditPopup\n });\n }\n },\n {\n text : t(\"global.delete\"),\n disabled: !permissionService.userHasPermission(\"ActivitySets.Show\"),\n hidden: false,\n cls\t: 'color',\n icon: 'icon-loeschen',\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"activity.confirmDeletionSingle\", {name: menu.record.name}));\n\n if (answer) {\n const resp = await activityService.deleteActivity(menu.record.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n gridStore.applyChangeset({removed:[{id:menu.record.id}]});\n\n globalStore.showSuccess(t('global.deleted'));\n }\n }\n }\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\n\n\nconst gridConfig = reactive(useGridConfig);\n\nconst newActivity = () => {\n globalStore.openPopup({\n data: new ActivityInfo(),\n action: addOrUpdateActivity,\n resetButton: false,\n title: $t(\"popups.activity.new\"),\n type: PopupType.activityEditPopup\n });\n}\n\nconst addOrUpdateActivity = async () => {\n const activity = globalStore.modal.contentObject as ActivityInfo;\n\n const successOrId = await activityService.addOrUpdateActivity(activity, ErrorLocationType.popup);\n if(successOrId === false || successOrId === -1) return;\n\n if(activity.id < 0) activity.id = successOrId as number;\n // fix selection when it was an update -> replace old value in selected-array\n else if(selectedActivities.value.some(el => el.id === activity.id)) {\n selectedActivities.value = selectedActivities.value.filter(el => el.id !== activity.id);\n selectedActivities.value.push(activity);\n }\n\n gridStore.add(activity);\n gridStore.sort(gridStore.sorters);\n\n globalStore.closeModal();\n globalStore.showSuccess(t('global.saved'));\n}\n\nconst setGridData = async () =>{\n let activities = await activityService.getActivities(\"display\", ErrorLocationType.table);\n if(activities === null) return;\n\n // add searchable categoryString just for this view\n activities = activities?.map(a => {\n //@ts-expect-error\n a.categorySearchString = a.categoryTitle;\n return a;\n })\n\n gridStore.setStoreData(activities);\n\n globalStore.reorderColumns(TableType[TableType.activity]);\n}\n\nonMounted(async () => {\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n globalStore.gridDataIsLoading = true;\n\n await setGridData();\n\n globalStore.gridDataIsLoading = false;\n\n});\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(Error, {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"button\", {\n class: \"primary mr-2\",\n onClick: newActivity,\n title: _unref(t)('popups.activity.new')\n }, _hoisted_5, 8, _hoisted_3),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedActivities).some(()=>true),\n onClick: deleteSelection,\n title: _unref(t)('global.delete')\n }, _hoisted_8, 8, _hoisted_6)), [\n [_directive_permission, 'ActivitySets.Show']\n ]),\n _createElementVNode(\"div\", _hoisted_9, [\n _createVNode(GridInputFilter, {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_10, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ], 64))\n}\n}\n\n})","import script from \"./ActivityTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ActivityTab.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import {LocationIdAndNameObject} from \"@/models/location/LocationIdAndNameObject\";\nimport {ActivityInfo} from \"@/models/activity/ActivityInfo\";\n\nexport class ActivitySetInfo{\n activitySetId:number = -1;\n id:number = -1;\n name:string = \"\";\n activities:Array = [];\n activitySetLocationInfo:Array = []\n}","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, createElementVNode as _createElementVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"block w-full\" }\nconst _hoisted_2 = { class: \"flex mb-4\" }\nconst _hoisted_3 = [\"title\"]\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_5 = [\n _hoisted_4\n]\nconst _hoisted_6 = [\"disabled\", \"title\"]\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_8 = [\n _hoisted_7\n]\nconst _hoisted_9 = { class: \"ml-auto\" }\nconst _hoisted_10 = { class: \"text-center\" }\n\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport {BryntumGrid} from \"@bryntum/grid-vue-3\";\nimport {Menu, Store} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter.vue\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport {$t} from \"@/utilities/i18n/config\";\nimport dialog from \"@/dialog\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport Error from \"@/components/Error.vue\";\nimport {useI18n} from \"vue-i18n\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport {ActivitySetInfo} from \"@/models/activity/ActivitySetInfo\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {ActivitySetService} from \"@/utilities/services/entities/ActivitySetService\";\nimport {ActivityService} from \"@/utilities/services/entities/ActivityService\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'ActivitySetTab',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\n\nlet selectedActivity = ref([]);\nconst activitySetService = new ActivitySetService();\nconst activityService = new ActivityService();\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedActivity.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"activitySet.confirmDeletionMulti\", { count:selectedActivity.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const a of selectedActivity.value){\n const resp = await activitySetService.deleteActivitySet(a.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:a.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage-75}px`;\n};\n\nconst grid = ref(null);\nconst { t } = useI18n();\nconst useGridConfig = {\n relayStoreEvents: true,\n headerMenuFeature: false,\n columns : {\n data: [\n { id: 'name', field: 'name', text: t('activitySet.grid.name'), flex: 1, },\n {\n id: 'activitySetLocationInfo',\n field: 'activitySetLocationInfo',\n text: '',\n width : 36,\n\t\t\t\tsortable: false,\n type: 'template',\n template: ({ record }) => {\n\t\t\t\t\tif(record.data.activitySetLocationInfo.length > 0) {\n\t\t\t\t\t\treturn `
`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn ``;\n\t\t\t\t\t}\n },\n },\n {\n id: 'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.activitySet], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n enableTextSelection: true,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true,\n },\n listeners: {\n selectionChange(event) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedActivity.value = selectedActivity.value.concat(event.selected.map(ar => ar.data))\n selectedActivity.value = selectedActivity.value.filter(a => !event.deselected.map(ar => ar.data).some(ar => a?.id === ar?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n cellClick({column, record}) {\n if (column.data.field === 'activitySetLocationInfo' && record.data.activitySetLocationInfo.length > 0) {\n globalStore.openPopup({\n data: record.data,\n action: globalStore.closeModal,\n title: t('activitySet.grid.locations'),\n type: PopupType.activitySetLocationsPopup\n });\n }\n },\n },\n height: currentWindowHeight,\n}\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: t(\"global.edit\"),\n cls: 'color',\n icon: 'icon-editieren',\n weight: 100,\n onItem : ({ menu }) => {\n // flat copy current locations since refs keep same arrays\n const n = [];\n for (const l of menu.record.activitySetLocationInfo) n.push(l)\n tmpLocs = n;\n // open editor\n globalStore.openPopup({\n data:menu.record,\n action:addOrUpdateActivitySet,\n resetButton:false,\n title:$t(\"popups.activitySet.edit\"),\n type:PopupType.activitySetEditPopup\n }, true);\n }\n },\n {\n text : t(\"global.delete\"),\n hidden: false,\n cls\t: 'color',\n icon: 'icon-loeschen',\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"activitySet.confirmDeletionSingle\", {name: menu.record.name}));\n\n if (answer) {\n const resp = await activitySetService.deleteActivitySet(menu.record.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n gridStore.applyChangeset({removed:[{id:menu.record.id}]});\n\n globalStore.showSuccess(t('global.deleted'));\n }\n }\n }\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\n\n\nconst gridConfig = reactive(useGridConfig);\n\nconst newActivitySet = () => {\n globalStore.openPopup({\n data: new ActivitySetInfo(),\n action: addOrUpdateActivitySet,\n resetButton: false,\n title: $t(\"popups.activitySet.new\"),\n type: PopupType.activitySetEditPopup\n }, true);\n}\n\nlet tmpLocs:Array = [];\nconst computedAddedAndRemovedLocations = (newList:Array)=>{\n const oldList = tmpLocs;\n\n const addedLocs = newList.filter(l => oldList.find(lo => lo.locationId === l.locationId) === undefined).map(l=>l.locationId);\n const removedLocs = oldList.filter(l => newList.find(lo => lo.locationId === l.locationId) === undefined).map(l=>l.locationId);\n\n return {added:addedLocs, removed:removedLocs}\n}\n\nconst addOrUpdateActivitySet = async () => {\n const newActivitySet = globalStore.modal.contentObject as ActivitySetInfo;\n const addedAndRemovedLocations = computedAddedAndRemovedLocations(newActivitySet.activitySetLocationInfo)\n\n const resp = await activitySetService.addOrUpdateActivitySet(newActivitySet, addedAndRemovedLocations);\n if (resp === null || resp === undefined || resp.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.popup);\n return;\n }\n\n if(newActivitySet.id < 0) newActivitySet.id = resp.id;\n // fix selection when it was an update -> replace old value in selected-array\n else if(selectedActivity.value.some(el => el.id === newActivitySet.id)) {\n selectedActivity.value = selectedActivity.value.filter(el => el.id !== newActivitySet.id);\n selectedActivity.value.push(newActivitySet);\n }\n\n gridStore.add(newActivitySet);\n gridStore.sort(gridStore.sorters);\n\n globalStore.closeModal();\n globalStore.showSuccess(t('global.saved'));\n}\n\nconst setGridData = async () => {\n // start spinner\n globalStore.gridDataIsLoading = true;\n const activitySetResponse = await activitySetService.getActivitySets(\"display\");\n\n if (activitySetResponse === null || activitySetResponse === undefined || activitySetResponse.statusCode !== 0) {\n ErrorHandler.handleError(activitySetResponse, ErrorLocationType.table);\n return;\n }\n\n const activitiesWithRenamedId = activitySetResponse.activitySetInfo.map(a => {a.id = a.activitySetId; return a;});\n\n // get ativities per activitySet\n for(const a of activitiesWithRenamedId){\n const activityResp = await activityService.getActivitySetActivities(a.id);\n\n if (activityResp === null || activityResp === undefined || activityResp.statusCode !== 0) {\n ErrorHandler.handleError(activityResp, ErrorLocationType.table);\n return;\n }\n\n a.activities = activityResp.activityInfo.map(ae => {\n ae.id = ae.activityId;\n ae.name = ae.activityText;\n return ae;\n });\n }\n\n gridStore.setStoreData(activitiesWithRenamedId);\n\n globalStore.reorderColumns(TableType[TableType.activitySet]);\n\n // stop spinner\n globalStore.gridDataIsLoading = false;\n}\n\nonMounted(async () => {\n// calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n});\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(Error, {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"button\", {\n class: \"primary mr-2\",\n onClick: newActivitySet,\n title: _unref(t)('activitySet.new')\n }, _hoisted_5, 8, _hoisted_3),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedActivity).some(()=>true),\n onClick: deleteSelection,\n title: _unref(t)('global.delete')\n }, _hoisted_8, 8, _hoisted_6)), [\n [_directive_permission, 'ActivitySets.Show']\n ]),\n _createElementVNode(\"div\", _hoisted_9, [\n _createVNode(GridInputFilter, {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_10, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ], 64))\n}\n}\n\n})","import script from \"./ActivitySetTab.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ActivitySetTab.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, withCtx as _withCtx, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = { class: \"contentBox\" }\n\nimport { onBeforeUnmount, ref } from \"vue\";\nimport { useGlobalStore } from \"@/stores/GlobalStore\";\nimport TabsWrapper from \"@/components/tabs/TabsWrapper.vue\";\nimport TabItem from \"@/components/tabs/TabItem.vue\";\nimport ActivityTab from \"@/components/tabs/activitySets/ActivityTab.vue\";\nimport ActivitySetTab from \"@/components/tabs/activitySets/ActivitySetTab.vue\";\nimport {Store} from \"@bryntum/grid\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Activities',\n setup(__props) {\n\nconst activeTab = ref(0);\nconst globalStore = useGlobalStore();\n\nonBeforeUnmount(()=>{\n\tglobalStore.setGridStore(new Store());\n\tglobalStore.setGridColumnStore(null);\n\n\tglobalStore.currentItems = 0;\n\tglobalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t(\"activitySet.title\")), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _createVNode(TabsWrapper, { activeTab: activeTab.value }, {\n default: _withCtx(() => [\n _createVNode(TabItem, {\n title: _ctx.$t('activitySet.tabs.groups')\n }, {\n default: _withCtx(() => [\n _createVNode(ActivitySetTab)\n ]),\n _: 1\n }, 8, [\"title\"]),\n _createVNode(TabItem, {\n title: _ctx.$t('activitySet.tabs.manageActivities')\n }, {\n default: _withCtx(() => [\n _createVNode(ActivityTab)\n ]),\n _: 1\n }, 8, [\"title\"])\n ]),\n _: 1\n }, 8, [\"activeTab\"])\n ])\n ], 64))\n}\n}\n\n})","import script from \"./Activities.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Activities.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = [\"innerHTML\"]\n\nimport {onMounted, ref} from \"vue\";\nimport {MiscService} from \"@/utilities/services/entities/MiscService\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Changelog',\n setup(__props) {\n\nconst logHtml = ref(\"\");\nconst miscService = new MiscService();\n\nonMounted(async()=>{\n const changelogResp = await miscService.getChangelog();\n\n logHtml.value = changelogResp.log; //TODO is this xss-save???\n})\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_ctx.$t('changelog.title')), 1)\n ]),\n _createElementVNode(\"div\", {\n class: \"contentBox text-grey changelog\",\n innerHTML: logHtml.value\n }, null, 8, _hoisted_2)\n ]))\n}\n}\n\n})","import script from \"./Changelog.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Changelog.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./Changelog.vue?vue&type=style&index=0&id=b058581a&lang=scss\"\n\nconst __exports__ = script;\n\nexport default __exports__","export class CategoryInfo{\n id :string = \"\";\n iconName:string = \"\";\n title:string = \"\";\n description:string = \"\";\n isDefault:boolean = false;\n}","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = { class: \"contentBox\" }\nconst _hoisted_3 = { class: \"block w-full\" }\nconst _hoisted_4 = { class: \"flex mb-4\" }\nconst _hoisted_5 = [\"title\"]\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_7 = [\n _hoisted_6\n]\nconst _hoisted_8 = [\"disabled\", \"title\"]\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_10 = [\n _hoisted_9\n]\nconst _hoisted_11 = { class: \"ml-auto\" }\nconst _hoisted_12 = { class: \"text-center\" }\n\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport GridInputFilter from \"@/components/GridInputFilter\";\nimport {Menu, Store} from \"@bryntum/grid\";\nimport {BryntumGrid} from \"@bryntum/grid-vue-3\";\nimport {$t} from \"@/utilities/i18n/config\";\nimport dialog from \"@/dialog\";\nimport Error from \"@/components/Error\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {CategoryInfo} from \"@/models/category/CategoryInfo\";\nimport {CategoryService} from \"@/utilities/services/entities/CategoryService\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Category',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\nconst categoryService = new CategoryService();\nconst permissionService = new PermissionService();\n\nlet selectedCategories = ref>([]);\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage}px`;\n};\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedCategories.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText($t('global.delete'))\n .cancelText($t('global.cancel'))\n .confirm($t('category.confirmDeletionMulti', {count:selectedCategories.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const category of selectedCategories.value){\n const success = await categoryService.deleteCategory(category.id, ErrorLocationType.table);\n\n if(!success){\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:category.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess($t(\"global.deleted\"));\n }\n};\n\nconst addOrUpdateCategory = async ()=>{\n const category = globalStore.modal.contentObject as CategoryInfo;\n\n const updatedCategory = await categoryService.addOrUpdateCategory(category, ErrorLocationType.popup);\n\n if(updatedCategory === null) return; //TODO additional ID check?\n // fix selection when it was an update -> replace old value in selected-array\n else if(selectedCategories.value.some(el => el.iconName === updatedCategory.iconName)) {\n selectedCategories.value = selectedCategories.value.filter(el => el.iconName !== updatedCategory.iconName);\n selectedCategories.value.push(updatedCategory);\n }\n\n const categories = await categoryService.getCategories(\"display\", ErrorLocationType.table);\n\n //@ts-expect-error\n gridStore.setStoreData(categories);\n\n gridStore.sort(gridStore.sorters);\n\n globalStore.closeModal();\n globalStore.showSuccess('Gespeichert');\n}\n\nconst newCategory = async ()=>{\n const category = new CategoryInfo();\n\n globalStore.openPopup({\n data: category,\n action: addOrUpdateCategory,\n resetButton: false,\n title: $t(\"popups.categoryEditor.title.new\"),\n type: PopupType.categoryEditor\n });\n}\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n const categories = await categoryService.getCategories(\"display\", ErrorLocationType.table);\n\n //@ts-expect-error\n gridStore.setStoreData(categories);\n\n globalStore.reorderColumns(TableType[TableType.category]);\n\n globalStore.closeModal();\n // stop spinner\n globalStore.gridDataIsLoading = false;\n};\n\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n relayStoreEvents: true,\n enableTextSelection: true,\n cellTooltipFeature: {\n hoverDelay: 300,\n textContent: true,\n hideOnDelegateChange: true,\n },\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n height: currentWindowHeight,\n columns : {\n data: [\n {\n id:'title',\n field: 'title',\n text: $t('category.grid.title'),\n flex: 1,\n },\n {\n id:'iconName',\n field: 'iconName',\n text: $t('category.grid.iconName'),\n flex: 1,\n type: 'template',\n template: ({value}:any)=>{\n return ``\n }\n },\n {\n id: 'isDefault',\n text: '',\n field: 'isDefault',\n htmlEncode: false,\n sortable: false,\n type: 'template',\n width: 36,\n filterable: false,\n hideable: true,\n tooltipRenderer: ({ record }: any) => {\n if (!record.isDefault) return \"\";\n\n return $t('category.grid.isDefault');\n },\n template: ({ record }: any) => {\n if (!record.isDefault) return \"\";\n return `
`;\n },\n },\n {\n id:'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.category], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n selectionChange(event:any) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedCategories.value = selectedCategories.value.concat(event.selected.map(cr => cr.data))\n selectedCategories.value = selectedCategories.value.filter(c => !event.deselected.map(cr => cr.data).some(cr => c?.iconName === cr?.iconName));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n }\n};\nconst gridConfig = reactive(useGridConfig);\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: $t('global.edit'),\n cls: 'color',\n icon: 'icon-editieren',\n hidden: !permissionService.userHasPermission(\"Category.Edit\"),\n weight: 100,\n onItem : ({ menu }) => {\n globalStore.openPopup({\n data:menu.record,\n action:addOrUpdateCategory,\n resetButton:false,\n title:$t(\"popups.categoryEditor.title.edit\"),\n type:PopupType.categoryEditor\n });\n }\n },\n {\n text : $t('global.delete'),\n hidden: !permissionService.userHasPermission(\"Category.Delete\"),\n cls\t: 'color',\n icon: 'icon-loeschen',\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText($t('global.delete'))\n .cancelText($t('global.cancel'))\n .confirm($t('category.confirmDeletionSingle', {name:menu.record.title}));\n\n if (answer) {\n const success = await categoryService.deleteCategory(menu.record.id, ErrorLocationType.table);\n\n if (!success) return;\n\n gridStore.applyChangeset({removed: [{id: menu.record.id}]});\n\n globalStore.showSuccess($t('category.deleted'));\n }\n }\n }\n ],\n });\n\n //@ts-expect-error\n menu.setRecord(record);\n\n return menu;\n};\n\n\nonMounted(async () => {\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n})\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)(\"category.title\")), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", _hoisted_4, [\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n onClick: newCategory,\n title: _unref($t)('category.new')\n }, _hoisted_7, 8, _hoisted_5)), [\n [_directive_permission, 'Category.Create']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedCategories).some(()=>true),\n onClick: deleteSelection,\n title: _unref($t)('global.delete')\n }, _hoisted_10, 8, _hoisted_8)), [\n [_directive_permission, 'Category.Delete']\n ]),\n _createElementVNode(\"div\", _hoisted_11, [\n _createVNode(_unref(GridInputFilter), {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_12, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ])\n ], 64))\n}\n}\n\n})","import script from \"./Category.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Category.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, unref as _unref, toDisplayString as _toDisplayString, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock, mergeProps as _mergeProps, vShow as _vShow, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = { class: \"flex\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"smallIcon icon-pfeil-links iconInButton\" }, null, -1)\nconst _hoisted_4 = { class: \"text-grey ml-2 mt-1.5\" }\nconst _hoisted_5 = { class: \"contentBox\" }\nconst _hoisted_6 = { class: \"block w-full\" }\nconst _hoisted_7 = { class: \"flex mb-4\" }\nconst _hoisted_8 = [\"disabled\", \"title\"]\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-downlaod\" }, null, -1)\nconst _hoisted_10 = [\n _hoisted_9\n]\nconst _hoisted_11 = [\"disabled\", \"title\"]\nconst _hoisted_12 = {\n key: 0,\n class: \"icon-pdf\"\n}\nconst _hoisted_13 = { class: \"ml-auto\" }\nconst _hoisted_14 = { class: \"text-center\" }\n\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport GridInputFilter from \"@/components/GridInputFilter\";\nimport {Menu, Store} from \"@bryntum/grid\";\nimport {BryntumGrid} from \"@bryntum/grid-vue-3\";\nimport {$t} from \"@/utilities/i18n/config\";\nimport Error from \"@/components/Error\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {DisdiInfo} from \"@/models/disdi/DisdiInfo\";\nimport {DisdiService} from \"@/utilities/services/entities/DisdiService\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage, permissionColumn} from \"@/AppConfig\";\nimport {DisdiCsvExport} from \"@/models/CsvExportModels\";\nimport exportFromJSON from \"export-from-json\";\nimport router from \"@/router\";\nimport DateToStringHelper from \"@/utilities/helpers/DateToStringHelper\";\nimport FilterService from \"@/utilities/services/FilterService\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Disdi',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\nconst disdiService = new DisdiService();\n\nlet selectedDisdies = ref>([]);\nconst contextType = ref(null);\nconst contextId = ref(null);\nconst downloadingPdf = ref(false);\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage}px`;\n};\n\nconst exportCSV = () => {\n let data = selectedDisdies.value?.length > 0 ? selectedDisdies.value : gridStore.records;\n\n // remove unnecessary properties from csv\n //@ts-expect-error\n data = data.map((item)=> new DisdiCsvExport(item.data ?? item));\n\n const fileName = $t('disdi.view.csvExportFileName');\n const exportType = exportFromJSON.types.csv;\n\n exportFromJSON({\n data:data,\n fileName:fileName,\n exportType:exportType,\n });\n};\n\nconst getPdf = async () => {\n downloadingPdf.value = true;\n\n const disdiIds = selectedDisdies.value?.length > 0\n ? selectedDisdies.value.map(sd => sd.id)\n : gridStore.data.map(d => d.id);\n\n const success = await disdiService.exportPdf(disdiIds, ErrorLocationType.table);\n if(success) globalStore.showSuccess($t('disdi.view.pdfDownloaded'));\n\n downloadingPdf.value = false;\n};\n\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n relayStoreEvents: true,\n enableTextSelection: true,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n height: currentWindowHeight,\n columns : {\n data: [\n {\n id:'createDate',\n field: 'createDate',\n text: $t('disdi.view.grid.createDate'),\n flex: 1,\n type: \"template\",\n template:({value}:any)=>{\n return DateToStringHelper(new Date(value));\n }\n },\n {\n id: 'infoButton',\n field: 'infoButton',\n text: $t('disdi.view.grid.info'),\n width: 36,\n sortable: false,\n type: \"template\",\n template: () => {\n return `
`;\n },\n },\n {\n id:'diaryDescription',\n field: 'diaryDescription',\n text: $t('disdi.view.grid.diaryDescription'),\n flex: 1,\n },\n // {\n // id:'comment',\n // field: 'comment',\n // text: $t('disdi.view.grid.comment'),\n // flex: 1,\n // },\n {\n id:'userFullname',\n field: 'userFullname',\n text: $t('disdi.view.grid.userFullname'),\n flex: 1,\n },\n {\n id:'userPhoneNumber',\n field: 'userPhoneNumber',\n text: $t('disdi.view.grid.userPhoneNumber'),\n flex: 1,\n },\n {\n id:'companyName',\n field: 'companyName',\n text: $t('disdi.view.grid.companyName'),\n flex: 1,\n },\n {\n id:'categoryId',\n field: 'categoryId',\n text: $t('disdi.view.grid.categoryId'),\n flex: 1,\n type: \"template\",\n template: ({ record }: any) => {\n const category = record.data.categoryTitle;\n const iconSpan = ``;\n return NullOrUndefinedHelper(category) ? \"\" : `${category} (${iconSpan})`;\n }\n },\n {\n id:'registrationStart',\n field: 'registrationStart',\n text: $t('disdi.view.grid.registrationStart'),\n flex: 1,\n type: \"template\",\n template:({value}:any)=>{\n return value !== null ? DateToStringHelper(new Date(value)) : \"\";\n }\n },\n {\n id:'registrationEnd',\n field: 'registrationEnd',\n text: $t('disdi.view.grid.registrationEnd'),\n flex: 1,\n type: \"template\",\n template:({value}:any)=>{\n return value !== null ? DateToStringHelper(new Date(value)) : \"\";\n }\n },\n {\n id:'hasAttachment',\n field: 'hasAttachment',\n text: $t('disdi.view.grid.attachment'),\n type: \"template\",\n width : 80,\n template:({record}:any)=>{\n return record.data.hasAttachment ? \"\" : \"\";\n }\n },\n {\n id:'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.disdi], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n selectionChange(event:any) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedDisdies.value = selectedDisdies.value.concat(event.selected.map(dr => dr.data))\n selectedDisdies.value = selectedDisdies.value.filter(d => !event.deselected.map(dr => dr.data).some(dr => d?.id === dr?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n async cellClick({record, column}:any){\n if(column.data.field === 'infoButton'){\n openDetailsPopup(record.data);\n }\n }\n }\n};\nconst gridConfig = reactive(useGridConfig);\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: $t('disdi.view.details'),\n cls: 'color',\n weight: 100,\n onItem : ({ menu }:any) => {\n openDetailsPopup(menu.record);\n }\n },\n ],\n });\n\n //@ts-expect-error\n menu.setRecord(record);\n\n return menu;\n};\n\nconst openDetailsPopup = (data:any)=>{\n globalStore.openPopup({\n data:data,\n action:globalStore.closeModal,\n resetButton:false,\n title:$t(\"popups.disdiDetails.title\"),\n type:PopupType.disdiDetailsPopup\n });\n}\n\nconst setContextProps = async ()=>{\n contextType.value = TableType[router.currentRoute.value.params.type as keyof typeof TableType];\n contextId.value = +router.currentRoute.value.params.id;\n}\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n let disdies = contextType.value === TableType.register\n ? await disdiService.getDisdiEntriesForRegistration(contextId.value as number, ErrorLocationType.table)\n : await disdiService.getDisdiEntriesForLocation(contextId.value as number, ErrorLocationType.table);\n if(disdies === null) return;\n\n // add searchable categoryString just for this view\n disdies = disdies.map(d => {\n //@ts-expect-error\n d.categorySearchString = d.categoryTitle;\n return d;\n })\n\n //@ts-expect-error\n gridStore.setStoreData(disdies);\n\n globalStore.reorderColumns(TableType[TableType.disdi]);\n gridStore.sort(\"createDate\", false); // always show newes disdi first\n\n // apply filters\n gridStore.filter({\n id: \"userFilter\",\n filterBy: FilterService.buildFilter(TableType[TableType.disdi])\n });\n\n // apply hidden cols\n for(const c of grid.value.instance.value.columns.storage.values){\n const needsHiding = globalStore.userPreferences.userHiddenColumns\n .some((thc) => thc.attributeName === c.data.field && thc.tableName === TableType[TableType.disdi]);\n\n if(needsHiding && !c.hidden) {\n c.hide();\n }\n else if(!needsHiding && c.hidden && !permissionColumn.includes(c.id)) {\n c.show();\n }\n }\n\n globalStore.closeModal();\n // stop spinner\n globalStore.gridDataIsLoading = false;\n};\n\nonMounted(async () => {\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setContextProps();\n await setGridData();\n})\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"button\", {\n onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_unref(router).back && _unref(router).back(...args)))\n }, [\n _createElementVNode(\"div\", _hoisted_2, [\n _hoisted_3,\n _createElementVNode(\"div\", null, _toDisplayString(_unref($t)(\"global.back\")), 1)\n ])\n ]),\n _createElementVNode(\"h4\", _hoisted_4, _toDisplayString(_unref($t)(\"disdi.view.title\")), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_5, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_6, [\n _createElementVNode(\"div\", _hoisted_7, [\n _createElementVNode(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedDisdies).some(()=>true),\n onClick: exportCSV,\n title: _unref($t)('global.exportCsv')\n }, _hoisted_10, 8, _hoisted_8),\n _createElementVNode(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedDisdies).some(()=>true) || downloadingPdf.value,\n onClick: getPdf,\n title: _unref($t)('global.downloadPdf')\n }, [\n (!downloadingPdf.value)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_12))\n : (_openBlock(), _createBlock(LoadingSpinner, { key: 1 }))\n ], 8, _hoisted_11),\n _createElementVNode(\"div\", _hoisted_13, [\n _createVNode(_unref(GridInputFilter), {\n gridStore: _unref(gridStore),\n popupType: _unref(PopupType).disdiFilterPopup\n }, null, 8, [\"gridStore\", \"popupType\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_14, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ])\n ], 64))\n}\n}\n\n})","import script from \"./Disdi.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Disdi.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import {defineStore} from \"pinia\";\n\nexport const useDisdiMaintenanceStore = defineStore('DisdiMaintenanceStore', {\n state: () => {\n return {\n currentDisdiId:\"\",\n }\n },\n actions: {\n }\n})\n","import { defineComponent as _defineComponent } from 'vue'\nimport { normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"w-full bg-gray-200 rounded-full h-2.5 dark:bg-gray-700\" }\n\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Progressbar',\n props: {\n barColor: String,\n percentage: String\n},\n setup(__props) {\n\nconst props = __props\n\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", {\n class: \"h-2.5 rounded-full\",\n style: _normalizeStyle({background: props.barColor, width: props.percentage})\n }, null, 4)\n ]))\n}\n}\n\n})","import script from \"./Progressbar.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Progressbar.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, createTextVNode as _createTextVNode, vModelText as _vModelText, withDirectives as _withDirectives, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeClass as _normalizeClass, createBlock as _createBlock, vShow as _vShow, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-0c471f40\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"block w-full\" }\nconst _hoisted_2 = { class: \"contentHeader flex\" }\nconst _hoisted_3 = { class: \"text-grey ml-2 mt-1.5\" }\nconst _hoisted_4 = { class: \"contentBox\" }\nconst _hoisted_5 = { class: \"inputGroup grid grid-cols-2 gap-4 w-full mt-2 mb-6\" }\nconst _hoisted_6 = { class: \"detailRegion\" }\nconst _hoisted_7 = { class: \"flex locationDetailRow\" }\nconst _hoisted_8 = { class: \"detailAttribute\" }\nconst _hoisted_9 = { class: \"flex locationDetailRow\" }\nconst _hoisted_10 = { class: \"detailAttribute\" }\nconst _hoisted_11 = { class: \"flex locationDetailRow\" }\nconst _hoisted_12 = { class: \"detailAttribute\" }\nconst _hoisted_13 = { class: \"flex locationDetailRow\" }\nconst _hoisted_14 = { class: \"detailAttribute\" }\nconst _hoisted_15 = { class: \"flex locationDetailRow\" }\nconst _hoisted_16 = { class: \"detailAttribute\" }\nconst _hoisted_17 = { class: \"flex locationDetailRow\" }\nconst _hoisted_18 = { class: \"detailAttribute\" }\nconst _hoisted_19 = { class: \"flex locationDetailRow\" }\nconst _hoisted_20 = { class: \"detailAttribute\" }\nconst _hoisted_21 = { class: \"flex locationDetailRow\" }\nconst _hoisted_22 = { class: \"detailAttribute\" }\nconst _hoisted_23 = { class: \"detailRegion\" }\nconst _hoisted_24 = { class: \"flex locationDetailRow\" }\nconst _hoisted_25 = { class: \"detailAttribute\" }\nconst _hoisted_26 = { class: \"flex locationDetailRow\" }\nconst _hoisted_27 = { class: \"detailAttribute\" }\nconst _hoisted_28 = { class: \"inputGroup grid grid-cols-2 gap-4 w-full mt-5\" }\nconst _hoisted_29 = { class: \"inputTitle\" }\nconst _hoisted_30 = { class: \"inputField flex-grow\" }\nconst _hoisted_31 = { class: \"error-msg\" }\nconst _hoisted_32 = { class: \"inputTitle\" }\nconst _hoisted_33 = { class: \"inputField flex-grow\" }\nconst _hoisted_34 = { class: \"error-msg\" }\nconst _hoisted_35 = { class: \"inputGroup grid grid-cols-2 gap-4 w-full mt-5\" }\nconst _hoisted_36 = { class: \"inputTitle\" }\nconst _hoisted_37 = { class: \"helpText\" }\nconst _hoisted_38 = { class: \"\" }\nconst _hoisted_39 = { class: \"mt-2 inline-block pseudoButton pseudoSecondary\" }\nconst _hoisted_40 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"br\", null, null, -1))\nconst _hoisted_41 = {\n key: 0,\n class: \"mt-4\"\n}\nconst _hoisted_42 = { class: \"inputTitle\" }\nconst _hoisted_43 = { class: \"inputField flex-grow grid grid-cols-2 gap-4 w-full\" }\nconst _hoisted_44 = { class: \"relative\" }\nconst _hoisted_45 = [\"onClick\"]\nconst _hoisted_46 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1))\nconst _hoisted_47 = [\n _hoisted_46\n]\nconst _hoisted_48 = [\"src\"]\nconst _hoisted_49 = { class: \"text-center\" }\nconst _hoisted_50 = { class: \"inputGroup w-full mt-5\" }\nconst _hoisted_51 = [\"disabled\"]\nconst _hoisted_52 = { class: \"text-center\" }\n\nimport {computed, onMounted, ref} from \"vue\";\nimport {DisdiService} from \"@/utilities/services/entities/DisdiService\";\nimport {ErrorLocationType} from \"@/utilities/enums/Enums\";\nimport {DisdiInfo} from \"@/models/disdi/DisdiInfo\";\nimport {CategoryService} from \"@/utilities/services/entities/CategoryService\";\nimport {CategoryInfo} from \"@/models/category/CategoryInfo\";\nimport Select from \"@/components/inputs/Select\";\nimport {LocationService} from \"@/utilities/services/entities/LocationService\";\nimport {LocationInfo} from \"@/models/location/LocationInfo\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport DateToStringHelper from \"@/utilities/helpers/DateToStringHelper\";\nimport useVuelidate from \"@vuelidate/core\";\nimport {helpers, required} from \"@vuelidate/validators\";\nimport {$t} from \"@/utilities/i18n/config\";\nimport {useDisdiMaintenanceStore} from \"@/stores/DisdiMaintenanceStore\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\nimport Error from \"@/components/Error\";\nimport router from \"@/router\";\nimport Progressbar from \"@/components/Progressbar.vue\";\nimport sleeper from \"@/utilities/helpers/Sleeper\";\nimport TextOrSpinner from \"@/components/TextOrSpinner\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {GeneralResponse} from \"@/models/api/Responses\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'DisdiMaintenance',\n setup(__props) {\n\nconst disdiStore = useDisdiMaintenanceStore();\nconst disdiService = new DisdiService();\nconst categoryService = new CategoryService();\nconst locationService = new LocationService();\n\nconst currentDisdi = ref(null);\nconst categoryList = ref|undefined>(undefined);\nconst contextLocation = ref(null);\nconst loading = ref(false);\nconst loadingAttachments = ref(false);\nconst attachmentUrlList = ref|null>(null);\nconst uploadPercentage = ref(\"0%\");\nconst uploadInput = ref(null);\nconst fileNameList = ref|null>(null);\nconst closingDisdi = ref(false);\n\nconst regStartString = computed(()=> !NullOrUndefinedHelper(currentDisdi.value?.registrationStart)\n ? DateToStringHelper(new Date (currentDisdi.value.registrationStart))\n : \"\");\nconst regEndString = computed(()=> !NullOrUndefinedHelper(currentDisdi.value?.registrationEnd)\n ? DateToStringHelper(new Date(currentDisdi.value.registrationEnd))\n : \"\");\n\nconst rules = computed(() => ({\n diaryDescription: { required: helpers.withMessage($t('validators.required'), required), },\n categoryId: { required: helpers.withMessage($t('validators.required'), required), },\n}));\nconst validator = ref(useVuelidate(rules, currentDisdi))\n\nconst changeCategoryId = (value)=>{\n currentDisdi.value.categoryId = value !== null ? value : \"\";\n}\n\nconst uploadCallback = async (newPercentage:string)=>{\n uploadPercentage.value = newPercentage;\n if (newPercentage === \"100%\"){ //TODO do discuss reset behaviour!\n await sleeper(2000)\n uploadPercentage.value = \"0%\";\n }\n}\n\nconst addImageToUploadList = async ()=>{\n //@ts-expect-error\n if(uploadInput.value === null || uploadInput.value.files.length === 0) return;\n\n const fileList = [];\n //@ts-expect-error\n for (const file of uploadInput.value.files){\n fileList.push(file)\n }\n\n fileNameList.value = fileList.map(f=>f.name);\n\n const urlList = await disdiService.getAttachementUploadUrl(currentDisdi.value?.id as string, fileList.map((f:File) => f.name), ErrorLocationType.disdiMaintenance)\n if(urlList === null) return;\n\n const success = await disdiService.uploadFilesToBlobStorage(urlList, fileList, ErrorLocationType.disdiMaintenance, uploadCallback);\n\n if(success){\n loadingAttachments.value = true;\n await sleeper(300);\n attachmentUrlList.value = await disdiService.getAttachments(currentDisdi.value?.id as string, ErrorLocationType.disdiMaintenance);\n await updateHasAttachmentProperty();\n loadingAttachments.value = false;\n }\n}\n\nconst deleteAttachmentByIndex = async(url:string)=>{\n // get fileName from attachment url\n const fileName = (new URL(url)).pathname.split(\"/\").slice(-1)[0];\n\n const success = await disdiService.deleteAttachmentByFileName(currentDisdi.value?.id as string, fileName, ErrorLocationType.disdiMaintenance)\n\n if(!success) return;\n\n // delete from attachment list\n attachmentUrlList.value = attachmentUrlList.value.filter(u => !u.includes(fileName));\n await updateHasAttachmentProperty();\n}\n\nconst updateHasAttachmentProperty = async()=>{\n const updateHasAttachmentResp = await disdiService.checkAndUpdateHasAttachmentProperty(currentDisdi.value?.id as string);\n if (!updateHasAttachmentResp || updateHasAttachmentResp.statusCode !== 0){\n ErrorHandler.handleError(updateHasAttachmentResp as GeneralResponse, ErrorLocationType.disdiMaintenance);\n }\n}\n\nconst closeDisdi = async ()=>{\n const isValid = await validator.value.$validate();\n if(!isValid){\n const targetElement = document.querySelector(\".error\");\n targetElement?.scrollIntoView({behavior: \"smooth\", block: 'center'});\n\n return;\n }\n\n closingDisdi.value = true;\n\n currentDisdi.value.isCompleted = true;\n const success = await disdiService.updateDisdiEntry(currentDisdi.value, ErrorLocationType.disdiMaintenance);\n\n if(!success){\n closingDisdi.value = false;\n\n return\n }\n\n closingDisdi.value = false;\n\n await router.push(\"/disdi/exit\");\n}\n\nonMounted(async ()=>{\n loading.value = true;\n\n const currentDisdiId = disdiStore.currentDisdiId;\n if(NullOrUndefinedHelper(currentDisdiId)) await router.push(\"/disdi/login\");\n\n currentDisdi.value = await disdiService.getUncompletedDisdiById(currentDisdiId as string, ErrorLocationType.disdiMaintenance);\n\n if(currentDisdi.value?.isCompleted) {\n await router.push(\"/disdi/exit\");\n return;\n }\n\n contextLocation.value = await locationService.getLocation(currentDisdi.value.locationSecondaryId, ErrorLocationType.disdiMaintenance);\n\n attachmentUrlList.value = await disdiService.getAttachments(currentDisdiId as string, ErrorLocationType.disdiMaintenance);\n\n categoryList.value = (await categoryService.getCategories(\"display\", ErrorLocationType.disdiMaintenance))?.map((c) =>{\n c.name = c.title;\n return c;\n });\n loading.value = false;\n})\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"h4\", _hoisted_3, _toDisplayString(_unref($t)('disdi.maintenance.title')), 1)\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_4, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).disdiMaintenance\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)('disdi.maintenance.generalInfo')), 1),\n _createElementVNode(\"div\", _hoisted_5, [\n _createElementVNode(\"div\", null, [\n _createTextVNode(_toDisplayString(_unref($t)('disdi.maintenance.disdiInfo.location')) + \": \", 1),\n _createElementVNode(\"div\", _hoisted_6, [\n _createElementVNode(\"div\", _hoisted_7, [\n _createElementVNode(\"div\", _hoisted_8, _toDisplayString(_unref($t)('popups.disdiDetails.location.name')), 1),\n _createElementVNode(\"div\", null, _toDisplayString(contextLocation.value?.name), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_9, [\n _createElementVNode(\"div\", _hoisted_10, _toDisplayString(_unref($t)('popups.disdiDetails.location.group2')), 1),\n _createElementVNode(\"div\", null, _toDisplayString(contextLocation.value?.group2Name), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_11, [\n _createElementVNode(\"div\", _hoisted_12, _toDisplayString(_unref($t)('popups.disdiDetails.location.group1')), 1),\n _createElementVNode(\"div\", null, _toDisplayString(contextLocation.value?.group1Name), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_13, [\n _createElementVNode(\"div\", _hoisted_14, _toDisplayString(_unref($t)('popups.disdiDetails.location.CCName')), 1),\n _createElementVNode(\"div\", null, _toDisplayString(contextLocation.value?.controlCenterName), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_15, [\n _createElementVNode(\"div\", _hoisted_16, _toDisplayString(_unref($t)('popups.disdiDetails.location.phoneNumber')), 1),\n _createElementVNode(\"div\", null, _toDisplayString(contextLocation.value?.contactInfo.phoneNumber ?? \"\"), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_17, [\n _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_unref($t)('popups.disdiDetails.location.email')), 1),\n _createElementVNode(\"div\", null, _toDisplayString(contextLocation.value?.email), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_19, [\n _createElementVNode(\"div\", _hoisted_20, _toDisplayString(_unref($t)('popups.disdiDetails.location.street')), 1),\n _createElementVNode(\"div\", null, _toDisplayString(contextLocation.value?.contactInfo.street) + \" \" + _toDisplayString(contextLocation.value?.contactInfo.streetNumber), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_21, [\n _createElementVNode(\"div\", _hoisted_22, _toDisplayString(_unref($t)('popups.disdiDetails.location.city')), 1),\n _createElementVNode(\"div\", null, _toDisplayString(contextLocation.value?.contactInfo.postalCode) + \" \" + _toDisplayString(contextLocation.value?.contactInfo.city), 1)\n ])\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createTextVNode(_toDisplayString(_unref($t)('disdi.maintenance.disdiInfo.registration')) + \": \", 1),\n _createElementVNode(\"div\", _hoisted_23, [\n _createElementVNode(\"div\", _hoisted_24, [\n _createElementVNode(\"div\", _hoisted_25, _toDisplayString(_unref($t)('popups.disdiDetails.registrationStart')), 1),\n _createElementVNode(\"div\", null, _toDisplayString(_unref(regStartString)), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_26, [\n _createElementVNode(\"div\", _hoisted_27, _toDisplayString(_unref($t)('popups.disdiDetails.registrationEnd')), 1),\n _createElementVNode(\"div\", null, _toDisplayString(_unref(regEndString)), 1)\n ])\n ])\n ])\n ]),\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)('disdi.maintenance.maintainInfo')), 1),\n _createElementVNode(\"div\", _hoisted_28, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_29, _toDisplayString(_unref($t)('disdi.maintenance.diaryDescription')), 1),\n _createElementVNode(\"div\", _hoisted_30, [\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: validator.value.diaryDescription.$errors.length })\n }, [\n (currentDisdi.value !== null)\n ? _withDirectives((_openBlock(), _createElementBlock(\"input\", {\n key: 0,\n type: \"text\",\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((currentDisdi.value.diaryDescription) = $event)),\n class: \"w-full\"\n }, null, 512)), [\n [_vModelText, currentDisdi.value.diaryDescription]\n ])\n : _createCommentVNode(\"\", true),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(validator.value.diaryDescription.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_31, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2)\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_32, _toDisplayString(_unref($t)('disdi.maintenance.category')), 1),\n _createElementVNode(\"div\", _hoisted_33, [\n _createElementVNode(\"div\", {\n class: _normalizeClass({ error: validator.value.categoryId.$errors.length })\n }, [\n (currentDisdi.value !== null)\n ? (_openBlock(), _createBlock(_unref(Select), {\n key: 0,\n selected: currentDisdi.value?.categoryId,\n options: categoryList.value,\n mode: \"single\",\n onSelectChanged: changeCategoryId\n }, null, 8, [\"selected\", \"options\"]))\n : _createCommentVNode(\"\", true),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(validator.value.categoryId.$errors, (error) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"input-errors\",\n key: error.$uid\n }, [\n _createElementVNode(\"div\", _hoisted_34, _toDisplayString(error.$message), 1)\n ]))\n }), 128))\n ], 2)\n ])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_35, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_36, _toDisplayString(_unref($t)('disdi.maintenance.attachments')), 1),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_37, _toDisplayString(_unref($t)('disdi.maintenance.uploadDescription')), 1),\n _createElementVNode(\"label\", _hoisted_38, [\n _createElementVNode(\"input\", {\n type: \"file\",\n accept: \"image/*\",\n multiple: \"\",\n ref_key: \"uploadInput\",\n ref: uploadInput,\n onChange: addImageToUploadList,\n style: {\"display\":\"none\"}\n }, null, 544),\n _createElementVNode(\"div\", _hoisted_39, _toDisplayString(_unref($t)('disdi.maintenance.uploadButton')), 1)\n ]),\n _hoisted_40,\n _createVNode(Progressbar, {\n class: \"mt-6\",\n barColor: '#1796C1',\n percentage: uploadPercentage.value\n }, null, 8, [\"percentage\"]),\n (fileNameList.value?.length > 0)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_41, [\n _createTextVNode(_toDisplayString(_unref($t)('disdi.maintenance.uploadedFiles')) + \": \", 1),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(fileNameList.value, (name) => {\n return (_openBlock(), _createElementBlock(\"div\", { key: name }, _toDisplayString(name), 1))\n }), 128))\n ]))\n : _createCommentVNode(\"\", true)\n ])\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_42, _toDisplayString(_unref($t)('disdi.maintenance.attachmentsPreview')), 1),\n _withDirectives(_createElementVNode(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_43, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(attachmentUrlList.value, (url) => {\n return (_openBlock(), _createElementBlock(\"div\", { key: url }, [\n _createElementVNode(\"div\", _hoisted_44, [\n _createElementVNode(\"button\", {\n class: \"primary deleteButton\",\n onClick: ($event: any) => (deleteAttachmentByIndex(url))\n }, _hoisted_47, 8, _hoisted_45),\n _createElementVNode(\"img\", {\n class: \"w-full\",\n src: url\n }, null, 8, _hoisted_48)\n ])\n ]))\n }), 128))\n ])\n ], 512), [\n [_vShow, !loadingAttachments.value]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_49, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, loadingAttachments.value]\n ])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_50, [\n _createElementVNode(\"button\", {\n class: \"primary ml-auto\",\n onClick: closeDisdi,\n disabled: closingDisdi.value\n }, [\n _createVNode(_unref(TextOrSpinner), {\n text: _unref($t)('disdi.maintenance.saveAndClose'),\n spin: closingDisdi.value\n }, null, 8, [\"text\", \"spin\"])\n ], 8, _hoisted_51)\n ])\n ], 512), [\n [_vShow, !loading.value]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_52, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, loading.value]\n ])\n ]))\n}\n}\n\n})","import script from \"./DisdiMaintenance.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DisdiMaintenance.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./DisdiMaintenance.vue?vue&type=style&index=0&id=0c471f40&scoped=true&lang=scss\"\n\nimport exportComponent from \"/Users/digi_mt/web/1ANAB_Vue_Frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-0c471f40\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"w-full h-full\" }\nconst _hoisted_2 = { class: \"flex flex-col h-full justify-center items-center\" }\nconst _hoisted_3 = { key: 0 }\n\nimport {onMounted, ref} from \"vue\";\nimport {useDisdiMaintenanceStore} from \"@/stores/DisdiMaintenanceStore\";\nimport {ErrorLocationType} from \"@/utilities/enums/Enums\";\nimport Error from \"@/components/Error\";\nimport router from \"@/router\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {SystemCompanySettings} from \"@/models/SystemCompanySettings\";\nimport {MiscService} from \"@/utilities/services/entities/MiscService\";\nimport OAuthService from \"@/utilities/services/OAuthService\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {disdiClientConfig} from \"@/AppConfig\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'DisdiLogin',\n setup(__props) {\n\nconst globalStore = useGlobalStore();\nconst disdiStore = useDisdiMaintenanceStore();\nconst miscService = new MiscService();\n\nconst initializing = ref(false);\n\nconst getTokenAndLogin = async ()=>{\n const authService = new OAuthService(globalStore.getAuthorityUrl(), disdiClientConfig.clientId, disdiClientConfig.scopes, disdiClientConfig.callback, disdiClientConfig.silent);\n await authService.login()\n}\n\nonMounted(async ()=>{\n initializing.value = true;\n\n globalStore.resetState();\n globalStore.user = null;\n globalStore.token = \"\";\n\n globalStore.oAuth.routeAfterLogin = \"/disdi/maintain\";\n disdiStore.currentDisdiId = router.currentRoute.value.params.id as string;\n\n const startupConfig = await miscService.getStartupConfig(ErrorLocationType.login);\n if (startupConfig === null) {\n initializing.value = false;\n return;\n }\n\n globalStore.settings.defaultHiddenColumns = startupConfig.preferenceInfo;\n globalStore.settings.systemCompanySettings = new SystemCompanySettings(startupConfig.companyName, startupConfig.companyIdCode) ;\n globalStore.settings.startupConfig = startupConfig.startupInfo;\n\n await getTokenAndLogin();\n\n initializing.value = false;\n})\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).login\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"h3\", null, _toDisplayString(_ctx.$t('disdi.login.description')), 1),\n (initializing.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [\n _createVNode(LoadingSpinner)\n ]))\n : _createCommentVNode(\"\", true)\n ])\n ]))\n}\n}\n\n})","import script from \"./DisdiLogin.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DisdiLogin.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n id: \"errorpage\",\n class: \"w-full h-full\"\n}\nconst _hoisted_2 = { class: \"flex flex-col h-full justify-center items-center\" }\n\nimport {onMounted} from \"vue\";\nimport {$t} from \"@/utilities/i18n/config\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'DisdiExit',\n setup(__props) {\n\nconst globalStore = useGlobalStore();\n\nonMounted(()=>{\n globalStore.resetState();\n globalStore.user = null;\n globalStore.token = \"\";\n})\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"h1\", null, _toDisplayString(_unref($t)(\"disdi.exit.byeText\")), 1),\n _createElementVNode(\"h3\", null, _toDisplayString(_unref($t)(\"disdi.exit.byeSubText\")), 1)\n ])\n ]))\n}\n}\n\n})","import script from \"./DisdiExit.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DisdiExit.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = { class: \"contentBox\" }\nconst _hoisted_3 = { class: \"block w-full\" }\nconst _hoisted_4 = { class: \"flex mb-4\" }\nconst _hoisted_5 = [\"title\"]\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_7 = [\n _hoisted_6\n]\nconst _hoisted_8 = [\"disabled\", \"title\"]\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_10 = [\n _hoisted_9\n]\nconst _hoisted_11 = { class: \"ml-auto\" }\nconst _hoisted_12 = { class: \"text-center\" }\n\nimport {onBeforeUnmount, onMounted, reactive, ref} from \"vue\";\nimport {BryntumGrid} from \"@bryntum/grid-vue-3\";\nimport {Menu, Store, StringHelper} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport {$t} from \"@/utilities/i18n/config\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport dialog from \"@/dialog\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport Error from \"@/components/Error\";\nimport {useI18n} from \"vue-i18n\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport router from \"@/router\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {CompanyInfo} from \"@/models/company/CompanyInfo\";\nimport {useProviderStore} from \"@/stores/ProviderStore\";\nimport {CompanyService} from \"@/utilities/services/entities/CompanyService\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'Provider',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\nconst providerStore = useProviderStore();\n\nlet selectedProviders = ref([]);\n\nconst { t } = useI18n();\nconst companyService = new CompanyService();\nconst permissionService = new PermissionService();\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = () => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage}px`;\n};\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedProviders.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"providerManagement.confirmDeletionMulti\", { count:selectedProviders.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const p of selectedProviders.value){\n const resp = await companyService.deleteSystemConnectionToCompany(p.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:p.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n cellTooltipFeature: {\n hoverDelay : 300,\n textContent : true,\n\t\thideOnDelegateChange: true,\n },\n relayStoreEvents: true,\n enableTextSelection: true,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n columns : {\n data: [\n\n {\n id:'name',\n field: 'name',\n text: t('providerManagement.grid.companyName'),\n flex: 1,\n },\n\t\t\t{\n\t\t\t\tid:'info',\n\t\t\t\tfield: 'info',\n\t\t\t\ttext: \"\",\n\t\t\t\twidth: 60,\n\t\t\t\tsortable: false,\n\t\t\t\tresizable: false,\n\t\t\t\tminWidth: 60,\n\t\t\t\ttype: \"template\",\n\t\t\t\ttooltipRenderer : ({record}) => {\n\t\t\t\t\tif(record.data.info == null || record.data.info == '') {\n\t\t\t\t\t\treturn StringHelper.xss``\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn StringHelper.xss`${record.data.info}`\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttemplate: ({record}) => {\n\t\t\t\t\tif(record.data.info == '' || record.data.info == null) {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn `
`;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n {\n id:'address',\n field: 'address',\n text: t('providerManagement.grid.adress'),\n flex: 2,\n },\n {\n id:'companyIdCode',\n field: 'companyIdCode',\n text: t('providerManagement.grid.companyIdCode'),\n flex: 1,\n type:'template',\n template: ({record}:any) => {\n return globalStore.settings.systemCompanySettings?.companyIdCode\n ? `${globalStore.settings.systemCompanySettings?.companyIdCode}${record.data.companyIdCode}`\n : `${record.data.companyIdCode}`;\n },\n },\n {\n id:'statistic.pendingWorkerAssignments',\n field: 'statistic.pendingWorkerAssignments',\n text: '',\n width : 36,\n type: \"template\",\n tooltipRenderer: ({ record }) => {\n if(record.data.statistic?.pendingWorkerAssignments > 0) {\n return StringHelper.xss`${t('providerManagement.inactiveUsers')}`;\n }\n },\n template: ({ record }) => {\n const classStr = record.data.statistic?.pendingWorkerAssignments > 0 ? 'icon-status_bald_inaktiv bg-red text-white' : 'icon-person' ;\n const buttonClassStr = record.data.statistic?.pendingWorkerAssignments > 0 ? 'gridRowWarningButton' : 'gridRowButton' ;\n\n return `
`;\n },\n },\n {\n id:'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.provider], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n selectionChange(event) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedProviders.value = selectedProviders.value.concat(event.selected.map(pr => pr.data))\n selectedProviders.value = selectedProviders.value.filter(p => !event.deselected.map(pr => pr.data).some(pr => p?.id === pr?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n cellClick({column, record}) {\n if (column.data.field === 'statistic.pendingWorkerAssignments') {\n if(permissionService.userHasPermission(\"ProviderManagementPolicy.CompanyWorker.Read\")) {\n router.push(`/providermanagement/${record.data.companyId ?? record.data.id}`)\n }\n }\n },\n },\n height: currentWindowHeight,\n}\nconst gridConfig = reactive(useGridConfig);\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: t(\"providerManagement.grid.showStaff\"),\n cls: 'color',\n icon: 'icon-status_aktiv',\n hidden: !permissionService.userHasPermission(\"ProviderManagementPolicy.CompanyWorker.Read\"),\n weight: 100,\n onItem : ({ menu }) => {\n router.push({ path: `/providermanagement/${menu.record.companyId ?? menu.record.id}` })\n }\n },\n {\n text: t(\"global.edit\"),\n cls: 'color',\n icon: 'icon-editieren',\n hidden: !permissionService.userHasPermission(\"ProviderManagementPolicy.Edit\"),\n weight: 100,\n onItem : ({ menu }) => {\n globalStore.openPopup({\n data: menu.record,\n action:providerStore.addOrUpdateProvider,\n resetButton:false,\n title:$t(\"popups.providerManagement.edit\"),\n type:PopupType.providerManagementEditPopup\n });\n }\n },\n {\n text : t(\"global.delete\"),\n hidden: !permissionService.userHasPermission(\"ProviderManagementPolicy.Delete\"),\n cls\t: 'color',\n icon: 'icon-loeschen',\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"providerManagement.confirmDeletionSingle\", {name: menu.record.name}));\n\n if (answer) {\n const resp = await companyService.deleteSystemConnectionToCompany(menu.record.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n gridStore.applyChangeset({removed:[{id:menu.record.id}]});\n\n globalStore.showSuccess(t('global.deleted'));\n }\n }\n }\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\n\nconst newProvider = () => {\n globalStore.openPopup({\n data: new CompanyInfo(),\n action: providerStore.addOrUpdateProvider,\n resetButton: false,\n title:$t(\"popups.providerManagement.new\"),\n type:PopupType.providerManagementEditPopup\n });\n}\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n const companyResp = await companyService.getCompanyDetails();\n if (companyResp === null || companyResp === undefined || companyResp.statusCode !== 0) {\n ErrorHandler.handleError(companyResp, ErrorLocationType.table);\n return;\n }\n\n gridStore.setStoreData(companyResp.anAbCompaniesInfo);\n\n globalStore.reorderColumns(TableType[TableType.provider]);\n\n // stop spinner\n globalStore.gridDataIsLoading = false;\n};\n\nonMounted(async () => {\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n});\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)(\"providerManagement.title\")), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"div\", _hoisted_4, [\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n onClick: newProvider,\n title: _unref(t)('providerManagement.new')\n }, _hoisted_7, 8, _hoisted_5)), [\n [_directive_permission, 'ProviderManagementPolicy.Create']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedProviders).some(()=>true),\n onClick: deleteSelection,\n title: _unref(t)('global.delete')\n }, _hoisted_10, 8, _hoisted_8)), [\n [_directive_permission, 'ProviderManagementPolicy.Delete']\n ]),\n _createElementVNode(\"div\", _hoisted_11, [\n _createVNode(_unref(GridInputFilter), {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_12, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ])\n ], 64))\n}\n}\n\n})","import script from \"./Provider.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./Provider.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","export class AnAbSystemInfo {\n userId:string = \"\";\n idCode:string = \"\";\n name:string = \"\";\n baseUrl:string = \"\";\n systemCouplingBaseUrl:string = \"\";\n systemCouplingName:string = \"\";\n anabSystemId:string = \"\";\n phoneNumber:string = \"\";\n colors:string = \"\";\n iconName:string = \"\";\n pdfName:string = \"\";\n dialCode:string = \"\";\n textPhoneNumber:string = \"\";\n voicePhoneNumber:string = \"\";\n privacyPolicyLink:string = \"\";\n userConfirmationExpired?:boolean = undefined;\n userLastInteraction?:Date = undefined;\n hasRegistrationGuest:boolean = false;\n companyIdCode:string = \"\";\n contactPersonName:string = \"\";\n contactPersonEmail:string = \"\";\n contactPersonDialCode:string =\"\";\n contactPersonPhoneNumber:string = \"\";\n}","import {AnAbSystemInfo} from \"@/models/system/AnAbSystemInfo\";\n\nexport class CompanyWorkerInfo {\n // anabSystem === companyWorkerAnAbSystem-entry so it hold user-specific-data\n anAbSystem:AnAbSystemInfo = new AnAbSystemInfo();\n anAbSystemId:string = \"\";\n companyId:string = \"\";\n email:string = \"\";\n userId:string = \"\";\n id:string = this.userId; // ghost property not given from backend, needed for bryntumgrid\n isAdmin:boolean = false;\n isEnabled:boolean = false;\n dialCode:string = \"\";\n phoneNumber:string = \"\";\n firstName:string = \"\";\n lastName:string = \"\";\n fullName: string = `${this.firstName} ${this.lastName}`;\n userInfo:string = \"\";\n isAnonymous:boolean = false;\n sendVerificationEmailDate?:Date = undefined;\n}","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, isRef as _isRef, createVNode as _createVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives, mergeProps as _mergeProps, vShow as _vShow, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"contentHeader flex\" }\nconst _hoisted_2 = {\n key: 0,\n class: \"contentBox\"\n}\nconst _hoisted_3 = { class: \"flex\" }\nconst _hoisted_4 = { class: \"flex\" }\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"smallIcon icon-pfeil-links iconInButton\" }, null, -1)\nconst _hoisted_6 = { class: \"text-grey ml-2 mt-1.5\" }\nconst _hoisted_7 = { key: 0 }\nconst _hoisted_8 = { class: \"flex\" }\nconst _hoisted_9 = { class: \"providerDetailBox\" }\nconst _hoisted_10 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_11 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_12 = { class: \"providerDetailBox\" }\nconst _hoisted_13 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_14 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_15 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_16 = [\"href\"]\nconst _hoisted_17 = { class: \"providerDetailBox\" }\nconst _hoisted_18 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_19 = { class: \"showDetails\" }\nconst _hoisted_20 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"smallIcon icon-pfeil-hoch\" }, null, -1)\nconst _hoisted_21 = { key: 1 }\nconst _hoisted_22 = { class: \"showDetails\" }\nconst _hoisted_23 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"smallIcon icon-pfeil-runter\" }, null, -1)\nconst _hoisted_24 = { class: \"block w-full\" }\nconst _hoisted_25 = { class: \"flex mb-4\" }\nconst _hoisted_26 = [\"title\"]\nconst _hoisted_27 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-neu\" }, null, -1)\nconst _hoisted_28 = [\n _hoisted_27\n]\nconst _hoisted_29 = [\"disabled\", \"title\"]\nconst _hoisted_30 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon-loeschen\" }, null, -1)\nconst _hoisted_31 = [\n _hoisted_30\n]\nconst _hoisted_32 = { class: \"ml-auto\" }\nconst _hoisted_33 = { class: \"text-center\" }\n\nimport {onBeforeUnmount, onMounted, reactive, ref, watchEffect} from \"vue\";\nimport {BryntumGrid} from \"@bryntum/grid-vue-3\";\nimport {Menu, Store, StringHelper} from \"@bryntum/grid\";\nimport GridInputFilter from \"@/components/GridInputFilter\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {ErrorLocationType, PopupType, TableType} from '@/utilities/enums/Enums';\nimport {$t} from \"@/utilities/i18n/config\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport dialog from \"@/dialog\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {GeneralResponse} from \"@/models/api/Responses\";\nimport Error from \"@/components/Error\";\nimport {useI18n} from \"vue-i18n\";\nimport {checkboxColumnConfig, defaultSpaceAroundTableOnPage} from \"@/AppConfig\";\nimport router from \"@/router\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {CompanyWorkerInfo} from \"@/models/company/CompanyWorkerInfo\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\nimport {CompanyWorkerService} from \"@/utilities/services/entities/CompanyWorkerService\";\nimport {CompanyService} from \"@/utilities/services/entities/CompanyService\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'ProviderDetails',\n setup(__props) {\n\nconst gridStore = new Store();\nconst globalStore = useGlobalStore();\n\nlet showCompanyDetails = ref(false);\nlet selectedCompanyWorkers = ref([]);\nconst selectedCompany = ref(undefined);\n\nconst { t } = useI18n();\nconst companyWorkerService = new CompanyWorkerService();\nconst companyService = new CompanyService();\nconst permissionService = new PermissionService();\n\nconst currentWindowHeight = ref(\"\");\nconst recalcGridHeight = (offset: number = 110) => {\n currentWindowHeight.value = `${window.innerHeight-defaultSpaceAroundTableOnPage-offset}px`;\n};\n\nconst deleteSelection = async() => {\n //drop call without selection\n if(!selectedCompanyWorkers.value?.some(()=>true)) return;\n\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"providerManagementDetails.confirmDeletionMulti\", { count:selectedCompanyWorkers.value.length}));\n\n if (answer) {\n let someEntriesFailed = false;\n for (const cw of selectedCompanyWorkers.value){\n const resp = await companyWorkerService.deleteCompanyWorker(selectedCompany.value.id, cw.id);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n someEntriesFailed = true;\n continue;\n }\n\n gridStore.applyChangeset({removed:[{id:cw.id}]});\n }\n\n if (someEntriesFailed) return;\n\n globalStore.showSuccess(t(\"global.deleted\"));\n }\n};\n\nconst grid = ref(null);\nconst useGridConfig = {\n headerMenuFeature: false,\n relayStoreEvents: true,\n\tcellTooltipFeature: {\n\t\thoverDelay : 300,\n\t\ttextContent : true,\n\t\thideOnDelegateChange: true,\n\t},\n enableTextSelection: true,\n selectionMode : {\n row\t : true,\n checkbox: checkboxColumnConfig,\n showCheckAll : true,\n deselectFilteredOutRecords: true\n },\n columns : {\n data: [\n {\n id:'firstName',\n field: 'firstName',\n text: t('providerManagementDetails.grid.name'),\n flex: 1,\n type: 'template',\n template: ({record})=>{\n\t\t\t\t\treturn StringHelper.xss`${record.data.firstName ?? \"\"} ${record.data.lastName ?? \"\"}`;\n }\n },\n {\n id:'isAdmin',\n field: 'isAdmin',\n text: t('providerManagementDetails.grid.admin'),\n width: 100,\n type: \"template\",\n template: ({record}) => {\n return record.data.isAdmin ? `Admin` : \"\";\n },\n },\n {\n id:'email',\n field: 'email',\n text: t('providerManagementDetails.grid.email'),\n flex: 1\n },\n {\n id:'phoneNumber',\n field: 'phoneNumber',\n text: t('providerManagementDetails.grid.phoneNumber'),\n flex: 1,\n type: 'template',\n template: ({record})=>{\n\t\t\t\t\treturn StringHelper.xss`${record.data.dialCode ?? \"\"}${record.data.phoneNumber ?? \"\"}`;\n }\n },\n {\n id:'anAbSystem.userConfirmationExpired',\n field: 'anAbSystem.userConfirmationExpired',\n text: t('providerManagementDetails.grid.active'),\n width : 36,\n type: \"template\",\n template: ({record}) => {\n return record.data.anAbSystem?.userConfirmationExpired\n ? ``\n : ``;\n },\n },\n {\n id:'isEnabled',\n field: 'isEnabled',\n text: t('providerManagementDetails.grid.cleared'),\n width: 100,\n type: \"template\",\n template: ({record}) => {\n let outputString = \"\";\n if(permissionService.userHasPermission(\"ProviderManagementPolicy.CompanyWorker.Edit\")) {\n outputString = record.data.isEnabled\n ? `` // id=\"isEnabledSwitch\" value=\"${record.data.userId}\"\n : ``;\n } else {\n outputString = ``;\n }\n\n return outputString;\n },\n },\n\t\t\t{\n\t\t\t\tid: 'info',\n\t\t\t\tfield: 'info',\n\t\t\t\ttext: \"\",\n\t\t\t\twidth: 60,\n\t\t\t\tsortable: false,\n\t\t\t\tresizable: false,\n\t\t\t\tminWidth: 60,\n\t\t\t\ttype: \"template\",\n\t\t\t\ttooltipRenderer: ({record}) => {\n\t\t\t\t\t\treturn StringHelper.xss`${record.data.userInfo ?? \"\"}`\n\t\t\t\t},\n\t\t\t\ttemplate: ({record}) => {\n\t\t\t\t\tif(!NullOrUndefinedHelper(record.data.userInfo)) {\n\t\t\t\t\t\treturn `
`;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n {\n id:'menu',\n text\t: '',\n width : 36,\n type\t: 'widget',\n align: \"center\",\n hideable: false,\n resizable: false,\n sortable: false,\n filterable: false,\n widgets : [{\n type\t : 'button',\n width: 36,\n icon\t : 'icon-kontext_horizontal',\n onAction : ({ source: btn }) => {\n const menu = menuFactory(btn.cellInfo.record.data);\n menu.alignTo({ target: btn })\n menu.show();\n }\n }]\n },\n ],\n listeners:{\n async add(event:any){\n if(event.records.length === 1 && event.isMove[event.records[0].id]){\n await globalStore.saveUserColumnOrder(TableType[TableType.providerStaff], event.records[0].id, event.index.toString());\n }\n },\n }\n },\n store: gridStore,\n listeners: {\n selectionChange(event) {\n if(event.selection.length > 0 && event.selection[0]?.data === undefined) return;\n selectedCompanyWorkers.value = selectedCompanyWorkers.value.concat(event.selected.map(cwr => cwr.data))\n selectedCompanyWorkers.value = selectedCompanyWorkers.value.filter(cw => !event.deselected.map(cwr => cwr.data).some(cwr => cw?.id === cwr?.id));\n },\n datachange(){\n globalStore.currentItems = gridStore.count;\n globalStore.allItems = gridStore.originalCount;\n },\n async cellClick({column, record}) {\n if (column.data.field === 'anAbSystem.userConfirmationExpired') {\n if(record.data.anAbSystem.userConfirmationExpired){\n const resp = await companyWorkerService.postResetExpirationForCompanyWorker(selectedCompany.value.id, record.data.userId);\n record.data.anAbSystem.userConfirmationExpired = resp === null || resp === undefined || resp.statusCode !== 0;\n gridStore.add(record);\n }\n }\n if(column.data.field === 'isEnabled'){\n record.data.isEnabled = !record.data.isEnabled;\n const resp = await companyWorkerService.postSetCompanyWorkerEnabled(record.data.userId, record.data.isEnabled);\n record.data.isEnabled = resp === null || resp === undefined || resp.statusCode !== 0;\n gridStore.add(record);\n }\n },\n },\n height: currentWindowHeight,\n}\nconst gridConfig = reactive(useGridConfig);\n\nconst menuFactory = (record:object) => {\n const menu = new Menu({\n anchor : true,\n autoShow : true,\n items\t: [\n {\n text: t(\"providerManagementDetails.grid.reactivate\"),\n disabled: !record.anAbSystem.userConfirmationExpired,\n cls: 'color',\n icon: 'icon-person',\n weight: 100,\n onItem : async ({record}) => {\n const resp = await companyWorkerService.postResetExpirationForCompanyWorker(selectedCompany.value.id, record.data.userId);\n record.data.anAbSystem.userConfirmationExpired = resp === null || resp === undefined || resp.statusCode !== 0;\n gridStore.add(record);\n }\n },\n {\n text: t(\"global.edit\"),\n hidden: !permissionService.userHasPermission(\"ProviderManagementPolicy.CompanyWorker.Edit\"),\n cls: 'color',\n icon: 'icon-editieren',\n weight: 100,\n onItem : ({ menu }) => {\n globalStore.openPopup({\n data: menu.record,\n action:addOrUpdateCompanyWorker,\n resetButton:false,\n title:$t(\"popups.providerManagementDetails.edit\"),\n type:PopupType.providerCompanyWorkerEditPopup\n });\n }\n },\n {\n text : t(\"global.delete\"),\n disabled: !permissionService.userHasPermission(\"ProviderManagementPolicy.Delete\"),\n hidden: false,\n cls\t: 'color',\n icon: 'icon-loeschen',\n weight : 140,\n onItem: async ({ menu }) => {\n const answer = await dialog\n .okText(t(\"global.delete\"))\n .cancelText(t(\"global.cancel\"))\n .confirm(t(\"providerManagementDetails.confirmDeletionSingle\", {name: `${menu.record.firstName} ${menu.record.lastName}`}));\n\n if (answer) {\n const resp = await companyWorkerService.deleteCompanyWorker(selectedCompany.value.id, menu.record.id ?? menu.record.userId);\n\n if(resp === null || resp === undefined || resp?.statusCode !== 0){\n ErrorHandler.handleError(resp, ErrorLocationType.table);\n return;\n }\n\n gridStore.applyChangeset({removed:[{id:menu.record.id}]});\n\n globalStore.showSuccess(t('global.deleted'));\n }\n }\n }\n ],\n });\n\n menu.setRecord(record);\n\n return menu;\n};\n\nconst newCompanyWorker = () => {\n globalStore.openPopup({\n data: new CompanyWorkerInfo(),\n action: checkForExistingPhoneNumber,\n resetButton: false,\n title:$t(\"popups.providerManagementDetails.new\"),\n type:PopupType.providerNewCompanyWorkerPopup\n });\n}\n\n// CAUTION: missusing userInfo prop here to show messages from api and clearing it before proceeding to edit new cw\nconst checkForExistingPhoneNumber = async ()=>{\n globalStore.modal.contentObject.userInfo = \"\";\n\n const companyWorker = globalStore.modal.contentObject as CompanyWorkerInfo;\n\n const foundCompanyWorkerResp = await companyWorkerService.postSearchCompanyWorkerByPhonenumber(selectedCompany.value.id, companyWorker.dialCode, companyWorker.phoneNumber);\n if (foundCompanyWorkerResp === null || foundCompanyWorkerResp === undefined || foundCompanyWorkerResp.statusCode !== 0){\n ErrorHandler.handleError(foundCompanyWorkerResp, ErrorLocationType.popup);\n return;\n }\n\n if (foundCompanyWorkerResp.statusMessage !== \"\"){\n if(!NullOrUndefinedHelper(foundCompanyWorkerResp.user)){\n foundCompanyWorkerResp.user.id = foundCompanyWorkerResp.user?.userId;\n gridStore.add(foundCompanyWorkerResp.user);\n\n globalStore.closeModal()\n globalStore.showSuccess($t('providerManagementDetails.connectedWorker'))\n }\n globalStore.modal.contentObject.userInfo = foundCompanyWorkerResp.statusMessage;\n\n return;\n }\n\n globalStore.modal.contentObject.userInfo = \"\";\n const user = globalStore.modal.contentObject;\n\n\n globalStore.openPopup({\n data: user,\n action: addOrUpdateCompanyWorker,\n resetButton: false,\n title:$t(\"popups.providerManagementDetails.new\"),\n type:PopupType.providerCompanyWorkerEditPopup\n });\n}\n\nconst addOrUpdateCompanyWorker = async () => {\n const companyWorker = globalStore.modal.contentObject as CompanyWorkerInfo;\n\n const companyWorkerResponse = await companyWorkerService.addorUpdateCompanyWorker(selectedCompany.value.id, companyWorker);\n if (companyWorkerResponse === null || companyWorkerResponse === undefined || companyWorkerResponse.statusCode !== 0){\n ErrorHandler.handleError(companyWorkerResponse as GeneralResponse, ErrorLocationType.popup);\n return;\n }\n\n if(companyWorker.id === \"\") {\n companyWorker.id = companyWorkerResponse.userId;\n companyWorker.userId = companyWorkerResponse.userId;\n }\n // fix selection when it was an update -> replace old value in selected-array\n else if(selectedCompanyWorkers.value.some(el => el.id === companyWorker.id)) {\n selectedCompanyWorkers.value = selectedCompanyWorkers.value.filter(el => el.id !== companyWorker.id);\n selectedCompanyWorkers.value.push(companyWorker);\n }\n\n gridStore.add(companyWorker);\n gridStore.sort(gridStore.sorters);\n\n globalStore.closeModal();\n globalStore.showSuccess(t('global.saved'));\n}\n\nconst setGridData = async ()=>{\n // start spinner\n globalStore.gridDataIsLoading = true;\n\n const companyWorkerResp = await companyWorkerService.getCompanyWorkerInfoForCompany(selectedCompany.value.id);\n if (companyWorkerResp === null || companyWorkerResp === undefined || companyWorkerResp.statusCode !== 0) {\n ErrorHandler.handleError(companyWorkerResp, ErrorLocationType.table);\n return;\n }\n\n gridStore.setStoreData(companyWorkerResp.companyWorkers.map(cw =>{\n cw.id = cw.userId;\n return cw;\n }));\n\n selectedCompany.value.hasAdmin = companyWorkerResp.companyWorkers.some(cw => cw.isAdmin);\n\n globalStore.reorderColumns(TableType[TableType.providerStaff]);\n\n // stop spinner\n globalStore.gridDataIsLoading = false;\n};\n\n\nonMounted(async () => {\n // start spinner\n globalStore.gridDataIsLoading = true;\n const selectedCompanyResp = await companyService.getCompanyById(router.currentRoute.value.params.id as string);\n\n //@ts-expect-error\n selectedCompany.value = selectedCompanyResp.companyInfo;\n // stop spinner\n globalStore.gridDataIsLoading = false;\n\n // calculate grid height and sub to window resize event\n recalcGridHeight();\n window.addEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(ref(gridStore));\n globalStore.setGridColumnStore(ref(grid.value?.instance.value?.columns));\n\n await setGridData();\n});\n\nonBeforeUnmount(()=>{\n window.removeEventListener('resize', recalcGridHeight);\n\n globalStore.setGridStore(null);\n globalStore.setGridColumnStore(null);\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n});\n\nwatchEffect(()=>{\n if (showCompanyDetails.value) recalcGridHeight(195)\n else recalcGridHeight()\n})\n\nreturn (_ctx: any,_cache: any) => {\n const _directive_permission = _resolveDirective(\"permission\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"h4\", null, _toDisplayString(_unref($t)(\"providerManagementDetails.title\")), 1)\n ]),\n (selectedCompany.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"button\", {\n onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_unref(router).back && _unref(router).back(...args)))\n }, [\n _createElementVNode(\"div\", _hoisted_4, [\n _hoisted_5,\n _createElementVNode(\"div\", null, _toDisplayString(_unref($t)(\"providerManagementDetails.backButton\")), 1)\n ])\n ]),\n _createElementVNode(\"h4\", _hoisted_6, _toDisplayString(_unref($t)(\"providerManagementDetails.headline\")) + \" \" + _toDisplayString(selectedCompany.value.name), 1)\n ]),\n _createElementVNode(\"div\", {\n class: \"providerDetails\",\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_isRef(showCompanyDetails) //@ts-ignore\n ? showCompanyDetails.value = !_unref(showCompanyDetails) : showCompanyDetails = !_unref(showCompanyDetails)))\n }, [\n (_unref(showCompanyDetails))\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n _createElementVNode(\"div\", _hoisted_8, [\n _createElementVNode(\"div\", _hoisted_9, [\n _createElementVNode(\"strong\", null, _toDisplayString(_unref($t)(\"providerManagementDetails.address\")), 1),\n _hoisted_10,\n _createTextVNode(\" \" + _toDisplayString(selectedCompany.value.street) + \" \" + _toDisplayString(selectedCompany.value.streetnumber), 1),\n _hoisted_11,\n _createTextVNode(\" \" + _toDisplayString(selectedCompany.value.zip) + \" \" + _toDisplayString(selectedCompany.value.city), 1)\n ]),\n _createElementVNode(\"div\", _hoisted_12, [\n _createElementVNode(\"strong\", null, _toDisplayString(_unref($t)(\"providerManagementDetails.contact\")), 1),\n _hoisted_13,\n _createTextVNode(\" \" + _toDisplayString(selectedCompany.value.contactPersonName), 1),\n _hoisted_14,\n _createTextVNode(\" \" + _toDisplayString(selectedCompany.value.contactPersonPhoneNumber), 1),\n _hoisted_15,\n _createElementVNode(\"a\", {\n href: 'mailto:'+selectedCompany.value.contactPersonEmail\n }, _toDisplayString(selectedCompany.value.contactPersonEmail), 9, _hoisted_16)\n ]),\n _createElementVNode(\"div\", _hoisted_17, [\n _createElementVNode(\"strong\", null, _toDisplayString(_unref($t)(\"providerManagementDetails.information\")), 1),\n _hoisted_18,\n _createTextVNode(\" \" + _toDisplayString(selectedCompany.value.info), 1)\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_19, [\n _createTextVNode(_toDisplayString(_unref($t)(\"providerManagementDetails.lessInfos\")) + \" \", 1),\n _hoisted_20\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_21, [\n _createElementVNode(\"div\", _hoisted_22, [\n _createTextVNode(_toDisplayString(_unref($t)(\"providerManagementDetails.moreInfos\")) + \" \", 1),\n _hoisted_23\n ])\n ]))\n ]),\n _withDirectives(_createElementVNode(\"div\", null, [\n _createVNode(_unref(Error), {\n errorLoc: _unref(ErrorLocationType).table\n }, null, 8, [\"errorLoc\"]),\n _createElementVNode(\"div\", _hoisted_24, [\n _createElementVNode(\"div\", _hoisted_25, [\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n onClick: newCompanyWorker,\n title: _unref(t)('providerManagementDetails.new')\n }, _hoisted_28, 8, _hoisted_26)), [\n [_directive_permission, 'ProviderManagementPolicy.CompanyWorker.Create']\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"button\", {\n class: \"primary mr-2\",\n disabled: !_unref(selectedCompanyWorkers).some(()=>true),\n onClick: deleteSelection,\n title: _unref(t)('global.delete')\n }, _hoisted_31, 8, _hoisted_29)), [\n [_directive_permission, 'ProviderManagementPolicy.CompanyWorker.Delete']\n ]),\n _createElementVNode(\"div\", _hoisted_32, [\n _createVNode(_unref(GridInputFilter), {\n gridStore: _unref(gridStore),\n hideFilterButton: true\n }, null, 8, [\"gridStore\"])\n ])\n ]),\n _createVNode(_unref(BryntumGrid), _mergeProps({\n ref_key: \"grid\",\n ref: grid\n }, gridConfig, { readOnly: true }), null, 16)\n ])\n ], 512), [\n [_vShow, !_unref(globalStore).gridDataIsLoading]\n ]),\n _withDirectives(_createElementVNode(\"div\", _hoisted_33, [\n _createVNode(LoadingSpinner)\n ], 512), [\n [_vShow, _unref(globalStore).gridDataIsLoading]\n ])\n ]))\n : _createCommentVNode(\"\", true)\n ], 64))\n}\n}\n\n})","import script from \"./ProviderDetails.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ProviderDetails.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nimport {onMounted} from \"vue\";\nimport router from \"@/router\";\nimport jwt_decode from \"jwt-decode\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {ErrorLocationType} from \"@/utilities/enums/Enums\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {UserService} from \"@/utilities/services/entities/UserService\";\nimport OAuthService from \"@/utilities/services/OAuthService\";\nimport {User} from \"oidc-client\";\nimport {$t} from \"@/utilities/i18n/config\";\nimport {notify} from \"@kyvg/vue3-notification\";\nimport {disdiClientConfig} from \"@/AppConfig\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'OAuthDisdiCallback',\n setup(__props) {\n\nconst globalStore = useGlobalStore();\nconst userService = new UserService();\n\nonMounted(async ()=> {\n const oAuthService = new OAuthService(globalStore.getAuthorityUrl(), disdiClientConfig.clientId, disdiClientConfig.scopes, disdiClientConfig.callback, disdiClientConfig.silent);\n const userManager = oAuthService.userManager;\n\n let oAuthUser = null as unknown as User;\n try{\n oAuthUser = await userManager.signinRedirectCallback() as User;\n }\n catch (e) {\n console.error(e);\n return;\n }\n\n\n globalStore.setToken(oAuthUser.access_token);\n\n //@ts-expect-error\n const userResp = await userService.getDisdiUserById(jwt_decode(oAuthUser.access_token).sub);\n\n if (userResp === null || userResp === undefined || userResp.statusCode !== 0) {\n ErrorHandler.handleError(userResp, ErrorLocationType.login);\n }\n\n globalStore.setUser(userResp.userInfo);\n\n //@ts-expect-error\n await router.push(globalStore.oAuth.routeAfterLogin);\n\n notify({\n title: \"Erfolg\",\n text: $t('login.notifySuccessfulLogin'),\n duration: 5000,\n type: \"success\"\n });\n})\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", null, \" Waiting \"))\n}\n}\n\n})","import script from \"./OAuthDisdiCallback.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./OAuthDisdiCallback.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n \n\n\n","import script from \"./OAuthDisdiSilentCallback.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./OAuthDisdiSilentCallback.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nimport {onMounted} from \"vue\";\nimport router from \"@/router\";\nimport jwt_decode from \"jwt-decode\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {ErrorLocationType, PreferenceType} from \"@/utilities/enums/Enums\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {UserService} from \"@/utilities/services/entities/UserService\";\nimport OAuthService from \"@/utilities/services/OAuthService\";\nimport {User} from \"oidc-client\";\nimport {UserPreference} from \"@/models/user/UserPreference\";\nimport {$t, i18n} from \"@/utilities/i18n/config\";\nimport {GeneralResponse} from \"@/models/api/Responses\";\nimport {MiscService} from \"@/utilities/services/entities/MiscService\";\nimport {notify} from \"@kyvg/vue3-notification\";\nimport {AccountService} from \"@/utilities/services/entities/AccountService\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'OAuthSsoCallback',\n setup(__props) {\n\nconst globalStore = useGlobalStore();\nconst userService = new UserService();\nconst miscService = new MiscService();\nconst accountService = new AccountService();\n\nconst setUserSettings = async(userId:string)=> {\n // get filters for user\n const filterResp = await userService.getUserPreferences(userId, PreferenceType.filter);\n // get hiddenColumns for User\n const columnResp = await userService.getUserPreferences(userId, PreferenceType.hiddenColumn);\n // get general settings for User\n const genSetResp = await userService.getUserPreferences(userId, PreferenceType.general);\n // get columnOrder settings for User\n const colOrderResp = await userService.getUserPreferences(userId, PreferenceType.columnOrder);\n\n if (filterResp?.statusCode === 0 && columnResp?.statusCode === 0 && genSetResp?.statusCode === 0 && colOrderResp?.statusCode === 0) {\n globalStore.setUserPreferences({\n userFilters: filterResp.preferenceInfo ?? [],\n userHiddenColumns: columnResp.preferenceInfo ?? [],\n userColumnOrder: colOrderResp.preferenceInfo ?? [],\n general: {\n darkMode: genSetResp.preferenceInfo.find((pi: UserPreference) => pi.attributeName === \"darkMode\")?.attributeValue ?? false,\n userStartPage: genSetResp.preferenceInfo.find((pi: UserPreference) => pi.attributeName === \"userStartPage\")?.attributeValue ?? \"/account\",\n userLocale: genSetResp.preferenceInfo.find((pi: UserPreference) => pi.attributeName === \"userLocale\")?.attributeValue ?? \"de\",\n },\n });\n\n // set language. if not null or undefined fallback to DE\n // @ts-expect-error\n i18n.global.locale.value = globalStore.userPreferences.general.userLocale;\n } else {\n ErrorHandler.handleError(new GeneralResponse(6666, \"Ihre Einstellungen konnten nicht geladen werden\"), ErrorLocationType.table);\n }\n}\n\nconst setHubNotifs = async()=>{\n const notifResp = await miscService.getHubNotifications();\n\n if(notifResp?.statusCode === 0){\n globalStore.notifications = notifResp.notifications;\n }\n else{\n ErrorHandler.handleError(\n new GeneralResponse(6667, \"Die Benachrichtigungen konnte nicht geladen werden\"),\n ErrorLocationType.table\n );\n }\n}\n\nonMounted(async ()=> {\n const clientId = globalStore.settings.startupConfig?.clientId as string;\n const scopes = globalStore.settings.startupConfig?.clientScopes as string;\n const metaDataUrl = globalStore.settings.startupConfig?.metaDataUrl;\n const metaData = !NullOrUndefinedHelper(metaDataUrl) ? await miscService.getOidcMetaData(metaDataUrl as string) : undefined;\n const ssoCallback = \"/sso/oAuthCallback\";\n const ssoSilentCallback = \"/sso/oAuthCallback/silent\";\n\n const oAuthService = new OAuthService(globalStore.getAuthorityUrl(), clientId, scopes, ssoCallback, ssoSilentCallback, metaData);\n\n const userManager = oAuthService.userManager;\n try {\n const oAuthUser = await userManager.signinRedirectCallback() as User;\n\n console.log(oAuthUser)\n\n globalStore.setToken(oAuthUser.id_token);\n\n const exchangedToken = await accountService.exchangeToken(ErrorLocationType.login);\n if (exchangedToken === null){\n //TODO return to login? go to dedicated error page?\n return;\n }\n\n globalStore.setToken(exchangedToken);\n\n //@ts-expect-error\n const userResp = await userService.getUserById(jwt_decode(exchangedToken).id);\n if (userResp === null || userResp === undefined || userResp.statusCode !== 0) {\n ErrorHandler.handleError(userResp, ErrorLocationType.login);\n }\n\n globalStore.setUser(userResp.userInfo);\n\n await setUserSettings(userResp.userInfo.id);\n await setHubNotifs();\n\n //@ts-expect-error\n await router.push(globalStore.userPreferences.general.userStartPage);\n\n notify({\n title: \"Erfolg\",\n text: $t('login.notifySuccessfulLogin'),\n duration: 5000,\n type: \"success\"\n });\n }\n catch (e){\n console.error(\"Login failed:\", e)\n }\n})\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", null, \" Waiting \"))\n}\n}\n\n})","import script from \"./OAuthSsoCallback.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./OAuthSsoCallback.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n \n Waiting\n
\n\n\n","import script from \"./OAuthSsoSilentCallback.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./OAuthSsoSilentCallback.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"w-full h-full\" }\nconst _hoisted_2 = { class: \"flex flex-col h-full justify-center items-center\" }\n\nimport {onMounted} from \"vue\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {ErrorLocationType, PreferenceType} from \"@/utilities/enums/Enums\";\nimport {UserPreference} from \"@/models/user/UserPreference\";\nimport {$t, i18n} from \"@/utilities/i18n/config\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {GeneralResponse} from \"@/models/api/Responses\";\nimport jwt_decode from \"jwt-decode\";\nimport router from \"@/router\";\nimport {notify} from \"@kyvg/vue3-notification\";\nimport LoadingSpinner from \"@/components/LoadingSpinner.vue\";\nimport {UserService} from \"@/utilities/services/entities/UserService\";\nimport {MiscService} from \"@/utilities/services/entities/MiscService\";\nimport {usePermissionStore} from \"@/stores/PermissionStore\";\nimport {anabPolicies} from \"@/AppConfig\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\n\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'SamlCallback',\n setup(__props) {\n\nconst globalStore = useGlobalStore();\nconst userService = new UserService();\nconst miscService = new MiscService();\nconst permissionService = new PermissionService();\n\nconst setUserSettings = async(userId:string)=> {\n // get filters for user\n const filterResp = await userService.getUserPreferences(userId, PreferenceType.filter);\n // get hiddenColumns for User\n const columnResp = await userService.getUserPreferences(userId, PreferenceType.hiddenColumn);\n // get general settings for User\n const genSetResp = await userService.getUserPreferences(userId, PreferenceType.general);\n // get columnOrder settings for User\n const colOrderResp = await userService.getUserPreferences(userId, PreferenceType.columnOrder);\n\n if (filterResp?.statusCode === 0 && columnResp?.statusCode === 0 && genSetResp?.statusCode === 0 && colOrderResp?.statusCode === 0) {\n globalStore.setUserPreferences({\n userFilters: filterResp.preferenceInfo ?? [],\n userHiddenColumns: columnResp.preferenceInfo ?? [],\n userColumnOrder: colOrderResp.preferenceInfo ?? [],\n general: {\n darkMode: genSetResp.preferenceInfo.find((pi: UserPreference) => pi.attributeName === \"darkMode\")?.attributeValue ?? false,\n userStartPage: genSetResp.preferenceInfo.find((pi: UserPreference) => pi.attributeName === \"userStartPage\")?.attributeValue ?? \"/account\",\n userLocale: genSetResp.preferenceInfo.find((pi: UserPreference) => pi.attributeName === \"userLocale\")?.attributeValue ?? \"de\",\n },\n });\n\n // set language. if not null or undefined fallback to DE\n // @ts-expect-error\n i18n.global.locale.value = globalStore.userPreferences.general.userLocale;\n } else {\n ErrorHandler.handleError(new GeneralResponse(6666, \"Ihre Einstellungen konnten nicht geladen werden\"), ErrorLocationType.table);\n }\n}\n\nconst setHubNotifs = async()=>{\n const notifResp = await miscService.getHubNotifications();\n\n if(notifResp?.statusCode === 0){\n globalStore.notifications = notifResp.notifications;\n }\n else{\n ErrorHandler.handleError(\n new GeneralResponse(6667, \"Die Benachrichtigungen konnte nicht geladen werden\"),\n ErrorLocationType.table\n );\n }\n}\n\nconst addDynamicRoles= async ()=>{\n const readRoleString = globalStore.settings.disdiSettings?.permissionRead.join(\", \");\n const editRoleString = globalStore.settings.disdiSettings?.permissionEdit.join(\", \");\n\n //TODO magic string? better idea?\n permissionService.updateDynamicPolicy(\"Disdi.Read\", readRoleString as string);\n permissionService.updateDynamicPolicy(\"Disdi.LocationPropertyEdit\", editRoleString as string);\n}\n\nonMounted(async ()=> {\n const samlMadeToken = localStorage.getItem(\"XSamlToken\") as string; // null check?\n\n globalStore.setToken(samlMadeToken);\n\n localStorage.removeItem(\"XSamlToken\");\n\n\n //@ts-expect-error\n const userInfo = await userService.getUserById(jwt_decode(samlMadeToken).sub ?? jwt_decode(samlMadeToken).id);\n\n if (userInfo === null) {\n console.error(\"couldn't get user -> api resopnded with error\");\n return;\n }\n\n globalStore.setUser(userInfo);\n\n await setUserSettings(userInfo.id);\n await setHubNotifs();\n\n // set new fully set policy array on permission store to make sure it survives page reloads\n const permissionStore = usePermissionStore();\n permissionStore.anabPolicies = anabPolicies;\n\n await addDynamicRoles();\n\n //@ts-expect-error\n await router.push(globalStore.userPreferences.general.userStartPage);\n\n notify({\n title: \"Erfolg\",\n text: $t('login.notifySuccessfulLogin'),\n duration: 5000,\n type: \"success\"\n });\n\n})\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createVNode(LoadingSpinner)\n ])\n ]))\n}\n}\n\n})","import script from \"./SamlCallback.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SamlCallback.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { useGlobalStore } from \"@/stores/GlobalStore\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport { ErrorLocationType } from \"@/utilities/enums/Enums\";\nimport { GeneralResponse } from \"@/models/api/Responses\";\nimport router from \"@/router\";\nimport {MiscService} from \"@/utilities/services/entities/MiscService\";\n\n\n/*\n check if user needs to reauthenticate and reroute path to login-page\n*/\nexport default async function reactToRouting ({next}:any){\n const globalStore = useGlobalStore();\n\n const token = globalStore.token;\n const user = globalStore.user;\n\n const resp = new GeneralResponse();\n if(token === null || token === undefined || token.match(/^\\w*$/) !== null) {\n await router.replace(\"/login\");\n\n resp.statusCode = 401;\n\n ErrorHandler.handleError(resp, ErrorLocationType.login);\n }\n else if(user === null || user === undefined) {\n await router.replace(\"/login\");\n\n resp.statusCode = 401;\n\n ErrorHandler.handleError(resp, ErrorLocationType.login);\n }\n\n // make small API call to check refresh expiration\n await (new MiscService()).getHubNotifications()\n\n return next();\n}\n","import router from \"@/router\";\n\n/*\n check if user needs to reauthenticate and reroute path to login-page\n*/\nexport default async function redirectToLogin ({next}:any){\n await router.replace(\"/login\")\n return next();\n}","import PolicyHelper from \"@/utilities/helpers/PolicyHelper\";\nimport {PermissionService} from \"@/utilities/services/PermissionService\";\nimport router from \"@/router\";\n/*\n check if user needs to reauthenticate and reroute path to login-page\n*/\nexport default function checkPermissionForRoute ({next, to}:any){\n const permissionService = new PermissionService();\n\n const policy = PolicyHelper.getPolicyFromRoute(to.path);\n if (!permissionService.userHasPermission(policy)){\n router.push(\"/error\");\n }\n\n return next();\n}\n","import { useGlobalStore } from \"@/stores/GlobalStore\";\n\nexport default function closeModals ({next}:any){\n const globalStore = useGlobalStore();\n\n globalStore.modal.contentObject = {};\n globalStore.modal.show = false;\n\n return next();\n}","import { useGlobalStore } from \"@/stores/GlobalStore\";\nimport { ErrorLocationType } from \"@/utilities/enums/Enums\";\n\nexport default function hideError ({next}:any){\n const globalStore = useGlobalStore();\n\n if (globalStore.error.location !== ErrorLocationType.none) globalStore.error.location = ErrorLocationType.none;\n\n return next();\n}","import {useGlobalStore} from \"@/stores/GlobalStore\";\n\nexport default function resetFooterCounter ({next}:any){\n const globalStore = useGlobalStore();\n\n globalStore.currentItems = 0;\n globalStore.allItems = 0;\n\n return next();\n}","import {useGlobalStore} from \"@/stores/GlobalStore\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\n\nexport default function changeTitle ({next}:any){\n const globalStore = useGlobalStore();\n const defaultSystemCompanyName = globalStore.settings.systemCompanySettings?.companyName;\n\n if (!NullOrUndefinedHelper(defaultSystemCompanyName)){\n document.title = `1ANAB Web | ${defaultSystemCompanyName}`;\n }\n\n return next();\n}","import {TableType} from \"@/utilities/enums/Enums\";\nimport router from \"@/router\";\n\n/*\n checks for valid params of the route when opening shadowpage, since the disdi view needs to know what data to get (disdi for loaction or disdi for registration)\n only 3 'navigationParents are allowed':\n 1) from LocationManagment (location)\n 2) from LocationReports (registerLocation)\n 3) from RegistrationReports (register)\n */\nexport default function checkValidParams ({next, to}:any) {\n const navigationParentsType = TableType[to.params.type as keyof typeof TableType];\n const isValidNavigationParent = [TableType.location, TableType.registerLocation, TableType.register]\n .includes(navigationParentsType);\n\n if (!isValidNavigationParent)\n router.push(\"/404\");\n\n return next();\n}","import { createRouter, createWebHistory } from 'vue-router'\nimport LocationReports from \"@/views/LocationReports.vue\";\nimport LocationManagement from \"@/views/Location.vue\";\nimport RegistrationReports from \"@/views/RegistrationReports.vue\";\nimport SafetyInstructions from \"@/views/SafetyInstructions.vue\";\nimport Users from \"@/views/Users.vue\";\nimport Group2 from \"@/views/Group2.vue\";\nimport ControlCenters from \"@/views/ControlCenters.vue\";\nimport Login from \"@/views/Login.vue\";\nimport Settings from \"@/views/Settings.vue\";\nimport Group1 from \"@/views/Group1.vue\";\nimport Account from \"@/views/Account.vue\";\nimport Notifications from \"@/views/Notifications.vue\";\nimport PageNotFound from \"@/views/PageNotFound.vue\";\nimport Error from \"@/views/Error.vue\";\nimport Logout from \"@/views/Logout.vue\";\nimport Privacy from \"@/views/Privacy.vue\";\nimport Activities from \"@/views/Activities.vue\";\nimport Changelog from \"@/views/Changelog.vue\";\nimport CategoryManagement from \"@/views/Category.vue\";\nimport Disdi from \"@/views/Disdi.vue\";\nimport DisdiMaintenance from \"@/views/DisdiMaintenance/DisdiMaintenance.vue\";\nimport OtpLogin from \"@/views/DisdiMaintenance/DisdiLogin.vue\";\nimport DisdiExit from \"@/views/DisdiMaintenance/DisdiExit.vue\";\nimport Provider from \"@/views/Provider.vue\";\nimport ProviderDetails from \"@/views/ProviderDetails.vue\";\nimport OAuthDisdiCallback from \"@/views/oAuth/OAuthDisdiCallback.vue\";\nimport OAuthDisdiSilentCallback from \"@/views/oAuth/OAuthDisdiSilentCallback.vue\";\nimport OAuthSsoCallback from \"@/views/oAuth/OAuthSsoCallback.vue\";\nimport OAuthSsoSilentCallback from \"@/views/oAuth/OAuthSsoSilentCallback.vue\";\nimport SamlCallback from \"@/views/oAuth/SamlCallback.vue\";\nimport checkToken from \"@/router/middleware/checkToken\";\nimport redirectToLogin from \"@/router/middleware/redirectToLogin\";\nimport checkPermissionForRoute from \"@/router/middleware/checkPermission\";\nimport closeModals from \"@/router/middleware/closeModals\";\nimport hideError from \"@/router/middleware/hideError\";\nimport resetFooterCounter from \"@/router/middleware/resetFooterCounter\";\nimport changeTitle from \"@/router/middleware/changeTitle\";\nimport checkValidParams from \"@/router/middleware/checkValidParams\";\n\nconst oAuthRoutes = [\n {\n path: \"/disdi/oAuthCallback\",\n name: 'DisdioAuthCallback',\n component: OAuthDisdiCallback,\n },\n {\n path: \"/disdi/oAuthCallback/silent\",\n name: 'DisdioAuthSilentCallback',\n component: OAuthDisdiSilentCallback,\n },\n {\n path: \"/sso/oAuthCallback\",\n name: 'SsoOAuthCallback',\n component: OAuthSsoCallback,\n },\n {\n path: \"/sso/oAuthCallback/silent\",\n name: 'SsoOAuthSilentCallback',\n component: OAuthSsoSilentCallback,\n },\n {\n path: \"/saml/tokenCallback\",\n name: 'SamlCallback',\n component: SamlCallback,\n },\n]\n\nconst routes = [\n {\n path: '/',\n name: 'Home',\n component: PageNotFound, // THIS IS ONLY A PLACEHOLDER\n meta: {\n middleware: [redirectToLogin],\n }\n },\n ...oAuthRoutes,\n {\n path: '/login',\n name: 'Login',\n component: Login,\n meta: {\n middleware: [hideError, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/disdi/login/:id([0-9a-f]{8}[-]?[0-9a-f]{4}[-]?[0-9a-f]{4}[-]?[0-9a-f]{4}[-]?[0-9a-f]{12})',\n name: 'DisdiOtpLogin',\n component: OtpLogin,\n meta: {\n middleware: [hideError, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/disdi/maintain',\n name: 'DisdiMaintenance',\n component: DisdiMaintenance,\n meta: {\n middleware: [hideError, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/disdi/exit',\n name: 'DisdiExit',\n component: DisdiExit,\n meta: {\n middleware: [hideError, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/disdi/:type/:id',\n name: 'DisdiView',\n components: {\n default: Disdi,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkValidParams, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/locationRegistration',\n name: 'LocationRegistration',\n components: {\n default: LocationReports,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/locationManagement',\n name: 'LocationManagement',\n components: {\n default: LocationManagement,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/registrationReports',\n name: 'RegistrationReports',\n components: {\n default: RegistrationReports,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/safetyInstructions',\n name: 'SafetyInstructions',\n components: {\n default: SafetyInstructions,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/activity',\n name: 'Activities',\n components: {\n default: Activities,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/category',\n name: 'CategoryManagement',\n components: {\n default: CategoryManagement,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/providermanagement/:id([0-9a-f]{8}[-]?[0-9a-f]{4}[-]?[0-9a-f]{4}[-]?[0-9a-f]{4}[-]?[0-9a-f]{12})',\n name: 'ProviderManagementDetails',\n components: {\n default: ProviderDetails,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/providermanagement',\n name: 'ProviderManagement',\n components: {\n default: Provider,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/group2',\n name: 'Group2',\n components: {\n default: Group2,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/users',\n name: 'User',\n components: {\n default: Users,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/controlCenter',\n name: 'ControlCenter',\n components: {\n default: ControlCenters,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/settings',\n name: 'Settings',\n components: {\n default: Settings,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/group1',\n name: 'Group1',\n components: {\n default: Group1,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [checkPermissionForRoute, hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/account',\n name: 'Account',\n components: {\n default: Account,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/changelog',\n name: 'Changelog',\n components: {\n default: Changelog,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/notifications',\n name: 'Notifications',\n components: {\n default: Notifications,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [hideError, checkToken, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: '/error',\n name: 'Error',\n components: {\n default: Error,\n LeftSidebar: () => import('@/components/Sidebar.vue'),\n },\n meta: {\n middleware: [hideError, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: \"/logout\",\n name: 'Logout',\n component: Logout,\n meta: {\n middleware: [hideError, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: \"/privacy\",\n name: 'Privacy',\n component: Privacy,\n meta: {\n middleware: [hideError, closeModals, resetFooterCounter, changeTitle],\n }\n },\n {\n path: \"/:pathMatch(.*)*\",\n name: \"404\",\n component: PageNotFound,\n meta: {\n middleware: [hideError, closeModals, resetFooterCounter, changeTitle],\n }\n },\n]\n\nconst router = createRouter({\n history: createWebHistory(),\n routes: routes,\n})\n\n\n/*--- MIDDLEWARE IMPLEMENTATION ---*/\n\n\nfunction middlewarePipeline (context:any, middleware:any, index:any) {\n const nextMiddleware = middleware[index]\n\n if(!nextMiddleware){\n return context.next\n }\n\n return () => {\n const nextPipeline = middlewarePipeline(\n context, middleware, index + 1\n )\n\n nextMiddleware({ ...context, next: nextPipeline })\n\n }\n}\n\nrouter.beforeEach((to, from, next) => {\n /* Navigate to next if middleware is not applied */\n if (!to.meta.middleware) {\n return next()\n }\n\n const middleware:any = to.meta.middleware;\n const context = {\n to,\n from,\n next,\n // store | You can also pass store as an argument\n }\n\n return middleware[0]({\n ...context,\n next:middlewarePipeline(context, middleware,1)\n })\n})\n\nexport default router;\n","// replace dangerous starting characters and remove seperators from the cell-value\n// see: https://owasp.org/www-community/attacks/CSV_Injection\nimport isNullOrUndefined from \"@/utilities/helpers/NullOrUndefinedHelper\";\n\nexport default (stringToSanitize:string, isPhonenumber:boolean = false):string => {\n // also recheck type since runtime JS is typedynmaic... :(\n if(isNullOrUndefined(stringToSanitize) || typeof(stringToSanitize) !== \"string\") return stringToSanitize;\n\n let result = \"\";\n result = stringToSanitize.replace(/^[=+\\-@\\n\\r\\t]+/g, \"\").replace(/[;,]/gm, \"\").replace(/['\"]/gm, \"\");\n return `${isPhonenumber ? \"+\" : \"\"}${result}`;\n}","import isNullOrUndefined from \"@/utilities/helpers/NullOrUndefinedHelper\";\nimport {DisdiInfo} from \"@/models/disdi/DisdiInfo\";\nimport sanatizeCsv from \"@/utilities/helpers/CsvSanitizer\";\n\nexport class LocationCsvExport {\n SecondaryId: string;\n SyncId: string;\n Name: string;\n NamePronunciation: string;\n PhoneNumber: string;\n PhoneNumberAlt1?: string;\n PhoneNumberAlt2?: string;\n PhoneNumberAltIsFallback: boolean;\n PostalCode: string;\n City: string;\n Street: string;\n StreetNumber: string;\n Longitude?: number;\n Latitude?: number;\n RegistrationRadius?: number;\n Email: string;\n Group1Id?: number;\n Group1SyncId: string;\n Group2Id?: number;\n ControlCenterId?: number;\n ControlCenterSyncId: string;\n CustomAdditionalInformation?: string; //technischer platz\n\n\n // replaces undefined or null with empty string for string-required properties, since the Import can't do that easily\n constructor (fullObj:any){\n this.SecondaryId = isNullOrUndefined(fullObj.secondaryId) ? \"\" : sanatizeCsv(fullObj.secondaryId);\n this.SyncId = isNullOrUndefined(fullObj.syncId) ? \"\" : sanatizeCsv(fullObj.syncId);\n this.Name = isNullOrUndefined(fullObj.name) ? \"\" : sanatizeCsv(fullObj.name);\n this.NamePronunciation = isNullOrUndefined(fullObj.namePronunciation) ? \"\" : sanatizeCsv(fullObj.namePronunciation);\n this.PhoneNumber = isNullOrUndefined(fullObj.phoneNumber) ? \"\" : sanatizeCsv(fullObj.phoneNumber, true);\n this.PhoneNumberAlt1 = isNullOrUndefined(fullObj.phoneNumberAlt1) ? \"\" : sanatizeCsv(fullObj.phoneNumberAlt1, true);\n this.PhoneNumberAlt2 = isNullOrUndefined(fullObj.phoneNumberAlt2) ? \"\" : sanatizeCsv(fullObj.phoneNumberAlt2, true);\n this.PhoneNumberAltIsFallback = fullObj.phoneNumberAltIsFallback;\n this.PostalCode = isNullOrUndefined(fullObj.postalCode) ? \"\" : sanatizeCsv(fullObj.postalCode);\n this.City = isNullOrUndefined(fullObj.city) ? \"\" : sanatizeCsv(fullObj.city);\n this.Street = isNullOrUndefined(fullObj.street) ? \"\" : sanatizeCsv(fullObj.street);\n this.StreetNumber = isNullOrUndefined(fullObj.streetNumber) ? \"\" : sanatizeCsv(fullObj.streetNumber);\n this.Longitude = isNullOrUndefined(fullObj.longitude) ? undefined : fullObj.longitude;\n this.Latitude = isNullOrUndefined(fullObj.latitude) ? undefined : fullObj.latitude;\n this.RegistrationRadius = isNullOrUndefined(fullObj.registrationRadius) ? undefined : fullObj.registrationRadius;\n this.Email = isNullOrUndefined(fullObj.email) ? \"\" : sanatizeCsv(fullObj.email);\n this.Group1Id = isNullOrUndefined(fullObj.group1Id) ? undefined : fullObj.group1Id;\n this.Group1SyncId = isNullOrUndefined(fullObj.group1SyncId) ? \"\" : sanatizeCsv(fullObj.group1SyncId);\n this.Group2Id = isNullOrUndefined(fullObj.group2Id) ? undefined : fullObj.group2Id;\n this.ControlCenterId = isNullOrUndefined(fullObj.controlCenterId) ? undefined : fullObj.controlCenterId;\n this.ControlCenterSyncId = isNullOrUndefined(fullObj.controlCenterSyncId) ? \"\" : sanatizeCsv(fullObj.controlCenterSyncId);\n this.CustomAdditionalInformation = isNullOrUndefined(fullObj.customAdditionalInformation) ? \"\" : sanatizeCsv(fullObj.customAdditionalInformation);\n }\n}\n\nexport class UserCsvExport {\n FirstName: string;\n LastName: string;\n NamePronunciation: string;\n IdentificationNumber: string;\n Kid: string;\n Email: string;\n PhoneNumber: string;\n CompanyId?:string;\n Roles: Array;\n IsActive: boolean;\n HasProtection: boolean;\n\n\n constructor (fullObj:any){\n this.FirstName = sanatizeCsv(fullObj.firstName);\n this.LastName = sanatizeCsv(fullObj.lastName);\n this.NamePronunciation = sanatizeCsv(fullObj.namePronunciation);\n this.IdentificationNumber = sanatizeCsv(fullObj.identificationNumber);\n this.Kid = sanatizeCsv(fullObj.kid);\n this.Email = sanatizeCsv(fullObj.email);\n this.PhoneNumber = sanatizeCsv(fullObj.phoneNumber, true);\n this.CompanyId = sanatizeCsv(fullObj.companyId);\n this.Roles = fullObj.roles.map((r:string) => sanatizeCsv(r));\n this.IsActive = fullObj.isActive;\n this.HasProtection = fullObj.hasProtection;\n }\n}\n\nexport class SafetyinstructionCsvExport {\n Name: string;\n Text: string;\n Locations: string;\n\n constructor (fullObj:any){\n this.Name = sanatizeCsv(fullObj.name);\n this.Text = sanatizeCsv(fullObj.text);\n this.Locations = fullObj.safetyInstructionLocations.map((l:any) => l.secondaryId).join(\" | \");\n }\n}\n\nexport class DisdiCsvExport{\n locationSecondaryId:number = -1;\n registrationId:number = -1;\n userFullname:string = \"\";\n userPhoneNumber:string = \"\";\n userEmail:string = \"\";\n identificationNumber:string = \"\";\n kid:string = \"\";\n categoryId:string = \"\";\n diaryDescription:string = \"\";\n hasAttachment:string = \"\";\n comment:string = \"\";\n\n constructor (fullObj:DisdiInfo){\n this.locationSecondaryId = fullObj.locationSecondaryId;\n this.registrationId = fullObj.registrationId;\n this.categoryId = sanatizeCsv(fullObj.categoryId);\n this.diaryDescription = sanatizeCsv(fullObj.diaryDescription);\n this.hasAttachment = fullObj.hasAttachment.toString();\n this.comment = sanatizeCsv(fullObj.comment);\n this.userFullname = sanatizeCsv(fullObj.userFullname);\n this.userPhoneNumber = sanatizeCsv(fullObj.userPhoneNumber, true);\n this.userEmail = sanatizeCsv(fullObj.userEmail);\n this.identificationNumber = sanatizeCsv(fullObj.identificationNumber);\n this.kid = sanatizeCsv(fullObj.kid);\n }\n}\n","import {WebCallService} from \"@/utilities/services/WebCallService\";\nimport {PathHelper} from \"@/utilities/helpers/PathHelper\";\nimport {CoupledSystemsResponse, GeneralResponse, SettingsResponse} from \"@/models/api/Responses\";\nimport {HttpType} from \"@/utilities/enums/Enums\";\nimport {CoupledSystemSetting} from \"@/models/system/CoupledSystemSetting\";\nimport {CoupledSystemRequest} from \"@/models/api/Requests\";\n\nexport class CoupledSystemService {\n private webCaller: WebCallService;\n private uriHelper: PathHelper;\n\n constructor(){\n this.webCaller = new WebCallService();\n this.uriHelper = new PathHelper();\n }\n\n public async getCoupledSystems(viewtype: string = \"selectable\"): Promise {\n const uri = this.uriHelper.coupledSystems.getCoupledSystemsPath() + `/viewType/${viewtype}`;\n\n return await this.webCaller.HttpSend(HttpType.get, uri);\n }\n\n public async getLocationsForForeignSystem(id: number): Promise {\n const uri = this.uriHelper.coupledSystems.getAvailableLocationsForForeignSystemPath(id);\n\n return await this.webCaller.HttpSend(HttpType.get, uri);\n }\n\n public async getCoupledSystemSettings(): Promise {\n const uri = this.uriHelper.coupledSystems.getCoupledSystemsPath();\n\n return await this.webCaller.HttpSend(HttpType.get, uri);\n }\n\n public async addOrUpdateCoupledSystemSetting(cs: CoupledSystemSetting): Promise { // any type not good senior heff\n const uri = cs.id < 0\n ? this.uriHelper.coupledSystems.getCoupledSystemsPath()\n : this.uriHelper.coupledSystems.getCoupledSystemByIdPath(cs.id);\n const requestBody = new CoupledSystemRequest(cs);\n const reqType = cs.id < 0\n ? HttpType.post\n : HttpType.put;\n\n return await this.webCaller.HttpSend(reqType, uri, requestBody);\n }\n\n public async deleteCoupledSystemSetting(id: number): Promise {\n const uri = this.uriHelper.coupledSystems.getCoupledSystemByIdPath(id);\n\n return await this.webCaller.HttpSend(HttpType.delete, uri);\n }\n}","import {defineStore} from \"pinia\";\nimport {$t} from \"@/utilities/i18n/config\";\nimport {ErrorLocationType, PopupType} from \"@/utilities/enums/Enums\";\nimport {useGlobalStore} from \"@/stores/GlobalStore\";\nimport {CompanyInfo} from \"@/models/company/CompanyInfo\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\nimport ErrorHandler from \"@/utilities/helpers/ErrorHandler\";\nimport {GeneralResponse} from \"@/models/api/Responses\";\nimport {CompanyService} from \"@/utilities/services/entities/CompanyService\";\n\n// this store exists because we have a backToEdit button in 'SimilarCompanies'-Popup and add or update action is not shared...\nexport const useProviderStore = defineStore('ProviderStore', {\n state:()=>{\n return {\n companyService: new CompanyService()\n }\n },\n actions: {\n async addOrUpdateProvider() {\n const globalStore = useGlobalStore();\n\n // @ts-expect-error\n const company = globalStore.modal.contentObject.selectedProviderCompany === undefined\n ? globalStore.modal.contentObject\n // @ts-expect-error\n : globalStore.modal.contentObject.selectedProviderCompany ;\n\n // check if there are similar companies and offer them for selection\n if(company.id === \"\"){\n const similarCompaniesResp = await this.companyService.postGetAllSimilarCompany(company);\n // if call fails silently fail... sad but true (\\m/,) for the moment\n if(similarCompaniesResp === null || similarCompaniesResp === undefined || similarCompaniesResp.statusCode !== 0) return;\n\n if(similarCompaniesResp.companiesInfo.some(()=>true)){\n // @ts-expect-error\n similarCompaniesResp.companiesInfo = similarCompaniesResp.companiesInfo.map(sc => { sc[\"id\"] = sc.companyId; return sc; });\n\n company.id = \"null\";\n globalStore.openPopup({\n data: {\"suggestedProviderCompany\":company, \"similarCompanies\":similarCompaniesResp.companiesInfo, \"selectedProviderCompany\":company},\n action: this.letEnterCompanyIdCodeIfNeeded,\n resetButton: false,\n title:$t(\"popups.providerManagement.similarCompanies\"),\n type:PopupType.selectSimilarCompany\n });\n return;\n }\n }\n\n await this.tryCreateAndConnectCompany(company);\n },\n\n async letEnterCompanyIdCodeIfNeeded(){\n const globalStore = useGlobalStore();\n\n // @ts-expect-error\n const company = globalStore.modal.contentObject.selectedProviderCompany as CompanyInfo;\n\n // let enter CompanyIdCode if needed\n if(!NullOrUndefinedHelper(company.id) && (company.companyIdCode === undefined || company.companyIdCode === \"\")){\n globalStore.openPopup({\n data: company,\n action: this.addOrUpdateProvider,\n resetButton: false,\n title:$t(\"popups.providerManagement.new\"),\n type:PopupType.providerManagementEditPopup\n });\n\n return;\n }\n\n await this.addOrUpdateProvider();\n },\n\n async tryCreateAndConnectCompany(company:CompanyInfo) {\n const globalStore = useGlobalStore();\n\n const companyCreateResp = await this.companyService.addOrUpdateCompany(company);\n if (companyCreateResp === null || companyCreateResp === undefined || companyCreateResp.statusCode !== 0){\n ErrorHandler.handleError(companyCreateResp as GeneralResponse, ErrorLocationType.popup);\n return;\n }\n\n // when company is new create companyEnity first\n // CAUTION: sadly there are 2 cases here: 1) similar companies found && still create -> id === \"null\" 2) no similar companyies found -> id === \"\"\n if(NullOrUndefinedHelper(company.id)){\n // @ts-expect-error\n company.id = companyCreateResp.companyId;\n // @ts-expect-error\n company.companyId = company.id;\n }\n\n\n // connect companyEntity with current system (cross table entry AnAbSystemCompany)\n const connectResp = await this.companyService.postConnectSystemToCompany(undefined, company.id, company.companyIdCode, company.info);\n if (connectResp === null || connectResp === undefined || connectResp.statusCode !== 0){\n ErrorHandler.handleError(connectResp as GeneralResponse, ErrorLocationType.popup);\n\n await this.companyService.deleteCompany(company.id); // fire and forget call\n\n company.id = \"null\";\n // @ts-expect-error\n delete company.companyId;\n\n return;\n }\n\n // @ts-expect-error\n company.address = `${company.street} ${company.streetnumber}, ${company.zip} ${company.city}`;\n\n globalStore.gridStore?.add(company);\n globalStore.gridStore?.sort(globalStore.gridStore.sorters);\n\n globalStore.closeModal();\n globalStore.showSuccess($t('global.saved'));\n }\n }\n\n})","import { ErrorType, ErrorLocationType } from \"@/utilities/enums/Enums\";\nimport router from \"@/router\";\nimport { GeneralResponse } from \"@/models/api/Responses\";\nimport { useGlobalStore } from \"@/stores/GlobalStore\";\nimport { $t } from \"@/utilities/i18n/config\";\n\nclass ErrorHandler {\n\n public handleError(error:any, errorLocation:ErrorLocationType){\n\n const statusCode = error.statusCode ?? error.StatusCode;\n const isResponseError = statusCode > 999;\n const errorType = isResponseError ? ErrorType.warning : ErrorType.error;\n\n let notify = true;\n if(isResponseError){\n notify = this.reactoToStatusCode(statusCode, error.companyName ?? \"\");\n\n if(notify){\n this.notifyFailedCommunication(errorType, $t(`error.status.${statusCode}`), errorLocation);\n }\n }\n else{\n notify = this.reactoToStatusCode(statusCode);\n\n if(notify){\n\n if(statusCode === 403) {\n this.notifyFailedCommunication(errorType, $t(\"error.status.accessDenied\"), errorLocation);\n } else {\n this.notifyFailedCommunication(errorType, $t(\"error.status.general\", {message:error.statusDescription ?? error.StatusDescription}), errorLocation);\n }\n\n }\n }\n }\n\n\n /* PRIVATE */\n\n\n private notifyFailedCommunication(type:ErrorType, text:string, errorLocation:ErrorLocationType) {\n const globalStore = useGlobalStore();\n\n globalStore.gridDataIsLoading = false;\n\n globalStore.error = {\n location: errorLocation,\n text: text,\n type: type,\n };\n }\n\n\n /*\n handles special status codes and what to do when encountering them\n returns if the calling method needs to notify the user\n */\n private reactoToStatusCode(status:number, additionalInfo:string = \"\"):boolean {\n switch (status) {\n\n case 9085: // API error code for cookie/refreshtoken expired OR empty\n case 401:{\n this.notifyFailedCommunication(ErrorType.error, $t('global.noValidToken'), ErrorLocationType.login);\n router.push(\"/login\");\n\n return false;\n }\n case 4028:{\n this.notifyFailedCommunication(ErrorType.error, $t(`error.status.${status}`, {companyName: additionalInfo}), ErrorLocationType.popup);\n return false;\n }\n\n default:{\n return true;\n }\n }\n }\n}\n\nexport default new ErrorHandler();\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./Error.vue?vue&type=style&index=0&id=0cbbdaac&lang=scss\"","// checks for the following: null, undefined, \"null\" and string.empty ('')\nexport default (toCheck:any) => toCheck === null || toCheck === undefined || toCheck === \"null\" || toCheck === \"\";","export class NameValueObject{\n name:string = \"\";\n value:string = \"\";\n\n constructor(name:string, value:string) {\n this.name = name;\n this.value = value;\n }\n}","import { Guid } from \"guid-typescript\";\nimport { LocationInfo } from \"@/models/location/LocationInfo\";\nimport { ControlCenterInfo } from \"@/models/controlCenter/ControlCenterInfo\";\nimport { LevelInfo } from \"@/models/group2/LevelInfo\";\nimport { ContactInfo } from \"@/models/ContactInfo\";\nimport { RegionInfo } from \"@/models/group1/RegionInfo\";\nimport { SafetyInstructionInfo } from \"@/models/safetyInstruction/SafetyInstructionInfo\";\nimport { UserPreference } from \"@/models/user/UserPreference\";\nimport { UserInfo } from \"@/models/user/UserInfo\";\nimport isNullOrUndefined from \"@/utilities/helpers/NullOrUndefinedHelper\";\nimport {CompanyInfo} from \"@/models/company/CompanyInfo\";\nimport {CompanyWorkerInfo} from \"@/models/company/CompanyWorkerInfo\";\nimport {ActivitySetInfo} from \"@/models/activity/ActivitySetInfo\";\nimport {CoupledSystemSetting} from \"@/models/system/CoupledSystemSetting\";\nimport {PronunciationSetting} from \"@/models/setting/PronunciationSetting\";\nimport {CategoryInfo} from \"@/models/category/CategoryInfo\";\nimport {DisdiSetting} from \"@/models/setting/disdi/DisdiSetting\";\nimport {NameValueObject} from \"@/models/NameValueObject\";\nimport {DisdiMetadataType, DisdiStateType} from \"@/utilities/enums/Enums\";\nimport {ActivityInfo} from \"@/models/activity/ActivityInfo\";\nimport {LocationDisdiInfo} from \"@/models/location/LocationDisdiInfo\";\nimport {DisdiInfo} from \"@/models/disdi/DisdiInfo\";\nimport NullOrUndefinedHelper from \"@/utilities/helpers/NullOrUndefinedHelper\";\n\n\nexport class GeneralRequest {\n requestId: Guid = Guid.create();\n}\n\nexport class LocationRequest extends GeneralRequest {\n id: number = 0;\n secondaryId: string = \"\";\n syncId?: string = undefined;\n longitude?: number = undefined;\n latitude?: number = undefined;\n registrationRadius?: number = undefined;\n name: string = \"\";\n namePronunciation: string = \"\";\n email: string = \"\";\n contactInfo: ContactInfo = new ContactInfo();\n phoneNumberAlt1?: string = undefined;\n phoneNumberAlt2?: string = undefined;\n phoneNumberAltIsFallback: boolean = false;\n controlCenterId?: number = undefined;\n couplingEnabled: boolean = false;\n customAdditionalInformation?: string = undefined;\n group1Id?: number = undefined;\n group2Id?: number = undefined;\n safetyInstructions: Array<{ id:number, displayOrder:number }> = [];\n pdfTemplate?: number = undefined;\n activitySetId: number|null = null;\n hasDisdi: boolean;\n\n constructor(location:LocationInfo) {\n super();\n this.id = location.id;\n this.secondaryId = location.secondaryId;\n this.syncId = location.syncId === \"\" ? undefined: location.syncId;\n this.longitude = NullOrUndefinedHelper(location.longitude) ? undefined : location.longitude;\n this.latitude = NullOrUndefinedHelper(location.latitude) ? undefined : location.latitude;\n this.registrationRadius = location.registrationRadius;\n this.name = location.name;\n this.namePronunciation = location.namePronunciation;\n this.email = location.email;\n this.contactInfo = location.contactInfo;\n this.phoneNumberAlt1 = location.phoneNumberAlt1;\n this.phoneNumberAlt2 = location.phoneNumberAlt2;\n this.phoneNumberAltIsFallback = location.phoneNumberAltIsFallback;\n this.controlCenterId = location.controlCenterId;\n this.couplingEnabled = location.couplingEnabled;\n this.customAdditionalInformation = location.customAdditionalInformation;\n this.group1Id = location.group1Id;\n this.group2Id = location.group2Id;\n this.safetyInstructions = location.safetyInstructions;\n this.pdfTemplate = location.pdfTemplate;\n this.activitySetId = location.activitySetId;\n this.hasDisdi = location.hasDisdi;\n }\n}\n\nexport class ControlCenterRequest extends GeneralRequest {\n id:number = -1;\n name:string = \"\";\n phoneNumber:string = \"\";\n syncId?:string = undefined;\n\n constructor(center:ControlCenterInfo) {\n super();\n this.id = center.id;\n this.name = center.name;\n this.phoneNumber = center.phoneNumber;\n this.syncId = center.syncId;\n }\n}\n\nexport class LevelRequest extends GeneralRequest {\n id:number = -1;\n name:string = \"\";\n\n constructor(level:LevelInfo) {\n super();\n this.id = level.id;\n this.name = level.name;\n }\n}\n\nexport class RegionRequest extends GeneralRequest {\n id:number = -1;\n name:string = \"\";\n syncId:string = \"\";\n\n constructor(region:RegionInfo) {\n super();\n this.id = region.id;\n this.name = region.name;\n this.syncId = region.syncId;\n }\n}\n\nexport class UserPreferenceRequest extends GeneralRequest {\n userId:string = \"\";\n preferenceTypeId:number = -1;\n tableName:string = \"\";\n clearAll:boolean = false;\n preferenceInfos:Array = [];\n\n constructor(id:string, typeId:number, tableName:string, clearAll:boolean, prefList:Array) {\n super();\n this.userId = id;\n this.preferenceTypeId = typeId;\n this.tableName = tableName;\n this.clearAll = clearAll;\n this.preferenceInfos = prefList;\n }\n}\n\nexport class LoginRequest extends GeneralRequest {\n email:string = \"\";\n password:string = \"\";\n rememberMe: boolean = false;\n\n constructor(email: string, password: string, rememberMe: boolean)\n {\n super();\n this.email = email;\n this.password = password;\n this.rememberMe = rememberMe;\n }\n}\n\nexport class ResetPasswordEmailRequest extends GeneralRequest {\n email:string = \"\";\n url:string = \"\";\n\n constructor(email:string, url:string){\n super();\n this.email = email;\n this.url = url;\n }\n}\n\nexport class ResetPasswordRequest extends GeneralRequest {\n token:string;\n email:string;\n password:string;\n passwordRepetition:string;\n\n constructor(token:string, email:string, password:string, passwordRepetition:string){\n super();\n this.token = token;\n this.email = email;\n this.password = password;\n this.passwordRepetition = passwordRepetition;\n }\n}\n\nexport class ChangePasswordRequest extends GeneralRequest {\n userId:string;\n oldPassword:string;\n newPassword:string;\n newPasswordRepetition:string;\n\n constructor(userId:string, oldPassword:string, newPassword:string, newPasswordRepetition:string){\n super();\n this.userId = userId;\n this.oldPassword = oldPassword;\n this.newPassword = newPassword;\n this.newPasswordRepetition = newPasswordRepetition;\n }\n}\n\nexport class RefreshTokenRequest extends GeneralRequest {\n accessToken:string;\n\n constructor(accessToken:string){\n super();\n this.accessToken = accessToken;\n }\n}\n\nexport class UserRequest extends GeneralRequest {\n id:string;\n firstName:string;\n lastName:string;\n identificationNumber:string;\n kid:string|null|undefined;\n email?:string;\n phoneNumber?:string;\n namePronunciation:string;\n roles:Array;\n info:string;\n hasProtection:boolean;\n hasMultiAnAb:boolean;\n companyId?:string;\n\n constructor(user:UserInfo){\n super();\n this.id = user.id;\n this.firstName = user.firstName;\n this.lastName = user.lastName;\n this.identificationNumber = user.identificationNumber;\n this.kid = isNullOrUndefined(user.kid) ? undefined : user.kid;\n this.email = isNullOrUndefined(user.email) ? undefined : user.email;\n this.phoneNumber = isNullOrUndefined(user.phoneNumber) ? undefined : user.phoneNumber;\n this.namePronunciation = user.namePronunciation;\n this.roles = user.roles.map(r => r.name);\n this.info = user.info;\n this.hasProtection = user.hasProtection;\n this.hasMultiAnAb = false;\n this.companyId = user.companyId;\n }\n}\n\nexport class VoiceTestRequest extends GeneralRequest {\n text: string;\n callNumber: string;\n\n constructor(text:string, callNumber:string){\n super();\n this.text = text;\n this.callNumber = callNumber;\n }\n}\n\nexport class ManualRegistrationRequest extends GeneralRequest {\n userId:string = \"\";\n locationId:number = 0;\n activityText?:string = undefined;\n guestCount:number = 0;\n\n constructor(userId:string, locationId:number, activityText:string|undefined, guestCount:number) {\n super();\n this.userId = userId;\n this.locationId = locationId;\n this.activityText = activityText;\n this.guestCount = guestCount;\n }\n}\n\nexport class SafetyInstructionRequest extends GeneralRequest {\n id:number = -1;\n name:string = \"\";\n text:string = \"\";\n locationIds:Array = [];\n\n constructor(si:SafetyInstructionInfo) {\n super();\n this.id = si.id;\n this.name = si.name;\n this.text = si.text;\n this.locationIds = si.safetyInstructionLocations.map((l:LocationInfo) => l.id);\n }\n}\n\nexport class ActivityInfoRequest extends GeneralRequest {\n activityId:number = -1;\n activityText:string = \"\";\n categoryId:string|null = null;\n\n constructor(activity:ActivityInfo) {\n super();\n this.activityId = activity.id ?? activity.activityId;\n this.activityText = activity.name ?? activity.activityText;\n this.categoryId = activity.categoryId;\n }\n}\n\nexport class SendMessageRequest extends GeneralRequest {\n locationIds:Array = [];\n message:string = \"\";\n\n constructor(ids:Array, message:string) {\n super();\n this.locationIds = ids;\n this.message = message;\n }\n}\n\nexport class CompanyRequest extends GeneralRequest {\n name:string = \"\";\n phone:string = \"\";\n phoneNumber:string = \"\";\n zip:string = \"\";\n city:string = \"\";\n street:string = \"\";\n streetnumber:string = \"\";\n dialCode:string = \"\";\n\n constructor(company:CompanyInfo) {\n super();\n this.name = company.name;\n this.phone = company.phoneNumber;\n this.phoneNumber = company.phoneNumber;\n this.zip = company.zip;\n this.city = company.city;\n this.street = company.street;\n this.streetnumber = company.streetnumber;\n this.dialCode = company.dialCode;\n }\n}\n\nexport class ConnectSystemToCompanyRequest extends GeneralRequest {\n anAbSystemId?:string = undefined;\n companyId:string = \"\";\n companyIdCode:string = \"\";\n info:string = \"\";\n\n constructor(systemId:(string | undefined) = undefined, companyId:string, companyIdCode:string, info:string) {\n super();\n this.anAbSystemId = systemId;\n this.companyId = companyId;\n this.companyIdCode = companyIdCode;\n this.info = info;\n }\n}\n\nexport class CompanyWorkerToAdminRequest extends GeneralRequest {\n companyId:string = \"\";\n companyIdCode:string = \"\";\n companyInfo:string = \"\";\n firstName:string = \"\";\n lastName:string = \"\";\n dialCode:string = \"\";\n phoneNumber:string = \"\";\n email:string = \"\";\n\n constructor(company:CompanyInfo, user:CompanyWorkerInfo){\n super();\n this.companyId = company.id;\n this.companyIdCode = company.companyIdCode;\n this.companyInfo = company.info;\n this.firstName = user.firstName;\n this.lastName = user.lastName;\n this.dialCode = user.dialCode;\n this.phoneNumber = user.phoneNumber;\n this.email = user.email;\n }\n}\n\nexport class PhoneNumberRequest extends GeneralRequest {\n dialCode:string = \"\";\n phoneNumber:string = \"\";\n\n constructor(dialCode:string, phoneNumber:string) {\n super();\n this.dialCode = dialCode;\n this.phoneNumber = phoneNumber;\n }\n}\n\nexport class CompanyWorkerRequest extends GeneralRequest {\n firstName:string = \"\";\n lastName:string = \"\";\n email:string = \"\";\n phoneNumber:string = \"\";\n dialCode:string = \"\";\n isEnabled:boolean = false;\n isAnonymous:boolean = false;\n expirationStatus:boolean = false;\n\n constructor(companyWorker:CompanyWorkerInfo) {\n super();\n this.firstName = companyWorker.firstName;\n this.lastName = companyWorker.lastName;\n this.email = companyWorker.email;\n this.phoneNumber = companyWorker.phoneNumber;\n this.dialCode = companyWorker.dialCode;\n this.isEnabled = companyWorker.isEnabled;\n this.isAnonymous = companyWorker.isAnonymous;\n this.expirationStatus = companyWorker.anAbSystem?.userConfirmationExpired ?? false;\n }\n}\n\nexport class ActivitySetInfoRequest extends GeneralRequest {\n name:string = \"\";\n activityIds:Array = [];\n addedLocationIds:Array = [];\n removedLocationIds:Array = [];\n\n constructor(activitySet:ActivitySetInfo, ids:{added:Array, removed:Array}) {\n super();\n this.name = activitySet.name;\n this.activityIds = activitySet.activities.map(a => a.id ?? a.activityId);\n this.addedLocationIds = ids.added;\n this.removedLocationIds = ids.removed;\n }\n}\n\nexport class CoupledSystemRequest extends GeneralRequest {\n id:number = -1;\n name:string = \"\";\n baseUrl:string = \"\";\n loginName:string = \"\";\n password:string = \"\";\n contactName:string = \"\";\n contactEmail:string = \"\";\n contactPhoneNumber:string = \"\";\n\n constructor(cs:CoupledSystemSetting) {\n super();\n this.id = cs.id;\n this.name = cs.name;\n this.baseUrl = cs.baseUrl;\n this.loginName = cs.loginName;\n this.password = cs.password;\n this.contactName = cs.contactName;\n this.contactEmail = cs.contactEmail;\n this.contactPhoneNumber = cs.contactPhoneNumber;\n }\n}\n\nexport class UpdatePronuncicationRequest extends GeneralRequest{\n name:string = \"\";\n value:string = \"\";\n\n constructor(ps:PronunciationSetting) {\n super();\n this.name = ps.name;\n this.value = ps.value;\n }\n}\n\nexport class SystemSettingUpdateRequest extends GeneralRequest{\n value:string = \"\";\n\n constructor(ss:any) {\n super();\n this.value = ss.value;\n }\n}\n\nexport class ChangeActivityRequest extends GeneralRequest{\n activityId :number = 0;\n activityText:string = \"\";\n\n constructor(id:number | undefined, text:string) {\n super();\n this.activityId = id ?? 0;\n this.activityText = text;\n }\n}\n\nexport class CategoryRequest extends GeneralRequest{\n id :string = \"\";\n iconName:string = \"\";\n title:string = \"\";\n description: string = \"\";\n\n constructor(category:CategoryInfo) {\n super();\n this.id = category.id;\n this.iconName = category.iconName;\n this.title = category.title;\n this.description = category.description;\n }\n}\n\nexport class UpdateDisdiSettingRequest extends GeneralRequest{\n disdi:string = \"\";\n permissionRead:Array = [];\n permissionEdit:Array = [];\n pictures:number = -1;\n metaTimestamp:string = \"\";\n metaEditor:boolean = false;\n metaInvisibleTime:number = -1;\n metaInvisible:number = -1;\n metaDeleteAll:number = -1;\n purgeOldDiaryEntriesIntervalDay:number = -1;\n defaultCategory: string = \"\";\n showInAppNr:number = -1;\n showInAppDays:number = -1;\n useGallery:boolean = false;\n\n constructor(disdiSetting:DisdiSetting) {\n super();\n this.disdi = DisdiStateType[disdiSetting.disdi];\n this.permissionRead = disdiSetting.permissionRead;\n this.permissionEdit = disdiSetting.permissionEdit;\n this.pictures = disdiSetting.pictures;\n this.metaTimestamp = DisdiMetadataType[disdiSetting.metaTimestamp];\n this.metaEditor = disdiSetting.metaEditor;\n this.metaInvisibleTime = disdiSetting.metaInvisibleTime;\n this.metaInvisible = disdiSetting.metaInvisible;\n this.metaDeleteAll = disdiSetting.metaDeleteAll;\n this.purgeOldDiaryEntriesIntervalDay = disdiSetting.purgeOldDiaryEntriesIntervalDay;\n this.defaultCategory = disdiSetting.defaultCategory;\n this.showInAppNr = disdiSetting.showInAppNr;\n this.showInAppDays = disdiSetting.showInAppDays;\n this.useGallery = disdiSetting.useGallery;\n }\n\n /*\n returns array with name-value object for backend...\n */\n public convertToRequestBody():Array{\n return Object.entries(this)\n .map((kvA)=> new NameValueObject(kvA[0], `${kvA[1]}`))\n .filter(kvA => kvA.name !== \"requestId\"); // remove requestId from requestBody since it is not part of the settings\n }\n}\n\nexport class DisdiChangeRequest extends GeneralRequest{\n locationDisdiSettings:Array = [];\n\n constructor(changesList:Array) {\n super();\n this.locationDisdiSettings = changesList;\n }\n}\n\nexport class FileNameListRequest extends GeneralRequest{\n fileNames:Array;\n\n constructor(fileNamelist:Array) {\n super();\n this.fileNames = fileNamelist;\n }\n}\n\nexport class UpdateDisdiEntryRequest extends GeneralRequest{\n diaryDescription:string;\n comment:string;\n categoryId:string;\n isCompleted:boolean;\n\n constructor(entry:DisdiInfo) {\n super();\n this.diaryDescription = entry.diaryDescription;\n this.comment = entry.comment;\n this.categoryId = entry.categoryId;\n this.isCompleted = entry.isCompleted;\n }\n}\n\nexport class CreateEmptyDisdiRequest extends GeneralRequest{\n locationSecondaryId:number;\n registrationId:number;\n userId:string;\n\n constructor(locSecId:number, regId:number, userId:string) {\n super();\n this.locationSecondaryId = locSecId;\n this.registrationId = regId;\n this.userId = userId;\n }\n}\n","import {WebCallService} from \"@/utilities/services/WebCallService\";\nimport {PathHelper} from \"@/utilities/helpers/PathHelper\";\nimport {ActivitySetResponse, GeneralResponse} from \"@/models/api/Responses\";\nimport {HttpType} from \"@/utilities/enums/Enums\";\nimport {ActivitySetInfo} from \"@/models/activity/ActivitySetInfo\";\nimport {ActivitySetInfoRequest} from \"@/models/api/Requests\";\n\nexport class ActivitySetService {\n private webCaller: WebCallService;\n private uriHelper: PathHelper;\n\n constructor(){\n this.webCaller = new WebCallService();\n this.uriHelper = new PathHelper();\n }\n\n public async getActivitySets(viewType:string = \"display\"):Promise{\n const uri = this.uriHelper.activitySets.getActivitySetsPath(viewType);\n\n return await this.webCaller.HttpSend(HttpType.get, uri);\n }\n\n public async addOrUpdateActivitySet(activitySet:ActivitySetInfo, locationIds:{added:Array