@deviceinsight/ng-ui-scale-lib 10.0.3 → 10.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AccessEditModal-D6QiceL7.js → AccessEditModal--CrrHDx-.js} +2 -2
- package/dist/{AccessEditModal-D6QiceL7.js.map → AccessEditModal--CrrHDx-.js.map} +1 -1
- package/dist/{BundleManagementContainer-DoqJg-vc.js → BundleManagementContainer-pF44tpPR.js} +2 -2
- package/dist/{BundleManagementContainer-DoqJg-vc.js.map → BundleManagementContainer-pF44tpPR.js.map} +1 -1
- package/dist/{BundlesContainer-BhglxtAR.js → BundlesContainer-CZ70n2vt.js} +3 -3
- package/dist/{BundlesContainer-BhglxtAR.js.map → BundlesContainer-CZ70n2vt.js.map} +1 -1
- package/dist/{DatapointImport-CqvusHwg.js → DatapointImport-D5MqlPlb.js} +2 -2
- package/dist/{DatapointImport-CqvusHwg.js.map → DatapointImport-D5MqlPlb.js.map} +1 -1
- package/dist/{FileUploadInput-mAQ_6smW.js → FileUploadInput-gnfjNZsT.js} +2 -2
- package/dist/{FileUploadInput-mAQ_6smW.js.map → FileUploadInput-gnfjNZsT.js.map} +1 -1
- package/dist/{Files-YvPzdFRu.js → Files-B7r5BhB0.js} +3 -3
- package/dist/{Files-YvPzdFRu.js.map → Files-B7r5BhB0.js.map} +1 -1
- package/dist/{GlobalPowerBiReports-DFAcffGd.js → GlobalPowerBiReports-BFCqFXrG.js} +2 -2
- package/dist/{GlobalPowerBiReports-DFAcffGd.js.map → GlobalPowerBiReports-BFCqFXrG.js.map} +1 -1
- package/dist/{JsonSettingWidget-JCcJbhxk.js → JsonSettingWidget-Dmoshz7m.js} +2 -2
- package/dist/{JsonSettingWidget-JCcJbhxk.js.map → JsonSettingWidget-Dmoshz7m.js.map} +1 -1
- package/dist/{LicensesEditPage-RQkcqxud.js → LicensesEditPage-C8vTjupQ.js} +2 -2
- package/dist/{LicensesEditPage-RQkcqxud.js.map → LicensesEditPage-C8vTjupQ.js.map} +1 -1
- package/dist/{LicensesList-B6keazgL.js → LicensesList-yByygj9U.js} +2 -2
- package/dist/{LicensesList-B6keazgL.js.map → LicensesList-yByygj9U.js.map} +1 -1
- package/dist/{PropertiesEditPage-zDsiYApw.js → PropertiesEditPage-W9i-93un.js} +2 -2
- package/dist/{PropertiesEditPage-zDsiYApw.js.map → PropertiesEditPage-W9i-93un.js.map} +1 -1
- package/dist/{PropertiesList-stWeTuRv.js → PropertiesList-BoqIna7m.js} +2 -2
- package/dist/{PropertiesList-stWeTuRv.js.map → PropertiesList-BoqIna7m.js.map} +1 -1
- package/dist/{TemplateEditPage-C4YX7g3F.js → TemplateEditPage-D9OFIKqk.js} +4 -4
- package/dist/{TemplateEditPage-C4YX7g3F.js.map → TemplateEditPage-D9OFIKqk.js.map} +1 -1
- package/dist/{TemplateTextInput-BEQ-Mm5u.js → TemplateTextInput-prp5cWrV.js} +2 -2
- package/dist/{TemplateTextInput-BEQ-Mm5u.js.map → TemplateTextInput-prp5cWrV.js.map} +1 -1
- package/dist/{TemplatesListPage-ChLNNZuy.js → TemplatesListPage-7VM9CVDI.js} +3 -3
- package/dist/{TemplatesListPage-ChLNNZuy.js.map → TemplatesListPage-7VM9CVDI.js.map} +1 -1
- package/dist/{UserGroupAssignments-Ba1VwhcA.js → UserGroupAssignments-Ce4pvexW.js} +2 -2
- package/dist/{UserGroupAssignments-Ba1VwhcA.js.map → UserGroupAssignments-Ce4pvexW.js.map} +1 -1
- package/dist/{UserGroupTheme-0NnVO28I.js → UserGroupTheme-CXQyYGco.js} +2 -2
- package/dist/{UserGroupTheme-0NnVO28I.js.map → UserGroupTheme-CXQyYGco.js.map} +1 -1
- package/dist/api.d.ts +1 -0
- package/dist/api.js +2 -2
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/{setTitle-DenTN7-s.js → setTitle-DZyXA3i8.js} +195 -181
- package/dist/setTitle-DZyXA3i8.js.map +1 -0
- package/package.json +61 -61
- package/dist/setTitle-DenTN7-s.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatapointImport-CqvusHwg.js","sources":["../ng-ui-scale/src/components/datapoints/import/addMissingUnits.ts","../ng-ui-scale/src/components/datapoints/import/CsvUploadInfo.tsx","../ng-ui-scale/src/components/datapoints/import/DatapointImportStatus.tsx","../ng-ui-scale/src/components/datapoints/import/reactableHelpers.tsx","../ng-ui-scale/src/components/datapoints/import/DatapointImportResults.tsx","../ng-ui-scale/src/components/datapoints/import/datapointImportTemplate.ts","../ng-ui-scale/src/components/datapoints/import/parseCsv.ts","../ng-ui-scale/src/components/datapoints/import/DatapointImportContextProvider.tsx","../ng-ui-scale/src/components/datapoints/import/DatapointImport.tsx"],"sourcesContent":["import {fetchUnits, type Unit} from '@deviceinsight/ng-ui-api-client';\n\nimport {nonNull} from 'utils/tsUtils';\nimport type {DataRow} from './types';\n\nconst isUnique = (value: Unit | null | undefined, index: number, self: Array<Unit | null | undefined>) => {\n\treturn self.findIndex(v => v?.name === value?.name) === index;\n};\n\nexport const addMissingUnits = async (\n\texistingUnits: Array<Unit>,\n\tdataRows: Array<DataRow>,\n\taddUnit: (unit: Unit) => Promise<any>,\n): Promise<Unit[]> => {\n\tconst uniqueUnits = dataRows\n\t\t.filter(dr => !dr.error)\n\t\t.map(dr => dr.data.unit)\n\t\t.filter(unit => unit && !existingUnits.some(eu => eu.name === unit.name))\n\t\t.filter(isUnique)\n\t\t.filter(nonNull);\n\n\tconst missingUnits = uniqueUnits.map(addUnit);\n\tawait Promise.all(missingUnits);\n\treturn await fetchUnits();\n};\n","import {Trans} from 'i18n';\n\nconst bulletedListStyle = {\n\tmarginLeft: 15,\n\tlistStyle: 'disc',\n};\n\nconst CsvUploadInfo = () => {\n\treturn (\n\t\t<ul style={{...bulletedListStyle, width: 345}}>\n\t\t\t<li>\n\t\t\t\t<Trans i18nKey=\"datapointImport.infoColumns\">Columns:</Trans>\n\n\t\t\t\t<ul style={{...bulletedListStyle, listStyle: 'circle'}}>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointNameColumn\">Datapoint Name (required)</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twhiteSpace: 'normal',\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointDatatypeColumn\">\n\t\t\t\t\t\t\tDatapoint Type (required). Datatypes: 'BOOLEAN', 'DOUBLE',\n\t\t\t\t\t\t\t'LONG', 'TEXT', 'GEO_POSITION'\n\t\t\t\t\t\t</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointUnitPrintColumn\">\n\t\t\t\t\t\t\tDisplay name of unit (optional)\n\t\t\t\t\t\t</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointUnitPrintColumn\">Identifier of unit (optional)</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointUpperThresholdColumn\">\n\t\t\t\t\t\t\tDatapoint upper threshold (optional)\n\t\t\t\t\t\t</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointLowerThresholdColumn\">\n\t\t\t\t\t\t\tDatapoint lower threshold (optional)\n\t\t\t\t\t\t</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<Trans i18nKey=\"datapointImport.infoDelimiter\">Csv should use "," as delimiter</Trans>\n\t\t\t</li>\n\t\t</ul>\n\t);\n};\n\nexport default CsvUploadInfo;\n","import {Spinner} from '@deviceinsight/ng-ui-basic-components';\n\nimport type {UploadState} from './types';\nimport './DatapointImport.scss';\n\ntype Props = {\n\tuploadState: UploadState;\n};\n\nexport default function DatapointImportStatus(props: Props) {\n\tconst status = props.uploadState || 'UPLOAD_PENDING';\n\treturn (\n\t\t<span className={`di upload-status ${status.toLowerCase()}`}>\n\t\t\t{status === 'UPLOAD_PENDING' && <Spinner size={16} />}\n\t\t</span>\n\t);\n}\n","import type {DataType, PaginationSettings, Sort} from '@deviceinsight/ng-ui-api-client';\nimport type {ReactableColumnDef} from '@deviceinsight/ng-ui-components';\n\nimport type {DataRow} from './types';\n\nexport const INITIAL_PAGINATION_SETTINGS: PaginationSettings = {\n\tpage: 0,\n\tsize: 10,\n\tsort: {\n\t\tproperty: 'index',\n\t\tdirection: 'ASC',\n\t},\n};\n\nexport const customSortFunction = (\n\titems: Array<DataRow>,\n\tsort: Sort,\n\tdefaultSortItems: (items: Array<DataRow>, sort: Sort) => Array<DataRow>,\n): Array<DataRow> => {\n\tconst reverseFactor = sort.direction === 'ASC' ? 1 : -1;\n\n\tif (sort.property === 'index') {\n\t\treturn items.sort((dr1: DataRow, dr2: DataRow) => reverseFactor * (dr1.idx - dr2.idx));\n\t}\n\n\treturn defaultSortItems(items, sort);\n};\nexport const COLUMN_DEFS: Array<ReactableColumnDef<DataRow>> = [\n\t{\n\t\tname: 'index',\n\t\tlabel: '',\n\t\trender: (item: DataRow): number => item.idx,\n\t},\n\t{\n\t\tname: 'name',\n\t\tlabel: '',\n\t\trender: (item: DataRow) => (\n\t\t\t<div className=\"import-datapoint-name-cell-wrapper\">\n\t\t\t\t<div className=\"name-wrapper\" title={item.data ? item.data.name : ''}>\n\t\t\t\t\t{item.data ? item.data.name : ''}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t),\n\t},\n\t{\n\t\tname: 'datatype',\n\t\tlabel: '',\n\t\trender: (item: DataRow): DataType | string => (item.data ? item.data.datatype : ''),\n\t},\n\t{\n\t\tname: 'unit',\n\t\tlabel: '',\n\t\trender: (item: DataRow): string => (item.data && item.data.unit ? item.data.unit.print : ''),\n\t},\n\t{\n\t\tname: 'threshold1',\n\t\tlabel: '',\n\t\trender: (item: DataRow): string =>\n\t\t\titem.data && item.data.thresholds?.threshold1 ? item.data.thresholds?.threshold1.toString() : '',\n\t},\n\t{\n\t\tname: 'threshold2',\n\t\tlabel: '',\n\t\trender: (item: DataRow): string =>\n\t\t\titem.data && item.data.thresholds?.threshold2 ? item.data.thresholds?.threshold2.toString() : '',\n\t},\n\t{\n\t\tname: 'error',\n\t\tlabel: '',\n\t\trender: (item: DataRow): string => item.error || '',\n\t},\n];\n","import {PureComponent} from 'react';\n\nimport type {Datapoint} from '@deviceinsight/ng-ui-api-client';\nimport {\n\ttype PaginationSettings,\n\ttype ReactableColumnDef,\n\tReactableWithClientSidePagination,\n} from '@deviceinsight/ng-ui-components';\n\nimport DatapointImportStatus from './DatapointImportStatus';\nimport {COLUMN_DEFS, customSortFunction, INITIAL_PAGINATION_SETTINGS} from './reactableHelpers';\nimport type {DataRow, RowUploadStates, UploadState} from './types';\n\ntype OwnProps = {\n\tdata: Array<DataRow>;\n\tpageSize: number;\n\tonPageSizeChange: (size: number) => void;\n\tisLoading: boolean;\n\tonRowComplete: (rowUploadStates: RowUploadStates) => void;\n\tcreateDatapoint: (datapoint: Datapoint) => Promise<Datapoint>;\n};\n\ntype Props = OwnProps;\n\ntype State = {\n\trowUploadStates: RowUploadStates;\n\tpaginationSettings: PaginationSettings;\n};\n\nexport default class DatapointImportResults extends PureComponent<Props, State> {\n\tstate: State;\n\t_isMounted = false;\n\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\trowUploadStates: {},\n\t\t\tpaginationSettings: {...INITIAL_PAGINATION_SETTINGS, size: props.pageSize},\n\t\t};\n\t}\n\tcomponentDidMount() {\n\t\tthis._isMounted = true;\n\t}\n\n\tcomponentDidUpdate(prevProps: Props) {\n\t\tconst {data} = this.props;\n\n\t\tif (!prevProps.data.length && data.length) {\n\t\t\tthis.setState(\n\t\t\t\t{\n\t\t\t\t\trowUploadStates: {},\n\t\t\t\t},\n\t\t\t\t() => this.createDatapoint(0),\n\t\t\t);\n\t\t}\n\t\tif (prevProps.pageSize !== this.props.pageSize) {\n\t\t\tthis.setState(prev => ({\n\t\t\t\t...prev,\n\t\t\t\tpaginationSettings: {...prev.paginationSettings, size: this.props.pageSize},\n\t\t\t}));\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tthis._isMounted = false;\n\t}\n\n\tcreateDatapoint(idx: number): void | NodeJS.Timeout {\n\t\tconst {data, onRowComplete} = this.props;\n\t\tconst {rowUploadStates} = this.state;\n\t\tonRowComplete(rowUploadStates);\n\n\t\tif (idx >= data.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!data[idx]) {\n\t\t\treturn this.createDatapoint(idx + 1);\n\t\t}\n\n\t\tconst {\n\t\t\tdata: {name, datatype, unit, thresholds},\n\t\t\terror,\n\t\t} = data[idx];\n\n\t\tif (error) {\n\t\t\treturn setTimeout(() => this.updateUploadStateAndContinue(idx, 'CANNOT_UPLOAD'), 0);\n\t\t}\n\n\t\tconst datapointData: Datapoint = {\n\t\t\tname,\n\t\t\tdatatype,\n\t\t\tthresholds,\n\t\t\tdatapointType: 'RAW',\n\t\t};\n\n\t\tif (unit?.name) {\n\t\t\tdatapointData.unit = unit || undefined;\n\t\t}\n\n\t\tif (thresholds?.threshold1 || thresholds?.threshold2) {\n\t\t\tdatapointData.thresholds = thresholds;\n\t\t}\n\n\t\tthis.props\n\t\t\t.createDatapoint(datapointData)\n\t\t\t.then(() => this.updateUploadStateAndContinue(idx, 'UPLOAD_SUCCESSFUL'))\n\t\t\t.catch(() => this.updateUploadStateAndContinue(idx, 'UPLOAD_FAILED'));\n\t}\n\n\tupdateUploadStateAndContinue(idx: number, status: UploadState) {\n\t\tconst {rowUploadStates} = this.state;\n\n\t\tif (!this._isMounted) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState(\n\t\t\t{\n\t\t\t\trowUploadStates: {...(rowUploadStates as RowUploadStates), [idx]: status},\n\t\t\t},\n\t\t\t() => this.createDatapoint(idx + 1),\n\t\t);\n\t}\n\n\tgetColumnDefs(): Array<ReactableColumnDef<DataRow>> {\n\t\tconst {rowUploadStates} = this.state;\n\t\treturn [\n\t\t\t...COLUMN_DEFS,\n\t\t\t{\n\t\t\t\tname: 'result',\n\t\t\t\tlabel: '',\n\t\t\t\trender: (item: DataRow) => {\n\t\t\t\t\treturn <DatapointImportStatus uploadState={rowUploadStates[item.idx]} />;\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n\n\trender() {\n\t\tconst {data, isLoading} = this.props;\n\t\treturn (\n\t\t\t<ReactableWithClientSidePagination\n\t\t\t\tcolumnDefs={this.getColumnDefs()}\n\t\t\t\tuniqueItemKey={row => `${row.idx}`}\n\t\t\t\tcustomSortFunction={customSortFunction}\n\t\t\t\tpaginationSettings={this.state.paginationSettings}\n\t\t\t\titems={data}\n\t\t\t\tisLoading={isLoading}\n\t\t\t\tonChangeSize={this.props.onPageSizeChange}\n\t\t\t\ttableName={'datapointImportResults'}\n\t\t\t/>\n\t\t);\n\t}\n}\n","export default [\n\t'DATAPOINT_NAME,DATAPOINT_TYPE,UNIT_DISPLAY_NAME,UNIT_IDENTIFIER,DATAPOINT_UPPER_THRESHOLD,DATAPOINT_LOWER_THRESHOLD',\n\t'new_datapoint_1,LONG,°C,degrees-celsius,20,7',\n\t'new_datapoint_2,LONG,,,,',\n];\n","import * as Papa from 'papaparse';\n\nimport type {Thresholds} from '@deviceinsight/ng-ui-api-client';\n\nimport {DATAPOINT_DATATYPES} from '../constants';\nimport type {DataRow} from './types';\n\nconst MAX_ALLOWED_ERRORS = 20;\n\nconst parseCsvRows = (result: Array<Array<any>>): Array<DataRow> => {\n\tconst parsedResult: DataRow[] = [];\n\tlet numErrors = 0;\n\tconst resultCopy = [...result];\n\tif (result[0][0] === 'DATAPOINT_NAME') {\n\t\tresultCopy.shift();\n\t}\n\n\tresultCopy.forEach((r, idx) => {\n\t\tif (numErrors > MAX_ALLOWED_ERRORS) throw new Error('INVALID_DOCUMENT');\n\t\tconst [name, datatype, unitPrint, unitName, threshold1, threshold2] = r;\n\t\tconst thresholds: Thresholds = {};\n\t\tif (threshold1 && !isNaN(parseInt(threshold1))) {\n\t\t\tthresholds.threshold1 = parseInt(threshold1);\n\t\t}\n\t\tif (threshold2 && !isNaN(parseInt(threshold2))) {\n\t\t\tthresholds.threshold2 = parseInt(threshold2);\n\t\t}\n\t\tconst row: DataRow = {\n\t\t\tidx,\n\t\t\tdata: {\n\t\t\t\tname,\n\t\t\t\tdatatype: datatype ? datatype.toUpperCase() : datatype,\n\t\t\t\tunit: unitName\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: unitName,\n\t\t\t\t\t\t\tprint: unitPrint,\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\t\tthresholds,\n\t\t\t},\n\t\t};\n\t\tparsedResult.push(row);\n\n\t\tif (r.length < 2) {\n\t\t\tnumErrors++;\n\t\t\treturn (row.error = 'INVALID_NUMBER_OF_CELLS');\n\t\t}\n\n\t\tif (!DATAPOINT_DATATYPES.includes(datatype)) {\n\t\t\tnumErrors++;\n\t\t\treturn (row.error = 'INVALID_DATATYPE');\n\t\t}\n\t});\n\treturn parsedResult;\n};\n\nexport const parseCsv = (file: File): Promise<Array<DataRow>> => {\n\treturn new Promise((resolve, reject) => {\n\t\tPapa.parse<Array<any>>(file, {\n\t\t\tskipEmptyLines: true,\n\t\t\tcomplete: ({data}) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsedData = parseCsvRows(data);\n\t\t\t\t\tresolve(parsedData);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: error => {\n\t\t\t\treject(error);\n\t\t\t},\n\t\t});\n\t});\n};\n","import {createContext, type PropsWithChildren, useEffect, useState} from 'react';\n\nimport {readAccountObject, writeAccountObject} from '@deviceinsight/ng-ui-api-client';\n\nimport makeCancelable from 'utils/makeCancelable';\n\nexport const DatapointImportContext = createContext<{pageSize: number; onPageSizeChange: (pageSize: number) => void}>({\n\tpageSize: 10,\n\tonPageSizeChange: () => {},\n});\n\nconst ACCOUNT_OBJECT_PATH = 'uiConfigurations/datapointimportpagination';\n\nexport function DatapointImportContextProvider({children}: PropsWithChildren) {\n\tconst [pageSize, setPageSize] = useState(10);\n\n\tconst handlePageSizeChange = (pageSize: number) => {\n\t\tsetPageSize(pageSize);\n\t\twriteAccountObject(ACCOUNT_OBJECT_PATH, {pageSize});\n\t};\n\n\tuseEffect(() => {\n\t\tconst {promise, cancel} = makeCancelable(readAccountObject(ACCOUNT_OBJECT_PATH));\n\t\tpromise\n\t\t\t.then(value => {\n\t\t\t\tsetPageSize(value?.pageSize ?? 10);\n\t\t\t})\n\t\t\t.catch(_error => {\n\t\t\t\t// no data available or canceled - do nothing\n\t\t\t});\n\n\t\treturn cancel;\n\t}, []);\n\n\treturn (\n\t\t<DatapointImportContext.Provider value={{pageSize, onPageSizeChange: handlePageSizeChange}}>\n\t\t\t{children}\n\t\t</DatapointImportContext.Provider>\n\t);\n}\n","import {saveAs} from 'file-saver';\nimport {useContext, useState} from 'react';\n\nimport type {Datapoint, Unit} from '@deviceinsight/ng-ui-api-client';\nimport {Bubble, Button, Icon} from '@deviceinsight/ng-ui-basic-components';\nimport {FileUpload} from '@deviceinsight/ng-ui-components';\n\nimport {Trans} from 'i18n';\nimport {addMissingUnits} from './addMissingUnits';\nimport CsvUploadInfo from './CsvUploadInfo';\nimport DatapointImportResults from './DatapointImportResults';\nimport datapointImportTemplate from './datapointImportTemplate';\nimport {parseCsv} from './parseCsv';\nimport type {DataRow, RowUploadStates} from './types';\nimport './DatapointImport.scss';\n\nimport {DatapointImportContext, DatapointImportContextProvider} from './DatapointImportContextProvider';\n\n/***\n * Use LoadableDataImport to reduce initial bundle size\n */\ntype Props = {\n\texistingUnits: Array<Unit>;\n\tonChangeUploadStatus: (isOngoing: boolean, successfulUploads: number, totalUploads: number) => void;\n\tcreateDatapoint: (datapoint: Datapoint) => Promise<Datapoint>;\n\taddUnit: (unit: Unit) => Promise<any>;\n};\n\nexport default function DatapointImport(props: Props) {\n\treturn (\n\t\t<DatapointImportContextProvider>\n\t\t\t<DatapointImportImpl {...props} />\n\t\t</DatapointImportContextProvider>\n\t);\n}\n\nfunction DatapointImportImpl({existingUnits, onChangeUploadStatus, createDatapoint, addUnit}: Props) {\n\tconst [data, setData] = useState<DataRow[]>([]);\n\tconst [error, setError] = useState<Error | null | undefined>(null);\n\tconst {pageSize, onPageSizeChange} = useContext(DatapointImportContext);\n\tconst [isLoading, setIsLoading] = useState<boolean>(false);\n\n\tfunction handleRemoveFile() {\n\t\tsetData([]);\n\t\tsetError(null);\n\t}\n\n\tfunction handleSelectFile(file: File) {\n\t\tsetIsLoading(true);\n\t\tsetData([]);\n\t\tsetError(null);\n\t\tparseCsv(file)\n\t\t\t.then(async parsedData => {\n\t\t\t\tawait addMissingUnits(existingUnits, parsedData, addUnit);\n\t\t\t\tsetData(parsedData);\n\t\t\t\tonChangeUploadStatus(true, 0, 0);\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tsetError(error);\n\t\t\t})\n\t\t\t.finally(() => setIsLoading(false));\n\t}\n\n\tfunction handleImportComplete(rowUploadStates: RowUploadStates) {\n\t\tconst totalUploads = Object.values(rowUploadStates);\n\t\tconst successfulUploads = totalUploads.filter(status => status === 'UPLOAD_SUCCESSFUL');\n\t\tonChangeUploadStatus(totalUploads.length !== data.length, successfulUploads.length, data.length);\n\t}\n\n\tfunction handleDownloadTemplate() {\n\t\tconst downloadFileName = 'datapoint-import-template.csv';\n\t\tsaveAs(\n\t\t\tnew Blob([datapointImportTemplate.join('\\n')], {\n\t\t\t\ttype: 'text/csv',\n\t\t\t}),\n\t\t\tdownloadFileName,\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<FileUpload\n\t\t\t\tonRemoveFile={handleRemoveFile}\n\t\t\t\tonSelectFile={handleSelectFile}\n\t\t\t\tpreviewComponent={({file, onRemoveFile}) => (\n\t\t\t\t\t<strong className=\"di delete-file-button\">\n\t\t\t\t\t\t{file ? file.name : ''}\n\t\t\t\t\t\t<Button naked onClick={onRemoveFile} data-testid=\"delete-file-button\">\n\t\t\t\t\t\t\t<Icon del />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</strong>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{error && (\n\t\t\t\t<div className=\"di upload-error parsing-error\">\n\t\t\t\t\t<Trans i18nKey=\"datapointImport.tooManyParsingErrors\">Too many parsing errors</Trans>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!data.length && (\n\t\t\t\t<div className=\"di download-csv-section\">\n\t\t\t\t\t<Button onClick={handleDownloadTemplate}>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.downloadSample\">Download template csv file</Trans>\n\t\t\t\t\t</Button>\n\t\t\t\t\t<label className=\"csv-upload-info\">\n\t\t\t\t\t\t<Bubble content={<CsvUploadInfo />}>\n\t\t\t\t\t\t\t<span className=\"upload-anchor\"> ?</span>\n\t\t\t\t\t\t</Bubble>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className=\"datapoint-import-section\">\n\t\t\t\t<DatapointImportResults\n\t\t\t\t\tonRowComplete={handleImportComplete}\n\t\t\t\t\tdata={data}\n\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\tcreateDatapoint={createDatapoint}\n\t\t\t\t\tpageSize={pageSize}\n\t\t\t\t\tonPageSizeChange={onPageSizeChange}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n"],"names":["isUnique","value","index","self","v","addMissingUnits","existingUnits","dataRows","addUnit","missingUnits","dr","unit","eu","nonNull","fetchUnits","bulletedListStyle","CsvUploadInfo","jsxs","jsx","Trans","DatapointImportStatus","props","status","Spinner","INITIAL_PAGINATION_SETTINGS","customSortFunction","items","sort","defaultSortItems","reverseFactor","dr1","dr2","COLUMN_DEFS","item","DatapointImportResults","PureComponent","prevProps","data","prev","idx","onRowComplete","rowUploadStates","name","datatype","thresholds","error","datapointData","isLoading","ReactableWithClientSidePagination","row","datapointImportTemplate","MAX_ALLOWED_ERRORS","parseCsvRows","result","parsedResult","numErrors","resultCopy","r","unitPrint","unitName","threshold1","threshold2","DATAPOINT_DATATYPES","parseCsv","file","resolve","reject","Papa","parsedData","DatapointImportContext","createContext","ACCOUNT_OBJECT_PATH","DatapointImportContextProvider","children","pageSize","setPageSize","useState","handlePageSizeChange","writeAccountObject","useEffect","promise","cancel","makeCancelable","readAccountObject","_error","DatapointImport","DatapointImportImpl","onChangeUploadStatus","createDatapoint","setData","setError","onPageSizeChange","useContext","setIsLoading","handleRemoveFile","handleSelectFile","handleImportComplete","totalUploads","successfulUploads","handleDownloadTemplate","saveAs","Fragment","FileUpload","onRemoveFile","Button","Icon","Bubble"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DatapointImport-D5MqlPlb.js","sources":["../ng-ui-scale/src/components/datapoints/import/addMissingUnits.ts","../ng-ui-scale/src/components/datapoints/import/CsvUploadInfo.tsx","../ng-ui-scale/src/components/datapoints/import/DatapointImportStatus.tsx","../ng-ui-scale/src/components/datapoints/import/reactableHelpers.tsx","../ng-ui-scale/src/components/datapoints/import/DatapointImportResults.tsx","../ng-ui-scale/src/components/datapoints/import/datapointImportTemplate.ts","../ng-ui-scale/src/components/datapoints/import/parseCsv.ts","../ng-ui-scale/src/components/datapoints/import/DatapointImportContextProvider.tsx","../ng-ui-scale/src/components/datapoints/import/DatapointImport.tsx"],"sourcesContent":["import {fetchUnits, type Unit} from '@deviceinsight/ng-ui-api-client';\n\nimport {nonNull} from 'utils/tsUtils';\nimport type {DataRow} from './types';\n\nconst isUnique = (value: Unit | null | undefined, index: number, self: Array<Unit | null | undefined>) => {\n\treturn self.findIndex(v => v?.name === value?.name) === index;\n};\n\nexport const addMissingUnits = async (\n\texistingUnits: Array<Unit>,\n\tdataRows: Array<DataRow>,\n\taddUnit: (unit: Unit) => Promise<any>,\n): Promise<Unit[]> => {\n\tconst uniqueUnits = dataRows\n\t\t.filter(dr => !dr.error)\n\t\t.map(dr => dr.data.unit)\n\t\t.filter(unit => unit && !existingUnits.some(eu => eu.name === unit.name))\n\t\t.filter(isUnique)\n\t\t.filter(nonNull);\n\n\tconst missingUnits = uniqueUnits.map(addUnit);\n\tawait Promise.all(missingUnits);\n\treturn await fetchUnits();\n};\n","import {Trans} from 'i18n';\n\nconst bulletedListStyle = {\n\tmarginLeft: 15,\n\tlistStyle: 'disc',\n};\n\nconst CsvUploadInfo = () => {\n\treturn (\n\t\t<ul style={{...bulletedListStyle, width: 345}}>\n\t\t\t<li>\n\t\t\t\t<Trans i18nKey=\"datapointImport.infoColumns\">Columns:</Trans>\n\n\t\t\t\t<ul style={{...bulletedListStyle, listStyle: 'circle'}}>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointNameColumn\">Datapoint Name (required)</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twhiteSpace: 'normal',\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointDatatypeColumn\">\n\t\t\t\t\t\t\tDatapoint Type (required). Datatypes: 'BOOLEAN', 'DOUBLE',\n\t\t\t\t\t\t\t'LONG', 'TEXT', 'GEO_POSITION'\n\t\t\t\t\t\t</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointUnitPrintColumn\">\n\t\t\t\t\t\t\tDisplay name of unit (optional)\n\t\t\t\t\t\t</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointUnitPrintColumn\">Identifier of unit (optional)</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointUpperThresholdColumn\">\n\t\t\t\t\t\t\tDatapoint upper threshold (optional)\n\t\t\t\t\t\t</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.datapointLowerThresholdColumn\">\n\t\t\t\t\t\t\tDatapoint lower threshold (optional)\n\t\t\t\t\t\t</Trans>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<Trans i18nKey=\"datapointImport.infoDelimiter\">Csv should use "," as delimiter</Trans>\n\t\t\t</li>\n\t\t</ul>\n\t);\n};\n\nexport default CsvUploadInfo;\n","import {Spinner} from '@deviceinsight/ng-ui-basic-components';\n\nimport type {UploadState} from './types';\nimport './DatapointImport.scss';\n\ntype Props = {\n\tuploadState: UploadState;\n};\n\nexport default function DatapointImportStatus(props: Props) {\n\tconst status = props.uploadState || 'UPLOAD_PENDING';\n\treturn (\n\t\t<span className={`di upload-status ${status.toLowerCase()}`}>\n\t\t\t{status === 'UPLOAD_PENDING' && <Spinner size={16} />}\n\t\t</span>\n\t);\n}\n","import type {DataType, PaginationSettings, Sort} from '@deviceinsight/ng-ui-api-client';\nimport type {ReactableColumnDef} from '@deviceinsight/ng-ui-components';\n\nimport type {DataRow} from './types';\n\nexport const INITIAL_PAGINATION_SETTINGS: PaginationSettings = {\n\tpage: 0,\n\tsize: 10,\n\tsort: {\n\t\tproperty: 'index',\n\t\tdirection: 'ASC',\n\t},\n};\n\nexport const customSortFunction = (\n\titems: Array<DataRow>,\n\tsort: Sort,\n\tdefaultSortItems: (items: Array<DataRow>, sort: Sort) => Array<DataRow>,\n): Array<DataRow> => {\n\tconst reverseFactor = sort.direction === 'ASC' ? 1 : -1;\n\n\tif (sort.property === 'index') {\n\t\treturn items.sort((dr1: DataRow, dr2: DataRow) => reverseFactor * (dr1.idx - dr2.idx));\n\t}\n\n\treturn defaultSortItems(items, sort);\n};\nexport const COLUMN_DEFS: Array<ReactableColumnDef<DataRow>> = [\n\t{\n\t\tname: 'index',\n\t\tlabel: '',\n\t\trender: (item: DataRow): number => item.idx,\n\t},\n\t{\n\t\tname: 'name',\n\t\tlabel: '',\n\t\trender: (item: DataRow) => (\n\t\t\t<div className=\"import-datapoint-name-cell-wrapper\">\n\t\t\t\t<div className=\"name-wrapper\" title={item.data ? item.data.name : ''}>\n\t\t\t\t\t{item.data ? item.data.name : ''}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t),\n\t},\n\t{\n\t\tname: 'datatype',\n\t\tlabel: '',\n\t\trender: (item: DataRow): DataType | string => (item.data ? item.data.datatype : ''),\n\t},\n\t{\n\t\tname: 'unit',\n\t\tlabel: '',\n\t\trender: (item: DataRow): string => (item.data && item.data.unit ? item.data.unit.print : ''),\n\t},\n\t{\n\t\tname: 'threshold1',\n\t\tlabel: '',\n\t\trender: (item: DataRow): string =>\n\t\t\titem.data && item.data.thresholds?.threshold1 ? item.data.thresholds?.threshold1.toString() : '',\n\t},\n\t{\n\t\tname: 'threshold2',\n\t\tlabel: '',\n\t\trender: (item: DataRow): string =>\n\t\t\titem.data && item.data.thresholds?.threshold2 ? item.data.thresholds?.threshold2.toString() : '',\n\t},\n\t{\n\t\tname: 'error',\n\t\tlabel: '',\n\t\trender: (item: DataRow): string => item.error || '',\n\t},\n];\n","import {PureComponent} from 'react';\n\nimport type {Datapoint} from '@deviceinsight/ng-ui-api-client';\nimport {\n\ttype PaginationSettings,\n\ttype ReactableColumnDef,\n\tReactableWithClientSidePagination,\n} from '@deviceinsight/ng-ui-components';\n\nimport DatapointImportStatus from './DatapointImportStatus';\nimport {COLUMN_DEFS, customSortFunction, INITIAL_PAGINATION_SETTINGS} from './reactableHelpers';\nimport type {DataRow, RowUploadStates, UploadState} from './types';\n\ntype OwnProps = {\n\tdata: Array<DataRow>;\n\tpageSize: number;\n\tonPageSizeChange: (size: number) => void;\n\tisLoading: boolean;\n\tonRowComplete: (rowUploadStates: RowUploadStates) => void;\n\tcreateDatapoint: (datapoint: Datapoint) => Promise<Datapoint>;\n};\n\ntype Props = OwnProps;\n\ntype State = {\n\trowUploadStates: RowUploadStates;\n\tpaginationSettings: PaginationSettings;\n};\n\nexport default class DatapointImportResults extends PureComponent<Props, State> {\n\tstate: State;\n\t_isMounted = false;\n\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\trowUploadStates: {},\n\t\t\tpaginationSettings: {...INITIAL_PAGINATION_SETTINGS, size: props.pageSize},\n\t\t};\n\t}\n\tcomponentDidMount() {\n\t\tthis._isMounted = true;\n\t}\n\n\tcomponentDidUpdate(prevProps: Props) {\n\t\tconst {data} = this.props;\n\n\t\tif (!prevProps.data.length && data.length) {\n\t\t\tthis.setState(\n\t\t\t\t{\n\t\t\t\t\trowUploadStates: {},\n\t\t\t\t},\n\t\t\t\t() => this.createDatapoint(0),\n\t\t\t);\n\t\t}\n\t\tif (prevProps.pageSize !== this.props.pageSize) {\n\t\t\tthis.setState(prev => ({\n\t\t\t\t...prev,\n\t\t\t\tpaginationSettings: {...prev.paginationSettings, size: this.props.pageSize},\n\t\t\t}));\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tthis._isMounted = false;\n\t}\n\n\tcreateDatapoint(idx: number): void | NodeJS.Timeout {\n\t\tconst {data, onRowComplete} = this.props;\n\t\tconst {rowUploadStates} = this.state;\n\t\tonRowComplete(rowUploadStates);\n\n\t\tif (idx >= data.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!data[idx]) {\n\t\t\treturn this.createDatapoint(idx + 1);\n\t\t}\n\n\t\tconst {\n\t\t\tdata: {name, datatype, unit, thresholds},\n\t\t\terror,\n\t\t} = data[idx];\n\n\t\tif (error) {\n\t\t\treturn setTimeout(() => this.updateUploadStateAndContinue(idx, 'CANNOT_UPLOAD'), 0);\n\t\t}\n\n\t\tconst datapointData: Datapoint = {\n\t\t\tname,\n\t\t\tdatatype,\n\t\t\tthresholds,\n\t\t\tdatapointType: 'RAW',\n\t\t};\n\n\t\tif (unit?.name) {\n\t\t\tdatapointData.unit = unit || undefined;\n\t\t}\n\n\t\tif (thresholds?.threshold1 || thresholds?.threshold2) {\n\t\t\tdatapointData.thresholds = thresholds;\n\t\t}\n\n\t\tthis.props\n\t\t\t.createDatapoint(datapointData)\n\t\t\t.then(() => this.updateUploadStateAndContinue(idx, 'UPLOAD_SUCCESSFUL'))\n\t\t\t.catch(() => this.updateUploadStateAndContinue(idx, 'UPLOAD_FAILED'));\n\t}\n\n\tupdateUploadStateAndContinue(idx: number, status: UploadState) {\n\t\tconst {rowUploadStates} = this.state;\n\n\t\tif (!this._isMounted) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState(\n\t\t\t{\n\t\t\t\trowUploadStates: {...(rowUploadStates as RowUploadStates), [idx]: status},\n\t\t\t},\n\t\t\t() => this.createDatapoint(idx + 1),\n\t\t);\n\t}\n\n\tgetColumnDefs(): Array<ReactableColumnDef<DataRow>> {\n\t\tconst {rowUploadStates} = this.state;\n\t\treturn [\n\t\t\t...COLUMN_DEFS,\n\t\t\t{\n\t\t\t\tname: 'result',\n\t\t\t\tlabel: '',\n\t\t\t\trender: (item: DataRow) => {\n\t\t\t\t\treturn <DatapointImportStatus uploadState={rowUploadStates[item.idx]} />;\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n\n\trender() {\n\t\tconst {data, isLoading} = this.props;\n\t\treturn (\n\t\t\t<ReactableWithClientSidePagination\n\t\t\t\tcolumnDefs={this.getColumnDefs()}\n\t\t\t\tuniqueItemKey={row => `${row.idx}`}\n\t\t\t\tcustomSortFunction={customSortFunction}\n\t\t\t\tpaginationSettings={this.state.paginationSettings}\n\t\t\t\titems={data}\n\t\t\t\tisLoading={isLoading}\n\t\t\t\tonChangeSize={this.props.onPageSizeChange}\n\t\t\t\ttableName={'datapointImportResults'}\n\t\t\t/>\n\t\t);\n\t}\n}\n","export default [\n\t'DATAPOINT_NAME,DATAPOINT_TYPE,UNIT_DISPLAY_NAME,UNIT_IDENTIFIER,DATAPOINT_UPPER_THRESHOLD,DATAPOINT_LOWER_THRESHOLD',\n\t'new_datapoint_1,LONG,°C,degrees-celsius,20,7',\n\t'new_datapoint_2,LONG,,,,',\n];\n","import * as Papa from 'papaparse';\n\nimport type {Thresholds} from '@deviceinsight/ng-ui-api-client';\n\nimport {DATAPOINT_DATATYPES} from '../constants';\nimport type {DataRow} from './types';\n\nconst MAX_ALLOWED_ERRORS = 20;\n\nconst parseCsvRows = (result: Array<Array<any>>): Array<DataRow> => {\n\tconst parsedResult: DataRow[] = [];\n\tlet numErrors = 0;\n\tconst resultCopy = [...result];\n\tif (result[0][0] === 'DATAPOINT_NAME') {\n\t\tresultCopy.shift();\n\t}\n\n\tresultCopy.forEach((r, idx) => {\n\t\tif (numErrors > MAX_ALLOWED_ERRORS) throw new Error('INVALID_DOCUMENT');\n\t\tconst [name, datatype, unitPrint, unitName, threshold1, threshold2] = r;\n\t\tconst thresholds: Thresholds = {};\n\t\tif (threshold1 && !isNaN(parseInt(threshold1))) {\n\t\t\tthresholds.threshold1 = parseInt(threshold1);\n\t\t}\n\t\tif (threshold2 && !isNaN(parseInt(threshold2))) {\n\t\t\tthresholds.threshold2 = parseInt(threshold2);\n\t\t}\n\t\tconst row: DataRow = {\n\t\t\tidx,\n\t\t\tdata: {\n\t\t\t\tname,\n\t\t\t\tdatatype: datatype ? datatype.toUpperCase() : datatype,\n\t\t\t\tunit: unitName\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: unitName,\n\t\t\t\t\t\t\tprint: unitPrint,\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\t\tthresholds,\n\t\t\t},\n\t\t};\n\t\tparsedResult.push(row);\n\n\t\tif (r.length < 2) {\n\t\t\tnumErrors++;\n\t\t\treturn (row.error = 'INVALID_NUMBER_OF_CELLS');\n\t\t}\n\n\t\tif (!DATAPOINT_DATATYPES.includes(datatype)) {\n\t\t\tnumErrors++;\n\t\t\treturn (row.error = 'INVALID_DATATYPE');\n\t\t}\n\t});\n\treturn parsedResult;\n};\n\nexport const parseCsv = (file: File): Promise<Array<DataRow>> => {\n\treturn new Promise((resolve, reject) => {\n\t\tPapa.parse<Array<any>>(file, {\n\t\t\tskipEmptyLines: true,\n\t\t\tcomplete: ({data}) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsedData = parseCsvRows(data);\n\t\t\t\t\tresolve(parsedData);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: error => {\n\t\t\t\treject(error);\n\t\t\t},\n\t\t});\n\t});\n};\n","import {createContext, type PropsWithChildren, useEffect, useState} from 'react';\n\nimport {readAccountObject, writeAccountObject} from '@deviceinsight/ng-ui-api-client';\n\nimport makeCancelable from 'utils/makeCancelable';\n\nexport const DatapointImportContext = createContext<{pageSize: number; onPageSizeChange: (pageSize: number) => void}>({\n\tpageSize: 10,\n\tonPageSizeChange: () => {},\n});\n\nconst ACCOUNT_OBJECT_PATH = 'uiConfigurations/datapointimportpagination';\n\nexport function DatapointImportContextProvider({children}: PropsWithChildren) {\n\tconst [pageSize, setPageSize] = useState(10);\n\n\tconst handlePageSizeChange = (pageSize: number) => {\n\t\tsetPageSize(pageSize);\n\t\twriteAccountObject(ACCOUNT_OBJECT_PATH, {pageSize});\n\t};\n\n\tuseEffect(() => {\n\t\tconst {promise, cancel} = makeCancelable(readAccountObject(ACCOUNT_OBJECT_PATH));\n\t\tpromise\n\t\t\t.then(value => {\n\t\t\t\tsetPageSize(value?.pageSize ?? 10);\n\t\t\t})\n\t\t\t.catch(_error => {\n\t\t\t\t// no data available or canceled - do nothing\n\t\t\t});\n\n\t\treturn cancel;\n\t}, []);\n\n\treturn (\n\t\t<DatapointImportContext.Provider value={{pageSize, onPageSizeChange: handlePageSizeChange}}>\n\t\t\t{children}\n\t\t</DatapointImportContext.Provider>\n\t);\n}\n","import {saveAs} from 'file-saver';\nimport {useContext, useState} from 'react';\n\nimport type {Datapoint, Unit} from '@deviceinsight/ng-ui-api-client';\nimport {Bubble, Button, Icon} from '@deviceinsight/ng-ui-basic-components';\nimport {FileUpload} from '@deviceinsight/ng-ui-components';\n\nimport {Trans} from 'i18n';\nimport {addMissingUnits} from './addMissingUnits';\nimport CsvUploadInfo from './CsvUploadInfo';\nimport DatapointImportResults from './DatapointImportResults';\nimport datapointImportTemplate from './datapointImportTemplate';\nimport {parseCsv} from './parseCsv';\nimport type {DataRow, RowUploadStates} from './types';\nimport './DatapointImport.scss';\n\nimport {DatapointImportContext, DatapointImportContextProvider} from './DatapointImportContextProvider';\n\n/***\n * Use LoadableDataImport to reduce initial bundle size\n */\ntype Props = {\n\texistingUnits: Array<Unit>;\n\tonChangeUploadStatus: (isOngoing: boolean, successfulUploads: number, totalUploads: number) => void;\n\tcreateDatapoint: (datapoint: Datapoint) => Promise<Datapoint>;\n\taddUnit: (unit: Unit) => Promise<any>;\n};\n\nexport default function DatapointImport(props: Props) {\n\treturn (\n\t\t<DatapointImportContextProvider>\n\t\t\t<DatapointImportImpl {...props} />\n\t\t</DatapointImportContextProvider>\n\t);\n}\n\nfunction DatapointImportImpl({existingUnits, onChangeUploadStatus, createDatapoint, addUnit}: Props) {\n\tconst [data, setData] = useState<DataRow[]>([]);\n\tconst [error, setError] = useState<Error | null | undefined>(null);\n\tconst {pageSize, onPageSizeChange} = useContext(DatapointImportContext);\n\tconst [isLoading, setIsLoading] = useState<boolean>(false);\n\n\tfunction handleRemoveFile() {\n\t\tsetData([]);\n\t\tsetError(null);\n\t}\n\n\tfunction handleSelectFile(file: File) {\n\t\tsetIsLoading(true);\n\t\tsetData([]);\n\t\tsetError(null);\n\t\tparseCsv(file)\n\t\t\t.then(async parsedData => {\n\t\t\t\tawait addMissingUnits(existingUnits, parsedData, addUnit);\n\t\t\t\tsetData(parsedData);\n\t\t\t\tonChangeUploadStatus(true, 0, 0);\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tsetError(error);\n\t\t\t})\n\t\t\t.finally(() => setIsLoading(false));\n\t}\n\n\tfunction handleImportComplete(rowUploadStates: RowUploadStates) {\n\t\tconst totalUploads = Object.values(rowUploadStates);\n\t\tconst successfulUploads = totalUploads.filter(status => status === 'UPLOAD_SUCCESSFUL');\n\t\tonChangeUploadStatus(totalUploads.length !== data.length, successfulUploads.length, data.length);\n\t}\n\n\tfunction handleDownloadTemplate() {\n\t\tconst downloadFileName = 'datapoint-import-template.csv';\n\t\tsaveAs(\n\t\t\tnew Blob([datapointImportTemplate.join('\\n')], {\n\t\t\t\ttype: 'text/csv',\n\t\t\t}),\n\t\t\tdownloadFileName,\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<FileUpload\n\t\t\t\tonRemoveFile={handleRemoveFile}\n\t\t\t\tonSelectFile={handleSelectFile}\n\t\t\t\tpreviewComponent={({file, onRemoveFile}) => (\n\t\t\t\t\t<strong className=\"di delete-file-button\">\n\t\t\t\t\t\t{file ? file.name : ''}\n\t\t\t\t\t\t<Button naked onClick={onRemoveFile} data-testid=\"delete-file-button\">\n\t\t\t\t\t\t\t<Icon del />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</strong>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{error && (\n\t\t\t\t<div className=\"di upload-error parsing-error\">\n\t\t\t\t\t<Trans i18nKey=\"datapointImport.tooManyParsingErrors\">Too many parsing errors</Trans>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!data.length && (\n\t\t\t\t<div className=\"di download-csv-section\">\n\t\t\t\t\t<Button onClick={handleDownloadTemplate}>\n\t\t\t\t\t\t<Trans i18nKey=\"datapointImport.downloadSample\">Download template csv file</Trans>\n\t\t\t\t\t</Button>\n\t\t\t\t\t<label className=\"csv-upload-info\">\n\t\t\t\t\t\t<Bubble content={<CsvUploadInfo />}>\n\t\t\t\t\t\t\t<span className=\"upload-anchor\"> ?</span>\n\t\t\t\t\t\t</Bubble>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className=\"datapoint-import-section\">\n\t\t\t\t<DatapointImportResults\n\t\t\t\t\tonRowComplete={handleImportComplete}\n\t\t\t\t\tdata={data}\n\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\tcreateDatapoint={createDatapoint}\n\t\t\t\t\tpageSize={pageSize}\n\t\t\t\t\tonPageSizeChange={onPageSizeChange}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n"],"names":["isUnique","value","index","self","v","addMissingUnits","existingUnits","dataRows","addUnit","missingUnits","dr","unit","eu","nonNull","fetchUnits","bulletedListStyle","CsvUploadInfo","jsxs","jsx","Trans","DatapointImportStatus","props","status","Spinner","INITIAL_PAGINATION_SETTINGS","customSortFunction","items","sort","defaultSortItems","reverseFactor","dr1","dr2","COLUMN_DEFS","item","DatapointImportResults","PureComponent","prevProps","data","prev","idx","onRowComplete","rowUploadStates","name","datatype","thresholds","error","datapointData","isLoading","ReactableWithClientSidePagination","row","datapointImportTemplate","MAX_ALLOWED_ERRORS","parseCsvRows","result","parsedResult","numErrors","resultCopy","r","unitPrint","unitName","threshold1","threshold2","DATAPOINT_DATATYPES","parseCsv","file","resolve","reject","Papa","parsedData","DatapointImportContext","createContext","ACCOUNT_OBJECT_PATH","DatapointImportContextProvider","children","pageSize","setPageSize","useState","handlePageSizeChange","writeAccountObject","useEffect","promise","cancel","makeCancelable","readAccountObject","_error","DatapointImport","DatapointImportImpl","onChangeUploadStatus","createDatapoint","setData","setError","onPageSizeChange","useContext","setIsLoading","handleRemoveFile","handleSelectFile","handleImportComplete","totalUploads","successfulUploads","handleDownloadTemplate","saveAs","Fragment","FileUpload","onRemoveFile","Button","Icon","Bubble"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsx as t, jsxs as s } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as c } from "react";
|
|
3
3
|
import { Button as d, Icon as u } from "@deviceinsight/ng-ui-basic-components";
|
|
4
4
|
import { ImageUpload as F, FileUpload as f } from "@deviceinsight/ng-ui-components";
|
|
5
|
-
import { X as v } from "./setTitle-
|
|
5
|
+
import { X as v } from "./setTitle-DZyXA3i8.js";
|
|
6
6
|
const m = ({ file: e, onRemoveFile: o }) => /* @__PURE__ */ s(
|
|
7
7
|
"strong",
|
|
8
8
|
{
|
|
@@ -42,4 +42,4 @@ const m = ({ file: e, onRemoveFile: o }) => /* @__PURE__ */ s(
|
|
|
42
42
|
export {
|
|
43
43
|
S as F
|
|
44
44
|
};
|
|
45
|
-
//# sourceMappingURL=FileUploadInput-
|
|
45
|
+
//# sourceMappingURL=FileUploadInput-gnfjNZsT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUploadInput-
|
|
1
|
+
{"version":3,"file":"FileUploadInput-gnfjNZsT.js","sources":["../ng-ui-scale/src/components/inputs/FileUploadInput.tsx"],"sourcesContent":["import {useState} from 'react';\n\nimport {Button, Icon} from '@deviceinsight/ng-ui-basic-components';\nimport {FileUpload, ImageUpload, type PreviewComponentProps} from '@deviceinsight/ng-ui-components';\n\nimport FieldDecorator, {type FieldDecoratorProps} from './FieldDecorator';\n\ntype Props = {\n\timagesOnly?: boolean;\n\tonChange: (file: File | null | undefined) => void;\n} & FieldDecoratorProps;\n\nconst PreviewFile = ({file, onRemoveFile}: PreviewComponentProps) => (\n\t<strong\n\t\tstyle={{\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t}}\n\t>\n\t\t{file && file.name}\n\t\t<Button naked onClick={onRemoveFile} data-testid=\"delete-file-button\">\n\t\t\t<Icon del />\n\t\t</Button>\n\t</strong>\n);\n\nexport const FileUploadInput = ({imagesOnly, onChange, ...fieldDecoratorProps}: Props) => {\n\tconst [imageUrl, setImageUrl] = useState<string | null | undefined>(null);\n\n\tconst handleSelectFile = (\n\t\tfile: File & {\n\t\t\tpreview?: string;\n\t\t},\n\t) => {\n\t\tif (imagesOnly) {\n\t\t\tsetImageUrl(file.preview);\n\t\t}\n\n\t\tonChange(file);\n\t};\n\n\tconst handleRemoveFile = () => {\n\t\tif (imagesOnly) {\n\t\t\tsetImageUrl(null);\n\t\t}\n\n\t\tonChange(null);\n\t};\n\n\treturn (\n\t\t<FieldDecorator {...fieldDecoratorProps} className=\"fileuploadinput\">\n\t\t\t{imagesOnly ? (\n\t\t\t\t<ImageUpload\n\t\t\t\t\tonRemoveFile={handleRemoveFile}\n\t\t\t\t\tonSelectFile={handleSelectFile}\n\t\t\t\t\tpreviewComponent={PreviewFile}\n\t\t\t\t\timageUrl={imageUrl}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<FileUpload\n\t\t\t\t\tonRemoveFile={handleRemoveFile}\n\t\t\t\t\tonSelectFile={handleSelectFile}\n\t\t\t\t\tpreviewComponent={PreviewFile}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</FieldDecorator>\n\t);\n};\n"],"names":["PreviewFile","file","onRemoveFile","jsxs","jsx","Button","Icon","FileUploadInput","imagesOnly","onChange","fieldDecoratorProps","imageUrl","setImageUrl","useState","handleSelectFile","handleRemoveFile","FieldDecorator","ImageUpload","FileUpload"],"mappings":";;;;;AAYA,MAAMA,IAAc,CAAC,EAAC,MAAAC,GAAM,cAAAC,QAC3B,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACA,OAAO;AAAA,MACN,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,IAAA;AAAA,IAGhB,UAAA;AAAA,MAAAF,KAAQA,EAAK;AAAA,MACd,gBAAAG,EAACC,GAAA,EAAO,OAAK,IAAC,SAASH,GAAc,eAAY,sBAChD,UAAA,gBAAAE,EAACE,GAAA,EAAK,KAAG,GAAA,CAAC,EAAA,CACX;AAAA,IAAA;AAAA,EAAA;AACD,GAGYC,IAAkB,CAAC,EAAC,YAAAC,GAAY,UAAAC,GAAU,GAAGC,QAAgC;AACzF,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAoC,IAAI,GAElEC,IAAmB,CACxBb,MAGI;AACJ,IAAIO,KACHI,EAAYX,EAAK,OAAO,GAGzBQ,EAASR,CAAI;AAAA,EACd,GAEMc,IAAmB,MAAM;AAC9B,IAAIP,KACHI,EAAY,IAAI,GAGjBH,EAAS,IAAI;AAAA,EACd;AAEA,2BACEO,GAAA,EAAgB,GAAGN,GAAqB,WAAU,mBACjD,UAAAF,IACA,gBAAAJ;AAAA,IAACa;AAAA,IAAA;AAAA,MACA,cAAcF;AAAA,MACd,cAAcD;AAAA,MACd,kBAAkBd;AAAA,MAClB,UAAAW;AAAA,IAAA;AAAA,EAAA,IAGD,gBAAAP;AAAA,IAACc;AAAA,IAAA;AAAA,MACA,cAAcH;AAAA,MACd,cAAcD;AAAA,MACd,kBAAkBd;AAAA,IAAA;AAAA,EAAA,GAGrB;AAEF;"}
|
|
@@ -3,14 +3,14 @@ import { ReactableWithClientSidePagination as j, messageBoxError as K, ContentHe
|
|
|
3
3
|
import { g as U } from "./customFileCategories-bG5S9qSy.js";
|
|
4
4
|
import { useMemo as M, useState as g, useEffect as k, createContext as O, useContext as P, useCallback as R, useRef as Y } from "react";
|
|
5
5
|
import "react-i18next";
|
|
6
|
-
import { u as V, a as A, a8 as z, bh as Z, bQ as q, a7 as _, bR as N, am as $ } from "./setTitle-
|
|
6
|
+
import { u as V, a as A, a8 as z, bh as Z, bQ as q, a7 as _, bR as N, am as $ } from "./setTitle-DZyXA3i8.js";
|
|
7
7
|
import { saveAs as H } from "file-saver";
|
|
8
8
|
import { Button as w, Icon as J, SpinnerContainer as X, Modal as ee, useConfirm as te } from "@deviceinsight/ng-ui-basic-components";
|
|
9
9
|
import { filesize as ie } from "filesize";
|
|
10
10
|
import { Link as ae } from "react-router-dom";
|
|
11
11
|
import b from "keyboardjs";
|
|
12
12
|
import { createPortal as ne } from "react-dom";
|
|
13
|
-
import { F as le } from "./FileUploadInput-
|
|
13
|
+
import { F as le } from "./FileUploadInput-gnfjNZsT.js";
|
|
14
14
|
const se = {
|
|
15
15
|
page: 0,
|
|
16
16
|
size: 10,
|
|
@@ -344,4 +344,4 @@ function Ne({ asset: t, assetGroup: i }) {
|
|
|
344
344
|
export {
|
|
345
345
|
Ne as default
|
|
346
346
|
};
|
|
347
|
-
//# sourceMappingURL=Files-
|
|
347
|
+
//# sourceMappingURL=Files-B7r5BhB0.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Files-YvPzdFRu.js","sources":["../ng-ui-scale/src/modules/files/FilesTable.tsx","../ng-ui-scale/src/modules/files/filesContext/useFilesByTypeAndContext.ts","../ng-ui-scale/src/modules/files/filesContext/FilesContextProvider.tsx","../ng-ui-scale/src/modules/files/filesContext/useFiles.ts","../ng-ui-scale/src/assets/img/preview-arrow-left.png","../ng-ui-scale/src/assets/img/preview-arrow-right.png","../ng-ui-scale/src/assets/img/preview-close.png","../ng-ui-scale/src/assets/img/preview-download.png","../ng-ui-scale/src/modules/files/ImagePreview.tsx","../ng-ui-scale/src/modules/files/PreviewPortal.tsx","../ng-ui-scale/src/modules/files/UploadModal.tsx","../ng-ui-scale/src/modules/files/FilesTab.tsx","../ng-ui-scale/src/modules/files/Files.tsx"],"sourcesContent":["import {filesize} from 'filesize';\nimport {Link} from 'react-router-dom';\n\nimport {Button, Icon} from '@deviceinsight/ng-ui-basic-components';\nimport {\n\ttype PaginationSettings,\n\ttype ReactableColumnDef,\n\tReactableWithClientSidePagination,\n} from '@deviceinsight/ng-ui-components';\n\nimport imgDownload from 'assets/svg/icon_download.svg';\nimport {type TFunction, Trans, useTranslation} from 'i18n';\nimport {formatTimestamp} from 'utils/timestampUtils';\nimport type {FileDescriptor} from './types';\n\ntype Props = {\n\tfiles: FileDescriptor[];\n\ttype: 'documents' | 'images';\n\tloading: boolean;\n\tonFilenameClick: (file: FileDescriptor) => void;\n\tonDownload: (file: FileDescriptor) => void;\n\tonDelete: (file: FileDescriptor) => void;\n};\n\nconst INITIAL_PAGINATION_SETTINGS: PaginationSettings = {\n\tpage: 0,\n\tsize: 10,\n\tsort: {\n\t\tproperty: 'creationDate',\n\t\tdirection: 'DESC',\n\t},\n};\n\nfunction getColumnDefinitions(\n\ttype: 'documents' | 'images',\n\tonFilenameClick: (file: FileDescriptor) => void,\n\tonDownloadFile: (file: FileDescriptor) => void,\n\tonDeleteFile: (file: FileDescriptor) => void,\n\tt: TFunction,\n): ReactableColumnDef<FileDescriptor>[] {\n\treturn [\n\t\t{\n\t\t\tname: 'filename',\n\t\t\tlabel: <Trans i18nKey=\"assets.detail.files.columns.filename\">Filename</Trans>,\n\t\t\twidth: '50%',\n\t\t\tsortable: true,\n\t\t\tfilterable: {\n\t\t\t\tfilterType: 'text' as const,\n\n\t\t\t\tfilterFn(item: FileDescriptor, value: string) {\n\t\t\t\t\treturn item.filename.toLowerCase().indexOf(value.toLowerCase()) !== -1;\n\t\t\t\t},\n\t\t\t},\n\t\t\trender: (item: FileDescriptor) => (\n\t\t\t\t<Link to=\"#\" onClick={() => onFilenameClick(item)}>\n\t\t\t\t\t{item.filename}\n\t\t\t\t\t{item.context && (\n\t\t\t\t\t\t<span> [{item.context === 'svgWidget' ? 'Svg Widget' : 'Asset Image Widget'}]</span>\n\t\t\t\t\t)}\n\t\t\t\t</Link>\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname: 'size',\n\t\t\tsortable: true,\n\t\t\tlabel: <Trans i18nKey=\"assets.detail.files.columns.size\">Size</Trans>,\n\t\t\twidth: '20%',\n\t\t\trender: (item: FileDescriptor) => filesize(item.size),\n\t\t},\n\t\t{\n\t\t\tname: 'creationDate',\n\t\t\tsortable: true,\n\t\t\tlabel: <Trans i18nKey=\"assets.detail.files.columns.lastModificationDate\">Last modification date</Trans>,\n\t\t\twidth: '20%',\n\t\t\trender: (item: FileDescriptor) => formatTimestamp(new Date(item.creationDate).getTime()),\n\t\t},\n\t\t{\n\t\t\tname: 'deleteAndDownload',\n\t\t\tlabel: '',\n\t\t\talign: 'right' as const,\n\t\t\trender: (item: FileDescriptor) => (\n\t\t\t\t<>\n\t\t\t\t\t<Button onClick={() => onDownloadFile(item)} naked>\n\t\t\t\t\t\t<img src={imgDownload} alt=\"Download\" />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<span\n\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\titem.context\n\t\t\t\t\t\t\t\t? t('assets.detail.files.deleteDisabledTooltip', {\n\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Cannot be removed because is used by some {{widget}}',\n\t\t\t\t\t\t\t\t\t\twidget: item.context === 'svgWidget' ? 'Svg Widget' : 'Asset Image Widget',\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tnaked\n\t\t\t\t\t\t\tdisabled={!!item.context}\n\t\t\t\t\t\t\tonClick={() => onDeleteFile(item)}\n\t\t\t\t\t\t\tdata-testid=\"delete-file-button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon del />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</span>\n\t\t\t\t</>\n\t\t\t),\n\t\t},\n\t];\n}\n\nexport function FilesTable({files, loading, type, onFilenameClick, onDownload, onDelete}: Props) {\n\tconst {t} = useTranslation();\n\n\treturn (\n\t\t<ReactableWithClientSidePagination\n\t\t\tcolumnDefs={getColumnDefinitions(type, onFilenameClick, onDownload, onDelete, t)}\n\t\t\tuniqueItemKey={item => item.key}\n\t\t\tpaginationSettings={INITIAL_PAGINATION_SETTINGS}\n\t\t\titems={files}\n\t\t\tisLoading={loading}\n\t\t\ttableName={'filesTable'}\n\t\t/>\n\t);\n}\n","import {useEffect, useMemo, useState} from 'react';\n\nimport type {Asset, AssetGroup} from '@deviceinsight/ng-ui-api-client';\n\nimport makeCancelable from 'utils/makeCancelable';\nimport {createFilesApi} from '../api';\nimport type {FileDescriptor} from '../types';\n\nexport type UseFilesReturnType = {\n\tloading: boolean;\n\tfiles: FileDescriptor[];\n\tuploadFile: (file: File, category: string | undefined) => void;\n\tdeleteFile: (file: FileDescriptor) => void;\n\tfetchFile: (file: FileDescriptor) => Promise<ArrayBuffer>;\n};\n\nexport function useFilesByTypeAndContext(\n\ttype: 'documents' | 'images',\n\tasset: Asset | undefined,\n\tassetGroup: AssetGroup | undefined,\n): UseFilesReturnType {\n\tconst filesApi = useMemo(() => createFilesApi(asset, assetGroup, type), [asset, assetGroup, type]);\n\tconst [loading, setLoading] = useState(false);\n\tconst [files, setFiles] = useState<FileDescriptor[]>([]);\n\n\tuseEffect(() => {\n\t\tconst {promise, cancel} = makeCancelable(filesApi.fetchFiles());\n\t\tpromise\n\t\t\t.then(files => {\n\t\t\t\tsetFiles(files);\n\t\t\t\tsetLoading(false);\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tif (!error.isCanceled) {\n\t\t\t\t\tsetLoading(false);\n\t\t\t\t}\n\t\t\t});\n\t\treturn cancel;\n\t}, [filesApi]);\n\n\tasync function uploadFile(file: File, category: string | undefined) {\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tconst uploadedFile = await filesApi.uploadFile(file, category);\n\t\t\tsetFiles([...files, uploadedFile]);\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}\n\n\tasync function deleteFile(file: FileDescriptor) {\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tawait filesApi.deleteFile(file.key);\n\t\t\tsetFiles(files.filter(fileDescriptor => fileDescriptor.key !== file.key));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}\n\n\tfunction fetchFile(file: FileDescriptor): Promise<ArrayBuffer> {\n\t\treturn filesApi.fetchFile(file.key);\n\t}\n\n\treturn {\n\t\tloading,\n\t\tfiles,\n\t\tuploadFile,\n\t\tdeleteFile,\n\t\tfetchFile,\n\t};\n}\n","import {createContext, type PropsWithChildren} from 'react';\n\nimport type {Asset, AssetGroup} from '@deviceinsight/ng-ui-api-client';\n\nimport {type UseFilesReturnType, useFilesByTypeAndContext} from './useFilesByTypeAndContext';\n\ntype ApiContextType = {\n\tdocuments: UseFilesReturnType;\n\timages: UseFilesReturnType;\n};\n\nconst dummyFiles: UseFilesReturnType = {\n\tdeleteFile: () => {},\n\tfiles: [],\n\tuploadFile: () => {},\n\tfetchFile: () => Promise.resolve(new ArrayBuffer(0)),\n\tloading: false,\n};\n\nexport const FilesContext = createContext<ApiContextType>({\n\tdocuments: dummyFiles,\n\timages: dummyFiles,\n});\n\ntype Props = {\n\tasset?: Asset;\n\tassetGroup?: AssetGroup;\n};\n\nexport function FilesContextProvider({asset, assetGroup, children}: PropsWithChildren<Props>) {\n\tconst documents = useFilesByTypeAndContext('documents', asset, assetGroup);\n\tconst images = useFilesByTypeAndContext('images', asset, assetGroup);\n\n\treturn <FilesContext.Provider value={{documents, images}}>{children}</FilesContext.Provider>;\n}\n","import {useContext} from 'react';\n\nimport {FilesContext} from './FilesContextProvider';\nimport type {UseFilesReturnType} from './useFilesByTypeAndContext';\n\nexport function useFiles(type: 'documents' | 'images'): UseFilesReturnType {\n\tconst {documents, images} = useContext(FilesContext);\n\tif (type === 'documents') return documents;\n\telse return images;\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAnCAYAAADtu3N3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCCsYE1yvpwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAFTSURBVEjHrdY9S5BhFAbgNykUKUIRE10kGxxsUgQXF2lLGppsCTcdGhprCZxqcNCxKRp0EcTJpaWGwBaDhpCIoJZECIQkTOty8Ajvfs7zAy44D/f5aJrkQweGmgLoEtZxioEs9sL5+4CODLQY0DfcyECzUdovjGagCfzGMaYz0DB+4j/mMlAPPsc/PclAnXgX0MuKLME2LldkaRdXM9BCQN8xmIHuRpYOMZaBxiNLfzFTkSV4WJWlZ9ksvQ3oVTZLawG9wZUM9jygT7iegYYCOsVIxQy/6LvXFbO8F3sBLlWAN7Ef4HwFOIkjnOBOBXgP/6Inb1eAj6LcH1ULdjnAj7hWEZmNkgkbYBfep2d/C+zDlwCfVoC3cBD78kEFOIU/6U3eAu9HBnM3Rgt8XHL9tMCV1l3WXZHBzQC3UodegN3YCXC1otx+fA2wpIeHsdA0TXMGpWMqV6FcS+MAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAnCAYAAAACeRhJAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCCwH0RU0lQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAFISURBVEjHrdaxS9VhFAZgja43JUy4uETocBsjwSXvLLnYEjQn4pKb4B6I08XJ1SXK6bo4Oogt3T0QHXTLJMGWFDFI83HwDM7f+Z0/4OF7h++8pwfD6O/JDn5gD0NZaM3dfEVfBqphJ7D17KueRDxYzmIj+BXYXBYbxwWuMJXFpnGNc4xlsQ8R8RjPslg7sF0MZqBedALbRi2D1fEtsE/ZiA0cBPYxizVxGtj7LPYKl/iHySz2Fv/xBy+y2EJEPMLTLLYa2Hc8zkAPsBnYFh5msIF72+JNBloM5CeGS5F3uMEZXpYiLfyNnfW6FHmO3xFpNvPnDgNZKkUeoRvIl8xe2rjXfbVSaCWQ/eI2xnwgJxjNtskFxrP9do3pKhp3vooboF3FVdJBbyn0OZAu6qXIUiAHaJQiM4GcoplZUCdRMxNVVEwre9TeAsA6JS24jJJMAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAfCAYAAADwbH0HAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCDQxnLQ5VQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAGASURBVEjHvde3UgMxEIBhAUNBdoKCHEo/Aa9BCwWtXw7GBRVDGPKAzzahIaeKmhp+CmSP5izJF/a8rXb3mztJJ51SRgB9qkfRb6AVpdQWMCiNANPANlAKD1SAX/6jKolr9F73bgKF1sCGgSKJh9BWBEBOAbPAE52RCtfog6XvLjDUSpoDnqVwD7rXRo3keeAlLQ7MONB9YNhVlArX6KOl/sCJGsULwGtc3IMedkWNJovAW1Tcgx4BI3EXSCTcgx4Do0m3xBLw7sI96Eli1MCXgQ9L8x0HegqMSX32XHg4zsRQA18BPj3oOTCeyVEGrDrQ746TRxAtATeeJ66KH6kavY4wx3I4UHSgl8BXJrhGm66FBJTFcaAANCxNL8zVK4pHRUVxjdYdczrhqUuOA/kkaCpco4Gl6ArIxZim6LhGa5bkWhw0Fg7kHGgA5FNsRT8OrFnu1fU0aBf81rzUbwI/eqDRHpD58pn4HTAZTljXr7yYwQFT1tfbKVfCQK/+Fv8AJCO91qtSsKIAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCDYA/1xb7QAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAADlSURBVEjH7dW/CsIwEAbw7ySDjyFOujgJ4jMU3AWp7eJLCE7+2ZzENxB8GmdHV0FBN5f6uVQMIW0aCk45KLSX3I9LCI3AEiRHAGYoj4WInMykKpjcBhA5wJ0t2XAULQF0jedQVqAc4FVEzsZ2PMoKXB16RwADGMAA/gdUJFsAJkZ+WKF2TLKvfWcA9kpELiSbAOaezcTa+xtAKiJP/U+84i+2JBOSHcsFNsjHjvncjGSMgtvui95I9opaIxmRfOXYtHQdLtQL04rWNtTAEq8dN9FamIZucvSuYWmtg6qh9TFj+ZWwD7+x6apgNh+aAAAAAElFTkSuQmCC\"","import {SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\n\ntype Props = {\n\tloading: boolean;\n\tcontent: string | undefined;\n\tcontentType: string;\n};\n\nexport const ImagePreview = ({contentType, loading, content}: Props) => (\n\t<div className=\"image-preview\">\n\t\t<SpinnerContainer show={loading}>\n\t\t\t{contentType === 'image/svg+xml' && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"svg-preview\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackgroundImage: `url(\"${loading || !content ? '' : content}\")`,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{contentType !== 'image/svg+xml' && <img src={content} alt=\"\" />}\n\t\t</SpinnerContainer>\n\t</div>\n);\n","import {saveAs} from 'file-saver';\nimport KeyboardJS from 'keyboardjs';\nimport {useCallback, useEffect, useRef, useState} from 'react';\nimport {createPortal} from 'react-dom';\n\nimport previousImg from 'assets/img/preview-arrow-left.png';\nimport nextImg from 'assets/img/preview-arrow-right.png';\nimport closeImg from 'assets/img/preview-close.png';\nimport downloadImg from 'assets/img/preview-download.png';\nimport {ImagePreview} from './ImagePreview';\nimport './PreviewPortal.scss';\n\nimport type {FileDescriptor} from './types';\nimport {transformArrayBufferToBase64WithContentType} from './utils';\n\ntype Props = {\n\tinitialImageNumber: number;\n\titems: FileDescriptor[];\n\tonDownload: (file: FileDescriptor) => Promise<ArrayBuffer>;\n\tonClose: () => void;\n};\n\nexport const PreviewPortal = ({initialImageNumber, items, onDownload, onClose}: Props) => {\n\tconst [current, setCurrent] = useState(initialImageNumber);\n\tconst [content, setContent] = useState<string | undefined>();\n\tconst [loading, setLoading] = useState(false);\n\n\tconst showNext = useCallback(() => setCurrent(current => Math.min(items.length - 1, current + 1)), [items]);\n\tconst showPrevious = useCallback(() => setCurrent(current => Math.max(0, current - 1)), []);\n\tconst cacheRef = useRef<Record<string, any>>({});\n\n\tuseEffect(() => {\n\t\tKeyboardJS.addListener('right', showNext);\n\t\tKeyboardJS.addListener('left', showPrevious);\n\t\tKeyboardJS.addListener('esc', onClose);\n\t\treturn () => {\n\t\t\tKeyboardJS.removeListener('right', showNext);\n\t\t\tKeyboardJS.removeListener('left', showPrevious);\n\t\t\tKeyboardJS.removeListener('esc', onClose);\n\t\t};\n\t}, [showNext, showPrevious, onClose]);\n\tconst currentDescriptor = items[current];\n\n\tuseEffect(() => {\n\t\tconst cachedArrayBuffer = cacheRef.current[currentDescriptor.key];\n\n\t\tif (cachedArrayBuffer) {\n\t\t\tsetContent(transformArrayBufferToBase64WithContentType(currentDescriptor.contentType, cachedArrayBuffer));\n\t\t} else {\n\t\t\tsetLoading(true);\n\t\t\tonDownload(currentDescriptor).then((arrayBuffer: ArrayBuffer) => {\n\t\t\t\tsetLoading(false);\n\t\t\t\tcacheRef.current[currentDescriptor.key] = arrayBuffer;\n\t\t\t\tsetContent(transformArrayBufferToBase64WithContentType(currentDescriptor.contentType, arrayBuffer));\n\t\t\t});\n\t\t}\n\t}, [currentDescriptor, onDownload]);\n\n\tconst handleDownloadClick = () => {\n\t\tsaveAs(new Blob([cacheRef.current[currentDescriptor.key]]), currentDescriptor.filename);\n\t};\n\n\tconst previousAvailable = items.length > 0 && current > 0;\n\tconst nextAvailable = items.length > 0 && current < items.length - 1;\n\tconst {body} = document;\n\n\tif (!body) {\n\t\treturn null;\n\t}\n\n\treturn createPortal(\n\t\t<div className=\"di file-previewer\">\n\t\t\t<div className=\"background\" />\n\t\t\t<div className=\"header\">\n\t\t\t\t<h1 className=\"filename\">{currentDescriptor.filename}</h1>\n\t\t\t\t<button className=\"btn close\" onClick={onClose}>\n\t\t\t\t\t<span role=\"img\" aria-label=\"close\">\n\t\t\t\t\t\t<img src={closeImg} alt=\"close\" />\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div className=\"content\">\n\t\t\t\t<div className=\"left\">\n\t\t\t\t\t{previousAvailable && (\n\t\t\t\t\t\t<button className=\"btn previous\" onClick={showPrevious}>\n\t\t\t\t\t\t\t<span role=\"img\" aria-label=\"previous\">\n\t\t\t\t\t\t\t\t<img src={previousImg} alt=\"previous\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"center\">\n\t\t\t\t\t<ImagePreview loading={loading} content={content} contentType={currentDescriptor.contentType} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"right\">\n\t\t\t\t\t{nextAvailable && (\n\t\t\t\t\t\t<button className=\"btn next\" onClick={showNext}>\n\t\t\t\t\t\t\t<span role=\"img\" aria-label=\"next\">\n\t\t\t\t\t\t\t\t<img src={nextImg} alt=\"next\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"footer\">\n\t\t\t\t<button className=\"btn download\" onClick={handleDownloadClick} disabled={loading}>\n\t\t\t\t\t<span role=\"img\" aria-label=\"close\">\n\t\t\t\t\t\t<img src={downloadImg} alt=\"download\" />\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>,\n\t\tbody,\n\t);\n};\n","import {useState} from 'react';\n\nimport {Button, Modal, SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\nimport {messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport {FileUploadInput} from 'components/inputs/FileUploadInput';\nimport {Trans, useTranslation} from 'i18n';\n\ntype Props = {\n\tfileType: 'documents' | 'images';\n\tonClose: () => void;\n\tonUpload: (file: File, type: 'documents' | 'images') => any;\n};\n\nexport const UploadModal = ({fileType, onClose, onUpload}: Props) => {\n\tconst {t} = useTranslation();\n\tconst [file, setFile] = useState<File | null | undefined>(null);\n\tconst [fileError, setFileError] = useState<string>('');\n\tconst [loading, setLoading] = useState<boolean>(false);\n\tconst isValid = file && !fileError;\n\n\tconst handleSubmit = async (file: File | null | undefined) => {\n\t\tif (!file) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetLoading(true);\n\n\t\ttry {\n\t\t\tawait onUpload(file, fileType);\n\t\t\tonClose();\n\t\t} catch (e: any) {\n\t\t\tmessageBoxError(e.message);\n\t\t\tconsole.error(e);\n\t\t\tsetLoading(false);\n\t\t}\n\t};\n\tconst handleSetFile = (nextFile: File | null | undefined) => {\n\t\tsetFile(nextFile);\n\n\t\tif (!nextFile) {\n\t\t\tsetFileError(\n\t\t\t\tt('assets.detail.files.uploadForm.error.missingFile', {\n\t\t\t\t\tdefaultValue: 'Please select a file',\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tsetFileError('');\n\t\t}\n\t};\n\n\treturn (\n\t\t<Modal\n\t\t\twidth={450}\n\t\t\theader={\n\t\t\t\tfileType === 'documents' ? (\n\t\t\t\t\t<Trans i18nKey=\"assets.detail.files.uploadForm.addDocument\">Add document</Trans>\n\t\t\t\t) : (\n\t\t\t\t\t<Trans i18nKey=\"assets.detail.files.uploadForm.addImage\">Add image</Trans>\n\t\t\t\t)\n\t\t\t}\n\t\t\tcontent={\n\t\t\t\t<SpinnerContainer show={loading}>\n\t\t\t\t\t<FileUploadInput\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"assets.detail.files.uploadForm.fileLabel\">File to upload</Trans>}\n\t\t\t\t\t\tonChange={handleSetFile}\n\t\t\t\t\t\timagesOnly={fileType === 'images'}\n\t\t\t\t\t\terror={fileError}\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\t\t\t\t</SpinnerContainer>\n\t\t\t}\n\t\t\tfooter={\n\t\t\t\t<>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={() => handleSubmit(file)}\n\t\t\t\t\t\tprimary\n\t\t\t\t\t\tdisabled={!isValid || loading}\n\t\t\t\t\t\tdata-testid=\"save-button\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trans i18nKey=\"general.actions.save\">Save</Trans>\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button onClick={onClose}>\n\t\t\t\t\t\t<Trans i18nKey=\"general.actions.cancel\">Cancel</Trans>\n\t\t\t\t\t</Button>\n\t\t\t\t</>\n\t\t\t}\n\t\t/>\n\t);\n};\n","import {saveAs} from 'file-saver';\nimport {useMemo, useState} from 'react';\n\nimport {Button, Icon, useConfirm} from '@deviceinsight/ng-ui-basic-components';\nimport {messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport {HasAuthorities} from 'components/auth/HasAuthorities';\nimport {getCustomFileCategories} from 'customization/customFileCategories';\nimport {Trans, useTranslation} from 'i18n';\nimport {FilesTable} from './FilesTable';\nimport {useFiles} from './filesContext/useFiles';\nimport {PreviewPortal} from './PreviewPortal';\nimport type {FileDescriptor} from './types';\nimport {UploadModal} from './UploadModal';\n\ntype Props = {\n\ttype: 'documents' | 'images';\n\tcategory?: string | undefined;\n};\n\nfunction filterFilesByCategory(files: FileDescriptor[], category: string | undefined): FileDescriptor[] {\n\tconst allCategories = getCustomFileCategories().map(({categoryName}) => categoryName);\n\tif (category && allCategories.includes(category)) {\n\t\treturn files.filter(fileDescriptor => fileDescriptor.category === category);\n\t} else {\n\t\treturn files.filter(\n\t\t\tfileDescriptor => !fileDescriptor.category || !allCategories.includes(fileDescriptor.category),\n\t\t);\n\t}\n}\n\nexport function FilesTab({type, category}: Props) {\n\tconst {loading, files: allFiles, uploadFile, deleteFile, fetchFile} = useFiles(type);\n\tconst files = useMemo(() => filterFilesByCategory(allFiles, category), [allFiles, category]);\n\tconst [uploadModalVisible, setUploadModalVisible] = useState(false);\n\tconst [previewModalVisible, setPreviewModalVisible] = useState(false);\n\tconst [initialPreviewImageIndex, setInitialPreviewImageIndex] = useState<number>(0);\n\tconst {t} = useTranslation();\n\tconst confirm = useConfirm();\n\n\tasync function handleDownload(file: FileDescriptor) {\n\t\tconst arrayBuffer = await fetchFile(file);\n\t\tsaveAs(new Blob([arrayBuffer]), file.filename);\n\t}\n\n\tfunction handleFilenameClick(file: FileDescriptor) {\n\t\tif (type === 'images') {\n\t\t\tsetInitialPreviewImageIndex(files.indexOf(file));\n\t\t\tsetPreviewModalVisible(true);\n\t\t} else {\n\t\t\thandleDownload(file);\n\t\t}\n\t}\n\n\tasync function handleUploadFile(file: File) {\n\t\ttry {\n\t\t\tawait uploadFile(file, category);\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\tmessageBoxError(<Trans i18nKey=\"files.error.unknown\">Operation failed</Trans>);\n\t\t}\n\t}\n\n\tasync function handleDelete(file: FileDescriptor) {\n\t\tconst confirmed = await confirm({\n\t\t\ttitle: t('assets.detail.files.deleteConfirmTitle', {defaultValue: 'Delete File'}),\n\t\t\tmessage: t('assets.detail.files.deleteConfirmMessage', {\n\t\t\t\tdefaultValue: 'Do you really want to delete this file?',\n\t\t\t}),\n\t\t});\n\n\t\tif (confirmed) {\n\t\t\tawait deleteFile(file);\n\t\t}\n\t}\n\n\treturn (\n\t\t<div>\n\t\t\t<FilesTable\n\t\t\t\tfiles={files}\n\t\t\t\tloading={loading}\n\t\t\t\ttype={type}\n\t\t\t\tonDownload={handleDownload}\n\t\t\t\tonFilenameClick={handleFilenameClick}\n\t\t\t\tonDelete={handleDelete}\n\t\t\t/>\n\t\t\t<HasAuthorities authorities={['WRITE_ASSET_OR_ASSET_GROUP_FILE'] as string[]}>\n\t\t\t\t<Button onClick={() => setUploadModalVisible(true)} data-testid=\"add-file-button\">\n\t\t\t\t\t<Icon add />\n\t\t\t\t\t{type === 'images' && <Trans i18nKey=\"assets.detail.files.addImage\">Add image</Trans>}\n\t\t\t\t\t{type === 'documents' && <Trans i18nKey=\"assets.detail.files.addFile\">Add file</Trans>}\n\t\t\t\t</Button>\n\t\t\t</HasAuthorities>\n\t\t\t{uploadModalVisible && (\n\t\t\t\t<UploadModal fileType={type} onClose={() => setUploadModalVisible(false)} onUpload={handleUploadFile} />\n\t\t\t)}\n\t\t\t{previewModalVisible && (\n\t\t\t\t<PreviewPortal\n\t\t\t\t\tinitialImageNumber={initialPreviewImageIndex}\n\t\t\t\t\titems={files}\n\t\t\t\t\tonDownload={fetchFile}\n\t\t\t\t\tonClose={() => setPreviewModalVisible(false)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type {Asset, AssetGroup} from '@deviceinsight/ng-ui-api-client';\nimport {ContentHeader, RouteTabs} from '@deviceinsight/ng-ui-components';\n\nimport {getCustomFileCategories} from 'customization/customFileCategories';\nimport {Trans} from 'i18n';\nimport {FilesTab} from './FilesTab';\nimport {FilesContextProvider} from './filesContext/FilesContextProvider';\n\ntype Props = {\n\tasset?: Asset;\n\tassetGroup?: AssetGroup;\n};\n\nfunction createRouteTabs() {\n\treturn [\n\t\t{\n\t\t\tpath: 'documents',\n\t\t\trenderHeading: () => <Trans i18nKey=\"assets.detail.files.tabs.documents\">Documents</Trans>,\n\t\t\trenderBody: () => <FilesTab type=\"documents\" />,\n\t\t},\n\t\t...getCustomFileCategories()\n\t\t\t.filter(({type}) => type === 'documents')\n\t\t\t.map(({categoryName, locizeKey, locizeDefaultValue}) => ({\n\t\t\t\tpath: categoryName,\n\t\t\t\trenderHeading: () => <Trans i18nKey={locizeKey}>{locizeDefaultValue}</Trans>,\n\t\t\t\trenderBody: () => <FilesTab type=\"documents\" category={categoryName} />,\n\t\t\t})),\n\t\t{\n\t\t\tpath: 'images',\n\t\t\trenderHeading: () => <Trans i18nKey=\"assets.detail.files.tabs.images\">Images</Trans>,\n\t\t\trenderBody: () => <FilesTab type=\"images\" />,\n\t\t},\n\t\t...getCustomFileCategories()\n\t\t\t.filter(({type}) => type === 'images')\n\t\t\t.map(({categoryName, locizeKey, locizeDefaultValue}) => ({\n\t\t\t\tpath: categoryName,\n\t\t\t\trenderHeading: () => <Trans i18nKey={locizeKey}>{locizeDefaultValue}</Trans>,\n\t\t\t\trenderBody: () => <FilesTab type=\"images\" category={categoryName} />,\n\t\t\t})),\n\t];\n}\n\nexport default function Files({asset, assetGroup}: Props) {\n\treturn (\n\t\t<div>\n\t\t\t<ContentHeader\n\t\t\t\ttitle={{\n\t\t\t\t\tid: 'assets.detail.files.name',\n\t\t\t\t\tdefaultValue: 'Files',\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<FilesContextProvider asset={asset} assetGroup={assetGroup}>\n\t\t\t\t<RouteTabs pages={createRouteTabs()} />\n\t\t\t</FilesContextProvider>\n\t\t</div>\n\t);\n}\n"],"names":["INITIAL_PAGINATION_SETTINGS","getColumnDefinitions","type","onFilenameClick","onDownloadFile","onDeleteFile","t","jsx","Trans","item","value","jsxs","Link","filesize","formatTimestamp","Fragment","Button","imgDownload","Icon","FilesTable","files","loading","onDownload","onDelete","useTranslation","ReactableWithClientSidePagination","useFilesByTypeAndContext","asset","assetGroup","filesApi","useMemo","createFilesApi","setLoading","useState","setFiles","useEffect","promise","cancel","makeCancelable","error","uploadFile","file","category","uploadedFile","deleteFile","fileDescriptor","fetchFile","dummyFiles","FilesContext","createContext","FilesContextProvider","children","documents","images","useFiles","useContext","previousImg","nextImg","closeImg","downloadImg","ImagePreview","contentType","content","SpinnerContainer","PreviewPortal","initialImageNumber","items","onClose","current","setCurrent","setContent","showNext","useCallback","showPrevious","cacheRef","useRef","KeyboardJS","currentDescriptor","cachedArrayBuffer","transformArrayBufferToBase64WithContentType","arrayBuffer","handleDownloadClick","saveAs","previousAvailable","nextAvailable","body","createPortal","UploadModal","fileType","onUpload","setFile","fileError","setFileError","isValid","handleSubmit","e","messageBoxError","Modal","FileUploadInput","nextFile","filterFilesByCategory","allCategories","getCustomFileCategories","categoryName","FilesTab","allFiles","uploadModalVisible","setUploadModalVisible","previewModalVisible","setPreviewModalVisible","initialPreviewImageIndex","setInitialPreviewImageIndex","confirm","useConfirm","handleDownload","handleFilenameClick","handleUploadFile","handleDelete","HasAuthorities","createRouteTabs","locizeKey","locizeDefaultValue","Files","ContentHeader","RouteTabs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Files-B7r5BhB0.js","sources":["../ng-ui-scale/src/modules/files/FilesTable.tsx","../ng-ui-scale/src/modules/files/filesContext/useFilesByTypeAndContext.ts","../ng-ui-scale/src/modules/files/filesContext/FilesContextProvider.tsx","../ng-ui-scale/src/modules/files/filesContext/useFiles.ts","../ng-ui-scale/src/assets/img/preview-arrow-left.png","../ng-ui-scale/src/assets/img/preview-arrow-right.png","../ng-ui-scale/src/assets/img/preview-close.png","../ng-ui-scale/src/assets/img/preview-download.png","../ng-ui-scale/src/modules/files/ImagePreview.tsx","../ng-ui-scale/src/modules/files/PreviewPortal.tsx","../ng-ui-scale/src/modules/files/UploadModal.tsx","../ng-ui-scale/src/modules/files/FilesTab.tsx","../ng-ui-scale/src/modules/files/Files.tsx"],"sourcesContent":["import {filesize} from 'filesize';\nimport {Link} from 'react-router-dom';\n\nimport {Button, Icon} from '@deviceinsight/ng-ui-basic-components';\nimport {\n\ttype PaginationSettings,\n\ttype ReactableColumnDef,\n\tReactableWithClientSidePagination,\n} from '@deviceinsight/ng-ui-components';\n\nimport imgDownload from 'assets/svg/icon_download.svg';\nimport {type TFunction, Trans, useTranslation} from 'i18n';\nimport {formatTimestamp} from 'utils/timestampUtils';\nimport type {FileDescriptor} from './types';\n\ntype Props = {\n\tfiles: FileDescriptor[];\n\ttype: 'documents' | 'images';\n\tloading: boolean;\n\tonFilenameClick: (file: FileDescriptor) => void;\n\tonDownload: (file: FileDescriptor) => void;\n\tonDelete: (file: FileDescriptor) => void;\n};\n\nconst INITIAL_PAGINATION_SETTINGS: PaginationSettings = {\n\tpage: 0,\n\tsize: 10,\n\tsort: {\n\t\tproperty: 'creationDate',\n\t\tdirection: 'DESC',\n\t},\n};\n\nfunction getColumnDefinitions(\n\ttype: 'documents' | 'images',\n\tonFilenameClick: (file: FileDescriptor) => void,\n\tonDownloadFile: (file: FileDescriptor) => void,\n\tonDeleteFile: (file: FileDescriptor) => void,\n\tt: TFunction,\n): ReactableColumnDef<FileDescriptor>[] {\n\treturn [\n\t\t{\n\t\t\tname: 'filename',\n\t\t\tlabel: <Trans i18nKey=\"assets.detail.files.columns.filename\">Filename</Trans>,\n\t\t\twidth: '50%',\n\t\t\tsortable: true,\n\t\t\tfilterable: {\n\t\t\t\tfilterType: 'text' as const,\n\n\t\t\t\tfilterFn(item: FileDescriptor, value: string) {\n\t\t\t\t\treturn item.filename.toLowerCase().indexOf(value.toLowerCase()) !== -1;\n\t\t\t\t},\n\t\t\t},\n\t\t\trender: (item: FileDescriptor) => (\n\t\t\t\t<Link to=\"#\" onClick={() => onFilenameClick(item)}>\n\t\t\t\t\t{item.filename}\n\t\t\t\t\t{item.context && (\n\t\t\t\t\t\t<span> [{item.context === 'svgWidget' ? 'Svg Widget' : 'Asset Image Widget'}]</span>\n\t\t\t\t\t)}\n\t\t\t\t</Link>\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname: 'size',\n\t\t\tsortable: true,\n\t\t\tlabel: <Trans i18nKey=\"assets.detail.files.columns.size\">Size</Trans>,\n\t\t\twidth: '20%',\n\t\t\trender: (item: FileDescriptor) => filesize(item.size),\n\t\t},\n\t\t{\n\t\t\tname: 'creationDate',\n\t\t\tsortable: true,\n\t\t\tlabel: <Trans i18nKey=\"assets.detail.files.columns.lastModificationDate\">Last modification date</Trans>,\n\t\t\twidth: '20%',\n\t\t\trender: (item: FileDescriptor) => formatTimestamp(new Date(item.creationDate).getTime()),\n\t\t},\n\t\t{\n\t\t\tname: 'deleteAndDownload',\n\t\t\tlabel: '',\n\t\t\talign: 'right' as const,\n\t\t\trender: (item: FileDescriptor) => (\n\t\t\t\t<>\n\t\t\t\t\t<Button onClick={() => onDownloadFile(item)} naked>\n\t\t\t\t\t\t<img src={imgDownload} alt=\"Download\" />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<span\n\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\titem.context\n\t\t\t\t\t\t\t\t? t('assets.detail.files.deleteDisabledTooltip', {\n\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Cannot be removed because is used by some {{widget}}',\n\t\t\t\t\t\t\t\t\t\twidget: item.context === 'svgWidget' ? 'Svg Widget' : 'Asset Image Widget',\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tnaked\n\t\t\t\t\t\t\tdisabled={!!item.context}\n\t\t\t\t\t\t\tonClick={() => onDeleteFile(item)}\n\t\t\t\t\t\t\tdata-testid=\"delete-file-button\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon del />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</span>\n\t\t\t\t</>\n\t\t\t),\n\t\t},\n\t];\n}\n\nexport function FilesTable({files, loading, type, onFilenameClick, onDownload, onDelete}: Props) {\n\tconst {t} = useTranslation();\n\n\treturn (\n\t\t<ReactableWithClientSidePagination\n\t\t\tcolumnDefs={getColumnDefinitions(type, onFilenameClick, onDownload, onDelete, t)}\n\t\t\tuniqueItemKey={item => item.key}\n\t\t\tpaginationSettings={INITIAL_PAGINATION_SETTINGS}\n\t\t\titems={files}\n\t\t\tisLoading={loading}\n\t\t\ttableName={'filesTable'}\n\t\t/>\n\t);\n}\n","import {useEffect, useMemo, useState} from 'react';\n\nimport type {Asset, AssetGroup} from '@deviceinsight/ng-ui-api-client';\n\nimport makeCancelable from 'utils/makeCancelable';\nimport {createFilesApi} from '../api';\nimport type {FileDescriptor} from '../types';\n\nexport type UseFilesReturnType = {\n\tloading: boolean;\n\tfiles: FileDescriptor[];\n\tuploadFile: (file: File, category: string | undefined) => void;\n\tdeleteFile: (file: FileDescriptor) => void;\n\tfetchFile: (file: FileDescriptor) => Promise<ArrayBuffer>;\n};\n\nexport function useFilesByTypeAndContext(\n\ttype: 'documents' | 'images',\n\tasset: Asset | undefined,\n\tassetGroup: AssetGroup | undefined,\n): UseFilesReturnType {\n\tconst filesApi = useMemo(() => createFilesApi(asset, assetGroup, type), [asset, assetGroup, type]);\n\tconst [loading, setLoading] = useState(false);\n\tconst [files, setFiles] = useState<FileDescriptor[]>([]);\n\n\tuseEffect(() => {\n\t\tconst {promise, cancel} = makeCancelable(filesApi.fetchFiles());\n\t\tpromise\n\t\t\t.then(files => {\n\t\t\t\tsetFiles(files);\n\t\t\t\tsetLoading(false);\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tif (!error.isCanceled) {\n\t\t\t\t\tsetLoading(false);\n\t\t\t\t}\n\t\t\t});\n\t\treturn cancel;\n\t}, [filesApi]);\n\n\tasync function uploadFile(file: File, category: string | undefined) {\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tconst uploadedFile = await filesApi.uploadFile(file, category);\n\t\t\tsetFiles([...files, uploadedFile]);\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}\n\n\tasync function deleteFile(file: FileDescriptor) {\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tawait filesApi.deleteFile(file.key);\n\t\t\tsetFiles(files.filter(fileDescriptor => fileDescriptor.key !== file.key));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}\n\n\tfunction fetchFile(file: FileDescriptor): Promise<ArrayBuffer> {\n\t\treturn filesApi.fetchFile(file.key);\n\t}\n\n\treturn {\n\t\tloading,\n\t\tfiles,\n\t\tuploadFile,\n\t\tdeleteFile,\n\t\tfetchFile,\n\t};\n}\n","import {createContext, type PropsWithChildren} from 'react';\n\nimport type {Asset, AssetGroup} from '@deviceinsight/ng-ui-api-client';\n\nimport {type UseFilesReturnType, useFilesByTypeAndContext} from './useFilesByTypeAndContext';\n\ntype ApiContextType = {\n\tdocuments: UseFilesReturnType;\n\timages: UseFilesReturnType;\n};\n\nconst dummyFiles: UseFilesReturnType = {\n\tdeleteFile: () => {},\n\tfiles: [],\n\tuploadFile: () => {},\n\tfetchFile: () => Promise.resolve(new ArrayBuffer(0)),\n\tloading: false,\n};\n\nexport const FilesContext = createContext<ApiContextType>({\n\tdocuments: dummyFiles,\n\timages: dummyFiles,\n});\n\ntype Props = {\n\tasset?: Asset;\n\tassetGroup?: AssetGroup;\n};\n\nexport function FilesContextProvider({asset, assetGroup, children}: PropsWithChildren<Props>) {\n\tconst documents = useFilesByTypeAndContext('documents', asset, assetGroup);\n\tconst images = useFilesByTypeAndContext('images', asset, assetGroup);\n\n\treturn <FilesContext.Provider value={{documents, images}}>{children}</FilesContext.Provider>;\n}\n","import {useContext} from 'react';\n\nimport {FilesContext} from './FilesContextProvider';\nimport type {UseFilesReturnType} from './useFilesByTypeAndContext';\n\nexport function useFiles(type: 'documents' | 'images'): UseFilesReturnType {\n\tconst {documents, images} = useContext(FilesContext);\n\tif (type === 'documents') return documents;\n\telse return images;\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAnCAYAAADtu3N3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCCsYE1yvpwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAFTSURBVEjHrdY9S5BhFAbgNykUKUIRE10kGxxsUgQXF2lLGppsCTcdGhprCZxqcNCxKRp0EcTJpaWGwBaDhpCIoJZECIQkTOty8Ajvfs7zAy44D/f5aJrkQweGmgLoEtZxioEs9sL5+4CODLQY0DfcyECzUdovjGagCfzGMaYz0DB+4j/mMlAPPsc/PclAnXgX0MuKLME2LldkaRdXM9BCQN8xmIHuRpYOMZaBxiNLfzFTkSV4WJWlZ9ksvQ3oVTZLawG9wZUM9jygT7iegYYCOsVIxQy/6LvXFbO8F3sBLlWAN7Ef4HwFOIkjnOBOBXgP/6Inb1eAj6LcH1ULdjnAj7hWEZmNkgkbYBfep2d/C+zDlwCfVoC3cBD78kEFOIU/6U3eAu9HBnM3Rgt8XHL9tMCV1l3WXZHBzQC3UodegN3YCXC1otx+fA2wpIeHsdA0TXMGpWMqV6FcS+MAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAnCAYAAAACeRhJAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCCwH0RU0lQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAFISURBVEjHrdaxS9VhFAZgja43JUy4uETocBsjwSXvLLnYEjQn4pKb4B6I08XJ1SXK6bo4Oogt3T0QHXTLJMGWFDFI83HwDM7f+Z0/4OF7h++8pwfD6O/JDn5gD0NZaM3dfEVfBqphJ7D17KueRDxYzmIj+BXYXBYbxwWuMJXFpnGNc4xlsQ8R8RjPslg7sF0MZqBedALbRi2D1fEtsE/ZiA0cBPYxizVxGtj7LPYKl/iHySz2Fv/xBy+y2EJEPMLTLLYa2Hc8zkAPsBnYFh5msIF72+JNBloM5CeGS5F3uMEZXpYiLfyNnfW6FHmO3xFpNvPnDgNZKkUeoRvIl8xe2rjXfbVSaCWQ/eI2xnwgJxjNtskFxrP9do3pKhp3vooboF3FVdJBbyn0OZAu6qXIUiAHaJQiM4GcoplZUCdRMxNVVEwre9TeAsA6JS24jJJMAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAfCAYAAADwbH0HAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCDQxnLQ5VQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAGASURBVEjHvde3UgMxEIBhAUNBdoKCHEo/Aa9BCwWtXw7GBRVDGPKAzzahIaeKmhp+CmSP5izJF/a8rXb3mztJJ51SRgB9qkfRb6AVpdQWMCiNANPANlAKD1SAX/6jKolr9F73bgKF1sCGgSKJh9BWBEBOAbPAE52RCtfog6XvLjDUSpoDnqVwD7rXRo3keeAlLQ7MONB9YNhVlArX6KOl/sCJGsULwGtc3IMedkWNJovAW1Tcgx4BI3EXSCTcgx4Do0m3xBLw7sI96Eli1MCXgQ9L8x0HegqMSX32XHg4zsRQA18BPj3oOTCeyVEGrDrQ746TRxAtATeeJ66KH6kavY4wx3I4UHSgl8BXJrhGm66FBJTFcaAANCxNL8zVK4pHRUVxjdYdczrhqUuOA/kkaCpco4Gl6ArIxZim6LhGa5bkWhw0Fg7kHGgA5FNsRT8OrFnu1fU0aBf81rzUbwI/eqDRHpD58pn4HTAZTljXr7yYwQFT1tfbKVfCQK/+Fv8AJCO91qtSsKIAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCDYA/1xb7QAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAADlSURBVEjH7dW/CsIwEAbw7ySDjyFOujgJ4jMU3AWp7eJLCE7+2ZzENxB8GmdHV0FBN5f6uVQMIW0aCk45KLSX3I9LCI3AEiRHAGYoj4WInMykKpjcBhA5wJ0t2XAULQF0jedQVqAc4FVEzsZ2PMoKXB16RwADGMAA/gdUJFsAJkZ+WKF2TLKvfWcA9kpELiSbAOaezcTa+xtAKiJP/U+84i+2JBOSHcsFNsjHjvncjGSMgtvui95I9opaIxmRfOXYtHQdLtQL04rWNtTAEq8dN9FamIZucvSuYWmtg6qh9TFj+ZWwD7+x6apgNh+aAAAAAElFTkSuQmCC\"","import {SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\n\ntype Props = {\n\tloading: boolean;\n\tcontent: string | undefined;\n\tcontentType: string;\n};\n\nexport const ImagePreview = ({contentType, loading, content}: Props) => (\n\t<div className=\"image-preview\">\n\t\t<SpinnerContainer show={loading}>\n\t\t\t{contentType === 'image/svg+xml' && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"svg-preview\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackgroundImage: `url(\"${loading || !content ? '' : content}\")`,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{contentType !== 'image/svg+xml' && <img src={content} alt=\"\" />}\n\t\t</SpinnerContainer>\n\t</div>\n);\n","import {saveAs} from 'file-saver';\nimport KeyboardJS from 'keyboardjs';\nimport {useCallback, useEffect, useRef, useState} from 'react';\nimport {createPortal} from 'react-dom';\n\nimport previousImg from 'assets/img/preview-arrow-left.png';\nimport nextImg from 'assets/img/preview-arrow-right.png';\nimport closeImg from 'assets/img/preview-close.png';\nimport downloadImg from 'assets/img/preview-download.png';\nimport {ImagePreview} from './ImagePreview';\nimport './PreviewPortal.scss';\n\nimport type {FileDescriptor} from './types';\nimport {transformArrayBufferToBase64WithContentType} from './utils';\n\ntype Props = {\n\tinitialImageNumber: number;\n\titems: FileDescriptor[];\n\tonDownload: (file: FileDescriptor) => Promise<ArrayBuffer>;\n\tonClose: () => void;\n};\n\nexport const PreviewPortal = ({initialImageNumber, items, onDownload, onClose}: Props) => {\n\tconst [current, setCurrent] = useState(initialImageNumber);\n\tconst [content, setContent] = useState<string | undefined>();\n\tconst [loading, setLoading] = useState(false);\n\n\tconst showNext = useCallback(() => setCurrent(current => Math.min(items.length - 1, current + 1)), [items]);\n\tconst showPrevious = useCallback(() => setCurrent(current => Math.max(0, current - 1)), []);\n\tconst cacheRef = useRef<Record<string, any>>({});\n\n\tuseEffect(() => {\n\t\tKeyboardJS.addListener('right', showNext);\n\t\tKeyboardJS.addListener('left', showPrevious);\n\t\tKeyboardJS.addListener('esc', onClose);\n\t\treturn () => {\n\t\t\tKeyboardJS.removeListener('right', showNext);\n\t\t\tKeyboardJS.removeListener('left', showPrevious);\n\t\t\tKeyboardJS.removeListener('esc', onClose);\n\t\t};\n\t}, [showNext, showPrevious, onClose]);\n\tconst currentDescriptor = items[current];\n\n\tuseEffect(() => {\n\t\tconst cachedArrayBuffer = cacheRef.current[currentDescriptor.key];\n\n\t\tif (cachedArrayBuffer) {\n\t\t\tsetContent(transformArrayBufferToBase64WithContentType(currentDescriptor.contentType, cachedArrayBuffer));\n\t\t} else {\n\t\t\tsetLoading(true);\n\t\t\tonDownload(currentDescriptor).then((arrayBuffer: ArrayBuffer) => {\n\t\t\t\tsetLoading(false);\n\t\t\t\tcacheRef.current[currentDescriptor.key] = arrayBuffer;\n\t\t\t\tsetContent(transformArrayBufferToBase64WithContentType(currentDescriptor.contentType, arrayBuffer));\n\t\t\t});\n\t\t}\n\t}, [currentDescriptor, onDownload]);\n\n\tconst handleDownloadClick = () => {\n\t\tsaveAs(new Blob([cacheRef.current[currentDescriptor.key]]), currentDescriptor.filename);\n\t};\n\n\tconst previousAvailable = items.length > 0 && current > 0;\n\tconst nextAvailable = items.length > 0 && current < items.length - 1;\n\tconst {body} = document;\n\n\tif (!body) {\n\t\treturn null;\n\t}\n\n\treturn createPortal(\n\t\t<div className=\"di file-previewer\">\n\t\t\t<div className=\"background\" />\n\t\t\t<div className=\"header\">\n\t\t\t\t<h1 className=\"filename\">{currentDescriptor.filename}</h1>\n\t\t\t\t<button className=\"btn close\" onClick={onClose}>\n\t\t\t\t\t<span role=\"img\" aria-label=\"close\">\n\t\t\t\t\t\t<img src={closeImg} alt=\"close\" />\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div className=\"content\">\n\t\t\t\t<div className=\"left\">\n\t\t\t\t\t{previousAvailable && (\n\t\t\t\t\t\t<button className=\"btn previous\" onClick={showPrevious}>\n\t\t\t\t\t\t\t<span role=\"img\" aria-label=\"previous\">\n\t\t\t\t\t\t\t\t<img src={previousImg} alt=\"previous\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"center\">\n\t\t\t\t\t<ImagePreview loading={loading} content={content} contentType={currentDescriptor.contentType} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"right\">\n\t\t\t\t\t{nextAvailable && (\n\t\t\t\t\t\t<button className=\"btn next\" onClick={showNext}>\n\t\t\t\t\t\t\t<span role=\"img\" aria-label=\"next\">\n\t\t\t\t\t\t\t\t<img src={nextImg} alt=\"next\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"footer\">\n\t\t\t\t<button className=\"btn download\" onClick={handleDownloadClick} disabled={loading}>\n\t\t\t\t\t<span role=\"img\" aria-label=\"close\">\n\t\t\t\t\t\t<img src={downloadImg} alt=\"download\" />\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>,\n\t\tbody,\n\t);\n};\n","import {useState} from 'react';\n\nimport {Button, Modal, SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\nimport {messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport {FileUploadInput} from 'components/inputs/FileUploadInput';\nimport {Trans, useTranslation} from 'i18n';\n\ntype Props = {\n\tfileType: 'documents' | 'images';\n\tonClose: () => void;\n\tonUpload: (file: File, type: 'documents' | 'images') => any;\n};\n\nexport const UploadModal = ({fileType, onClose, onUpload}: Props) => {\n\tconst {t} = useTranslation();\n\tconst [file, setFile] = useState<File | null | undefined>(null);\n\tconst [fileError, setFileError] = useState<string>('');\n\tconst [loading, setLoading] = useState<boolean>(false);\n\tconst isValid = file && !fileError;\n\n\tconst handleSubmit = async (file: File | null | undefined) => {\n\t\tif (!file) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetLoading(true);\n\n\t\ttry {\n\t\t\tawait onUpload(file, fileType);\n\t\t\tonClose();\n\t\t} catch (e: any) {\n\t\t\tmessageBoxError(e.message);\n\t\t\tconsole.error(e);\n\t\t\tsetLoading(false);\n\t\t}\n\t};\n\tconst handleSetFile = (nextFile: File | null | undefined) => {\n\t\tsetFile(nextFile);\n\n\t\tif (!nextFile) {\n\t\t\tsetFileError(\n\t\t\t\tt('assets.detail.files.uploadForm.error.missingFile', {\n\t\t\t\t\tdefaultValue: 'Please select a file',\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tsetFileError('');\n\t\t}\n\t};\n\n\treturn (\n\t\t<Modal\n\t\t\twidth={450}\n\t\t\theader={\n\t\t\t\tfileType === 'documents' ? (\n\t\t\t\t\t<Trans i18nKey=\"assets.detail.files.uploadForm.addDocument\">Add document</Trans>\n\t\t\t\t) : (\n\t\t\t\t\t<Trans i18nKey=\"assets.detail.files.uploadForm.addImage\">Add image</Trans>\n\t\t\t\t)\n\t\t\t}\n\t\t\tcontent={\n\t\t\t\t<SpinnerContainer show={loading}>\n\t\t\t\t\t<FileUploadInput\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"assets.detail.files.uploadForm.fileLabel\">File to upload</Trans>}\n\t\t\t\t\t\tonChange={handleSetFile}\n\t\t\t\t\t\timagesOnly={fileType === 'images'}\n\t\t\t\t\t\terror={fileError}\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\t\t\t\t</SpinnerContainer>\n\t\t\t}\n\t\t\tfooter={\n\t\t\t\t<>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={() => handleSubmit(file)}\n\t\t\t\t\t\tprimary\n\t\t\t\t\t\tdisabled={!isValid || loading}\n\t\t\t\t\t\tdata-testid=\"save-button\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trans i18nKey=\"general.actions.save\">Save</Trans>\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button onClick={onClose}>\n\t\t\t\t\t\t<Trans i18nKey=\"general.actions.cancel\">Cancel</Trans>\n\t\t\t\t\t</Button>\n\t\t\t\t</>\n\t\t\t}\n\t\t/>\n\t);\n};\n","import {saveAs} from 'file-saver';\nimport {useMemo, useState} from 'react';\n\nimport {Button, Icon, useConfirm} from '@deviceinsight/ng-ui-basic-components';\nimport {messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport {HasAuthorities} from 'components/auth/HasAuthorities';\nimport {getCustomFileCategories} from 'customization/customFileCategories';\nimport {Trans, useTranslation} from 'i18n';\nimport {FilesTable} from './FilesTable';\nimport {useFiles} from './filesContext/useFiles';\nimport {PreviewPortal} from './PreviewPortal';\nimport type {FileDescriptor} from './types';\nimport {UploadModal} from './UploadModal';\n\ntype Props = {\n\ttype: 'documents' | 'images';\n\tcategory?: string | undefined;\n};\n\nfunction filterFilesByCategory(files: FileDescriptor[], category: string | undefined): FileDescriptor[] {\n\tconst allCategories = getCustomFileCategories().map(({categoryName}) => categoryName);\n\tif (category && allCategories.includes(category)) {\n\t\treturn files.filter(fileDescriptor => fileDescriptor.category === category);\n\t} else {\n\t\treturn files.filter(\n\t\t\tfileDescriptor => !fileDescriptor.category || !allCategories.includes(fileDescriptor.category),\n\t\t);\n\t}\n}\n\nexport function FilesTab({type, category}: Props) {\n\tconst {loading, files: allFiles, uploadFile, deleteFile, fetchFile} = useFiles(type);\n\tconst files = useMemo(() => filterFilesByCategory(allFiles, category), [allFiles, category]);\n\tconst [uploadModalVisible, setUploadModalVisible] = useState(false);\n\tconst [previewModalVisible, setPreviewModalVisible] = useState(false);\n\tconst [initialPreviewImageIndex, setInitialPreviewImageIndex] = useState<number>(0);\n\tconst {t} = useTranslation();\n\tconst confirm = useConfirm();\n\n\tasync function handleDownload(file: FileDescriptor) {\n\t\tconst arrayBuffer = await fetchFile(file);\n\t\tsaveAs(new Blob([arrayBuffer]), file.filename);\n\t}\n\n\tfunction handleFilenameClick(file: FileDescriptor) {\n\t\tif (type === 'images') {\n\t\t\tsetInitialPreviewImageIndex(files.indexOf(file));\n\t\t\tsetPreviewModalVisible(true);\n\t\t} else {\n\t\t\thandleDownload(file);\n\t\t}\n\t}\n\n\tasync function handleUploadFile(file: File) {\n\t\ttry {\n\t\t\tawait uploadFile(file, category);\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\tmessageBoxError(<Trans i18nKey=\"files.error.unknown\">Operation failed</Trans>);\n\t\t}\n\t}\n\n\tasync function handleDelete(file: FileDescriptor) {\n\t\tconst confirmed = await confirm({\n\t\t\ttitle: t('assets.detail.files.deleteConfirmTitle', {defaultValue: 'Delete File'}),\n\t\t\tmessage: t('assets.detail.files.deleteConfirmMessage', {\n\t\t\t\tdefaultValue: 'Do you really want to delete this file?',\n\t\t\t}),\n\t\t});\n\n\t\tif (confirmed) {\n\t\t\tawait deleteFile(file);\n\t\t}\n\t}\n\n\treturn (\n\t\t<div>\n\t\t\t<FilesTable\n\t\t\t\tfiles={files}\n\t\t\t\tloading={loading}\n\t\t\t\ttype={type}\n\t\t\t\tonDownload={handleDownload}\n\t\t\t\tonFilenameClick={handleFilenameClick}\n\t\t\t\tonDelete={handleDelete}\n\t\t\t/>\n\t\t\t<HasAuthorities authorities={['WRITE_ASSET_OR_ASSET_GROUP_FILE'] as string[]}>\n\t\t\t\t<Button onClick={() => setUploadModalVisible(true)} data-testid=\"add-file-button\">\n\t\t\t\t\t<Icon add />\n\t\t\t\t\t{type === 'images' && <Trans i18nKey=\"assets.detail.files.addImage\">Add image</Trans>}\n\t\t\t\t\t{type === 'documents' && <Trans i18nKey=\"assets.detail.files.addFile\">Add file</Trans>}\n\t\t\t\t</Button>\n\t\t\t</HasAuthorities>\n\t\t\t{uploadModalVisible && (\n\t\t\t\t<UploadModal fileType={type} onClose={() => setUploadModalVisible(false)} onUpload={handleUploadFile} />\n\t\t\t)}\n\t\t\t{previewModalVisible && (\n\t\t\t\t<PreviewPortal\n\t\t\t\t\tinitialImageNumber={initialPreviewImageIndex}\n\t\t\t\t\titems={files}\n\t\t\t\t\tonDownload={fetchFile}\n\t\t\t\t\tonClose={() => setPreviewModalVisible(false)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type {Asset, AssetGroup} from '@deviceinsight/ng-ui-api-client';\nimport {ContentHeader, RouteTabs} from '@deviceinsight/ng-ui-components';\n\nimport {getCustomFileCategories} from 'customization/customFileCategories';\nimport {Trans} from 'i18n';\nimport {FilesTab} from './FilesTab';\nimport {FilesContextProvider} from './filesContext/FilesContextProvider';\n\ntype Props = {\n\tasset?: Asset;\n\tassetGroup?: AssetGroup;\n};\n\nfunction createRouteTabs() {\n\treturn [\n\t\t{\n\t\t\tpath: 'documents',\n\t\t\trenderHeading: () => <Trans i18nKey=\"assets.detail.files.tabs.documents\">Documents</Trans>,\n\t\t\trenderBody: () => <FilesTab type=\"documents\" />,\n\t\t},\n\t\t...getCustomFileCategories()\n\t\t\t.filter(({type}) => type === 'documents')\n\t\t\t.map(({categoryName, locizeKey, locizeDefaultValue}) => ({\n\t\t\t\tpath: categoryName,\n\t\t\t\trenderHeading: () => <Trans i18nKey={locizeKey}>{locizeDefaultValue}</Trans>,\n\t\t\t\trenderBody: () => <FilesTab type=\"documents\" category={categoryName} />,\n\t\t\t})),\n\t\t{\n\t\t\tpath: 'images',\n\t\t\trenderHeading: () => <Trans i18nKey=\"assets.detail.files.tabs.images\">Images</Trans>,\n\t\t\trenderBody: () => <FilesTab type=\"images\" />,\n\t\t},\n\t\t...getCustomFileCategories()\n\t\t\t.filter(({type}) => type === 'images')\n\t\t\t.map(({categoryName, locizeKey, locizeDefaultValue}) => ({\n\t\t\t\tpath: categoryName,\n\t\t\t\trenderHeading: () => <Trans i18nKey={locizeKey}>{locizeDefaultValue}</Trans>,\n\t\t\t\trenderBody: () => <FilesTab type=\"images\" category={categoryName} />,\n\t\t\t})),\n\t];\n}\n\nexport default function Files({asset, assetGroup}: Props) {\n\treturn (\n\t\t<div>\n\t\t\t<ContentHeader\n\t\t\t\ttitle={{\n\t\t\t\t\tid: 'assets.detail.files.name',\n\t\t\t\t\tdefaultValue: 'Files',\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<FilesContextProvider asset={asset} assetGroup={assetGroup}>\n\t\t\t\t<RouteTabs pages={createRouteTabs()} />\n\t\t\t</FilesContextProvider>\n\t\t</div>\n\t);\n}\n"],"names":["INITIAL_PAGINATION_SETTINGS","getColumnDefinitions","type","onFilenameClick","onDownloadFile","onDeleteFile","t","jsx","Trans","item","value","jsxs","Link","filesize","formatTimestamp","Fragment","Button","imgDownload","Icon","FilesTable","files","loading","onDownload","onDelete","useTranslation","ReactableWithClientSidePagination","useFilesByTypeAndContext","asset","assetGroup","filesApi","useMemo","createFilesApi","setLoading","useState","setFiles","useEffect","promise","cancel","makeCancelable","error","uploadFile","file","category","uploadedFile","deleteFile","fileDescriptor","fetchFile","dummyFiles","FilesContext","createContext","FilesContextProvider","children","documents","images","useFiles","useContext","previousImg","nextImg","closeImg","downloadImg","ImagePreview","contentType","content","SpinnerContainer","PreviewPortal","initialImageNumber","items","onClose","current","setCurrent","setContent","showNext","useCallback","showPrevious","cacheRef","useRef","KeyboardJS","currentDescriptor","cachedArrayBuffer","transformArrayBufferToBase64WithContentType","arrayBuffer","handleDownloadClick","saveAs","previousAvailable","nextAvailable","body","createPortal","UploadModal","fileType","onUpload","setFile","fileError","setFileError","isValid","handleSubmit","e","messageBoxError","Modal","FileUploadInput","nextFile","filterFilesByCategory","allCategories","getCustomFileCategories","categoryName","FilesTab","allFiles","uploadModalVisible","setUploadModalVisible","previewModalVisible","setPreviewModalVisible","initialPreviewImageIndex","setInitialPreviewImageIndex","confirm","useConfirm","handleDownload","handleFilenameClick","handleUploadFile","handleDelete","HasAuthorities","createRouteTabs","locizeKey","locizeDefaultValue","Files","ContentHeader","RouteTabs"],"mappings":";;;;;;;;;;;;;AAwBA,MAAMA,KAAkD;AAAA,EACvD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,IACL,UAAU;AAAA,IACV,WAAW;AAAA,EAAA;AAEb;AAEA,SAASC,GACRC,GACAC,GACAC,GACAC,GACAC,GACuC;AACvC,SAAO;AAAA,IACN;AAAA,MACC,MAAM;AAAA,MACN,OAAO,gBAAAC,EAACC,GAAA,EAAM,SAAQ,wCAAuC,UAAA,YAAQ;AAAA,MACrE,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,QACX,YAAY;AAAA,QAEZ,SAASC,GAAsBC,GAAe;AAC7C,iBAAOD,EAAK,SAAS,YAAA,EAAc,QAAQC,EAAM,YAAA,CAAa,MAAM;AAAA,QACrE;AAAA,MAAA;AAAA,MAED,QAAQ,CAACD,MACR,gBAAAE,EAACC,IAAA,EAAK,IAAG,KAAI,SAAS,MAAMT,EAAgBM,CAAI,GAC9C,UAAA;AAAA,QAAAA,EAAK;AAAA,QACLA,EAAK,WACL,gBAAAE,EAAC,QAAA,EAAK,UAAA;AAAA,UAAA;AAAA,UAAGF,EAAK,YAAY,cAAc,eAAe;AAAA,UAAqB;AAAA,QAAA,EAAA,CAAC;AAAA,MAAA,EAAA,CAE/E;AAAA,IAAA;AAAA,IAGF;AAAA,MACC,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO,gBAAAF,EAACC,GAAA,EAAM,SAAQ,oCAAmC,UAAA,QAAI;AAAA,MAC7D,OAAO;AAAA,MACP,QAAQ,CAACC,MAAyBI,GAASJ,EAAK,IAAI;AAAA,IAAA;AAAA,IAErD;AAAA,MACC,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO,gBAAAF,EAACC,GAAA,EAAM,SAAQ,oDAAmD,UAAA,0BAAsB;AAAA,MAC/F,OAAO;AAAA,MACP,QAAQ,CAACC,MAAyBK,EAAgB,IAAI,KAAKL,EAAK,YAAY,EAAE,QAAA,CAAS;AAAA,IAAA;AAAA,IAExF;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAACA,MACR,gBAAAE,EAAAI,GAAA,EACC,UAAA;AAAA,QAAA,gBAAAR,EAACS,GAAA,EAAO,SAAS,MAAMZ,EAAeK,CAAI,GAAG,OAAK,IACjD,UAAA,gBAAAF,EAAC,OAAA,EAAI,KAAKU,GAAa,KAAI,YAAW,GACvC;AAAA,QACA,gBAAAV;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,OACCE,EAAK,UACFH,EAAE,6CAA6C;AAAA,cAC/C,cAAc;AAAA,cACd,QAAQG,EAAK,YAAY,cAAc,eAAe;AAAA,YAAA,CACtD,IACA;AAAA,YAGJ,UAAA,gBAAAF;AAAA,cAACS;AAAA,cAAA;AAAA,gBACA,OAAK;AAAA,gBACL,UAAU,CAAC,CAACP,EAAK;AAAA,gBACjB,SAAS,MAAMJ,EAAaI,CAAI;AAAA,gBAChC,eAAY;AAAA,gBAEZ,UAAA,gBAAAF,EAACW,GAAA,EAAK,KAAG,GAAA,CAAC;AAAA,cAAA;AAAA,YAAA;AAAA,UACX;AAAA,QAAA;AAAA,MACD,EAAA,CACD;AAAA,IAAA;AAAA,EAEF;AAEF;AAEO,SAASC,GAAW,EAAC,OAAAC,GAAO,SAAAC,GAAS,MAAAnB,GAAM,iBAAAC,GAAiB,YAAAmB,GAAY,UAAAC,KAAkB;AAChG,QAAM,EAAC,GAAAjB,EAAA,IAAKkB,EAAA;AAEZ,SACC,gBAAAjB;AAAA,IAACkB;AAAA,IAAA;AAAA,MACA,YAAYxB,GAAqBC,GAAMC,GAAiBmB,GAAYC,GAAUjB,CAAC;AAAA,MAC/E,eAAe,OAAQG,EAAK;AAAA,MAC5B,oBAAoBT;AAAA,MACpB,OAAOoB;AAAA,MACP,WAAWC;AAAA,MACX,WAAW;AAAA,IAAA;AAAA,EAAA;AAGd;AC3GO,SAASK,EACfxB,GACAyB,GACAC,GACqB;AACrB,QAAMC,IAAWC,EAAQ,MAAMC,EAAeJ,GAAOC,GAAY1B,CAAI,GAAG,CAACyB,GAAOC,GAAY1B,CAAI,CAAC,GAC3F,CAACmB,GAASW,CAAU,IAAIC,EAAS,EAAK,GACtC,CAACb,GAAOc,CAAQ,IAAID,EAA2B,CAAA,CAAE;AAEvD,EAAAE,EAAU,MAAM;AACf,UAAM,EAAC,SAAAC,GAAS,QAAAC,EAAA,IAAUC,EAAeT,EAAS,YAAY;AAC9D,WAAAO,EACE,KAAK,CAAAhB,MAAS;AACd,MAAAc,EAASd,CAAK,GACdY,EAAW,EAAK;AAAA,IACjB,CAAC,EACA,MAAM,CAAAO,MAAS;AACf,MAAKA,EAAM,cACVP,EAAW,EAAK;AAAA,IAElB,CAAC,GACKK;AAAA,EACR,GAAG,CAACR,CAAQ,CAAC;AAEb,iBAAeW,EAAWC,GAAYC,GAA8B;AACnE,IAAAV,EAAW,EAAI;AACf,QAAI;AACH,YAAMW,IAAe,MAAMd,EAAS,WAAWY,GAAMC,CAAQ;AAC7D,MAAAR,EAAS,CAAC,GAAGd,GAAOuB,CAAY,CAAC;AAAA,IAClC,UAAA;AACC,MAAAX,EAAW,EAAK;AAAA,IACjB;AAAA,EACD;AAEA,iBAAeY,EAAWH,GAAsB;AAC/C,IAAAT,EAAW,EAAI;AACf,QAAI;AACH,YAAMH,EAAS,WAAWY,EAAK,GAAG,GAClCP,EAASd,EAAM,OAAO,CAAAyB,MAAkBA,EAAe,QAAQJ,EAAK,GAAG,CAAC;AAAA,IACzE,UAAA;AACC,MAAAT,EAAW,EAAK;AAAA,IACjB;AAAA,EACD;AAEA,WAASc,EAAUL,GAA4C;AAC9D,WAAOZ,EAAS,UAAUY,EAAK,GAAG;AAAA,EACnC;AAEA,SAAO;AAAA,IACN,SAAApB;AAAA,IACA,OAAAD;AAAA,IACA,YAAAoB;AAAA,IACA,YAAAI;AAAA,IACA,WAAAE;AAAA,EAAA;AAEF;AC5DA,MAAMC,IAAiC;AAAA,EACtC,YAAY,MAAM;AAAA,EAAC;AAAA,EACnB,OAAO,CAAA;AAAA,EACP,YAAY,MAAM;AAAA,EAAC;AAAA,EACnB,WAAW,MAAM,QAAQ,QAAQ,IAAI,YAAY,CAAC,CAAC;AAAA,EACnD,SAAS;AACV,GAEaC,IAAeC,EAA8B;AAAA,EACzD,WAAWF;AAAA,EACX,QAAQA;AACT,CAAC;AAOM,SAASG,GAAqB,EAAC,OAAAvB,GAAO,YAAAC,GAAY,UAAAuB,KAAqC;AAC7F,QAAMC,IAAY1B,EAAyB,aAAaC,GAAOC,CAAU,GACnEyB,IAAS3B,EAAyB,UAAUC,GAAOC,CAAU;AAEnE,SAAO,gBAAArB,EAACyC,EAAa,UAAb,EAAsB,OAAO,EAAC,WAAAI,GAAW,QAAAC,KAAU,UAAAF,GAAS;AACrE;AC7BO,SAASG,GAASpD,GAAkD;AAC1E,QAAM,EAAC,WAAAkD,GAAW,QAAAC,MAAUE,EAAWP,CAAY;AACnD,SAAI9C,MAAS,cAAoBkD,IACrBC;AACb;ACTA,MAAAG,KAAe,0qBCAfC,KAAe,0pBCAfC,KAAe,suBCAfC,KAAe,shBCQFC,KAAe,CAAC,EAAC,aAAAC,GAAa,SAAAxC,GAAS,SAAAyC,EAAA,MACnD,gBAAAvD,EAAC,OAAA,EAAI,WAAU,iBACd,UAAA,gBAAAI,EAACoD,GAAA,EAAiB,MAAM1C,GACtB,UAAA;AAAA,EAAAwC,MAAgB,mBAChB,gBAAAtD;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,WAAU;AAAA,MACV,OAAO;AAAA,QACN,iBAAiB,QAAQc,KAAW,CAACyC,IAAU,KAAKA,CAAO;AAAA,MAAA;AAAA,IAC5D;AAAA,EAAA;AAAA,EAGDD,MAAgB,mBAAmB,gBAAAtD,EAAC,SAAI,KAAKuD,GAAS,KAAI,GAAA,CAAG;AAAA,EAAA,CAC/D,EAAA,CACD,GCCYE,KAAgB,CAAC,EAAC,oBAAAC,GAAoB,OAAAC,GAAO,YAAA5C,GAAY,SAAA6C,QAAoB;AACzF,QAAM,CAACC,GAASC,CAAU,IAAIpC,EAASgC,CAAkB,GACnD,CAACH,GAASQ,CAAU,IAAIrC,EAAA,GACxB,CAACZ,GAASW,CAAU,IAAIC,EAAS,EAAK,GAEtCsC,IAAWC,EAAY,MAAMH,EAAW,CAAAD,MAAW,KAAK,IAAIF,EAAM,SAAS,GAAGE,IAAU,CAAC,CAAC,GAAG,CAACF,CAAK,CAAC,GACpGO,IAAeD,EAAY,MAAMH,EAAW,CAAAD,MAAW,KAAK,IAAI,GAAGA,IAAU,CAAC,CAAC,GAAG,CAAA,CAAE,GACpFM,IAAWC,EAA4B,EAAE;AAE/C,EAAAxC,EAAU,OACTyC,EAAW,YAAY,SAASL,CAAQ,GACxCK,EAAW,YAAY,QAAQH,CAAY,GAC3CG,EAAW,YAAY,OAAOT,CAAO,GAC9B,MAAM;AACZ,IAAAS,EAAW,eAAe,SAASL,CAAQ,GAC3CK,EAAW,eAAe,QAAQH,CAAY,GAC9CG,EAAW,eAAe,OAAOT,CAAO;AAAA,EACzC,IACE,CAACI,GAAUE,GAAcN,CAAO,CAAC;AACpC,QAAMU,IAAoBX,EAAME,CAAO;AAEvC,EAAAjC,EAAU,MAAM;AACf,UAAM2C,IAAoBJ,EAAS,QAAQG,EAAkB,GAAG;AAEhE,IAAIC,IACHR,EAAWS,EAA4CF,EAAkB,aAAaC,CAAiB,CAAC,KAExG9C,EAAW,EAAI,GACfV,EAAWuD,CAAiB,EAAE,KAAK,CAACG,MAA6B;AAChE,MAAAhD,EAAW,EAAK,GAChB0C,EAAS,QAAQG,EAAkB,GAAG,IAAIG,GAC1CV,EAAWS,EAA4CF,EAAkB,aAAaG,CAAW,CAAC;AAAA,IACnG,CAAC;AAAA,EAEH,GAAG,CAACH,GAAmBvD,CAAU,CAAC;AAElC,QAAM2D,IAAsB,MAAM;AACjC,IAAAC,EAAO,IAAI,KAAK,CAACR,EAAS,QAAQG,EAAkB,GAAG,CAAC,CAAC,GAAGA,EAAkB,QAAQ;AAAA,EACvF,GAEMM,IAAoBjB,EAAM,SAAS,KAAKE,IAAU,GAClDgB,IAAgBlB,EAAM,SAAS,KAAKE,IAAUF,EAAM,SAAS,GAC7D,EAAC,MAAAmB,MAAQ;AAEf,SAAKA,IAIEC;AAAA,IACN,gBAAA3E,EAAC,OAAA,EAAI,WAAU,qBACd,UAAA;AAAA,MAAA,gBAAAJ,EAAC,OAAA,EAAI,WAAU,aAAA,CAAa;AAAA,MAC5B,gBAAAI,EAAC,OAAA,EAAI,WAAU,UACd,UAAA;AAAA,QAAA,gBAAAJ,EAAC,MAAA,EAAG,WAAU,YAAY,UAAAsE,EAAkB,UAAS;AAAA,0BACpD,UAAA,EAAO,WAAU,aAAY,SAASV,GACtC,4BAAC,QAAA,EAAK,MAAK,OAAM,cAAW,SAC3B,4BAAC,OAAA,EAAI,KAAKT,IAAU,KAAI,QAAA,CAAQ,GACjC,EAAA,CACD;AAAA,MAAA,GACD;AAAA,MACA,gBAAA/C,EAAC,OAAA,EAAI,WAAU,WACd,UAAA;AAAA,QAAA,gBAAAJ,EAAC,OAAA,EAAI,WAAU,QACb,UAAA4E,KACA,gBAAA5E,EAAC,YAAO,WAAU,gBAAe,SAASkE,GACzC,UAAA,gBAAAlE,EAAC,QAAA,EAAK,MAAK,OAAM,cAAW,YAC3B,UAAA,gBAAAA,EAAC,OAAA,EAAI,KAAKiD,IAAa,KAAI,WAAA,CAAW,EAAA,CACvC,EAAA,CACD,GAEF;AAAA,QACA,gBAAAjD,EAAC,OAAA,EAAI,WAAU,UACd,UAAA,gBAAAA,EAACqD,IAAA,EAAa,SAAAvC,GAAkB,SAAAyC,GAAkB,aAAae,EAAkB,YAAA,CAAa,EAAA,CAC/F;AAAA,QACA,gBAAAtE,EAAC,OAAA,EAAI,WAAU,SACb,UAAA6E,uBACC,UAAA,EAAO,WAAU,YAAW,SAASb,GACrC,UAAA,gBAAAhE,EAAC,UAAK,MAAK,OAAM,cAAW,QAC3B,UAAA,gBAAAA,EAAC,OAAA,EAAI,KAAKkD,IAAS,KAAI,OAAA,CAAO,EAAA,CAC/B,EAAA,CACD,EAAA,CAEF;AAAA,MAAA,GACD;AAAA,MACA,gBAAAlD,EAAC,OAAA,EAAI,WAAU,UACd,UAAA,gBAAAA,EAAC,UAAA,EAAO,WAAU,gBAAe,SAAS0E,GAAqB,UAAU5D,GACxE,UAAA,gBAAAd,EAAC,UAAK,MAAK,OAAM,cAAW,SAC3B,UAAA,gBAAAA,EAAC,OAAA,EAAI,KAAKoD,IAAa,KAAI,WAAA,CAAW,EAAA,CACvC,EAAA,CACD,EAAA,CACD;AAAA,IAAA,GACD;AAAA,IACA0B;AAAA,EAAA,IA7CO;AA+CT,GCpGaE,KAAc,CAAC,EAAC,UAAAC,GAAU,SAAArB,GAAS,UAAAsB,QAAqB;AACpE,QAAM,EAAC,GAAAnF,EAAA,IAAKkB,EAAA,GACN,CAACiB,GAAMiD,CAAO,IAAIzD,EAAkC,IAAI,GACxD,CAAC0D,GAAWC,CAAY,IAAI3D,EAAiB,EAAE,GAC/C,CAACZ,GAASW,CAAU,IAAIC,EAAkB,EAAK,GAC/C4D,IAAUpD,KAAQ,CAACkD,GAEnBG,IAAe,OAAOrD,MAAkC;AAC7D,QAAKA,GAIL;AAAA,MAAAT,EAAW,EAAI;AAEf,UAAI;AACH,cAAMyD,EAAShD,GAAM+C,CAAQ,GAC7BrB,EAAA;AAAA,MACD,SAAS4B,GAAQ;AAChB,QAAAC,EAAgBD,EAAE,OAAO,GACzB,QAAQ,MAAMA,CAAC,GACf/D,EAAW,EAAK;AAAA,MACjB;AAAA;AAAA,EACD;AAeA,SACC,gBAAAzB;AAAA,IAAC0F;AAAA,IAAA;AAAA,MACA,OAAO;AAAA,MACP,QACCT,MAAa,cACZ,gBAAAjF,EAACC,GAAA,EAAM,SAAQ,8CAA6C,UAAA,eAAA,CAAY,IAExE,gBAAAD,EAACC,GAAA,EAAM,SAAQ,2CAA0C,UAAA,aAAS;AAAA,MAGpE,SACC,gBAAAD,EAACwD,GAAA,EAAiB,MAAM1C,GACvB,UAAA,gBAAAd;AAAA,QAAC2F;AAAA,QAAA;AAAA,UACA,OAAO,gBAAA3F,EAACC,GAAA,EAAM,SAAQ,4CAA2C,UAAA,kBAAc;AAAA,UAC/E,UA5BiB,CAAC2F,MAAsC;AAC5D,YAAAT,EAAQS,CAAQ,GASfP,EAPIO,IAOS,KALZ7F,EAAE,oDAAoD;AAAA,cACrD,cAAc;AAAA,YAAA,CACd,CAGa;AAAA,UAEjB;AAAA,UAiBK,YAAYkF,MAAa;AAAA,UACzB,OAAOG;AAAA,UACP,UAAQ;AAAA,QAAA;AAAA,MAAA,GAEV;AAAA,MAED,QACC,gBAAAhF,EAAAI,GAAA,EACC,UAAA;AAAA,QAAA,gBAAAR;AAAA,UAACS;AAAA,UAAA;AAAA,YACA,SAAS,MAAM8E,EAAarD,CAAI;AAAA,YAChC,SAAO;AAAA,YACP,UAAU,CAACoD,KAAWxE;AAAA,YACtB,eAAY;AAAA,YAEZ,UAAA,gBAAAd,EAACC,GAAA,EAAM,SAAQ,wBAAuB,UAAA,OAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAE3C,gBAAAD,EAACS,KAAO,SAASmD,GAChB,4BAAC3D,GAAA,EAAM,SAAQ,0BAAyB,UAAA,SAAA,CAAM,EAAA,CAC/C;AAAA,MAAA,EAAA,CACD;AAAA,IAAA;AAAA,EAAA;AAIJ;ACrEA,SAAS4F,GAAsBhF,GAAyBsB,GAAgD;AACvG,QAAM2D,IAAgBC,IAA0B,IAAI,CAAC,EAAC,cAAAC,EAAA,MAAkBA,CAAY;AACpF,SAAI7D,KAAY2D,EAAc,SAAS3D,CAAQ,IACvCtB,EAAM,OAAO,CAAAyB,MAAkBA,EAAe,aAAaH,CAAQ,IAEnEtB,EAAM;AAAA,IACZ,CAAAyB,MAAkB,CAACA,EAAe,YAAY,CAACwD,EAAc,SAASxD,EAAe,QAAQ;AAAA,EAAA;AAGhG;AAEO,SAAS2D,EAAS,EAAC,MAAAtG,GAAM,UAAAwC,KAAkB;AACjD,QAAM,EAAC,SAAArB,GAAS,OAAOoF,GAAU,YAAAjE,GAAY,YAAAI,GAAY,WAAAE,EAAA,IAAaQ,GAASpD,CAAI,GAC7EkB,IAAQU,EAAQ,MAAMsE,GAAsBK,GAAU/D,CAAQ,GAAG,CAAC+D,GAAU/D,CAAQ,CAAC,GACrF,CAACgE,GAAoBC,CAAqB,IAAI1E,EAAS,EAAK,GAC5D,CAAC2E,GAAqBC,CAAsB,IAAI5E,EAAS,EAAK,GAC9D,CAAC6E,GAA0BC,CAA2B,IAAI9E,EAAiB,CAAC,GAC5E,EAAC,GAAA3B,EAAA,IAAKkB,EAAA,GACNwF,IAAUC,GAAA;AAEhB,iBAAeC,EAAezE,GAAsB;AACnD,UAAMuC,IAAc,MAAMlC,EAAUL,CAAI;AACxC,IAAAyC,EAAO,IAAI,KAAK,CAACF,CAAW,CAAC,GAAGvC,EAAK,QAAQ;AAAA,EAC9C;AAEA,WAAS0E,EAAoB1E,GAAsB;AAClD,IAAIvC,MAAS,YACZ6G,EAA4B3F,EAAM,QAAQqB,CAAI,CAAC,GAC/CoE,EAAuB,EAAI,KAE3BK,EAAezE,CAAI;AAAA,EAErB;AAEA,iBAAe2E,EAAiB3E,GAAY;AAC3C,QAAI;AACH,YAAMD,EAAWC,GAAMC,CAAQ;AAAA,IAChC,SAASqD,GAAG;AACX,cAAQ,MAAMA,CAAC,GACfC,EAAgB,gBAAAzF,EAACC,GAAA,EAAM,SAAQ,uBAAsB,8BAAgB,CAAQ;AAAA,IAC9E;AAAA,EACD;AAEA,iBAAe6G,EAAa5E,GAAsB;AAQjD,IAPkB,MAAMuE,EAAQ;AAAA,MAC/B,OAAO1G,EAAE,0CAA0C,EAAC,cAAc,eAAc;AAAA,MAChF,SAASA,EAAE,4CAA4C;AAAA,QACtD,cAAc;AAAA,MAAA,CACd;AAAA,IAAA,CACD,KAGA,MAAMsC,EAAWH,CAAI;AAAA,EAEvB;AAEA,2BACE,OAAA,EACA,UAAA;AAAA,IAAA,gBAAAlC;AAAA,MAACY;AAAA,MAAA;AAAA,QACA,OAAAC;AAAA,QACA,SAAAC;AAAA,QACA,MAAAnB;AAAA,QACA,YAAYgH;AAAA,QACZ,iBAAiBC;AAAA,QACjB,UAAUE;AAAA,MAAA;AAAA,IAAA;AAAA,IAEX,gBAAA9G,EAAC+G,GAAA,EAAe,aAAa,CAAC,iCAAiC,GAC9D,UAAA,gBAAA3G,EAACK,GAAA,EAAO,SAAS,MAAM2F,EAAsB,EAAI,GAAG,eAAY,mBAC/D,UAAA;AAAA,MAAA,gBAAApG,EAACW,GAAA,EAAK,KAAG,GAAA,CAAC;AAAA,MACThB,MAAS,YAAY,gBAAAK,EAACC,GAAA,EAAM,SAAQ,gCAA+B,UAAA,aAAS;AAAA,MAC5EN,MAAS,eAAe,gBAAAK,EAACC,GAAA,EAAM,SAAQ,+BAA8B,UAAA,WAAA,CAAQ;AAAA,IAAA,EAAA,CAC/E,EAAA,CACD;AAAA,IACCkG,KACA,gBAAAnG,EAACgF,IAAA,EAAY,UAAUrF,GAAM,SAAS,MAAMyG,EAAsB,EAAK,GAAG,UAAUS,EAAA,CAAkB;AAAA,IAEtGR,KACA,gBAAArG;AAAA,MAACyD;AAAA,MAAA;AAAA,QACA,oBAAoB8C;AAAA,QACpB,OAAO1F;AAAA,QACP,YAAY0B;AAAA,QACZ,SAAS,MAAM+D,EAAuB,EAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAC5C,GAEF;AAEF;AC7FA,SAASU,KAAkB;AAC1B,SAAO;AAAA,IACN;AAAA,MACC,MAAM;AAAA,MACN,eAAe,MAAM,gBAAAhH,EAACC,GAAA,EAAM,SAAQ,sCAAqC,UAAA,aAAS;AAAA,MAClF,YAAY,MAAM,gBAAAD,EAACiG,GAAA,EAAS,MAAK,YAAA,CAAY;AAAA,IAAA;AAAA,IAE9C,GAAGF,EAAA,EACD,OAAO,CAAC,EAAC,MAAApG,EAAA,MAAUA,MAAS,WAAW,EACvC,IAAI,CAAC,EAAC,cAAAqG,GAAc,WAAAiB,GAAW,oBAAAC,SAAyB;AAAA,MACxD,MAAMlB;AAAA,MACN,eAAe,MAAM,gBAAAhG,EAACC,GAAA,EAAM,SAASgH,GAAY,UAAAC,GAAmB;AAAA,MACpE,YAAY,MAAM,gBAAAlH,EAACiG,KAAS,MAAK,aAAY,UAAUD,EAAA,CAAc;AAAA,IAAA,EACpE;AAAA,IACH;AAAA,MACC,MAAM;AAAA,MACN,eAAe,MAAM,gBAAAhG,EAACC,GAAA,EAAM,SAAQ,mCAAkC,UAAA,UAAM;AAAA,MAC5E,YAAY,MAAM,gBAAAD,EAACiG,GAAA,EAAS,MAAK,SAAA,CAAS;AAAA,IAAA;AAAA,IAE3C,GAAGF,EAAA,EACD,OAAO,CAAC,EAAC,MAAApG,EAAA,MAAUA,MAAS,QAAQ,EACpC,IAAI,CAAC,EAAC,cAAAqG,GAAc,WAAAiB,GAAW,oBAAAC,SAAyB;AAAA,MACxD,MAAMlB;AAAA,MACN,eAAe,MAAM,gBAAAhG,EAACC,GAAA,EAAM,SAASgH,GAAY,UAAAC,GAAmB;AAAA,MACpE,YAAY,MAAM,gBAAAlH,EAACiG,KAAS,MAAK,UAAS,UAAUD,EAAA,CAAc;AAAA,IAAA,EACjE;AAAA,EAAA;AAEL;AAEA,SAAwBmB,GAAM,EAAC,OAAA/F,GAAO,YAAAC,KAAoB;AACzD,2BACE,OAAA,EACA,UAAA;AAAA,IAAA,gBAAArB;AAAA,MAACoH;AAAA,MAAA;AAAA,QACA,OAAO;AAAA,UACN,IAAI;AAAA,UACJ,cAAc;AAAA,QAAA;AAAA,MACf;AAAA,IAAA;AAAA,IAED,gBAAApH,EAAC2C,MAAqB,OAAAvB,GAAc,YAAAC,GACnC,4BAACgG,GAAA,EAAU,OAAOL,GAAA,EAAgB,CAAG,EAAA,CACtC;AAAA,EAAA,GACD;AAEF;"}
|
|
@@ -5,7 +5,7 @@ import { useMemo as C, useState as l, useEffect as m } from "react";
|
|
|
5
5
|
import { getParamsForSingleReport as P } from "@deviceinsight/ng-ui-api-client";
|
|
6
6
|
import { Tabs as T, Spinner as R } from "@deviceinsight/ng-ui-basic-components";
|
|
7
7
|
import { messageBoxError as k } from "@deviceinsight/ng-ui-components";
|
|
8
|
-
import { U as E, a as g } from "./setTitle-
|
|
8
|
+
import { U as E, a as g } from "./setTitle-DZyXA3i8.js";
|
|
9
9
|
import "react-i18next";
|
|
10
10
|
function N(r, i) {
|
|
11
11
|
return r ? /* @__PURE__ */ e("div", { id: "power-bi-report-container", children: /* @__PURE__ */ e(
|
|
@@ -100,4 +100,4 @@ function K() {
|
|
|
100
100
|
export {
|
|
101
101
|
K as default
|
|
102
102
|
};
|
|
103
|
-
//# sourceMappingURL=GlobalPowerBiReports-
|
|
103
|
+
//# sourceMappingURL=GlobalPowerBiReports-BFCqFXrG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalPowerBiReports-
|
|
1
|
+
{"version":3,"file":"GlobalPowerBiReports-BFCqFXrG.js","sources":["../ng-ui-scale/src/modules/powerbi/global/GlobalPowerBiReports.tsx"],"sourcesContent":["import {models} from 'powerbi-client';\nimport {PowerBIEmbed} from 'powerbi-client-react';\nimport {useEffect, useMemo, useState} from 'react';\n\nimport type {ParamsSingleReport, PowerBiReportsError} from '@deviceinsight/ng-ui-api-client';\nimport {getParamsForSingleReport} from '@deviceinsight/ng-ui-api-client';\nimport {Spinner, Tabs} from '@deviceinsight/ng-ui-basic-components';\nimport {messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {Trans} from 'i18n';\nimport type {PowerBiReportConfig} from '../types';\nimport './GlobalPowerBiReports.scss';\n\nfunction renderReport(params: ParamsSingleReport | null, paramsError: PowerBiReportsError | null) {\n\tif (params) {\n\t\treturn (\n\t\t\t<div id=\"power-bi-report-container\">\n\t\t\t\t<PowerBIEmbed\n\t\t\t\t\tembedConfig={{\n\t\t\t\t\t\ttype: 'report',\n\t\t\t\t\t\t// Supported types: report, dashboard, tile, visual and qna\n\t\t\t\t\t\tid: params.id,\n\t\t\t\t\t\tembedUrl: params.embedUrl,\n\t\t\t\t\t\taccessToken: params.embedToken,\n\t\t\t\t\t\ttokenType: models.TokenType.Embed,\n\t\t\t\t\t\tsettings: {\n\t\t\t\t\t\t\tpanes: {\n\t\t\t\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\t\t\texpanded: false,\n\t\t\t\t\t\t\t\t\tvisible: false,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbackground: models.BackgroundType.Transparent,\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\teventHandlers={\n\t\t\t\t\t\tnew Map([\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\t\tevent => {\n\t\t\t\t\t\t\t\t\tmessageBoxError(\n\t\t\t\t\t\t\t\t\t\t'An error occurred displaying the report (see browser console for details)',\n\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t'PowerBiReport',\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconsole.error('Error displaying PowerBi report.');\n\t\t\t\t\t\t\t\t\tconsole.error(event?.detail);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t])\n\t\t\t\t\t}\n\t\t\t\t\tcssClassName=\"power-bi-report\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t} else {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<h2>\n\t\t\t\t\t<Trans i18nKey=\"globalPowerBiReports.errorLoadingReport\">Error loading report:</Trans>\n\t\t\t\t</h2>\n\t\t\t\t{paramsError && <pre>{JSON.stringify(paramsError, null, 4)}</pre>}\n\t\t\t\t{!paramsError && (\n\t\t\t\t\t<pre>\n\t\t\t\t\t\t<Trans i18nKey=\"globalPowerBiReports.noErrorGivenByBackend\">\n\t\t\t\t\t\t\tNo error given by backend.\n\t\t\t\t\t\t</Trans>{' '}\n\t\t\t\t\t</pre>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t}\n}\n\nexport default function GlobalPowerBiReports() {\n\tconst reportConfigs = useMemo<PowerBiReportConfig[]>(() => {\n\t\tconst reportsFromUiConfiguration = UIConfiguration.getPowerBiReports();\n\n\t\tif (reportsFromUiConfiguration) {\n\t\t\treturn reportsFromUiConfiguration.map((report, index) => {\n\t\t\t\treturn {...report, tabName: `report-${index}`};\n\t\t\t});\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}, []);\n\tconst [loading, setLoading] = useState<boolean>(true);\n\tconst [currentTab, setCurrentTab] = useState<string | null>(null);\n\tconst [params, setParams] = useState<ParamsSingleReport | null>(null);\n\tconst [paramsError, setParamsError] = useState<PowerBiReportsError | null>(null);\n\n\tuseEffect(() => {\n\t\tsetCurrentTab(reportConfigs[0].tabName);\n\t}, [reportConfigs]);\n\n\tuseEffect(() => {\n\t\tasync function fetchParams() {\n\t\t\tif (currentTab) {\n\t\t\t\tsetLoading(true);\n\t\t\t\tsetParams(null);\n\t\t\t\tconst currentReportConfig = reportConfigs.find(rc => rc.tabName === currentTab);\n\n\t\t\t\tif (currentReportConfig) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst params = await getParamsForSingleReport(\n\t\t\t\t\t\t\tcurrentReportConfig.workspaceId,\n\t\t\t\t\t\t\tcurrentReportConfig.reportId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetParams(params);\n\t\t\t\t\t\tsetParamsError(null);\n\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\tsetParams(null);\n\t\t\t\t\t\tsetParamsError(error?.response?.data);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tsetLoading(false);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('Could not find tab in report configs:', currentTab);\n\t\t\t\t\tconsole.error('Current report configs:', reportConfigs);\n\t\t\t\t\tthrow new Error(`${currentTab} not found in reportConfigs!`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfetchParams();\n\t}, [currentTab, reportConfigs]);\n\n\tfunction renderCurrentReport() {\n\t\tif (loading) {\n\t\t\treturn <Spinner center />;\n\t\t} else {\n\t\t\treturn renderReport(params, paramsError);\n\t\t}\n\t}\n\n\treturn (\n\t\t<Tabs\n\t\t\tcurrentTab={currentTab}\n\t\t\tonChange={setCurrentTab}\n\t\t\tpages={reportConfigs.map(rc => {\n\t\t\t\treturn {\n\t\t\t\t\tname: rc.tabName,\n\t\t\t\t\trenderHeading: () => <span>{rc.reportHeading}</span>,\n\t\t\t\t\trenderBody: () => renderCurrentReport(),\n\t\t\t\t};\n\t\t\t})}\n\t\t/>\n\t);\n}\n"],"names":["renderReport","params","paramsError","jsx","PowerBIEmbed","models","event","messageBoxError","jsxs","Fragment","Trans","GlobalPowerBiReports","reportConfigs","useMemo","reportsFromUiConfiguration","UIConfiguration","report","index","loading","setLoading","useState","currentTab","setCurrentTab","setParams","setParamsError","useEffect","fetchParams","currentReportConfig","rc","getParamsForSingleReport","error","renderCurrentReport","Spinner","Tabs"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { javascript as v } from "@codemirror/lang-javascript";
|
|
|
3
3
|
import y from "@uiw/react-codemirror";
|
|
4
4
|
import { useState as u, useEffect as C, useCallback as x } from "react";
|
|
5
5
|
import { useFormContext as V, useController as b } from "react-hook-form";
|
|
6
|
-
import { X as g, a as J } from "./setTitle-
|
|
6
|
+
import { X as g, a as J } from "./setTitle-DZyXA3i8.js";
|
|
7
7
|
import "react-i18next";
|
|
8
8
|
function I({ setting: e, ...d }) {
|
|
9
9
|
const { setValue: o, setError: s, clearErrors: n, control: c } = V(), {
|
|
@@ -50,4 +50,4 @@ function I({ setting: e, ...d }) {
|
|
|
50
50
|
export {
|
|
51
51
|
I as default
|
|
52
52
|
};
|
|
53
|
-
//# sourceMappingURL=JsonSettingWidget-
|
|
53
|
+
//# sourceMappingURL=JsonSettingWidget-Dmoshz7m.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonSettingWidget-
|
|
1
|
+
{"version":3,"file":"JsonSettingWidget-Dmoshz7m.js","sources":["../ng-ui-scale/src/components/applicationSettings/widgets/JsonSettingWidget.tsx"],"sourcesContent":["import {javascript} from '@codemirror/lang-javascript';\nimport CodeMirror from '@uiw/react-codemirror';\nimport {useCallback, useEffect, useState} from 'react';\nimport {useController, useFormContext} from 'react-hook-form';\n\nimport FieldDecorator from 'components/inputs/FieldDecorator';\nimport {Trans} from 'i18n';\nimport type {SettingProps} from '../ApplicationSettings';\n\nexport default function JsonSettingWidget({setting, ...rest}: SettingProps) {\n\tconst {setValue, setError, clearErrors, control} = useFormContext();\n\tconst {\n\t\tfield,\n\t\tfieldState: {error},\n\t} = useController({name: setting.name, control});\n\tconst [stringValue, setStringValue] = useState<string>('');\n\tconst [initialized, setInitialized] = useState<boolean>(false);\n\n\tuseEffect(() => {\n\t\tif (!initialized && field.value) {\n\t\t\tconst value = JSON.stringify(field.value, null, 2);\n\t\t\tsetStringValue(value);\n\t\t\tsetInitialized(true);\n\t\t}\n\t}, [field.value, initialized]);\n\n\tconst handleChange = useCallback(\n\t\t(value: string) => {\n\t\t\ttry {\n\t\t\t\tsetStringValue(value);\n\t\t\t\tconst parsedValue = value === '' ? undefined : JSON.parse(value);\n\t\t\t\tsetValue(setting.name, parsedValue, {shouldValidate: true, shouldDirty: true});\n\t\t\t\tclearErrors(setting.name);\n\t\t\t} catch (_e) {\n\t\t\t\tsetError(setting.name, {message: 'Invalid JSON syntax'});\n\t\t\t}\n\t\t},\n\t\t[clearErrors, setError, setValue, setting.name],\n\t);\n\n\treturn (\n\t\t<FieldDecorator\n\t\t\tlabel={<Trans i18nKey={`appSettings.property.${setting.name}`}>{setting.name}</Trans>}\n\t\t\terror={error?.message ?? ''}\n\t\t\tsize=\"full-width\"\n\t\t>\n\t\t\t<CodeMirror\n\t\t\t\tdata-testid={rest['data-testid']}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tvalue={stringValue}\n\t\t\t\tbasicSetup={{lineNumbers: true}}\n\t\t\t\textensions={[javascript()]}\n\t\t\t/>\n\t\t</FieldDecorator>\n\t);\n}\n"],"names":["JsonSettingWidget","setting","rest","setValue","setError","clearErrors","control","useFormContext","field","error","useController","stringValue","setStringValue","useState","initialized","setInitialized","useEffect","value","handleChange","useCallback","parsedValue","jsx","FieldDecorator","Trans","CodeMirror","javascript"],"mappings":";;;;;;;AASA,SAAwBA,EAAkB,EAAC,SAAAC,GAAS,GAAGC,KAAqB;AAC3E,QAAM,EAAC,UAAAC,GAAU,UAAAC,GAAU,aAAAC,GAAa,SAAAC,EAAA,IAAWC,EAAA,GAC7C;AAAA,IACL,OAAAC;AAAA,IACA,YAAY,EAAC,OAAAC,EAAA;AAAA,EAAK,IACfC,EAAc,EAAC,MAAMT,EAAQ,MAAM,SAAAK,GAAQ,GACzC,CAACK,GAAaC,CAAc,IAAIC,EAAiB,EAAE,GACnD,CAACC,GAAaC,CAAc,IAAIF,EAAkB,EAAK;AAE7D,EAAAG,EAAU,MAAM;AACf,QAAI,CAACF,KAAeN,EAAM,OAAO;AAChC,YAAMS,IAAQ,KAAK,UAAUT,EAAM,OAAO,MAAM,CAAC;AACjD,MAAAI,EAAeK,CAAK,GACpBF,EAAe,EAAI;AAAA,IACpB;AAAA,EACD,GAAG,CAACP,EAAM,OAAOM,CAAW,CAAC;AAE7B,QAAMI,IAAeC;AAAA,IACpB,CAACF,MAAkB;AAClB,UAAI;AACH,QAAAL,EAAeK,CAAK;AACpB,cAAMG,IAAcH,MAAU,KAAK,SAAY,KAAK,MAAMA,CAAK;AAC/D,QAAAd,EAASF,EAAQ,MAAMmB,GAAa,EAAC,gBAAgB,IAAM,aAAa,IAAK,GAC7Ef,EAAYJ,EAAQ,IAAI;AAAA,MACzB,QAAa;AACZ,QAAAG,EAASH,EAAQ,MAAM,EAAC,SAAS,uBAAsB;AAAA,MACxD;AAAA,IACD;AAAA,IACA,CAACI,GAAaD,GAAUD,GAAUF,EAAQ,IAAI;AAAA,EAAA;AAG/C,SACC,gBAAAoB;AAAA,IAACC;AAAA,IAAA;AAAA,MACA,yBAAQC,GAAA,EAAM,SAAS,wBAAwBtB,EAAQ,IAAI,IAAK,UAAAA,EAAQ,KAAA,CAAK;AAAA,MAC7E,OAAOQ,GAAO,WAAW;AAAA,MACzB,MAAK;AAAA,MAEL,UAAA,gBAAAY;AAAA,QAACG;AAAA,QAAA;AAAA,UACA,eAAatB,EAAK,aAAa;AAAA,UAC/B,UAAUgB;AAAA,UACV,OAAOP;AAAA,UACP,YAAY,EAAC,aAAa,GAAA;AAAA,UAC1B,YAAY,CAACc,EAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAC1B;AAAA,EAAA;AAGH;"}
|
|
@@ -5,7 +5,7 @@ import { fetchLicenses as H, fetchLicenseByName as T, updateLicense as D, create
|
|
|
5
5
|
import { SpinnerContainer as k, ButtonRow as R, Button as F, Spinner as j } from "@deviceinsight/ng-ui-basic-components";
|
|
6
6
|
import { messageBoxError as K, ContentHeader as U, messageBoxSuccess as P } from "@deviceinsight/ng-ui-components";
|
|
7
7
|
import "react-i18next";
|
|
8
|
-
import { u as A, a as n, P as b, b8 as O } from "./setTitle-
|
|
8
|
+
import { u as A, a as n, P as b, b8 as O } from "./setTitle-DZyXA3i8.js";
|
|
9
9
|
import { useForm as z, Controller as L } from "react-hook-form";
|
|
10
10
|
function G({ editedLicense: l, onSubmit: u, onCancel: c }) {
|
|
11
11
|
const { t } = A(), {
|
|
@@ -142,4 +142,4 @@ function ee() {
|
|
|
142
142
|
export {
|
|
143
143
|
ee as default
|
|
144
144
|
};
|
|
145
|
-
//# sourceMappingURL=LicensesEditPage-
|
|
145
|
+
//# sourceMappingURL=LicensesEditPage-C8vTjupQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LicensesEditPage-RQkcqxud.js","sources":["../ng-ui-scale/src/modules/licenses/LicenseForm.tsx","../ng-ui-scale/src/modules/licenses/LicensesEditPage.tsx"],"sourcesContent":["import {useEffect, useState} from 'react';\nimport {Controller, useForm} from 'react-hook-form';\nimport {Prompt} from 'react-router-dom';\n\nimport {fetchLicenses, type License} from '@deviceinsight/ng-ui-api-client';\nimport {Button, ButtonRow, SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\nimport {messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport {Trans, useTranslation} from 'i18n';\nimport TextInput from '../../components/inputs/textInput/TextInput';\n\ntype Props = {\n\teditedLicense: License | undefined;\n\tonSubmit: (license: License) => Promise<void>;\n\tonCancel: () => void;\n};\n\nexport default function LicenseForm({editedLicense, onSubmit, onCancel}: Props) {\n\tconst {t} = useTranslation();\n\tconst {\n\t\thandleSubmit,\n\t\tcontrol,\n\t\tformState: {isSubmitting, isDirty},\n\t\tsetError,\n\t} = useForm<License>({\n\t\tdefaultValues: editedLicense ?? {name: '', displayName: '', description: ''},\n\t});\n\tconst [licenses, setLicenses] = useState<License[]>([]);\n\tconst [isFetchingLicenses, setFetchingLicenses] = useState<boolean>(false);\n\n\tuseEffect(() => {\n\t\tsetFetchingLicenses(true);\n\t\tfetchLicenses()\n\t\t\t.then(setLicenses)\n\t\t\t.catch(() => {\n\t\t\t\tmessageBoxError(<Trans i18nKey=\"licenses.form.fetchingError\">Fetching licenses failed</Trans>);\n\t\t\t})\n\t\t\t.finally(() => setFetchingLicenses(false));\n\t}, []);\n\n\tfunction validateLicenseName(value: string): string | undefined {\n\t\tif (editedLicense) return; // license name is disabled in edit mode, so we don't validate it.\n\t\tconst isDuplicate = licenses.some(license => license.name === value);\n\n\t\treturn isDuplicate\n\t\t\t? t('licenses.form.validation.nameInUse', {\n\t\t\t\t\tdefaultValue: 'A license with the same technical name already exists',\n\t\t\t\t})\n\t\t\t: undefined;\n\t}\n\n\tfunction submit(): Promise<void> {\n\t\tconst submitFunction = async (license: License) => {\n\t\t\ttry {\n\t\t\t\tawait onSubmit(license);\n\t\t\t} catch (error: any) {\n\t\t\t\tif (error && error.response && error.response.status === 409 && error.response.data?.message) {\n\t\t\t\t\tsetError('name', {\n\t\t\t\t\t\tmessage: t('licenses.form.validation.nameInUse', {\n\t\t\t\t\t\t\tdefaultValue: error.response.data?.message,\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn handleSubmit(submitFunction, errors => {\n\t\t\tconsole.warn('Validation error', errors);\n\t\t})();\n\t}\n\n\treturn (\n\t\t<SpinnerContainer show={isSubmitting || isFetchingLicenses} className=\"di license-form\">\n\t\t\t<Controller\n\t\t\t\tcontrol={control}\n\t\t\t\tname=\"name\"\n\t\t\t\trules={{\n\t\t\t\t\trequired: t('licenses.form.validation.nameRequired', {\n\t\t\t\t\t\tdefaultValue: 'Please enter the technical name',\n\t\t\t\t\t}),\n\t\t\t\t\tvalidate: validateLicenseName,\n\t\t\t\t}}\n\t\t\t\trender={({field, fieldState: {error}}) => (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\tdisabled={!!editedLicense}\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"licenses.tableHeaders.name\">Technical Name</Trans>}\n\t\t\t\t\t\trequired\n\t\t\t\t\t\terror={error?.message}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<Controller\n\t\t\t\tcontrol={control}\n\t\t\t\tname=\"displayName\"\n\t\t\t\trules={{\n\t\t\t\t\trequired: t('licenses.form.validation.displayNameRequired', {\n\t\t\t\t\t\tdefaultValue: 'Please enter the display name',\n\t\t\t\t\t}),\n\t\t\t\t}}\n\t\t\t\trender={({field, fieldState: {error}}) => (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"licenses.tableHeaders.displayName\">Name</Trans>}\n\t\t\t\t\t\trequired\n\t\t\t\t\t\terror={error?.message}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<Controller\n\t\t\t\tcontrol={control}\n\t\t\t\tname=\"description\"\n\t\t\t\trender={({field}) => (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"licenses.tableHeaders.description\">Description</Trans>}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<ButtonRow dividing>\n\t\t\t\t<Button primary onClick={submit} disabled={isSubmitting}>\n\t\t\t\t\t<Trans i18nKey=\"general.actions.save\">Save</Trans>\n\t\t\t\t</Button>\n\t\t\t\t<Button disabled={isSubmitting} onClick={onCancel}>\n\t\t\t\t\t<Trans i18nKey=\"general.actions.cancel\">Cancel</Trans>\n\t\t\t\t</Button>\n\t\t\t</ButtonRow>\n\t\t\t<Prompt message={''} when={isDirty && !isSubmitting} />\n\t\t</SpinnerContainer>\n\t);\n}\n","import {useEffect, useState} from 'react';\nimport {useHistory, useLocation, useParams} from 'react-router-dom';\n\nimport {createLicense, fetchLicenseByName, type License, updateLicense} from '@deviceinsight/ng-ui-api-client';\nimport {Spinner} from '@deviceinsight/ng-ui-basic-components';\nimport {ContentHeader, messageBoxError, messageBoxSuccess} from '@deviceinsight/ng-ui-components';\n\nimport {Trans} from 'i18n';\nimport PageNotFound from '../../components/page/misc/PageNotFound';\nimport LicenseForm from './LicenseForm';\n\nexport default function LicensesEditPage() {\n\tconst history = useHistory();\n\tconst {pathname} = useLocation();\n\tconst {licenseName: editedLicenseName} = useParams<{licenseName: string | undefined}>();\n\tconst [editedLicense, setEditedLicense] = useState<License | undefined>();\n\tconst [loading, setLoading] = useState<boolean>(false);\n\tconst [notFound, setNotFound] = useState<boolean>(false);\n\n\tuseEffect(() => {\n\t\tif (editedLicenseName) {\n\t\t\tsetLoading(true);\n\t\t\tfetchLicenseByName(editedLicenseName)\n\t\t\t\t.then(setEditedLicense)\n\t\t\t\t.catch(() => {\n\t\t\t\t\tmessageBoxError(<Trans i18nKey=\"licenses.editPage.fetchingError\">Fetching license failed</Trans>);\n\t\t\t\t\tsetNotFound(true);\n\t\t\t\t})\n\t\t\t\t.finally(() => setLoading(false));\n\t\t}\n\t}, [editedLicenseName]);\n\n\tif (notFound) {\n\t\treturn <PageNotFound />;\n\t}\n\n\tif (loading) {\n\t\treturn <Spinner center />;\n\t}\n\n\tconst handleSubmit = async (license: License) => {\n\t\tif (editedLicenseName) {\n\t\t\tawait updateLicense(license);\n\t\t\tmessageBoxSuccess(<Trans i18nKey=\"licenses.updateSuccess\">License updated</Trans>);\n\t\t} else {\n\t\t\tawait createLicense(license);\n\t\t\tmessageBoxSuccess(<Trans i18nKey=\"licenses.createSuccess\">License created</Trans>);\n\t\t}\n\t\tgoToParentPage();\n\t};\n\n\tconst goToParentPage = () => {\n\t\thistory.push(pathname.substring(0, pathname.lastIndexOf('/')));\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<ContentHeader\n\t\t\t\ttitle={\n\t\t\t\t\t!editedLicense\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tid: 'licenses.create.title',\n\t\t\t\t\t\t\t\tdefaultValue: 'Create License',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tid: 'licenses.edit.title',\n\t\t\t\t\t\t\t\tdefaultValue: 'Edit License',\n\t\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tparentPageLink\n\t\t\t/>\n\t\t\t<LicenseForm editedLicense={editedLicense} onSubmit={handleSubmit} onCancel={goToParentPage} />\n\t\t</>\n\t);\n}\n"],"names":["LicenseForm","editedLicense","onSubmit","onCancel","useTranslation","handleSubmit","control","isSubmitting","isDirty","setError","useForm","licenses","setLicenses","useState","isFetchingLicenses","setFetchingLicenses","useEffect","fetchLicenses","messageBoxError","jsx","Trans","validateLicenseName","value","license","submit","error","errors","SpinnerContainer","Controller","field","TextInput","jsxs","ButtonRow","Button","Prompt","LicensesEditPage","history","useHistory","pathname","useLocation","editedLicenseName","useParams","setEditedLicense","loading","setLoading","notFound","setNotFound","fetchLicenseByName","PageNotFound","Spinner","updateLicense","messageBoxSuccess","createLicense","goToParentPage","Fragment","ContentHeader"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LicensesEditPage-C8vTjupQ.js","sources":["../ng-ui-scale/src/modules/licenses/LicenseForm.tsx","../ng-ui-scale/src/modules/licenses/LicensesEditPage.tsx"],"sourcesContent":["import {useEffect, useState} from 'react';\nimport {Controller, useForm} from 'react-hook-form';\nimport {Prompt} from 'react-router-dom';\n\nimport {fetchLicenses, type License} from '@deviceinsight/ng-ui-api-client';\nimport {Button, ButtonRow, SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\nimport {messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport {Trans, useTranslation} from 'i18n';\nimport TextInput from '../../components/inputs/textInput/TextInput';\n\ntype Props = {\n\teditedLicense: License | undefined;\n\tonSubmit: (license: License) => Promise<void>;\n\tonCancel: () => void;\n};\n\nexport default function LicenseForm({editedLicense, onSubmit, onCancel}: Props) {\n\tconst {t} = useTranslation();\n\tconst {\n\t\thandleSubmit,\n\t\tcontrol,\n\t\tformState: {isSubmitting, isDirty},\n\t\tsetError,\n\t} = useForm<License>({\n\t\tdefaultValues: editedLicense ?? {name: '', displayName: '', description: ''},\n\t});\n\tconst [licenses, setLicenses] = useState<License[]>([]);\n\tconst [isFetchingLicenses, setFetchingLicenses] = useState<boolean>(false);\n\n\tuseEffect(() => {\n\t\tsetFetchingLicenses(true);\n\t\tfetchLicenses()\n\t\t\t.then(setLicenses)\n\t\t\t.catch(() => {\n\t\t\t\tmessageBoxError(<Trans i18nKey=\"licenses.form.fetchingError\">Fetching licenses failed</Trans>);\n\t\t\t})\n\t\t\t.finally(() => setFetchingLicenses(false));\n\t}, []);\n\n\tfunction validateLicenseName(value: string): string | undefined {\n\t\tif (editedLicense) return; // license name is disabled in edit mode, so we don't validate it.\n\t\tconst isDuplicate = licenses.some(license => license.name === value);\n\n\t\treturn isDuplicate\n\t\t\t? t('licenses.form.validation.nameInUse', {\n\t\t\t\t\tdefaultValue: 'A license with the same technical name already exists',\n\t\t\t\t})\n\t\t\t: undefined;\n\t}\n\n\tfunction submit(): Promise<void> {\n\t\tconst submitFunction = async (license: License) => {\n\t\t\ttry {\n\t\t\t\tawait onSubmit(license);\n\t\t\t} catch (error: any) {\n\t\t\t\tif (error && error.response && error.response.status === 409 && error.response.data?.message) {\n\t\t\t\t\tsetError('name', {\n\t\t\t\t\t\tmessage: t('licenses.form.validation.nameInUse', {\n\t\t\t\t\t\t\tdefaultValue: error.response.data?.message,\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn handleSubmit(submitFunction, errors => {\n\t\t\tconsole.warn('Validation error', errors);\n\t\t})();\n\t}\n\n\treturn (\n\t\t<SpinnerContainer show={isSubmitting || isFetchingLicenses} className=\"di license-form\">\n\t\t\t<Controller\n\t\t\t\tcontrol={control}\n\t\t\t\tname=\"name\"\n\t\t\t\trules={{\n\t\t\t\t\trequired: t('licenses.form.validation.nameRequired', {\n\t\t\t\t\t\tdefaultValue: 'Please enter the technical name',\n\t\t\t\t\t}),\n\t\t\t\t\tvalidate: validateLicenseName,\n\t\t\t\t}}\n\t\t\t\trender={({field, fieldState: {error}}) => (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\tdisabled={!!editedLicense}\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"licenses.tableHeaders.name\">Technical Name</Trans>}\n\t\t\t\t\t\trequired\n\t\t\t\t\t\terror={error?.message}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<Controller\n\t\t\t\tcontrol={control}\n\t\t\t\tname=\"displayName\"\n\t\t\t\trules={{\n\t\t\t\t\trequired: t('licenses.form.validation.displayNameRequired', {\n\t\t\t\t\t\tdefaultValue: 'Please enter the display name',\n\t\t\t\t\t}),\n\t\t\t\t}}\n\t\t\t\trender={({field, fieldState: {error}}) => (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"licenses.tableHeaders.displayName\">Name</Trans>}\n\t\t\t\t\t\trequired\n\t\t\t\t\t\terror={error?.message}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<Controller\n\t\t\t\tcontrol={control}\n\t\t\t\tname=\"description\"\n\t\t\t\trender={({field}) => (\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\tlabel={<Trans i18nKey=\"licenses.tableHeaders.description\">Description</Trans>}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<ButtonRow dividing>\n\t\t\t\t<Button primary onClick={submit} disabled={isSubmitting}>\n\t\t\t\t\t<Trans i18nKey=\"general.actions.save\">Save</Trans>\n\t\t\t\t</Button>\n\t\t\t\t<Button disabled={isSubmitting} onClick={onCancel}>\n\t\t\t\t\t<Trans i18nKey=\"general.actions.cancel\">Cancel</Trans>\n\t\t\t\t</Button>\n\t\t\t</ButtonRow>\n\t\t\t<Prompt message={''} when={isDirty && !isSubmitting} />\n\t\t</SpinnerContainer>\n\t);\n}\n","import {useEffect, useState} from 'react';\nimport {useHistory, useLocation, useParams} from 'react-router-dom';\n\nimport {createLicense, fetchLicenseByName, type License, updateLicense} from '@deviceinsight/ng-ui-api-client';\nimport {Spinner} from '@deviceinsight/ng-ui-basic-components';\nimport {ContentHeader, messageBoxError, messageBoxSuccess} from '@deviceinsight/ng-ui-components';\n\nimport {Trans} from 'i18n';\nimport PageNotFound from '../../components/page/misc/PageNotFound';\nimport LicenseForm from './LicenseForm';\n\nexport default function LicensesEditPage() {\n\tconst history = useHistory();\n\tconst {pathname} = useLocation();\n\tconst {licenseName: editedLicenseName} = useParams<{licenseName: string | undefined}>();\n\tconst [editedLicense, setEditedLicense] = useState<License | undefined>();\n\tconst [loading, setLoading] = useState<boolean>(false);\n\tconst [notFound, setNotFound] = useState<boolean>(false);\n\n\tuseEffect(() => {\n\t\tif (editedLicenseName) {\n\t\t\tsetLoading(true);\n\t\t\tfetchLicenseByName(editedLicenseName)\n\t\t\t\t.then(setEditedLicense)\n\t\t\t\t.catch(() => {\n\t\t\t\t\tmessageBoxError(<Trans i18nKey=\"licenses.editPage.fetchingError\">Fetching license failed</Trans>);\n\t\t\t\t\tsetNotFound(true);\n\t\t\t\t})\n\t\t\t\t.finally(() => setLoading(false));\n\t\t}\n\t}, [editedLicenseName]);\n\n\tif (notFound) {\n\t\treturn <PageNotFound />;\n\t}\n\n\tif (loading) {\n\t\treturn <Spinner center />;\n\t}\n\n\tconst handleSubmit = async (license: License) => {\n\t\tif (editedLicenseName) {\n\t\t\tawait updateLicense(license);\n\t\t\tmessageBoxSuccess(<Trans i18nKey=\"licenses.updateSuccess\">License updated</Trans>);\n\t\t} else {\n\t\t\tawait createLicense(license);\n\t\t\tmessageBoxSuccess(<Trans i18nKey=\"licenses.createSuccess\">License created</Trans>);\n\t\t}\n\t\tgoToParentPage();\n\t};\n\n\tconst goToParentPage = () => {\n\t\thistory.push(pathname.substring(0, pathname.lastIndexOf('/')));\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<ContentHeader\n\t\t\t\ttitle={\n\t\t\t\t\t!editedLicense\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tid: 'licenses.create.title',\n\t\t\t\t\t\t\t\tdefaultValue: 'Create License',\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tid: 'licenses.edit.title',\n\t\t\t\t\t\t\t\tdefaultValue: 'Edit License',\n\t\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tparentPageLink\n\t\t\t/>\n\t\t\t<LicenseForm editedLicense={editedLicense} onSubmit={handleSubmit} onCancel={goToParentPage} />\n\t\t</>\n\t);\n}\n"],"names":["LicenseForm","editedLicense","onSubmit","onCancel","useTranslation","handleSubmit","control","isSubmitting","isDirty","setError","useForm","licenses","setLicenses","useState","isFetchingLicenses","setFetchingLicenses","useEffect","fetchLicenses","messageBoxError","jsx","Trans","validateLicenseName","value","license","submit","error","errors","SpinnerContainer","Controller","field","TextInput","jsxs","ButtonRow","Button","Prompt","LicensesEditPage","history","useHistory","pathname","useLocation","editedLicenseName","useParams","setEditedLicense","loading","setLoading","notFound","setNotFound","fetchLicenseByName","PageNotFound","Spinner","updateLicense","messageBoxSuccess","createLicense","goToParentPage","Fragment","ContentHeader"],"mappings":"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"}
|