blixify-ui-web 1.2.102 → 1.2.104

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 (33) hide show
  1. package/lib/components/data/blobModule.d.ts +28 -0
  2. package/lib/components/data/blobModule.d.ts.map +1 -1
  3. package/lib/components/data/blobModule.js +148 -2
  4. package/lib/components/data/blobModule.js.map +1 -1
  5. package/lib/components/data/dataTemplate/index.d.ts.map +1 -1
  6. package/lib/components/data/dataTemplate/index.js +102 -103
  7. package/lib/components/data/dataTemplate/index.js.map +1 -1
  8. package/lib/components/data/dataTemplate/model.d.ts +2 -2
  9. package/lib/components/data/dataTemplate/socket.js +1 -1
  10. package/lib/components/data/dataTemplate/socket.js.map +1 -1
  11. package/lib/components/data/listModule.d.ts.map +1 -1
  12. package/lib/components/data/listModule.js +17 -0
  13. package/lib/components/data/listModule.js.map +1 -1
  14. package/lib/components/data/readModule.d.ts.map +1 -1
  15. package/lib/components/data/readModule.js +23 -21
  16. package/lib/components/data/readModule.js.map +1 -1
  17. package/package.json +1 -1
  18. package/lib/__tests__/components/data/fixtures.d.ts +0 -55
  19. package/lib/__tests__/components/data/fixtures.d.ts.map +0 -1
  20. package/lib/__tests__/components/data/fixtures.js +0 -109
  21. package/lib/__tests__/components/data/fixtures.js.map +0 -1
  22. package/lib/components/data/dataWrapper/dataWrapper.fixtures.d.ts +0 -9
  23. package/lib/components/data/dataWrapper/dataWrapper.fixtures.d.ts.map +0 -1
  24. package/lib/components/data/dataWrapper/dataWrapper.fixtures.js +0 -33
  25. package/lib/components/data/dataWrapper/dataWrapper.fixtures.js.map +0 -1
  26. package/lib/components/data/testData.d.ts +0 -29
  27. package/lib/components/data/testData.d.ts.map +0 -1
  28. package/lib/components/data/testData.js +0 -32
  29. package/lib/components/data/testData.js.map +0 -1
  30. package/lib/components/data/testSchema.d.ts +0 -47
  31. package/lib/components/data/testSchema.d.ts.map +0 -1
  32. package/lib/components/data/testSchema.js +0 -5008
  33. package/lib/components/data/testSchema.js.map +0 -1
@@ -1,4 +1,32 @@
1
+ import React from "react";
1
2
  export declare const handleDownloadFile: (fileUrl: string, fileName: string) => Promise<void>;
3
+ /**
4
+ * INFO: encodes ONLY the characters that break a storage url — "#" starts a
5
+ * fragment and cuts the name off, "?" starts the query early, and a "%" that is
6
+ * not already an escape makes the path undecodable. Everything else is left
7
+ * byte-for-byte as it was. Browsers already encode spaces and unicode on the
8
+ * wire, so a full encodeURIComponent would fix nothing extra — but it WOULD
9
+ * change the returned string for names that work today, and readModule splits
10
+ * that string back into the saved download name: "Site Plan.pdf" would start
11
+ * downloading as "Site%20Plan.pdf". An existing escape such as %20 or %2F is
12
+ * left alone, so an already-encoded stored name is never double-encoded.
13
+ */
14
+ export declare const handleEncodeStoredName: (name: string) => string;
2
15
  export declare const renderImageUrlFromPath: (pImageEndpoint: any, pImageCollection: any, pImageParentId: any, pImageFileName: any, pToken: any, bucketName?: string) => string;
3
16
  export declare const handleDataURLtoBlob: (dataUrl: string) => "" | Blob;
17
+ /**
18
+ * INFO: a multiple-asset entry is stored as <uuid><name> or <uuid>-<name> so
19
+ * entries in one field never collide. The uuid is storage bookkeeping — the
20
+ * name after it is the document the user chose, and that is what belongs on
21
+ * screen.
22
+ */
23
+ export declare const handleStripStoredPrefix: (fileName: string) => string;
24
+ export declare const handleCanPreviewFile: (fileName: string) => boolean;
25
+ export declare const renderFileChip: (params: {
26
+ label: string;
27
+ fileName: string;
28
+ url?: string;
29
+ index?: number;
30
+ onClick: () => void;
31
+ }) => React.JSX.Element;
4
32
  //# sourceMappingURL=blobModule.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"blobModule.d.ts","sourceRoot":"","sources":["../../../src/components/data/blobModule.tsx"],"names":[],"mappings":"AAKA,eAAO,MAAM,kBAAkB,YAAmB,MAAM,YAAY,MAAM,kBAgBzE,CAAC;AAEF,eAAO,MAAM,sBAAsB,mBACjB,GAAG,oBACD,GAAG,kBACL,GAAG,kBACH,GAAG,UACX,GAAG,eACE,MAAM,WA8BpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,YAAa,MAAM,cAalD,CAAC"}
1
+ {"version":3,"file":"blobModule.d.ts","sourceRoot":"","sources":["../../../src/components/data/blobModule.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAMxC,eAAO,MAAM,kBAAkB,YAAmB,MAAM,YAAY,MAAM,kBAgBzE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,SAAU,MAAM,WAIzB,CAAC;AAE3B,eAAO,MAAM,sBAAsB,mBACjB,GAAG,oBACD,GAAG,kBACL,GAAG,kBACH,GAAG,UACX,GAAG,eACE,MAAM,WA8BpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,YAAa,MAAM,cAalD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,aAAc,MAAM,WAoBvD,CAAC;AA0BF,eAAO,MAAM,oBAAoB,aAAc,MAAM,YAKpD,CAAC;AAyFF,eAAO,MAAM,cAAc,WAAY;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,sBASA,CAAC"}
@@ -1,4 +1,27 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
26
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
27
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -39,7 +62,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
39
62
  return (mod && mod.__esModule) ? mod : { "default": mod };
40
63
  };
41
64
  Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.handleDataURLtoBlob = exports.renderImageUrlFromPath = exports.handleDownloadFile = void 0;
65
+ exports.renderFileChip = exports.handleCanPreviewFile = exports.handleStripStoredPrefix = exports.handleDataURLtoBlob = exports.renderImageUrlFromPath = exports.handleEncodeStoredName = exports.handleDownloadFile = void 0;
66
+ var solid_1 = require("@heroicons/react/20/solid");
67
+ var button_1 = require("../action/button");
68
+ var modal_1 = require("../display/modal");
69
+ var react_1 = __importStar(require("react"));
43
70
  var axios_1 = __importDefault(require("axios"));
44
71
  //=====================================================================================
45
72
  //SECTION: Blob/Storage Functions
@@ -74,11 +101,29 @@ var handleDownloadFile = function (fileUrl, fileName) { return __awaiter(void 0,
74
101
  });
75
102
  }); };
76
103
  exports.handleDownloadFile = handleDownloadFile;
104
+ /**
105
+ * INFO: encodes ONLY the characters that break a storage url — "#" starts a
106
+ * fragment and cuts the name off, "?" starts the query early, and a "%" that is
107
+ * not already an escape makes the path undecodable. Everything else is left
108
+ * byte-for-byte as it was. Browsers already encode spaces and unicode on the
109
+ * wire, so a full encodeURIComponent would fix nothing extra — but it WOULD
110
+ * change the returned string for names that work today, and readModule splits
111
+ * that string back into the saved download name: "Site Plan.pdf" would start
112
+ * downloading as "Site%20Plan.pdf". An existing escape such as %20 or %2F is
113
+ * left alone, so an already-encoded stored name is never double-encoded.
114
+ */
115
+ var handleEncodeStoredName = function (name) {
116
+ return String(name)
117
+ .replace(/%(?![0-9A-Fa-f]{2})/g, "%25")
118
+ .replace(/#/g, "%23")
119
+ .replace(/\?/g, "%3F");
120
+ };
121
+ exports.handleEncodeStoredName = handleEncodeStoredName;
77
122
  var renderImageUrlFromPath = function (pImageEndpoint, pImageCollection, pImageParentId, pImageFileName, pToken, bucketName) {
78
123
  var imageEndpoint = pImageEndpoint !== null && pImageEndpoint !== void 0 ? pImageEndpoint : "";
79
124
  var imageCollection = pImageCollection !== null && pImageCollection !== void 0 ? pImageCollection : "";
80
125
  var imageParentId = pImageParentId !== null && pImageParentId !== void 0 ? pImageParentId : "";
81
- var imageFileName = pImageFileName !== null && pImageFileName !== void 0 ? pImageFileName : "";
126
+ var imageFileName = (0, exports.handleEncodeStoredName)(pImageFileName !== null && pImageFileName !== void 0 ? pImageFileName : "");
82
127
  var url = imageEndpoint +
83
128
  imageCollection +
84
129
  "%2F" +
@@ -120,4 +165,105 @@ var handleDataURLtoBlob = function (dataUrl) {
120
165
  return "";
121
166
  };
122
167
  exports.handleDataURLtoBlob = handleDataURLtoBlob;
168
+ /**
169
+ * INFO: a multiple-asset entry is stored as <uuid><name> or <uuid>-<name> so
170
+ * entries in one field never collide. The uuid is storage bookkeeping — the
171
+ * name after it is the document the user chose, and that is what belongs on
172
+ * screen.
173
+ */
174
+ var handleStripStoredPrefix = function (fileName) {
175
+ var _a, _b;
176
+ // INFO: a stored entry may be a full url rather than a bare name — the same
177
+ // basename-then-query trim the upload path uses when it reads a name back
178
+ // off one. Do this FIRST, or the uuid check never matches a url.
179
+ var basename = (_b = (_a = fileName.split("/").pop()) === null || _a === void 0 ? void 0 : _a.split("?")[0]) !== null && _b !== void 0 ? _b : fileName;
180
+ var unprefixed = basename.replace(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}-?/i, "");
181
+ var name = unprefixed || basename || fileName;
182
+ // INFO: a stored name can hold a literal % that is not an escape —
183
+ // "Q3 50% target.pdf". decodeURIComponent throws URIError on it, and this
184
+ // runs while React renders the chip, outside readModule's per-field
185
+ // try/catch and with no error boundary in the library, so one such file
186
+ // would blank the whole read view. Show the raw name rather than crash.
187
+ try {
188
+ return decodeURIComponent(name);
189
+ }
190
+ catch (err) {
191
+ return name;
192
+ }
193
+ };
194
+ exports.handleStripStoredPrefix = handleStripStoredPrefix;
195
+ /**
196
+ * INFO: the browser renders these inline in an iframe. Anything else — docx,
197
+ * xlsx, zip — either downloads itself or shows a blank pane, so those skip the
198
+ * modal and download directly, which is what the chip did before previewing
199
+ * existed. Erring toward download is the safe side: a download the user did
200
+ * not need costs a click, a blank modal costs their trust in the button.
201
+ */
202
+ var PREVIEWABLE_EXTENSIONS = [
203
+ "pdf",
204
+ "png",
205
+ "jpg",
206
+ "jpeg",
207
+ "gif",
208
+ "webp",
209
+ "svg",
210
+ "avif",
211
+ "bmp",
212
+ "txt",
213
+ "mp4",
214
+ "webm",
215
+ "ogg",
216
+ "mov",
217
+ ];
218
+ var handleCanPreviewFile = function (fileName) {
219
+ var name = (0, exports.handleStripStoredPrefix)(fileName).toLowerCase();
220
+ var dot = name.lastIndexOf(".");
221
+ if (dot <= 0 || dot === name.length - 1)
222
+ return false;
223
+ return PREVIEWABLE_EXTENSIONS.includes(name.slice(dot + 1));
224
+ };
225
+ exports.handleCanPreviewFile = handleCanPreviewFile;
226
+ /**
227
+ * INFO: the chip owns its own preview state because readModule is a set of
228
+ * functions, not a component — there is no parent to hold one modal for all
229
+ * chips. Per-chip state costs nothing here: only one can be open at a time
230
+ * because opening it takes a click.
231
+ */
232
+ var FileChip = function (props) {
233
+ // 1. State
234
+ var _a = (0, react_1.useState)(false), preview = _a[0], setPreview = _a[1];
235
+ // 3. Computed
236
+ var stripped = (0, exports.handleStripStoredPrefix)(props.fileName);
237
+ // INFO: a single field holds ONE document, so the field's label names it
238
+ // best — the stored name there is fixed schema config, not the user's choice.
239
+ // A multiple field holds several DIFFERENT documents, so each entry's own
240
+ // name is what tells them apart; "Scans 1" and "Scans 2" would not.
241
+ var text = props.index === undefined
242
+ ? props.label || stripped
243
+ : stripped || "".concat(props.label, " ").concat(props.index + 1);
244
+ var canPreview = !!props.url && (0, exports.handleCanPreviewFile)(props.fileName);
245
+ // 5. handle functions
246
+ var handleClick = function () {
247
+ if (canPreview)
248
+ setPreview(true);
249
+ else
250
+ props.onDownload();
251
+ };
252
+ // 6. render functions
253
+ var renderPreview = function () { return (react_1.default.createElement("div", { className: "flex flex-col" },
254
+ react_1.default.createElement("iframe", { src: props.url, className: "h-[70vh] w-full rounded-md border-0", title: stripped }),
255
+ react_1.default.createElement("div", { className: "mt-4 flex flex-row justify-end" },
256
+ react_1.default.createElement(button_1.Button, { text: "Download", size: "small", type: "normal", onClick: props.onDownload })))); };
257
+ // 7. return
258
+ return (react_1.default.createElement(react_1.default.Fragment, null,
259
+ react_1.default.createElement("div", { onClick: handleClick, title: props.fileName, className: "inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-gray-200 bg-gray-50 px-3 py-1.5 text-xs transition-colors hover:bg-gray-100" },
260
+ react_1.default.createElement(solid_1.DocumentIcon, { className: "h-4 w-4 shrink-0 text-gray-500" }),
261
+ react_1.default.createElement("span", { className: "max-w-60 truncate" }, text)),
262
+ react_1.default.createElement(modal_1.Modal, { open: preview, maxWidth: "5xl", title: stripped, renderContent: renderPreview, onClose: function () { return setPreview(false); } })));
263
+ };
264
+ var renderFileChip = function (params) {
265
+ var _a;
266
+ return (react_1.default.createElement(FileChip, { key: "".concat(params.fileName, "-").concat((_a = params.index) !== null && _a !== void 0 ? _a : 0), label: params.label, fileName: params.fileName, url: params.url, index: params.index, onDownload: params.onClick }));
267
+ };
268
+ exports.renderFileChip = renderFileChip;
123
269
  //# sourceMappingURL=blobModule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"blobModule.js","sourceRoot":"","sources":["../../../src/components/data/blobModule.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blobModule.js","sourceRoot":"","sources":["../../../src/components/data/blobModule.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/data/dataTemplate/index.tsx"],"names":[],"mappings":"AAqCA,OAAO,KASN,MAAM,OAAO,CAAC;AA0Ff,OAAO,EACL,iBAAiB,EAKlB,MAAM,kBAAkB,CAAC;AA4D1B,eAAO,MAAM,YAAY,mFAusZvB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/data/dataTemplate/index.tsx"],"names":[],"mappings":"AAqCA,OAAO,KASN,MAAM,OAAO,CAAC;AA0Ff,OAAO,EACL,iBAAiB,EAKlB,MAAM,kBAAkB,CAAC;AA4D1B,eAAO,MAAM,YAAY,mFAssZvB,CAAC"}
@@ -1101,7 +1101,7 @@ exports.DataTemplate = (0, react_1.forwardRef)(function (props, ref) {
1101
1101
  /* eslint-enable */
1102
1102
  // INFO: Pub/Sub → SSE live-stream — driven by bareSettings.bareSocketName
1103
1103
  // EventSource URL: {sseEndpoint}/{room}?bm_apiToken={token}
1104
- // Mirrors Verdant's emitDeliveryEvent / pages/api/events.ts pattern on the client.
1104
+ // Mirrors the server-side event emitter (pages/api/events.ts) pattern on the client.
1105
1105
  (0, react_1.useEffect)(function () {
1106
1106
  var _a;
1107
1107
  var room = (_a = props.bareSettings) === null || _a === void 0 ? void 0 : _a.bareSocketName;
@@ -1698,7 +1698,7 @@ exports.DataTemplate = (0, react_1.forwardRef)(function (props, ref) {
1698
1698
  if (!((refResp === null || refResp === void 0 ? void 0 : refResp.data) && Array.isArray(refResp.data))) return [3 /*break*/, 3];
1699
1699
  return [4 /*yield*/, indexedDb_1.indexedDb.putValue("local", {
1700
1700
  // INFO: key format matches what handleRetrieveSelectedData reads:
1701
- // eachModel.referenceSpaceId + "-ref" (e.g. "meraque-cycles-ref")
1701
+ // eachModel.referenceSpaceId + "-ref" (e.g. "work-cycles-ref")
1702
1702
  type: "".concat(ref.collectionId, "-ref"),
1703
1703
  data: refResp.data,
1704
1704
  })];
@@ -4887,10 +4887,9 @@ exports.DataTemplate = (0, react_1.forwardRef)(function (props, ref) {
4887
4887
  }); };
4888
4888
  var handleSubmit = function (isDraft) { return __awaiter(void 0, void 0, void 0, function () {
4889
4889
  var preComplete, res, updatedMarkdownData_1, uploadedData_2, uploadTypes_1, err_23;
4890
- var _a;
4891
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
4892
- return __generator(this, function (_p) {
4893
- switch (_p.label) {
4890
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
4891
+ return __generator(this, function (_m) {
4892
+ switch (_m.label) {
4894
4893
  case 0:
4895
4894
  // INFO: re-entry guard — if a submit is already in-flight (double-click,
4896
4895
  // rapid Enter keypresses, or concurrent bareSaveOnTabChange calls), return
@@ -4899,134 +4898,134 @@ exports.DataTemplate = (0, react_1.forwardRef)(function (props, ref) {
4899
4898
  if (isSubmittingRef.current)
4900
4899
  return [2 /*return*/];
4901
4900
  isSubmittingRef.current = true;
4902
- _p.label = 1;
4901
+ _m.label = 1;
4903
4902
  case 1:
4904
- _p.trys.push([1, 10, , 11]);
4903
+ _m.trys.push([1, 8, , 9]);
4905
4904
  setLoading(true);
4906
4905
  setModalVisible(true);
4907
4906
  preComplete = true;
4908
- if (!((_b = props.bareSettings) === null || _b === void 0 ? void 0 : _b.bareUpdateHandlePreComplete)) return [3 /*break*/, 3];
4907
+ if (!((_a = props.bareSettings) === null || _a === void 0 ? void 0 : _a.bareUpdateHandlePreComplete)) return [3 /*break*/, 3];
4909
4908
  return [4 /*yield*/, props.bareSettings.bareUpdateHandlePreComplete(selectedData)];
4910
4909
  case 2:
4911
4910
  preComplete =
4912
- _p.sent();
4913
- _p.label = 3;
4911
+ _m.sent();
4912
+ _m.label = 3;
4914
4913
  case 3:
4915
4914
  if (!preComplete)
4916
4915
  throw "Error";
4917
- if (!((_c = props.bareSettings) === null || _c === void 0 ? void 0 : _c.bareUpdateHandleComplete)) return [3 /*break*/, 5];
4916
+ if (!((_b = props.bareSettings) === null || _b === void 0 ? void 0 : _b.bareUpdateHandleComplete)) return [3 /*break*/, 5];
4918
4917
  return [4 /*yield*/, props.bareSettings.bareUpdateHandleComplete(selectedData)];
4919
4918
  case 4:
4920
- _p.sent();
4921
- return [3 /*break*/, 9];
4919
+ _m.sent();
4920
+ return [3 /*break*/, 7];
4922
4921
  case 5: return [4 /*yield*/, handleSubmitData(undefined, undefined, undefined, undefined, undefined, undefined, isDraft)];
4923
4922
  case 6:
4924
- res = _p.sent();
4925
- if (!res) return [3 /*break*/, 9];
4926
- if (!(((_d = props.bareSettings) === null || _d === void 0 ? void 0 : _d.bareUpdateHandlePostComplete) && !isOffline)) return [3 /*break*/, 8];
4927
- return [4 /*yield*/, props.bareSettings.bareUpdateHandlePostComplete(__assign((_a = {}, _a[serverId] = res, _a), selectedData))];
4928
- case 7:
4929
- _p.sent();
4930
- _p.label = 8;
4931
- case 8:
4932
- handleCheckOfflineDataLength();
4933
- if (isDraft) {
4934
- // INFO: advance the baseline after a successful draft save so that
4935
- // subsequent saves only diff against what was just persisted.
4936
- // Without this, listObject edits saved in a previous draft would be
4937
- // re-sent on every subsequent save (harmless but wasteful), and the
4938
- // "skip write if nothing changed" short-circuit would never trigger.
4939
- if ((_e = props.bareSettings) === null || _e === void 0 ? void 0 : _e.bareUpsertPartialUpdate) {
4940
- loadedSelectedData.current = (0, updateModule_1.handleClonedDataAttribute)(selectedData, structure, props.devSettings.server, true, showId);
4941
- // INFO: Reset dirty tracking after successful save — the new baseline
4942
- // is the saved state, so all fields start "clean" again.
4943
- dirtyFieldsRef.current.clear();
4944
- }
4945
- updatedMarkdownData_1 = {};
4946
- structure.forEach(function (eachAttribute) {
4947
- var _a, _b;
4948
- if (eachAttribute.type === "markdown") {
4949
- var originalIndex = structure.findIndex(function (m) { return m.id === eachAttribute.id; });
4950
- var refIndex = (_a = eachAttribute.refIndex) !== null && _a !== void 0 ? _a : originalIndex;
4951
- var ref_1 = modalFormInputRefs[refIndex];
4952
- if ((_b = ref_1 === null || ref_1 === void 0 ? void 0 : ref_1.current) === null || _b === void 0 ? void 0 : _b.getMarkdown) {
4953
- updatedMarkdownData_1[eachAttribute.id] =
4954
- ref_1.current.getMarkdown();
4955
- }
4923
+ res = _m.sent();
4924
+ if (res) {
4925
+ // INFO: bareUpdateHandlePostComplete is deliberately not called here.
4926
+ // handleSubmitData already calls it once, right after the write, with
4927
+ // the processed record and only when the write reached the server.
4928
+ // A second call here ran every consumer side effect (emails, Drive
4929
+ // uploads, PDF generation) twice per save.
4930
+ handleCheckOfflineDataLength();
4931
+ if (isDraft) {
4932
+ // INFO: advance the baseline after a successful draft save so that
4933
+ // subsequent saves only diff against what was just persisted.
4934
+ // Without this, listObject edits saved in a previous draft would be
4935
+ // re-sent on every subsequent save (harmless but wasteful), and the
4936
+ // "skip write if nothing changed" short-circuit would never trigger.
4937
+ if ((_c = props.bareSettings) === null || _c === void 0 ? void 0 : _c.bareUpsertPartialUpdate) {
4938
+ loadedSelectedData.current = (0, updateModule_1.handleClonedDataAttribute)(selectedData, structure, props.devSettings.server, true, showId);
4939
+ // INFO: Reset dirty tracking after successful save — the new baseline
4940
+ // is the saved state, so all fields start "clean" again.
4941
+ dirtyFieldsRef.current.clear();
4956
4942
  }
4957
- });
4958
- uploadedData_2 = lastUploadedDataRef.current;
4959
- if (uploadedData_2) {
4960
- uploadTypes_1 = [
4961
- "image",
4962
- "file",
4963
- "multipleImage",
4964
- "multipleFile",
4965
- "canvas",
4966
- ];
4943
+ updatedMarkdownData_1 = {};
4967
4944
  structure.forEach(function (eachAttribute) {
4968
- if (uploadTypes_1.includes(eachAttribute.type)) {
4969
- if (eachAttribute.type === "canvas" &&
4970
- !eachAttribute.enableImageUpload)
4971
- return;
4972
- if (uploadedData_2[eachAttribute.id] !== undefined) {
4945
+ var _a, _b;
4946
+ if (eachAttribute.type === "markdown") {
4947
+ var originalIndex = structure.findIndex(function (m) { return m.id === eachAttribute.id; });
4948
+ var refIndex = (_a = eachAttribute.refIndex) !== null && _a !== void 0 ? _a : originalIndex;
4949
+ var ref_1 = modalFormInputRefs[refIndex];
4950
+ if ((_b = ref_1 === null || ref_1 === void 0 ? void 0 : ref_1.current) === null || _b === void 0 ? void 0 : _b.getMarkdown) {
4973
4951
  updatedMarkdownData_1[eachAttribute.id] =
4974
- uploadedData_2[eachAttribute.id];
4952
+ ref_1.current.getMarkdown();
4975
4953
  }
4976
4954
  }
4977
4955
  });
4978
- }
4979
- if (Object.keys(updatedMarkdownData_1).length > 0) {
4980
- // INFO: Post-save markdown/upload data sync is programmatic, not user-driven
4981
- programmaticUpdateRef.current = true;
4982
- setSelectedData(function (prev) { return (__assign(__assign({}, prev), updatedMarkdownData_1)); });
4983
- }
4984
- if (props.id === "new" || !props.id) {
4985
- (_g = (_f = props.organise) === null || _f === void 0 ? void 0 : _f.handleNavigate) === null || _g === void 0 ? void 0 : _g.call(_f, "update", res, (_h = selectedTab === null || selectedTab === void 0 ? void 0 : selectedTab.id) !== null && _h !== void 0 ? _h : "general");
4986
- }
4987
- if (silentDraftRef.current) {
4988
- silentDraftRef.current = false;
4989
- }
4990
- else {
4991
- setNotification({
4992
- type: true,
4993
- title: "Draft Saved",
4994
- msg: "Your changes have been saved",
4995
- });
4996
- }
4997
- }
4998
- else {
4999
- // INFO: Non-draft (final submit) — reset dirty tracking and rebase baseline.
5000
- // Usually the component navigates away, but in case it doesn't (e.g. custom onComplete
5001
- // that stays on the same page), ensure clean state for subsequent interactions.
5002
- if ((_j = props.bareSettings) === null || _j === void 0 ? void 0 : _j.bareUpsertPartialUpdate) {
5003
- loadedSelectedData.current = (0, updateModule_1.handleClonedDataAttribute)(selectedData, structure, props.devSettings.server, true, showId);
5004
- dirtyFieldsRef.current.clear();
5005
- }
5006
- if (props.onComplete) {
5007
- props.onComplete(res);
4956
+ uploadedData_2 = lastUploadedDataRef.current;
4957
+ if (uploadedData_2) {
4958
+ uploadTypes_1 = [
4959
+ "image",
4960
+ "file",
4961
+ "multipleImage",
4962
+ "multipleFile",
4963
+ "canvas",
4964
+ ];
4965
+ structure.forEach(function (eachAttribute) {
4966
+ if (uploadTypes_1.includes(eachAttribute.type)) {
4967
+ if (eachAttribute.type === "canvas" &&
4968
+ !eachAttribute.enableImageUpload)
4969
+ return;
4970
+ if (uploadedData_2[eachAttribute.id] !== undefined) {
4971
+ updatedMarkdownData_1[eachAttribute.id] =
4972
+ uploadedData_2[eachAttribute.id];
4973
+ }
4974
+ }
4975
+ });
4976
+ }
4977
+ if (Object.keys(updatedMarkdownData_1).length > 0) {
4978
+ // INFO: Post-save markdown/upload data sync is programmatic, not user-driven
4979
+ programmaticUpdateRef.current = true;
4980
+ setSelectedData(function (prev) { return (__assign(__assign({}, prev), updatedMarkdownData_1)); });
4981
+ }
4982
+ if (props.id === "new" || !props.id) {
4983
+ (_e = (_d = props.organise) === null || _d === void 0 ? void 0 : _d.handleNavigate) === null || _e === void 0 ? void 0 : _e.call(_d, "update", res, (_f = selectedTab === null || selectedTab === void 0 ? void 0 : selectedTab.id) !== null && _f !== void 0 ? _f : "general");
4984
+ }
4985
+ if (silentDraftRef.current) {
4986
+ silentDraftRef.current = false;
4987
+ }
4988
+ else {
4989
+ setNotification({
4990
+ type: true,
4991
+ title: "Draft Saved",
4992
+ msg: "Your changes have been saved",
4993
+ });
4994
+ }
5008
4995
  }
5009
4996
  else {
5010
- if (selectedTab) {
5011
- (_l = (_k = props.organise) === null || _k === void 0 ? void 0 : _k.handleNavigate) === null || _l === void 0 ? void 0 : _l.call(_k, "read", res, selectedTab.id);
4997
+ // INFO: Non-draft (final submit) — reset dirty tracking and rebase baseline.
4998
+ // Usually the component navigates away, but in case it doesn't (e.g. custom onComplete
4999
+ // that stays on the same page), ensure clean state for subsequent interactions.
5000
+ if ((_g = props.bareSettings) === null || _g === void 0 ? void 0 : _g.bareUpsertPartialUpdate) {
5001
+ loadedSelectedData.current = (0, updateModule_1.handleClonedDataAttribute)(selectedData, structure, props.devSettings.server, true, showId);
5002
+ dirtyFieldsRef.current.clear();
5003
+ }
5004
+ if (props.onComplete) {
5005
+ props.onComplete(res);
5006
+ }
5007
+ else {
5008
+ if (selectedTab) {
5009
+ (_j = (_h = props.organise) === null || _h === void 0 ? void 0 : _h.handleNavigate) === null || _j === void 0 ? void 0 : _j.call(_h, "read", res, selectedTab.id);
5010
+ }
5011
+ else
5012
+ (_l = (_k = props.organise) === null || _k === void 0 ? void 0 : _k.handleNavigate) === null || _l === void 0 ? void 0 : _l.call(_k, "read", res, "general");
5012
5013
  }
5013
- else
5014
- (_o = (_m = props.organise) === null || _m === void 0 ? void 0 : _m.handleNavigate) === null || _o === void 0 ? void 0 : _o.call(_m, "read", res, "general");
5015
5014
  }
5016
5015
  }
5017
- _p.label = 9;
5018
- case 9:
5016
+ _m.label = 7;
5017
+ case 7:
5019
5018
  setModalVisible(false);
5020
5019
  setLoading(false);
5021
5020
  isSubmittingRef.current = false;
5022
- return [3 /*break*/, 11];
5023
- case 10:
5024
- err_23 = _p.sent();
5021
+ return [3 /*break*/, 9];
5022
+ case 8:
5023
+ err_23 = _m.sent();
5025
5024
  setModalVisible(false);
5026
5025
  setLoading(false);
5027
5026
  isSubmittingRef.current = false;
5028
- return [3 /*break*/, 11];
5029
- case 11: return [2 /*return*/];
5027
+ return [3 /*break*/, 9];
5028
+ case 9: return [2 /*return*/];
5030
5029
  }
5031
5030
  });
5032
5031
  }); };