@oneuptime/common 11.0.0 → 11.0.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.
@@ -1,88 +1,180 @@
1
1
  import ModelAPI from "../../Utils/ModelAPI/ModelAPI";
2
+ import API from "../../Utils/API/API";
3
+ import ModelImportExportUtil from "../../Utils/ModelImportExport";
4
+ import PermissionUtil from "../../Utils/Permission";
5
+ import User from "../../Utils/User";
2
6
  import { FormType } from "../Forms/ModelForm";
3
7
  import ModelFormModal from "../ModelFormModal/ModelFormModal";
4
- import BaseModelTable, { ModalType } from "./BaseModelTable";
8
+ import BaseModelTable, { ModalType, } from "./BaseModelTable";
9
+ import ImportModelsModal from "../ImportExport/ImportModelsModal";
10
+ import { ButtonStyleType } from "../Button/Button";
5
11
  import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
12
+ import IconProp from "../../../Types/Icon/IconProp";
6
13
  import ObjectID from "../../../Types/ObjectID";
7
- import React from "react";
14
+ import React, { useState } from "react";
8
15
  const ModelTable = (props) => {
16
+ var _a, _b;
9
17
  const modelAPI = props.modelAPI || ModelAPI;
10
18
  const model = new props.modelType();
11
- return (React.createElement(BaseModelTable, Object.assign({}, props, { callbacks: {
12
- getJSONFromModel: (item) => {
13
- return BaseModel.toJSONObject(item, props.modelType);
14
- },
15
- updateById: async (args) => {
16
- const { id, data } = args;
17
- await modelAPI.updateById({
18
- modelType: props.modelType,
19
- id: new ObjectID(id),
20
- data: data,
21
- });
22
- },
23
- toJSONArray: (items) => {
24
- return BaseModel.toJSONObjectArray(items, props.modelType);
25
- },
26
- getList: async (data) => {
27
- return await modelAPI.getList({
28
- modelType: data.modelType,
29
- query: data.query,
30
- limit: data.limit,
31
- groupBy: data.groupBy,
32
- skip: data.skip,
33
- sort: data.sort,
34
- select: data.select,
35
- requestOptions: data.requestOptions,
36
- });
37
- },
38
- addSlugToSelect: (select) => {
39
- const slugifyColumn = model.getSlugifyColumn();
40
- if (slugifyColumn) {
41
- select[slugifyColumn] = true;
19
+ const [showImportModal, setShowImportModal] = useState(false);
20
+ const [importRefreshCounter, setImportRefreshCounter] = useState(0);
21
+ const getExportBulkAction = () => {
22
+ return {
23
+ title: "Export JSON",
24
+ buttonStyleType: ButtonStyleType.NORMAL,
25
+ icon: IconProp.Download,
26
+ onClick: async ({ items, onProgressInfo, onBulkActionStart, onBulkActionEnd, }) => {
27
+ onBulkActionStart();
28
+ const inProgressItems = [...items];
29
+ const successItems = [];
30
+ const failedItems = [];
31
+ const itemsToExport = [];
32
+ for (const item of items) {
33
+ inProgressItems.splice(inProgressItems.indexOf(item), 1);
34
+ try {
35
+ if (!item.id) {
36
+ throw new Error(`${model.singularName || "Item"} id not found.`);
37
+ }
38
+ const fetchedItem = await ModelImportExportUtil.fetchItemForExport({
39
+ modelType: props.modelType,
40
+ modelId: item.id,
41
+ modelAPI: modelAPI,
42
+ });
43
+ itemsToExport.push(fetchedItem);
44
+ successItems.push(item);
45
+ }
46
+ catch (err) {
47
+ failedItems.push({
48
+ item: item,
49
+ failedMessage: API.getFriendlyMessage(err),
50
+ });
51
+ }
52
+ onProgressInfo({
53
+ totalItems: items,
54
+ inProgressItems: [...inProgressItems],
55
+ successItems: [...successItems],
56
+ failed: [...failedItems],
57
+ });
42
58
  }
43
- return select;
44
- },
45
- showCreateEditModal: (data) => {
46
- var _a;
47
- const { modalType, modelIdToEdit, onBeforeCreate, onSuccess, onClose, } = data;
48
- return (React.createElement(ModelFormModal, { modelAPI: props.modelAPI, title: modalType === ModalType.Create
49
- ? `${props.createVerb || "Create"} New ${props.singularName || model.singularName}`
50
- : `Edit ${props.singularName || model.singularName}`, formRef: props.createEditFromRef, modalWidth: props.createEditModalWidth, name: modalType === ModalType.Create
51
- ? `${props.name} > ${props.createVerb || "Create"} New ${props.singularName || model.singularName}`
52
- : `${props.name} > Edit ${props.singularName || model.singularName}`, initialValues: modalType === ModalType.Create
53
- ? props.createInitialValues
54
- : undefined, onClose: onClose, submitButtonText: modalType === ModalType.Create
55
- ? `${props.createVerb || "Create"} ${props.singularName || model.singularName}`
56
- : `Save Changes`, onSuccess: onSuccess, onBeforeCreate: onBeforeCreate, modelType: props.modelType, formProps: {
57
- summary: props.formSummary,
58
- name: `create-${props.modelType.name}-from`,
59
+ if (itemsToExport.length > 0) {
60
+ ModelImportExportUtil.downloadExportFile({
59
61
  modelType: props.modelType,
60
- id: `create-${props.modelType.name}-from`,
61
- fields: ((_a = props.formFields) === null || _a === void 0 ? void 0 : _a.filter((field) => {
62
- // If the field has doNotShowWhenEditing set to true, then don't show it when editing
63
- if (modelIdToEdit) {
64
- return !field.doNotShowWhenEditing;
65
- }
66
- // If the field has doNotShowWhenCreating set to true, then don't show it when creating
67
- return !field.doNotShowWhenCreating;
68
- })) || [],
69
- steps: props.formSteps || [],
70
- formType: modalType === ModalType.Create
71
- ? FormType.Create
72
- : FormType.Update,
73
- }, modelIdToEdit: modelIdToEdit }));
74
- },
75
- getModelFromJSON: (item) => {
76
- return BaseModel.fromJSON(item, props.modelType);
77
- },
78
- deleteItem: async (item) => {
79
- await modelAPI.deleteItem({
80
- modelType: props.modelType,
81
- id: item.id,
82
- requestOptions: props.deleteRequestOptions,
83
- });
62
+ items: itemsToExport,
63
+ });
64
+ }
65
+ onBulkActionEnd();
84
66
  },
85
- } })));
67
+ };
68
+ };
69
+ let bulkActions = props.bulkActions;
70
+ let cardProps = props.cardProps;
71
+ let refreshToggle = props.refreshToggle;
72
+ if (props.enableJsonImportExport) {
73
+ bulkActions = Object.assign(Object.assign({}, (props.bulkActions || {})), { buttons: [...(((_a = props.bulkActions) === null || _a === void 0 ? void 0 : _a.buttons) || []), getExportBulkAction()] });
74
+ const permissions = PermissionUtil.getAllPermissions();
75
+ const hasPermissionToCreate = permissions
76
+ ? model.hasCreatePermissions(permissions) || User.isMasterAdmin()
77
+ : false;
78
+ if (hasPermissionToCreate) {
79
+ cardProps = Object.assign(Object.assign({}, (props.cardProps || {})), { buttons: [
80
+ ...(((_b = props.cardProps) === null || _b === void 0 ? void 0 : _b.buttons) || []),
81
+ {
82
+ title: "Import JSON",
83
+ buttonStyle: ButtonStyleType.OUTLINE,
84
+ icon: IconProp.Upload,
85
+ onClick: () => {
86
+ setShowImportModal(true);
87
+ },
88
+ },
89
+ ] });
90
+ }
91
+ refreshToggle = `${props.refreshToggle || ""}-import-${importRefreshCounter}`;
92
+ }
93
+ return (React.createElement(React.Fragment, null,
94
+ showImportModal && (React.createElement(ImportModelsModal, { modelType: props.modelType, modelAPI: modelAPI, onClose: () => {
95
+ setShowImportModal(false);
96
+ }, onImportComplete: (result) => {
97
+ if (result.successCount > 0) {
98
+ setImportRefreshCounter((counter) => {
99
+ return counter + 1;
100
+ });
101
+ }
102
+ } })),
103
+ React.createElement(BaseModelTable, Object.assign({}, props, { bulkActions: bulkActions, cardProps: cardProps, refreshToggle: refreshToggle, callbacks: {
104
+ getJSONFromModel: (item) => {
105
+ return BaseModel.toJSONObject(item, props.modelType);
106
+ },
107
+ updateById: async (args) => {
108
+ const { id, data } = args;
109
+ await modelAPI.updateById({
110
+ modelType: props.modelType,
111
+ id: new ObjectID(id),
112
+ data: data,
113
+ });
114
+ },
115
+ toJSONArray: (items) => {
116
+ return BaseModel.toJSONObjectArray(items, props.modelType);
117
+ },
118
+ getList: async (data) => {
119
+ return await modelAPI.getList({
120
+ modelType: data.modelType,
121
+ query: data.query,
122
+ limit: data.limit,
123
+ groupBy: data.groupBy,
124
+ skip: data.skip,
125
+ sort: data.sort,
126
+ select: data.select,
127
+ requestOptions: data.requestOptions,
128
+ });
129
+ },
130
+ addSlugToSelect: (select) => {
131
+ const slugifyColumn = model.getSlugifyColumn();
132
+ if (slugifyColumn) {
133
+ select[slugifyColumn] = true;
134
+ }
135
+ return select;
136
+ },
137
+ showCreateEditModal: (data) => {
138
+ var _a;
139
+ const { modalType, modelIdToEdit, onBeforeCreate, onSuccess, onClose, } = data;
140
+ return (React.createElement(ModelFormModal, { modelAPI: props.modelAPI, title: modalType === ModalType.Create
141
+ ? `${props.createVerb || "Create"} New ${props.singularName || model.singularName}`
142
+ : `Edit ${props.singularName || model.singularName}`, formRef: props.createEditFromRef, modalWidth: props.createEditModalWidth, name: modalType === ModalType.Create
143
+ ? `${props.name} > ${props.createVerb || "Create"} New ${props.singularName || model.singularName}`
144
+ : `${props.name} > Edit ${props.singularName || model.singularName}`, initialValues: modalType === ModalType.Create
145
+ ? props.createInitialValues
146
+ : undefined, onClose: onClose, submitButtonText: modalType === ModalType.Create
147
+ ? `${props.createVerb || "Create"} ${props.singularName || model.singularName}`
148
+ : `Save Changes`, onSuccess: onSuccess, onBeforeCreate: onBeforeCreate, modelType: props.modelType, formProps: {
149
+ summary: props.formSummary,
150
+ name: `create-${props.modelType.name}-from`,
151
+ modelType: props.modelType,
152
+ id: `create-${props.modelType.name}-from`,
153
+ fields: ((_a = props.formFields) === null || _a === void 0 ? void 0 : _a.filter((field) => {
154
+ // If the field has doNotShowWhenEditing set to true, then don't show it when editing
155
+ if (modelIdToEdit) {
156
+ return !field.doNotShowWhenEditing;
157
+ }
158
+ // If the field has doNotShowWhenCreating set to true, then don't show it when creating
159
+ return !field.doNotShowWhenCreating;
160
+ })) || [],
161
+ steps: props.formSteps || [],
162
+ formType: modalType === ModalType.Create
163
+ ? FormType.Create
164
+ : FormType.Update,
165
+ }, modelIdToEdit: modelIdToEdit }));
166
+ },
167
+ getModelFromJSON: (item) => {
168
+ return BaseModel.fromJSON(item, props.modelType);
169
+ },
170
+ deleteItem: async (item) => {
171
+ await modelAPI.deleteItem({
172
+ modelType: props.modelType,
173
+ id: item.id,
174
+ requestOptions: props.deleteRequestOptions,
175
+ });
176
+ },
177
+ } }))));
86
178
  };
87
179
  export default ModelTable;
88
180
  //# sourceMappingURL=ModelTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ModelTable.js","sourceRoot":"","sources":["../../../../../UI/Components/ModelTable/ModelTable.tsx"],"names":[],"mappings":"AAAA,OAAO,QAA4B,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAc,MAAM,oBAAoB,CAAC;AAC1D,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,cAAc,EAAE,EAAkB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,SAEN,MAAM,oEAAoE,CAAC;AAG5E,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,KAAuB,MAAM,OAAO,CAAC;AAW5C,MAAM,UAAU,GAEI,CAClB,KAAiC,EACnB,EAAE;IAChB,MAAM,QAAQ,GAAoB,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC7D,MAAM,KAAK,GAAe,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;IAEhD,OAAO,CACL,oBAAC,cAAc,oBACT,KAAK,IACT,SAAS,EAAE;YACT,gBAAgB,EAAE,CAAC,IAAgB,EAAc,EAAE;gBACjD,OAAO,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACvD,CAAC;YAED,UAAU,EAAE,KAAK,EAAE,IAAwC,EAAE,EAAE;gBAC7D,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;gBAE1B,MAAM,QAAQ,CAAC,UAAU,CAAC;oBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,EAAE,EAAE,IAAI,QAAQ,CAAC,EAAE,CAAC;oBACpB,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;YACL,CAAC;YAED,WAAW,EAAE,CAAC,KAAmB,EAAgB,EAAE;gBACjD,OAAO,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7D,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,IASf,EAAE,EAAE;gBACH,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAa;oBACxC,SAAS,EAAE,IAAI,CAAC,SAAmC;oBACnD,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,cAAc,EAAE,IAAI,CAAC,cAAc;iBACpC,CAAC,CAAC;YACL,CAAC;YAED,eAAe,EAAE,CAAC,MAA0B,EAAsB,EAAE;gBAClE,MAAM,aAAa,GACjB,KACD,CAAC,gBAAgB,EAAE,CAAC;gBAErB,IAAI,aAAa,EAAE,CAAC;oBACjB,MAA8B,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;gBACxD,CAAC;gBAED,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,mBAAmB,EAAE,CAAC,IAWrB,EAAgB,EAAE;;gBACjB,MAAM,EACJ,SAAS,EACT,aAAa,EACb,cAAc,EACd,SAAS,EACT,OAAO,GACR,GAAG,IAAI,CAAC;gBAET,OAAO,CACL,oBAAC,cAAc,IACb,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EACH,SAAS,KAAK,SAAS,CAAC,MAAM;wBAC5B,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,IAAI,QAAQ,QAC7B,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAC9B,EAAE;wBACJ,CAAC,CAAC,QAAQ,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,EAAE,EAExD,OAAO,EAAE,KAAK,CAAC,iBAAiB,EAChC,UAAU,EAAE,KAAK,CAAC,oBAAoB,EACtC,IAAI,EACF,SAAS,KAAK,SAAS,CAAC,MAAM;wBAC5B,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,UAAU,IAAI,QAAQ,QAC7C,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAC9B,EAAE;wBACJ,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,WACX,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAC9B,EAAE,EAER,aAAa,EACX,SAAS,KAAK,SAAS,CAAC,MAAM;wBAC5B,CAAC,CAAC,KAAK,CAAC,mBAAmB;wBAC3B,CAAC,CAAC,SAAS,EAEf,OAAO,EAAE,OAAO,EAChB,gBAAgB,EACd,SAAS,KAAK,SAAS,CAAC,MAAM;wBAC5B,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,IAAI,QAAQ,IAC7B,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAC9B,EAAE;wBACJ,CAAC,CAAC,cAAc,EAEpB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,SAAS,EAAE;wBACT,OAAO,EAAE,KAAK,CAAC,WAAW;wBAC1B,IAAI,EAAE,UAAU,KAAK,CAAC,SAAS,CAAC,IAAI,OAAO;wBAC3C,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,EAAE,EAAE,UAAU,KAAK,CAAC,SAAS,CAAC,IAAI,OAAO;wBACzC,MAAM,EACJ,CAAA,MAAA,KAAK,CAAC,UAAU,0CAAE,MAAM,CAAC,CAAC,KAA6B,EAAE,EAAE;4BACzD,qFAAqF;4BAErF,IAAI,aAAa,EAAE,CAAC;gCAClB,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;4BACrC,CAAC;4BAED,uFAAuF;4BAEvF,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC;wBACtC,CAAC,CAAC,KAAI,EAAE;wBACV,KAAK,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;wBAC5B,QAAQ,EACN,SAAS,KAAK,SAAS,CAAC,MAAM;4BAC5B,CAAC,CAAC,QAAQ,CAAC,MAAM;4BACjB,CAAC,CAAC,QAAQ,CAAC,MAAM;qBACtB,EACD,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC;YACJ,CAAC;YAED,gBAAgB,EAAE,CAAC,IAAgB,EAAc,EAAE;gBACjD,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAe,CAAC;YACjE,CAAC;YAED,UAAU,EAAE,KAAK,EAAE,IAAgB,EAAE,EAAE;gBACrC,MAAM,QAAQ,CAAC,UAAU,CAAC;oBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,EAAE,EAAE,IAAI,CAAC,EAAc;oBACvB,cAAc,EAAE,KAAK,CAAC,oBAAoB;iBAC3C,CAAC,CAAC;YACL,CAAC;SACF,IACD,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ModelTable.js","sourceRoot":"","sources":["../../../../../UI/Components/ModelTable/ModelTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import BadDataException from "../../Types/Exception/BadDataException";
2
+ import ModelImportExport from "../../Utils/ModelImportExport";
3
+ import API from "./API/API";
4
+ import ModelAPI from "./ModelAPI/ModelAPI";
5
+ export default class ModelImportExportUtil {
6
+ static async fetchItemForExport(data) {
7
+ const modelAPI = data.modelAPI || ModelAPI;
8
+ const item = await modelAPI.getItem({
9
+ modelType: data.modelType,
10
+ id: data.modelId,
11
+ select: ModelImportExport.getImportExportSelect(data.modelType),
12
+ });
13
+ if (!item || !item.id) {
14
+ const model = new data.modelType();
15
+ throw new BadDataException(`${model.singularName || "Item"} not found. It may have been deleted.`);
16
+ }
17
+ return item;
18
+ }
19
+ static downloadExportFile(data) {
20
+ const model = new data.modelType();
21
+ const envelope = ModelImportExport.buildExportEnvelope({
22
+ modelType: data.modelType,
23
+ items: data.items,
24
+ exportedAt: new Date(),
25
+ });
26
+ const resourceName = (model.tableName || "resources")
27
+ .replace(/[^a-zA-Z0-9-]/g, "-")
28
+ .toLowerCase();
29
+ const timestamp = new Date()
30
+ .toISOString()
31
+ .replace(/[:.]/g, "-")
32
+ .slice(0, 19);
33
+ this.downloadJSONFile({
34
+ content: JSON.stringify(envelope, null, 2),
35
+ filename: `${resourceName}-export-${timestamp}.json`,
36
+ });
37
+ }
38
+ static downloadJSONFile(data) {
39
+ const blob = new Blob([data.content], {
40
+ type: "application/json;charset=utf-8;",
41
+ });
42
+ const url = window.URL.createObjectURL(blob);
43
+ const anchor = document.createElement("a");
44
+ anchor.href = url;
45
+ anchor.download = data.filename;
46
+ document.body.appendChild(anchor);
47
+ anchor.click();
48
+ document.body.removeChild(anchor);
49
+ window.URL.revokeObjectURL(url);
50
+ }
51
+ static parseImportFileText(data) {
52
+ let payload = null;
53
+ try {
54
+ payload = JSON.parse(data.fileText);
55
+ }
56
+ catch (_a) {
57
+ throw new BadDataException("This file is not valid JSON. Please select a JSON export file.");
58
+ }
59
+ return ModelImportExport.parseImportPayload({
60
+ modelType: data.modelType,
61
+ payload: payload,
62
+ });
63
+ }
64
+ /*
65
+ * Creates each item through the regular create API so all server-side
66
+ * validation, permission checks and hooks apply. When an item fails only
67
+ * because a resource with the same name already exists, it is retried once
68
+ * with an "(Imported)" suffix so re-importing into the same project works.
69
+ */
70
+ static async importItems(data) {
71
+ var _a;
72
+ const modelAPI = data.modelAPI || ModelAPI;
73
+ const result = {
74
+ successCount: 0,
75
+ failures: [],
76
+ };
77
+ /*
78
+ * The column that holds the human-readable name of the resource - used
79
+ * to label failures and to rename on duplicate-name conflicts. Most
80
+ * models use "name"; template models use "templateName".
81
+ */
82
+ const displayNameColumn = [
83
+ "name",
84
+ "templateName",
85
+ "title",
86
+ ].find((columnName) => {
87
+ return new data.modelType().getTableColumns().hasColumn(columnName);
88
+ });
89
+ let completedCount = 0;
90
+ for (const itemJson of data.itemJsons) {
91
+ const itemName = (displayNameColumn &&
92
+ typeof itemJson[displayNameColumn] === "string" &&
93
+ itemJson[displayNameColumn]) ||
94
+ `Item ${completedCount + 1}`;
95
+ try {
96
+ const item = ModelImportExport.fromImportJSON({
97
+ json: itemJson,
98
+ modelType: data.modelType,
99
+ });
100
+ try {
101
+ await modelAPI.create({
102
+ model: item,
103
+ modelType: data.modelType,
104
+ });
105
+ result.successCount += 1;
106
+ }
107
+ catch (err) {
108
+ const errorMessage = API.getFriendlyMessage(err);
109
+ const canRetryWithNewName = Boolean(errorMessage.toLowerCase().includes("already exists") &&
110
+ displayNameColumn &&
111
+ typeof item.getValue(displayNameColumn) === "string");
112
+ if (canRetryWithNewName) {
113
+ item.setValue(displayNameColumn, `${(_a = item.getValue(displayNameColumn)) === null || _a === void 0 ? void 0 : _a.toString()} (Imported)`);
114
+ await modelAPI.create({
115
+ model: item,
116
+ modelType: data.modelType,
117
+ });
118
+ result.successCount += 1;
119
+ }
120
+ else {
121
+ result.failures.push({
122
+ itemName: itemName,
123
+ errorMessage: errorMessage,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ catch (err) {
129
+ result.failures.push({
130
+ itemName: itemName,
131
+ errorMessage: API.getFriendlyMessage(err),
132
+ });
133
+ }
134
+ completedCount += 1;
135
+ if (data.onProgress) {
136
+ data.onProgress(completedCount, data.itemJsons.length);
137
+ }
138
+ }
139
+ return result;
140
+ }
141
+ }
142
+ //# sourceMappingURL=ModelImportExport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelImportExport.js","sourceRoot":"","sources":["../../../../UI/Utils/ModelImportExport.ts"],"names":[],"mappings":"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"}