@oneblink/apps-react 10.0.0-beta.2 → 10.0.1-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apps/draft-service.js +73 -56
- package/dist/apps/draft-service.js.map +1 -1
- package/dist/apps/services/api/drafts.js +7 -0
- package/dist/apps/services/api/drafts.js.map +1 -1
- package/dist/form-elements/FormElementAutocomplete.js +3 -3
- package/dist/form-elements/FormElementAutocomplete.js.map +1 -1
- package/dist/hooks/useFormElementOptions.js +4 -5
- package/dist/hooks/useFormElementOptions.js.map +1 -1
- package/package.json +1 -1
|
@@ -106,57 +106,61 @@ async function generateLocalFormSubmissionDraftsFromStorage({ localDraftsStorage
|
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
await broadcastUpdate();
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
draftsToDownload.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const chunk = draftsToDownload.slice(i, i + DRAFT_CHUNK_SIZE);
|
|
115
|
-
chunk.forEach(async (formSubmissionDraft) => {
|
|
116
|
-
const currentValue = localFormSubmissionDraftsMap.get(formSubmissionDraft.id);
|
|
117
|
-
if (currentValue) {
|
|
118
|
-
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
119
|
-
...currentValue,
|
|
120
|
-
downloadStatus: 'DOWNLOADING',
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
await broadcastUpdate();
|
|
125
|
-
// download the draft data for each draft in the chunk in parallel
|
|
126
|
-
await Promise.all(chunk.map(async (formSubmissionDraft) => {
|
|
127
|
-
try {
|
|
128
|
-
const draftSubmission = await getDraftSubmission(formSubmissionDraft, abortSignal);
|
|
129
|
-
if (draftSubmission) {
|
|
130
|
-
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
131
|
-
...formSubmissionDraft,
|
|
132
|
-
draftSubmission: draftSubmission,
|
|
133
|
-
downloadStatus: 'SUCCESS',
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
138
|
-
...formSubmissionDraft,
|
|
139
|
-
downloadStatus: 'NOT_AVAILABLE',
|
|
140
|
-
});
|
|
141
|
-
}
|
|
109
|
+
return {
|
|
110
|
+
downloadDraftsSubmissionData: async () => {
|
|
111
|
+
if (draftsToDownload.length) {
|
|
112
|
+
if (priorityFn) {
|
|
113
|
+
draftsToDownload.sort(priorityFn);
|
|
142
114
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
115
|
+
for (let i = 0; i < draftsToDownload.length; i += DRAFT_CHUNK_SIZE) {
|
|
116
|
+
const chunk = draftsToDownload.slice(i, i + DRAFT_CHUNK_SIZE);
|
|
117
|
+
chunk.forEach(async (formSubmissionDraft) => {
|
|
118
|
+
const currentValue = localFormSubmissionDraftsMap.get(formSubmissionDraft.id);
|
|
119
|
+
if (currentValue) {
|
|
120
|
+
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
121
|
+
...currentValue,
|
|
122
|
+
downloadStatus: 'DOWNLOADING',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
149
125
|
});
|
|
126
|
+
await broadcastUpdate();
|
|
127
|
+
// download the draft data for each draft in the chunk in parallel
|
|
128
|
+
await Promise.all(chunk.map(async (formSubmissionDraft) => {
|
|
129
|
+
try {
|
|
130
|
+
const draftSubmission = await getDraftSubmission(formSubmissionDraft, abortSignal);
|
|
131
|
+
if (draftSubmission) {
|
|
132
|
+
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
133
|
+
...formSubmissionDraft,
|
|
134
|
+
draftSubmission: draftSubmission,
|
|
135
|
+
downloadStatus: 'SUCCESS',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
140
|
+
...formSubmissionDraft,
|
|
141
|
+
downloadStatus: 'NOT_AVAILABLE',
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
console.warn(`Could not fetch draft submission for draft: ${formSubmissionDraft.id}`, err);
|
|
147
|
+
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
148
|
+
...formSubmissionDraft,
|
|
149
|
+
downloadStatus: 'ERROR',
|
|
150
|
+
downloadError: err.message,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
await broadcastUpdate();
|
|
154
|
+
}));
|
|
150
155
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
});
|
|
156
|
+
}
|
|
157
|
+
const localFormSubmissionDrafts = Array.from(localFormSubmissionDraftsMap.values());
|
|
158
|
+
return _orderBy(localFormSubmissionDrafts, (localFormSubmissionDraft) => {
|
|
159
|
+
var _a;
|
|
160
|
+
return (_a = getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)) === null || _a === void 0 ? void 0 : _a.createdAt;
|
|
161
|
+
});
|
|
162
|
+
},
|
|
163
|
+
};
|
|
160
164
|
}
|
|
161
165
|
function errorHandler(error) {
|
|
162
166
|
console.error('Local Forage Error', error);
|
|
@@ -296,11 +300,12 @@ async function upsertDraft({ formSubmissionDraftId, draftSubmissionInput, autoSa
|
|
|
296
300
|
localDraftsStorage.unsyncedDraftSubmissions.push(draftSubmission);
|
|
297
301
|
}
|
|
298
302
|
}
|
|
299
|
-
await setAndBroadcastDrafts({
|
|
303
|
+
const { downloadDraftsSubmissionData } = await setAndBroadcastDrafts({
|
|
300
304
|
localDraftsStorage,
|
|
301
305
|
abortSignal,
|
|
302
306
|
priorityFn: undefined,
|
|
303
307
|
});
|
|
308
|
+
await downloadDraftsSubmissionData();
|
|
304
309
|
}
|
|
305
310
|
else {
|
|
306
311
|
let updated = false;
|
|
@@ -377,11 +382,12 @@ async function getPublicDraftsFromStorage() {
|
|
|
377
382
|
*/
|
|
378
383
|
async function getDrafts(abortSignal) {
|
|
379
384
|
const localDraftsStorage = await getLocalDraftsFromStorage();
|
|
380
|
-
|
|
385
|
+
const { downloadDraftsSubmissionData } = await generateLocalFormSubmissionDraftsFromStorage({
|
|
381
386
|
localDraftsStorage,
|
|
382
387
|
abortSignal,
|
|
383
388
|
priorityFn: undefined,
|
|
384
389
|
});
|
|
390
|
+
return await downloadDraftsSubmissionData();
|
|
385
391
|
}
|
|
386
392
|
/**
|
|
387
393
|
* Get an array of Drafts that have been submitted publicly on this device.
|
|
@@ -433,11 +439,12 @@ async function getDraftAndData(formsAppId, formSubmissionDraftId, abortSignal) {
|
|
|
433
439
|
const localDraftsStorage = await getLocalDraftsFromStorage();
|
|
434
440
|
if (formSubmissionDrafts) {
|
|
435
441
|
localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts;
|
|
436
|
-
await setAndBroadcastDrafts({
|
|
442
|
+
const { downloadDraftsSubmissionData } = await setAndBroadcastDrafts({
|
|
437
443
|
localDraftsStorage,
|
|
438
444
|
abortSignal,
|
|
439
445
|
priorityFn: undefined,
|
|
440
446
|
});
|
|
447
|
+
await downloadDraftsSubmissionData();
|
|
441
448
|
}
|
|
442
449
|
else {
|
|
443
450
|
formSubmissionDrafts = localDraftsStorage.syncedFormSubmissionDrafts;
|
|
@@ -501,11 +508,12 @@ async function deleteDraft(formSubmissionDraftId, formsAppId, abortSignal) {
|
|
|
501
508
|
localDraftsStorage.unsyncedDraftSubmissions =
|
|
502
509
|
localDraftsStorage.unsyncedDraftSubmissions.filter((draftSubmission) => draftSubmission.formSubmissionDraftId !== formSubmissionDraftId);
|
|
503
510
|
}
|
|
504
|
-
await setAndBroadcastDrafts({
|
|
511
|
+
const { downloadDraftsSubmissionData } = await setAndBroadcastDrafts({
|
|
505
512
|
localDraftsStorage,
|
|
506
513
|
abortSignal,
|
|
507
514
|
priorityFn: undefined,
|
|
508
515
|
});
|
|
516
|
+
await downloadDraftsSubmissionData();
|
|
509
517
|
}
|
|
510
518
|
else {
|
|
511
519
|
let publicDraftsStorage = await getPublicDraftsFromStorage();
|
|
@@ -541,12 +549,17 @@ async function setAndBroadcastDrafts({ localDraftsStorage, abortSignal, priority
|
|
|
541
549
|
}
|
|
542
550
|
await utilsService.localForage.setItem(generateDraftsKey(username), localDraftsStorage);
|
|
543
551
|
console.log('Drafts have been updated', localDraftsStorage);
|
|
544
|
-
const
|
|
552
|
+
const { downloadDraftsSubmissionData } = await generateLocalFormSubmissionDraftsFromStorage({
|
|
545
553
|
localDraftsStorage,
|
|
546
554
|
abortSignal,
|
|
547
555
|
priorityFn,
|
|
548
556
|
});
|
|
549
|
-
|
|
557
|
+
return {
|
|
558
|
+
downloadDraftsSubmissionData: async () => {
|
|
559
|
+
const localFormSubmissionDrafts = await downloadDraftsSubmissionData();
|
|
560
|
+
await executeDraftsListeners(localFormSubmissionDrafts);
|
|
561
|
+
},
|
|
562
|
+
};
|
|
550
563
|
}
|
|
551
564
|
let _isSyncingDrafts = false;
|
|
552
565
|
/**
|
|
@@ -636,8 +649,13 @@ async function syncDrafts({ priorityFn, formsAppId, throwError, abortSignal, })
|
|
|
636
649
|
if (formSubmissionDrafts) {
|
|
637
650
|
localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts;
|
|
638
651
|
}
|
|
652
|
+
const { downloadDraftsSubmissionData } = await setAndBroadcastDrafts({
|
|
653
|
+
localDraftsStorage,
|
|
654
|
+
abortSignal,
|
|
655
|
+
priorityFn,
|
|
656
|
+
});
|
|
639
657
|
console.log('Downloading drafts in the background');
|
|
640
|
-
|
|
658
|
+
downloadDraftsSubmissionData()
|
|
641
659
|
.then(async () => {
|
|
642
660
|
console.log('Finished syncing drafts.');
|
|
643
661
|
})
|
|
@@ -654,7 +672,6 @@ async function syncDrafts({ priorityFn, formsAppId, throwError, abortSignal, })
|
|
|
654
672
|
.finally(() => {
|
|
655
673
|
_isSyncingDrafts = false;
|
|
656
674
|
});
|
|
657
|
-
// broadcast the drafts and download the draft data in the background
|
|
658
675
|
}
|
|
659
676
|
catch (error) {
|
|
660
677
|
_isSyncingDrafts = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft-service.js","sourceRoot":"","sources":["../../src/apps/draft-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AACrC,OAAO,YAAY,MAAM,kBAAkB,CAAA;AAC3C,OAAO,iBAAiB,MAAM,qCAAqC,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mCAAmC,EACnC,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,MAAM,MAAM,UAAU,CAAA;AAa7B,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAE1B,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,aAAa,QAAQ,EAAE,CAAA;AAChC,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO,kBAAkB,CAAA;AAC3B,CAAC;AAQD,KAAK,UAAU,yBAAyB,CACtC,UAAkB,EAClB,WAAyB;IAEzB,OAAO,sBAAsB,CAAC,UAAU,EAAE,WAAW,CAAC;SACnD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACtB,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAA;QACd,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;YAC9B,OAAO,CAAC,GAAG,CACT,sEAAsE,EACtE,KAAK,CACN,CAAA;YACD,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,qDAAqD,CAC5D,gBAAmC,EACnC,0BAAuC,EACvC,eAA4B;;IAE5B,MAAM,4BAA4B,GAAG,IAAI,GAAG,EAGzC,CAAA;IAEH,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;QAC/C;QACE,8CAA8C;QAC9C,CAAC,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,qBAAqB,CAAC;YACtE,0CAA0C;YAC1C,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,qBAAqB,CAAC,EAC3D,CAAC;YACD,4BAA4B,CAAC,GAAG,CAAC,eAAe,CAAC,qBAAqB,EAAE;gBACtE,UAAU,EAAE,eAAe,CAAC,UAAU;gBACtC,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,EAAE;gBACrC,UAAU,EAAE,eAAe,CAAC,UAAU;gBACtC,KAAK,EAAE,eAAe,CAAC,KAAK;gBAC5B,gCAAgC,EAC9B,eAAe,CAAC,gCAAgC;gBAClD,MAAM,EAAE,MAAA,eAAe,CAAC,cAAc,0CAAE,IAAI,CAAC,MAAM;gBACnD,mBAAmB,EACjB,MAAA,MAAA,eAAe,CAAC,cAAc,0CAAE,iBAAiB,0CAC7C,mBAAmB;gBACzB,YAAY,EAAE,MAAA,eAAe,CAAC,cAAc,0CAAE,UAAU,CAAC,YAAY;gBACrE,eAAe;gBACf,QAAQ,EAAE,SAAS;gBACnB,cAAc,EAAE,SAAS;aAC1B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,4BAA4B,CAAA;AACrC,CAAC;AAED,KAAK,UAAU,6BAA6B;IAC1C,MAAM,kBAAkB,GAAG,MAAM,0BAA0B,EAAE,CAAA;IAC7D,OAAO,kBAAkB,CAAC,MAAM,CAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,EAAE;QACxE,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAA;QACnD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAA;AACvB,CAAC;AAED,KAAK,UAAU,kDAAkD,CAC/D,mBAAsC;IAEtC,MAAM,0BAA0B,GAAG,MAAM,6BAA6B,EAAE,CAAA;IACxE,MAAM,4BAA4B,GAChC,qDAAqD,CACnD,mBAAmB,EACnB,0BAA0B,EAC1B,IAAI,GAAG,EAAE,CACV,CAAA;IAEH,MAAM,yBAAyB,GAAG,KAAK,CAAC,IAAI,CAC1C,4BAA4B,CAAC,MAAM,EAAE,CACtC,CAAA;IAED,OAAO,QAAQ,CAAC,yBAAyB,EAAE,CAAC,wBAAwB,EAAE,EAAE;;QACtE,OAAO,wBAAwB,CAAC,cAAc,KAAK,SAAS;YAC1D,CAAC,CAAC,MAAA,wBAAwB,CAAC,eAAe,0CAAE,SAAS;YACrD,CAAC,CAAC,SAAS,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,4CAA4C,CAAC,EAC1D,kBAAkB,EAClB,WAAW,EACX,UAAU,GAKX;IACC,MAAM,0BAA0B,GAAG,MAAM,6BAA6B,EAAE,CAAA;IACxE,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,kBAAkB,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CACnE,CAAA;IAED,MAAM,4BAA4B,GAChC,qDAAqD,CACnD,kBAAkB,CAAC,wBAAwB,EAC3C,0BAA0B,EAC1B,eAAe,CAChB,CAAA;IAEH,KAAK,UAAU,eAAe;QAC5B,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,MAAM,EAAE,CAAC,CAAA;QAE3E,MAAM,aAAa,GAAG,QAAQ,CAC5B,iBAAiB,EACjB,CAAC,wBAAwB,EAAE,EAAE;;YAC3B,OAAA,MAAA,mCAAmC,CAAC,wBAAwB,CAAC,QAAQ,CAAC,0CAClE,SAAS,CAAA;SAAA,CAChB,CAAA;QAED,MAAM,sBAAsB,CAAC,aAAa,CAAC,CAAA;IAC7C,CAAC;IAED,wEAAwE;IACxE,MAAM,gBAAgB,GAA0C,EAAE,CAAA;IAElE,KAAK,MAAM,mBAAmB,IAAI,kBAAkB,CAAC,0BAA0B,EAAE,CAAC;QAChF;QACE,mEAAmE;QACnE,CAAC,4BAA4B,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACzD,8CAA8C;YAC9C,CAAC,0BAA0B,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACvD,0CAA0C;YAC1C,CAAC,eAAe,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAC5C,CAAC;YACD,gBAAgB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;YAC1C,4BAA4B,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE;gBACvD,GAAG,mBAAmB;gBACtB,cAAc,EAAE,SAAS;aAC1B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,MAAM,eAAe,EAAE,CAAA;IAEvB,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,UAAU,EAAE,CAAC;YACf,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACnE,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAA;YAC7D,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE;gBAC1C,MAAM,YAAY,GAAG,4BAA4B,CAAC,GAAG,CACnD,mBAAmB,CAAC,EAAE,CACvB,CAAA;gBACD,IAAI,YAAY,EAAE,CAAC;oBACjB,4BAA4B,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE;wBACvD,GAAG,YAAY;wBACf,cAAc,EAAE,aAAa;qBAC9B,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC,CAAC,CAAA;YACF,MAAM,eAAe,EAAE,CAAA;YACvB,kEAAkE;YAClE,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE;gBACtC,IAAI,CAAC;oBACH,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAC9C,mBAAmB,EACnB,WAAW,CACZ,CAAA;oBACD,IAAI,eAAe,EAAE,CAAC;wBACpB,4BAA4B,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE;4BACvD,GAAG,mBAAmB;4BACtB,eAAe,EAAE,eAAe;4BAChC,cAAc,EAAE,SAAS;yBAC1B,CAAC,CAAA;oBACJ,CAAC;yBAAM,CAAC;wBACN,4BAA4B,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE;4BACvD,GAAG,mBAAmB;4BACtB,cAAc,EAAE,eAAe;yBAChC,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CACV,+CAA+C,mBAAmB,CAAC,EAAE,EAAE,EACvE,GAAG,CACJ,CAAA;oBAED,4BAA4B,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE;wBACvD,GAAG,mBAAmB;wBACtB,cAAc,EAAE,OAAO;wBACvB,aAAa,EAAG,GAAa,CAAC,OAAO;qBACtC,CAAC,CAAA;gBACJ,CAAC;gBAED,MAAM,eAAe,EAAE,CAAA;YACzB,CAAC,CAAC,CACH,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,yBAAyB,GAAG,KAAK,CAAC,IAAI,CAC1C,4BAA4B,CAAC,MAAM,EAAE,CACtC,CAAA;IAED,OAAO,QAAQ,CACb,yBAAyB,EACzB,CAAC,wBAAwB,EAAE,EAAE;;QAC3B,OAAA,MAAA,mCAAmC,CAAC,wBAAwB,CAAC,QAAQ,CAAC,0CAClE,SAAS,CAAA;KAAA,CAChB,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAY;IAChC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;IAC1C,IAAI,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,iBAAiB,CAC1B,2IAA2I,EAC3I;YACE,aAAa,EAAE,KAAK;SACrB,CACF,CAAA;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,eAAe,GACnB,EAAE,CAAA;AAEJ;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,sBAAsB,CAC7B,QAAyD;IAEzD,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAE9B,OAAO,GAAG,EAAE;QACV,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QAClC,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,yBAAqD;IAErD,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;QAC7C,cAAc,CAAC,yBAAyB,CAAC,CAAA;IAC3C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,KAAK,UAAU,WAAW,CAAC,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,WAAW,EACX,gBAAgB,GAQjB;IACC,MAAM,eAAe,GAAoB;QACvC,GAAG,oBAAoB;QACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,qBAAqB,EAAE,qBAAqB,IAAI,MAAM,EAAE;KACzD,CAAA;IAED,MAAM,KAAK,GAAG,aAAa,EAAE,CAAA;IAC7B,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,SAAS,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,iBAAiB,CAAC,uCAAuC,EAAE;gBACnE,SAAS,EAAE,IAAI;aAChB,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,eAAe,CAAC,eAAe,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;QAC/D,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,MAAM,oBAAoB,GAAG,MAAM,yBAAyB,CAC1D,eAAe,CAAC,UAAU,CAC3B,CAAA;QACD,MAAM,0BAA0B,GAAG,MAAM,mBAAmB,CAAC;YAC3D,eAAe;YACf,WAAW;YACX,UAAU;YACV,UAAU,EAAE,CAAC,oBAAoB;SAClC,CAAC,CAAA;QAEF,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;YAE5D,IAAI,0BAA0B,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,0BAA0B,CAAC,CAAA;gBACpE,kBAAkB,CAAC,0BAA0B;oBAC3C,MAAM,uBAAuB,CAAC,eAAe,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;gBACxE,2DAA2D;gBAC3D,IAAI,qBAAqB,EAAE,CAAC;oBAC1B,kBAAkB,CAAC,wBAAwB;wBACzC,kBAAkB,CAAC,wBAAwB,CAAC,MAAM,CAChD,CAAC,uBAAuB,EAAE,EAAE,CAC1B,uBAAuB,CAAC,qBAAqB;4BAC7C,qBAAqB,CACxB,CAAA;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,kEAAkE,EAClE,eAAe,CAChB,CAAA;gBACD,IAAI,OAAO,GAAG,KAAK,CAAA;gBAEnB,IAAI,qBAAqB,EAAE,CAAC;oBAC1B,kBAAkB,CAAC,wBAAwB;wBACzC,kBAAkB,CAAC,wBAAwB,CAAC,GAAG,CAC7C,CAAC,uBAAuB,EAAE,EAAE;4BAC1B,IACE,uBAAuB,CAAC,qBAAqB;gCAC7C,qBAAqB,EACrB,CAAC;gCACD,OAAO,GAAG,IAAI,CAAA;gCACd,OAAO,eAAe,CAAA;4BACxB,CAAC;4BACD,OAAO,uBAAuB,CAAA;wBAChC,CAAC,CACF,CAAA;oBACH,uEAAuE;oBACvE,kBAAkB,CAAC,0BAA0B;wBAC3C,kBAAkB,CAAC,0BAA0B,CAAC,MAAM,CAClD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,qBAAqB,CACzC,CAAA;gBACL,CAAC;gBAED,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,kBAAkB,CAAC,wBAAwB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;gBACnE,CAAC;YACH,CAAC;YAED,MAAM,qBAAqB,CAAC;gBAC1B,kBAAkB;gBAClB,WAAW;gBACX,UAAU,EAAE,SAAS;aACtB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,OAAO,GAAG,KAAK,CAAA;YACnB,MAAM,mBAAmB,GAAG,CAAC,MAAM,0BAA0B,EAAE,CAAC,CAAC,GAAG,CAClE,CAAC,qBAAqB,EAAE,EAAE;gBACxB,IACE,qBAAqB,CAAC,qBAAqB;oBAC3C,qBAAqB,EACrB,CAAC;oBACD,OAAO,GAAG,IAAI,CAAA;oBACd,OAAO,eAAe,CAAA;gBACxB,CAAC;gBACD,OAAO,qBAAqB,CAAA;YAC9B,CAAC,CACF,CAAA;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YAC3C,CAAC;YACD,MAAM,2BAA2B,CAAC,mBAAmB,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,4BAA4B,CAAC,gBAAgB,CAAC,CAAA;QACtD,CAAC;QACD,UAAU,CAAC;YACT,UAAU,EAAE,KAAK;YACjB,UAAU,EAAE,eAAe,CAAC,UAAU;SACvC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,YAAY,CAAC,GAAY,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB;IACtC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,kBAAkB,GACtB,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CACpC,iBAAiB,CAAC,QAAQ,CAAC,CAC5B,CAAA;YACH,IAAI,kBAAkB,EAAE,CAAC;gBACvB,OAAO,kBAAkB,CAAA;YAC3B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;YAC5B,MAAM,YAAY,CAAC,GAAY,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED,OAAO;QACL,wBAAwB,EAAE,EAAE;QAC5B,0BAA0B,EAAE,EAAE;QAC9B,2BAA2B,EAAE,EAAE;KAChC,CAAA;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B;IACvC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CAEzD,uBAAuB,EAAE,CAAC,CAAA;QAC5B,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAA;QACrB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,YAAY,CAAC,GAAY,CAAC,CAAA;IAClC,CAAC;IAED,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,SAAS,CACtB,WAAyB;IAEzB,MAAM,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;IAC5D,OAAO,MAAM,4CAA4C,CAAC;QACxD,kBAAkB;QAClB,WAAW;QACX,UAAU,EAAE,SAAS;KACtB,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,eAAe;IAC5B,MAAM,mBAAmB,GAAG,MAAM,0BAA0B,EAAE,CAAA;IAC9D,OAAO,MAAM,kDAAkD,CAC7D,mBAAmB,CACpB,CAAA;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,UAAkB,EAClB,WAAoC;IAEpC,IAAI,CAAC;QACH,OAAO,MAAM,uBAAuB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YAC9D,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,eAAe,CAC5B,UAAkB,EAClB,qBAAgD,EAChD,WAAoC;IAEpC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,OAAM;IACR,CAAC;IAED,IAAI,oBAAoB,GAAG,MAAM,0BAA0B,CACzD,UAAU,EACV,WAAW,CACZ,CAAA;IACD,MAAM,oBAAoB,GAAG,MAAM,yBAAyB,CAAC,UAAU,CAAC,CAAA;IACxE,IAAI,oBAAoB,EAAE,CAAC;QACzB,MAAM,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;QAC5D,IAAI,oBAAoB,EAAE,CAAC;YACzB,kBAAkB,CAAC,0BAA0B,GAAG,oBAAoB,CAAA;YACpE,MAAM,qBAAqB,CAAC;gBAC1B,kBAAkB;gBAClB,WAAW;gBACX,UAAU,EAAE,SAAS;aACtB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,oBAAoB,GAAG,kBAAkB,CAAC,0BAA0B,CAAA;QACtE,CAAC;QAED,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,IAAI,CACnD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,qBAAqB,CACzC,CAAA;QACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,uBAAuB,CAAC,qBAAqB,CAAC,CAAC,IAAI,SAAS,CAAA;QAC5E,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,CAC/C,mBAAmB,EACnB,WAAW,CACZ,CAAA;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,iBAAiB,CACzB,kFAAkF,EAClF;gBACE,KAAK,EAAE,wBAAwB;aAChC,CACF,CAAA;QACH,CAAC;QACD,OAAO,gBAAgB,CAAA;IACzB,CAAC;SAAM,CAAC;QACN,IAAI,oBAAoB,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,uBAAuB,CAAC,qBAAqB,CAAC,CAAC,IAAI,SAAS,CAAA;QAC5E,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,KAAK,UAAU,WAAW,CACxB,qBAA6B,EAC7B,UAAkB,EAClB,WAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,0BAA0B,CAAC,qBAAqB,CAAC,CAAA;QACvD,MAAM,oBAAoB,GAAG,MAAM,yBAAyB,CAAC,UAAU,CAAC,CAAA;QACxE,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;YAC5D,MAAM,mBAAmB,GACvB,kBAAkB,CAAC,0BAA0B,CAAC,IAAI,CAChD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,qBAAqB,CACzC,CAAA;YACH,IAAI,mBAAmB,EAAE,CAAC;gBACxB,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,eAAe,CACrD,qBAAqB,EACrB,WAAW,CACZ,CAAA;gBACD,kBAAkB,CAAC,0BAA0B;oBAC3C,kBAAkB,CAAC,0BAA0B,CAAC,MAAM,CAClD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,mBAAmB,CAAC,EAAE,CAC1C,CAAA;gBACH,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,kBAAkB,CAAC,2BAA2B,CAAC,IAAI,CACjD,mBAAmB,CACpB,CAAA;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,0DAA0D,EAC1D;oBACE,qBAAqB;oBACrB,kBAAkB;iBACnB,CACF,CAAA;gBACD,MAAM,eAAe,GACnB,kBAAkB,CAAC,wBAAwB,CAAC,IAAI,CAC9C,CAAC,eAAe,EAAE,EAAE,CAClB,eAAe,CAAC,qBAAqB,KAAK,qBAAqB,CAClE,CAAA;gBACH,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,OAAM;gBACR,CAAC;gBAED,kBAAkB,CAAC,wBAAwB;oBACzC,kBAAkB,CAAC,wBAAwB,CAAC,MAAM,CAChD,CAAC,eAAe,EAAE,EAAE,CAClB,eAAe,CAAC,qBAAqB,KAAK,qBAAqB,CAClE,CAAA;YACL,CAAC;YAED,MAAM,qBAAqB,CAAC;gBAC1B,kBAAkB;gBAClB,WAAW;gBACX,UAAU,EAAE,SAAS;aACtB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,mBAAmB,GAAG,MAAM,0BAA0B,EAAE,CAAA;YAC5D,MAAM,eAAe,GAAG,mBAAmB,CAAC,IAAI,CAC9C,CAAC,eAAe,EAAE,EAAE,CAClB,eAAe,CAAC,qBAAqB,KAAK,qBAAqB,CAClE,CAAA;YACD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,OAAM;YACR,CAAC;YAED,mBAAmB,GAAG,mBAAmB,CAAC,MAAM,CAC9C,CAAC,eAAe,EAAE,EAAE,CAClB,eAAe,CAAC,qBAAqB,KAAK,qBAAqB,CAClE,CAAA;YAED,MAAM,2BAA2B,CAAC,mBAAmB,CAAC,CAAA;QACxD,CAAC;QAED,UAAU,CAAC;YACT,UAAU,EAAE,KAAK;YACjB,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,YAAY,CAAC,GAAY,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,YAA+B;IACxE,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CACpC,uBAAuB,EAAE,EACzB,YAAY,CACb,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,YAAY,CAAC,CAAA;IAC5D,MAAM,yBAAyB,GAC7B,MAAM,kDAAkD,CAAC,YAAY,CAAC,CAAA;IACxE,MAAM,sBAAsB,CAC1B,yBAAyB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CACzE,CAAA;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,EACnC,kBAAkB,EAClB,WAAW,EACX,UAAU,GAKX;IACC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,iBAAiB,CACzB,kFAAkF,EAClF;YACE,aAAa,EAAE,IAAI;SACpB,CACF,CAAA;IACH,CAAC;IACD,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CACpC,iBAAiB,CAAC,QAAQ,CAAC,EAC3B,kBAAkB,CACnB,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAA;IAC3D,MAAM,yBAAyB,GAC7B,MAAM,4CAA4C,CAAC;QACjD,kBAAkB;QAClB,WAAW;QACX,UAAU;KACX,CAAC,CAAA;IACJ,MAAM,sBAAsB,CAAC,yBAAyB,CAAC,CAAA;AACzD,CAAC;AAED,IAAI,gBAAgB,GAAG,KAAK,CAAA;AAE5B;;;;;;;;;;;;;;;;GAgBG;AACH,KAAK,UAAU,UAAU,CAAC,EACxB,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,GAcZ;IACC,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAA;QACvD,OAAM;IACR,CAAC;IACD,gBAAgB,GAAG,IAAI,CAAA;IAEvB,MAAM,oBAAoB,GAAG,MAAM,yBAAyB,CAAC,UAAU,CAAC,CAAA;IAExE,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,MAAM,0BAA0B,EAAE,CAAA;QACvD,MAAM,oBAAoB,GAAG,EAAE,CAAA;QAC/B,gGAAgG;QAChG,mGAAmG;QACnG,mFAAmF;QACnF,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,oBAAoB,GAAG,MAAM,uBAAuB,CACxD,WAAW,CAAC,qBAAqB,CAClC,CAAA;YACD,IAAI,oBAAoB,EAAE,CAAC;gBACzB,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QACD,MAAM,2BAA2B,CAAC,oBAAoB,CAAC,CAAA;QACvD,gBAAgB,GAAG,KAAK,CAAA;QACxB,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,IAAI,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;QAC1D,IAAI,kBAAkB,CAAC,2BAA2B,CAAC,MAAM,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CACT,8CAA8C,EAC9C,kBAAkB,CAAC,2BAA2B,CAC/C,CAAA;YACD,MAAM,8BAA8B,GAClC,EAAE,CAAA;YACJ,KAAK,MAAM,mBAAmB,IAAI,kBAAkB,CAAC,2BAA2B,EAAE,CAAC;gBACjF,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,eAAe,CACrD,mBAAmB,CAAC,EAAE,EACtB,WAAW,CACZ,CAAA;gBACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,8BAA8B,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;gBAC1D,CAAC;YACH,CAAC;YAED,yEAAyE;YACzE,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;YACtD,kBAAkB,CAAC,2BAA2B;gBAC5C,8BAA8B,CAAA;QAClC,CAAC;QAED,MAAM,mBAAmB,GAAG,MAAM,0BAA0B,EAAE,CAAA;QAC9D,mFAAmF;QACnF,qCAAqC;QACrC,IAAI,mBAAmB,CAAC,MAAM,EAAE,CAAC;YAC/B,kBAAkB,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAA;YACxE,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,EAAE,CAAC,CAAA;QACvE,CAAC;QAED,IAAI,kBAAkB,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,CACT,wBAAwB,kBAAkB,CAAC,wBAAwB,CAAC,MAAM,4BAA4B,CACvG,CAAA;YACD,MAAM,2BAA2B,GAAsB,EAAE,CAAA;YACzD,KAAK,MAAM,eAAe,IAAI,kBAAkB,CAAC,wBAAwB,EAAE,CAAC;gBAC1E,OAAO,CAAC,GAAG,CACT,mDAAmD,EACnD,eAAe,CAAC,KAAK,CACtB,CAAA;gBACD,eAAe,CAAC,gBAAgB,GAAG,KAAK,CAAA;gBACxC,MAAM,0BAA0B,GAAG,MAAM,mBAAmB,CAAC;oBAC3D,eAAe;oBACf,WAAW,EAAE,SAAS;oBACtB,WAAW;oBACX,UAAU,EAAE,CAAC,oBAAoB;iBAClC,CAAC,CAAA;gBACF,IAAI,CAAC,0BAA0B,EAAE,CAAC;oBAChC,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC;YACD,yEAAyE;YACzE,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;YACtD,kBAAkB,CAAC,wBAAwB,GAAG,2BAA2B,CAAA;QAC3E,CAAC;QAED,MAAM,oBAAoB,GAAG,MAAM,0BAA0B,CAC3D,UAAU,EACV,WAAW,CACZ,CAAA;QACD,IAAI,oBAAoB,EAAE,CAAC;YACzB,kBAAkB,CAAC,0BAA0B,GAAG,oBAAoB,CAAA;QACtE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;QACnD,qBAAqB,CAAC,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;aACnE,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;QACzC,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;gBAC9C,OAAM;YACR,CAAC;YACD,OAAO,CAAC,IAAI,CACV,0DAA0D,EAC1D,KAAK,CACN,CAAA;YACD,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;YAChC,CAAC;QACH,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,gBAAgB,GAAG,KAAK,CAAA;QAC1B,CAAC,CAAC,CAAA;QAEJ,qEAAqE;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gBAAgB,GAAG,KAAK,CAAA;QACxB,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;YAC9C,OAAM;QACR,CAAC;QACD,OAAO,CAAC,IAAI,CACV,wDAAwD,EACxD,KAAK,CACN,CAAA;QACD,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,eAAe,EACf,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,mCAAmC,GAEpC,CAAA","sourcesContent":["import { v4 as uuidv4 } from 'uuid'\nimport _orderBy from 'lodash.orderby'\nimport utilsService from './services/utils'\nimport OneBlinkAppsError from './services/errors/oneBlinkAppsError'\nimport { isOffline } from './offline-service'\nimport { getUsername } from './services/cognito'\nimport { getFormsKeyId, getCurrentFormsAppUser } from './auth-service'\nimport { getFormSubmissionDrafts, uploadDraftData } from './services/api/drafts'\nimport {\n getPendingQueueSubmissions,\n deletePendingQueueSubmission,\n} from './services/pending-queue'\nimport {\n deleteDraftData,\n getDraftSubmission,\n getLatestFormSubmissionDraftVersion,\n getLocalDraftSubmission,\n removeLocalDraftSubmission,\n saveDraftSubmission,\n} from './services/draft-data-store'\nimport { SubmissionTypes } from '@oneblink/types'\nimport Sentry from './Sentry'\nimport {\n DraftSubmission,\n DraftSubmissionInput,\n LocalFormSubmissionDraft,\n ProgressListener,\n} from './types/submissions'\n\nexport type PriorityFn = (\n a: SubmissionTypes.FormSubmissionDraft,\n b: SubmissionTypes.FormSubmissionDraft,\n) => number\n\nconst DRAFT_CHUNK_SIZE = 5\n\nfunction generateDraftsKey(username: string) {\n return `V2_DRAFTS_${username}`\n}\n\nfunction generatePublicDraftsKey() {\n return `V2_DRAFTS_PUBLIC`\n}\n\ninterface LocalDraftsStorage {\n deletedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n unsyncedDraftSubmissions: DraftSubmission[]\n syncedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n}\n\nasync function checkIfUsingPrivateDrafts(\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<boolean> {\n return getCurrentFormsAppUser(formsAppId, abortSignal)\n .then((user) => !!user)\n .catch((error) => {\n if (error.status >= 400 && error.status < 500) {\n return false\n } else {\n Sentry.captureException(error)\n console.log(\n 'Could not determine if the current user has access to this forms app',\n error,\n )\n return false\n }\n })\n}\n\nfunction generateLocalFormSubmissionDraftsFromDraftSubmissions(\n draftSubmissions: DraftSubmission[],\n pendingSubmissionsDraftIds: Set<string>,\n deletedDraftIds: Set<string>,\n) {\n const localFormSubmissionDraftsMap = new Map<\n string,\n LocalFormSubmissionDraft\n >()\n\n for (const draftSubmission of draftSubmissions) {\n if (\n // Remove drafts that are in the pending queue\n !pendingSubmissionsDraftIds.has(draftSubmission.formSubmissionDraftId) &&\n // Remove any drafts deleted while offline\n !deletedDraftIds.has(draftSubmission.formSubmissionDraftId)\n ) {\n localFormSubmissionDraftsMap.set(draftSubmission.formSubmissionDraftId, {\n formsAppId: draftSubmission.formsAppId,\n formId: draftSubmission.definition.id,\n externalId: draftSubmission.externalId,\n jobId: draftSubmission.jobId,\n previousFormSubmissionApprovalId:\n draftSubmission.previousFormSubmissionApprovalId,\n taskId: draftSubmission.taskCompletion?.task.taskId,\n taskGroupInstanceId:\n draftSubmission.taskCompletion?.taskGroupInstance\n ?.taskGroupInstanceId,\n taskActionId: draftSubmission.taskCompletion?.taskAction.taskActionId,\n draftSubmission,\n versions: undefined,\n downloadStatus: 'SUCCESS',\n })\n }\n }\n\n return localFormSubmissionDraftsMap\n}\n\nasync function getPendingSubmissionsDraftIds() {\n const pendingSubmissions = await getPendingQueueSubmissions()\n return pendingSubmissions.reduce<Set<string>>((memo, pendingSubmission) => {\n if (pendingSubmission.formSubmissionDraftId) {\n memo.add(pendingSubmission.formSubmissionDraftId)\n }\n return memo\n }, new Set<string>())\n}\n\nasync function generatePublicLocalFormSubmissionDraftsFromStorage(\n publicDraftsStorage: DraftSubmission[],\n) {\n const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds()\n const localFormSubmissionDraftsMap =\n generateLocalFormSubmissionDraftsFromDraftSubmissions(\n publicDraftsStorage,\n pendingSubmissionsDraftIds,\n new Set(),\n )\n\n const localFormSubmissionDrafts = Array.from(\n localFormSubmissionDraftsMap.values(),\n )\n\n return _orderBy(localFormSubmissionDrafts, (localFormSubmissionDraft) => {\n return localFormSubmissionDraft.downloadStatus === 'SUCCESS'\n ? localFormSubmissionDraft.draftSubmission?.createdAt\n : undefined\n })\n}\n\nasync function generateLocalFormSubmissionDraftsFromStorage({\n localDraftsStorage,\n abortSignal,\n priorityFn,\n}: {\n localDraftsStorage: LocalDraftsStorage\n abortSignal: AbortSignal | undefined\n priorityFn?: PriorityFn\n}): Promise<LocalFormSubmissionDraft[]> {\n const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds()\n const deletedDraftIds = new Set(\n localDraftsStorage.deletedFormSubmissionDrafts.map(({ id }) => id),\n )\n\n const localFormSubmissionDraftsMap =\n generateLocalFormSubmissionDraftsFromDraftSubmissions(\n localDraftsStorage.unsyncedDraftSubmissions,\n pendingSubmissionsDraftIds,\n deletedDraftIds,\n )\n\n async function broadcastUpdate() {\n const draftsToBroadcast = Array.from(localFormSubmissionDraftsMap.values())\n\n const orderedDrafts = _orderBy(\n draftsToBroadcast,\n (localFormSubmissionDraft) =>\n getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)\n ?.createdAt,\n )\n\n await executeDraftsListeners(orderedDrafts)\n }\n\n // At this point we need to store the state of the drafts in localForage\n const draftsToDownload: SubmissionTypes.FormSubmissionDraft[] = []\n\n for (const formSubmissionDraft of localDraftsStorage.syncedFormSubmissionDrafts) {\n if (\n // Unsycned version of draft takes priority over the synced version\n !localFormSubmissionDraftsMap.has(formSubmissionDraft.id) &&\n // Remove drafts that are in the pending queue\n !pendingSubmissionsDraftIds.has(formSubmissionDraft.id) &&\n // Remove any drafts deleted while offline\n !deletedDraftIds.has(formSubmissionDraft.id)\n ) {\n draftsToDownload.push(formSubmissionDraft)\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n downloadStatus: 'PENDING',\n })\n }\n }\n\n await broadcastUpdate()\n\n if (draftsToDownload.length) {\n if (priorityFn) {\n draftsToDownload.sort(priorityFn)\n }\n for (let i = 0; i < draftsToDownload.length; i += DRAFT_CHUNK_SIZE) {\n const chunk = draftsToDownload.slice(i, i + DRAFT_CHUNK_SIZE)\n chunk.forEach(async (formSubmissionDraft) => {\n const currentValue = localFormSubmissionDraftsMap.get(\n formSubmissionDraft.id,\n )\n if (currentValue) {\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...currentValue,\n downloadStatus: 'DOWNLOADING',\n })\n }\n })\n await broadcastUpdate()\n // download the draft data for each draft in the chunk in parallel\n await Promise.all(\n chunk.map(async (formSubmissionDraft) => {\n try {\n const draftSubmission = await getDraftSubmission(\n formSubmissionDraft,\n abortSignal,\n )\n if (draftSubmission) {\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n draftSubmission: draftSubmission,\n downloadStatus: 'SUCCESS',\n })\n } else {\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n downloadStatus: 'NOT_AVAILABLE',\n })\n }\n } catch (err) {\n console.warn(\n `Could not fetch draft submission for draft: ${formSubmissionDraft.id}`,\n err,\n )\n\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n downloadStatus: 'ERROR',\n downloadError: (err as Error).message,\n })\n }\n\n await broadcastUpdate()\n }),\n )\n }\n }\n\n const localFormSubmissionDrafts = Array.from(\n localFormSubmissionDraftsMap.values(),\n )\n\n return _orderBy(\n localFormSubmissionDrafts,\n (localFormSubmissionDraft) =>\n getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)\n ?.createdAt,\n )\n}\n\nfunction errorHandler(error: Error): Error {\n console.error('Local Forage Error', error)\n if (/The serialized value is too large/.test(error.message)) {\n return new OneBlinkAppsError(\n 'It seems you have run out of space. Please delete some of your drafts to allow new drafts to be created or existing drafts to be updated.',\n {\n originalError: error,\n },\n )\n }\n\n return error\n}\n\nconst draftsListeners: Array<(drafts: LocalFormSubmissionDraft[]) => unknown> =\n []\n\n/**\n * Register a listener function that will be passed an array of Drafts when a\n * draft is added, updated or deleted.\n *\n * #### Example\n *\n * ```js\n * const listener = async (drafts) => {\n * // use drafts here...\n * }\n * const deregister = await draftService.registerDraftsListener(listener)\n *\n * // When no longer needed, remember to deregister the listener\n * deregister()\n * ```\n *\n * @param listener\n * @returns\n */\nfunction registerDraftsListener(\n listener: (drafts: LocalFormSubmissionDraft[]) => unknown,\n): () => void {\n draftsListeners.push(listener)\n\n return () => {\n const index = draftsListeners.indexOf(listener)\n if (index !== -1) {\n draftsListeners.splice(index, 1)\n }\n }\n}\n\nasync function executeDraftsListeners(\n localFormSubmissionDrafts: LocalFormSubmissionDraft[],\n) {\n for (const draftsListener of draftsListeners) {\n draftsListener(localFormSubmissionDrafts)\n }\n}\n\n/**\n * Create or update a Draft in the local store and sync it with remote drafts.\n * Will also handle cleaning up auto save data (if the `autoSaveKey` property is\n * passed).\n *\n * #### Example\n *\n * ```js\n * const abortController = new AbortController()\n * const formSubmissionDraftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003' // pass `undefined` to create a new draft\n * const autoSaveKey = 'SET ME TO DELETE AUTOSAVE DATA AFTER SAVING DRAFT'\n * const draftSubmissionInput = {\n * title: 1,\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here',\n * },\n * definition: {\n * form: 'definition',\n * goes: 'here',\n * },\n * }\n * await draftService.upsertDraft({\n * formSubmissionDraftId,\n * autoSaveKey,\n * draftSubmissionInput,\n * abortSignal: abortController.signal,\n * onProgress: (progress) => {\n * // ...\n * },\n * })\n * ```\n *\n * @param options\n * @returns\n */\nasync function upsertDraft({\n formSubmissionDraftId,\n draftSubmissionInput,\n autoSaveKey,\n onProgress,\n abortSignal,\n pendingTimestamp,\n}: {\n formSubmissionDraftId: string | undefined\n draftSubmissionInput: DraftSubmissionInput\n autoSaveKey?: string\n onProgress?: ProgressListener\n abortSignal?: AbortSignal\n pendingTimestamp?: string\n}): Promise<void> {\n const draftSubmission: DraftSubmission = {\n ...draftSubmissionInput,\n createdAt: new Date().toISOString(),\n formSubmissionDraftId: formSubmissionDraftId || uuidv4(),\n }\n\n const keyId = getFormsKeyId()\n if (keyId) {\n if (isOffline()) {\n throw new OneBlinkAppsError('Drafts cannot be saved while offline.', {\n isOffline: true,\n })\n }\n\n await uploadDraftData(draftSubmission, onProgress, abortSignal)\n return\n }\n\n try {\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(\n draftSubmission.formsAppId,\n )\n const formSubmissionDraftVersion = await saveDraftSubmission({\n draftSubmission,\n autoSaveKey,\n onProgress,\n skipUpload: !isUsingPrivateDrafts,\n })\n\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n\n if (formSubmissionDraftVersion) {\n console.log('Draft was saved on server', formSubmissionDraftVersion)\n localDraftsStorage.syncedFormSubmissionDrafts =\n await getFormSubmissionDrafts(draftSubmission.formsAppId, abortSignal)\n // Remove draft from unsynced incase it was created offline\n if (formSubmissionDraftId) {\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.filter(\n (unsyncedDraftSubmission) =>\n unsyncedDraftSubmission.formSubmissionDraftId !==\n formSubmissionDraftId,\n )\n }\n } else {\n console.log(\n 'Draft could not be saved on server, saving locally to sync later',\n draftSubmission,\n )\n let updated = false\n\n if (formSubmissionDraftId) {\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.map(\n (unsyncedDraftSubmission) => {\n if (\n unsyncedDraftSubmission.formSubmissionDraftId ===\n formSubmissionDraftId\n ) {\n updated = true\n return draftSubmission\n }\n return unsyncedDraftSubmission\n },\n )\n // Remove draft from synced drafts incase it was retrieved while online\n localDraftsStorage.syncedFormSubmissionDrafts =\n localDraftsStorage.syncedFormSubmissionDrafts.filter(\n ({ id }) => id !== formSubmissionDraftId,\n )\n }\n\n if (!updated) {\n localDraftsStorage.unsyncedDraftSubmissions.push(draftSubmission)\n }\n }\n\n await setAndBroadcastDrafts({\n localDraftsStorage,\n abortSignal,\n priorityFn: undefined,\n })\n } else {\n let updated = false\n const publicDraftsStorage = (await getPublicDraftsFromStorage()).map(\n (publicDraftSubmission) => {\n if (\n publicDraftSubmission.formSubmissionDraftId ===\n formSubmissionDraftId\n ) {\n updated = true\n return draftSubmission\n }\n return publicDraftSubmission\n },\n )\n if (!updated) {\n publicDraftsStorage.push(draftSubmission)\n }\n await setAndBroadcastPublicDrafts(publicDraftsStorage)\n }\n\n if (pendingTimestamp) {\n await deletePendingQueueSubmission(pendingTimestamp)\n }\n syncDrafts({\n throwError: false,\n formsAppId: draftSubmission.formsAppId,\n })\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n}\n\nasync function getLocalDraftsFromStorage(): Promise<LocalDraftsStorage> {\n const username = getUsername()\n if (username) {\n try {\n const localDraftsStorage =\n await utilsService.localForage.getItem<LocalDraftsStorage>(\n generateDraftsKey(username),\n )\n if (localDraftsStorage) {\n return localDraftsStorage\n }\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n }\n\n return {\n unsyncedDraftSubmissions: [],\n syncedFormSubmissionDrafts: [],\n deletedFormSubmissionDrafts: [],\n }\n}\n\nasync function getPublicDraftsFromStorage(): Promise<DraftSubmission[]> {\n try {\n const publicDrafts = await utilsService.localForage.getItem<\n DraftSubmission[]\n >(generatePublicDraftsKey())\n if (publicDrafts) {\n return publicDrafts\n }\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n\n return []\n}\n\n/**\n * Get an array of Drafts for the currently logged in user.\n *\n * #### Example\n *\n * ```js\n * const drafts = await draftService.getDrafts()\n * ```\n *\n * @param abortSignal - Signal to abort the requests\n * @returns\n */\nasync function getDrafts(\n abortSignal?: AbortSignal,\n): Promise<LocalFormSubmissionDraft[]> {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n return await generateLocalFormSubmissionDraftsFromStorage({\n localDraftsStorage,\n abortSignal,\n priorityFn: undefined,\n })\n}\n\n/**\n * Get an array of Drafts that have been submitted publicly on this device.\n *\n * #### Example\n *\n * ```js\n * const drafts = await draftService.getPublicDrafts()\n * ```\n *\n * @returns\n */\nasync function getPublicDrafts(): Promise<LocalFormSubmissionDraft[]> {\n const publicDraftsStorage = await getPublicDraftsFromStorage()\n return await generatePublicLocalFormSubmissionDraftsFromStorage(\n publicDraftsStorage,\n )\n}\n\nasync function tryGetFormSubmissionDrafts(\n formsAppId: number,\n abortSignal: AbortSignal | undefined,\n) {\n try {\n return await getFormSubmissionDrafts(formsAppId, abortSignal)\n } catch (error) {\n if (!(error instanceof OneBlinkAppsError) || !error.isOffline) {\n throw error\n }\n }\n}\n\n/**\n * Get a single Draft and the associated submission data.\n *\n * #### Example\n *\n * ```js\n * const draftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003'\n * const { draft, draftData, lastElementUpdated } =\n * await draftService.getDraftAndData(draftId)\n * // use \"draftData\" to prefill a from\n * ```\n *\n * @param draftId\n * @returns\n */\nasync function getDraftAndData(\n formsAppId: number,\n formSubmissionDraftId: string | undefined | null,\n abortSignal: AbortSignal | undefined,\n): Promise<DraftSubmission | undefined> {\n if (!formSubmissionDraftId) {\n return\n }\n\n let formSubmissionDrafts = await tryGetFormSubmissionDrafts(\n formsAppId,\n abortSignal,\n )\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n if (formSubmissionDrafts) {\n localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts\n await setAndBroadcastDrafts({\n localDraftsStorage,\n abortSignal,\n priorityFn: undefined,\n })\n } else {\n formSubmissionDrafts = localDraftsStorage.syncedFormSubmissionDrafts\n }\n\n const formSubmissionDraft = formSubmissionDrafts.find(\n ({ id }) => id === formSubmissionDraftId,\n )\n if (!formSubmissionDraft) {\n return (await getLocalDraftSubmission(formSubmissionDraftId)) || undefined\n }\n\n const s3SubmissionData = await getDraftSubmission(\n formSubmissionDraft,\n abortSignal,\n )\n if (!s3SubmissionData) {\n throw new OneBlinkAppsError(\n \"Data has been removed based on your administrator's draft data retention policy.\",\n {\n title: 'Draft Data Unavailable',\n },\n )\n }\n return s3SubmissionData\n } else {\n if (formSubmissionDrafts) {\n return (await getLocalDraftSubmission(formSubmissionDraftId)) || undefined\n }\n }\n}\n\n/**\n * Remove a draft from the local store and sync with remote drafts.\n *\n * #### Example\n *\n * ```js\n * const draftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003'\n * await draftService.deleteDraft(draftId)\n * ```\n *\n * @param draftId\n * @param formsAppId\n * @returns\n */\nasync function deleteDraft(\n formSubmissionDraftId: string,\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<void> {\n try {\n await removeLocalDraftSubmission(formSubmissionDraftId)\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n const formSubmissionDraft =\n localDraftsStorage.syncedFormSubmissionDrafts.find(\n ({ id }) => id === formSubmissionDraftId,\n )\n if (formSubmissionDraft) {\n const { hasDeletedRemoteDraft } = await deleteDraftData(\n formSubmissionDraftId,\n abortSignal,\n )\n localDraftsStorage.syncedFormSubmissionDrafts =\n localDraftsStorage.syncedFormSubmissionDrafts.filter(\n ({ id }) => id !== formSubmissionDraft.id,\n )\n if (!hasDeletedRemoteDraft) {\n localDraftsStorage.deletedFormSubmissionDrafts.push(\n formSubmissionDraft,\n )\n }\n } else {\n console.log(\n 'Could not find existing draft in synced drafts to delete',\n {\n formSubmissionDraftId,\n localDraftsStorage,\n },\n )\n const draftSubmission =\n localDraftsStorage.unsyncedDraftSubmissions.find(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId === formSubmissionDraftId,\n )\n if (!draftSubmission) {\n return\n }\n\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.filter(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId !== formSubmissionDraftId,\n )\n }\n\n await setAndBroadcastDrafts({\n localDraftsStorage,\n abortSignal,\n priorityFn: undefined,\n })\n } else {\n let publicDraftsStorage = await getPublicDraftsFromStorage()\n const draftSubmission = publicDraftsStorage.find(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId === formSubmissionDraftId,\n )\n if (!draftSubmission) {\n return\n }\n\n publicDraftsStorage = publicDraftsStorage.filter(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId !== formSubmissionDraftId,\n )\n\n await setAndBroadcastPublicDrafts(publicDraftsStorage)\n }\n\n syncDrafts({\n throwError: false,\n formsAppId,\n })\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n}\n\nasync function setAndBroadcastPublicDrafts(publicDrafts: DraftSubmission[]) {\n await utilsService.localForage.setItem(\n generatePublicDraftsKey(),\n publicDrafts,\n )\n\n console.log('Public drafts have been updated', publicDrafts)\n const localFormSubmissionDrafts =\n await generatePublicLocalFormSubmissionDraftsFromStorage(publicDrafts)\n await executeDraftsListeners(\n localFormSubmissionDrafts.map((draft) => ({ ...draft, isPublic: true })),\n )\n}\n\nasync function setAndBroadcastDrafts({\n localDraftsStorage,\n abortSignal,\n priorityFn,\n}: {\n localDraftsStorage: LocalDraftsStorage\n abortSignal: AbortSignal | undefined\n priorityFn: PriorityFn | undefined\n}): Promise<void> {\n const username = getUsername()\n if (!username) {\n throw new OneBlinkAppsError(\n 'You cannot set your drafts until you have logged in. Please login and try again.',\n {\n requiresLogin: true,\n },\n )\n }\n await utilsService.localForage.setItem(\n generateDraftsKey(username),\n localDraftsStorage,\n )\n\n console.log('Drafts have been updated', localDraftsStorage)\n const localFormSubmissionDrafts =\n await generateLocalFormSubmissionDraftsFromStorage({\n localDraftsStorage,\n abortSignal,\n priorityFn,\n })\n await executeDraftsListeners(localFormSubmissionDrafts)\n}\n\nlet _isSyncingDrafts = false\n\n/**\n * Force a sync of remote drafts with locally stored drafts. This function will\n * swallow all errors thrown unless `true` is passed for the `throwError`\n * property.\n *\n * #### Example\n *\n * ```js\n * await draftService.syncDrafts({\n * throwError: true,\n * formsAppId: 1,\n * })\n * ```\n *\n * @param param0\n * @returns\n */\nasync function syncDrafts({\n priorityFn,\n formsAppId,\n throwError,\n abortSignal,\n}: {\n /** The id of the OneBlink Forms App to sync drafts with */\n formsAppId: number\n /**\n * Function used to determine the order of the draft downloads. It is expected\n * to return a negative value if the first argument is less than the second\n * argument, zero if they're equal, and a positive value otherwise.\n */\n priorityFn?: PriorityFn\n /** `true` to throw errors while syncing */\n throwError?: boolean\n /** Signal to abort the requests */\n abortSignal?: AbortSignal\n}): Promise<void> {\n if (_isSyncingDrafts) {\n console.log('Application is currently syncing drafts.')\n return\n }\n _isSyncingDrafts = true\n\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n\n if (!isUsingPrivateDrafts) {\n const publicDrafts = await getPublicDraftsFromStorage()\n const filteredPublicDrafts = []\n // iterate through public draft records, and check if a draft submission exists for each record.\n // If no draft submission exists for a record, the draft was likely submitted, so we must remove it\n // from the list of public drafts so it no longer appears in the user's draft list.\n for (const publicDraft of publicDrafts) {\n const localDraftSubmission = await getLocalDraftSubmission(\n publicDraft.formSubmissionDraftId,\n )\n if (localDraftSubmission) {\n filteredPublicDrafts.push(publicDraft)\n }\n }\n await setAndBroadcastPublicDrafts(filteredPublicDrafts)\n _isSyncingDrafts = false\n return\n }\n\n try {\n let localDraftsStorage = await getLocalDraftsFromStorage()\n if (localDraftsStorage.deletedFormSubmissionDrafts.length) {\n console.log(\n 'Removing local draft data for deleted drafts',\n localDraftsStorage.deletedFormSubmissionDrafts,\n )\n const newDeletedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[] =\n []\n for (const formSubmissionDraft of localDraftsStorage.deletedFormSubmissionDrafts) {\n const { hasDeletedRemoteDraft } = await deleteDraftData(\n formSubmissionDraft.id,\n abortSignal,\n )\n if (!hasDeletedRemoteDraft) {\n newDeletedFormSubmissionDrafts.push(formSubmissionDraft)\n }\n }\n\n // Get local drafts again to ensure nothing has happened while processing\n localDraftsStorage = await getLocalDraftsFromStorage()\n localDraftsStorage.deletedFormSubmissionDrafts =\n newDeletedFormSubmissionDrafts\n }\n\n const publicDraftsStorage = await getPublicDraftsFromStorage()\n // if public drafts exist, add them to the current logged in users' unsynced drafts\n // and remove them from local storage\n if (publicDraftsStorage.length) {\n localDraftsStorage.unsyncedDraftSubmissions.push(...publicDraftsStorage)\n await utilsService.localForage.setItem(generatePublicDraftsKey(), [])\n }\n\n if (localDraftsStorage.unsyncedDraftSubmissions.length) {\n console.log(\n `Attempting to upload ${localDraftsStorage.unsyncedDraftSubmissions.length} local unsynced drafts(s).`,\n )\n const newUnsyncedDraftSubmissions: DraftSubmission[] = []\n for (const draftSubmission of localDraftsStorage.unsyncedDraftSubmissions) {\n console.log(\n 'Uploading draft data that was saved while offline',\n draftSubmission.title,\n )\n draftSubmission.backgroundUpload = false\n const formSubmissionDraftVersion = await saveDraftSubmission({\n draftSubmission,\n autoSaveKey: undefined,\n abortSignal,\n skipUpload: !isUsingPrivateDrafts,\n })\n if (!formSubmissionDraftVersion) {\n newUnsyncedDraftSubmissions.push(draftSubmission)\n }\n }\n // Get local drafts again to ensure nothing has happened while processing\n localDraftsStorage = await getLocalDraftsFromStorage()\n localDraftsStorage.unsyncedDraftSubmissions = newUnsyncedDraftSubmissions\n }\n\n const formSubmissionDrafts = await tryGetFormSubmissionDrafts(\n formsAppId,\n abortSignal,\n )\n if (formSubmissionDrafts) {\n localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts\n }\n\n console.log('Downloading drafts in the background')\n setAndBroadcastDrafts({ localDraftsStorage, abortSignal, priorityFn })\n .then(async () => {\n console.log('Finished syncing drafts.')\n })\n .catch((error) => {\n if (abortSignal?.aborted) {\n console.log('Syncing drafts has been aborted')\n return\n }\n console.warn(\n 'Error while attempting download drafts in the background',\n error,\n )\n if (!(error instanceof OneBlinkAppsError)) {\n Sentry.captureException(error)\n }\n })\n .finally(() => {\n _isSyncingDrafts = false\n })\n\n // broadcast the drafts and download the draft data in the background\n } catch (error) {\n _isSyncingDrafts = false\n if (abortSignal?.aborted) {\n console.log('Syncing drafts has been aborted')\n return\n }\n console.warn(\n 'Error while attempting to sync and update local drafts',\n error,\n )\n if (!(error instanceof OneBlinkAppsError)) {\n Sentry.captureException(error)\n }\n if (throwError) {\n throw error\n }\n }\n}\n\nexport {\n registerDraftsListener,\n upsertDraft,\n getDraftAndData,\n getDrafts,\n getPublicDrafts,\n deleteDraft,\n syncDrafts,\n getLatestFormSubmissionDraftVersion,\n LocalFormSubmissionDraft,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"draft-service.js","sourceRoot":"","sources":["../../src/apps/draft-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as uuidv4 } from 'uuid'\nimport _orderBy from 'lodash.orderby'\nimport utilsService from './services/utils'\nimport OneBlinkAppsError from './services/errors/oneBlinkAppsError'\nimport { isOffline } from './offline-service'\nimport { getUsername } from './services/cognito'\nimport { getFormsKeyId, getCurrentFormsAppUser } from './auth-service'\nimport { getFormSubmissionDrafts, uploadDraftData } from './services/api/drafts'\nimport {\n getPendingQueueSubmissions,\n deletePendingQueueSubmission,\n} from './services/pending-queue'\nimport {\n deleteDraftData,\n getDraftSubmission,\n getLatestFormSubmissionDraftVersion,\n getLocalDraftSubmission,\n removeLocalDraftSubmission,\n saveDraftSubmission,\n} from './services/draft-data-store'\nimport { SubmissionTypes } from '@oneblink/types'\nimport Sentry from './Sentry'\nimport {\n DraftSubmission,\n DraftSubmissionInput,\n LocalFormSubmissionDraft,\n ProgressListener,\n} from './types/submissions'\n\nexport type PriorityFn = (\n a: SubmissionTypes.FormSubmissionDraft,\n b: SubmissionTypes.FormSubmissionDraft,\n) => number\n\nconst DRAFT_CHUNK_SIZE = 5\n\nfunction generateDraftsKey(username: string) {\n return `V2_DRAFTS_${username}`\n}\n\nfunction generatePublicDraftsKey() {\n return `V2_DRAFTS_PUBLIC`\n}\n\ninterface LocalDraftsStorage {\n deletedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n unsyncedDraftSubmissions: DraftSubmission[]\n syncedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n}\n\nasync function checkIfUsingPrivateDrafts(\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<boolean> {\n return getCurrentFormsAppUser(formsAppId, abortSignal)\n .then((user) => !!user)\n .catch((error) => {\n if (error.status >= 400 && error.status < 500) {\n return false\n } else {\n Sentry.captureException(error)\n console.log(\n 'Could not determine if the current user has access to this forms app',\n error,\n )\n return false\n }\n })\n}\n\nfunction generateLocalFormSubmissionDraftsFromDraftSubmissions(\n draftSubmissions: DraftSubmission[],\n pendingSubmissionsDraftIds: Set<string>,\n deletedDraftIds: Set<string>,\n) {\n const localFormSubmissionDraftsMap = new Map<\n string,\n LocalFormSubmissionDraft\n >()\n\n for (const draftSubmission of draftSubmissions) {\n if (\n // Remove drafts that are in the pending queue\n !pendingSubmissionsDraftIds.has(draftSubmission.formSubmissionDraftId) &&\n // Remove any drafts deleted while offline\n !deletedDraftIds.has(draftSubmission.formSubmissionDraftId)\n ) {\n localFormSubmissionDraftsMap.set(draftSubmission.formSubmissionDraftId, {\n formsAppId: draftSubmission.formsAppId,\n formId: draftSubmission.definition.id,\n externalId: draftSubmission.externalId,\n jobId: draftSubmission.jobId,\n previousFormSubmissionApprovalId:\n draftSubmission.previousFormSubmissionApprovalId,\n taskId: draftSubmission.taskCompletion?.task.taskId,\n taskGroupInstanceId:\n draftSubmission.taskCompletion?.taskGroupInstance\n ?.taskGroupInstanceId,\n taskActionId: draftSubmission.taskCompletion?.taskAction.taskActionId,\n draftSubmission,\n versions: undefined,\n downloadStatus: 'SUCCESS',\n })\n }\n }\n\n return localFormSubmissionDraftsMap\n}\n\nasync function getPendingSubmissionsDraftIds() {\n const pendingSubmissions = await getPendingQueueSubmissions()\n return pendingSubmissions.reduce<Set<string>>((memo, pendingSubmission) => {\n if (pendingSubmission.formSubmissionDraftId) {\n memo.add(pendingSubmission.formSubmissionDraftId)\n }\n return memo\n }, new Set<string>())\n}\n\nasync function generatePublicLocalFormSubmissionDraftsFromStorage(\n publicDraftsStorage: DraftSubmission[],\n) {\n const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds()\n const localFormSubmissionDraftsMap =\n generateLocalFormSubmissionDraftsFromDraftSubmissions(\n publicDraftsStorage,\n pendingSubmissionsDraftIds,\n new Set(),\n )\n\n const localFormSubmissionDrafts = Array.from(\n localFormSubmissionDraftsMap.values(),\n )\n\n return _orderBy(localFormSubmissionDrafts, (localFormSubmissionDraft) => {\n return localFormSubmissionDraft.downloadStatus === 'SUCCESS'\n ? localFormSubmissionDraft.draftSubmission?.createdAt\n : undefined\n })\n}\n\nasync function generateLocalFormSubmissionDraftsFromStorage({\n localDraftsStorage,\n abortSignal,\n priorityFn,\n}: {\n localDraftsStorage: LocalDraftsStorage\n abortSignal: AbortSignal | undefined\n priorityFn?: PriorityFn\n}): Promise<{\n downloadDraftsSubmissionData: () => Promise<LocalFormSubmissionDraft[]>\n}> {\n const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds()\n const deletedDraftIds = new Set(\n localDraftsStorage.deletedFormSubmissionDrafts.map(({ id }) => id),\n )\n\n const localFormSubmissionDraftsMap =\n generateLocalFormSubmissionDraftsFromDraftSubmissions(\n localDraftsStorage.unsyncedDraftSubmissions,\n pendingSubmissionsDraftIds,\n deletedDraftIds,\n )\n\n async function broadcastUpdate() {\n const draftsToBroadcast = Array.from(localFormSubmissionDraftsMap.values())\n\n const orderedDrafts = _orderBy(\n draftsToBroadcast,\n (localFormSubmissionDraft) =>\n getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)\n ?.createdAt,\n )\n\n await executeDraftsListeners(orderedDrafts)\n }\n\n // At this point we need to store the state of the drafts in localForage\n const draftsToDownload: SubmissionTypes.FormSubmissionDraft[] = []\n\n for (const formSubmissionDraft of localDraftsStorage.syncedFormSubmissionDrafts) {\n if (\n // Unsycned version of draft takes priority over the synced version\n !localFormSubmissionDraftsMap.has(formSubmissionDraft.id) &&\n // Remove drafts that are in the pending queue\n !pendingSubmissionsDraftIds.has(formSubmissionDraft.id) &&\n // Remove any drafts deleted while offline\n !deletedDraftIds.has(formSubmissionDraft.id)\n ) {\n draftsToDownload.push(formSubmissionDraft)\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n downloadStatus: 'PENDING',\n })\n }\n }\n\n await broadcastUpdate()\n\n return {\n downloadDraftsSubmissionData: async () => {\n if (draftsToDownload.length) {\n if (priorityFn) {\n draftsToDownload.sort(priorityFn)\n }\n for (let i = 0; i < draftsToDownload.length; i += DRAFT_CHUNK_SIZE) {\n const chunk = draftsToDownload.slice(i, i + DRAFT_CHUNK_SIZE)\n chunk.forEach(async (formSubmissionDraft) => {\n const currentValue = localFormSubmissionDraftsMap.get(\n formSubmissionDraft.id,\n )\n if (currentValue) {\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...currentValue,\n downloadStatus: 'DOWNLOADING',\n })\n }\n })\n await broadcastUpdate()\n // download the draft data for each draft in the chunk in parallel\n await Promise.all(\n chunk.map(async (formSubmissionDraft) => {\n try {\n const draftSubmission = await getDraftSubmission(\n formSubmissionDraft,\n abortSignal,\n )\n if (draftSubmission) {\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n draftSubmission: draftSubmission,\n downloadStatus: 'SUCCESS',\n })\n } else {\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n downloadStatus: 'NOT_AVAILABLE',\n })\n }\n } catch (err) {\n console.warn(\n `Could not fetch draft submission for draft: ${formSubmissionDraft.id}`,\n err,\n )\n\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n downloadStatus: 'ERROR',\n downloadError: (err as Error).message,\n })\n }\n\n await broadcastUpdate()\n }),\n )\n }\n }\n\n const localFormSubmissionDrafts = Array.from(\n localFormSubmissionDraftsMap.values(),\n )\n return _orderBy(\n localFormSubmissionDrafts,\n (localFormSubmissionDraft) =>\n getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)\n ?.createdAt,\n )\n },\n }\n}\n\nfunction errorHandler(error: Error): Error {\n console.error('Local Forage Error', error)\n if (/The serialized value is too large/.test(error.message)) {\n return new OneBlinkAppsError(\n 'It seems you have run out of space. Please delete some of your drafts to allow new drafts to be created or existing drafts to be updated.',\n {\n originalError: error,\n },\n )\n }\n\n return error\n}\n\nconst draftsListeners: Array<(drafts: LocalFormSubmissionDraft[]) => unknown> =\n []\n\n/**\n * Register a listener function that will be passed an array of Drafts when a\n * draft is added, updated or deleted.\n *\n * #### Example\n *\n * ```js\n * const listener = async (drafts) => {\n * // use drafts here...\n * }\n * const deregister = await draftService.registerDraftsListener(listener)\n *\n * // When no longer needed, remember to deregister the listener\n * deregister()\n * ```\n *\n * @param listener\n * @returns\n */\nfunction registerDraftsListener(\n listener: (drafts: LocalFormSubmissionDraft[]) => unknown,\n): () => void {\n draftsListeners.push(listener)\n\n return () => {\n const index = draftsListeners.indexOf(listener)\n if (index !== -1) {\n draftsListeners.splice(index, 1)\n }\n }\n}\n\nasync function executeDraftsListeners(\n localFormSubmissionDrafts: LocalFormSubmissionDraft[],\n) {\n for (const draftsListener of draftsListeners) {\n draftsListener(localFormSubmissionDrafts)\n }\n}\n\n/**\n * Create or update a Draft in the local store and sync it with remote drafts.\n * Will also handle cleaning up auto save data (if the `autoSaveKey` property is\n * passed).\n *\n * #### Example\n *\n * ```js\n * const abortController = new AbortController()\n * const formSubmissionDraftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003' // pass `undefined` to create a new draft\n * const autoSaveKey = 'SET ME TO DELETE AUTOSAVE DATA AFTER SAVING DRAFT'\n * const draftSubmissionInput = {\n * title: 1,\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here',\n * },\n * definition: {\n * form: 'definition',\n * goes: 'here',\n * },\n * }\n * await draftService.upsertDraft({\n * formSubmissionDraftId,\n * autoSaveKey,\n * draftSubmissionInput,\n * abortSignal: abortController.signal,\n * onProgress: (progress) => {\n * // ...\n * },\n * })\n * ```\n *\n * @param options\n * @returns\n */\nasync function upsertDraft({\n formSubmissionDraftId,\n draftSubmissionInput,\n autoSaveKey,\n onProgress,\n abortSignal,\n pendingTimestamp,\n}: {\n formSubmissionDraftId: string | undefined\n draftSubmissionInput: DraftSubmissionInput\n autoSaveKey?: string\n onProgress?: ProgressListener\n abortSignal?: AbortSignal\n pendingTimestamp?: string\n}): Promise<void> {\n const draftSubmission: DraftSubmission = {\n ...draftSubmissionInput,\n createdAt: new Date().toISOString(),\n formSubmissionDraftId: formSubmissionDraftId || uuidv4(),\n }\n\n const keyId = getFormsKeyId()\n if (keyId) {\n if (isOffline()) {\n throw new OneBlinkAppsError('Drafts cannot be saved while offline.', {\n isOffline: true,\n })\n }\n\n await uploadDraftData(draftSubmission, onProgress, abortSignal)\n return\n }\n\n try {\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(\n draftSubmission.formsAppId,\n )\n const formSubmissionDraftVersion = await saveDraftSubmission({\n draftSubmission,\n autoSaveKey,\n onProgress,\n skipUpload: !isUsingPrivateDrafts,\n })\n\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n\n if (formSubmissionDraftVersion) {\n console.log('Draft was saved on server', formSubmissionDraftVersion)\n localDraftsStorage.syncedFormSubmissionDrafts =\n await getFormSubmissionDrafts(draftSubmission.formsAppId, abortSignal)\n // Remove draft from unsynced incase it was created offline\n if (formSubmissionDraftId) {\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.filter(\n (unsyncedDraftSubmission) =>\n unsyncedDraftSubmission.formSubmissionDraftId !==\n formSubmissionDraftId,\n )\n }\n } else {\n console.log(\n 'Draft could not be saved on server, saving locally to sync later',\n draftSubmission,\n )\n let updated = false\n\n if (formSubmissionDraftId) {\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.map(\n (unsyncedDraftSubmission) => {\n if (\n unsyncedDraftSubmission.formSubmissionDraftId ===\n formSubmissionDraftId\n ) {\n updated = true\n return draftSubmission\n }\n return unsyncedDraftSubmission\n },\n )\n // Remove draft from synced drafts incase it was retrieved while online\n localDraftsStorage.syncedFormSubmissionDrafts =\n localDraftsStorage.syncedFormSubmissionDrafts.filter(\n ({ id }) => id !== formSubmissionDraftId,\n )\n }\n\n if (!updated) {\n localDraftsStorage.unsyncedDraftSubmissions.push(draftSubmission)\n }\n }\n\n const { downloadDraftsSubmissionData } = await setAndBroadcastDrafts({\n localDraftsStorage,\n abortSignal,\n priorityFn: undefined,\n })\n await downloadDraftsSubmissionData()\n } else {\n let updated = false\n const publicDraftsStorage = (await getPublicDraftsFromStorage()).map(\n (publicDraftSubmission) => {\n if (\n publicDraftSubmission.formSubmissionDraftId ===\n formSubmissionDraftId\n ) {\n updated = true\n return draftSubmission\n }\n return publicDraftSubmission\n },\n )\n if (!updated) {\n publicDraftsStorage.push(draftSubmission)\n }\n await setAndBroadcastPublicDrafts(publicDraftsStorage)\n }\n\n if (pendingTimestamp) {\n await deletePendingQueueSubmission(pendingTimestamp)\n }\n syncDrafts({\n throwError: false,\n formsAppId: draftSubmission.formsAppId,\n })\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n}\n\nasync function getLocalDraftsFromStorage(): Promise<LocalDraftsStorage> {\n const username = getUsername()\n if (username) {\n try {\n const localDraftsStorage =\n await utilsService.localForage.getItem<LocalDraftsStorage>(\n generateDraftsKey(username),\n )\n if (localDraftsStorage) {\n return localDraftsStorage\n }\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n }\n\n return {\n unsyncedDraftSubmissions: [],\n syncedFormSubmissionDrafts: [],\n deletedFormSubmissionDrafts: [],\n }\n}\n\nasync function getPublicDraftsFromStorage(): Promise<DraftSubmission[]> {\n try {\n const publicDrafts = await utilsService.localForage.getItem<\n DraftSubmission[]\n >(generatePublicDraftsKey())\n if (publicDrafts) {\n return publicDrafts\n }\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n\n return []\n}\n\n/**\n * Get an array of Drafts for the currently logged in user.\n *\n * #### Example\n *\n * ```js\n * const drafts = await draftService.getDrafts()\n * ```\n *\n * @param abortSignal - Signal to abort the requests\n * @returns\n */\nasync function getDrafts(\n abortSignal?: AbortSignal,\n): Promise<LocalFormSubmissionDraft[]> {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n const { downloadDraftsSubmissionData } =\n await generateLocalFormSubmissionDraftsFromStorage({\n localDraftsStorage,\n abortSignal,\n priorityFn: undefined,\n })\n return await downloadDraftsSubmissionData()\n}\n\n/**\n * Get an array of Drafts that have been submitted publicly on this device.\n *\n * #### Example\n *\n * ```js\n * const drafts = await draftService.getPublicDrafts()\n * ```\n *\n * @returns\n */\nasync function getPublicDrafts(): Promise<LocalFormSubmissionDraft[]> {\n const publicDraftsStorage = await getPublicDraftsFromStorage()\n return await generatePublicLocalFormSubmissionDraftsFromStorage(\n publicDraftsStorage,\n )\n}\n\nasync function tryGetFormSubmissionDrafts(\n formsAppId: number,\n abortSignal: AbortSignal | undefined,\n) {\n try {\n return await getFormSubmissionDrafts(formsAppId, abortSignal)\n } catch (error) {\n if (!(error instanceof OneBlinkAppsError) || !error.isOffline) {\n throw error\n }\n }\n}\n\n/**\n * Get a single Draft and the associated submission data.\n *\n * #### Example\n *\n * ```js\n * const draftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003'\n * const { draft, draftData, lastElementUpdated } =\n * await draftService.getDraftAndData(draftId)\n * // use \"draftData\" to prefill a from\n * ```\n *\n * @param draftId\n * @returns\n */\nasync function getDraftAndData(\n formsAppId: number,\n formSubmissionDraftId: string | undefined | null,\n abortSignal: AbortSignal | undefined,\n): Promise<DraftSubmission | undefined> {\n if (!formSubmissionDraftId) {\n return\n }\n\n let formSubmissionDrafts = await tryGetFormSubmissionDrafts(\n formsAppId,\n abortSignal,\n )\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n if (formSubmissionDrafts) {\n localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts\n const { downloadDraftsSubmissionData } = await setAndBroadcastDrafts({\n localDraftsStorage,\n abortSignal,\n priorityFn: undefined,\n })\n await downloadDraftsSubmissionData()\n } else {\n formSubmissionDrafts = localDraftsStorage.syncedFormSubmissionDrafts\n }\n\n const formSubmissionDraft = formSubmissionDrafts.find(\n ({ id }) => id === formSubmissionDraftId,\n )\n if (!formSubmissionDraft) {\n return (await getLocalDraftSubmission(formSubmissionDraftId)) || undefined\n }\n\n const s3SubmissionData = await getDraftSubmission(\n formSubmissionDraft,\n abortSignal,\n )\n if (!s3SubmissionData) {\n throw new OneBlinkAppsError(\n \"Data has been removed based on your administrator's draft data retention policy.\",\n {\n title: 'Draft Data Unavailable',\n },\n )\n }\n return s3SubmissionData\n } else {\n if (formSubmissionDrafts) {\n return (await getLocalDraftSubmission(formSubmissionDraftId)) || undefined\n }\n }\n}\n\n/**\n * Remove a draft from the local store and sync with remote drafts.\n *\n * #### Example\n *\n * ```js\n * const draftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003'\n * await draftService.deleteDraft(draftId)\n * ```\n *\n * @param draftId\n * @param formsAppId\n * @returns\n */\nasync function deleteDraft(\n formSubmissionDraftId: string,\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<void> {\n try {\n await removeLocalDraftSubmission(formSubmissionDraftId)\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n const formSubmissionDraft =\n localDraftsStorage.syncedFormSubmissionDrafts.find(\n ({ id }) => id === formSubmissionDraftId,\n )\n if (formSubmissionDraft) {\n const { hasDeletedRemoteDraft } = await deleteDraftData(\n formSubmissionDraftId,\n abortSignal,\n )\n localDraftsStorage.syncedFormSubmissionDrafts =\n localDraftsStorage.syncedFormSubmissionDrafts.filter(\n ({ id }) => id !== formSubmissionDraft.id,\n )\n if (!hasDeletedRemoteDraft) {\n localDraftsStorage.deletedFormSubmissionDrafts.push(\n formSubmissionDraft,\n )\n }\n } else {\n console.log(\n 'Could not find existing draft in synced drafts to delete',\n {\n formSubmissionDraftId,\n localDraftsStorage,\n },\n )\n const draftSubmission =\n localDraftsStorage.unsyncedDraftSubmissions.find(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId === formSubmissionDraftId,\n )\n if (!draftSubmission) {\n return\n }\n\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.filter(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId !== formSubmissionDraftId,\n )\n }\n\n const { downloadDraftsSubmissionData } = await setAndBroadcastDrafts({\n localDraftsStorage,\n abortSignal,\n priorityFn: undefined,\n })\n await downloadDraftsSubmissionData()\n } else {\n let publicDraftsStorage = await getPublicDraftsFromStorage()\n const draftSubmission = publicDraftsStorage.find(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId === formSubmissionDraftId,\n )\n if (!draftSubmission) {\n return\n }\n\n publicDraftsStorage = publicDraftsStorage.filter(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId !== formSubmissionDraftId,\n )\n\n await setAndBroadcastPublicDrafts(publicDraftsStorage)\n }\n\n syncDrafts({\n throwError: false,\n formsAppId,\n })\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n}\n\nasync function setAndBroadcastPublicDrafts(publicDrafts: DraftSubmission[]) {\n await utilsService.localForage.setItem(\n generatePublicDraftsKey(),\n publicDrafts,\n )\n\n console.log('Public drafts have been updated', publicDrafts)\n const localFormSubmissionDrafts =\n await generatePublicLocalFormSubmissionDraftsFromStorage(publicDrafts)\n await executeDraftsListeners(\n localFormSubmissionDrafts.map((draft) => ({ ...draft, isPublic: true })),\n )\n}\n\nasync function setAndBroadcastDrafts({\n localDraftsStorage,\n abortSignal,\n priorityFn,\n}: {\n localDraftsStorage: LocalDraftsStorage\n abortSignal: AbortSignal | undefined\n priorityFn: PriorityFn | undefined\n}): Promise<{ downloadDraftsSubmissionData: () => Promise<void> }> {\n const username = getUsername()\n if (!username) {\n throw new OneBlinkAppsError(\n 'You cannot set your drafts until you have logged in. Please login and try again.',\n {\n requiresLogin: true,\n },\n )\n }\n await utilsService.localForage.setItem(\n generateDraftsKey(username),\n localDraftsStorage,\n )\n\n console.log('Drafts have been updated', localDraftsStorage)\n const { downloadDraftsSubmissionData } =\n await generateLocalFormSubmissionDraftsFromStorage({\n localDraftsStorage,\n abortSignal,\n priorityFn,\n })\n\n return {\n downloadDraftsSubmissionData: async () => {\n const localFormSubmissionDrafts = await downloadDraftsSubmissionData()\n await executeDraftsListeners(localFormSubmissionDrafts)\n },\n }\n}\n\nlet _isSyncingDrafts = false\n\n/**\n * Force a sync of remote drafts with locally stored drafts. This function will\n * swallow all errors thrown unless `true` is passed for the `throwError`\n * property.\n *\n * #### Example\n *\n * ```js\n * await draftService.syncDrafts({\n * throwError: true,\n * formsAppId: 1,\n * })\n * ```\n *\n * @param param0\n * @returns\n */\nasync function syncDrafts({\n priorityFn,\n formsAppId,\n throwError,\n abortSignal,\n}: {\n /** The id of the OneBlink Forms App to sync drafts with */\n formsAppId: number\n /**\n * Function used to determine the order of the draft downloads. It is expected\n * to return a negative value if the first argument is less than the second\n * argument, zero if they're equal, and a positive value otherwise.\n */\n priorityFn?: PriorityFn\n /** `true` to throw errors while syncing */\n throwError?: boolean\n /** Signal to abort the requests */\n abortSignal?: AbortSignal\n}): Promise<void> {\n if (_isSyncingDrafts) {\n console.log('Application is currently syncing drafts.')\n return\n }\n _isSyncingDrafts = true\n\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n\n if (!isUsingPrivateDrafts) {\n const publicDrafts = await getPublicDraftsFromStorage()\n const filteredPublicDrafts = []\n // iterate through public draft records, and check if a draft submission exists for each record.\n // If no draft submission exists for a record, the draft was likely submitted, so we must remove it\n // from the list of public drafts so it no longer appears in the user's draft list.\n for (const publicDraft of publicDrafts) {\n const localDraftSubmission = await getLocalDraftSubmission(\n publicDraft.formSubmissionDraftId,\n )\n if (localDraftSubmission) {\n filteredPublicDrafts.push(publicDraft)\n }\n }\n await setAndBroadcastPublicDrafts(filteredPublicDrafts)\n _isSyncingDrafts = false\n return\n }\n\n try {\n let localDraftsStorage = await getLocalDraftsFromStorage()\n if (localDraftsStorage.deletedFormSubmissionDrafts.length) {\n console.log(\n 'Removing local draft data for deleted drafts',\n localDraftsStorage.deletedFormSubmissionDrafts,\n )\n const newDeletedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[] =\n []\n for (const formSubmissionDraft of localDraftsStorage.deletedFormSubmissionDrafts) {\n const { hasDeletedRemoteDraft } = await deleteDraftData(\n formSubmissionDraft.id,\n abortSignal,\n )\n if (!hasDeletedRemoteDraft) {\n newDeletedFormSubmissionDrafts.push(formSubmissionDraft)\n }\n }\n\n // Get local drafts again to ensure nothing has happened while processing\n localDraftsStorage = await getLocalDraftsFromStorage()\n localDraftsStorage.deletedFormSubmissionDrafts =\n newDeletedFormSubmissionDrafts\n }\n\n const publicDraftsStorage = await getPublicDraftsFromStorage()\n // if public drafts exist, add them to the current logged in users' unsynced drafts\n // and remove them from local storage\n if (publicDraftsStorage.length) {\n localDraftsStorage.unsyncedDraftSubmissions.push(...publicDraftsStorage)\n await utilsService.localForage.setItem(generatePublicDraftsKey(), [])\n }\n\n if (localDraftsStorage.unsyncedDraftSubmissions.length) {\n console.log(\n `Attempting to upload ${localDraftsStorage.unsyncedDraftSubmissions.length} local unsynced drafts(s).`,\n )\n const newUnsyncedDraftSubmissions: DraftSubmission[] = []\n for (const draftSubmission of localDraftsStorage.unsyncedDraftSubmissions) {\n console.log(\n 'Uploading draft data that was saved while offline',\n draftSubmission.title,\n )\n draftSubmission.backgroundUpload = false\n const formSubmissionDraftVersion = await saveDraftSubmission({\n draftSubmission,\n autoSaveKey: undefined,\n abortSignal,\n skipUpload: !isUsingPrivateDrafts,\n })\n if (!formSubmissionDraftVersion) {\n newUnsyncedDraftSubmissions.push(draftSubmission)\n }\n }\n // Get local drafts again to ensure nothing has happened while processing\n localDraftsStorage = await getLocalDraftsFromStorage()\n localDraftsStorage.unsyncedDraftSubmissions = newUnsyncedDraftSubmissions\n }\n\n const formSubmissionDrafts = await tryGetFormSubmissionDrafts(\n formsAppId,\n abortSignal,\n )\n if (formSubmissionDrafts) {\n localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts\n }\n\n const { downloadDraftsSubmissionData } = await setAndBroadcastDrafts({\n localDraftsStorage,\n abortSignal,\n priorityFn,\n })\n\n console.log('Downloading drafts in the background')\n downloadDraftsSubmissionData()\n .then(async () => {\n console.log('Finished syncing drafts.')\n })\n .catch((error) => {\n if (abortSignal?.aborted) {\n console.log('Syncing drafts has been aborted')\n return\n }\n console.warn(\n 'Error while attempting download drafts in the background',\n error,\n )\n if (!(error instanceof OneBlinkAppsError)) {\n Sentry.captureException(error)\n }\n })\n .finally(() => {\n _isSyncingDrafts = false\n })\n } catch (error) {\n _isSyncingDrafts = false\n if (abortSignal?.aborted) {\n console.log('Syncing drafts has been aborted')\n return\n }\n console.warn(\n 'Error while attempting to sync and update local drafts',\n error,\n )\n if (!(error instanceof OneBlinkAppsError)) {\n Sentry.captureException(error)\n }\n if (throwError) {\n throw error\n }\n }\n}\n\nexport {\n registerDraftsListener,\n upsertDraft,\n getDraftAndData,\n getDrafts,\n getPublicDrafts,\n deleteDraft,\n syncDrafts,\n getLatestFormSubmissionDraftVersion,\n LocalFormSubmissionDraft,\n}\n"]}
|
|
@@ -9,6 +9,7 @@ import prepareSubmissionData from '../prepareSubmissionData';
|
|
|
9
9
|
import generateOneBlinkUploader from '../generateOneBlinkUploader';
|
|
10
10
|
import { OneBlinkStorageError } from '@oneblink/storage';
|
|
11
11
|
import generateOneBlinkDownloader from '../generateOneBlinkDownloader';
|
|
12
|
+
import { isOffline } from '../../offline-service';
|
|
12
13
|
async function uploadDraftData(draftSubmission, onProgress, abortSignal) {
|
|
13
14
|
var _a, _b, _c, _d;
|
|
14
15
|
try {
|
|
@@ -200,6 +201,12 @@ async function downloadDraftData(formSubmissionDraft, latestFormSubmissionDraftV
|
|
|
200
201
|
}
|
|
201
202
|
}
|
|
202
203
|
}
|
|
204
|
+
if (isOffline()) {
|
|
205
|
+
throw new OneBlinkAppsError('You are currently offline and do not have a local copy of this draft available, please connect to the internet and try again', {
|
|
206
|
+
originalError: error instanceof Error ? error : undefined,
|
|
207
|
+
isOffline: true,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
203
210
|
throw new OneBlinkAppsError('An unknown error has occurred. Please contact support if the problem persists.', {
|
|
204
211
|
title: 'Unexpected Error',
|
|
205
212
|
originalError: error instanceof Error ? error : undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../../src/apps/services/api/drafts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,iBAAiB,MAAM,6BAA6B,CAAA;AAC3D,OAAO,OAAO,MAAM,eAAe,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,MAAM,MAAM,cAAc,CAAA;AACjC,OAAO,qBAAqB,MAAM,0BAA0B,CAAA;AAE5D,OAAO,wBAAwB,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,0BAA0B,MAAM,+BAA+B,CAAA;AAEtE,KAAK,UAAU,eAAe,CAC5B,eAAgC,EAChC,UAA6B,EAC7B,WAAyB;;IAEzB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,eAAe,CAAC,CAAA;QAC/D,MAAM,gBAAgB,GAAG,wBAAwB,EAAE,CAAA;QACnD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;QAChC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;QAC9C,OAAO,MAAM,gBAAgB,CAAC,yBAAyB,CAAC;YACtD,UAAU;YACV,UAAU,EAAE,eAAe,CAAC,UAAU;YACtC,MAAM,EAAE,oBAAoB,EAAE;YAC9B,SAAS,EAAE,SAAS,IAAI,SAAS;YACjC,gCAAgC,EAC9B,eAAe,CAAC,gCAAgC;YAClD,KAAK,EAAE,eAAe,CAAC,KAAK;YAC5B,UAAU,EAAE,eAAe,CAAC,UAAU;YACtC,UAAU,EAAE,eAAe,CAAC,UAAU;YACtC,MAAM,EAAE,MAAA,eAAe,CAAC,cAAc,0CAAE,IAAI,CAAC,MAAM;YACnD,YAAY,EAAE,MAAA,eAAe,CAAC,cAAc,0CAAE,UAAU,CAAC,YAAY;YACrE,mBAAmB,EACjB,MAAA,MAAA,eAAe,CAAC,cAAc,0CAAE,iBAAiB,0CAAE,mBAAmB;YACxE,qBAAqB,EAAE,eAAe,CAAC,qBAAqB;YAC5D,SAAS,EAAE,eAAe,CAAC,SAAS;YACpC,KAAK,EAAE,eAAe,CAAC,KAAK;YAC5B,kBAAkB,EAAE,eAAe,CAAC,kBAAkB;YACtD,YAAY,EAAE,eAAe,CAAC,YAAY;YAC1C,8BAA8B,EAC5B,eAAe,CAAC,8BAA8B;YAChD,UAAU;YACV,WAAW;SACZ,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,KAAK,CAAC,CAAA;QAC3E,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YAC1C,QAAQ,KAAK,CAAC,cAAc,EAAE,CAAC;gBAC7B,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CACzB,8EAA8E,EAC9E;wBACE,aAAa,EAAE,KAAK;wBACpB,aAAa,EAAE,IAAI;wBACnB,cAAc,EAAE,KAAK,CAAC,cAAc;qBACrC,CACF,CAAA;gBACH,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CACzB,+HAA+H,EAC/H;wBACE,aAAa,EAAE,KAAK;wBACpB,qBAAqB,EAAE,IAAI;wBAC3B,cAAc,EAAE,KAAK,CAAC,cAAc;qBACrC,CACF,CAAA;gBACH,CAAC;gBACD,KAAK,GAAG,CAAC;gBACT,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CACzB,mLAAmL,EACnL;wBACE,aAAa,EAAE,KAAK;wBACpB,KAAK,EAAE,qBAAqB;wBAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;qBACrC,CACF,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,iBAAiB,CACzB,gFAAgF,EAChF;YACE,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SAC1D,CACF,CAAA;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,UAAkB,EAClB,WAAyB;IAEzB,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CACT,0EAA0E,CAC3E,CAAA;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,yBAAyB,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC5D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IAC/C,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IAE/D,IAAI,CAAC;QACH,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,UAAU,CAE9C,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QACzB,OAAO,oBAAoB,CAAA;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,6DAA6D,EAC7D,GAAG,CACJ,CAAA;QACD,IAAI,GAAG,YAAY,iBAAiB,EAAE,CAAC;YACrC,MAAM,GAAG,CAAA;QACX,CAAC;QAED,MAAM,KAAK,GAAG,GAAgB,CAAA;QAC9B,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,MAAM,IAAI,iBAAiB,CACzB,uFAAuF,EACvF;oBACE,aAAa,EAAE,KAAK;oBACpB,cAAc,EAAE,KAAK,CAAC,MAAM;oBAC5B,aAAa,EAAE,IAAI;iBACpB,CACF,CAAA;YACH,CAAC;YACD,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,MAAM,IAAI,iBAAiB,CACzB,+HAA+H,EAC/H;oBACE,aAAa,EAAE,KAAK;oBACpB,cAAc,EAAE,KAAK,CAAC,MAAM;oBAC5B,qBAAqB,EAAE,IAAI;iBAC5B,CACF,CAAA;YACH,CAAC;YACD,KAAK,GAAG,CAAC;YACT,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,MAAM,IAAI,iBAAiB,CACzB,oLAAoL,EACpL;oBACE,aAAa,EAAE,KAAK;oBACpB,KAAK,EAAE,sBAAsB;oBAC7B,cAAc,EAAE,KAAK,CAAC,MAAM;iBAC7B,CACF,CAAA;YACH,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,IAAI,iBAAiB,CACzB,gFAAgF,EAChF;oBACE,aAAa,EAAE,KAAK;iBACrB,CACF,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,mBAAwD,EACxD,gCAA4E,EAC5E,WAAyB;IAEzB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE;YACrD,4BAA4B,EAAE,gCAAgC,CAAC,EAAE;SAClE,CAAC,CAAA;QACF,MAAM,kBAAkB,GAAG,0BAA0B,EAAE,CAAA;QACvD,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,CAAC,uBAAuB,CAAC;YACxE,4BAA4B,EAAE,gCAAgC,CAAC,EAAE;YACjE,WAAW;SACZ,CAAC,CAAA;QACF,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,OAAO;YACL,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB;YACvD,wEAAwE;YACxE,UAAU,EAAE,gBAAgB,CAAC,UAAoB;YACjD,KAAK,EAAE,mBAAmB,CAAC,KAAK;YAChC,UAAU,EAAE,mBAAmB,CAAC,UAAU;YAC1C,gCAAgC,EAC9B,mBAAmB,CAAC,gCAAgC;YACtD,cAAc,EAAE,gBAAgB,CAAC,IAAI;gBACnC,gBAAgB,CAAC,UAAU,IAAI;gBAC7B,IAAI,EAAE,gBAAgB,CAAC,IAAI;gBAC3B,UAAU,EAAE,gBAAgB,CAAC,UAAU;gBACvC,SAAS,EAAE,gBAAgB,CAAC,SAAS;gBACrC,iBAAiB,EAAE,gBAAgB,CAAC,iBAAiB;gBACrD,WAAW,EAAE,EAAE;aAChB;YACH,KAAK,EAAE,gCAAgC,CAAC,KAAK;YAC7C,SAAS,EAAE,gCAAgC,CAAC,SAAS;YACrD,qBAAqB,EAAE,mBAAmB,CAAC,EAAE;YAC7C,YAAY,EAAE,gBAAgB,CAAC,YAAY;YAC3C,8BAA8B,EAC5B,gBAAgB,CAAC,8BAA8B;SAClD,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;YACzB,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,OAAO,CAAC,KAAK,CACX,wDAAwD,EACxD,KAAK,CACN,CAAA;QAED,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;YACvC,MAAM,KAAK,CAAA;QACb,CAAC;QAED,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAE9B,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YAC1C,QAAQ,KAAK,CAAC,cAAc,EAAE,CAAC;gBAC7B,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE;wBACzC,aAAa,EAAE,KAAK;wBACpB,KAAK,EAAE,iBAAiB;wBACxB,cAAc,EAAE,KAAK,CAAC,cAAc;qBACrC,CAAC,CAAA;gBACJ,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CACzB,sFAAsF,EACtF;wBACE,aAAa,EAAE,KAAK;wBACpB,cAAc,EAAE,KAAK,CAAC,cAAc;wBACpC,aAAa,EAAE,IAAI;qBACpB,CACF,CAAA;gBACH,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CACzB,+HAA+H,EAC/H;wBACE,aAAa,EAAE,KAAK;wBACpB,cAAc,EAAE,KAAK,CAAC,cAAc;wBACpC,qBAAqB,EAAE,IAAI;qBAC5B,CACF,CAAA;gBACH,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CACzB,mKAAmK,EACnK;wBACE,aAAa,EAAE,KAAK;wBACpB,KAAK,EAAE,eAAe;wBACtB,cAAc,EAAE,KAAK,CAAC,cAAc;qBACrC,CACF,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,iBAAiB,CACzB,gFAAgF,EAChF;YACE,KAAK,EAAE,kBAAkB;YACzB,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACzD,cAAc,EACZ,KAAK,YAAY,oBAAoB;gBACnC,CAAC,CAAC,KAAK,CAAC,cAAc;gBACtB,CAAC,CAAC,SAAS;SAChB,CACF,CAAA;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,qBAA6B,EAC7B,WAAyB;IAEzB,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,2BAA2B,qBAAqB,EAAE,CAAA;IAC1F,OAAO,CAAC,GAAG,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAA;IACvE,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,4DAA4D,EAC5D,KAAK,CACN,CAAA;QACD,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;YACvC,MAAM,KAAK,CAAA;QACb,CAAC;QAED,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAE9B,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;gBACrB,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CACzB,gFAAgF,EAChF;wBACE,aAAa,EAAE,KAAK;wBACpB,cAAc,EAAE,KAAK,CAAC,MAAM;wBAC5B,aAAa,EAAE,IAAI;qBACpB,CACF,CAAA;gBACH,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CACzB,+HAA+H,EAC/H;wBACE,aAAa,EAAE,KAAK;wBACpB,cAAc,EAAE,KAAK,CAAC,MAAM;wBAC5B,qBAAqB,EAAE,IAAI;qBAC5B,CACF,CAAA;gBACH,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE;wBACzC,aAAa,EAAE,KAAK;wBACpB,KAAK,EAAE,iBAAiB;wBACxB,cAAc,EAAE,KAAK,CAAC,MAAM;qBAC7B,CAAC,CAAA;gBACJ,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,OAAO,CAAC,IAAI,CACV,0EAA0E,EAC1E,qBAAqB,EACrB,KAAK,CACN,CAAA;oBACD,OAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,iBAAiB,CACzB,gFAAgF,EAChF;YACE,aAAa,EAAE,KAAc;SAC9B,CACF,CAAA;IACH,CAAC;AACH,CAAC;AAED,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,yBAAyB,GAC1B,CAAA","sourcesContent":["import { SubmissionTypes } from '@oneblink/types'\nimport { getRequest, HTTPError, deleteRequest } from '../fetch'\nimport { isLoggedIn } from '../../auth-service'\nimport { getDeviceInformation } from '../getDeviceInformation'\nimport OneBlinkAppsError from '../errors/oneBlinkAppsError'\nimport tenants from '../../tenants'\nimport { getUserToken } from '../user-token'\nimport Sentry from '../../Sentry'\nimport prepareSubmissionData from '../prepareSubmissionData'\nimport { DraftSubmission, ProgressListener } from '../../types/submissions'\nimport generateOneBlinkUploader from '../generateOneBlinkUploader'\nimport { OneBlinkStorageError } from '@oneblink/storage'\nimport generateOneBlinkDownloader from '../generateOneBlinkDownloader'\n\nasync function uploadDraftData(\n draftSubmission: DraftSubmission,\n onProgress?: ProgressListener,\n abortSignal?: AbortSignal,\n) {\n try {\n const submission = await prepareSubmissionData(draftSubmission)\n const oneblinkUploader = generateOneBlinkUploader()\n const userToken = getUserToken()\n console.log('Attempting to upload draft data')\n return await oneblinkUploader.uploadFormSubmissionDraft({\n submission,\n definition: draftSubmission.definition,\n device: getDeviceInformation(),\n userToken: userToken || undefined,\n previousFormSubmissionApprovalId:\n draftSubmission.previousFormSubmissionApprovalId,\n jobId: draftSubmission.jobId,\n formsAppId: draftSubmission.formsAppId,\n externalId: draftSubmission.externalId,\n taskId: draftSubmission.taskCompletion?.task.taskId,\n taskActionId: draftSubmission.taskCompletion?.taskAction.taskActionId,\n taskGroupInstanceId:\n draftSubmission.taskCompletion?.taskGroupInstance?.taskGroupInstanceId,\n formSubmissionDraftId: draftSubmission.formSubmissionDraftId,\n createdAt: draftSubmission.createdAt,\n title: draftSubmission.title,\n lastElementUpdated: draftSubmission.lastElementUpdated,\n sectionState: draftSubmission.sectionState,\n previousElapsedDurationSeconds:\n draftSubmission.previousElapsedDurationSeconds,\n onProgress,\n abortSignal,\n })\n } catch (error) {\n console.warn('Error occurred while attempting to upload draft data', error)\n Sentry.captureException(error)\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot save drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n requiresLogin: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n requiresAccessRequest: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the application your attempting upload a draft for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Application',\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error instanceof Error ? error : undefined,\n },\n )\n }\n}\n\nasync function getFormSubmissionDrafts(\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<SubmissionTypes.FormSubmissionDraft[]> {\n if (!isLoggedIn()) {\n console.log(\n 'Could not retrieve drafts from API as the current user is not logged in.',\n )\n return []\n }\n\n const url = new URL('/form-submission-drafts', tenants.current.apiOrigin)\n url.searchParams.append('formsAppId', formsAppId.toString())\n url.searchParams.append('isSubmitted', 'false')\n console.log('Attempting to retrieve drafts from API', url.href)\n\n try {\n const { formSubmissionDrafts } = await getRequest<{\n formSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n }>(url.href, abortSignal)\n return formSubmissionDrafts\n } catch (err) {\n console.warn(\n 'Error occurred while attempting to retrieve drafts from API',\n err,\n )\n if (err instanceof OneBlinkAppsError) {\n throw err\n }\n\n const error = err as HTTPError\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve your drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the application your attempting retrieve drafts for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Error Syncing Drafts',\n httpStatusCode: error.status,\n },\n )\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n },\n )\n }\n }\n }\n}\n\nasync function downloadDraftData(\n formSubmissionDraft: SubmissionTypes.FormSubmissionDraft,\n latestFormSubmissionDraftVersion: SubmissionTypes.FormSubmissionDraftVersion,\n abortSignal?: AbortSignal,\n): Promise<DraftSubmission | undefined> {\n try {\n console.log('Attempting to download draft form data:', {\n formSubmissionDraftVersionId: latestFormSubmissionDraftVersion.id,\n })\n const oneblinkDownloader = generateOneBlinkDownloader()\n const s3SubmissionData = await oneblinkDownloader.downloadDraftSubmission({\n formSubmissionDraftVersionId: latestFormSubmissionDraftVersion.id,\n abortSignal,\n })\n if (!s3SubmissionData) {\n return undefined\n }\n return {\n definition: s3SubmissionData.definition,\n submission: s3SubmissionData.submission,\n lastElementUpdated: s3SubmissionData.lastElementUpdated,\n // Drafts will always have a formsAppId, so we can safely cast to number\n formsAppId: s3SubmissionData.formsAppId as number,\n jobId: formSubmissionDraft.jobId,\n externalId: formSubmissionDraft.externalId,\n previousFormSubmissionApprovalId:\n formSubmissionDraft.previousFormSubmissionApprovalId,\n taskCompletion: s3SubmissionData.task &&\n s3SubmissionData.taskAction && {\n task: s3SubmissionData.task,\n taskAction: s3SubmissionData.taskAction,\n taskGroup: s3SubmissionData.taskGroup,\n taskGroupInstance: s3SubmissionData.taskGroupInstance,\n redirectUrl: '',\n },\n title: latestFormSubmissionDraftVersion.title,\n createdAt: latestFormSubmissionDraftVersion.createdAt,\n formSubmissionDraftId: formSubmissionDraft.id,\n sectionState: s3SubmissionData.sectionState,\n previousElapsedDurationSeconds:\n s3SubmissionData.previousElapsedDurationSeconds,\n }\n } catch (error) {\n if (abortSignal?.aborted) {\n return undefined\n }\n\n console.error(\n 'Error occurred while attempting to download draft data',\n error,\n )\n\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.httpStatusCode,\n })\n }\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve draft data until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresAccessRequest: true,\n },\n )\n }\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the draft your attempting retrieve. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Draft',\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n title: 'Unexpected Error',\n originalError: error instanceof Error ? error : undefined,\n httpStatusCode:\n error instanceof OneBlinkStorageError\n ? error.httpStatusCode\n : undefined,\n },\n )\n }\n}\n\nasync function deleteFormSubmissionDraft(\n formSubmissionDraftId: string,\n abortSignal?: AbortSignal,\n) {\n const url = `${tenants.current.apiOrigin}/form-submission-drafts/${formSubmissionDraftId}`\n console.log('Attempting to delete form submission draft remotely', url)\n try {\n await deleteRequest(url, abortSignal)\n } catch (error) {\n console.warn(\n 'Error occurred while attempting to delete a draft from API',\n error,\n )\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof HTTPError) {\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot delete drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.status,\n })\n }\n case 404: {\n console.warn(\n 'Remote draft does not exist, we will assume it has already been deleted.',\n formSubmissionDraftId,\n error,\n )\n return\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error as Error,\n },\n )\n }\n}\n\nexport {\n uploadDraftData,\n getFormSubmissionDrafts,\n downloadDraftData,\n deleteFormSubmissionDraft,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../../src/apps/services/api/drafts.ts"],"names":[],"mappings":"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","sourcesContent":["import { SubmissionTypes } from '@oneblink/types'\nimport { getRequest, HTTPError, deleteRequest } from '../fetch'\nimport { isLoggedIn } from '../../auth-service'\nimport { getDeviceInformation } from '../getDeviceInformation'\nimport OneBlinkAppsError from '../errors/oneBlinkAppsError'\nimport tenants from '../../tenants'\nimport { getUserToken } from '../user-token'\nimport Sentry from '../../Sentry'\nimport prepareSubmissionData from '../prepareSubmissionData'\nimport { DraftSubmission, ProgressListener } from '../../types/submissions'\nimport generateOneBlinkUploader from '../generateOneBlinkUploader'\nimport { OneBlinkStorageError } from '@oneblink/storage'\nimport generateOneBlinkDownloader from '../generateOneBlinkDownloader'\nimport { isOffline } from '../../offline-service'\n\nasync function uploadDraftData(\n draftSubmission: DraftSubmission,\n onProgress?: ProgressListener,\n abortSignal?: AbortSignal,\n) {\n try {\n const submission = await prepareSubmissionData(draftSubmission)\n const oneblinkUploader = generateOneBlinkUploader()\n const userToken = getUserToken()\n console.log('Attempting to upload draft data')\n return await oneblinkUploader.uploadFormSubmissionDraft({\n submission,\n definition: draftSubmission.definition,\n device: getDeviceInformation(),\n userToken: userToken || undefined,\n previousFormSubmissionApprovalId:\n draftSubmission.previousFormSubmissionApprovalId,\n jobId: draftSubmission.jobId,\n formsAppId: draftSubmission.formsAppId,\n externalId: draftSubmission.externalId,\n taskId: draftSubmission.taskCompletion?.task.taskId,\n taskActionId: draftSubmission.taskCompletion?.taskAction.taskActionId,\n taskGroupInstanceId:\n draftSubmission.taskCompletion?.taskGroupInstance?.taskGroupInstanceId,\n formSubmissionDraftId: draftSubmission.formSubmissionDraftId,\n createdAt: draftSubmission.createdAt,\n title: draftSubmission.title,\n lastElementUpdated: draftSubmission.lastElementUpdated,\n sectionState: draftSubmission.sectionState,\n previousElapsedDurationSeconds:\n draftSubmission.previousElapsedDurationSeconds,\n onProgress,\n abortSignal,\n })\n } catch (error) {\n console.warn('Error occurred while attempting to upload draft data', error)\n Sentry.captureException(error)\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot save drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n requiresLogin: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n requiresAccessRequest: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the application your attempting upload a draft for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Application',\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error instanceof Error ? error : undefined,\n },\n )\n }\n}\n\nasync function getFormSubmissionDrafts(\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<SubmissionTypes.FormSubmissionDraft[]> {\n if (!isLoggedIn()) {\n console.log(\n 'Could not retrieve drafts from API as the current user is not logged in.',\n )\n return []\n }\n\n const url = new URL('/form-submission-drafts', tenants.current.apiOrigin)\n url.searchParams.append('formsAppId', formsAppId.toString())\n url.searchParams.append('isSubmitted', 'false')\n console.log('Attempting to retrieve drafts from API', url.href)\n\n try {\n const { formSubmissionDrafts } = await getRequest<{\n formSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n }>(url.href, abortSignal)\n return formSubmissionDrafts\n } catch (err) {\n console.warn(\n 'Error occurred while attempting to retrieve drafts from API',\n err,\n )\n if (err instanceof OneBlinkAppsError) {\n throw err\n }\n\n const error = err as HTTPError\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve your drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the application your attempting retrieve drafts for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Error Syncing Drafts',\n httpStatusCode: error.status,\n },\n )\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n },\n )\n }\n }\n }\n}\n\nasync function downloadDraftData(\n formSubmissionDraft: SubmissionTypes.FormSubmissionDraft,\n latestFormSubmissionDraftVersion: SubmissionTypes.FormSubmissionDraftVersion,\n abortSignal?: AbortSignal,\n): Promise<DraftSubmission | undefined> {\n try {\n console.log('Attempting to download draft form data:', {\n formSubmissionDraftVersionId: latestFormSubmissionDraftVersion.id,\n })\n const oneblinkDownloader = generateOneBlinkDownloader()\n const s3SubmissionData = await oneblinkDownloader.downloadDraftSubmission({\n formSubmissionDraftVersionId: latestFormSubmissionDraftVersion.id,\n abortSignal,\n })\n if (!s3SubmissionData) {\n return undefined\n }\n return {\n definition: s3SubmissionData.definition,\n submission: s3SubmissionData.submission,\n lastElementUpdated: s3SubmissionData.lastElementUpdated,\n // Drafts will always have a formsAppId, so we can safely cast to number\n formsAppId: s3SubmissionData.formsAppId as number,\n jobId: formSubmissionDraft.jobId,\n externalId: formSubmissionDraft.externalId,\n previousFormSubmissionApprovalId:\n formSubmissionDraft.previousFormSubmissionApprovalId,\n taskCompletion: s3SubmissionData.task &&\n s3SubmissionData.taskAction && {\n task: s3SubmissionData.task,\n taskAction: s3SubmissionData.taskAction,\n taskGroup: s3SubmissionData.taskGroup,\n taskGroupInstance: s3SubmissionData.taskGroupInstance,\n redirectUrl: '',\n },\n title: latestFormSubmissionDraftVersion.title,\n createdAt: latestFormSubmissionDraftVersion.createdAt,\n formSubmissionDraftId: formSubmissionDraft.id,\n sectionState: s3SubmissionData.sectionState,\n previousElapsedDurationSeconds:\n s3SubmissionData.previousElapsedDurationSeconds,\n }\n } catch (error) {\n if (abortSignal?.aborted) {\n return undefined\n }\n\n console.error(\n 'Error occurred while attempting to download draft data',\n error,\n )\n\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.httpStatusCode,\n })\n }\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve draft data until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresAccessRequest: true,\n },\n )\n }\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the draft your attempting retrieve. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Draft',\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n }\n }\n\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline and do not have a local copy of this draft available, please connect to the internet and try again',\n {\n originalError: error instanceof Error ? error : undefined,\n isOffline: true,\n },\n )\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n title: 'Unexpected Error',\n originalError: error instanceof Error ? error : undefined,\n httpStatusCode:\n error instanceof OneBlinkStorageError\n ? error.httpStatusCode\n : undefined,\n },\n )\n }\n}\n\nasync function deleteFormSubmissionDraft(\n formSubmissionDraftId: string,\n abortSignal?: AbortSignal,\n) {\n const url = `${tenants.current.apiOrigin}/form-submission-drafts/${formSubmissionDraftId}`\n console.log('Attempting to delete form submission draft remotely', url)\n try {\n await deleteRequest(url, abortSignal)\n } catch (error) {\n console.warn(\n 'Error occurred while attempting to delete a draft from API',\n error,\n )\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof HTTPError) {\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot delete drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.status,\n })\n }\n case 404: {\n console.warn(\n 'Remote draft does not exist, we will assume it has already been deleted.',\n formSubmissionDraftId,\n error,\n )\n return\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error as Error,\n },\n )\n }\n}\n\nexport {\n uploadDraftData,\n getFormSubmissionDrafts,\n downloadDraftData,\n deleteFormSubmissionDraft,\n}\n"]}
|
|
@@ -18,9 +18,9 @@ const AutocompleteFilter = React.memo(function AutocompleteFilter({ id, element,
|
|
|
18
18
|
const lowerCase = label.toLowerCase();
|
|
19
19
|
return option.label.toLowerCase().includes(lowerCase);
|
|
20
20
|
}, [label]);
|
|
21
|
-
const handleChange = React.useCallback(
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
const handleChange = React.useCallback((element, { value }) => {
|
|
22
|
+
onChange(value);
|
|
23
|
+
}, [onChange]);
|
|
24
24
|
const filteredOptions = useFormElementOptions({
|
|
25
25
|
element,
|
|
26
26
|
value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormElementAutocomplete.js","sourceRoot":"","sources":["../../src/form-elements/FormElementAutocomplete.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { formElementsService } from '@oneblink/sdk-core'\nimport { generateHeaders } from '../apps/services/fetch'\n\nimport FormElementOptions from '../components/renderer/FormElementOptions'\nimport useFormElementOptions from '../hooks/useFormElementOptions'\nimport AutocompleteDropdown from '../components/renderer/AutocompleteDropdown'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport { FormTypes } from '@oneblink/types'\nimport {\n FormElementValueChangeHandler,\n FormElementConditionallyShownElement,\n IsDirtyProps,\n UpdateFormElementsHandler,\n} from '../types/form'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\n\ntype _BaseProps = {\n id: string\n element: FormTypes.AutoCompleteElement\n value: unknown | undefined\n displayValidationMessage: boolean\n validationMessage: string | undefined\n onUpdateFormElements: UpdateFormElementsHandler\n autocompleteAttributes?: string\n} & IsDirtyProps\n\ntype _AutocompleteChangeHandlerProps = _BaseProps & {\n onChange: (newValue: unknown | undefined) => void\n}\n\ntype _AutocompleteConditionallyShowOptionProps = {\n conditionallyShownOptionsElement:\n | FormElementConditionallyShownElement\n | undefined\n}\n\ntype AutocompleteFilterProps = _AutocompleteChangeHandlerProps &\n _AutocompleteConditionallyShowOptionProps\n\ntype AutocompleteFetchProps = _AutocompleteChangeHandlerProps & {\n searchUrl: string\n searchQuerystringParameter: string\n}\n\ntype Props = _BaseProps &\n _AutocompleteConditionallyShowOptionProps & {\n onChange: FormElementValueChangeHandler<string>\n }\n\nconst AutocompleteFilter = React.memo(function AutocompleteFilter({\n id,\n element,\n value,\n onChange,\n conditionallyShownOptionsElement,\n validationMessage,\n displayValidationMessage,\n onUpdateFormElements,\n isDirty,\n setIsDirty,\n autocompleteAttributes,\n}: AutocompleteFilterProps) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const [label, setLabel] = React.useState('')\n\n const onFilter = React.useCallback(\n (option: FormTypes.ChoiceElementOption) => {\n // If the user has typed nothing in, display all options\n if (!label) {\n return true\n }\n\n const lowerCase = label.toLowerCase()\n\n return option.label.toLowerCase().includes(lowerCase)\n },\n [label],\n )\n\n const handleChange = React.useCallback(\n //useFormElementOptions expects the first arg to be the element\n (element: FormTypes.FormElement, newValue: unknown) => onChange(newValue),\n [onChange],\n )\n\n const filteredOptions = useFormElementOptions({\n element,\n value,\n onChange: handleChange,\n conditionallyShownOptionsElement,\n onFilter,\n onUpdateFormElements,\n })\n\n const handleSearch = React.useCallback(async () => {\n return filteredOptions\n }, [filteredOptions])\n\n // Ensure the label matches the value selected\n React.useEffect(() => {\n if (!Array.isArray(element.options)) {\n return\n }\n\n const option = element.options.find((option) => option.value === value)\n if (option && label !== option.label) {\n setLabel(option.label)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [element.options, value])\n\n return (\n <div className=\"cypress-autocomplete-filter-element\">\n <FormElementLabelContainer\n className=\"ob-autocomplete\"\n element={element}\n id={id}\n required={element.required}\n >\n <FormElementOptions\n options={element.options}\n conditionallyShownOptionsElement={conditionallyShownOptionsElement}\n >\n <AutocompleteDropdown\n id={id}\n label={label}\n disabled={element.readOnly}\n placeholder={element.placeholderValue}\n required={element.required}\n value={value}\n validationMessage={validationMessage}\n displayValidationMessage={displayValidationMessage}\n onChangeValue={onChange}\n onChangeLabel={setLabel}\n onSearch={handleSearch}\n searchDebounceMs={0}\n searchMinCharacters={0}\n isDirty={isDirty}\n setIsDirty={setIsDirty}\n aria-describedby={ariaDescribedby}\n autoComplete={autocompleteAttributes}\n />\n </FormElementOptions>\n </FormElementLabelContainer>\n </div>\n )\n})\n\nconst AutocompleteFetch = React.memo(function AutocompleteFetch({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n searchUrl,\n searchQuerystringParameter,\n isDirty,\n setIsDirty,\n autocompleteAttributes,\n}: AutocompleteFetchProps) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const [label, setLabel] = React.useState('')\n\n const handleSearch = React.useCallback(\n async (search: string, abortSignal: AbortSignal) => {\n const headers = await generateHeaders()\n const url = new URL(searchUrl)\n url.searchParams.append(searchQuerystringParameter, search)\n const response = await fetch(url.href, {\n headers,\n signal: abortSignal,\n })\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(text)\n }\n\n const data = await response.json()\n return formElementsService.parseDynamicFormElementOptions(data)\n },\n [searchQuerystringParameter, searchUrl],\n )\n\n // Ensure the label is set if the value is set outside of this component\n React.useEffect(() => {\n if (!label && typeof value === 'string') {\n setLabel(value)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value])\n\n return (\n <div className=\"cypress-autocomplete-search-element\">\n <FormElementLabelContainer\n className=\"ob-autocomplete\"\n element={element}\n id={id}\n required={element.required}\n >\n <AutocompleteDropdown\n id={id}\n label={label}\n disabled={element.readOnly}\n placeholder={element.placeholderValue}\n required={element.required}\n value={value}\n validationMessage={validationMessage}\n displayValidationMessage={displayValidationMessage}\n onChangeValue={onChange}\n onChangeLabel={setLabel}\n searchDebounceMs={750}\n searchMinCharacters={1}\n onSearch={handleSearch}\n isDirty={isDirty}\n setIsDirty={setIsDirty}\n aria-describedby={ariaDescribedby}\n autoComplete={autocompleteAttributes}\n />\n </FormElementLabelContainer>\n </div>\n )\n})\n\nfunction FormElementAutocomplete({\n conditionallyShownOptionsElement,\n onChange,\n ...props\n}: Props) {\n const handleChange = React.useCallback(\n (newValue: unknown) => {\n onChange(props.element, {\n value: newValue as string | undefined,\n })\n },\n [onChange, props.element],\n )\n if (props.element.optionsType === 'SEARCH' && props.element.searchUrl) {\n return (\n <AutocompleteFetch\n {...props}\n onChange={handleChange}\n searchUrl={props.element.searchUrl}\n searchQuerystringParameter={\n props.element.searchQuerystringParameter || 'value'\n }\n />\n )\n }\n\n return (\n <AutocompleteFilter\n {...props}\n onChange={handleChange}\n conditionallyShownOptionsElement={conditionallyShownOptionsElement}\n />\n )\n}\n\nexport default React.memo(FormElementAutocomplete)\n"]}
|
|
1
|
+
{"version":3,"file":"FormElementAutocomplete.js","sourceRoot":"","sources":["../../src/form-elements/FormElementAutocomplete.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { formElementsService } from '@oneblink/sdk-core'\nimport { generateHeaders } from '../apps/services/fetch'\n\nimport FormElementOptions from '../components/renderer/FormElementOptions'\nimport useFormElementOptions from '../hooks/useFormElementOptions'\nimport AutocompleteDropdown from '../components/renderer/AutocompleteDropdown'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport { FormTypes } from '@oneblink/types'\nimport {\n FormElementValueChangeHandler,\n FormElementConditionallyShownElement,\n IsDirtyProps,\n UpdateFormElementsHandler,\n} from '../types/form'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\n\ntype _BaseProps = {\n id: string\n element: FormTypes.AutoCompleteElement\n value: unknown | undefined\n displayValidationMessage: boolean\n validationMessage: string | undefined\n onUpdateFormElements: UpdateFormElementsHandler\n autocompleteAttributes?: string\n} & IsDirtyProps\n\ntype _AutocompleteChangeHandlerProps = _BaseProps & {\n onChange: (newValue: unknown | undefined) => void\n}\n\ntype _AutocompleteConditionallyShowOptionProps = {\n conditionallyShownOptionsElement:\n | FormElementConditionallyShownElement\n | undefined\n}\n\ntype AutocompleteFilterProps = _AutocompleteChangeHandlerProps &\n _AutocompleteConditionallyShowOptionProps\n\ntype AutocompleteFetchProps = _AutocompleteChangeHandlerProps & {\n searchUrl: string\n searchQuerystringParameter: string\n}\n\ntype Props = _BaseProps &\n _AutocompleteConditionallyShowOptionProps & {\n onChange: FormElementValueChangeHandler<string>\n }\n\nconst AutocompleteFilter = React.memo(function AutocompleteFilter({\n id,\n element,\n value,\n onChange,\n conditionallyShownOptionsElement,\n validationMessage,\n displayValidationMessage,\n onUpdateFormElements,\n isDirty,\n setIsDirty,\n autocompleteAttributes,\n}: AutocompleteFilterProps) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const [label, setLabel] = React.useState('')\n\n const onFilter = React.useCallback(\n (option: FormTypes.ChoiceElementOption) => {\n // If the user has typed nothing in, display all options\n if (!label) {\n return true\n }\n\n const lowerCase = label.toLowerCase()\n\n return option.label.toLowerCase().includes(lowerCase)\n },\n [label],\n )\n\n const handleChange = React.useCallback(\n (element: FormTypes.FormElement, { value }: { value?: unknown }) => {\n onChange(value as string | undefined)\n },\n [onChange],\n )\n\n const filteredOptions = useFormElementOptions({\n element,\n value,\n onChange: handleChange,\n conditionallyShownOptionsElement,\n onFilter,\n onUpdateFormElements,\n })\n\n const handleSearch = React.useCallback(async () => {\n return filteredOptions\n }, [filteredOptions])\n\n // Ensure the label matches the value selected\n React.useEffect(() => {\n if (!Array.isArray(element.options)) {\n return\n }\n\n const option = element.options.find((option) => option.value === value)\n if (option && label !== option.label) {\n setLabel(option.label)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [element.options, value])\n\n return (\n <div className=\"cypress-autocomplete-filter-element\">\n <FormElementLabelContainer\n className=\"ob-autocomplete\"\n element={element}\n id={id}\n required={element.required}\n >\n <FormElementOptions\n options={element.options}\n conditionallyShownOptionsElement={conditionallyShownOptionsElement}\n >\n <AutocompleteDropdown\n id={id}\n label={label}\n disabled={element.readOnly}\n placeholder={element.placeholderValue}\n required={element.required}\n value={value}\n validationMessage={validationMessage}\n displayValidationMessage={displayValidationMessage}\n onChangeValue={onChange}\n onChangeLabel={setLabel}\n onSearch={handleSearch}\n searchDebounceMs={0}\n searchMinCharacters={0}\n isDirty={isDirty}\n setIsDirty={setIsDirty}\n aria-describedby={ariaDescribedby}\n autoComplete={autocompleteAttributes}\n />\n </FormElementOptions>\n </FormElementLabelContainer>\n </div>\n )\n})\n\nconst AutocompleteFetch = React.memo(function AutocompleteFetch({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n searchUrl,\n searchQuerystringParameter,\n isDirty,\n setIsDirty,\n autocompleteAttributes,\n}: AutocompleteFetchProps) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const [label, setLabel] = React.useState('')\n\n const handleSearch = React.useCallback(\n async (search: string, abortSignal: AbortSignal) => {\n const headers = await generateHeaders()\n const url = new URL(searchUrl)\n url.searchParams.append(searchQuerystringParameter, search)\n const response = await fetch(url.href, {\n headers,\n signal: abortSignal,\n })\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(text)\n }\n\n const data = await response.json()\n return formElementsService.parseDynamicFormElementOptions(data)\n },\n [searchQuerystringParameter, searchUrl],\n )\n\n // Ensure the label is set if the value is set outside of this component\n React.useEffect(() => {\n if (!label && typeof value === 'string') {\n setLabel(value)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value])\n\n return (\n <div className=\"cypress-autocomplete-search-element\">\n <FormElementLabelContainer\n className=\"ob-autocomplete\"\n element={element}\n id={id}\n required={element.required}\n >\n <AutocompleteDropdown\n id={id}\n label={label}\n disabled={element.readOnly}\n placeholder={element.placeholderValue}\n required={element.required}\n value={value}\n validationMessage={validationMessage}\n displayValidationMessage={displayValidationMessage}\n onChangeValue={onChange}\n onChangeLabel={setLabel}\n searchDebounceMs={750}\n searchMinCharacters={1}\n onSearch={handleSearch}\n isDirty={isDirty}\n setIsDirty={setIsDirty}\n aria-describedby={ariaDescribedby}\n autoComplete={autocompleteAttributes}\n />\n </FormElementLabelContainer>\n </div>\n )\n})\n\nfunction FormElementAutocomplete({\n conditionallyShownOptionsElement,\n onChange,\n ...props\n}: Props) {\n const handleChange = React.useCallback(\n (newValue: unknown) => {\n onChange(props.element, {\n value: newValue as string | undefined,\n })\n },\n [onChange, props.element],\n )\n if (props.element.optionsType === 'SEARCH' && props.element.searchUrl) {\n return (\n <AutocompleteFetch\n {...props}\n onChange={handleChange}\n searchUrl={props.element.searchUrl}\n searchQuerystringParameter={\n props.element.searchQuerystringParameter || 'value'\n }\n />\n )\n }\n return (\n <AutocompleteFilter\n {...props}\n onChange={handleChange}\n conditionallyShownOptionsElement={conditionallyShownOptionsElement}\n />\n )\n}\n\nexport default React.memo(FormElementAutocomplete)\n"]}
|
|
@@ -45,7 +45,7 @@ export default function useFormElementOptions({ element, value, onChange, condit
|
|
|
45
45
|
taskContext,
|
|
46
46
|
userProfileForInjectables,
|
|
47
47
|
]);
|
|
48
|
-
//options that are shown based on conditional logic and user input
|
|
48
|
+
//options that are shown based on conditional logic, attributes, and user input
|
|
49
49
|
const filteredOptions = React.useMemo(() => {
|
|
50
50
|
const reducedOptions = withInjectedOptions.filter((option) => !onFilter || (onFilter(option) && !option.displayAlways));
|
|
51
51
|
if (element.type === 'autocomplete') {
|
|
@@ -60,14 +60,14 @@ export default function useFormElementOptions({ element, value, onChange, condit
|
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
62
|
if (typeof value === 'string' &&
|
|
63
|
-
!
|
|
63
|
+
!filteredOptions.some((option) => value === option.value)) {
|
|
64
64
|
onChange(element, {
|
|
65
65
|
value: undefined,
|
|
66
66
|
});
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
69
|
if (Array.isArray(value)) {
|
|
70
|
-
const newValue = value.filter((selectedValue) =>
|
|
70
|
+
const newValue = value.filter((selectedValue) => filteredOptions.some((option) => selectedValue === option.value));
|
|
71
71
|
if (newValue.length !== value.length) {
|
|
72
72
|
const newValueArray = newValue.length ? newValue : undefined;
|
|
73
73
|
onChange(element, {
|
|
@@ -77,11 +77,10 @@ export default function useFormElementOptions({ element, value, onChange, condit
|
|
|
77
77
|
}
|
|
78
78
|
}, [
|
|
79
79
|
element,
|
|
80
|
-
shownOptions,
|
|
81
80
|
onChange,
|
|
82
81
|
value,
|
|
83
82
|
conditionallyShownOptionsElement === null || conditionallyShownOptionsElement === void 0 ? void 0 : conditionallyShownOptionsElement.dependencyIsLoading,
|
|
84
|
-
|
|
83
|
+
filteredOptions,
|
|
85
84
|
]);
|
|
86
85
|
useLoadDynamicOptionsEffect(element, onUpdateFormElements);
|
|
87
86
|
return filteredOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormElementOptions.js","sourceRoot":"","sources":["../../src/hooks/useFormElementOptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAA;AAC5E,OAAO,sBAAsB,MAAM,iCAAiC,CAAA;AACpE,OAAO,uBAAuB,MAAM,+BAA+B,CAAA;AACnE,OAAO,cAAc,MAAM,kBAAkB,CAAA;AAC7C,OAAO,4BAA4B,MAAM,gCAAgC,CAAA;AAEzE,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAI,EAC/C,OAAO,EACP,KAAK,EACL,QAAQ,EACR,gCAAgC,EAChC,QAAQ,EACR,oBAAoB,GAUrB;IACC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IACpC,MAAM,yBAAyB,GAAG,4BAA4B,EAAE,CAAA;IAEhE,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAA;IAC1E,MAAM,yBAAyB,GAAG,gCAAgC,aAAhC,gCAAgC,uBAAhC,gCAAgC,CAAE,OAAO,CAAA;IAC3E,iDAAiD;IACjD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAkC,GAAG,EAAE;QACvE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,EAAE,CAAA;QACX,CAAC;QACD,IAAI,CAAC,yBAAyB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5C,OAAO,OAAO,CAAC,OAAO,CAAA;QACxB,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YACvC,OAAO,CACL,CAAC,yBAAyB;gBAC1B,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAC7D,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,yBAAyB,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE1D,EAAE;IACF,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC7C,OAAO,YAAY,CAAC,MAAM,CACxB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,UAAU,GAAG,uBAAuB,CAAC;gBACzC,MAAM;gBACN,UAAU,EAAE,mBAAmB;gBAC/B,YAAY,EAAE,QAAQ;gBACtB,iBAAiB,EAAE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,mBAAmB,KAAI,EAAE;gBACpD,eAAe,EAAE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,KAAI,EAAE;gBACvC,WAAW;gBACX,WAAW,EAAE,yBAAyB;aACvC,CAAC,CAAA;YACF,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;YAExB,OAAO,IAAI,CAAA;QACb,CAAC,EACD,EAAE,CACH,CAAA;IACH,CAAC,EAAE;QACD,QAAQ;QACR,mBAAmB;QACnB,MAAM;QACN,YAAY;QACZ,WAAW;QACX,yBAAyB;KAC1B,CAAC,CAAA;IAEF
|
|
1
|
+
{"version":3,"file":"useFormElementOptions.js","sourceRoot":"","sources":["../../src/hooks/useFormElementOptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAA;AAC5E,OAAO,sBAAsB,MAAM,iCAAiC,CAAA;AACpE,OAAO,uBAAuB,MAAM,+BAA+B,CAAA;AACnE,OAAO,cAAc,MAAM,kBAAkB,CAAA;AAC7C,OAAO,4BAA4B,MAAM,gCAAgC,CAAA;AAEzE,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAI,EAC/C,OAAO,EACP,KAAK,EACL,QAAQ,EACR,gCAAgC,EAChC,QAAQ,EACR,oBAAoB,GAUrB;IACC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IACpC,MAAM,yBAAyB,GAAG,4BAA4B,EAAE,CAAA;IAEhE,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAA;IAC1E,MAAM,yBAAyB,GAAG,gCAAgC,aAAhC,gCAAgC,uBAAhC,gCAAgC,CAAE,OAAO,CAAA;IAC3E,iDAAiD;IACjD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAkC,GAAG,EAAE;QACvE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,EAAE,CAAA;QACX,CAAC;QACD,IAAI,CAAC,yBAAyB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5C,OAAO,OAAO,CAAC,OAAO,CAAA;QACxB,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YACvC,OAAO,CACL,CAAC,yBAAyB;gBAC1B,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAC7D,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,yBAAyB,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE1D,EAAE;IACF,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC7C,OAAO,YAAY,CAAC,MAAM,CACxB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,UAAU,GAAG,uBAAuB,CAAC;gBACzC,MAAM;gBACN,UAAU,EAAE,mBAAmB;gBAC/B,YAAY,EAAE,QAAQ;gBACtB,iBAAiB,EAAE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,mBAAmB,KAAI,EAAE;gBACpD,eAAe,EAAE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,KAAI,EAAE;gBACvC,WAAW;gBACX,WAAW,EAAE,yBAAyB;aACvC,CAAC,CAAA;YACF,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;YAExB,OAAO,IAAI,CAAA;QACb,CAAC,EACD,EAAE,CACH,CAAA;IACH,CAAC,EAAE;QACD,QAAQ;QACR,mBAAmB;QACnB,MAAM;QACN,YAAY;QACZ,WAAW;QACX,yBAAyB;KAC1B,CAAC,CAAA;IAEF,+EAA+E;IAC/E,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAkC,GAAG,EAAE;QAC1E,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAC/C,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CACrE,CAAA;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACpC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,MAAM,CACnD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CACjC,CAAA;YACD,cAAc,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAA;QAC5C,CAAC;QACD,OAAO,cAAc,CAAA;IACvB,CAAC,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEjD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IACE,CAAC,OAAO,CAAC,OAAO;aAChB,gCAAgC,aAAhC,gCAAgC,uBAAhC,gCAAgC,CAAE,mBAAmB,CAAA,EACrD,CAAC;YACD,OAAM;QACR,CAAC;QAED,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,EACzD,CAAC;YACD,QAAQ,CAAC,OAAO,EAAE;gBAChB,KAAK,EAAE,SAAS;aACjB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE,CAC9C,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,KAAK,MAAM,CAAC,KAAK,CAAC,CACjE,CAAA;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBACrC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;gBAC5D,QAAQ,CAAC,OAAO,EAAE;oBAChB,KAAK,EAAE,aAA8B;iBACtC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC,EAAE;QACD,OAAO;QACP,QAAQ;QACR,KAAK;QACL,gCAAgC,aAAhC,gCAAgC,uBAAhC,gCAAgC,CAAE,mBAAmB;QACrD,eAAe;KAChB,CAAC,CAAA;IAEF,2BAA2B,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;IAE1D,OAAO,eAAe,CAAA;AACxB,CAAC","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport * as React from 'react'\nimport {\n FormElementValueChangeHandler,\n FormElementConditionallyShownElement,\n UpdateFormElementsHandler,\n} from '../types/form'\nimport { useLoadDynamicOptionsEffect } from './useDynamicOptionsLoaderState'\nimport useFormSubmissionModel from './useFormSubmissionModelContext'\nimport processInjectableOption from '../services/injectableOptions'\nimport useTaskContext from './useTaskContext'\nimport useUserProfileForInjectables from './useUserProfileForInjectables'\n\nexport default function useFormElementOptions<T>({\n element,\n value,\n onChange,\n conditionallyShownOptionsElement,\n onFilter,\n onUpdateFormElements,\n}: {\n element: FormTypes.FormElementWithOptions\n value: unknown | undefined\n onChange: FormElementValueChangeHandler<T>\n conditionallyShownOptionsElement:\n | FormElementConditionallyShownElement\n | undefined\n onFilter?: (choiceElementOption: FormTypes.ChoiceElementOption) => boolean\n onUpdateFormElements: UpdateFormElementsHandler\n}) {\n const taskContext = useTaskContext()\n const userProfileForInjectables = useUserProfileForInjectables()\n\n const { formSubmissionModel, elements, parent } = useFormSubmissionModel()\n const conditionallyShownOptions = conditionallyShownOptionsElement?.options\n //options that are shown due to conditional logic\n const shownOptions = React.useMemo<FormTypes.ChoiceElementOption[]>(() => {\n if (!element.options) {\n return []\n }\n if (!conditionallyShownOptions && !onFilter) {\n return element.options\n }\n return element.options.filter((option) => {\n return (\n !conditionallyShownOptions ||\n conditionallyShownOptions.some(({ id }) => id === option.id)\n )\n })\n }, [conditionallyShownOptions, element.options, onFilter])\n\n //\n const withInjectedOptions = React.useMemo(() => {\n return shownOptions.reduce<FormTypes.ChoiceElementOption[]>(\n (memo, option) => {\n const newOptions = processInjectableOption({\n option,\n submission: formSubmissionModel,\n formElements: elements,\n contextSubmission: parent?.formSubmissionModel || {},\n contextElements: parent?.elements || [],\n taskContext,\n userProfile: userProfileForInjectables,\n })\n memo.push(...newOptions)\n\n return memo\n },\n [],\n )\n }, [\n elements,\n formSubmissionModel,\n parent,\n shownOptions,\n taskContext,\n userProfileForInjectables,\n ])\n\n //options that are shown based on conditional logic, attributes, and user input\n const filteredOptions = React.useMemo<FormTypes.ChoiceElementOption[]>(() => {\n const reducedOptions = withInjectedOptions.filter(\n (option) => !onFilter || (onFilter(option) && !option.displayAlways),\n )\n if (element.type === 'autocomplete') {\n const alwaysShownOptions = withInjectedOptions.filter(\n (option) => option.displayAlways,\n )\n reducedOptions.push(...alwaysShownOptions)\n }\n return reducedOptions\n }, [withInjectedOptions, element.type, onFilter])\n\n React.useEffect(() => {\n if (\n !element.options ||\n conditionallyShownOptionsElement?.dependencyIsLoading\n ) {\n return\n }\n\n if (\n typeof value === 'string' &&\n !filteredOptions.some((option) => value === option.value)\n ) {\n onChange(element, {\n value: undefined,\n })\n return\n }\n\n if (Array.isArray(value)) {\n const newValue = value.filter((selectedValue) =>\n filteredOptions.some((option) => selectedValue === option.value),\n )\n if (newValue.length !== value.length) {\n const newValueArray = newValue.length ? newValue : undefined\n onChange(element, {\n value: newValueArray as T | undefined,\n })\n }\n }\n }, [\n element,\n onChange,\n value,\n conditionallyShownOptionsElement?.dependencyIsLoading,\n filteredOptions,\n ])\n\n useLoadDynamicOptionsEffect(element, onUpdateFormElements)\n\n return filteredOptions\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oneblink/apps-react",
|
|
3
3
|
"description": "Helper functions for OneBlink apps in ReactJS.",
|
|
4
|
-
"version": "10.0.
|
|
4
|
+
"version": "10.0.1-alpha.1",
|
|
5
5
|
"author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/oneblink/apps-react/issues"
|