@deviceinsight/ng-ui-scale-lib 9.26.0 → 10.0.0

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.
Files changed (71) hide show
  1. package/README.md +1 -1
  2. package/dist/AccessEditModal-x6TMxYkb.js +90 -0
  3. package/dist/AccessEditModal-x6TMxYkb.js.map +1 -0
  4. package/dist/BundleManagementContainer-B49bT5K-.js +16 -0
  5. package/dist/BundleManagementContainer-B49bT5K-.js.map +1 -0
  6. package/dist/BundlesContainer-BHzbWPe9.js +914 -0
  7. package/dist/BundlesContainer-BHzbWPe9.js.map +1 -0
  8. package/dist/DatapointImport-BSFXGuOh.js +293 -0
  9. package/dist/DatapointImport-BSFXGuOh.js.map +1 -0
  10. package/dist/FileUploadInput-Ccq_3cug.js +45 -0
  11. package/dist/FileUploadInput-Ccq_3cug.js.map +1 -0
  12. package/dist/Files-BniY5cJF.js +347 -0
  13. package/dist/Files-BniY5cJF.js.map +1 -0
  14. package/dist/GlobalPowerBiReports-CayA5Bqf.js +103 -0
  15. package/dist/GlobalPowerBiReports-CayA5Bqf.js.map +1 -0
  16. package/dist/Graph-BqYDNKEo.js +53 -0
  17. package/dist/Graph-BqYDNKEo.js.map +1 -0
  18. package/dist/JsonSettingWidget-pI5gCFnm.js +53 -0
  19. package/dist/JsonSettingWidget-pI5gCFnm.js.map +1 -0
  20. package/dist/LicensesEditPage-Bef9P-VO.js +145 -0
  21. package/dist/LicensesEditPage-Bef9P-VO.js.map +1 -0
  22. package/dist/LicensesList-Bwb2a9OS.js +149 -0
  23. package/dist/LicensesList-Bwb2a9OS.js.map +1 -0
  24. package/dist/PropertiesEditPage-OrwneFF4.js +373 -0
  25. package/dist/PropertiesEditPage-OrwneFF4.js.map +1 -0
  26. package/dist/{PropertiesList-59c05fe4.js → PropertiesList-DRYRjsEu.js} +56 -58
  27. package/dist/PropertiesList-DRYRjsEu.js.map +1 -0
  28. package/dist/TemplateEditPage-B9v3VwGH.js +508 -0
  29. package/dist/TemplateEditPage-B9v3VwGH.js.map +1 -0
  30. package/dist/TemplateTextInput-CZFJ0oAT.js +45 -0
  31. package/dist/TemplateTextInput-CZFJ0oAT.js.map +1 -0
  32. package/dist/TemplatesListPage-BIZ0egkq.js +330 -0
  33. package/dist/TemplatesListPage-BIZ0egkq.js.map +1 -0
  34. package/dist/UserGroupAssignments-Wk1S9obw.js +297 -0
  35. package/dist/UserGroupAssignments-Wk1S9obw.js.map +1 -0
  36. package/dist/{UserGroupTheme-6768666a.js → UserGroupTheme-BLBu4kUe.js} +51 -53
  37. package/dist/UserGroupTheme-BLBu4kUe.js.map +1 -0
  38. package/dist/api.d.ts +805 -802
  39. package/dist/api.js +73 -77
  40. package/dist/api.js.map +1 -0
  41. package/dist/{consts-012135e5.js → consts-CZ_QkIyI.js} +1 -2
  42. package/dist/consts-CZ_QkIyI.js.map +1 -0
  43. package/dist/{customFileCategories-1b64ed45.js → customFileCategories-bG5S9qSy.js} +1 -0
  44. package/dist/customFileCategories-bG5S9qSy.js.map +1 -0
  45. package/dist/index.d.ts +3 -7
  46. package/dist/index.js +4729 -17113
  47. package/dist/index.js.map +1 -0
  48. package/dist/setTitle-Ck-71vC0.js +39377 -0
  49. package/dist/setTitle-Ck-71vC0.js.map +1 -0
  50. package/dist/style.css +1 -1
  51. package/dist/{useCanDeleteBundleVersion-64f35949.js → useCanDeleteBundleVersion-CUD1pDJ0.js} +1 -0
  52. package/dist/useCanDeleteBundleVersion-CUD1pDJ0.js.map +1 -0
  53. package/package.json +85 -108
  54. package/dist/AccessEditModal-c2178ad5.js +0 -92
  55. package/dist/BundleManagementContainer-60c28e65.js +0 -20
  56. package/dist/BundlesContainer-b3ee1991.js +0 -912
  57. package/dist/ContextBarContext-a6c59c97.js +0 -88776
  58. package/dist/DatapointImport-f6bdbdbc.js +0 -864
  59. package/dist/FileUploadInput-81bb787f.js +0 -44
  60. package/dist/Files-dc240d97.js +0 -364
  61. package/dist/GlobalPowerBiReports-3b7feef9.js +0 -11081
  62. package/dist/Graph-f5463f47.js +0 -25012
  63. package/dist/JsonSettingWidget-307658b8.js +0 -56
  64. package/dist/LicensesEditPage-f62cca26.js +0 -146
  65. package/dist/LicensesList-85279448.js +0 -150
  66. package/dist/PropertiesEditPage-4edb93b7.js +0 -371
  67. package/dist/TemplateEditPage-fe1b5f44.js +0 -508
  68. package/dist/TemplateTextInput-34e4356f.js +0 -49
  69. package/dist/TemplatesListPage-cd3194a7.js +0 -330
  70. package/dist/UserGroupAssignments-291f29f0.js +0 -297
  71. package/dist/index-738ab9ab.js +0 -18679
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileUploadInput-Ccq_3cug.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;"}
@@ -0,0 +1,347 @@
1
+ import { jsx as e, jsxs as u, Fragment as E } from "react/jsx-runtime";
2
+ import { ReactableWithClientSidePagination as j, messageBoxError as K, ContentHeader as G, RouteTabs as Q } from "@deviceinsight/ng-ui-components";
3
+ import { g as U } from "./customFileCategories-bG5S9qSy.js";
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
+ 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-Ck-71vC0.js";
7
+ import { saveAs as H } from "file-saver";
8
+ import { Button as w, Icon as J, SpinnerContainer as X, Modal as ee, useConfirm as te } from "@deviceinsight/ng-ui-basic-components";
9
+ import { filesize as ie } from "filesize";
10
+ import { Link as ae } from "react-router-dom";
11
+ import b from "keyboardjs";
12
+ import { createPortal as ne } from "react-dom";
13
+ import { F as le } from "./FileUploadInput-Ccq_3cug.js";
14
+ const se = {
15
+ page: 0,
16
+ size: 10,
17
+ sort: {
18
+ property: "creationDate",
19
+ direction: "DESC"
20
+ }
21
+ };
22
+ function oe(t, i, n, l, r) {
23
+ return [
24
+ {
25
+ name: "filename",
26
+ label: /* @__PURE__ */ e(A, { i18nKey: "assets.detail.files.columns.filename", children: "Filename" }),
27
+ width: "50%",
28
+ sortable: !0,
29
+ filterable: {
30
+ filterType: "text",
31
+ filterFn(a, d) {
32
+ return a.filename.toLowerCase().indexOf(d.toLowerCase()) !== -1;
33
+ }
34
+ },
35
+ render: (a) => /* @__PURE__ */ u(ae, { to: "#", onClick: () => i(a), children: [
36
+ a.filename,
37
+ a.context && /* @__PURE__ */ u("span", { children: [
38
+ " [",
39
+ a.context === "svgWidget" ? "Svg Widget" : "Asset Image Widget",
40
+ "]"
41
+ ] })
42
+ ] })
43
+ },
44
+ {
45
+ name: "size",
46
+ sortable: !0,
47
+ label: /* @__PURE__ */ e(A, { i18nKey: "assets.detail.files.columns.size", children: "Size" }),
48
+ width: "20%",
49
+ render: (a) => ie(a.size)
50
+ },
51
+ {
52
+ name: "creationDate",
53
+ sortable: !0,
54
+ label: /* @__PURE__ */ e(A, { i18nKey: "assets.detail.files.columns.lastModificationDate", children: "Last modification date" }),
55
+ width: "20%",
56
+ render: (a) => z(new Date(a.creationDate).getTime())
57
+ },
58
+ {
59
+ name: "deleteAndDownload",
60
+ label: "",
61
+ align: "right",
62
+ render: (a) => /* @__PURE__ */ u(E, { children: [
63
+ /* @__PURE__ */ e(w, { onClick: () => n(a), naked: !0, children: /* @__PURE__ */ e("img", { src: Z, alt: "Download" }) }),
64
+ /* @__PURE__ */ e(
65
+ "span",
66
+ {
67
+ title: a.context ? r("assets.detail.files.deleteDisabledTooltip", {
68
+ defaultValue: "Cannot be removed because is used by some {{widget}}",
69
+ widget: a.context === "svgWidget" ? "Svg Widget" : "Asset Image Widget"
70
+ }) : void 0,
71
+ children: /* @__PURE__ */ e(
72
+ w,
73
+ {
74
+ naked: !0,
75
+ disabled: !!a.context,
76
+ onClick: () => l(a),
77
+ "data-testid": "delete-file-button",
78
+ children: /* @__PURE__ */ e(J, { del: !0 })
79
+ }
80
+ )
81
+ }
82
+ )
83
+ ] })
84
+ }
85
+ ];
86
+ }
87
+ function re({ files: t, loading: i, type: n, onFilenameClick: l, onDownload: r, onDelete: a }) {
88
+ const { t: d } = V();
89
+ return /* @__PURE__ */ e(
90
+ j,
91
+ {
92
+ columnDefs: oe(n, l, r, a, d),
93
+ uniqueItemKey: (c) => c.key,
94
+ paginationSettings: se,
95
+ items: t,
96
+ isLoading: i,
97
+ tableName: "filesTable"
98
+ }
99
+ );
100
+ }
101
+ function L(t, i, n) {
102
+ const l = M(() => q(i, n, t), [i, n, t]), [r, a] = g(!1), [d, c] = g([]);
103
+ k(() => {
104
+ const { promise: o, cancel: m } = _(l.fetchFiles());
105
+ return o.then((s) => {
106
+ c(s), a(!1);
107
+ }).catch((s) => {
108
+ s.isCanceled || a(!1);
109
+ }), m;
110
+ }, [l]);
111
+ async function p(o, m) {
112
+ a(!0);
113
+ try {
114
+ const s = await l.uploadFile(o, m);
115
+ c([...d, s]);
116
+ } finally {
117
+ a(!1);
118
+ }
119
+ }
120
+ async function f(o) {
121
+ a(!0);
122
+ try {
123
+ await l.deleteFile(o.key), c(d.filter((m) => m.key !== o.key));
124
+ } finally {
125
+ a(!1);
126
+ }
127
+ }
128
+ function h(o) {
129
+ return l.fetchFile(o.key);
130
+ }
131
+ return {
132
+ loading: r,
133
+ files: d,
134
+ uploadFile: p,
135
+ deleteFile: f,
136
+ fetchFile: h
137
+ };
138
+ }
139
+ const S = {
140
+ deleteFile: () => {
141
+ },
142
+ files: [],
143
+ uploadFile: () => {
144
+ },
145
+ fetchFile: () => Promise.resolve(new ArrayBuffer(0)),
146
+ loading: !1
147
+ }, W = O({
148
+ documents: S,
149
+ images: S
150
+ });
151
+ function de({ asset: t, assetGroup: i, children: n }) {
152
+ const l = L("documents", t, i), r = L("images", t, i);
153
+ return /* @__PURE__ */ e(W.Provider, { value: { documents: l, images: r }, children: n });
154
+ }
155
+ function ce(t) {
156
+ const { documents: i, images: n } = P(W);
157
+ return t === "documents" ? i : n;
158
+ }
159
+ const Ae = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAnCAYAAADtu3N3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCCsYE1yvpwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAFTSURBVEjHrdY9S5BhFAbgNykUKUIRE10kGxxsUgQXF2lLGppsCTcdGhprCZxqcNCxKRp0EcTJpaWGwBaDhpCIoJZECIQkTOty8Ajvfs7zAy44D/f5aJrkQweGmgLoEtZxioEs9sL5+4CODLQY0DfcyECzUdovjGagCfzGMaYz0DB+4j/mMlAPPsc/PclAnXgX0MuKLME2LldkaRdXM9BCQN8xmIHuRpYOMZaBxiNLfzFTkSV4WJWlZ9ksvQ3oVTZLawG9wZUM9jygT7iegYYCOsVIxQy/6LvXFbO8F3sBLlWAN7Ef4HwFOIkjnOBOBXgP/6Inb1eAj6LcH1ULdjnAj7hWEZmNkgkbYBfep2d/C+zDlwCfVoC3cBD78kEFOIU/6U3eAu9HBnM3Rgt8XHL9tMCV1l3WXZHBzQC3UodegN3YCXC1otx+fA2wpIeHsdA0TXMGpWMqV6FcS+MAAAAASUVORK5CYII=", me = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAnCAYAAAACeRhJAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCCwH0RU0lQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAFISURBVEjHrdaxS9VhFAZgja43JUy4uETocBsjwSXvLLnYEjQn4pKb4B6I08XJ1SXK6bo4Oogt3T0QHXTLJMGWFDFI83HwDM7f+Z0/4OF7h++8pwfD6O/JDn5gD0NZaM3dfEVfBqphJ7D17KueRDxYzmIj+BXYXBYbxwWuMJXFpnGNc4xlsQ8R8RjPslg7sF0MZqBedALbRi2D1fEtsE/ZiA0cBPYxizVxGtj7LPYKl/iHySz2Fv/xBy+y2EJEPMLTLLYa2Hc8zkAPsBnYFh5msIF72+JNBloM5CeGS5F3uMEZXpYiLfyNnfW6FHmO3xFpNvPnDgNZKkUeoRvIl8xe2rjXfbVSaCWQ/eI2xnwgJxjNtskFxrP9do3pKhp3vooboF3FVdJBbyn0OZAu6qXIUiAHaJQiM4GcoplZUCdRMxNVVEwre9TeAsA6JS24jJJMAAAAAElFTkSuQmCC", ue = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAfCAYAAADwbH0HAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCDQxnLQ5VQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAGASURBVEjHvde3UgMxEIBhAUNBdoKCHEo/Aa9BCwWtXw7GBRVDGPKAzzahIaeKmhp+CmSP5izJF/a8rXb3mztJJ51SRgB9qkfRb6AVpdQWMCiNANPANlAKD1SAX/6jKolr9F73bgKF1sCGgSKJh9BWBEBOAbPAE52RCtfog6XvLjDUSpoDnqVwD7rXRo3keeAlLQ7MONB9YNhVlArX6KOl/sCJGsULwGtc3IMedkWNJovAW1Tcgx4BI3EXSCTcgx4Do0m3xBLw7sI96Eli1MCXgQ9L8x0HegqMSX32XHg4zsRQA18BPj3oOTCeyVEGrDrQ746TRxAtATeeJ66KH6kavY4wx3I4UHSgl8BXJrhGm66FBJTFcaAANCxNL8zVK4pHRUVxjdYdczrhqUuOA/kkaCpco4Gl6ArIxZim6LhGa5bkWhw0Fg7kHGgA5FNsRT8OrFnu1fU0aBf81rzUbwI/eqDRHpD58pn4HTAZTljXr7yYwQFT1tfbKVfCQK/+Fv8AJCO91qtSsKIAAAAASUVORK5CYII=", ge = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4ggUCDYA/1xb7QAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAADlSURBVEjH7dW/CsIwEAbw7ySDjyFOujgJ4jMU3AWp7eJLCE7+2ZzENxB8GmdHV0FBN5f6uVQMIW0aCk45KLSX3I9LCI3AEiRHAGYoj4WInMykKpjcBhA5wJ0t2XAULQF0jedQVqAc4FVEzsZ2PMoKXB16RwADGMAA/gdUJFsAJkZ+WKF2TLKvfWcA9kpELiSbAOaezcTa+xtAKiJP/U+84i+2JBOSHcsFNsjHjvncjGSMgtvui95I9opaIxmRfOXYtHQdLtQL04rWNtTAEq8dN9FamIZucvSuYWmtg6qh9TFj+ZWwD7+x6apgNh+aAAAAAElFTkSuQmCC", fe = ({ contentType: t, loading: i, content: n }) => /* @__PURE__ */ e("div", { className: "image-preview", children: /* @__PURE__ */ u(X, { show: i, children: [
160
+ t === "image/svg+xml" && /* @__PURE__ */ e(
161
+ "div",
162
+ {
163
+ className: "svg-preview",
164
+ style: {
165
+ backgroundImage: `url("${i || !n ? "" : n}")`
166
+ }
167
+ }
168
+ ),
169
+ t !== "image/svg+xml" && /* @__PURE__ */ e("img", { src: n, alt: "" })
170
+ ] }) }), he = ({ initialImageNumber: t, items: i, onDownload: n, onClose: l }) => {
171
+ const [r, a] = g(t), [d, c] = g(), [p, f] = g(!1), h = R(() => a((F) => Math.min(i.length - 1, F + 1)), [i]), o = R(() => a((F) => Math.max(0, F - 1)), []), m = Y({});
172
+ k(() => (b.addListener("right", h), b.addListener("left", o), b.addListener("esc", l), () => {
173
+ b.removeListener("right", h), b.removeListener("left", o), b.removeListener("esc", l);
174
+ }), [h, o, l]);
175
+ const s = i[r];
176
+ k(() => {
177
+ const F = m.current[s.key];
178
+ F ? c(N(s.contentType, F)) : (f(!0), n(s).then((v) => {
179
+ f(!1), m.current[s.key] = v, c(N(s.contentType, v));
180
+ }));
181
+ }, [s, n]);
182
+ const B = () => {
183
+ H(new Blob([m.current[s.key]]), s.filename);
184
+ }, T = i.length > 0 && r > 0, I = i.length > 0 && r < i.length - 1, { body: y } = document;
185
+ return y ? ne(
186
+ /* @__PURE__ */ u("div", { className: "di file-previewer", children: [
187
+ /* @__PURE__ */ e("div", { className: "background" }),
188
+ /* @__PURE__ */ u("div", { className: "header", children: [
189
+ /* @__PURE__ */ e("h1", { className: "filename", children: s.filename }),
190
+ /* @__PURE__ */ e("button", { className: "btn close", onClick: l, children: /* @__PURE__ */ e("span", { role: "img", "aria-label": "close", children: /* @__PURE__ */ e("img", { src: ue, alt: "close" }) }) })
191
+ ] }),
192
+ /* @__PURE__ */ u("div", { className: "content", children: [
193
+ /* @__PURE__ */ e("div", { className: "left", children: T && /* @__PURE__ */ e("button", { className: "btn previous", onClick: o, children: /* @__PURE__ */ e("span", { role: "img", "aria-label": "previous", children: /* @__PURE__ */ e("img", { src: Ae, alt: "previous" }) }) }) }),
194
+ /* @__PURE__ */ e("div", { className: "center", children: /* @__PURE__ */ e(fe, { loading: p, content: d, contentType: s.contentType }) }),
195
+ /* @__PURE__ */ e("div", { className: "right", children: I && /* @__PURE__ */ e("button", { className: "btn next", onClick: h, children: /* @__PURE__ */ e("span", { role: "img", "aria-label": "next", children: /* @__PURE__ */ e("img", { src: me, alt: "next" }) }) }) })
196
+ ] }),
197
+ /* @__PURE__ */ e("div", { className: "footer", children: /* @__PURE__ */ e("button", { className: "btn download", onClick: B, disabled: p, children: /* @__PURE__ */ e("span", { role: "img", "aria-label": "close", children: /* @__PURE__ */ e("img", { src: ge, alt: "download" }) }) }) })
198
+ ] }),
199
+ y
200
+ ) : null;
201
+ }, pe = ({ fileType: t, onClose: i, onUpload: n }) => {
202
+ const { t: l } = V(), [r, a] = g(null), [d, c] = g(""), [p, f] = g(!1), h = r && !d, o = async (s) => {
203
+ if (s) {
204
+ f(!0);
205
+ try {
206
+ await n(s, t), i();
207
+ } catch (B) {
208
+ K(B.message), console.error(B), f(!1);
209
+ }
210
+ }
211
+ };
212
+ return /* @__PURE__ */ e(
213
+ ee,
214
+ {
215
+ width: 450,
216
+ header: t === "documents" ? /* @__PURE__ */ e(A, { i18nKey: "assets.detail.files.uploadForm.addDocument", children: "Add document" }) : /* @__PURE__ */ e(A, { i18nKey: "assets.detail.files.uploadForm.addImage", children: "Add image" }),
217
+ content: /* @__PURE__ */ e(X, { show: p, children: /* @__PURE__ */ e(
218
+ le,
219
+ {
220
+ label: /* @__PURE__ */ e(A, { i18nKey: "assets.detail.files.uploadForm.fileLabel", children: "File to upload" }),
221
+ onChange: (s) => {
222
+ a(s), c(s ? "" : l("assets.detail.files.uploadForm.error.missingFile", {
223
+ defaultValue: "Please select a file"
224
+ }));
225
+ },
226
+ imagesOnly: t === "images",
227
+ error: d,
228
+ required: !0
229
+ }
230
+ ) }),
231
+ footer: /* @__PURE__ */ u(E, { children: [
232
+ /* @__PURE__ */ e(
233
+ w,
234
+ {
235
+ onClick: () => o(r),
236
+ primary: !0,
237
+ disabled: !h || p,
238
+ "data-testid": "save-button",
239
+ children: /* @__PURE__ */ e(A, { i18nKey: "general.actions.save", children: "Save" })
240
+ }
241
+ ),
242
+ /* @__PURE__ */ e(w, { onClick: i, children: /* @__PURE__ */ e(A, { i18nKey: "general.actions.cancel", children: "Cancel" }) })
243
+ ] })
244
+ }
245
+ );
246
+ };
247
+ function Ce(t, i) {
248
+ const n = U().map(({ categoryName: l }) => l);
249
+ return i && n.includes(i) ? t.filter((l) => l.category === i) : t.filter(
250
+ (l) => !l.category || !n.includes(l.category)
251
+ );
252
+ }
253
+ function x({ type: t, category: i }) {
254
+ const { loading: n, files: l, uploadFile: r, deleteFile: a, fetchFile: d } = ce(t), c = M(() => Ce(l, i), [l, i]), [p, f] = g(!1), [h, o] = g(!1), [m, s] = g(0), { t: B } = V(), T = te();
255
+ async function I(C) {
256
+ const D = await d(C);
257
+ H(new Blob([D]), C.filename);
258
+ }
259
+ function y(C) {
260
+ t === "images" ? (s(c.indexOf(C)), o(!0)) : I(C);
261
+ }
262
+ async function F(C) {
263
+ try {
264
+ await r(C, i);
265
+ } catch (D) {
266
+ console.error(D), K(/* @__PURE__ */ e(A, { i18nKey: "files.error.unknown", children: "Operation failed" }));
267
+ }
268
+ }
269
+ async function v(C) {
270
+ await T({
271
+ title: B("assets.detail.files.deleteConfirmTitle", { defaultValue: "Delete File" }),
272
+ message: B("assets.detail.files.deleteConfirmMessage", {
273
+ defaultValue: "Do you really want to delete this file?"
274
+ })
275
+ }) && await a(C);
276
+ }
277
+ return /* @__PURE__ */ u("div", { children: [
278
+ /* @__PURE__ */ e(
279
+ re,
280
+ {
281
+ files: c,
282
+ loading: n,
283
+ type: t,
284
+ onDownload: I,
285
+ onFilenameClick: y,
286
+ onDelete: v
287
+ }
288
+ ),
289
+ /* @__PURE__ */ e($, { authorities: ["WRITE_ASSET_OR_ASSET_GROUP_FILE"], children: /* @__PURE__ */ u(w, { onClick: () => f(!0), "data-testid": "add-file-button", children: [
290
+ /* @__PURE__ */ e(J, { add: !0 }),
291
+ t === "images" && /* @__PURE__ */ e(A, { i18nKey: "assets.detail.files.addImage", children: "Add image" }),
292
+ t === "documents" && /* @__PURE__ */ e(A, { i18nKey: "assets.detail.files.addFile", children: "Add file" })
293
+ ] }) }),
294
+ p && /* @__PURE__ */ e(pe, { fileType: t, onClose: () => f(!1), onUpload: F }),
295
+ h && /* @__PURE__ */ e(
296
+ he,
297
+ {
298
+ initialImageNumber: m,
299
+ items: c,
300
+ onDownload: d,
301
+ onClose: () => o(!1)
302
+ }
303
+ )
304
+ ] });
305
+ }
306
+ function Fe() {
307
+ return [
308
+ {
309
+ path: "documents",
310
+ renderHeading: () => /* @__PURE__ */ e(A, { i18nKey: "assets.detail.files.tabs.documents", children: "Documents" }),
311
+ renderBody: () => /* @__PURE__ */ e(x, { type: "documents" })
312
+ },
313
+ ...U().filter(({ type: t }) => t === "documents").map(({ categoryName: t, locizeKey: i, locizeDefaultValue: n }) => ({
314
+ path: t,
315
+ renderHeading: () => /* @__PURE__ */ e(A, { i18nKey: i, children: n }),
316
+ renderBody: () => /* @__PURE__ */ e(x, { type: "documents", category: t })
317
+ })),
318
+ {
319
+ path: "images",
320
+ renderHeading: () => /* @__PURE__ */ e(A, { i18nKey: "assets.detail.files.tabs.images", children: "Images" }),
321
+ renderBody: () => /* @__PURE__ */ e(x, { type: "images" })
322
+ },
323
+ ...U().filter(({ type: t }) => t === "images").map(({ categoryName: t, locizeKey: i, locizeDefaultValue: n }) => ({
324
+ path: t,
325
+ renderHeading: () => /* @__PURE__ */ e(A, { i18nKey: i, children: n }),
326
+ renderBody: () => /* @__PURE__ */ e(x, { type: "images", category: t })
327
+ }))
328
+ ];
329
+ }
330
+ function Ne({ asset: t, assetGroup: i }) {
331
+ return /* @__PURE__ */ u("div", { children: [
332
+ /* @__PURE__ */ e(
333
+ G,
334
+ {
335
+ title: {
336
+ id: "assets.detail.files.name",
337
+ defaultValue: "Files"
338
+ }
339
+ }
340
+ ),
341
+ /* @__PURE__ */ e(de, { asset: t, assetGroup: i, children: /* @__PURE__ */ e(Q, { pages: Fe() }) })
342
+ ] });
343
+ }
344
+ export {
345
+ Ne as default
346
+ };
347
+ //# sourceMappingURL=Files-BniY5cJF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Files-BniY5cJF.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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"}
@@ -0,0 +1,103 @@
1
+ import { jsx as e, jsxs as f, Fragment as h } from "react/jsx-runtime";
2
+ import { models as u } from "powerbi-client";
3
+ import { PowerBIEmbed as B } from "powerbi-client-react";
4
+ import { useMemo as C, useState as l, useEffect as m } from "react";
5
+ import { getParamsForSingleReport as P } from "@deviceinsight/ng-ui-api-client";
6
+ import { Tabs as T, Spinner as R } from "@deviceinsight/ng-ui-basic-components";
7
+ import { messageBoxError as k } from "@deviceinsight/ng-ui-components";
8
+ import { U as E, a as g } from "./setTitle-Ck-71vC0.js";
9
+ import "react-i18next";
10
+ function N(r, i) {
11
+ return r ? /* @__PURE__ */ e("div", { id: "power-bi-report-container", children: /* @__PURE__ */ e(
12
+ B,
13
+ {
14
+ embedConfig: {
15
+ type: "report",
16
+ // Supported types: report, dashboard, tile, visual and qna
17
+ id: r.id,
18
+ embedUrl: r.embedUrl,
19
+ accessToken: r.embedToken,
20
+ tokenType: u.TokenType.Embed,
21
+ settings: {
22
+ panes: {
23
+ filters: {
24
+ expanded: !1,
25
+ visible: !1
26
+ }
27
+ },
28
+ background: u.BackgroundType.Transparent
29
+ }
30
+ },
31
+ eventHandlers: /* @__PURE__ */ new Map([
32
+ [
33
+ "error",
34
+ (a) => {
35
+ k(
36
+ "An error occurred displaying the report (see browser console for details)",
37
+ void 0,
38
+ "PowerBiReport"
39
+ ), console.error("Error displaying PowerBi report."), console.error(a?.detail);
40
+ }
41
+ ]
42
+ ]),
43
+ cssClassName: "power-bi-report"
44
+ }
45
+ ) }) : /* @__PURE__ */ f(h, { children: [
46
+ /* @__PURE__ */ e("h2", { children: /* @__PURE__ */ e(g, { i18nKey: "globalPowerBiReports.errorLoadingReport", children: "Error loading report:" }) }),
47
+ i && /* @__PURE__ */ e("pre", { children: JSON.stringify(i, null, 4) }),
48
+ !i && /* @__PURE__ */ f("pre", { children: [
49
+ /* @__PURE__ */ e(g, { i18nKey: "globalPowerBiReports.noErrorGivenByBackend", children: "No error given by backend." }),
50
+ " "
51
+ ] })
52
+ ] });
53
+ }
54
+ function K() {
55
+ const r = C(() => {
56
+ const o = E.getPowerBiReports();
57
+ return o ? o.map((s, n) => ({ ...s, tabName: `report-${n}` })) : [];
58
+ }, []), [i, a] = l(!0), [t, d] = l(null), [b, p] = l(null), [w, c] = l(null);
59
+ m(() => {
60
+ d(r[0].tabName);
61
+ }, [r]), m(() => {
62
+ async function o() {
63
+ if (t) {
64
+ a(!0), p(null);
65
+ const s = r.find((n) => n.tabName === t);
66
+ if (s)
67
+ try {
68
+ const n = await P(
69
+ s.workspaceId,
70
+ s.reportId
71
+ );
72
+ p(n), c(null);
73
+ } catch (n) {
74
+ p(null), c(n?.response?.data);
75
+ } finally {
76
+ a(!1);
77
+ }
78
+ else
79
+ throw console.error("Could not find tab in report configs:", t), console.error("Current report configs:", r), new Error(`${t} not found in reportConfigs!`);
80
+ }
81
+ }
82
+ o();
83
+ }, [t, r]);
84
+ function y() {
85
+ return i ? /* @__PURE__ */ e(R, { center: !0 }) : N(b, w);
86
+ }
87
+ return /* @__PURE__ */ e(
88
+ T,
89
+ {
90
+ currentTab: t,
91
+ onChange: d,
92
+ pages: r.map((o) => ({
93
+ name: o.tabName,
94
+ renderHeading: () => /* @__PURE__ */ e("span", { children: o.reportHeading }),
95
+ renderBody: () => y()
96
+ }))
97
+ }
98
+ );
99
+ }
100
+ export {
101
+ K as default
102
+ };
103
+ //# sourceMappingURL=GlobalPowerBiReports-CayA5Bqf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalPowerBiReports-CayA5Bqf.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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"}
@@ -0,0 +1,53 @@
1
+ import { jsx as f } from "react/jsx-runtime";
2
+ import { useRef as l, useEffectEvent as w, useCallback as D, useEffect as S } from "react";
3
+ import a from "vis";
4
+ import { SpinnerContainer as v } from "@deviceinsight/ng-ui-basic-components";
5
+ import "vis/dist/vis-network.min.css";
6
+ const g = (t) => {
7
+ t.once("afterDrawing", () => {
8
+ t.moveTo({
9
+ scale: 10,
10
+ position: {
11
+ x: 0,
12
+ y: 0
13
+ }
14
+ }), t.fit({
15
+ animation: {
16
+ duration: 200,
17
+ easingFunction: "easeOutQuad"
18
+ }
19
+ });
20
+ });
21
+ }, x = ({ networkOptions: t, nodes: r, edges: n, animate: u, onNodeClick: i, height: m, isLoading: p }) => {
22
+ const e = l(null), o = l(null), c = w(() => {
23
+ e.current && (e.current.destroy(), e.current = null);
24
+ }), s = D(() => {
25
+ if (r && n && o.current) {
26
+ const d = new a.DataSet(r), h = new a.DataSet(n);
27
+ e.current = new a.Network(
28
+ o.current,
29
+ {
30
+ nodes: d,
31
+ edges: h
32
+ },
33
+ t
34
+ ), e.current.on("doubleClick", i), u && g(e.current);
35
+ }
36
+ }, [t, r, n, u, i]);
37
+ return S(() => (c(), s(), c), [s]), /* @__PURE__ */ f(v, { show: p, children: /* @__PURE__ */ f(
38
+ "div",
39
+ {
40
+ style: {
41
+ height: m
42
+ },
43
+ ref: o
44
+ }
45
+ ) });
46
+ };
47
+ x.defaultProps = {
48
+ height: 480
49
+ };
50
+ export {
51
+ x as default
52
+ };
53
+ //# sourceMappingURL=Graph-BqYDNKEo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Graph-BqYDNKEo.js","sources":["../ng-ui-scale/src/components/graph/Graph.tsx"],"sourcesContent":["import {useCallback, useEffect, useEffectEvent, useRef} from 'react';\nimport vis, {type Edge, type Node} from 'vis';\n\nimport {SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\n\nimport 'vis/dist/vis-network.min.css';\n\ntype Props = {\n\tnodes: Array<Node>;\n\tedges: Array<Edge>;\n\tnetworkOptions: Record<string, any>;\n\tanimate?: boolean;\n\tisLoading: boolean;\n\theight?: number;\n\tonNodeClick: (params: Record<string, any>) => void;\n};\n\nconst animateIn = (network: vis.Network) => {\n\tnetwork.once('afterDrawing', () => {\n\t\tnetwork.moveTo({\n\t\t\tscale: 10,\n\t\t\tposition: {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t},\n\t\t});\n\t\tnetwork.fit({\n\t\t\tanimation: {\n\t\t\t\tduration: 200,\n\t\t\t\teasingFunction: 'easeOutQuad',\n\t\t\t},\n\t\t});\n\t});\n};\n\nconst Graph = ({networkOptions, nodes, edges, animate, onNodeClick, height, isLoading}: Props) => {\n\tconst networkRef = useRef<vis.Network | null>(null);\n\tconst chartContainerRef = useRef<HTMLDivElement>(null);\n\n\tconst terminateNetwork = useEffectEvent(() => {\n\t\tif (networkRef.current) {\n\t\t\tnetworkRef.current.destroy();\n\t\t\tnetworkRef.current = null;\n\t\t}\n\t});\n\n\tconst updateNetwork = useCallback(() => {\n\t\tif (nodes && edges && chartContainerRef.current) {\n\t\t\tconst nodesDataSet = new vis.DataSet(nodes),\n\t\t\t\tedgesDataSet = new vis.DataSet(edges);\n\t\t\tnetworkRef.current = new vis.Network(\n\t\t\t\tchartContainerRef.current,\n\t\t\t\t{\n\t\t\t\t\tnodes: nodesDataSet,\n\t\t\t\t\tedges: edgesDataSet,\n\t\t\t\t},\n\t\t\t\tnetworkOptions,\n\t\t\t);\n\t\t\tnetworkRef.current.on('doubleClick', onNodeClick);\n\n\t\t\tif (animate) {\n\t\t\t\tanimateIn(networkRef.current);\n\t\t\t}\n\t\t}\n\t}, [networkOptions, nodes, edges, animate, onNodeClick]);\n\tuseEffect(() => {\n\t\tterminateNetwork();\n\t\tupdateNetwork();\n\t\treturn terminateNetwork;\n\t}, [updateNetwork]);\n\treturn (\n\t\t<SpinnerContainer show={isLoading}>\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\theight,\n\t\t\t\t}}\n\t\t\t\tref={chartContainerRef}\n\t\t\t/>\n\t\t</SpinnerContainer>\n\t);\n};\n\nGraph.defaultProps = {\n\theight: 480,\n};\nexport default Graph;\n"],"names":["animateIn","network","Graph","networkOptions","nodes","edges","animate","onNodeClick","height","isLoading","networkRef","useRef","chartContainerRef","terminateNetwork","useEffectEvent","updateNetwork","useCallback","nodesDataSet","vis","edgesDataSet","useEffect","jsx","SpinnerContainer"],"mappings":";;;;;AAiBA,MAAMA,IAAY,CAACC,MAAyB;AAC3C,EAAAA,EAAQ,KAAK,gBAAgB,MAAM;AAClC,IAAAA,EAAQ,OAAO;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,QACT,GAAG;AAAA,QACH,GAAG;AAAA,MAAA;AAAA,IACJ,CACA,GACDA,EAAQ,IAAI;AAAA,MACX,WAAW;AAAA,QACV,UAAU;AAAA,QACV,gBAAgB;AAAA,MAAA;AAAA,IACjB,CACA;AAAA,EACF,CAAC;AACF,GAEMC,IAAQ,CAAC,EAAC,gBAAAC,GAAgB,OAAAC,GAAO,OAAAC,GAAO,SAAAC,GAAS,aAAAC,GAAa,QAAAC,GAAQ,WAAAC,QAAsB;AACjG,QAAMC,IAAaC,EAA2B,IAAI,GAC5CC,IAAoBD,EAAuB,IAAI,GAE/CE,IAAmBC,EAAe,MAAM;AAC7C,IAAIJ,EAAW,YACdA,EAAW,QAAQ,QAAA,GACnBA,EAAW,UAAU;AAAA,EAEvB,CAAC,GAEKK,IAAgBC,EAAY,MAAM;AACvC,QAAIZ,KAASC,KAASO,EAAkB,SAAS;AAChD,YAAMK,IAAe,IAAIC,EAAI,QAAQd,CAAK,GACzCe,IAAe,IAAID,EAAI,QAAQb,CAAK;AACrC,MAAAK,EAAW,UAAU,IAAIQ,EAAI;AAAA,QAC5BN,EAAkB;AAAA,QAClB;AAAA,UACC,OAAOK;AAAA,UACP,OAAOE;AAAA,QAAA;AAAA,QAERhB;AAAA,MAAA,GAEDO,EAAW,QAAQ,GAAG,eAAeH,CAAW,GAE5CD,KACHN,EAAUU,EAAW,OAAO;AAAA,IAE9B;AAAA,EACD,GAAG,CAACP,GAAgBC,GAAOC,GAAOC,GAASC,CAAW,CAAC;AACvD,SAAAa,EAAU,OACTP,EAAA,GACAE,EAAA,GACOF,IACL,CAACE,CAAa,CAAC,GAEjB,gBAAAM,EAACC,GAAA,EAAiB,MAAMb,GACvB,UAAA,gBAAAY;AAAA,IAAC;AAAA,IAAA;AAAA,MACA,OAAO;AAAA,QACN,QAAAb;AAAA,MAAA;AAAA,MAED,KAAKI;AAAA,IAAA;AAAA,EAAA,GAEP;AAEF;AAEAV,EAAM,eAAe;AAAA,EACpB,QAAQ;AACT;"}