@spiffcommerce/core 21.1.2 → 21.2.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +46 -27
- package/dist/index.umd.cjs +9 -9
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [21.2.0] - 15-03-2024
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `FileUploadGlobalPropertyHandle`:
|
|
13
|
+
- `hasImage(): boolean`: Returns a boolean value indicating if the associated state has an image.
|
|
14
|
+
- `getImage(): Promise<Asset | undefined>`: Retrieves the current image from the server.
|
|
15
|
+
|
|
8
16
|
## [21.1.1] - 15-03-2024
|
|
9
17
|
|
|
10
18
|
### Fixed
|
package/dist/index.d.ts
CHANGED
|
@@ -1666,6 +1666,7 @@ declare abstract class GlobalPropertyHandle {
|
|
|
1666
1666
|
* @param targetExperiences Optionally filter the steps to only those in the given experiences.
|
|
1667
1667
|
*/
|
|
1668
1668
|
protected getSharedSteps(targetExperiences?: WorkflowExperience[]): StepHandle<_spiffcommerce_papyrus.AnyStepData>[];
|
|
1669
|
+
protected getStateValue(): string | undefined;
|
|
1669
1670
|
}
|
|
1670
1671
|
/**
|
|
1671
1672
|
* A file upload global property allows for setting a frame image against all shared steps.
|
|
@@ -1678,6 +1679,15 @@ declare class FileUploadGlobalPropertyHandle extends GlobalPropertyHandle {
|
|
|
1678
1679
|
* @returns A promise resolving when all affected steps have been updated.
|
|
1679
1680
|
*/
|
|
1680
1681
|
selectImage(asset: Asset): Promise<void>;
|
|
1682
|
+
/**
|
|
1683
|
+
* Returns `true` if the state has an image assigned, otherwise `false`.
|
|
1684
|
+
*/
|
|
1685
|
+
hasImage(): boolean;
|
|
1686
|
+
/**
|
|
1687
|
+
* Retrieves the current image selection, if one exists.
|
|
1688
|
+
* @returns A promise that resolves with an `Asset` object if one is assigned to the state, otherwise `undefined`.
|
|
1689
|
+
*/
|
|
1690
|
+
getImage(): Promise<Asset | undefined>;
|
|
1681
1691
|
applyGlobalState(targetExperiences?: WorkflowExperience[]): Promise<void>;
|
|
1682
1692
|
private applyImageSelection;
|
|
1683
1693
|
}
|
package/dist/index.js
CHANGED
|
@@ -460,7 +460,7 @@ class $t {
|
|
|
460
460
|
name: e.name,
|
|
461
461
|
blob: new Blob([e], { type: e.type })
|
|
462
462
|
};
|
|
463
|
-
return await
|
|
463
|
+
return await T.uploadAssetWithProgress(a, n, A, !0);
|
|
464
464
|
}
|
|
465
465
|
}
|
|
466
466
|
removePersistedAsset(e) {
|
|
@@ -533,7 +533,7 @@ class be {
|
|
|
533
533
|
return e ? Array.from(e.entries()).map((A) => ({ assetKey: A[0], src: A[1] })) : [];
|
|
534
534
|
}
|
|
535
535
|
}
|
|
536
|
-
const
|
|
536
|
+
const T = new $t();
|
|
537
537
|
class _t {
|
|
538
538
|
constructor() {
|
|
539
539
|
this.cache = {}, this.disabled = !1;
|
|
@@ -625,8 +625,8 @@ const ge = new _t(), KA = F`
|
|
|
625
625
|
});
|
|
626
626
|
return e.data.options.forEach((A) => {
|
|
627
627
|
var t, n;
|
|
628
|
-
(t = A.defaultVariant) != null && t.asset &&
|
|
629
|
-
a.asset &&
|
|
628
|
+
(t = A.defaultVariant) != null && t.asset && T.cacheAsset(A.defaultVariant.asset), A.colorProfile && T.cacheAsset(A.colorProfile), (n = A.variants) == null || n.forEach((a) => {
|
|
629
|
+
a.asset && T.cacheAsset(a.asset), a.displayImage && T.cacheAsset(a.displayImage), a.thumbnail && T.cacheAsset(a.thumbnail), a.material && T.cacheMaterial(a.material);
|
|
630
630
|
});
|
|
631
631
|
}), e.data.options;
|
|
632
632
|
}, tn = async (c, e) => (await e).find((t) => t.id === c), nn = async (c) => {
|
|
@@ -1852,11 +1852,11 @@ class Mn {
|
|
|
1852
1852
|
new qA(
|
|
1853
1853
|
async () => {
|
|
1854
1854
|
var o;
|
|
1855
|
-
const i = (o = (await
|
|
1855
|
+
const i = (o = (await T.getLocalOrFromServer(A.key || "")).versions) == null ? void 0 : o.find((r) => r.name === "svg");
|
|
1856
1856
|
return i ? (await fetch(i.link)).status === 200 : !1;
|
|
1857
1857
|
},
|
|
1858
1858
|
() => {
|
|
1859
|
-
|
|
1859
|
+
T.getLocalOrFromServer(A.key || "").then((a) => {
|
|
1860
1860
|
this.loadPatternFromAsset(a, e, t);
|
|
1861
1861
|
});
|
|
1862
1862
|
},
|
|
@@ -3224,8 +3224,8 @@ class kn {
|
|
|
3224
3224
|
let Q;
|
|
3225
3225
|
if (E && E.variants) {
|
|
3226
3226
|
const N = E.variants.find((H) => {
|
|
3227
|
-
var
|
|
3228
|
-
return H.id === ((
|
|
3227
|
+
var O;
|
|
3228
|
+
return H.id === ((O = E.defaultVariant) == null ? void 0 : O.id);
|
|
3229
3229
|
}) || E.variants[0];
|
|
3230
3230
|
Q = this.createTextFillSpotColor(E, N), i.updateStorage(e, {
|
|
3231
3231
|
colorProfileAssetKey: (h = E.colorProfile) == null ? void 0 : h.key
|
|
@@ -6280,7 +6280,7 @@ const ot = F`
|
|
|
6280
6280
|
}, ct = async (c, e, A, t, n, a, i, s, o, r) => {
|
|
6281
6281
|
var M;
|
|
6282
6282
|
await (async () => {
|
|
6283
|
-
var
|
|
6283
|
+
var O;
|
|
6284
6284
|
if (r !== void 0)
|
|
6285
6285
|
return r;
|
|
6286
6286
|
await c.outstandingRequestsPromise();
|
|
@@ -6292,7 +6292,7 @@ const ot = F`
|
|
|
6292
6292
|
context: {
|
|
6293
6293
|
transactionOwnerId: S
|
|
6294
6294
|
}
|
|
6295
|
-
}), H = (
|
|
6295
|
+
}), H = (O = N.data) == null ? void 0 : O.transactions[0].workflowState;
|
|
6296
6296
|
return N.errors ? (N.errors.forEach((b) => {
|
|
6297
6297
|
N.errors && console.log("Server Error:", b.message);
|
|
6298
6298
|
}), null) : H ?? null;
|
|
@@ -6302,11 +6302,11 @@ const ot = F`
|
|
|
6302
6302
|
let Y = 0;
|
|
6303
6303
|
if (Object.keys(a).length > 0)
|
|
6304
6304
|
for (const N of Object.keys(a)) {
|
|
6305
|
-
const H = a[N],
|
|
6305
|
+
const H = a[N], O = e.steps.find((b) => b.stepName === N);
|
|
6306
6306
|
for (let b = 0; b < H.selections.length; ++b) {
|
|
6307
6307
|
const V = H.selections[b];
|
|
6308
|
-
if (
|
|
6309
|
-
const ke =
|
|
6308
|
+
if (O && (!y || O.option && (O.option.variants || []).length > 1 && !O.data.hideSelectionInCart && !O.data.hideSelectionsInCart)) {
|
|
6309
|
+
const ke = O.stepTitle;
|
|
6310
6310
|
S[ke] ? S[ke].push({
|
|
6311
6311
|
id: V.id || "",
|
|
6312
6312
|
name: V.name,
|
|
@@ -7932,7 +7932,7 @@ class gA {
|
|
|
7932
7932
|
* @param targetExperiences Optionally filter the steps to only those in the given experiences.
|
|
7933
7933
|
*/
|
|
7934
7934
|
getSharedSteps(e) {
|
|
7935
|
-
|
|
7935
|
+
const A = e ?? this.bundle.getWorkflowExperiences(), t = A.flatMap(
|
|
7936
7936
|
(n) => n.getSteps().filter((a) => {
|
|
7937
7937
|
var i;
|
|
7938
7938
|
return (i = a.getRaw().globalPropertyAspectConfigurations) == null ? void 0 : i.some(
|
|
@@ -7943,6 +7943,10 @@ class gA {
|
|
|
7943
7943
|
);
|
|
7944
7944
|
})
|
|
7945
7945
|
);
|
|
7946
|
+
return console.log(`getting shared steps for ${A.length} - found ${t.length}`, t), t;
|
|
7947
|
+
}
|
|
7948
|
+
getStateValue() {
|
|
7949
|
+
return this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);
|
|
7946
7950
|
}
|
|
7947
7951
|
}
|
|
7948
7952
|
class ja extends gA {
|
|
@@ -7960,11 +7964,26 @@ class ja extends gA {
|
|
|
7960
7964
|
this.applyImageSelection(e)
|
|
7961
7965
|
]);
|
|
7962
7966
|
}
|
|
7967
|
+
/**
|
|
7968
|
+
* Returns `true` if the state has an image assigned, otherwise `false`.
|
|
7969
|
+
*/
|
|
7970
|
+
hasImage() {
|
|
7971
|
+
return !!this.getStateValue();
|
|
7972
|
+
}
|
|
7973
|
+
/**
|
|
7974
|
+
* Retrieves the current image selection, if one exists.
|
|
7975
|
+
* @returns A promise that resolves with an `Asset` object if one is assigned to the state, otherwise `undefined`.
|
|
7976
|
+
*/
|
|
7977
|
+
async getImage() {
|
|
7978
|
+
const e = this.getStateValue();
|
|
7979
|
+
if (e)
|
|
7980
|
+
return T.getLocalOrFromServer(e);
|
|
7981
|
+
}
|
|
7963
7982
|
async applyGlobalState(e) {
|
|
7964
|
-
const A = this.
|
|
7983
|
+
const A = this.getStateValue();
|
|
7965
7984
|
if (!A)
|
|
7966
7985
|
return Promise.resolve();
|
|
7967
|
-
const t = await
|
|
7986
|
+
const t = await T.getLocalOrFromServer(A);
|
|
7968
7987
|
return t ? this.applyImageSelection(t, e) : Promise.resolve();
|
|
7969
7988
|
}
|
|
7970
7989
|
async applyImageSelection(e, A) {
|
|
@@ -7980,7 +7999,7 @@ class Va extends gA {
|
|
|
7980
7999
|
* Gets the current text
|
|
7981
8000
|
*/
|
|
7982
8001
|
getText() {
|
|
7983
|
-
const e = this.
|
|
8002
|
+
const e = this.getStateValue();
|
|
7984
8003
|
return e || "";
|
|
7985
8004
|
}
|
|
7986
8005
|
/**
|
|
@@ -7993,7 +8012,7 @@ class Va extends gA {
|
|
|
7993
8012
|
]);
|
|
7994
8013
|
}
|
|
7995
8014
|
async applyGlobalState(e) {
|
|
7996
|
-
const A = this.
|
|
8015
|
+
const A = this.getStateValue();
|
|
7997
8016
|
if (!A)
|
|
7998
8017
|
return Promise.resolve();
|
|
7999
8018
|
await this.applyTextSelection(A, e);
|
|
@@ -8016,7 +8035,7 @@ class Bt extends gA {
|
|
|
8016
8035
|
var A, t;
|
|
8017
8036
|
if (!this.optionResource)
|
|
8018
8037
|
return;
|
|
8019
|
-
const e = this.
|
|
8038
|
+
const e = this.getStateValue();
|
|
8020
8039
|
if (e) {
|
|
8021
8040
|
const n = (t = this.optionResource.variants) == null ? void 0 : t.find((a) => a.id === e);
|
|
8022
8041
|
return n ? new X(n) : void 0;
|
|
@@ -8056,7 +8075,7 @@ class Bt extends gA {
|
|
|
8056
8075
|
}
|
|
8057
8076
|
async applyGlobalState(e) {
|
|
8058
8077
|
var n, a;
|
|
8059
|
-
const A = this.
|
|
8078
|
+
const A = this.getStateValue();
|
|
8060
8079
|
if (!A)
|
|
8061
8080
|
return Promise.resolve();
|
|
8062
8081
|
const t = (a = (n = this.optionResource) == null ? void 0 : n.variants) == null ? void 0 : a.find((i) => i.id === A);
|
|
@@ -9821,8 +9840,8 @@ const oi = F`
|
|
|
9821
9840
|
return t.forEach((a) => {
|
|
9822
9841
|
a.steps.forEach((i) => {
|
|
9823
9842
|
var s, o, r;
|
|
9824
|
-
delete i.data.__typename, (s = i.option) != null && s.id && ((o = i.option.defaultVariant) != null && o.asset &&
|
|
9825
|
-
g.asset &&
|
|
9843
|
+
delete i.data.__typename, (s = i.option) != null && s.id && ((o = i.option.defaultVariant) != null && o.asset && T.cacheAsset(i.option.defaultVariant.asset), i.option.colorProfile && T.cacheAsset(i.option.colorProfile), (r = i.option.variants) == null || r.forEach((g) => {
|
|
9844
|
+
g.asset && T.cacheAsset(g.asset), g.displayImage && T.cacheAsset(g.displayImage), g.thumbnail && T.cacheAsset(g.thumbnail), g.material && T.cacheMaterial(g.material);
|
|
9826
9845
|
}), ge.set({ id: i.option.id }, Promise.resolve(i.option)));
|
|
9827
9846
|
});
|
|
9828
9847
|
}), t;
|
|
@@ -9874,7 +9893,7 @@ class fi {
|
|
|
9874
9893
|
* and the Spiff Commerce platform.
|
|
9875
9894
|
*/
|
|
9876
9895
|
getAssetManager() {
|
|
9877
|
-
return
|
|
9896
|
+
return T;
|
|
9878
9897
|
}
|
|
9879
9898
|
getCurrencyCode() {
|
|
9880
9899
|
if (this.currencyCode === void 0)
|
|
@@ -10307,7 +10326,7 @@ class fi {
|
|
|
10307
10326
|
return {
|
|
10308
10327
|
transaction: Y,
|
|
10309
10328
|
workflowId: Y.workflowId,
|
|
10310
|
-
readOnly: ((H = m.find((
|
|
10329
|
+
readOnly: ((H = m.find((O) => O.option.transactionId === Y.id)) == null ? void 0 : H.option.readOnly) ?? !1,
|
|
10311
10330
|
index: m[N].index
|
|
10312
10331
|
};
|
|
10313
10332
|
});
|
|
@@ -10345,14 +10364,14 @@ class fi {
|
|
|
10345
10364
|
...r.map(n),
|
|
10346
10365
|
...g.map(a)
|
|
10347
10366
|
])).flat(), l = [...new Set(B.map((m) => m.workflowId))], d = await wt(l, A), w = new Map(d.map((m) => [m.id, m])), h = x.getMap("transactionOwnerIds") || /* @__PURE__ */ new Map(), E = B.map(async (m) => {
|
|
10348
|
-
var
|
|
10367
|
+
var O;
|
|
10349
10368
|
const { transaction: I, workflowId: p, readOnly: M, index: y } = m, S = w.get(p), Y = e[y];
|
|
10350
10369
|
!h.get(I.id) && I.transactionOwnerId && h.set(I.id, I.transactionOwnerId);
|
|
10351
10370
|
const N = h.get(I.id) || void 0, H = {
|
|
10352
10371
|
product: I.product,
|
|
10353
10372
|
transaction: I,
|
|
10354
10373
|
layouts: [],
|
|
10355
|
-
singleVariantsRenderable: (
|
|
10374
|
+
singleVariantsRenderable: (O = Y == null ? void 0 : Y.workflowConfiguration) == null ? void 0 : O.singleVariantsRenderable,
|
|
10356
10375
|
stateMutationFunc: M ? async () => {
|
|
10357
10376
|
throw new k("State mutation is forbidden in read only mode!");
|
|
10358
10377
|
} : async (b) => this.updateTransactionState({ ...b, context: { transactionOwnerId: N } }),
|
|
@@ -10856,7 +10875,7 @@ export {
|
|
|
10856
10875
|
X as Variant,
|
|
10857
10876
|
Ea as WorkflowExperienceEventType,
|
|
10858
10877
|
he as WorkflowExperienceImpl,
|
|
10859
|
-
|
|
10878
|
+
T as assetService,
|
|
10860
10879
|
la as createDesign,
|
|
10861
10880
|
hs as dataUrlFromExternalUrl,
|
|
10862
10881
|
Te as designService,
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(Q,M){typeof exports=="object"&&typeof module<"u"?M(exports,require("@apollo/client/core"),require("@spiffcommerce/papyrus"),require("@apollo/client/link/context"),require("@apollo/client/link/error"),require("pith"),require("lodash.debounce"),require("lodash.isequal"),require("lodash.clonedeep"),require("qrcode"),require("unicode-default-word-boundary"),require("svg-path-bbox"),require("lodash.chunk")):typeof define=="function"&&define.amd?define(["exports","@apollo/client/core","@spiffcommerce/papyrus","@apollo/client/link/context","@apollo/client/link/error","pith","lodash.debounce","lodash.isequal","lodash.clonedeep","qrcode","unicode-default-word-boundary","svg-path-bbox","lodash.chunk"],M):(Q=typeof globalThis<"u"?globalThis:Q||self,M(Q.Core={},Q.core,Q.papyrus,Q.context,Q.error,Q.pith,Q.debounce,Q.isEqual,Q.cloneDeep,Q.qrcode,Q.unicodeDefaultWordBoundary,Q.svgPathBbox,Q.chunk))})(this,function(Q,M,g,cA,gA,et,tt,At,Ee,nt,Ye,Pe,at){"use strict";class it extends Error{constructor(e){super(e),this.name=this.constructor.name}}class ne extends it{constructor(e){super(`ConfigurationError - ${e}`)}}class ae extends ne{constructor(e){super(`Option not Configured: ${e.stepTitle}`),this.optionId=(e==null?void 0:e.optionId)||"N/A"}}class
|
|
1
|
+
(function(Q,M){typeof exports=="object"&&typeof module<"u"?M(exports,require("@apollo/client/core"),require("@spiffcommerce/papyrus"),require("@apollo/client/link/context"),require("@apollo/client/link/error"),require("pith"),require("lodash.debounce"),require("lodash.isequal"),require("lodash.clonedeep"),require("qrcode"),require("unicode-default-word-boundary"),require("svg-path-bbox"),require("lodash.chunk")):typeof define=="function"&&define.amd?define(["exports","@apollo/client/core","@spiffcommerce/papyrus","@apollo/client/link/context","@apollo/client/link/error","pith","lodash.debounce","lodash.isequal","lodash.clonedeep","qrcode","unicode-default-word-boundary","svg-path-bbox","lodash.chunk"],M):(Q=typeof globalThis<"u"?globalThis:Q||self,M(Q.Core={},Q.core,Q.papyrus,Q.context,Q.error,Q.pith,Q.debounce,Q.isEqual,Q.cloneDeep,Q.qrcode,Q.unicodeDefaultWordBoundary,Q.svgPathBbox,Q.chunk))})(this,function(Q,M,g,cA,gA,et,tt,At,Ee,nt,Ye,Pe,at){"use strict";class it extends Error{constructor(e){super(e),this.name=this.constructor.name}}class ne extends it{constructor(e){super(`ConfigurationError - ${e}`)}}class ae extends ne{constructor(e){super(`Option not Configured: ${e.stepTitle}`),this.optionId=(e==null?void 0:e.optionId)||"N/A"}}class J extends ne{constructor(e){super(`Panel not Found: ${e.panelId}`),this.panelId=(e==null?void 0:e.panelId)||"N/A"}}class V extends ne{constructor(e){super(`Asset not found for variant: ${e.name}`),this.variant=e}}class X extends ne{constructor(e){super(`Resource not found for asset: ${e.name}`),this.asset=e}}class ie extends ne{constructor(e,t){super(`Workflow Misconfiguration: ${e.stepName} - ${t}`),this.step=e}}class he extends it{constructor(e){super(`ImplementationError - ${e}`)}}class v extends he{constructor(e){super(`Unhandled Behavior Encountered: ${e}`)}}class q extends he{constructor(e){super(`Parsing Error: ${e}`)}}class G extends he{constructor(e){super(`Client Error: ${e}`)}}class Ce extends he{constructor(e){super(`Resource Generation Failed: ${e}`)}}class lA{get(e){return localStorage.getItem(e)||void 0}set(e,t){localStorage.setItem(e,t)}remove(e){localStorage.removeItem(e)}getMap(e){const t=this.get(e);if(t)return new Map(JSON.parse(t))}setMap(e,t){const A=JSON.stringify([...t.entries()]);this.set(e,A)}}class ot{constructor(){this.storage=new Map}get(e){return this.storage.get(e)||void 0}set(e,t){this.storage.set(e,t)}remove(e){this.storage.delete(e)}getMap(e){const t=this.get(e);if(t)return new Map(JSON.parse(t))}setMap(e,t){const A=JSON.stringify([...t.entries()]);this.set(e,A)}}const P=(()=>{try{return localStorage?new lA:new ot}catch{return console.warn("Local storage was unavilable due to browser security settings. Using in-memory storage instead."),new ot}})();class BA{constructor(){this.defaultServerUrl="https://api.spiff.com.au",this.defaultServicesApiUrl="https://services.spiff.com.au",this.defaultHubUrl="https://hub.spiff.com.au",this.serverUrl=this.defaultServerUrl,this.servicesApiUrl=this.defaultServicesApiUrl,this.hubUrl=this.defaultHubUrl,this.serverUrlCallbacks=[]}getServerUrl(){return this.serverUrl}getServicesApiUrl(){return this.servicesApiUrl}getHubUrl(){return this.hubUrl}setServerUrl(e){this.serverUrl=e,this.serverUrlCallbacks.forEach(t=>t())}setServicesApiUrl(e){this.servicesApiUrl=e}setHubUrl(e){this.hubUrl=e}addServerUrlCallback(e){this.serverUrlCallbacks.push(e)}}const W=new BA;let st;const rt=c=>{st=c};let xe;const dA=c=>{xe=c},wA=()=>xe,EA=()=>new Promise(c=>{const e=W.getHubUrl(),t=A=>{A.origin===e&&(window.removeEventListener("message",t),c(A.data))};window.parent!==window&&(window.addEventListener("message",t,!1),window.parent.postMessage("ready",e))}),hA=async()=>{const c={applicationKey:xe,customerToken:st};return typeof window<"u"&&(window.location.href.includes("/workflows/product/")||window.location.href.includes("hub=true"))?{...await EA(),...c}:c};class CA{constructor(){this.shadowGraphqlClient=this.constructShadowGraphqlClient(),W.addServerUrlCallback(()=>{this.shadowGraphqlClient=this.constructShadowGraphqlClient()})}getShadowGraphqlClient(){return this.shadowGraphqlClient}constructShadowGraphqlClient(){const e=M.createHttpLink({uri:`${W.getServerUrl()}/graphql`,fetch:g.fetch}),t=cA.setContext(async(i,o)=>{const{headers:s}=o,r=s||{},l=await hA(),d=o.bearer??l.bearer,B=o.partnerId??l.partnerId,w=o.activeIntegration??l.activeIntegration,E=o.transactionOwnerId,C=o.customerToken??l.customerToken,h=o.applicationKey??l.applicationKey,m=o.bundleOwnerId;try{if(window&&window.__SENTRY__){const u=window.__SENTRY__.hub;if(u){const F=u.traceHeaders();Object.entries(F).forEach(([I,f])=>{r[I]=f})}}}catch{}return d&&(r.Authorization=`Bearer ${d}`),B&&(r.partnerId=B),w&&(r.activeIntegration=w),E&&(r.transactionOwnerId=E),C&&(r.customerToken=C),h&&(r["X-Application-Key"]=h),m&&(r.bundleOwnerId=m),{headers:r}}),A=gA.onError(({operation:i,graphQLErrors:o,networkError:s})=>{const r=o||[];s&&console.log("GraphQL Network error"),r.forEach(()=>console.log("GraphQL Error: "+i.operationName))});function n(){return{read(i=null){return i},merge(i,o){return o||i||null}}}const a=new M.InMemoryCache({addTypename:!1,typePolicies:{Transaction:{fields:{transactionOwnerId:n(),customLogoLink:n(),workflowFooterLogoLink:n(),workflowState:n(),externalDesignProductId:n(),externalDesignProductVariantId:n(),externalCartProductId:n(),externalCartProductVariantId:n(),lastSyncedAt:n(),quantity:n(),lineItem:n()}},WorkflowProduct:{fields:{isPresent:n()}},Product:{fields:{imageUrl:n(),overlayImageUrl:n(),preloadImageUrl:n(),weight:n(),conversionConfiguration:n()}}}});return new M.ApolloClient({link:M.from([A,t,e]),cache:a,name:"Core"})}}const N=new CA,QA=M.gql`
|
|
2
2
|
fragment AssetMetadataFields on Asset {
|
|
3
3
|
metadata {
|
|
4
4
|
key
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
|
-
`,ct=async c=>(await N.getShadowGraphqlClient().query({query:uA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{keys:c}})).data.assets,fA=async c=>(await N.getShadowGraphqlClient().query({query:mA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}})).data.materials,DA=async(c,e,t,A,n)=>{var i;return(i=(await N.getShadowGraphqlClient().mutate({mutation:IA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:c,type:e,mimeType:t,anonymous:A,temporary:n}})).data)==null?void 0:i.assetCreate};class pA{constructor(){this.cache=new Map,this.materialCache=new Map,this.loadImageAsFileInfo=async e=>{const t=await e.arrayBuffer(),A=await g.getAttributesFromArrayBuffer(t),n=(a,i)=>{const o=atob(a.split(",")[1]),s=[];for(let r=0;r<o.length;r++)s.push(o.charCodeAt(r));return new Blob([new Uint8Array(s)],{type:i})};return{name:e.name.substring(e.name.lastIndexOf("/")+1),blob:n(A.dataUrl,e.type)}}}async getLocalOrFromServer(e){if(this.cache.has(e)){const n=this.cache.get(e);if(!n)throw new v("Failed to get asset from cache!");return n}const A=(async()=>(await ct([e]))[0])();return this.cache.set(e,A),A}cacheAsset(e){if(!e.key)throw new v("Asset has no key!");this.cache.has(e.key)||this.cache.set(e.key,Promise.resolve(e))}cacheMaterial(e){if(!e.id)throw new v("Material has no id!");this.materialCache.has(e.id)||this.materialCache.set(e.id,Promise.resolve(e))}async getMaterialLocalOrFromServer(e){if(this.materialCache.has(e))return this.materialCache.get(e);const A=(async()=>(await fA([e]))[0])();return this.materialCache.set(e,A),A}async uploadAssetWithProgress(e,t,A,n,a){const i=await this.dispatchCreateAssetRequest(e,t,n,a);if(!i)throw new Error("Failed to create asset.");return await new Promise((o,s)=>{const r=new XMLHttpRequest;r.open("PUT",i.assetResponse.uploadUrl,!0),r.setRequestHeader("Content-Type",i.mimeType),r.setRequestHeader("Cache-Control","public,max-age=31536000,immutable"),r.upload.onprogress=l=>{l.lengthComputable&&A(l.loaded*100/l.total)},r.onload=()=>{const l=i.assetResponse.asset;He.add(i.assetResponse.asset),o(l)},r.onerror=s,r.send(e.blob)}),i.assetResponse.asset}async uploadFile(e,t){const A=!(e.type==="image/svg+xml"||e.type==="application/pdf"),n=A?g.AssetType.Image:g.AssetType.Illustration;if(A){const a=await this.loadImageAsFileInfo(e);return await this.uploadAssetWithProgress(a,n,t,!0)}else{const a={name:e.name,blob:new Blob([e],{type:e.type})};return await
|
|
98
|
+
`,ct=async c=>(await N.getShadowGraphqlClient().query({query:uA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{keys:c}})).data.assets,fA=async c=>(await N.getShadowGraphqlClient().query({query:mA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}})).data.materials,DA=async(c,e,t,A,n)=>{var i;return(i=(await N.getShadowGraphqlClient().mutate({mutation:IA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:c,type:e,mimeType:t,anonymous:A,temporary:n}})).data)==null?void 0:i.assetCreate};class pA{constructor(){this.cache=new Map,this.materialCache=new Map,this.loadImageAsFileInfo=async e=>{const t=await e.arrayBuffer(),A=await g.getAttributesFromArrayBuffer(t),n=(a,i)=>{const o=atob(a.split(",")[1]),s=[];for(let r=0;r<o.length;r++)s.push(o.charCodeAt(r));return new Blob([new Uint8Array(s)],{type:i})};return{name:e.name.substring(e.name.lastIndexOf("/")+1),blob:n(A.dataUrl,e.type)}}}async getLocalOrFromServer(e){if(this.cache.has(e)){const n=this.cache.get(e);if(!n)throw new v("Failed to get asset from cache!");return n}const A=(async()=>(await ct([e]))[0])();return this.cache.set(e,A),A}cacheAsset(e){if(!e.key)throw new v("Asset has no key!");this.cache.has(e.key)||this.cache.set(e.key,Promise.resolve(e))}cacheMaterial(e){if(!e.id)throw new v("Material has no id!");this.materialCache.has(e.id)||this.materialCache.set(e.id,Promise.resolve(e))}async getMaterialLocalOrFromServer(e){if(this.materialCache.has(e))return this.materialCache.get(e);const A=(async()=>(await fA([e]))[0])();return this.materialCache.set(e,A),A}async uploadAssetWithProgress(e,t,A,n,a){const i=await this.dispatchCreateAssetRequest(e,t,n,a);if(!i)throw new Error("Failed to create asset.");return await new Promise((o,s)=>{const r=new XMLHttpRequest;r.open("PUT",i.assetResponse.uploadUrl,!0),r.setRequestHeader("Content-Type",i.mimeType),r.setRequestHeader("Cache-Control","public,max-age=31536000,immutable"),r.upload.onprogress=l=>{l.lengthComputable&&A(l.loaded*100/l.total)},r.onload=()=>{const l=i.assetResponse.asset;He.add(i.assetResponse.asset),o(l)},r.onerror=s,r.send(e.blob)}),i.assetResponse.asset}async uploadFile(e,t){const A=!(e.type==="image/svg+xml"||e.type==="application/pdf"),n=A?g.AssetType.Image:g.AssetType.Illustration;if(A){const a=await this.loadImageAsFileInfo(e);return await this.uploadAssetWithProgress(a,n,t,!0)}else{const a={name:e.name,blob:new Blob([e],{type:e.type})};return await k.uploadAssetWithProgress(a,n,t,!0)}}removePersistedAsset(e){He.remove(e)}getPersistedAssets(){return He.list()}async dispatchCreateAssetRequest(e,t,A,n){const a=e.blob.type?e.blob.type:this.guessMIME(e.name),i=await DA(e.name,t,a,A,n);if(i)return{assetResponse:i,mimeType:a}}guessMIME(e){const t=e.split(".").pop();switch(t){case"glb":return"model/gltf-binary";case"ttf":return"font/ttf";case"mkv":return"video/x-matroska";default:throw new v("Unexpected mimetype: "+t)}}}const oe="persistentAssets";class He{static add(e){if(!e.fileLink){console.error("Failed to find cdn link on asset, cannot persist!");return}const t=new Map;t.set(e.key||"",e.fileLink);const A=P.getMap(oe);A&&A.forEach((n,a)=>{t.set(a,n)}),P.setMap(oe,t)}static remove(e){const t=P.getMap(oe);if(!t)return;const A=Array.from(t.entries()).find(n=>n[0]===e);A&&(t.delete(A[0]),P.setMap(oe,t))}static list(){const e=P.getMap(oe);return e?Array.from(e.entries()).map(t=>({assetKey:t[0],src:t[1]})):[]}}const k=new pA;class FA{constructor(){this.cache={},this.disabled=!1}get(e){if(this.disabled)return;const t=JSON.stringify(e);return this.cache[t]}set(e,t){if(this.disabled)return t;const A=JSON.stringify(e);return this.cache[A]=t,t}disable(e){this.disabled=e}}const Z=new FA,gt=M.gql`
|
|
99
99
|
fragment OptionFields on Option {
|
|
100
100
|
id
|
|
101
101
|
name
|
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
...OptionFields
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
|
-
`,SA=async c=>{const e=await N.getShadowGraphqlClient().query({query:MA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}});return e.data.options.forEach(t=>{var A,n;(A=t.defaultVariant)!=null&&A.asset&&
|
|
147
|
+
`,SA=async c=>{const e=await N.getShadowGraphqlClient().query({query:MA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}});return e.data.options.forEach(t=>{var A,n;(A=t.defaultVariant)!=null&&A.asset&&k.cacheAsset(t.defaultVariant.asset),t.colorProfile&&k.cacheAsset(t.colorProfile),(n=t.variants)==null||n.forEach(a=>{a.asset&&k.cacheAsset(a.asset),a.displayImage&&k.cacheAsset(a.displayImage),a.thumbnail&&k.cacheAsset(a.thumbnail),a.material&&k.cacheMaterial(a.material)})}),e.data.options},yA=async(c,e)=>(await e).find(A=>A.id===c),YA=async c=>{const e=c.map(i=>Z.get({id:i})),t=c.filter((i,o)=>e[o]===void 0);if(t.length===0)return Promise.all(e);const A=SA(t),n=t.map(i=>Z.set({id:i},yA(i,A))),a=e.filter(i=>i!==void 0);return await Promise.all(a.concat(n))};class PA{constructor(){this.getDisplayImageSource=e=>{var t;if(e){const A=(t=e.displayImage)==null?void 0:t.fileLink;if(A)return A}},this.getSelectedVariant=(e,t)=>{var A;if(!(!e||t.length===0))return(A=e.variants)==null?void 0:A.find(n=>n.id===t[0])}}async getOption(e){return(async()=>{const n=(await YA([e]))[0];if(n)return n})()}async getAssetTileImageForVariant(e){var n,a;const t=e.thumbnail;if(t){const i=(n=t.versions)==null?void 0:n.find(s=>s.name==="thumbnail"),o=t.fileLink;return(i==null?void 0:i.link)||o}const A=e.asset;if(A){const i=(a=A.versions)==null?void 0:a.find(s=>s.name==="thumbnail"),o=A.fileLink;return(i==null?void 0:i.link)||o}return e.material?e.material.id:""}getDefaultVariant(e){const t=e.variants;if(t){if(t.length===1)return t[0];if(e.defaultVariant!==void 0)return t.find(A=>{var n;return A.id===((n=e.defaultVariant)==null?void 0:n.id)})}}}const L=new PA;var lt=(c=>(c.Hub="Hub",c.Shopify="Shopify",c))(lt||{}),Bt=(c=>(c[c.Orbit=0]="Orbit",c[c.Pan=1]="Pan",c))(Bt||{}),dt=(c=>(c.Manual="Manual",c.OnStart="OnStart",c.OnQuit="OnQuit",c.OnEnd="OnEnd",c))(dt||{}),wt=(c=>(c.Email="Email",c.FirstName="FirstName",c.LastName="LastName",c.Phone="Phone",c))(wt||{}),se=(c=>(c.Owner="Owner",c.Approver="Approver",c.Editor="Editor",c.Viewer="Viewer",c))(se||{});const $=M.gql`
|
|
148
148
|
fragment AdditionalIntegrationProductFields on IntegrationProduct {
|
|
149
149
|
id
|
|
150
150
|
product {
|
|
@@ -607,7 +607,7 @@
|
|
|
607
607
|
...IntegrationProductFields
|
|
608
608
|
}
|
|
609
609
|
}
|
|
610
|
-
`,re=[g.StepType.SilentIllustration,g.StepType.ProductOverlay],kA=async c=>{const e=[];c.introduction&&e.push({name:"Introduction",title:c.name,renderableSteps:[{type:g.StepType.Introduction,stepName:"Introduction",stepTitle:c.name,helpText:c.introduction,data:{},conditions:[]}],silentSteps:[]});for(const A of c.steps){const n=bA(A.stepName,c.stepGroups);if(!n)e.push({name:A.stepName,title:A.stepTitle,renderableSteps:re.includes(A.type)?[]:[A],silentSteps:re.includes(A.type)?[A]:[]});else{const a=e.find(i=>i.name===n.name);a?re.includes(A.type)?a.silentSteps.push(A):a.renderableSteps.push(A):e.push({name:n.name,title:n.name,renderableSteps:re.includes(A.type)?[]:[A],silentSteps:re.includes(A.type)?[A]:[]})}}const t="workflow.steps.finish.confirmDesign";return e.push({name:"Finish",title:t,renderableSteps:[{type:g.StepType.Finish,stepName:"Finish",stepTitle:t,helpText:"",data:{modelAnimation:c.finalizeStepConfig?c.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:c.finalizeStepConfig?c.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),e},bA=(c,e)=>e.find(t=>t.stepNames.includes(c)),_=(c,e)=>(c.conditions||[]).every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const n=A.selectedVariants;return t.requiredVariantSelections.some(a=>n.find(i=>i.id===a)!==void 0)}return!1}),JA=(c,e)=>{const t={name:c.name,title:c.title,renderableSteps:c.renderableSteps.filter(A=>_(A,e)),silentSteps:c.silentSteps.filter(A=>_(A,e))};return t.silentSteps.length===0&&t.renderableSteps.length===0?null:t},ee=(c,e)=>c.map(t=>JA(t,e)).filter(t=>t!==null),TA=async(c,e,t=!1)=>{var i;const A=ee(c,e),n=[];for(const o of A)for(const s of o.renderableSteps){const r=(((i=s.option)==null?void 0:i.variants)||[]).length;s.silent||(s.type===g.StepType.Model||s.type===g.StepType.Material||s.type===g.StepType.Picture||s.type===g.StepType.Shape?(r>1||t)&&n.push(s.stepName):n.push(s.stepName))}const a=A.filter(o=>o.renderableSteps.filter(r=>n.includes(r.stepName)).length>0);for(const o of a)o.renderableSteps=o.renderableSteps.filter(s=>n.includes(s.stepName));return a};class Re{constructor(){this.timestamp=Date.now()}}class Ue{constructor(e,t=!0){this.queue=[],this.activePromise=void 0,this.queueMaxSize=void 0,this.queueMaxSize=e,this.isEnabled=t}enqueue(e){if(this.queue.push(e),this.queueMaxSize!==void 0&&this.queue.length>this.queueMaxSize){const t=this.queue.length-1;for(let A=0;A<t;++A)this.queue.shift()}this.isEnabled&&(this.activePromise||(this.activePromise=this.dequeue()))}get enabled(){return this.isEnabled}set enabled(e){!this.isEnabled&&e&&!this.activePromise&&(this.activePromise=this.dequeue()),this.isEnabled=e}hasActivePromise(){return!!this.activePromise}getRemainingQueueSize(){return this.queue.length}async finalize(){return this.activePromise?this.activePromise:Promise.resolve()}async dequeue(){const e=this.queue.shift();if(!e){this.activePromise=void 0;return}try{await e.execute()}catch(t){console.log(t)}finally{await this.dequeue()}}}function Qt(c,e,t,A){const n=t.width*c.zoom,a=t.height*c.zoom;if(A){const o=c,s=Math.max(e.width/t.width,e.height/t.height);o.zoom=Math.max(s,c.zoom);const r=t.width*o.zoom,l=t.height*o.zoom;return o.x=me(c.x,e.width-r,0),o.y=me(c.y,e.height-l,0),o}const i=c;return i.x=me(i.x,-n,e.width),i.y=me(i.y,-a,e.height),i}function me(c,e,t){return Math.min(Math.max(c,e),t)}class ut{constructor(e){this.minZoomScale=[.03],this.maxZoomScale=[20],this._debouncedUpdateFrameOffsets=tt(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e,this.thresholdSettings={useThreshold:!1,invertThreshold:!1,threshold:128,thresholdSaturation:.5}}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback(async A=>{if(A){const n=A;if(n.currentFrameSources){let a=!1;for(let i=0;i<n.currentFrameSources.length;i++){const o=n.currentFrameSources[i],s=await g.getFrameData(o);At(s,this.frameData)||(this.frameData||(this.frameData=new Array(n.currentFrameSources.length)),this.frameData[i]=s,a=!0)}a&&(this.onFrameDataChangeListeners.forEach(i=>i(this.frameData)),this.frameData&&this.imageData&&(this.recalculateOffsets(this.imageData),this.updateOffsets(this.offsets),this.recalculateZoomLimits(this.imageData,this.frameData)))}}},t),this.workflowManager=e,this.stepName=t}setTargetElements(e){this.targetElements=e}getFrameData(){return this.frameData}setFrameData(e){if(!e){this.frameData=void 0;return}e.forEach((t,A)=>{const n=g.frameDataCache.get(t);n&&(this.frameData||(this.frameData=new Array(e.length)),this.frameData[A]=n)})}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,A,n){if(this.imageData&&this.offsets&&this.frameData){(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length));const a=this.frameData.map((i,o)=>{const s=(t[o]-this.offsets[o].x)/this.offsets[o].zoom,r=(A[o]-this.offsets[o].y)/this.offsets[o].zoom,l=t[o]-s*e[o],d=A[o]-r*e[o];return{x:l,y:d,zoom:this.imageData.width*e[o]/this.imageData.width}});this.updateOffsets(a,n),this.onZoomChangeListeners.forEach(i=>i(e))}}setPatternData(e){this.imageData=e,e&&this.frameData&&(this.recalculateOffsets(e),this.updateOffsets(this.offsets,void 0,!0)),this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(e,t,A){const n=this.imageData;if(!n||!this.frameData)return;if(this.frameData.length!==e.length)throw new v("Frame data and offsets are not the same length. This is a bug. Please report it.");if(!this.offsets.some((i,o)=>!(e[o].x===i.x&&e[o].y===i.y&&e[o].zoom===i.zoom))&&!A){t&&t();return}(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((i,o)=>{this.offsets[o]=Qt(e[o],i,this.imageData,this.forceImageCover)}),this._debouncedUpdateFrameOffsets(this.offsets,n,this.frameData,this.thresholdSettings,this.targetElements,t)}getThresholdSettings(){return this.thresholdSettings}setThresholdSettings(e){this.thresholdSettings=e,this.imageData&&this.frameData&&this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,e,this.targetElements)}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,t,A,n,a,i){if(!A||A.length===0||A.some(s=>!s))throw new v("Frame data not set. This is a bug");if(!this.workflowManager)throw new v("No workflow manager set, cannot update offsets.");const o=this.workflowManager.getCommandDispatcher();a.forEach((s,r)=>{o(new g.GroupCommand([new g.UpdateFramePattern(s,t,e[r]),new g.UpdateFrameThresholdSettingsCommand(s,n.useThreshold,n.invertThreshold,n.threshold,n.thresholdSaturation)]))}),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:e}),i&&i()}recalculateZoomLimits(e,t){(this.minZoomScale.length!==t.length||this.maxZoomScale.length!==t.length)&&(this.minZoomScale=new Array(t.length),this.maxZoomScale=new Array(t.length)),t.forEach((A,n)=>{const a=Math.max(A.width/e.width,A.height/e.height);this.forceImageCover?(this.minZoomScale[n]=a,this.maxZoomScale[n]=a*2.5):(this.minZoomScale[n]=a/10,this.maxZoomScale[n]=a*2.5)})}recalculateOffsets(e){this.frameData&&((!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((t,A)=>{this.offsets[A]=g.calculateOffsets(e,t)}),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.thresholdSettings,this.targetElements))}}class mt{constructor(e,t,A){this.processRegion=async n=>{var s,r,l,d;const a=this.layouts.find(B=>B.panelId===n.panelId);if(!a)throw new b(n);let i="";if(this.configuration.type===g.StepType.ProductOverlay){let B="";if((s=this.product)!=null&&s.overlayImageUrl&&(B=this.product.overlayImageUrl),i=B,!B)throw new ie(this.configuration,"Couldn't find an asset for product overlay step")}const o=this.evaluateAssetType();if(o===g.LayoutElementType.Image){const B=this.configuration.type===g.StepType.SilentIllustration?(r=this.configuration.data.asset)==null?void 0:r.fileLink:(l=this.product)==null?void 0:l.overlayImageUrl;if(!B)throw new Error("Undefined raster silent step source");const w={stepName:this.configuration.stepName,id:g.generate(),src:B,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable,productOverlay:this.configuration.type===g.StepType.ProductOverlay?!0:void 0,rotation:n.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:w.id,region:n},command:new g.CreateElementCommand(w,a)}}else{const B=this.configuration.type===g.StepType.SilentIllustration?(d=this.configuration.data.asset)==null?void 0:d.fileLink:i,w=async()=>new Promise((h,m)=>{if(!B){m("Undefined vector silent step source");return}g.fetchAsString(B,!0).then(u=>{h(u)}).catch(u=>console.error(u))}),E=await g.generateSVGWithUnknownColors(await w()),C={stepName:this.configuration.stepName,id:g.generate(),cachedObjectURL:await g.svgObjectURL(E.svg),src:B,svg:E.svg,colors:E.colors,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,rotation:n.rotation,immutable:n.immutable,productOverlay:this.configuration.type===g.StepType.ProductOverlay?!0:void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:C.id,region:n},command:new g.CreateElementCommand(C,a)}}},this.configuration=e,this.layouts=t,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ie(this.configuration,"Missing regions.");if(this.configuration.type===g.StepType.SilentIllustration){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}else return this.configuration.type===g.StepType.ProductOverlay?Promise.all(this.configuration.data.regions.map(e=>{if(!this.layouts.find(A=>e.panelId===A.panelId))throw new b(e);return this.processRegion(e)})):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){var t,A,n;const e=this.configuration.type===g.StepType.ProductOverlay&&((t=this.product)!=null&&t.overlayImageUrl)?this.product.overlayImageUrl.toLowerCase():(n=(A=this.configuration.data.asset)==null?void 0:A.fileLink)==null?void 0:n.toLowerCase().split("?")[0];return e!=null&&e.startsWith("data:image/png")||e!=null&&e.endsWith(".jpeg")||e!=null&&e.endsWith(".jpg")||e!=null&&e.endsWith(".png")?g.LayoutElementType.Image:(e!=null&&e.endsWith(".svg")||e!=null&&e.startsWith("image/svg+xml"),g.LayoutElementType.Illustration)}}const It=async c=>{const e=`${W.getServicesApiUrl()}/shortener`;try{return(await(await fetch(e,{method:"POST",body:JSON.stringify({longUrl:c}),headers:{"Content-Type":"application/json"}})).json()).shortUrl}catch(t){throw console.error(t),new Ce("Failed to shorten URL, see console.")}};class ft{async poll(){try{if(await this.predicate()){this.onSuccess(),this.pollingId>-1&&window.clearInterval(this.pollingId);return}}catch{}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(e,t,A,n=3e3,a=10){this.onSuccess=t,this.onFailure=A,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=a,this.poll()}}class LA{async init(e,t,A){return A&&await this.reload(e,t,A),null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var d,B;const r=(d=n==null?void 0:n.storage)==null?void 0:d.videoShortUrl,l=(B=n==null?void 0:n.storage)==null?void 0:B.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:r,videoUrl:l})})}async regenerateQRCode(e,t,A,n,a,i,o,s,r){if(!t&&A!==""&&n===""){const l=async()=>{var I,f;const u=(await ct([A]))[0],F=(f=(I=u==null?void 0:u.versions)==null?void 0:I.find(D=>D.name==="mpeg4"))==null?void 0:f.link;return{asset:u,link:F}},d=await new Promise((u,F)=>{new ft(async()=>!!(await l()).link,async()=>{const I=await l();if(!I.link||!I.link)throw new X(I.asset);u({rel:"mpeg4",href:I.link})},()=>{F("Poller timed out with 40 attempts @ 3 second interval")},3e3,40)});e.forEach(u=>s(new g.DeleteElementCommand(u.id)));const B=i.data.baseUrl.slice(0,4)==="http"?"":"https://",w=new URL(B+i.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([d]))),w.pathname=w.pathname+(w.pathname.slice(-1)==="/"?"":"/");const E=w.toString();if(E.length>=2e3)throw new Ce("Cannot create QR code, URL too long.");const C=await It(E);if(o(C),!i.data||!i.data.regions)throw new ie(i,"Missing regions.");const h=await this.regionElements(i),m=await this.command(C,h,a,i.stepName);m&&(m.command&&a.getCommandDispatcher()(m.command),m.followup&&await m.followup()),await a.setSelectionsAndElements(i.stepName,[],h,async()=>{a.updateStorage(i.stepName,{videoShortUrl:C,videoUrl:n}),r(!1)})}else r(!1)}async regionElements(e){const t=A=>({id:g.generate(),region:A});return e.data.regions.map(t)}async command(e,t,A,n){const a=A.getLayouts(),o=`data:image/svg+xml;base64,${btoa(await nt.toString(e,{type:"svg"}))}`,s=t.map(r=>{const l=r.region,d=a.find(B=>B.panelId===(l==null?void 0:l.panelId));if(!d&&l)throw new b(l);if(d&&!l)throw new Error("Region not found");if(!d||!l)throw new Error("Neither a region or layout found!");return new g.CreateElementCommand({stepRegion:l,stepName:n,id:r.id,src:o,type:g.LayoutElementType.Image,y:l.top,x:l.left,width:l.width,height:l.height,rotation:0},d)});return{command:new g.GroupCommand(s),followup:async()=>{}}}}const Dt=new LA;class OA{constructor(){this.frameSourceSvg=async(e,t)=>{if(!e)return g.generateDefaultRectangleFrameSvg(t);const A=e.asset;if(!A)throw new V(e);const n=A.fileLink;if(n)return g.fetchAsString(n,!0);throw new X(A)}}async init(e,t,A){if(A)return await this.reload(e,t,A),null;if(t.setMandatoryFulfilled(e.stepName,!1),t.markStepsAsInitialised([e.stepName]),e.option&&e.option.variants&&e.option.variants.length>0){const n=e.option,a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,a,[],t,void 0,e.data.placeholderImageUrl):null}return this.selectVariantCommand(e,void 0,[],t,void 0,e.data.placeholderImageUrl)}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName).map(l=>({id:l.id,region:l.stepRegion}));if(!e.option||(e.option.variants||[]).length===0){const l=e.data.regions.map(d=>g.generateDefaultRectangleFrameSvg(d));t.updateStorage(e.stepName,{currentFrameSources:l})}if(n){const l=async()=>{var w,E,C,h;const d=(w=n.storage)==null?void 0:w.framePatternSrc,B=(E=n.storage)==null?void 0:E.frameOffsetsList;if(t.updateMetadata(e.stepName,{frameOffsetsList:B,framePatternSrc:d}),d){const m=(C=t.getStepSpecificServices(e.stepName))==null?void 0:C.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(d,m),t.updateMetadata(e.stepName,{image:d}),t.updateStorage(e.stepName,{framePatternSrc:d})}if(B!=null&&B.some(m=>m.zoom)){const m=(h=t.getStepSpecificServices(e.stepName))==null?void 0:h.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");m.updateOffsets(B)}t.setMandatoryFulfilled(e.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const d=n.selectedVariants[0].id;if(e.option&&d){const B=(r=e.option.variants)==null?void 0:r.find(w=>w.id===d);B&&await t.setSelectionsAndElements(e.stepName,[B],s,async()=>{const w=await Promise.all(e.data.regions.map(E=>this.frameSourceSvg(B,E)));t.updateStorage(e.stepName,{currentFrameSources:w}),await l()})}}else await t.setSelectionsAndElements(e.stepName,[],s,l)}}selectImage(e,t,A){A.setEditedStatus(e.stepName,!0),(t.fileLink||"").endsWith("pdf")?A.addPoller(new ft(async()=>{var s;const i=(s=(await J.getLocalOrFromServer(t.key||"")).versions)==null?void 0:s.find(r=>r.name==="svg");return i?(await fetch(i.link)).status===200:!1},()=>{J.getLocalOrFromServer(t.key||"").then(a=>{this.loadPatternFromAsset(a,e,A)})},()=>{throw new Ce("Failed to resolve transcoded PDF")})):this.loadPatternFromAsset(t,e,A)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(e,t,A,n){return new g.CreateElementCommand({id:e,type:g.LayoutElementType.Frame,x:t.left,y:t.top,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,scaleX:t.width/n.frameData.width,scaleY:t.height/n.frameData.height,path:n.frameData.path,dataWidth:n.frameData.width,dataHeight:n.frameData.height,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},A)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const A=await g.GetSVGDimensions(e),n=A.width,a=A.height,i={src:e,width:n,height:a,aspect:n/a};g.patternImageDataCache.set(e,i),t.setPatternData(i)}else{const A=await g.fetchAsArrayBuffer(e,!0),n=await g.getAttributesFromArrayBuffer(A),a={src:e,width:n.width,height:n.height,aspect:n.width/n.height};g.patternImageDataCache.set(e,a),t.setPatternData(a)}}async selectVariantCommand(e,t,A,n,a,i){var B;const o=(B=n.getStepSpecificServices(e.stepName))==null?void 0:B.frameService;if(!o)throw new Error("Frame service unavailable, cannot load pattern!");const s=await Promise.all(e.data.regions.map(w=>this.frameSourceSvg(t,w)));a&&a(!0);const r=await Promise.all(e.data.regions.map(async(w,E)=>{const C=await g.getFrameData(s[E]),h=o.getImageData(),m=A.map(p=>new g.DeleteElementCommand(p.id)),u=h?g.calculateOffsets(h,C):void 0,F=h?{id:g.generate(),src:h.src,x:(u==null?void 0:u.x)||0,y:(u==null?void 0:u.y)||0,width:h.width,height:h.height,scaleX:(u==null?void 0:u.zoom)||1,scaleY:(u==null?void 0:u.zoom)||1,rotation:0}:void 0,I=g.generate(),D=n.getLayouts().find(p=>p.panelId===w.panelId);if(!D)throw new b(w);return{command:this.getCreateElementCommand(I,w,D,{frameData:C,pattern:F,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:I,region:w},removeExistingCommands:m}})),l=r.map(w=>w.command),d=r.map(w=>w.removeExistingCommands).flat();return{command:new g.GroupCommand([...l,...d]),followup:async()=>{a&&a(!1),await n.setSelectionsAndElements(e.stepName,t?[t]:[],[...r.map(w=>w.regionEl)],async()=>{var w;if(n.updateStorage(e.stepName,{currentFrameSources:s}),i){const E=(w=n.getStepSpecificServices(e.stepName))==null?void 0:w.frameService;if(!E)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,E)}})}}}patternSource(e){var n;const t=(n=e.versions)==null?void 0:n.find(a=>a.name==="svg");if(t)return t.link;const A=e.fileLink;if(A)return A;throw new X(e)}async loadPatternFromAsset(e,t,A){var o;const n=this.patternSource(e),a=A.markUpdatePending(),i=(o=A.getStepSpecificServices(t.stepName))==null?void 0:o.frameService;if(!i)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(n,i),A.updateMetadata(t.stepName,{image:n}),A.updateStorage(t.stepName,{framePatternSrc:n}),A.markUpdateCompleted(a)}}const Ie=new OA;class zA{async getIllustrationBody(e){return new Promise(t=>{g.fetchAsString(e,!0).then(A=>{t(A)}).catch(A=>console.error(A))})}getCreateElementCommand(e,t,A,n){return new g.CreateElementCommand({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:e,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:g.LayoutElementType.Illustration,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable},A)}getColors(e,t){const A=t.getRegionElements(e.stepName)||[];if(A.length===0)return[];try{return g.findElement(A[0].id,t.getAllLayoutData()).colors}catch{return[]}}async init(e,t,A){const n=e.option;if(!n)return null;if(A)return this.reload(e,t,A);{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantCommand(e,a,[],()=>{},t)}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateMetadata(e.stepName,{colors:(w=n.storage)==null?void 0:w.colors}),t.setMandatoryFulfilled(e.stepName,!0)})}}else throw new Error("Required illustration variant no longer available")}return null}async availableColors(e,t){var n;const A=e.data.colorOption;return A?A?(n=A.variants)==null?void 0:n.map(a=>({fill:a.color,stroke:a.color,variant:a})):[]:[]}async changeColorsCommand(e,t,A,n,a){var l;const i={};for(const[d,B]of a.entries())i[d]={browserValue:B,spotColor:(l=i[d])==null?void 0:l.spotColor};const o=g.modifySVGWithElementProperties(e,t,A,i),s=await g.svgObjectURL(o),r=[];for(const d of n){for(const[B,w]of a.entries())r.push(new g.IllustrationColorCommand(d,B,w));r.push(new g.IllustrationCacheCommand(d,o,s))}return new g.GroupCommand(r)}async changeColors(e,t,A,n,a){var w,E;if(t.length===0)return;const i=g.findElement(t[0].id,n().map(C=>C.layoutState)),o={...i.colors},s={};Object.entries(o).forEach(([C,h])=>{const m={browserValue:h.browserValue},u=h.spotColor;u&&(m.spotColor={profileName:u.profileName,namedColor:u.namedColor}),s[C]=m});for(const[C,h]of a.entries())o[C]={browserValue:h,spotColor:(w=o[C])==null?void 0:w.spotColor},s[C]={browserValue:h};let r=Array.from(Object.values(o)).map(C=>C.browserValue);const l=e.data.colorOption;l&&((E=l.variants)==null||E.forEach(C=>{r=r.map(h=>{var m;return h.toLowerCase()===((m=C.color)==null?void 0:m.toLowerCase())?C.name:h})})),A.updateMetadata(e.stepName,{colors:r});const d=new Map;if(Object.entries(o).forEach(([C,h])=>{d.set(C,h.browserValue)}),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const B=await this.changeColorsCommand(i.svg,i.width,i.height,t.map(C=>C.id),d);A.updateStorage(e.stepName,{colors:s}),A.getCommandDispatcher()(B)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(e,t,A,n,a){var m;if(!e.data||!e.data.regions)throw new ie(e,"Missing regions.");n(!0);const i=A.map(u=>new g.DeleteElementCommand(u.id));a.setMandatoryFulfilled(e.stepName,!1);const o=t.asset;if(!o)throw new V(t);const s=o.fileLink;if(!s)throw new X(o);const r=await g.generateSVGWithUnknownColors(await this.getIllustrationBody(s)),l=await g.svgObjectURL(r.svg),d=u=>{const F=a.getLayouts().find(f=>f.panelId===u.panelId);if(!F)throw new b(u);const I=g.generate();return{regionElement:{id:I,region:u},command:this.getCreateElementCommand(I,u,F,{stepName:e.stepName,src:s,objectURL:l,svg:r})}},B=e.data.regions.map(d),E=[...B.map(u=>u.command),...i];let C=Array.from(Object.values(r.colors)).map(u=>u.browserValue);const h=e.data.colorOption;return h&&((m=h.variants)==null||m.forEach(u=>{C=C.map(F=>{var I;return F.toLowerCase()===((I=u.color)==null?void 0:I.toLowerCase())?u.name:F})})),a.updateMetadata(e.stepName,{colors:C}),{command:new g.GroupCommand(E),followup:async()=>{await a.setSelectionsAndElements(e.stepName,[t],B.map(I=>I.regionElement),async()=>{a.setMandatoryFulfilled(e.stepName,!0),n(!1)});const u=await this.availableColors(e,a)||[],F=Object.keys(r.colors);if(e.data.colorPickerEnabled&&u.length===1&&F.length===1){const I=u[0],f=F[0];await this.changeColors(e,B.map(D=>D.regionElement),a,()=>a.getCommandContext().getAllLayouts(),new Map([[f,I.variant.color]]))}}}}}const ce=new zA;class jA{async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{})}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(!s)throw new ae(e);if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=d.material,w=o.map(E=>({id:E.id,region:E.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],w,async()=>{const E=t.getModelContainer();if(E){const C=e.data.targetMaterials.map(h=>E.applyMaterialVariant(h,s.id||"",B||{}));Promise.all(C).then(()=>t.setMandatoryFulfilled(e.stepName,!0))}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n){const a=A.getModelContainer();n(!0);const i=t.material;if(!i)throw n(!1),new V(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{a&&e.data.targetMaterials.forEach(o=>{e.option&&a.applyMaterialVariant(o,e.option.id||"",i)}),A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const Ge=new jA;class KA{async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{})}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var E;const w=t.getModelContainer();if(w&&e.option){const C=(E=d.asset)==null?void 0:E.fileLink;if(!C)throw new V(d);await w.applyModelVariant(e.stepName||"",{model:C,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1),t.setMandatoryFulfilled(e.stepName,!0)}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n){var i;n(!0);const a=(i=t.asset)==null?void 0:i.fileLink;if(!a)throw new V(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{const o=A.getModelContainer();o&&await o.applyModelVariant(e.stepName,{model:a,contextService:A.getLayoutPreviewService()},e.data.replaceProductModel||!1),A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const ve=new KA;class VA{async init(e,t,A){if(A)await this.reload(e,t,A);else return t.updateMetadata(e.stepName,{text:""}),this.changeTextCommand(e,"",t,"",()=>{});return null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var r,l;t.updateStorage(e.stepName,{text:(r=n==null?void 0:n.storage)==null?void 0:r.text}),t.setMandatoryFulfilled(e.stepName,((l=n==null?void 0:n.storage)==null?void 0:l.text)!=="")})}async changeText(e,t,A,n,a){const i=await this.changeTextCommand(e,t,A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(e,t,A,n,a){var l;const i=A.getRegionElements(e.stepName),o=(l=A.getStepSpecificServices(e.stepName))==null?void 0:l.module;if(!o)return console.error("Missing module."),null;const s=A.getProfanities();if(!this.validateInput(e,t,s,a))return A.setMandatoryFulfilled(e.stepName,!1),console.error(n),null;if(A.setMandatoryFulfilled(e.stepName,t!==""),!e.data||!e.data.regions||e.data.regions.length<=0)return console.error("Missing configuration."),null;A.updateStorage(e.stepName,{text:t});const r=(d,B,w)=>{const E=w||g.generate(),h=A.getLayouts().find(u=>u.panelId===B.panelId);if(!h)return console.error(`Can not find layout for region: ${B.panelId}`),null;const m=[];return w&&m.push(new g.DeleteElementCommand(E)),m.push(new g.CreateElementCommand({stepRegion:B,stepName:e.stepName,colors:{},id:E,svg:d,type:g.LayoutElementType.Illustration,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable},h)),{id:E,region:B,command:new g.GroupCommand(m)}};if(i.length>0){const B=i.map(w=>{if(!w.region)return null;const E=o.svgPrint(t,w.region);return r(E,w.region,w.id)}).filter(w=>!!w).filter(w=>!!w).map(w=>w&&w.command);return{command:new g.GroupCommand(B),followup:async()=>{}}}else{const d=e.data.regions.map(w=>r(o.svgPrint(t,w),w)),B=d.filter(w=>!!w).map(w=>w&&w.command);return{command:new g.GroupCommand(B),followup:async()=>{const w=d.filter(E=>E).map(E=>E&&{id:E.id,region:E.region});await A.setSelectionsAndElements(e.stepName,[],w)}}}}validateInput(e,t,A,n){if(e.data&&e.data.maxLength){const i=e.data.maxLength;if(t.length>i)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const a=Ye.split(t.toLowerCase());for(const i of a)for(const o in A){const s=A[o].toLowerCase().replace(/\s/g,"");if(i===s)return n("Blocked profanity."),!1}return n(""),!0}}const pt=new VA;class WA{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else if(n.defaultVariant)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,n.defaultVariant,t,()=>{});return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(e,t,A,n){const a=t.asset;if(!a)throw new V(t);const i=a==null?void 0:a.fileLink;if(!i)return console.error("No URL for picture!"),null;n(!0),A.setMandatoryFulfilled(e.stepName,!1);const s=A.getRegionElements(e.stepName).map(d=>new g.DeleteElementCommand(d.id)),r=d=>{const w=A.getLayouts().find(C=>C.panelId===d.panelId);if(!w)throw new b(d);const E=g.generate();return{regionElement:{id:E,region:d},command:new g.CreateElementCommand({stepName:e.stepName,stepRegion:d,id:E,src:i,type:g.LayoutElementType.Image,y:d.top,x:d.left,rotation:d.rotation,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,immutable:d.immutable,preserveAspectRatio:"none"},w)}},l=e.data.regions.map(r);return{command:new g.GroupCommand([...s,...l.map(d=>d.command)]),followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],l.map(d=>d.regionElement),async()=>{A.setMandatoryFulfilled(e.stepName,!0),n(!1)})}}}}const ke=new WA;class XA{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else{const a=n.variants;if(L.getDefaultVariant(n)){const o=a==null?void 0:a.find(s=>{var r;return s.id===((r=n.defaultVariant)==null?void 0:r.id)});return this.selectVariantLambda(e,(o==null?void 0:o.id)||"",t)}}return null}async reload(e,t,A){var i;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),a=e.option;if(n!=null&&n.selectedVariants){const o=n.selectedVariants[0].id;if(a&&o){const s=(i=a.variants)==null?void 0:i.find(r=>r.id===o);s&&await t.setSelectionsAndElements(e.stepName,[s],[])}}}async selectVariant(e,t,A){await A.getInitializationPromise();const n=await this.selectVariantLambda(e,t,A);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A){const n=e.option;if(!n)return null;const a=n.variants;if(!a)return null;const i=a.length>1?a.find(o=>o.id===t):a[0];if(!i)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[i],[],async()=>{A.setMandatoryFulfilled(e.stepName,!0)})}}}}const be=new XA;class qA{constructor(){this.shapeFillId="spiff-fill-shape"}async availableColours(e){var A;const t=e.option;return t?((A=t.variants)==null?void 0:A.map(n=>({fill:n.color,stroke:n.color,variant:n})))||[]:[]}setCustomColor(e,t,A){const n=A.getLayouts(),i=(A.getRegionElements(t.stepName)||[]).map(o=>{const s=o.region;if(!n.find(l=>l.panelId===(s==null?void 0:s.panelId)))throw new b(s);return new g.IllustrationColorCommand(o.id,this.shapeFillId,e)}).filter(o=>!!o);A.getCommandDispatcher()(new g.GroupCommand(i)),A.updateStorage(t.stepName,{colour:e})}async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,{fill:a.color,stroke:a.color,variant:a},[],t):null}return null}async selectVariant(e,t,A,n){const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateStorage(e.stepName,{colour:((w=n==null?void 0:n.storage)==null?void 0:w.colour)||""}),t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariantCommand(e,t,A,n){var s;const a=n.getLayouts(),i=(s=n.getStepStorage(e.stepName))==null?void 0:s.colour,o=()=>{var r,l;if(((r=t.variant)==null?void 0:r.color)==="#custom")return i||"#FFFFFF";if((l=t.variant)!=null&&l.color)return t.variant.color;throw new Error("Failed to resolve color for shape step.")};if(A.length>0){const r=d=>{const B=d.region;if(!a.find(C=>C.panelId===(B==null?void 0:B.panelId)))throw new b(B);const E=o();return new g.IllustrationColorCommand(d.id,this.shapeFillId,E)},l=A.map(r).filter(d=>!!d);return{command:new g.GroupCommand(l),followup:async()=>{await n.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],A),n.updateStorage(e.stepName,{colour:o()})}}}else{const r=w=>{const E=a.find(F=>F.panelId===w.panelId);if(!E)throw new b(w);const C=o(),h=`
|
|
610
|
+
`,re=[g.StepType.SilentIllustration,g.StepType.ProductOverlay],kA=async c=>{const e=[];c.introduction&&e.push({name:"Introduction",title:c.name,renderableSteps:[{type:g.StepType.Introduction,stepName:"Introduction",stepTitle:c.name,helpText:c.introduction,data:{},conditions:[]}],silentSteps:[]});for(const A of c.steps){const n=bA(A.stepName,c.stepGroups);if(!n)e.push({name:A.stepName,title:A.stepTitle,renderableSteps:re.includes(A.type)?[]:[A],silentSteps:re.includes(A.type)?[A]:[]});else{const a=e.find(i=>i.name===n.name);a?re.includes(A.type)?a.silentSteps.push(A):a.renderableSteps.push(A):e.push({name:n.name,title:n.name,renderableSteps:re.includes(A.type)?[]:[A],silentSteps:re.includes(A.type)?[A]:[]})}}const t="workflow.steps.finish.confirmDesign";return e.push({name:"Finish",title:t,renderableSteps:[{type:g.StepType.Finish,stepName:"Finish",stepTitle:t,helpText:"",data:{modelAnimation:c.finalizeStepConfig?c.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:c.finalizeStepConfig?c.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),e},bA=(c,e)=>e.find(t=>t.stepNames.includes(c)),_=(c,e)=>(c.conditions||[]).every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const n=A.selectedVariants;return t.requiredVariantSelections.some(a=>n.find(i=>i.id===a)!==void 0)}return!1}),JA=(c,e)=>{const t={name:c.name,title:c.title,renderableSteps:c.renderableSteps.filter(A=>_(A,e)),silentSteps:c.silentSteps.filter(A=>_(A,e))};return t.silentSteps.length===0&&t.renderableSteps.length===0?null:t},ee=(c,e)=>c.map(t=>JA(t,e)).filter(t=>t!==null),TA=async(c,e,t=!1)=>{var i;const A=ee(c,e),n=[];for(const o of A)for(const s of o.renderableSteps){const r=(((i=s.option)==null?void 0:i.variants)||[]).length;s.silent||(s.type===g.StepType.Model||s.type===g.StepType.Material||s.type===g.StepType.Picture||s.type===g.StepType.Shape?(r>1||t)&&n.push(s.stepName):n.push(s.stepName))}const a=A.filter(o=>o.renderableSteps.filter(r=>n.includes(r.stepName)).length>0);for(const o of a)o.renderableSteps=o.renderableSteps.filter(s=>n.includes(s.stepName));return a};class Re{constructor(){this.timestamp=Date.now()}}class Ue{constructor(e,t=!0){this.queue=[],this.activePromise=void 0,this.queueMaxSize=void 0,this.queueMaxSize=e,this.isEnabled=t}enqueue(e){if(this.queue.push(e),this.queueMaxSize!==void 0&&this.queue.length>this.queueMaxSize){const t=this.queue.length-1;for(let A=0;A<t;++A)this.queue.shift()}this.isEnabled&&(this.activePromise||(this.activePromise=this.dequeue()))}get enabled(){return this.isEnabled}set enabled(e){!this.isEnabled&&e&&!this.activePromise&&(this.activePromise=this.dequeue()),this.isEnabled=e}hasActivePromise(){return!!this.activePromise}getRemainingQueueSize(){return this.queue.length}async finalize(){return this.activePromise?this.activePromise:Promise.resolve()}async dequeue(){const e=this.queue.shift();if(!e){this.activePromise=void 0;return}try{await e.execute()}catch(t){console.log(t)}finally{await this.dequeue()}}}function Qt(c,e,t,A){const n=t.width*c.zoom,a=t.height*c.zoom;if(A){const o=c,s=Math.max(e.width/t.width,e.height/t.height);o.zoom=Math.max(s,c.zoom);const r=t.width*o.zoom,l=t.height*o.zoom;return o.x=me(c.x,e.width-r,0),o.y=me(c.y,e.height-l,0),o}const i=c;return i.x=me(i.x,-n,e.width),i.y=me(i.y,-a,e.height),i}function me(c,e,t){return Math.min(Math.max(c,e),t)}class ut{constructor(e){this.minZoomScale=[.03],this.maxZoomScale=[20],this._debouncedUpdateFrameOffsets=tt(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e,this.thresholdSettings={useThreshold:!1,invertThreshold:!1,threshold:128,thresholdSaturation:.5}}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback(async A=>{if(A){const n=A;if(n.currentFrameSources){let a=!1;for(let i=0;i<n.currentFrameSources.length;i++){const o=n.currentFrameSources[i],s=await g.getFrameData(o);At(s,this.frameData)||(this.frameData||(this.frameData=new Array(n.currentFrameSources.length)),this.frameData[i]=s,a=!0)}a&&(this.onFrameDataChangeListeners.forEach(i=>i(this.frameData)),this.frameData&&this.imageData&&(this.recalculateOffsets(this.imageData),this.updateOffsets(this.offsets),this.recalculateZoomLimits(this.imageData,this.frameData)))}}},t),this.workflowManager=e,this.stepName=t}setTargetElements(e){this.targetElements=e}getFrameData(){return this.frameData}setFrameData(e){if(!e){this.frameData=void 0;return}e.forEach((t,A)=>{const n=g.frameDataCache.get(t);n&&(this.frameData||(this.frameData=new Array(e.length)),this.frameData[A]=n)})}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,A,n){if(this.imageData&&this.offsets&&this.frameData){(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length));const a=this.frameData.map((i,o)=>{const s=(t[o]-this.offsets[o].x)/this.offsets[o].zoom,r=(A[o]-this.offsets[o].y)/this.offsets[o].zoom,l=t[o]-s*e[o],d=A[o]-r*e[o];return{x:l,y:d,zoom:this.imageData.width*e[o]/this.imageData.width}});this.updateOffsets(a,n),this.onZoomChangeListeners.forEach(i=>i(e))}}setPatternData(e){this.imageData=e,e&&this.frameData&&(this.recalculateOffsets(e),this.updateOffsets(this.offsets,void 0,!0)),this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(e,t,A){const n=this.imageData;if(!n||!this.frameData)return;if(this.frameData.length!==e.length)throw new v("Frame data and offsets are not the same length. This is a bug. Please report it.");if(!this.offsets.some((i,o)=>!(e[o].x===i.x&&e[o].y===i.y&&e[o].zoom===i.zoom))&&!A){t&&t();return}(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((i,o)=>{this.offsets[o]=Qt(e[o],i,this.imageData,this.forceImageCover)}),this._debouncedUpdateFrameOffsets(this.offsets,n,this.frameData,this.thresholdSettings,this.targetElements,t)}getThresholdSettings(){return this.thresholdSettings}setThresholdSettings(e){this.thresholdSettings=e,this.imageData&&this.frameData&&this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,e,this.targetElements)}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,t,A,n,a,i){if(!A||A.length===0||A.some(s=>!s))throw new v("Frame data not set. This is a bug");if(!this.workflowManager)throw new v("No workflow manager set, cannot update offsets.");const o=this.workflowManager.getCommandDispatcher();a.forEach((s,r)=>{o(new g.GroupCommand([new g.UpdateFramePattern(s,t,e[r]),new g.UpdateFrameThresholdSettingsCommand(s,n.useThreshold,n.invertThreshold,n.threshold,n.thresholdSaturation)]))}),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:e}),i&&i()}recalculateZoomLimits(e,t){(this.minZoomScale.length!==t.length||this.maxZoomScale.length!==t.length)&&(this.minZoomScale=new Array(t.length),this.maxZoomScale=new Array(t.length)),t.forEach((A,n)=>{const a=Math.max(A.width/e.width,A.height/e.height);this.forceImageCover?(this.minZoomScale[n]=a,this.maxZoomScale[n]=a*2.5):(this.minZoomScale[n]=a/10,this.maxZoomScale[n]=a*2.5)})}recalculateOffsets(e){this.frameData&&((!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((t,A)=>{this.offsets[A]=g.calculateOffsets(e,t)}),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.thresholdSettings,this.targetElements))}}class mt{constructor(e,t,A){this.processRegion=async n=>{var s,r,l,d;const a=this.layouts.find(B=>B.panelId===n.panelId);if(!a)throw new J(n);let i="";if(this.configuration.type===g.StepType.ProductOverlay){let B="";if((s=this.product)!=null&&s.overlayImageUrl&&(B=this.product.overlayImageUrl),i=B,!B)throw new ie(this.configuration,"Couldn't find an asset for product overlay step")}const o=this.evaluateAssetType();if(o===g.LayoutElementType.Image){const B=this.configuration.type===g.StepType.SilentIllustration?(r=this.configuration.data.asset)==null?void 0:r.fileLink:(l=this.product)==null?void 0:l.overlayImageUrl;if(!B)throw new Error("Undefined raster silent step source");const w={stepName:this.configuration.stepName,id:g.generate(),src:B,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable,productOverlay:this.configuration.type===g.StepType.ProductOverlay?!0:void 0,rotation:n.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:w.id,region:n},command:new g.CreateElementCommand(w,a)}}else{const B=this.configuration.type===g.StepType.SilentIllustration?(d=this.configuration.data.asset)==null?void 0:d.fileLink:i,w=async()=>new Promise((h,m)=>{if(!B){m("Undefined vector silent step source");return}g.fetchAsString(B,!0).then(u=>{h(u)}).catch(u=>console.error(u))}),E=await g.generateSVGWithUnknownColors(await w()),C={stepName:this.configuration.stepName,id:g.generate(),cachedObjectURL:await g.svgObjectURL(E.svg),src:B,svg:E.svg,colors:E.colors,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,rotation:n.rotation,immutable:n.immutable,productOverlay:this.configuration.type===g.StepType.ProductOverlay?!0:void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:C.id,region:n},command:new g.CreateElementCommand(C,a)}}},this.configuration=e,this.layouts=t,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ie(this.configuration,"Missing regions.");if(this.configuration.type===g.StepType.SilentIllustration){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}else return this.configuration.type===g.StepType.ProductOverlay?Promise.all(this.configuration.data.regions.map(e=>{if(!this.layouts.find(A=>e.panelId===A.panelId))throw new J(e);return this.processRegion(e)})):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){var t,A,n;const e=this.configuration.type===g.StepType.ProductOverlay&&((t=this.product)!=null&&t.overlayImageUrl)?this.product.overlayImageUrl.toLowerCase():(n=(A=this.configuration.data.asset)==null?void 0:A.fileLink)==null?void 0:n.toLowerCase().split("?")[0];return e!=null&&e.startsWith("data:image/png")||e!=null&&e.endsWith(".jpeg")||e!=null&&e.endsWith(".jpg")||e!=null&&e.endsWith(".png")?g.LayoutElementType.Image:(e!=null&&e.endsWith(".svg")||e!=null&&e.startsWith("image/svg+xml"),g.LayoutElementType.Illustration)}}const It=async c=>{const e=`${W.getServicesApiUrl()}/shortener`;try{return(await(await fetch(e,{method:"POST",body:JSON.stringify({longUrl:c}),headers:{"Content-Type":"application/json"}})).json()).shortUrl}catch(t){throw console.error(t),new Ce("Failed to shorten URL, see console.")}};class ft{async poll(){try{if(await this.predicate()){this.onSuccess(),this.pollingId>-1&&window.clearInterval(this.pollingId);return}}catch{}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(e,t,A,n=3e3,a=10){this.onSuccess=t,this.onFailure=A,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=a,this.poll()}}class LA{async init(e,t,A){return A&&await this.reload(e,t,A),null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var d,B;const r=(d=n==null?void 0:n.storage)==null?void 0:d.videoShortUrl,l=(B=n==null?void 0:n.storage)==null?void 0:B.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:r,videoUrl:l})})}async regenerateQRCode(e,t,A,n,a,i,o,s,r){if(!t&&A!==""&&n===""){const l=async()=>{var I,f;const u=(await ct([A]))[0],F=(f=(I=u==null?void 0:u.versions)==null?void 0:I.find(D=>D.name==="mpeg4"))==null?void 0:f.link;return{asset:u,link:F}},d=await new Promise((u,F)=>{new ft(async()=>!!(await l()).link,async()=>{const I=await l();if(!I.link||!I.link)throw new X(I.asset);u({rel:"mpeg4",href:I.link})},()=>{F("Poller timed out with 40 attempts @ 3 second interval")},3e3,40)});e.forEach(u=>s(new g.DeleteElementCommand(u.id)));const B=i.data.baseUrl.slice(0,4)==="http"?"":"https://",w=new URL(B+i.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([d]))),w.pathname=w.pathname+(w.pathname.slice(-1)==="/"?"":"/");const E=w.toString();if(E.length>=2e3)throw new Ce("Cannot create QR code, URL too long.");const C=await It(E);if(o(C),!i.data||!i.data.regions)throw new ie(i,"Missing regions.");const h=await this.regionElements(i),m=await this.command(C,h,a,i.stepName);m&&(m.command&&a.getCommandDispatcher()(m.command),m.followup&&await m.followup()),await a.setSelectionsAndElements(i.stepName,[],h,async()=>{a.updateStorage(i.stepName,{videoShortUrl:C,videoUrl:n}),r(!1)})}else r(!1)}async regionElements(e){const t=A=>({id:g.generate(),region:A});return e.data.regions.map(t)}async command(e,t,A,n){const a=A.getLayouts(),o=`data:image/svg+xml;base64,${btoa(await nt.toString(e,{type:"svg"}))}`,s=t.map(r=>{const l=r.region,d=a.find(B=>B.panelId===(l==null?void 0:l.panelId));if(!d&&l)throw new J(l);if(d&&!l)throw new Error("Region not found");if(!d||!l)throw new Error("Neither a region or layout found!");return new g.CreateElementCommand({stepRegion:l,stepName:n,id:r.id,src:o,type:g.LayoutElementType.Image,y:l.top,x:l.left,width:l.width,height:l.height,rotation:0},d)});return{command:new g.GroupCommand(s),followup:async()=>{}}}}const Dt=new LA;class OA{constructor(){this.frameSourceSvg=async(e,t)=>{if(!e)return g.generateDefaultRectangleFrameSvg(t);const A=e.asset;if(!A)throw new V(e);const n=A.fileLink;if(n)return g.fetchAsString(n,!0);throw new X(A)}}async init(e,t,A){if(A)return await this.reload(e,t,A),null;if(t.setMandatoryFulfilled(e.stepName,!1),t.markStepsAsInitialised([e.stepName]),e.option&&e.option.variants&&e.option.variants.length>0){const n=e.option,a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,a,[],t,void 0,e.data.placeholderImageUrl):null}return this.selectVariantCommand(e,void 0,[],t,void 0,e.data.placeholderImageUrl)}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName).map(l=>({id:l.id,region:l.stepRegion}));if(!e.option||(e.option.variants||[]).length===0){const l=e.data.regions.map(d=>g.generateDefaultRectangleFrameSvg(d));t.updateStorage(e.stepName,{currentFrameSources:l})}if(n){const l=async()=>{var w,E,C,h;const d=(w=n.storage)==null?void 0:w.framePatternSrc,B=(E=n.storage)==null?void 0:E.frameOffsetsList;if(t.updateMetadata(e.stepName,{frameOffsetsList:B,framePatternSrc:d}),d){const m=(C=t.getStepSpecificServices(e.stepName))==null?void 0:C.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(d,m),t.updateMetadata(e.stepName,{image:d}),t.updateStorage(e.stepName,{framePatternSrc:d})}if(B!=null&&B.some(m=>m.zoom)){const m=(h=t.getStepSpecificServices(e.stepName))==null?void 0:h.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");m.updateOffsets(B)}t.setMandatoryFulfilled(e.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const d=n.selectedVariants[0].id;if(e.option&&d){const B=(r=e.option.variants)==null?void 0:r.find(w=>w.id===d);B&&await t.setSelectionsAndElements(e.stepName,[B],s,async()=>{const w=await Promise.all(e.data.regions.map(E=>this.frameSourceSvg(B,E)));t.updateStorage(e.stepName,{currentFrameSources:w}),await l()})}}else await t.setSelectionsAndElements(e.stepName,[],s,l)}}selectImage(e,t,A){A.setEditedStatus(e.stepName,!0),(t.fileLink||"").endsWith("pdf")?A.addPoller(new ft(async()=>{var s;const i=(s=(await k.getLocalOrFromServer(t.key||"")).versions)==null?void 0:s.find(r=>r.name==="svg");return i?(await fetch(i.link)).status===200:!1},()=>{k.getLocalOrFromServer(t.key||"").then(a=>{this.loadPatternFromAsset(a,e,A)})},()=>{throw new Ce("Failed to resolve transcoded PDF")})):this.loadPatternFromAsset(t,e,A)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(e,t,A,n){return new g.CreateElementCommand({id:e,type:g.LayoutElementType.Frame,x:t.left,y:t.top,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,scaleX:t.width/n.frameData.width,scaleY:t.height/n.frameData.height,path:n.frameData.path,dataWidth:n.frameData.width,dataHeight:n.frameData.height,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},A)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const A=await g.GetSVGDimensions(e),n=A.width,a=A.height,i={src:e,width:n,height:a,aspect:n/a};g.patternImageDataCache.set(e,i),t.setPatternData(i)}else{const A=await g.fetchAsArrayBuffer(e,!0),n=await g.getAttributesFromArrayBuffer(A),a={src:e,width:n.width,height:n.height,aspect:n.width/n.height};g.patternImageDataCache.set(e,a),t.setPatternData(a)}}async selectVariantCommand(e,t,A,n,a,i){var B;const o=(B=n.getStepSpecificServices(e.stepName))==null?void 0:B.frameService;if(!o)throw new Error("Frame service unavailable, cannot load pattern!");const s=await Promise.all(e.data.regions.map(w=>this.frameSourceSvg(t,w)));a&&a(!0);const r=await Promise.all(e.data.regions.map(async(w,E)=>{const C=await g.getFrameData(s[E]),h=o.getImageData(),m=A.map(p=>new g.DeleteElementCommand(p.id)),u=h?g.calculateOffsets(h,C):void 0,F=h?{id:g.generate(),src:h.src,x:(u==null?void 0:u.x)||0,y:(u==null?void 0:u.y)||0,width:h.width,height:h.height,scaleX:(u==null?void 0:u.zoom)||1,scaleY:(u==null?void 0:u.zoom)||1,rotation:0}:void 0,I=g.generate(),D=n.getLayouts().find(p=>p.panelId===w.panelId);if(!D)throw new J(w);return{command:this.getCreateElementCommand(I,w,D,{frameData:C,pattern:F,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:I,region:w},removeExistingCommands:m}})),l=r.map(w=>w.command),d=r.map(w=>w.removeExistingCommands).flat();return{command:new g.GroupCommand([...l,...d]),followup:async()=>{a&&a(!1),await n.setSelectionsAndElements(e.stepName,t?[t]:[],[...r.map(w=>w.regionEl)],async()=>{var w;if(n.updateStorage(e.stepName,{currentFrameSources:s}),i){const E=(w=n.getStepSpecificServices(e.stepName))==null?void 0:w.frameService;if(!E)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,E)}})}}}patternSource(e){var n;const t=(n=e.versions)==null?void 0:n.find(a=>a.name==="svg");if(t)return t.link;const A=e.fileLink;if(A)return A;throw new X(e)}async loadPatternFromAsset(e,t,A){var o;const n=this.patternSource(e),a=A.markUpdatePending(),i=(o=A.getStepSpecificServices(t.stepName))==null?void 0:o.frameService;if(!i)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(n,i),A.updateMetadata(t.stepName,{image:n}),A.updateStorage(t.stepName,{framePatternSrc:n}),A.markUpdateCompleted(a)}}const Ie=new OA;class zA{async getIllustrationBody(e){return new Promise(t=>{g.fetchAsString(e,!0).then(A=>{t(A)}).catch(A=>console.error(A))})}getCreateElementCommand(e,t,A,n){return new g.CreateElementCommand({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:e,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:g.LayoutElementType.Illustration,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable},A)}getColors(e,t){const A=t.getRegionElements(e.stepName)||[];if(A.length===0)return[];try{return g.findElement(A[0].id,t.getAllLayoutData()).colors}catch{return[]}}async init(e,t,A){const n=e.option;if(!n)return null;if(A)return this.reload(e,t,A);{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantCommand(e,a,[],()=>{},t)}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateMetadata(e.stepName,{colors:(w=n.storage)==null?void 0:w.colors}),t.setMandatoryFulfilled(e.stepName,!0)})}}else throw new Error("Required illustration variant no longer available")}return null}async availableColors(e,t){var n;const A=e.data.colorOption;return A?A?(n=A.variants)==null?void 0:n.map(a=>({fill:a.color,stroke:a.color,variant:a})):[]:[]}async changeColorsCommand(e,t,A,n,a){var l;const i={};for(const[d,B]of a.entries())i[d]={browserValue:B,spotColor:(l=i[d])==null?void 0:l.spotColor};const o=g.modifySVGWithElementProperties(e,t,A,i),s=await g.svgObjectURL(o),r=[];for(const d of n){for(const[B,w]of a.entries())r.push(new g.IllustrationColorCommand(d,B,w));r.push(new g.IllustrationCacheCommand(d,o,s))}return new g.GroupCommand(r)}async changeColors(e,t,A,n,a){var w,E;if(t.length===0)return;const i=g.findElement(t[0].id,n().map(C=>C.layoutState)),o={...i.colors},s={};Object.entries(o).forEach(([C,h])=>{const m={browserValue:h.browserValue},u=h.spotColor;u&&(m.spotColor={profileName:u.profileName,namedColor:u.namedColor}),s[C]=m});for(const[C,h]of a.entries())o[C]={browserValue:h,spotColor:(w=o[C])==null?void 0:w.spotColor},s[C]={browserValue:h};let r=Array.from(Object.values(o)).map(C=>C.browserValue);const l=e.data.colorOption;l&&((E=l.variants)==null||E.forEach(C=>{r=r.map(h=>{var m;return h.toLowerCase()===((m=C.color)==null?void 0:m.toLowerCase())?C.name:h})})),A.updateMetadata(e.stepName,{colors:r});const d=new Map;if(Object.entries(o).forEach(([C,h])=>{d.set(C,h.browserValue)}),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const B=await this.changeColorsCommand(i.svg,i.width,i.height,t.map(C=>C.id),d);A.updateStorage(e.stepName,{colors:s}),A.getCommandDispatcher()(B)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(e,t,A,n,a){var m;if(!e.data||!e.data.regions)throw new ie(e,"Missing regions.");n(!0);const i=A.map(u=>new g.DeleteElementCommand(u.id));a.setMandatoryFulfilled(e.stepName,!1);const o=t.asset;if(!o)throw new V(t);const s=o.fileLink;if(!s)throw new X(o);const r=await g.generateSVGWithUnknownColors(await this.getIllustrationBody(s)),l=await g.svgObjectURL(r.svg),d=u=>{const F=a.getLayouts().find(f=>f.panelId===u.panelId);if(!F)throw new J(u);const I=g.generate();return{regionElement:{id:I,region:u},command:this.getCreateElementCommand(I,u,F,{stepName:e.stepName,src:s,objectURL:l,svg:r})}},B=e.data.regions.map(d),E=[...B.map(u=>u.command),...i];let C=Array.from(Object.values(r.colors)).map(u=>u.browserValue);const h=e.data.colorOption;return h&&((m=h.variants)==null||m.forEach(u=>{C=C.map(F=>{var I;return F.toLowerCase()===((I=u.color)==null?void 0:I.toLowerCase())?u.name:F})})),a.updateMetadata(e.stepName,{colors:C}),{command:new g.GroupCommand(E),followup:async()=>{await a.setSelectionsAndElements(e.stepName,[t],B.map(I=>I.regionElement),async()=>{a.setMandatoryFulfilled(e.stepName,!0),n(!1)});const u=await this.availableColors(e,a)||[],F=Object.keys(r.colors);if(e.data.colorPickerEnabled&&u.length===1&&F.length===1){const I=u[0],f=F[0];await this.changeColors(e,B.map(D=>D.regionElement),a,()=>a.getCommandContext().getAllLayouts(),new Map([[f,I.variant.color]]))}}}}}const ce=new zA;class jA{async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{})}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(!s)throw new ae(e);if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=d.material,w=o.map(E=>({id:E.id,region:E.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],w,async()=>{const E=t.getModelContainer();if(E){const C=e.data.targetMaterials.map(h=>E.applyMaterialVariant(h,s.id||"",B||{}));Promise.all(C).then(()=>t.setMandatoryFulfilled(e.stepName,!0))}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n){const a=A.getModelContainer();n(!0);const i=t.material;if(!i)throw n(!1),new V(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{a&&e.data.targetMaterials.forEach(o=>{e.option&&a.applyMaterialVariant(o,e.option.id||"",i)}),A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const Ge=new jA;class KA{async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{})}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var E;const w=t.getModelContainer();if(w&&e.option){const C=(E=d.asset)==null?void 0:E.fileLink;if(!C)throw new V(d);await w.applyModelVariant(e.stepName||"",{model:C,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1),t.setMandatoryFulfilled(e.stepName,!0)}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n){var i;n(!0);const a=(i=t.asset)==null?void 0:i.fileLink;if(!a)throw new V(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{const o=A.getModelContainer();o&&await o.applyModelVariant(e.stepName,{model:a,contextService:A.getLayoutPreviewService()},e.data.replaceProductModel||!1),A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const ve=new KA;class VA{async init(e,t,A){if(A)await this.reload(e,t,A);else return t.updateMetadata(e.stepName,{text:""}),this.changeTextCommand(e,"",t,"",()=>{});return null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var r,l;t.updateStorage(e.stepName,{text:(r=n==null?void 0:n.storage)==null?void 0:r.text}),t.setMandatoryFulfilled(e.stepName,((l=n==null?void 0:n.storage)==null?void 0:l.text)!=="")})}async changeText(e,t,A,n,a){const i=await this.changeTextCommand(e,t,A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(e,t,A,n,a){var l;const i=A.getRegionElements(e.stepName),o=(l=A.getStepSpecificServices(e.stepName))==null?void 0:l.module;if(!o)return console.error("Missing module."),null;const s=A.getProfanities();if(!this.validateInput(e,t,s,a))return A.setMandatoryFulfilled(e.stepName,!1),console.error(n),null;if(A.setMandatoryFulfilled(e.stepName,t!==""),!e.data||!e.data.regions||e.data.regions.length<=0)return console.error("Missing configuration."),null;A.updateStorage(e.stepName,{text:t});const r=(d,B,w)=>{const E=w||g.generate(),h=A.getLayouts().find(u=>u.panelId===B.panelId);if(!h)return console.error(`Can not find layout for region: ${B.panelId}`),null;const m=[];return w&&m.push(new g.DeleteElementCommand(E)),m.push(new g.CreateElementCommand({stepRegion:B,stepName:e.stepName,colors:{},id:E,svg:d,type:g.LayoutElementType.Illustration,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable},h)),{id:E,region:B,command:new g.GroupCommand(m)}};if(i.length>0){const B=i.map(w=>{if(!w.region)return null;const E=o.svgPrint(t,w.region);return r(E,w.region,w.id)}).filter(w=>!!w).filter(w=>!!w).map(w=>w&&w.command);return{command:new g.GroupCommand(B),followup:async()=>{}}}else{const d=e.data.regions.map(w=>r(o.svgPrint(t,w),w)),B=d.filter(w=>!!w).map(w=>w&&w.command);return{command:new g.GroupCommand(B),followup:async()=>{const w=d.filter(E=>E).map(E=>E&&{id:E.id,region:E.region});await A.setSelectionsAndElements(e.stepName,[],w)}}}}validateInput(e,t,A,n){if(e.data&&e.data.maxLength){const i=e.data.maxLength;if(t.length>i)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const a=Ye.split(t.toLowerCase());for(const i of a)for(const o in A){const s=A[o].toLowerCase().replace(/\s/g,"");if(i===s)return n("Blocked profanity."),!1}return n(""),!0}}const pt=new VA;class WA{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else if(n.defaultVariant)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,n.defaultVariant,t,()=>{});return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(e,t,A,n){const a=t.asset;if(!a)throw new V(t);const i=a==null?void 0:a.fileLink;if(!i)return console.error("No URL for picture!"),null;n(!0),A.setMandatoryFulfilled(e.stepName,!1);const s=A.getRegionElements(e.stepName).map(d=>new g.DeleteElementCommand(d.id)),r=d=>{const w=A.getLayouts().find(C=>C.panelId===d.panelId);if(!w)throw new J(d);const E=g.generate();return{regionElement:{id:E,region:d},command:new g.CreateElementCommand({stepName:e.stepName,stepRegion:d,id:E,src:i,type:g.LayoutElementType.Image,y:d.top,x:d.left,rotation:d.rotation,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,immutable:d.immutable,preserveAspectRatio:"none"},w)}},l=e.data.regions.map(r);return{command:new g.GroupCommand([...s,...l.map(d=>d.command)]),followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],l.map(d=>d.regionElement),async()=>{A.setMandatoryFulfilled(e.stepName,!0),n(!1)})}}}}const ke=new WA;class XA{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else{const a=n.variants;if(L.getDefaultVariant(n)){const o=a==null?void 0:a.find(s=>{var r;return s.id===((r=n.defaultVariant)==null?void 0:r.id)});return this.selectVariantLambda(e,(o==null?void 0:o.id)||"",t)}}return null}async reload(e,t,A){var i;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),a=e.option;if(n!=null&&n.selectedVariants){const o=n.selectedVariants[0].id;if(a&&o){const s=(i=a.variants)==null?void 0:i.find(r=>r.id===o);s&&await t.setSelectionsAndElements(e.stepName,[s],[])}}}async selectVariant(e,t,A){await A.getInitializationPromise();const n=await this.selectVariantLambda(e,t,A);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A){const n=e.option;if(!n)return null;const a=n.variants;if(!a)return null;const i=a.length>1?a.find(o=>o.id===t):a[0];if(!i)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[i],[],async()=>{A.setMandatoryFulfilled(e.stepName,!0)})}}}}const be=new XA;class qA{constructor(){this.shapeFillId="spiff-fill-shape"}async availableColours(e){var A;const t=e.option;return t?((A=t.variants)==null?void 0:A.map(n=>({fill:n.color,stroke:n.color,variant:n})))||[]:[]}setCustomColor(e,t,A){const n=A.getLayouts(),i=(A.getRegionElements(t.stepName)||[]).map(o=>{const s=o.region;if(!n.find(l=>l.panelId===(s==null?void 0:s.panelId)))throw new J(s);return new g.IllustrationColorCommand(o.id,this.shapeFillId,e)}).filter(o=>!!o);A.getCommandDispatcher()(new g.GroupCommand(i)),A.updateStorage(t.stepName,{colour:e})}async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,{fill:a.color,stroke:a.color,variant:a},[],t):null}return null}async selectVariant(e,t,A,n){const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateStorage(e.stepName,{colour:((w=n==null?void 0:n.storage)==null?void 0:w.colour)||""}),t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariantCommand(e,t,A,n){var s;const a=n.getLayouts(),i=(s=n.getStepStorage(e.stepName))==null?void 0:s.colour,o=()=>{var r,l;if(((r=t.variant)==null?void 0:r.color)==="#custom")return i||"#FFFFFF";if((l=t.variant)!=null&&l.color)return t.variant.color;throw new Error("Failed to resolve color for shape step.")};if(A.length>0){const r=d=>{const B=d.region;if(!a.find(C=>C.panelId===(B==null?void 0:B.panelId)))throw new J(B);const E=o();return new g.IllustrationColorCommand(d.id,this.shapeFillId,E)},l=A.map(r).filter(d=>!!d);return{command:new g.GroupCommand(l),followup:async()=>{await n.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],A),n.updateStorage(e.stepName,{colour:o()})}}}else{const r=w=>{const E=a.find(F=>F.panelId===w.panelId);if(!E)throw new J(w);const C=o(),h=`
|
|
611
611
|
<svg
|
|
612
612
|
xmlns="http://www.w3.org/2000/svg"
|
|
613
613
|
xmlnsXlink="http://www.w3.org/1999/xlink"
|
|
@@ -1960,7 +1960,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
|
|
|
1960
1960
|
}
|
|
1961
1961
|
}
|
|
1962
1962
|
}
|
|
1963
|
-
`,hn=async c=>{var t;return(t=(await N.getShadowGraphqlClient().mutate({mutation:wn,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:c.name,layouts:c.layouts,workflowId:c.workflowId,transactionId:c.transactionId,previewImage:c.previewImage,useThreeDimPreview:c.useThreeDimPreview,metadata:c.metadata,selectedVariants:c.selectedVariants}})).data)==null?void 0:t.designCreate},Cn=async c=>{var t;return(t=(await N.getShadowGraphqlClient().mutate({mutation:En,errorPolicy:"all",fetchPolicy:"no-cache",variables:{inputs:c.map(A=>({name:A.name,layouts:A.layouts,workflowId:A.workflowId,transactionId:A.transactionId,previewImage:A.previewImage,useThreeDimPreview:A.useThreeDimPreview,metadata:A.metadata,selectedVariants:A.selectedVariants}))}})).data)==null?void 0:t.designCreateMany},je=(c,e,t)=>{const A=a=>{const i={};if(a.type==="Frame"){const o=c[a.stepName],s=a.data;if(!o||!o.image||s.hideImageInCart&&t)return i;i[`${a.stepTitle} image`]=o.image}if(a.type==="Illustration"){const o=c[a.stepName],s=a.data;if(!o||s.hideColorsInCart&&t||!o.colors)return i;if(o.colors.length>0){const r=o.colors.join(", ").toUpperCase();i[`${a.stepTitle} colors`]=r}}if(a.type==="Module"){const o=c[a.stepName],s=a.data;if(!o||o.text===void 0||o.text===null||s.hideTextInCart&&t)return i;i[`${a.stepTitle} text`]=o.text}if(a.type==="Text"){const o=c[a.stepName];if(!o)return i;const s=a.data;(!s.hideTextInCart||!t&&o.text!==void 0&&o.text!==null)&&(i[`${a.stepTitle} text`]=o.text),o.color&&(!s.hideColorInCart||!t)&&(i[`${a.stepTitle} color`]=o.color)}return i},n={};return e.steps.forEach(a=>{Object.assign(n,A(a))}),n},Qn=(c,e,t,A)=>{const n={};let a;if(t){a=je(t,e,!1);for(const i of Object.keys(a))n[i]={value:a[i],priceModifier:0}}else if(A){a=A;for(const i of Object.keys(a))n[i]={value:a[i],priceModifier:0}}for(const i of Object.keys(c)){const o=c[i],s=e.steps.find(r=>r.stepTitle===i);if(o.length===1)n[`${s==null?void 0:s.stepTitle} selection`]={value:o[0].name,priceModifier:o[0].priceModifier};else if(o.length>1)for(let r=0;r<o.length;r++)n[`${s==null?void 0:s.stepTitle} selection ${r+1}`]={value:o[r].name,priceModifier:o[r].priceModifier}}return n},Ot=(c,e,t,A,n,a,i,o)=>{var E,C;const s=e.basePrice||0,r=c.priceModifierTotal||0,l=Qn(A,t,void 0,a),B=(P.getMap("transactionOwnerIds")||new Map).get(c.id),w={additionalExternalProductId:(E=c.integrationProduct)==null?void 0:E.additionalExternalProductId,additionalExternalVariantId:(C=c.integrationProduct)==null?void 0:C.additionalExternalVariantId,baseCost:s,designProductId:c.externalDesignProductId,designProductVariantId:c.externalDesignProductVariantId,event:"onComplete",exportedData:l,externalCartProductId:c.externalCartProductId,externalCartProductVariantId:c.externalCartProductVariantId,lineItemImageUrl:i||"",optionsCost:r,processExecutionId:o,quantity:c.quantity,transactionId:c.id,transactionOwnerId:B,weight:e.weight,workflowViewerLink:c.workflowViewerLink||"",workflowViewerReadOnlyLink:c.workflowViewerReadOnlyLink||""};return a&&(w.metadata=a),A&&(w.selectedVariants=A),n&&(w.sku=n),w},zt=async(c,e,t,A,n,a,i,o,s,r)=>{var S;await(async()=>{var T;if(r!==void 0)return r;await c.outstandingRequestsPromise();const x=(P.getMap("transactionOwnerIds")||new Map).get(n.id),H=await N.getShadowGraphqlClient().query({query:ht,variables:{ids:[n.id]},fetchPolicy:"no-cache",errorPolicy:"all",context:{transactionOwnerId:x}}),R=(T=H.data)==null?void 0:T.transactions[0].workflowState;return H.errors?(H.errors.forEach(
|
|
1963
|
+
`,hn=async c=>{var t;return(t=(await N.getShadowGraphqlClient().mutate({mutation:wn,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:c.name,layouts:c.layouts,workflowId:c.workflowId,transactionId:c.transactionId,previewImage:c.previewImage,useThreeDimPreview:c.useThreeDimPreview,metadata:c.metadata,selectedVariants:c.selectedVariants}})).data)==null?void 0:t.designCreate},Cn=async c=>{var t;return(t=(await N.getShadowGraphqlClient().mutate({mutation:En,errorPolicy:"all",fetchPolicy:"no-cache",variables:{inputs:c.map(A=>({name:A.name,layouts:A.layouts,workflowId:A.workflowId,transactionId:A.transactionId,previewImage:A.previewImage,useThreeDimPreview:A.useThreeDimPreview,metadata:A.metadata,selectedVariants:A.selectedVariants}))}})).data)==null?void 0:t.designCreateMany},je=(c,e,t)=>{const A=a=>{const i={};if(a.type==="Frame"){const o=c[a.stepName],s=a.data;if(!o||!o.image||s.hideImageInCart&&t)return i;i[`${a.stepTitle} image`]=o.image}if(a.type==="Illustration"){const o=c[a.stepName],s=a.data;if(!o||s.hideColorsInCart&&t||!o.colors)return i;if(o.colors.length>0){const r=o.colors.join(", ").toUpperCase();i[`${a.stepTitle} colors`]=r}}if(a.type==="Module"){const o=c[a.stepName],s=a.data;if(!o||o.text===void 0||o.text===null||s.hideTextInCart&&t)return i;i[`${a.stepTitle} text`]=o.text}if(a.type==="Text"){const o=c[a.stepName];if(!o)return i;const s=a.data;(!s.hideTextInCart||!t&&o.text!==void 0&&o.text!==null)&&(i[`${a.stepTitle} text`]=o.text),o.color&&(!s.hideColorInCart||!t)&&(i[`${a.stepTitle} color`]=o.color)}return i},n={};return e.steps.forEach(a=>{Object.assign(n,A(a))}),n},Qn=(c,e,t,A)=>{const n={};let a;if(t){a=je(t,e,!1);for(const i of Object.keys(a))n[i]={value:a[i],priceModifier:0}}else if(A){a=A;for(const i of Object.keys(a))n[i]={value:a[i],priceModifier:0}}for(const i of Object.keys(c)){const o=c[i],s=e.steps.find(r=>r.stepTitle===i);if(o.length===1)n[`${s==null?void 0:s.stepTitle} selection`]={value:o[0].name,priceModifier:o[0].priceModifier};else if(o.length>1)for(let r=0;r<o.length;r++)n[`${s==null?void 0:s.stepTitle} selection ${r+1}`]={value:o[r].name,priceModifier:o[r].priceModifier}}return n},Ot=(c,e,t,A,n,a,i,o)=>{var E,C;const s=e.basePrice||0,r=c.priceModifierTotal||0,l=Qn(A,t,void 0,a),B=(P.getMap("transactionOwnerIds")||new Map).get(c.id),w={additionalExternalProductId:(E=c.integrationProduct)==null?void 0:E.additionalExternalProductId,additionalExternalVariantId:(C=c.integrationProduct)==null?void 0:C.additionalExternalVariantId,baseCost:s,designProductId:c.externalDesignProductId,designProductVariantId:c.externalDesignProductVariantId,event:"onComplete",exportedData:l,externalCartProductId:c.externalCartProductId,externalCartProductVariantId:c.externalCartProductVariantId,lineItemImageUrl:i||"",optionsCost:r,processExecutionId:o,quantity:c.quantity,transactionId:c.id,transactionOwnerId:B,weight:e.weight,workflowViewerLink:c.workflowViewerLink||"",workflowViewerReadOnlyLink:c.workflowViewerReadOnlyLink||""};return a&&(w.metadata=a),A&&(w.selectedVariants=A),n&&(w.sku=n),w},zt=async(c,e,t,A,n,a,i,o,s,r)=>{var S;await(async()=>{var T;if(r!==void 0)return r;await c.outstandingRequestsPromise();const x=(P.getMap("transactionOwnerIds")||new Map).get(n.id),H=await N.getShadowGraphqlClient().query({query:ht,variables:{ids:[n.id]},fetchPolicy:"no-cache",errorPolicy:"all",context:{transactionOwnerId:x}}),R=(T=H.data)==null?void 0:T.transactions[0].workflowState;return H.errors?(H.errors.forEach(b=>{H.errors&&console.log("Server Error:",b.message)}),null):R??null})()||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(A())),await c.updateStateWithServerImmediate(A),console.log("Server state is undefined @ Workflow completion"));const B=c.getPreviewService(),w=(S=e==null?void 0:e.finalizeStepConfig)==null?void 0:S.lookAtAnimation,E=B&&e.showModelOnFinishStep&&!!w,C=s&&je(s,e,!0),h=s&&je(s,e,!1),m=async y=>{const x={};let Y=0;if(Object.keys(a).length>0)for(const H of Object.keys(a)){const R=a[H],T=e.steps.find(b=>b.stepName===H);for(let b=0;b<R.selections.length;++b){const z=R.selections[b];if(T&&(!y||T.option&&(T.option.variants||[]).length>1&&!T.data.hideSelectionInCart&&!T.data.hideSelectionsInCart)){const $e=T.stepTitle;x[$e]?x[$e].push({id:z.id||"",name:z.name,priceModifier:z.priceModifier}):x[$e]=[{id:z.id||"",name:z.name,priceModifier:z.priceModifier}]}Y+=z.priceModifier}}return[x,Y]},[u]=await m(!0),F=Object.fromEntries(Object.keys(u).map(y=>[y,u[y].map(x=>x.id)])),[I]=await m(!1),f=Object.fromEntries(Object.keys(I).map(y=>[y,I[y].map(x=>x.id)])),D=await o(E,n.id);return{designDetails:(()=>{const y={name:i,layouts:t.map(x=>({index:x.index,panelId:x.panelId})),workflowId:e.id,transactionId:n.id,useThreeDimPreview:!!E,previewImage:D};if(h){const x=[];for(const[Y,H]of Object.entries(h))x.push({key:Y,value:H});y.metadata=x}if(F){const x=[];for(const[Y,H]of Object.entries(f))x.push({key:Y,ids:H});y.selectedVariants=x}return y})(),cartSelectionsWithPrices:u,cartMetadata:C}},jt=async(c,e,t,A,n,a,i,o,s,r,l)=>{var m,u;s("workflow.steps.finish.finalize.buildingLayouts");const{designDetails:d,cartSelectionsWithPrices:B,cartMetadata:w}=await zt(c,e,t,A,a,i,o,r,l);s("workflow.steps.finish.finalize.creatingDesign");const E=await hn(d),C=(m=E==null?void 0:E.transaction)==null?void 0:m.previewImageLink;if(!(E!=null&&E.transaction))throw new Error("Failed to create design");s("workflow.steps.finish.finalize.updatingTransaction");const h=E.transaction;return Ot(h,n,e,B,E==null?void 0:E.sku,w,C,(u=E==null?void 0:E.processExecution)==null?void 0:u.id)},un=async(c,e,t)=>{e("workflow.steps.finish.finalize.buildingLayouts"),await Promise.all(c.map(async o=>{await o.workflowManager.outstandingRequestsPromise()}));const n=await(async()=>{var r;const s=await N.getShadowGraphqlClient().query({query:ht,variables:{ids:c.map(l=>l.transaction.id)},fetchPolicy:"no-cache",errorPolicy:"all"});return s.errors?(s.errors.forEach(l=>{s.errors&&console.log("Server Error:",l.message)}),null):(r=s.data)!=null&&r.transactions?s.data.transactions.map(l=>l.workflowState??null):null})(),a=await Promise.all(c.map(async(o,s)=>await zt(o.workflowManager,o.workflow,o.layouts,o.getReducerState,o.transaction,o.workflowSelections,o.designName,t??(()=>Promise.resolve(void 0)),o.workflowMetadata,n?n[s]:void 0)));e("workflow.steps.finish.finalize.creatingDesign");const i=await Cn(a.map(o=>o.designDetails));if(!i)throw new Error("Failed to create designs");return e("workflow.steps.finish.finalize.updatingTransaction"),i.map((o,s)=>{var B;const r=c[s],l=a[s],d=o.transaction;return Ot(d,r.product,r.workflow,l.cartSelectionsWithPrices,o.sku,l.cartMetadata,void 0,(B=o.processExecution)==null?void 0:B.id)})};class mn{constructor(){this.localPersistenceKey="designTransactions",this.storageMethod="Local",this.designSavedListeners=[]}attachSaveListener(e){this.designSavedListeners.push(e)}detachSaveListener(e){this.designSavedListeners=this.designSavedListeners.filter(t=>t!==e)}async getSavedDesigns(){if(this.storageMethod==="Local"){const e=P.get(this.localPersistenceKey);return e?JSON.parse(e):[]}throw new v("Unexpected storage method requested")}async getSavedDesignByTransaction(e){return(await this.getSavedDesigns()).find(A=>A.transactionId===e)}async addDesign(e){const A=(await this.getSavedDesigns()).filter(n=>n.transactionId!==e.transactionId);A.unshift(e),await this.setDesigns(A),this.designSavedListeners.forEach(n=>n(e))}async renameDesign(e,t){const A=await this.getSavedDesigns(),n=A.find(a=>a.transactionId===e);if(!n)throw new Error(`No saved design for transaction ${e}.`);n.title=t,await this.setDesigns(A)}async removeDesign(e){const t=await this.getSavedDesigns();await this.setDesigns(t.filter(A=>A.transactionId!==e))}async setDesigns(e){if(this.storageMethod==="Local"){P.set(this.localPersistenceKey,JSON.stringify(e));return}throw new v("Unexpected storage method requested")}}const Fe=new mn,In=M.gql`
|
|
1964
1964
|
mutation AddTransactionStakeholder($id: String!, $type: String!, $details: CustomerDetailsInput!) {
|
|
1965
1965
|
transactionAddStakeholder(id: $id, details: $details, type: $type) {
|
|
1966
1966
|
id
|
|
@@ -1974,7 +1974,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
|
|
|
1974
1974
|
}
|
|
1975
1975
|
}
|
|
1976
1976
|
}
|
|
1977
|
-
`;var Kt=(c=>(c.QuantityChanged="QuantityChanged",c))(Kt||{});class le{constructor(e,t){var n;if(this.cachedStepHandles=new Map,this.renderableScenes=[],this.renderableSceneCallbacks=[],this.eventCallbacks=new Map,this.debouncedSavedDesignUpdate=tt(async()=>{await Fe.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()},2500),this.getCanvasObjectURLAsync=async a=>new Promise((i,o)=>{try{a.toBlob(s=>{if(s){const r=URL.createObjectURL(s);i(r)}})}catch(s){o(s)}}),!t.workflow)throw new Error("No Workflow ID provided.");this.client=e;const A=t.layouts;this.commandContext=new g.CommandContext,this.commandContext.initialize(A,t.reloadedState),this.isReadOnly=t.transaction.isOrdered||!!t.readOnly,this.workflowManager=new dn(t.workflow,((n=t.product.profanities)==null?void 0:n.map(a=>a.word))||[],A,this.commandContext,a=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return t.stateMutationFunc(a)},t.transaction,t.product,t.previewService,t.renderableContextService,t.reloadedState,t.readOnly,t.modelContainer,t.isReloadedTransaction,t.singleVariantsRenderable,t.delayWorkflowStateSync),this.workflowManager.addSelectionCallback(a=>{const i=a.traversableScenes.map(o=>{const s=o.renderableSteps.map(r=>r.stepName);return{id:o.name,title:o.title,renderableSteps:s,workflowScene:o}});this.renderableScenes=i,this.renderableSceneCallbacks.forEach(o=>o(i))})}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async createPreviewImage(e,t){var u,F;const A=this.workflowManager.getWorkflow(),n=(u=A==null?void 0:A.finalizeStepConfig)==null?void 0:u.lookAtAnimation;if(e){if(!n)throw new Error("Failed to generate cart preview image!");return await((F=this.workflowManager.getPreviewService())==null?void 0:F.renderSceneScreenshot(t??512,n))||""}let a=2048;t&&t<=2048&&(a=t);const i=g.createCanvas(a,a),o=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,r=A.panels[s],l=o.find(I=>{var f;return((f=I.layoutState)==null?void 0:f.layout.panelId)===(r==null?void 0:r.name)})||o[0],d=l.layoutState.layout.previewRegion?{x:l.layoutState.layout.previewRegion.left,y:l.layoutState.layout.previewRegion.top,width:l.layoutState.layout.previewRegion.width,height:l.layoutState.layout.previewRegion.height}:{x:0,y:0,width:l.layoutState.layout.width,height:l.layoutState.layout.height},B=this.commandContext.getLayoutById(l.layoutState.layout.id),w=i.getContext("2d");if(!w)throw new Ce("Failed to obtain 2D context for preview image creation");const E=g.getSvgElement(B.layoutState.layout,B.layoutState.elements,{renderingConfiguration:{purpose:g.LayoutRenderingPurpose.Print,region:{left:d.x,top:d.y,width:d.width,height:d.height}}}),C=g.renderPapyrusComponentAsString(E);await(await et.Pith.from(w,C,{anonymousCrossOrigin:!0,ignoreDimensions:!1,createCanvas:g.createCanvas,createImage:g.loadImage,DOMParser:g.getDomParser(),fetch:g.fetch})).render();const m=await this.getCanvasObjectURLAsync(i);return i.toDataURL(m)}getStepById(e){const t=this.getWorkflowManager().getWorkflow().steps.find(a=>a.stepName===e);if(!t||!this.stepHasHandle(t))return;const A=this.cachedStepHandles.get(t.stepName);if(A)return A;const n=pe.get(this.getWorkflowManager(),t);return this.cachedStepHandles.set(t.stepName,n),n}getSteps(){return this.getScenes().flatMap(e=>this.getStepsByScene(e))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map(t=>({id:t.id,name:t.name,stepIds:t.stepNames}))}getSelectionPriceSubunits(){const e=this.getWorkflowManager().getWorkflowSelections();let t=0;return Object.values(e).forEach(A=>{t+=A.selections.reduce((n,a)=>n+(a.priceModifier||0),0)}),t}getBasePriceSubunits(e){const t=this.getWorkflowManager().getProduct().basePrice||0;if(e){const A=this.getAdditionalProductPriceSubunits()||0;return t+A}return t}getAdditionalProductPriceSubunits(){var t;const e=this.getWorkflowManager().getTransaction().integrationProduct;if((t=e==null?void 0:e.additionalIntegrationProduct)!=null&&t.product)return e.additionalIntegrationProduct.product.basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}async copySelectionsViaGlobalConfiguration(e,t,A){const n=await e.getGlobalProperties(),a=A==null?void 0:A.map(r=>r.getId()),i=this.getSteps().filter(r=>a===void 0||a.includes(r.getId())),o=t.getSteps(),s=r=>n.find(l=>l.getRawProperty().name===r.aspectName);i.forEach(r=>{const l=new Set,d=r.getRaw().globalPropertyAspectConfigurations;d!==void 0&&(d.forEach(B=>l.add(JSON.stringify(B))),o.forEach(B=>{const w=B.getRaw().globalPropertyAspectConfigurations;w!==void 0&&w.forEach(E=>{const C=s(E),h=l.has(JSON.stringify(E));if(h&&(C==null?void 0:C.getType())==="Option"){const m=B.getCurrentVariant();if(!m)return;r.selectVariant(m),l.delete(JSON.stringify(E))}else if(h&&(C==null?void 0:C.getType())==="Text"){const m=B.getText();r.setText(m),l.delete(JSON.stringify(E))}})}))})}getStepByName(e){const t=this.getWorkflowManager().getWorkflow().steps.find(A=>A.stepTitle===e);if(!(!t||!this.stepHasHandle(t)))return pe.get(this.getWorkflowManager(),t)}getStepsByType(e){return this.getWorkflowManager().getWorkflow().steps.filter(t=>t.type===e).map(t=>pe.get(this.getWorkflowManager(),t))}getStepsByScene(e){if(!this.getWorkflowManager().getWorkflow().stepGroups.find(A=>A.name===e.name))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return e.stepIds.map(A=>this.getWorkflowManager().getWorkflow().steps.find(n=>n.stepName===A)).filter(A=>this.stepHasHandle(A)).map(A=>pe.get(this.getWorkflowManager(),A))}async attachCustomerDetails(e){return this.assignCustomerDetails({emailAddress:e.email})}async assignCustomerDetails(e){var i,o,s;const A=(P.getMap("transactionOwnerIds")||new Map).get(this.getWorkflowManager().getTransaction().id),a=(s=(o=(i=(await N.getShadowGraphqlClient().mutate({mutation:In,variables:{id:this.getWorkflowManager().getTransaction().id,details:e,type:"Owner"},context:{transactionOwnerId:A}})).data)==null?void 0:i.transactionAddStakeholder)==null?void 0:o.stakeholders)==null?void 0:s.find(r=>{var l;return((l=r.customer)==null?void 0:l.emailAddress)===e.emailAddress});if(a!=null&&a.customer){this.getWorkflowManager().setTransactionCustomer(a.customer);const r=P.getMap("transactionCustomerIds")||new Map;r.set(this.getWorkflowManager().getTransaction().id,a.customer.id),P.setMap("transactionCustomerIds",r)}}attachRenderableSceneListener(e){this.renderableSceneCallbacks.push(e),e(this.renderableScenes)}detachRenderableSceneListener(e){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter(t=>t!==e)}async save(e){if(!this.getCommandContext().getState())throw new v("State undefined!");const n={title:await(async()=>{var s;if(e)return e;const a=this.getWorkflowManager().getTransaction().id,o=(s=(await Fe.getSavedDesigns()).find(r=>r.transactionId===a))==null?void 0:s.title;return o||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await Fe.addDesign(n),n}async copy(){var o;const e=Ee(this.getCommandContext().getState());if(!e)throw new v("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(e.transaction),A=this.getWorkflowManager().getWorkflow(),n=new oA({}),a=(o=this.getWorkflowManager().getTransaction().integrationProduct)==null?void 0:o.id;if(!a)throw new v("Integration product id is undefined!");return await n.initFromIntegrationProduct(a),await n.getWorkflowExperience(A.id,t,void 0)}async onDesignFinished(e,t=!0){return jt(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),()=>this.commandContext.getState(),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,e||(()=>{}),A=>t?this.createPreviewImage(A,1024):Promise.resolve(void 0),this.workflowManager.getWorkflowMetadata())}stepHasHandle(e){return e.type!==g.StepType.SilentIllustration&&e.type!==g.StepType.ProductOverlay}getExportedData(){var n;const e=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach(a=>{const i=this.workflowManager.getWorkflow().steps.find(s=>s.stepName===a);if(!i)return;e.has(i.stepTitle)||e.set(i.stepTitle,{});const o=t[a];Object.keys(o).forEach(s=>{e.get(i.stepTitle)[s]=o[s]})}),(n=Object.keys(A))==null||n.forEach(a=>{const i=this.workflowManager.getWorkflow().steps.find(o=>o.stepName===a);i&&(e.has(i.stepTitle)||e.set(i.stepTitle,{}),e.get(i.stepTitle).selection=A[a].selections[0].name)}),e}getQuantity(){return this.getWorkflowManager().getTransaction().quantity||1}async setQuantity(e){if(e<1)throw new RangeError("WorkflowExperience quantity must be greater than zero.");if(this.isReadOnly)throw new Error("Cannot update quantity on a read-only WorkflowExperience");this.getWorkflowManager().getTransaction().quantity=e,this.callEvent("QuantityChanged");const t=P.getMap("transactionOwnerIds")||new Map,A=this.getWorkflowManager().getTransaction(),n=t.get(A.id)||void 0;await N.getShadowGraphqlClient().mutate({mutation:UA,variables:{id:A.id,quantity:e},context:{transactionOwnerId:n}})}addEventListener(e,t){const A=this.eventCallbacks.get(e)||[];A.push(t),this.eventCallbacks.set(e,A)}removeEventListener(e,t){const A=this.eventCallbacks.get(e)||[];this.eventCallbacks.set(e,A.filter(n=>n!==t))}callEvent(e){(this.eventCallbacks.get(e)||[]).forEach(t=>t(this))}}const fn=["altGlyph","circle","ellipse","path","polygon","polyline","rect","text","textPath","tref","tspan"],Dn=async(c,e,t)=>{const A=e.data,n=t.data.baseUrl,a=A.assetUrl.replace("localhost","localstack"),i=n.slice(0,4)==="http"?"":"https://",o=new URL(i+n);o.searchParams.append("video",g.toBase64(JSON.stringify([{href:a}]))),o.pathname=o.pathname+(o.pathname.slice(-1)==="/"?"":"/");const s=o.toString(),l=`data:image/svg+xml;base64,${g.toBase64(await nt.toString(s,{type:"svg"}))}`,d=w=>{const E=c.find(h=>h.panelId===w.panelId);if(!E)throw new b(w);const C=g.generate();return new g.CreateElementCommand({id:C,src:l,type:g.LayoutElementType.Image,y:w.top,x:w.left,width:w.width,height:w.height,rotation:0},E)},B=t.data.regions;try{return B.map(d)}catch(w){return console.error(w),[]}},pn=async(c,e,t,A)=>{const n=t.data,a=n.assetUrl,i=await g.getPatternImageData(a);try{const o=g.getVariant(n,A.option);o&&(e[A.stepName]={selectedVariants:[o]});const s=async r=>{var C;const l=await g.generateFrameSVG(r||{width:1,height:1},(C=o==null?void 0:o.asset)==null?void 0:C.fileLink),d=await g.getFrameData(l),B=g.generate(),w=c.find(h=>h.panelId===r.panelId);if(!w)throw new b(r);const E=g.calculateOffsets(i,d,{scale:n.scale,left:n.x,top:n.y});return[new g.CreateElementCommand({id:B,path:d.path,dataWidth:d.width,dataHeight:d.height,type:g.LayoutElementType.Frame,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,forceImageCover:A.data.forceImageCover,x:r.left,y:r.top,width:r.width,height:r.height,layer:r.layer,layerIndex:r.layerIndex,rotation:r.rotation,scaleX:r.width/d.width,scaleY:r.height/d.height,pattern:void 0},w),new g.UpdateFramePattern(B,i,E)]};return(await Promise.all(A.data.regions.map(r=>s(r)))).flat()}catch(o){return console.error(o),[]}},Fn=async(c,e,t,A)=>{var f,D;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((f=a.variants)==null?void 0:f.find(p=>p.id===n.illustrationVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.illustrationVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${n.illustrationVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(D=i.asset)==null?void 0:D.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${n.illustrationVariantId}`),[];const s=await g.fetchAsString(o,!0),r=/<svg.*?<\/svg>/s,l=s.match(r)||[],d=(l==null?void 0:l.length)>0?l[0]:"",E=g.domParser().parseFromString(d,"image/svg+xml").firstElementChild;if(!E)return console.error("Failed to read SVG."),[];g.sanitizeSvgTree(E);const C={};g.traverse(E,p=>{fn.includes(p.tagName)&&!p.attributes.getNamedItem("fill")&&p.setAttribute("fill","#000000");const S=p.attributes.getNamedItem("fill");if(S&&S.value!=="none"){const x=S.value,H=`spiff-fill-${x.replace(/\W/g,"")}`;p.classList.add(H),C[H]={browserValue:x}}const y=p.attributes.getNamedItem("stroke");if(y&&y.value!=="none"){const x=y.value,H=`spiff-stroke-${x.replace(/\W/g,"")}`;p.classList.add(H),C[H]={browserValue:x}}});const m=g.xmlSerializer().serializeToString(E),u=n.colors;if(u){for(const[p,S]of Object.entries(C))for(const y of Object.keys(u))if(S.browserValue===y){C[p]={browserValue:u[y]};break}}const F=p=>{const S=c.find(x=>x.panelId===p.panelId);if(!S)throw new b(p);const y=g.generate();return new g.CreateElementCommand({colors:C,id:y,svg:m,type:g.LayoutElementType.Illustration,y:p.top,x:p.left,rotation:p.rotation,width:p.width,height:p.height,layer:p.layer,layerIndex:p.layerIndex,immutable:p.immutable},S)},I=A.data.regions;try{return I.map(F)}catch(p){return console.error(p),[]}},Mn=async(c,e,t)=>{const A=await xt(t.data.module),n=e.data,a=(o,s)=>{const r=c.find(d=>d.panelId===s.panelId);if(!r)throw new b(s);const l=g.generate();return new g.CreateElementCommand({colors:{},id:l,svg:o,type:g.LayoutElementType.Illustration,y:s.top,x:s.left,rotation:s.rotation,width:s.width,height:s.height,layer:s.layer,layerIndex:s.layerIndex},r)},i=t.data.regions;try{return i.map(o=>a(A.svgPrint(n.text,o),o))}catch(o){return console.error(o),[]}},Sn=async(c,e,t,A)=>{var l,d;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((l=a.variants)==null?void 0:l.find(B=>B.id===n.pictureVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.pictureVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${n.pictureVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(d=i.asset)==null?void 0:d.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${n.pictureVariantId}`),[];const s=B=>{const w=c.find(C=>C.panelId===B.panelId);if(!w)throw new b(B);const E=g.generate();return new g.CreateElementCommand({id:E,src:o,type:g.LayoutElementType.Image,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable,preserveAspectRatio:"none"},w)},r=A.data.regions;try{return r.map(s)}catch(B){return console.error(B),[]}},yn=async(c,e,t,A)=>{var r;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((r=a.variants)==null?void 0:r.find(l=>l.id===n.colorVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.colorVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=l=>{const d=c.find(h=>h.panelId===l.panelId);if(!d)throw new b(l);const B=`
|
|
1977
|
+
`;var Kt=(c=>(c.QuantityChanged="QuantityChanged",c))(Kt||{});class le{constructor(e,t){var n;if(this.cachedStepHandles=new Map,this.renderableScenes=[],this.renderableSceneCallbacks=[],this.eventCallbacks=new Map,this.debouncedSavedDesignUpdate=tt(async()=>{await Fe.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()},2500),this.getCanvasObjectURLAsync=async a=>new Promise((i,o)=>{try{a.toBlob(s=>{if(s){const r=URL.createObjectURL(s);i(r)}})}catch(s){o(s)}}),!t.workflow)throw new Error("No Workflow ID provided.");this.client=e;const A=t.layouts;this.commandContext=new g.CommandContext,this.commandContext.initialize(A,t.reloadedState),this.isReadOnly=t.transaction.isOrdered||!!t.readOnly,this.workflowManager=new dn(t.workflow,((n=t.product.profanities)==null?void 0:n.map(a=>a.word))||[],A,this.commandContext,a=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return t.stateMutationFunc(a)},t.transaction,t.product,t.previewService,t.renderableContextService,t.reloadedState,t.readOnly,t.modelContainer,t.isReloadedTransaction,t.singleVariantsRenderable,t.delayWorkflowStateSync),this.workflowManager.addSelectionCallback(a=>{const i=a.traversableScenes.map(o=>{const s=o.renderableSteps.map(r=>r.stepName);return{id:o.name,title:o.title,renderableSteps:s,workflowScene:o}});this.renderableScenes=i,this.renderableSceneCallbacks.forEach(o=>o(i))})}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async createPreviewImage(e,t){var u,F;const A=this.workflowManager.getWorkflow(),n=(u=A==null?void 0:A.finalizeStepConfig)==null?void 0:u.lookAtAnimation;if(e){if(!n)throw new Error("Failed to generate cart preview image!");return await((F=this.workflowManager.getPreviewService())==null?void 0:F.renderSceneScreenshot(t??512,n))||""}let a=2048;t&&t<=2048&&(a=t);const i=g.createCanvas(a,a),o=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,r=A.panels[s],l=o.find(I=>{var f;return((f=I.layoutState)==null?void 0:f.layout.panelId)===(r==null?void 0:r.name)})||o[0],d=l.layoutState.layout.previewRegion?{x:l.layoutState.layout.previewRegion.left,y:l.layoutState.layout.previewRegion.top,width:l.layoutState.layout.previewRegion.width,height:l.layoutState.layout.previewRegion.height}:{x:0,y:0,width:l.layoutState.layout.width,height:l.layoutState.layout.height},B=this.commandContext.getLayoutById(l.layoutState.layout.id),w=i.getContext("2d");if(!w)throw new Ce("Failed to obtain 2D context for preview image creation");const E=g.getSvgElement(B.layoutState.layout,B.layoutState.elements,{renderingConfiguration:{purpose:g.LayoutRenderingPurpose.Print,region:{left:d.x,top:d.y,width:d.width,height:d.height}}}),C=g.renderPapyrusComponentAsString(E);await(await et.Pith.from(w,C,{anonymousCrossOrigin:!0,ignoreDimensions:!1,createCanvas:g.createCanvas,createImage:g.loadImage,DOMParser:g.getDomParser(),fetch:g.fetch})).render();const m=await this.getCanvasObjectURLAsync(i);return i.toDataURL(m)}getStepById(e){const t=this.getWorkflowManager().getWorkflow().steps.find(a=>a.stepName===e);if(!t||!this.stepHasHandle(t))return;const A=this.cachedStepHandles.get(t.stepName);if(A)return A;const n=pe.get(this.getWorkflowManager(),t);return this.cachedStepHandles.set(t.stepName,n),n}getSteps(){return this.getScenes().flatMap(e=>this.getStepsByScene(e))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map(t=>({id:t.id,name:t.name,stepIds:t.stepNames}))}getSelectionPriceSubunits(){const e=this.getWorkflowManager().getWorkflowSelections();let t=0;return Object.values(e).forEach(A=>{t+=A.selections.reduce((n,a)=>n+(a.priceModifier||0),0)}),t}getBasePriceSubunits(e){const t=this.getWorkflowManager().getProduct().basePrice||0;if(e){const A=this.getAdditionalProductPriceSubunits()||0;return t+A}return t}getAdditionalProductPriceSubunits(){var t;const e=this.getWorkflowManager().getTransaction().integrationProduct;if((t=e==null?void 0:e.additionalIntegrationProduct)!=null&&t.product)return e.additionalIntegrationProduct.product.basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}async copySelectionsViaGlobalConfiguration(e,t,A){const n=await e.getGlobalProperties(),a=A==null?void 0:A.map(r=>r.getId()),i=this.getSteps().filter(r=>a===void 0||a.includes(r.getId())),o=t.getSteps(),s=r=>n.find(l=>l.getRawProperty().name===r.aspectName);i.forEach(r=>{const l=new Set,d=r.getRaw().globalPropertyAspectConfigurations;d!==void 0&&(d.forEach(B=>l.add(JSON.stringify(B))),o.forEach(B=>{const w=B.getRaw().globalPropertyAspectConfigurations;w!==void 0&&w.forEach(E=>{const C=s(E),h=l.has(JSON.stringify(E));if(h&&(C==null?void 0:C.getType())==="Option"){const m=B.getCurrentVariant();if(!m)return;r.selectVariant(m),l.delete(JSON.stringify(E))}else if(h&&(C==null?void 0:C.getType())==="Text"){const m=B.getText();r.setText(m),l.delete(JSON.stringify(E))}})}))})}getStepByName(e){const t=this.getWorkflowManager().getWorkflow().steps.find(A=>A.stepTitle===e);if(!(!t||!this.stepHasHandle(t)))return pe.get(this.getWorkflowManager(),t)}getStepsByType(e){return this.getWorkflowManager().getWorkflow().steps.filter(t=>t.type===e).map(t=>pe.get(this.getWorkflowManager(),t))}getStepsByScene(e){if(!this.getWorkflowManager().getWorkflow().stepGroups.find(A=>A.name===e.name))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return e.stepIds.map(A=>this.getWorkflowManager().getWorkflow().steps.find(n=>n.stepName===A)).filter(A=>this.stepHasHandle(A)).map(A=>pe.get(this.getWorkflowManager(),A))}async attachCustomerDetails(e){return this.assignCustomerDetails({emailAddress:e.email})}async assignCustomerDetails(e){var i,o,s;const A=(P.getMap("transactionOwnerIds")||new Map).get(this.getWorkflowManager().getTransaction().id),a=(s=(o=(i=(await N.getShadowGraphqlClient().mutate({mutation:In,variables:{id:this.getWorkflowManager().getTransaction().id,details:e,type:"Owner"},context:{transactionOwnerId:A}})).data)==null?void 0:i.transactionAddStakeholder)==null?void 0:o.stakeholders)==null?void 0:s.find(r=>{var l;return((l=r.customer)==null?void 0:l.emailAddress)===e.emailAddress});if(a!=null&&a.customer){this.getWorkflowManager().setTransactionCustomer(a.customer);const r=P.getMap("transactionCustomerIds")||new Map;r.set(this.getWorkflowManager().getTransaction().id,a.customer.id),P.setMap("transactionCustomerIds",r)}}attachRenderableSceneListener(e){this.renderableSceneCallbacks.push(e),e(this.renderableScenes)}detachRenderableSceneListener(e){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter(t=>t!==e)}async save(e){if(!this.getCommandContext().getState())throw new v("State undefined!");const n={title:await(async()=>{var s;if(e)return e;const a=this.getWorkflowManager().getTransaction().id,o=(s=(await Fe.getSavedDesigns()).find(r=>r.transactionId===a))==null?void 0:s.title;return o||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await Fe.addDesign(n),n}async copy(){var o;const e=Ee(this.getCommandContext().getState());if(!e)throw new v("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(e.transaction),A=this.getWorkflowManager().getWorkflow(),n=new oA({}),a=(o=this.getWorkflowManager().getTransaction().integrationProduct)==null?void 0:o.id;if(!a)throw new v("Integration product id is undefined!");return await n.initFromIntegrationProduct(a),await n.getWorkflowExperience(A.id,t,void 0)}async onDesignFinished(e,t=!0){return jt(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),()=>this.commandContext.getState(),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,e||(()=>{}),A=>t?this.createPreviewImage(A,1024):Promise.resolve(void 0),this.workflowManager.getWorkflowMetadata())}stepHasHandle(e){return e.type!==g.StepType.SilentIllustration&&e.type!==g.StepType.ProductOverlay}getExportedData(){var n;const e=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach(a=>{const i=this.workflowManager.getWorkflow().steps.find(s=>s.stepName===a);if(!i)return;e.has(i.stepTitle)||e.set(i.stepTitle,{});const o=t[a];Object.keys(o).forEach(s=>{e.get(i.stepTitle)[s]=o[s]})}),(n=Object.keys(A))==null||n.forEach(a=>{const i=this.workflowManager.getWorkflow().steps.find(o=>o.stepName===a);i&&(e.has(i.stepTitle)||e.set(i.stepTitle,{}),e.get(i.stepTitle).selection=A[a].selections[0].name)}),e}getQuantity(){return this.getWorkflowManager().getTransaction().quantity||1}async setQuantity(e){if(e<1)throw new RangeError("WorkflowExperience quantity must be greater than zero.");if(this.isReadOnly)throw new Error("Cannot update quantity on a read-only WorkflowExperience");this.getWorkflowManager().getTransaction().quantity=e,this.callEvent("QuantityChanged");const t=P.getMap("transactionOwnerIds")||new Map,A=this.getWorkflowManager().getTransaction(),n=t.get(A.id)||void 0;await N.getShadowGraphqlClient().mutate({mutation:UA,variables:{id:A.id,quantity:e},context:{transactionOwnerId:n}})}addEventListener(e,t){const A=this.eventCallbacks.get(e)||[];A.push(t),this.eventCallbacks.set(e,A)}removeEventListener(e,t){const A=this.eventCallbacks.get(e)||[];this.eventCallbacks.set(e,A.filter(n=>n!==t))}callEvent(e){(this.eventCallbacks.get(e)||[]).forEach(t=>t(this))}}const fn=["altGlyph","circle","ellipse","path","polygon","polyline","rect","text","textPath","tref","tspan"],Dn=async(c,e,t)=>{const A=e.data,n=t.data.baseUrl,a=A.assetUrl.replace("localhost","localstack"),i=n.slice(0,4)==="http"?"":"https://",o=new URL(i+n);o.searchParams.append("video",g.toBase64(JSON.stringify([{href:a}]))),o.pathname=o.pathname+(o.pathname.slice(-1)==="/"?"":"/");const s=o.toString(),l=`data:image/svg+xml;base64,${g.toBase64(await nt.toString(s,{type:"svg"}))}`,d=w=>{const E=c.find(h=>h.panelId===w.panelId);if(!E)throw new J(w);const C=g.generate();return new g.CreateElementCommand({id:C,src:l,type:g.LayoutElementType.Image,y:w.top,x:w.left,width:w.width,height:w.height,rotation:0},E)},B=t.data.regions;try{return B.map(d)}catch(w){return console.error(w),[]}},pn=async(c,e,t,A)=>{const n=t.data,a=n.assetUrl,i=await g.getPatternImageData(a);try{const o=g.getVariant(n,A.option);o&&(e[A.stepName]={selectedVariants:[o]});const s=async r=>{var C;const l=await g.generateFrameSVG(r||{width:1,height:1},(C=o==null?void 0:o.asset)==null?void 0:C.fileLink),d=await g.getFrameData(l),B=g.generate(),w=c.find(h=>h.panelId===r.panelId);if(!w)throw new J(r);const E=g.calculateOffsets(i,d,{scale:n.scale,left:n.x,top:n.y});return[new g.CreateElementCommand({id:B,path:d.path,dataWidth:d.width,dataHeight:d.height,type:g.LayoutElementType.Frame,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,forceImageCover:A.data.forceImageCover,x:r.left,y:r.top,width:r.width,height:r.height,layer:r.layer,layerIndex:r.layerIndex,rotation:r.rotation,scaleX:r.width/d.width,scaleY:r.height/d.height,pattern:void 0},w),new g.UpdateFramePattern(B,i,E)]};return(await Promise.all(A.data.regions.map(r=>s(r)))).flat()}catch(o){return console.error(o),[]}},Fn=async(c,e,t,A)=>{var f,D;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((f=a.variants)==null?void 0:f.find(p=>p.id===n.illustrationVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.illustrationVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${n.illustrationVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(D=i.asset)==null?void 0:D.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${n.illustrationVariantId}`),[];const s=await g.fetchAsString(o,!0),r=/<svg.*?<\/svg>/s,l=s.match(r)||[],d=(l==null?void 0:l.length)>0?l[0]:"",E=g.domParser().parseFromString(d,"image/svg+xml").firstElementChild;if(!E)return console.error("Failed to read SVG."),[];g.sanitizeSvgTree(E);const C={};g.traverse(E,p=>{fn.includes(p.tagName)&&!p.attributes.getNamedItem("fill")&&p.setAttribute("fill","#000000");const S=p.attributes.getNamedItem("fill");if(S&&S.value!=="none"){const x=S.value,H=`spiff-fill-${x.replace(/\W/g,"")}`;p.classList.add(H),C[H]={browserValue:x}}const y=p.attributes.getNamedItem("stroke");if(y&&y.value!=="none"){const x=y.value,H=`spiff-stroke-${x.replace(/\W/g,"")}`;p.classList.add(H),C[H]={browserValue:x}}});const m=g.xmlSerializer().serializeToString(E),u=n.colors;if(u){for(const[p,S]of Object.entries(C))for(const y of Object.keys(u))if(S.browserValue===y){C[p]={browserValue:u[y]};break}}const F=p=>{const S=c.find(x=>x.panelId===p.panelId);if(!S)throw new J(p);const y=g.generate();return new g.CreateElementCommand({colors:C,id:y,svg:m,type:g.LayoutElementType.Illustration,y:p.top,x:p.left,rotation:p.rotation,width:p.width,height:p.height,layer:p.layer,layerIndex:p.layerIndex,immutable:p.immutable},S)},I=A.data.regions;try{return I.map(F)}catch(p){return console.error(p),[]}},Mn=async(c,e,t)=>{const A=await xt(t.data.module),n=e.data,a=(o,s)=>{const r=c.find(d=>d.panelId===s.panelId);if(!r)throw new J(s);const l=g.generate();return new g.CreateElementCommand({colors:{},id:l,svg:o,type:g.LayoutElementType.Illustration,y:s.top,x:s.left,rotation:s.rotation,width:s.width,height:s.height,layer:s.layer,layerIndex:s.layerIndex},r)},i=t.data.regions;try{return i.map(o=>a(A.svgPrint(n.text,o),o))}catch(o){return console.error(o),[]}},Sn=async(c,e,t,A)=>{var l,d;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((l=a.variants)==null?void 0:l.find(B=>B.id===n.pictureVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.pictureVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${n.pictureVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(d=i.asset)==null?void 0:d.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${n.pictureVariantId}`),[];const s=B=>{const w=c.find(C=>C.panelId===B.panelId);if(!w)throw new J(B);const E=g.generate();return new g.CreateElementCommand({id:E,src:o,type:g.LayoutElementType.Image,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable,preserveAspectRatio:"none"},w)},r=A.data.regions;try{return r.map(s)}catch(B){return console.error(B),[]}},yn=async(c,e,t,A)=>{var r;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((r=a.variants)==null?void 0:r.find(l=>l.id===n.colorVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.colorVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=l=>{const d=c.find(h=>h.panelId===l.panelId);if(!d)throw new J(l);const B=`
|
|
1978
1978
|
<svg
|
|
1979
1979
|
xmlns="http://www.w3.org/2000/svg"
|
|
1980
1980
|
xmlnsXlink="http://www.w3.org/1999/xlink"
|
|
@@ -1994,7 +1994,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
|
|
|
1994
1994
|
fill="${i==null?void 0:i.color}"
|
|
1995
1995
|
/>
|
|
1996
1996
|
</svg>
|
|
1997
|
-
`,E={"spiff-fill-shape":{browserValue:i.color||"#000000"}},C=g.generate();return new g.CreateElementCommand({colors:E,id:C,svg:B,type:g.LayoutElementType.Illustration,y:l.top,x:l.left,rotation:l.rotation,width:l.width,height:l.height,layer:l.layer,layerIndex:l.layerIndex,immutable:l.immutable},d)},s=A.data.regions;try{return s.map(o)}catch(l){return console.error(l),[]}},Yn=async(c,e,t)=>{const A=[],a=(()=>{var r,l;return e.type===g.StepType.ProductOverlay?t||((r=e.data.asset)==null?void 0:r.fileLink)||"":((l=e.data.asset)==null?void 0:l.fileLink)||""})(),o=(()=>a.endsWith(".jpeg")||a.endsWith(".jpg")||a.endsWith(".png")?g.LayoutElementType.Image:(a.endsWith(".svg"),g.LayoutElementType.Illustration))(),s=e.data.regions;if(o==="image")try{s.forEach(r=>{const l=c.find(B=>B.panelId===r.panelId);if(!l)throw new
|
|
1997
|
+
`,E={"spiff-fill-shape":{browserValue:i.color||"#000000"}},C=g.generate();return new g.CreateElementCommand({colors:E,id:C,svg:B,type:g.LayoutElementType.Illustration,y:l.top,x:l.left,rotation:l.rotation,width:l.width,height:l.height,layer:l.layer,layerIndex:l.layerIndex,immutable:l.immutable},d)},s=A.data.regions;try{return s.map(o)}catch(l){return console.error(l),[]}},Yn=async(c,e,t)=>{const A=[],a=(()=>{var r,l;return e.type===g.StepType.ProductOverlay?t||((r=e.data.asset)==null?void 0:r.fileLink)||"":((l=e.data.asset)==null?void 0:l.fileLink)||""})(),o=(()=>a.endsWith(".jpeg")||a.endsWith(".jpg")||a.endsWith(".png")?g.LayoutElementType.Image:(a.endsWith(".svg"),g.LayoutElementType.Illustration))(),s=e.data.regions;if(o==="image")try{s.forEach(r=>{const l=c.find(B=>B.panelId===r.panelId);if(!l)throw new J(r);const d={id:g.generate(),src:a,type:o,y:r.top,x:r.left,width:r.width,height:r.height,layer:r.layer,layerIndex:r.layerIndex,productOverlay:e.type===g.StepType.ProductOverlay?!0:void 0,scaleX:1,scaleY:1,rotation:r.rotation,excludeFromExport:e.data.excludeFromPrint,preserveAspectRatio:"none"};A.push(new g.CreateElementCommand(d,l))})}catch(r){console.error(r)}else{const r=await g.fetchAsString(a,!0),l=d=>{const B=/<svg.*?<\/svg>/s,w=d.match(B)||[],E=(w==null?void 0:w.length)>0?w[0]:"",m=g.domParser().parseFromString(E,"image/svg+xml").firstElementChild;if(!m)throw new q("Failed to read SVG.");return g.sanitizeSvgTree(m),g.xmlSerializer().serializeToString(m)};s.forEach(d=>{const B=c.find(E=>E.panelId===d.panelId);if(!B)throw new J(d);const w={id:g.generate(),src:a,asset_key:a,svg:l(r),colors:{},type:o,y:d.top,x:d.left,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,scaleX:1,scaleY:1,rotation:d.rotation,productOverlay:e.type===g.StepType.ProductOverlay?!0:void 0,excludeFromExport:e.data.excludeFromPrint};A.push(new g.CreateElementCommand(w,B))})}return A},Pn=async(c,e,t,A)=>{const n=[],a=t.data,i=30,o=h=>h.vertical?"center":h.textAlign||"center",s=()=>{var F;const h=A.option;if(!h)return;const m=((F=h.variants)==null?void 0:F.find(I=>I.id===a.fontVariantId))||g.getDefaultVariant(h);if(!m||!m.asset)return;e[A.stepName]={selectedVariants:[m]};const u=m.asset.fileLink;if(u)return u},l=await(async()=>{const h=s();if(!h)return;const m=await g.loadFont(h);return{assetUrl:h,name:m.names.fullName.en}})(),d=(A.data.replaceableText?A.data.replaceableText.replace("{{}}",a.text):a.text)||"",B=g.applyTextTransformations(d,{vertical:A.data.vertical,uppercase:A.data.uppercase}),w=async h=>{const m=h.colorOption;if(!m)return;const u=L.getDefaultVariant(m);return u==null?void 0:u.color},E=a.color||await w(A.data),C=A.data.regions;for(const h of C){const m=c.find(F=>F.panelId===h.panelId);if(!m)continue;const u={stepName:t.name,id:g.generate(),align:o(A.data),curved:A.data.curved,fill:a.color||E||"#000000",fontData:l,fontSize:A.data.size||i,height:h.height,layer:h.layer,layerIndex:h.layerIndex,paths:A.data.paths,rotation:h.rotation,text:B,type:g.LayoutElementType.Textbox,vertical:A.data.vertical,verticalAlign:A.data.verticalAlign||"middle",width:h.width,x:h.left,y:h.top};if(l){const[F,I]=g.determineCorrectFontSizeAndLines(A.data.size||i,l,h,[g.applyTextTransformations(B,{vertical:A.data.vertical,uppercase:A.data.uppercase})],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});n.push(new g.CreateElementCommand({...u,fontSize:F,text:u.curved?u.text:(I||[]).join(`
|
|
1998
1998
|
`)},m))}else n.push(new g.CreateElementCommand(u,m))}return n},xn=(c,e)=>c.conditions?c.conditions.every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const n=A.selectedVariants;return t.requiredVariantSelections.some(a=>n.find(i=>i.id===a)!==void 0)}return!1}):!0,Vt=async(c,e,t,A)=>{const n=[],a={};for(const i of c){const o=e.steps.find(s=>s.stepName===i.name);if(o)switch(o.type){case g.StepType.DigitalContent:n.push(...await Dn(t,i,o));break;case g.StepType.Frame:case g.StepType.Photo:n.push(...await pn(t,a,i,o));break;case g.StepType.Illustration:n.push(...await Fn(t,a,i,o));break;case g.StepType.Module:n.push(...await Mn(t,i,o));break;case g.StepType.Picture:n.push(...await Sn(t,a,i,o));break;case g.StepType.Shape:n.push(...await yn(t,a,i,o));break;case g.StepType.Text:n.push(...await Pn(t,a,i,o));break}}for(const i of e.steps)i.type!==g.StepType.SilentIllustration&&i.type!==g.StepType.ProductOverlay||xn(i,a)&&n.push(...await Yn(t,i,A));return n};class Me{constructor(e){this.handleCompleteRender=null;const t=new Map;e.forEach(A=>t.set(A.id,new Hn(A.id,A.name,this))),this.layouts=t}setCompleteRenderCallback(e){this.handleCompleteRender=e,e(Array.from(this.layouts.values()))}onCompleteRender(){this.handleCompleteRender&&this.handleCompleteRender(Array.from(this.layouts.values()))}getAll(){return this.layouts}}const Nn=(()=>new Promise((c,e)=>{const A=g.createCanvas().getContext("webgl2");c(!!A)}))();class Hn{constructor(e,t,A){this.hasSetStaticContext=!1,this.interactiveDirty=!1,this.staticCtxDirty=!1,this.lastRequestedRenderArguments=void 0,this.lastCompletedStaticRender=void 0,this.lastModificationID=void 0,this.renderQueue=new Ue(2),this.id=e,this.name=t,this.service=A}getID(){return this.id}getName(){return this.name}getStaticContext(){return this.textureCtx}setStaticContext(e){if(this.textureCtx=e,this.lastRequestedRenderArguments){const{workflow:t,layouts:A,productOverlayImageUrl:n}=this.lastRequestedRenderArguments;this.render(t,A,n)}}getStaticContextDirty(){return this.staticCtxDirty}setStaticContextDirty(e){this.staticCtxDirty=e}getInteractiveCanvasDirty(){return this.interactiveDirty}setInteractiveCanvasDirty(e){this.interactiveDirty=e}markLastCompletedStaticRender(){this.lastCompletedStaticRender=Date.now(),this.service.onCompleteRender()}getLastCompletedStaticRender(){return this.lastCompletedStaticRender}getLastModificationID(){return this.lastModificationID}async render(e,t,A){const n=Ee(t);this.lastRequestedRenderArguments={workflow:e,layouts:n,productOverlayImageUrl:A};const a=this.getStaticContext();if(!a){this.markLastCompletedStaticRender(),this.setStaticContextDirty(!1);return}this.renderQueue.enqueue(new Rn(this.getID(),a,await Nn,()=>{this.markLastCompletedStaticRender(),this.setStaticContextDirty(!0)},e,n,A))}}class Rn extends Re{constructor(e,t,A,n,a,i,o){super(),this.layoutId=e,this.ctx=t,this.nonPOTSupport=A,this.onRender=n,this.workflow=a,this.layouts=i,this.productOverlayImageUrl=o}getDynamicTextureResolution(){return this.getIsMobile()||!this.offscreenRenderingSupported()?{width:1024,height:1024}:{width:2048,height:2048}}getIsMobile(){return window.innerWidth<=480}offscreenRenderingSupported(){return navigator.userAgent.includes("SamsungBrowser")?!1:!!window.Worker&&!!window.OffscreenCanvas}resizeFit(e,t=4096){const A=t/e.width,n=t/e.height,a=Math.min(A,n);return a>1?e:{width:e.width*a,height:e.height*a}}async execute(){const e=this.layouts.find(B=>B.layoutState.layout.id===this.layoutId);if(!e)return;const t=e.layoutState.elements||[],A=e.layoutState.layout.width,n=e.layoutState.layout.height,a=this.getDynamicTextureResolution().width,i=this.getDynamicTextureResolution().height;let o,s;if(this.nonPOTSupport){const B=a/i;A/n<B?(o=a,s=n*(a/A)):(o=A*(i/n),s=i);const E=this.resizeFit({width:o,height:s});o=E.width,s=E.height}else o=this.getDynamicTextureResolution().width,s=this.getDynamicTextureResolution().height;const r=g.getSvgElement(e.layoutState.layout,t,{renderingConfiguration:{purpose:g.LayoutRenderingPurpose.ThreeD}}),l=g.renderPapyrusComponentAsString(r),d=await et.Pith.from(this.ctx,l,{anonymousCrossOrigin:!0,ignoreDimensions:!this.nonPOTSupport,ignoreAnimation:!0,ignoreClear:!0,ignoreMouse:!0,enableRedraw:!1,createCanvas:g.createCanvas,createImage:g.loadImage,DOMParser:g.getDomParser(),fetch:g.fetch});d.resize(o,s),await d.render(),this.onRender()}}const Un=(c,e)=>{const t=[];return c.forEach(A=>{const n=e.steps.find(a=>a.stepName===A.stepName);(n==null?void 0:n.type)===g.StepType.Text&&A.stepAspectType==="Text"&&t.push({name:n.stepName,data:{text:A.value}})}),t},Gn=async(c,e,t,A)=>{let n={serializableWorkflow:{steps:[]},layouts:{}};n=new g.GroupCommand(t.map(s=>new g.CreateLayoutCommand(s))).apply(n);const i=await Vt(c,e,t,A);return new g.GroupCommand(i).apply(n)},vn=M.gql`
|
|
1999
1999
|
${$}
|
|
2000
2000
|
fragment ProductFields on Product {
|
|
@@ -2279,7 +2279,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
|
|
|
2279
2279
|
id
|
|
2280
2280
|
}
|
|
2281
2281
|
}
|
|
2282
|
-
`;class Zn{constructor(e){this.handleCache={},this.bundle=e}async getHandle(e){if(this.handleCache[e.name])return this.handleCache[e.name];const t=await this.createHandle(e);return this.handleCache[e.name]=t,t}async getHandles(){var t;if(!((t=this.bundle.getProductCollection())!=null&&t.getResource().globalPropertyConfiguration))return[];const e=this.bundle.getProductCollection().getResource().globalPropertyConfiguration;return Promise.all(e.aspects.map(A=>this.getHandle(A)))}applyConditionsFromState(e,t){return t?e.filter(A=>this.aspectConditionsSatisfied(A.getRawProperty(),t)):e}aspectConditionsSatisfied(e,t){return!e.conditions||e.conditions.length===0?!0:e.conditions.some(A=>{const n=t.aspects.find(a=>a.name===A.targetAspectName);return n?A.requiredVariantSelections.some(a=>a===n.value):!1})}async createHandle(e){switch(e.type){case g.AspectType.FileUpload:return new qt(this.bundle,e);case g.AspectType.Option:{const t=e.entityId?await L.getOption(e.entityId):void 0;return(t==null?void 0:t.type)==="Color"?new $t(this.bundle,e,t):new Ke(this.bundle,e,t)}case g.AspectType.Text:return new Zt(this.bundle,e)}}}class Se{constructor(e,t){this.bundle=e,this.property=t}getName(){return this.property.name}getTitle(){return this.property.title}getDescription(){return this.property.description}getType(){return this.property.type}getRawProperty(){return this.property}getSharedSteps(e){
|
|
2282
|
+
`;class Zn{constructor(e){this.handleCache={},this.bundle=e}async getHandle(e){if(this.handleCache[e.name])return this.handleCache[e.name];const t=await this.createHandle(e);return this.handleCache[e.name]=t,t}async getHandles(){var t;if(!((t=this.bundle.getProductCollection())!=null&&t.getResource().globalPropertyConfiguration))return[];const e=this.bundle.getProductCollection().getResource().globalPropertyConfiguration;return Promise.all(e.aspects.map(A=>this.getHandle(A)))}applyConditionsFromState(e,t){return t?e.filter(A=>this.aspectConditionsSatisfied(A.getRawProperty(),t)):e}aspectConditionsSatisfied(e,t){return!e.conditions||e.conditions.length===0?!0:e.conditions.some(A=>{const n=t.aspects.find(a=>a.name===A.targetAspectName);return n?A.requiredVariantSelections.some(a=>a===n.value):!1})}async createHandle(e){switch(e.type){case g.AspectType.FileUpload:return new qt(this.bundle,e);case g.AspectType.Option:{const t=e.entityId?await L.getOption(e.entityId):void 0;return(t==null?void 0:t.type)==="Color"?new $t(this.bundle,e,t):new Ke(this.bundle,e,t)}case g.AspectType.Text:return new Zt(this.bundle,e)}}}class Se{constructor(e,t){this.bundle=e,this.property=t}getName(){return this.property.name}getTitle(){return this.property.title}getDescription(){return this.property.description}getType(){return this.property.type}getRawProperty(){return this.property}getSharedSteps(e){const t=e??this.bundle.getWorkflowExperiences(),A=t.flatMap(n=>n.getSteps().filter(a=>{var i;return(i=a.getRaw().globalPropertyAspectConfigurations)==null?void 0:i.some(o=>{var s,r;return o.globalPropertyConfigurationId===((r=(s=this.bundle.getProductCollection())==null?void 0:s.getResource().globalPropertyConfiguration)==null?void 0:r.id)&&o.aspectName===this.property.name})}));return console.log(`getting shared steps for ${t.length} - found ${A.length}`,A),A}getStateValue(){return this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name)}}class qt extends Se{constructor(e,t){super(e,t)}async selectImage(e){await Promise.all([this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name,e.key),this.applyImageSelection(e)])}hasImage(){return!!this.getStateValue()}async getImage(){const e=this.getStateValue();if(e)return k.getLocalOrFromServer(e)}async applyGlobalState(e){const t=this.getStateValue();if(!t)return Promise.resolve();const A=await k.getLocalOrFromServer(t);return A?this.applyImageSelection(A,e):Promise.resolve()}async applyImageSelection(e,t){const n=this.getSharedSteps(t).map(a=>a.selectImage(e));await Promise.all(n)}}class Zt extends Se{constructor(e,t){super(e,t)}getText(){const e=this.getStateValue();return e||""}async setText(e){await Promise.all([this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name,e),this.applyTextSelection(e)])}async applyGlobalState(e){const t=this.getStateValue();if(!t)return Promise.resolve();await this.applyTextSelection(t,e)}async applyTextSelection(e,t){const n=this.getSharedSteps(t).map(a=>{a.setText(e)});await Promise.all(n)}}class Ke extends Se{constructor(e,t,A){super(e,t),this.optionResource=A}getCurrentVariant(){var t,A;if(!this.optionResource)return;const e=this.getStateValue();if(e){const n=(A=this.optionResource.variants)==null?void 0:A.find(a=>a.id===e);return n?new K(n):void 0}else{const n=(t=this.optionResource.variants)==null?void 0:t.find(a=>{var i,o;return a.id===((o=(i=this.optionResource)==null?void 0:i.defaultVariant)==null?void 0:o.id)});return n?new K(n):void 0}}getAvailableVariants(){var t,A;return(((A=(t=this.optionResource)==null?void 0:t.variants)==null?void 0:A.filter(n=>n.enabled))||[]).map(n=>new K(n))}getAllVariants(){var t;return(((t=this.optionResource)==null?void 0:t.variants)||[]).map(A=>new K(A))}async selectVariant(e){await Promise.all([this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name,e.getId()),this.applyVariantSelection(e)])}async applyGlobalState(e){var n,a;const t=this.getStateValue();if(!t)return Promise.resolve();const A=(a=(n=this.optionResource)==null?void 0:n.variants)==null?void 0:a.find(i=>i.id===t);return A?this.applyVariantSelection(new K(A),e):Promise.resolve()}async applyVariantSelection(e,t){const n=this.getSharedSteps(t).map(a=>a.selectVariant(e));await Promise.all(n)}}class $t extends Ke{constructor(e,t,A){super(e,t,A)}setCustomColor(e){this.getSharedSteps().forEach(A=>A.setCustomColor(e))}getCustomColor(){return this.getSharedSteps()[0].getCustomColor()}}const $n=M.gql`
|
|
2283
2283
|
mutation CreateGlobalPropertyState($bundleId: String!) {
|
|
2284
2284
|
globalPropertyStateCreate(bundleId: $bundleId) {
|
|
2285
2285
|
id
|
|
@@ -2969,4 +2969,4 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
|
|
|
2969
2969
|
}
|
|
2970
2970
|
}
|
|
2971
2971
|
}
|
|
2972
|
-
`,Ae=async c=>{var e;for(const t in c.layouts){const A=c.layouts[t].elements.filter(a=>a.type===g.LayoutElementType.Illustration);for(let a=0;a<A.length;++a){const i=A[a];i.src&&i.svg&&(i.cachedObjectURL=await g.svgObjectURL(i.svg))}const n=c.layouts[t].elements.filter(a=>a.type===g.LayoutElementType.Textbox);for(let a=0;a<n.length;++a){const i=n[a];(e=i.fontData)!=null&&e.assetUrl&&await g.loadFont(i.fontData.assetUrl)}}},ua=async(c,e)=>{var n;const t=await N.getShadowGraphqlClient().query({query:ga(((n=e==null?void 0:e.assets)==null?void 0:n.metadata)||!1),errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}}),A=t.data.workflows;if(A===void 0||A.length!==c.length)throw new Error(`Unable to read workflows: ${t.errors??"Length mismatch in response"}`);return A.forEach(a=>{a.steps.forEach(i=>{var o,s,r;delete i.data.__typename,(o=i.option)!=null&&o.id&&((s=i.option.defaultVariant)!=null&&s.asset&&J.cacheAsset(i.option.defaultVariant.asset),i.option.colorProfile&&J.cacheAsset(i.option.colorProfile),(r=i.option.variants)==null||r.forEach(l=>{l.asset&&J.cacheAsset(l.asset),l.displayImage&&J.cacheAsset(l.displayImage),l.thumbnail&&J.cacheAsset(l.thumbnail),l.material&&J.cacheMaterial(l.material)}),Z.set({id:i.option.id},Promise.resolve(i.option)))})}),A},ma=async(c,e)=>{const A=(await e).find(n=>n.id===c);if(!A)throw new Error(`Workflow not found: ${c}`);return A},qe=async(c,e)=>{const t=c.map(o=>Z.get({id:o,options:e})),A=c.filter((o,s)=>t[s]===void 0);if(A.length===0)return Promise.all(t);const n=ua(A,e),a=A.map(o=>Z.set({id:o,options:e},ma(o,n))),i=t.filter(o=>o!==void 0);return await Promise.all(i.concat(a))},we=async(c,e)=>(await qe([c],e))[0],Ia=c=>c.sort((e,t)=>e.index-t.index).map(e=>({id:g.generate(),panelId:e.name,name:e.name,index:e.index,createdAt:new Date,updatedAt:new Date,transparentBackground:e.transparentBackground,height:e.height,width:e.width,previewRegion:e.previewRegion,useEditableArea:e.useEditableArea,editableArea:e.editableArea})),Ze=(c,e)=>{const t=c.workflowState,A=t?JSON.parse(t):void 0;return A?Object.values(A.layouts).map(n=>n.layout):Ia(e.panels)};class oA{constructor(e){this.updateTransactionState=async t=>{try{return N.getShadowGraphqlClient().mutate({...t,mutation:HA})}catch(A){throw console.error(A),new G("Critical - Unable to synchronize workflow state with server.")}},this.initialized=!1,this.options=e,this.options.applicationKey&&dA(this.options.applicationKey)}getAssetManager(){return J}getCurrencyCode(){if(this.currencyCode===void 0)throw new Error("No currency code set.");return this.currencyCode}getFlowService(){if(!wA())throw new Error("Application key required to use Flow Service.");return new nA}async getIntegration(){return(await N.getShadowGraphqlClient().query({query:Ba,errorPolicy:"all"})).data.currentIntegration}async authenticateBundleFromLocalStorage(e){var n,a;const t=P.getMap("bundleOwnerIds");if(t!=null&&t.has(e))return Promise.resolve({success:!0,stakeholderType:se.Owner});const A=P.getMap("bundlePartnerIds")||new Map;if(A.has(e)){const i=A.get(e),s=(P.getMap("partnerCustomerIds")||new Map).get(i);if(s&&await this.authenticateCustomerId(s)){const l=(a=(n=this.customer)==null?void 0:n.bundleStakeholders)==null?void 0:a.find(d=>{var B;return((B=d.bundle)==null?void 0:B.id)===e});if(l)return Promise.resolve({success:!0,stakeholderType:l.type})}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(e){var l,d,B,w,E,C;const t=N.getShadowGraphqlClient(),A=await t.query({query:la,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:e}});if(!A.data.transactions||A.data.transactions.length===0)throw new Error(`Transaction not found: ${e}`);const n=A.data.transactions[0];if(!((d=(l=n.product)==null?void 0:l.partner)==null?void 0:d.id))throw new Error(`Unable to read transaction: ${e}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const i=P.getMap("transactionOwnerIds");if(i!=null&&i.has(e))return Promise.resolve({success:!0,stakeholderType:se.Owner});const o=P.getMap("transactionCustomerIds");if(o!=null&&o.has(e)){const h=o.get(e);if(h&&await this.authenticateCustomerId(h)){const u=((w=(B=this.customer)==null?void 0:B.bundleStakeholders)==null?void 0:w.find(F=>{var I,f;return(f=(I=F.bundle)==null?void 0:I.transactions)==null?void 0:f.some(D=>D.id===e)}))||((C=(E=this.customer)==null?void 0:E.stakeholders)==null?void 0:C.find(F=>{var I;return((I=F.transaction)==null?void 0:I.id)===e}));if(u)return Promise.resolve({success:!0,stakeholderType:u.type})}}const r=(await t.query({query:da,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(e){const t=P.getMap("transactionCustomerIds");t!=null&&t.has(e)&&(t.delete(e),P.setMap("transactionCustomerIds",t))}getStakeholderTypeForTransaction(e){var A,n;const t=(n=(A=this.customer)==null?void 0:A.stakeholders)==null?void 0:n.find(a=>{var i;return((i=a.transaction)==null?void 0:i.id)===e});if(t)return t.type}async getOrCreateCustomer(e){var i;this.customer=void 0;const t=N.getShadowGraphqlClient(),n=(await t.query({query:wa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:e}})).data.customer;if(!n.id){const s=(i=(await t.mutate({mutation:Ea,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:e}}})).data)==null?void 0:i.customerCreate;if(!s)throw new Error("Unable to create customer.");return this.storeCustomer(s),this.customer=s,{customer:s,isAuthenticated:!1}}this.storeCustomer(n);const a=await this.authenticateCustomerId(n.id);return{customer:this.customer||n,isAuthenticated:a}}async authenticateCustomerId(e){var o;const t=N.getShadowGraphqlClient(),A=P.getMap("customerTokens");if(!(A!=null&&A.has(e)))return!1;const n=A.get(e);if(!n)return!1;const i=(o=(await t.mutate({mutation:ha,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data)==null?void 0:o.customerAuthenticate;return i?(this.storeCustomer(i),rt(n),this.customer=i,!0):!1}async generateVerificationCode(e){await N.getShadowGraphqlClient().mutate({mutation:Ca,variables:{emailAddress:e}})}async verifyCode(e,t){var a,i;const n=(a=(await N.getShadowGraphqlClient().mutate({mutation:Qa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:e,verificationCode:t}})).data)==null?void 0:a.customerVerifyCode;if(n!=null&&n.loginToken){if(!((i=n.partner)!=null&&i.id))throw new Error(`Unable to find customer: ${e}`);const o=P.getMap("customerTokens")||new Map;return o.set(n.id,n.loginToken),P.setMap("customerTokens",o),this.storeCustomer(n),rt(n.loginToken),this.customer={...n,loginToken:void 0},!0}return!1}async getNewBundle(e,t,A){var s,r,l;const a=(l=(await N.getShadowGraphqlClient().mutate({mutation:Ln(((r=(s=A==null?void 0:A.graphql)==null?void 0:s.productCollection)==null?void 0:r.eagerFetchProducts)||!1),variables:{collectionId:e,initialMetadata:t?Object.entries(t).map((d,B)=>({key:d[0],value:d[1]})):void 0},fetchPolicy:"no-cache"})).data)==null?void 0:l.bundleCreate;if(!(a!=null&&a.id))throw new Error("Unable to create bundle");const i=P.getMap("bundlePartnerIds")||new Map;i.set(a.id,a.partner.id),P.setMap("bundlePartnerIds",i);const o=P.getMap("bundleOwnerIds")||new Map;return o.set(a.id,a.bundleOwnerId),P.setMap("bundleOwnerIds",o),new AA(this,a,void 0,void 0,a.bundleOwnerId)}async getExistingBundle(e,t,A,n){var d,B,w,E,C,h;const a=P.getMap("bundleOwnerIds"),i=a==null?void 0:a.get(e),o=await N.getShadowGraphqlClient().query({query:kn(((B=(d=n==null?void 0:n.graphql)==null?void 0:d.productCollection)==null?void 0:B.eagerFetchProducts)||!1),variables:{id:e},fetchPolicy:"no-cache",context:{bundleOwnerId:i}});if(!((w=o.data)!=null&&w.bundles)||((E=o.data)==null?void 0:E.bundles.length)===0||!((C=o.data)!=null&&C.bundles[0]))throw new Error(`Unable to find bundle: ${e}`);const s=(h=o.data)==null?void 0:h.bundles[0],r=P.getMap("bundlePartnerIds")||new Map;r.set(s.id,s.partner.id),P.setMap("bundlePartnerIds",r);const l=new AA(this,s,t,A,i);return await l.getInitializationPromise(),l}async getBundleStakeholders(){var a;if(!this.customer)throw new Error("Customer not authenticated.");const e=await N.getShadowGraphqlClient().query({query:Jn,variables:{id:this.customer.id},fetchPolicy:"no-cache"});if(!((a=e.data)!=null&&a.customers)||e.data.customers.length===0)throw new Error("Unable to find customer.");const A=e.data.customers[0].bundleStakeholders||[],n=P.getMap("bundlePartnerIds")||new Map;return A.forEach(i=>{var o,s;(o=i.bundle)!=null&&o.id&&((s=i.bundle.partner)!=null&&s.id)&&n.set(i.bundle.id,i.bundle.partner.id)}),P.setMap("bundlePartnerIds",n),A}async getWorkflowExperience(e,t,A,n){var d,B,w,E,C;if(!n)return await this.getWorkflowExperienceDeprecated(e,t,A);const a=async()=>{var m,u;const h=N.getShadowGraphqlClient();if(n.type==="transaction"){const{transactionId:F,readOnly:I}=n,f=await h.query({query:ue,variables:{ids:[F]},errorPolicy:"all",fetchPolicy:"no-cache"});if(!((m=f.data)!=null&&m.transactions)||f.data.transactions.length===0)throw new G("Existing transaction not found.");const D=(u=f.data)==null?void 0:u.transactions[0];if(!D.workflowId)throw new G("Existing transaction has no workflow ID.");const p=await we(D.workflowId);if(!D.product)throw new G("Failed to load transaction, product not available.");return{transaction:D,workflow:p,readOnly:I}}if(n.type==="integration"||n.type==="external"){const F=async()=>{const p=n.type==="integration"?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},S=await h.mutate({mutation:Et,variables:{...p,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!S.data||!S.data.transactionCreate)throw new G("Failed to create transaction!");const y=S.data.transactionCreate;if(!y.product)throw new G("Failed to create transaction, product not available.");return y},I=we(n.workflowId,n==null?void 0:n.graphql),[f,D]=await Promise.all([F(),I]);return{transaction:f,workflow:D}}throw new G("No workflow ID provided.")},{transaction:i,workflow:o,readOnly:s}=await a();this.currencyCode=(d=i.product.partner)==null?void 0:d.currencyCode;const r={product:i.product,transaction:i,layouts:[],singleVariantsRenderable:(B=n==null?void 0:n.workflowConfiguration)==null?void 0:B.singleVariantsRenderable,stateMutationFunc:s?async()=>{throw new v("State mutation is forbidden in read only mode!")}:async h=>{const u=(P.getMap("transactionOwnerIds")||new Map).get(i.id)||void 0;return this.updateTransactionState({...h,context:{transactionOwnerId:u}})},readOnly:s,workflow:o};if(n.type==="transaction"&&i.workflowState){const h=JSON.parse(i.workflowState);r.layouts=Object.values(h.layouts).map(m=>m.layout),await g.rehydrateSerializedLayout(h),await Ae(h),r.reloadedState=h}else if(!s&&n.workflowState){const h=JSON.parse(n.workflowState);r.layouts=Object.values(h.layouts).map(m=>m.layout),await g.rehydrateSerializedLayout(h),await Ae(h),r.reloadedState=h}else r.layouts=Ze(r.transaction,r.workflow);if(r.renderableContextService=new Me(r.layouts),n.previewService?(r.previewService=n.previewService,(w=r.product)!=null&&w.modelUrl&&(r.modelContainer=r.previewService.loadModel({model:r.product.modelUrl,contextService:r.renderableContextService}))):(r.previewService=A&&A(o),(E=r.product)!=null&&E.modelUrl&&(r.modelContainer=(C=r.previewService)==null?void 0:C.loadModel({model:r.product.modelUrl,contextService:r.renderableContextService}))),n.type!=="transaction"){const h=P.getMap("transactionOwnerIds")||new Map;h.set(i.id,i.transactionOwnerId),P.setMap("transactionOwnerIds",h)}else r.isReloadedTransaction=!0;this.initialized=!0,this.experienceOptions=r;const l=new le(this,r);return await l.getWorkflowManager().getInitializationPromise(),n.type!=="transaction"&&this.customer&&await l.attachCustomerDetails({email:this.customer.emailAddress}),l}async getWorkflowExperiences(e,t){if(e.length===0)throw new G("No options provided!");const A=N.getShadowGraphqlClient(),n=async f=>{var y,x;if(f.length===0)return[];const D=f.map(Y=>Y.option.transactionId),p=await A.query({query:ue,variables:{ids:D},errorPolicy:"all",fetchPolicy:"no-cache"}),S=p.data.transactions;if(S.length!==f.length){const Y=((x=(y=p.errors)==null?void 0:y[0])==null?void 0:x.message)||"Unknown error";throw new G(`Not all transactions were found: ${Y}`)}return S.map((Y,H)=>{var R;return{transaction:Y,workflowId:Y.workflowId,readOnly:((R=f.find(T=>T.option.transactionId===Y.id))==null?void 0:R.option.readOnly)??!1,index:f[H].index}})},a=async f=>{var S,y,x;if(f.length===0)return[];const D=await A.mutate({mutation:xA,variables:{inputs:f.map(Y=>({integrationProductId:Y.option.type==="integration"?Y.option.integrationProductId:void 0,externalIntegrationId:Y.option.type==="external"?Y.option.externalIntegrationId:void 0,externalProductId:Y.option.type==="external"?Y.option.externalProductId:void 0,workflowId:Y.option.workflowId,claim:!0}))},errorPolicy:"all",fetchPolicy:"no-cache"}),p=(S=D.data)==null?void 0:S.transactionCreateMany;if(!p||p.length===0){const Y=((x=(y=D.errors)==null?void 0:y[0])==null?void 0:x.message)||"Unknown error";throw new G(`Failed to create transactions: ${Y}`)}return p.map((Y,H)=>({transaction:Y,workflowId:Y.workflowId,readOnly:!1,index:f[H].index}))},i=e.map((f,D)=>({option:f,index:D})),o=i.filter(f=>f.option.type==="transaction"),s=i.filter(f=>f.option.type==="integration"||f.option.type==="external"),r=at(o,10),l=at(s,10),d=(await Promise.all([...r.map(n),...l.map(a)])).flat(),B=[...new Set(d.map(f=>f.workflowId))],w=await qe(B,t),E=new Map(w.map(f=>[f.id,f])),C=P.getMap("transactionOwnerIds")||new Map,h=d.map(async f=>{var T;const{transaction:D,workflowId:p,readOnly:S,index:y}=f,x=E.get(p),Y=e[y];!C.get(D.id)&&D.transactionOwnerId&&C.set(D.id,D.transactionOwnerId);const H=C.get(D.id)||void 0,R={product:D.product,transaction:D,layouts:[],singleVariantsRenderable:(T=Y==null?void 0:Y.workflowConfiguration)==null?void 0:T.singleVariantsRenderable,stateMutationFunc:S?async()=>{throw new v("State mutation is forbidden in read only mode!")}:async k=>this.updateTransactionState({...k,context:{transactionOwnerId:H}}),readOnly:S,workflow:x,isReloadedTransaction:Y.type==="transaction"};if(Y.type==="transaction"&&D.workflowState){const k=JSON.parse(D.workflowState);R.layouts=Object.values(k.layouts).map(z=>z.layout),await g.rehydrateSerializedLayout(k),await Ae(k),R.reloadedState=k}else if(!S&&Y.workflowState){const k=JSON.parse(Y.workflowState);R.layouts=Object.values(k.layouts).map(z=>z.layout),await g.rehydrateSerializedLayout(k),await Ae(k),R.reloadedState=k}else R.layouts=Ze(R.transaction,R.workflow);return R.renderableContextService=new Me(R.layouts),R.delayWorkflowStateSync=!0,this.initialized=!0,this.experienceOptions=R,{experienceOptions:R,index:y,options:Y}});P.setMap("transactionOwnerIds",C);const F=(await Promise.all(h)).sort((f,D)=>f.index-D.index).map(async f=>{const{experienceOptions:D,options:p}=f,S=new le(this,D);return await S.getWorkflowManager().getInitializationPromise(),p.type!=="transaction"&&this.customer&&await S.attachCustomerDetails({email:this.customer.emailAddress}),S}),I=await Promise.all(F);return I.forEach(f=>f.getWorkflowManager().setWorkflowStateSyncEnabled(!0)),I}async initFromIntegrationProduct(e){var i;if(e==="")throw new G("No integration product ID provided.");const A=await N.getShadowGraphqlClient().mutate({mutation:Et,variables:{integrationProductId:e,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!A.data||!A.data.transactionCreate)throw new G("Failed to create transaction!");const n=A.data.transactionCreate;if(!n.product)throw new G("Failed to create transaction, product not available.");this.currencyCode=(i=n.product.partner)==null?void 0:i.currencyCode;const a=P.getMap("transactionOwnerIds")||new Map;a.set(n.id,n.transactionOwnerId),P.setMap("transactionOwnerIds",a),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async o=>this.updateTransactionState({...o,context:{transactionOwnerId:n.transactionOwnerId}})},this.initialized=!0}async initFromTransaction(e,t=!1){var o,s,r,l;if(e==="")throw new G("No transaction ID provided.");const A=N.getShadowGraphqlClient(),n=async()=>{var w,E;const B=(w=(await A.query({query:ue,variables:{ids:[e]},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:w.transactions[0];if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(E=B.product.partner)==null?void 0:E.currencyCode,this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async()=>{throw new v("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0};if(t)return await n();const a=P.getMap("transactionOwnerIds")||new Map,i=a.get(e);if(i){const B=(o=(await A.query({query:ue,variables:{ids:[e]},errorPolicy:"all"})).data)==null?void 0:o.transactions[0];if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(s=B.product.partner)==null?void 0:s.currencyCode,this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async w=>this.updateTransactionState({...w,context:{transactionOwnerId:i}}),readOnly:t},this.initialized=!0;return}try{const B=(r=(await A.mutate({mutation:NA,variables:{id:e},errorPolicy:"all"})).data)==null?void 0:r.transactionClaim;if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(l=B.product.partner)==null?void 0:l.currencyCode,B.transactionOwnerId&&(a.set(B.id,B.transactionOwnerId),P.setMap("transactionOwnerIds",a)),this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async w=>this.updateTransactionState({...w,context:{transactionOwnerId:B.transactionOwnerId}}),readOnly:t},this.initialized=!0}catch{throw new G("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(e,t,A){var n,a,i,o;if(!this.initialized||!this.experienceOptions)throw new G("Cannot launch experience: Not initialized.");if(this.experienceOptions.transaction.workflowId){const s=await we(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=s,this.experienceOptions.transaction.workflowState){const l=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(l.layouts).map(d=>d.layout),await g.rehydrateSerializedLayout(l),await Ae(l),this.experienceOptions.reloadedState=l}this.experienceOptions.previewService=A&&A(s),this.experienceOptions.renderableContextService=new Me(this.experienceOptions.layouts),(n=this.experienceOptions.product)!=null&&n.modelUrl&&(this.experienceOptions.modelContainer=(a=this.experienceOptions.previewService)==null?void 0:a.loadModel({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}));const r=new le(this,this.experienceOptions);return await r.getWorkflowManager().getInitializationPromise(),r}if(e){const r=(P.getMap("transactionOwnerIds")||new Map).get(this.experienceOptions.transaction.id),l=N.getShadowGraphqlClient().mutate({mutation:RA,variables:{workflowId:e,id:this.experienceOptions.transaction.id},context:{transactionOwnerId:r}}),d=we(e);if(await Promise.all([l,d]),this.experienceOptions.workflow=await d,t){const w=JSON.parse(t);this.experienceOptions.layouts=Object.values(w.layouts).map(E=>E.layout),await g.rehydrateSerializedLayout(w),await Ae(w),this.experienceOptions.reloadedState=w}else this.experienceOptions.layouts=Ze(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=A&&A(await d),this.experienceOptions.renderableContextService=new Me(this.experienceOptions.layouts),(i=this.experienceOptions.product)!=null&&i.modelUrl&&(this.experienceOptions.modelContainer=(o=this.experienceOptions.previewService)==null?void 0:o.loadModel({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}));const B=new le(this,this.experienceOptions);return await B.getWorkflowManager().getInitializationPromise(),B}throw new G("No workflow ID provided.")}getPreviewService(){var e;return(e=this.experienceOptions)==null?void 0:e.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new G("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new G("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}configureUrls(e,t,A){W.setHubUrl(e),W.setServerUrl(t),W.setServicesApiUrl(A)}storeCustomer(e){const t=P.getMap("partnerCustomerIds")||new Map;t.set(e.partner.id,e.id),P.setMap("partnerCustomerIds",t)}async getIntegrationProductById(e){var a,i;const n=(a=(await N.getShadowGraphqlClient().query({query:GA,variables:{ids:[e]},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:a.integrationProducts;if(!n||n.length===0||!((i=n[0])!=null&&i.id))throw new Error("Integration product not found.");return new Xe(n[0])}async getIntegrationProductFromExternalIds(e,t){var i;const a=(i=(await N.getShadowGraphqlClient().query({query:vA,variables:{externalProductId:t,externalIntegrationId:e},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:i.integrationProductFromExternalIds;if(!(a!=null&&a.id))throw new Error("Integration product not found.");return new Xe(a)}async getIntegrationProduct(e){return e.type==="integration"?this.getIntegrationProductById(e.integrationProductId):this.getIntegrationProductFromExternalIds(e.externalIntegrationId,e.externalProductId)}}class fa{getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}async reset(){}updateStateWithServer(e){}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(e){}addPoller(e){}addConfirmCallback(e){}addEditedCallback(e){}addElementsCallback(e){}addInformationResultCallback(e){}addInitCallback(e){}addMakingAdjustmentsCallback(e){}addMandatoryCallback(e){}addMetadataCallback(e){}addSelectionCallback(e){}addStepSpecificStorageCallback(e,t){}addStorageCallback(e){}getCommandDispatcher(){return e=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getModelContainer(){}getProfanities(){return[]}getRegionElements(e){return[]}getSerializedStep(e,t){}getStepSpecificServices(e){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(e){}markUpdateCompleted(e){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(e){}setEditedStatus(e,t){}setInformationResults(e){}setMandatoryFulfilled(e,t){}async setSelectionsAndElements(e,t,A){}toggleDesignConfirmed(){}updateMetadata(e,t){}async updateStorage(e,t){}injectIntoPreviewService(e){return Promise.resolve()}ejectFromPreviewService(){}setWorkflowStateSyncEnabled(e){}}var sA=(c=>(c.SelectFrame="SelectFrame",c.SelectImage="SelectImage",c.Position="Position",c))(sA||{});class rA extends j{constructor(e,t){var A;super(e,t),this.frameService=(A=this.manager.getStepSpecificServices(this.getId()))==null?void 0:A.frameService}selectVariant(e){const t=this.manager.getRegionElements(this.step.stepName);return Ie.selectVariant(this.step,e.getResource(),t,this.manager,A=>this.setUpdateState(A))}onFrameDataChanged(e){this.frameService&&this.frameService.onFrameDataChanged(t=>{t&&e(t)})}selectImage(e){return Ie.selectImage(this.step,e,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(e,t,A,n){return n&&n.length>1&&e===void 0?"SelectFrame":t||A||this.getImageData()?"Position":"SelectImage"}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}}Object.defineProperty(Q,"AspectType",{enumerable:!0,get:()=>g.AspectType}),Object.defineProperty(Q,"AssetType",{enumerable:!0,get:()=>g.AssetType}),Object.defineProperty(Q,"BringForwardCommand",{enumerable:!0,get:()=>g.BringForwardCommand}),Object.defineProperty(Q,"BringToBackCommand",{enumerable:!0,get:()=>g.BringToBackCommand}),Object.defineProperty(Q,"BringToFrontCommand",{enumerable:!0,get:()=>g.BringToFrontCommand}),Object.defineProperty(Q,"CanvasCommand",{enumerable:!0,get:()=>g.CanvasCommand}),Object.defineProperty(Q,"CommandContext",{enumerable:!0,get:()=>g.CommandContext}),Object.defineProperty(Q,"CreateElementCommand",{enumerable:!0,get:()=>g.CreateElementCommand}),Object.defineProperty(Q,"CreateLayoutCommand",{enumerable:!0,get:()=>g.CreateLayoutCommand}),Object.defineProperty(Q,"DeleteElementCommand",{enumerable:!0,get:()=>g.DeleteElementCommand}),Object.defineProperty(Q,"FontAlignmentCommand",{enumerable:!0,get:()=>g.FontAlignmentCommand}),Object.defineProperty(Q,"FontColorCommand",{enumerable:!0,get:()=>g.FontColorCommand}),Object.defineProperty(Q,"FontSizeCommand",{enumerable:!0,get:()=>g.FontSizeCommand}),Object.defineProperty(Q,"FontSourceCommand",{enumerable:!0,get:()=>g.FontSourceCommand}),Object.defineProperty(Q,"GroupCommand",{enumerable:!0,get:()=>g.GroupCommand}),Object.defineProperty(Q,"LayoutElementFactory",{enumerable:!0,get:()=>g.LayoutElementFactory}),Object.defineProperty(Q,"LayoutElementType",{enumerable:!0,get:()=>g.LayoutElementType}),Object.defineProperty(Q,"MoveCommand",{enumerable:!0,get:()=>g.MoveCommand}),Object.defineProperty(Q,"ResizeCommand",{enumerable:!0,get:()=>g.ResizeCommand}),Object.defineProperty(Q,"RotateCommand",{enumerable:!0,get:()=>g.RotateCommand}),Object.defineProperty(Q,"SendBackwardsCommand",{enumerable:!0,get:()=>g.SendBackwardsCommand}),Object.defineProperty(Q,"StepAspectType",{enumerable:!0,get:()=>g.StepAspectType}),Object.defineProperty(Q,"StepType",{enumerable:!0,get:()=>g.StepType}),Object.defineProperty(Q,"TextChangeCommand",{enumerable:!0,get:()=>g.TextChangeCommand}),Object.defineProperty(Q,"UnitOfMeasurement",{enumerable:!0,get:()=>g.UnitOfMeasurement}),Object.defineProperty(Q,"dataUrlFromExternalUrl",{enumerable:!0,get:()=>g.dataUrlFromExternalUrl}),Object.defineProperty(Q,"determineCorrectFontSizeAndLines",{enumerable:!0,get:()=>g.determineCorrectFontSizeAndLines}),Object.defineProperty(Q,"findElement",{enumerable:!0,get:()=>g.findElement}),Object.defineProperty(Q,"frameDataCache",{enumerable:!0,get:()=>g.frameDataCache}),Object.defineProperty(Q,"generate",{enumerable:!0,get:()=>g.generate}),Object.defineProperty(Q,"generateSVGWithUnknownColors",{enumerable:!0,get:()=>g.generateSVGWithUnknownColors}),Object.defineProperty(Q,"getAttributesFromArrayBuffer",{enumerable:!0,get:()=>g.getAttributesFromArrayBuffer}),Object.defineProperty(Q,"getAxisAlignedBoundingBox",{enumerable:!0,get:()=>g.getAxisAlignedBoundingBox}),Object.defineProperty(Q,"getFrameData",{enumerable:!0,get:()=>g.getFrameData}),Object.defineProperty(Q,"getSvgElement",{enumerable:!0,get:()=>g.getSvgElement}),Object.defineProperty(Q,"loadFont",{enumerable:!0,get:()=>g.loadFont}),Object.defineProperty(Q,"patternImageDataCache",{enumerable:!0,get:()=>g.patternImageDataCache}),Object.defineProperty(Q,"registerFetchImplementation",{enumerable:!0,get:()=>g.registerFetchImplementation}),Object.defineProperty(Q,"registerWindowImplementation",{enumerable:!0,get:()=>g.registerWindowImplementation}),Object.defineProperty(Q,"rehydrateSerializedLayout",{enumerable:!0,get:()=>g.rehydrateSerializedLayout}),Object.defineProperty(Q,"setCanvasModule",{enumerable:!0,get:()=>g.setCanvasModule}),Q.ArrayInput=ia,Q.AssetNotFoundError=V,Q.CollectionProduct=ye,Q.ColorOptionGlobalPropertyHandle=$t,Q.ConversionDataType=wt,Q.ConversionLocation=dt,Q.FileUploadGlobalPropertyHandle=qt,Q.FlowExecutionNodeResult=de,Q.FlowExecutionResult=aA,Q.FlowService=nA,Q.FrameService=ut,Q.FrameStep=sA,Q.FrameStepHandle=rA,Q.GlobalPropertyHandle=Se,Q.IllustrationStepHandle=Rt,Q.InformationMessageType=ge,Q.InformationStepHandle=Tt,Q.IntegrationProduct=Xe,Q.IntegrationType=lt,Q.LayoutNotFoundError=b,Q.MaterialStepHandle=Ut,Q.MisconfigurationError=ie,Q.MockWorkflowManager=fa,Q.ModelStepHandle=Gt,Q.ObjectInput=We,Q.ObjectInputType=iA,Q.OptionGlobalPropertyHandle=Ke,Q.OptionNotFoundError=ae,Q.ParseError=q,Q.PictureStepHandle=vt,Q.ProductCameraRig=Bt,Q.ProductCollection=_t,Q.ProductWorkflow=Be,Q.PromiseCache=Z,Q.PromiseQueue=Ue,Q.QuestionStepHandle=kt,Q.QueueablePromise=Re,Q.ResourceNotFoundError=X,Q.ShapeStepHandle=bt,Q.SpiffCommerceClient=oA,Q.StakeholderType=se,Q.StepHandle=j,Q.TextGlobalPropertyHandle=Zt,Q.TextInput=aa,Q.TextStepHandle=Jt,Q.Transform=tA,Q.TransformCollection=eA,Q.UnhandledBehaviorError=v,Q.Variant=K,Q.WorkflowExperienceEventType=Kt,Q.WorkflowExperienceImpl=le,Q.assetService=J,Q.createDesign=jt,Q.designService=Fe,Q.digitalContentStepService=Dt,Q.frameStepService=Ie,Q.generateCommands=Vt,Q.generateStateFromDesignInputSteps=Gn,Q.getBoundedOffsets=Qt,Q.getWorkflow=we,Q.getWorkflows=qe,Q.graphQlManager=N,Q.illustrationStepService=ce,Q.materialStepService=Ge,Q.modelStepService=ve,Q.moduleStepService=pt,Q.optionService=L,Q.persistenceService=P,Q.pictureStepService=ke,Q.questionStepService=be,Q.shapeStepService=te,Q.shortenUrl=It,Q.spiffCoreConfiguration=W,Q.stepAspectValuesToDesignInputSteps=Un,Q.textStepService=O,Q.toast=Ft,Object.defineProperty(Q,Symbol.toStringTag,{value:"Module"})});
|
|
2972
|
+
`,Ae=async c=>{var e;for(const t in c.layouts){const A=c.layouts[t].elements.filter(a=>a.type===g.LayoutElementType.Illustration);for(let a=0;a<A.length;++a){const i=A[a];i.src&&i.svg&&(i.cachedObjectURL=await g.svgObjectURL(i.svg))}const n=c.layouts[t].elements.filter(a=>a.type===g.LayoutElementType.Textbox);for(let a=0;a<n.length;++a){const i=n[a];(e=i.fontData)!=null&&e.assetUrl&&await g.loadFont(i.fontData.assetUrl)}}},ua=async(c,e)=>{var n;const t=await N.getShadowGraphqlClient().query({query:ga(((n=e==null?void 0:e.assets)==null?void 0:n.metadata)||!1),errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}}),A=t.data.workflows;if(A===void 0||A.length!==c.length)throw new Error(`Unable to read workflows: ${t.errors??"Length mismatch in response"}`);return A.forEach(a=>{a.steps.forEach(i=>{var o,s,r;delete i.data.__typename,(o=i.option)!=null&&o.id&&((s=i.option.defaultVariant)!=null&&s.asset&&k.cacheAsset(i.option.defaultVariant.asset),i.option.colorProfile&&k.cacheAsset(i.option.colorProfile),(r=i.option.variants)==null||r.forEach(l=>{l.asset&&k.cacheAsset(l.asset),l.displayImage&&k.cacheAsset(l.displayImage),l.thumbnail&&k.cacheAsset(l.thumbnail),l.material&&k.cacheMaterial(l.material)}),Z.set({id:i.option.id},Promise.resolve(i.option)))})}),A},ma=async(c,e)=>{const A=(await e).find(n=>n.id===c);if(!A)throw new Error(`Workflow not found: ${c}`);return A},qe=async(c,e)=>{const t=c.map(o=>Z.get({id:o,options:e})),A=c.filter((o,s)=>t[s]===void 0);if(A.length===0)return Promise.all(t);const n=ua(A,e),a=A.map(o=>Z.set({id:o,options:e},ma(o,n))),i=t.filter(o=>o!==void 0);return await Promise.all(i.concat(a))},we=async(c,e)=>(await qe([c],e))[0],Ia=c=>c.sort((e,t)=>e.index-t.index).map(e=>({id:g.generate(),panelId:e.name,name:e.name,index:e.index,createdAt:new Date,updatedAt:new Date,transparentBackground:e.transparentBackground,height:e.height,width:e.width,previewRegion:e.previewRegion,useEditableArea:e.useEditableArea,editableArea:e.editableArea})),Ze=(c,e)=>{const t=c.workflowState,A=t?JSON.parse(t):void 0;return A?Object.values(A.layouts).map(n=>n.layout):Ia(e.panels)};class oA{constructor(e){this.updateTransactionState=async t=>{try{return N.getShadowGraphqlClient().mutate({...t,mutation:HA})}catch(A){throw console.error(A),new G("Critical - Unable to synchronize workflow state with server.")}},this.initialized=!1,this.options=e,this.options.applicationKey&&dA(this.options.applicationKey)}getAssetManager(){return k}getCurrencyCode(){if(this.currencyCode===void 0)throw new Error("No currency code set.");return this.currencyCode}getFlowService(){if(!wA())throw new Error("Application key required to use Flow Service.");return new nA}async getIntegration(){return(await N.getShadowGraphqlClient().query({query:Ba,errorPolicy:"all"})).data.currentIntegration}async authenticateBundleFromLocalStorage(e){var n,a;const t=P.getMap("bundleOwnerIds");if(t!=null&&t.has(e))return Promise.resolve({success:!0,stakeholderType:se.Owner});const A=P.getMap("bundlePartnerIds")||new Map;if(A.has(e)){const i=A.get(e),s=(P.getMap("partnerCustomerIds")||new Map).get(i);if(s&&await this.authenticateCustomerId(s)){const l=(a=(n=this.customer)==null?void 0:n.bundleStakeholders)==null?void 0:a.find(d=>{var B;return((B=d.bundle)==null?void 0:B.id)===e});if(l)return Promise.resolve({success:!0,stakeholderType:l.type})}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(e){var l,d,B,w,E,C;const t=N.getShadowGraphqlClient(),A=await t.query({query:la,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:e}});if(!A.data.transactions||A.data.transactions.length===0)throw new Error(`Transaction not found: ${e}`);const n=A.data.transactions[0];if(!((d=(l=n.product)==null?void 0:l.partner)==null?void 0:d.id))throw new Error(`Unable to read transaction: ${e}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const i=P.getMap("transactionOwnerIds");if(i!=null&&i.has(e))return Promise.resolve({success:!0,stakeholderType:se.Owner});const o=P.getMap("transactionCustomerIds");if(o!=null&&o.has(e)){const h=o.get(e);if(h&&await this.authenticateCustomerId(h)){const u=((w=(B=this.customer)==null?void 0:B.bundleStakeholders)==null?void 0:w.find(F=>{var I,f;return(f=(I=F.bundle)==null?void 0:I.transactions)==null?void 0:f.some(D=>D.id===e)}))||((C=(E=this.customer)==null?void 0:E.stakeholders)==null?void 0:C.find(F=>{var I;return((I=F.transaction)==null?void 0:I.id)===e}));if(u)return Promise.resolve({success:!0,stakeholderType:u.type})}}const r=(await t.query({query:da,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(e){const t=P.getMap("transactionCustomerIds");t!=null&&t.has(e)&&(t.delete(e),P.setMap("transactionCustomerIds",t))}getStakeholderTypeForTransaction(e){var A,n;const t=(n=(A=this.customer)==null?void 0:A.stakeholders)==null?void 0:n.find(a=>{var i;return((i=a.transaction)==null?void 0:i.id)===e});if(t)return t.type}async getOrCreateCustomer(e){var i;this.customer=void 0;const t=N.getShadowGraphqlClient(),n=(await t.query({query:wa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:e}})).data.customer;if(!n.id){const s=(i=(await t.mutate({mutation:Ea,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:e}}})).data)==null?void 0:i.customerCreate;if(!s)throw new Error("Unable to create customer.");return this.storeCustomer(s),this.customer=s,{customer:s,isAuthenticated:!1}}this.storeCustomer(n);const a=await this.authenticateCustomerId(n.id);return{customer:this.customer||n,isAuthenticated:a}}async authenticateCustomerId(e){var o;const t=N.getShadowGraphqlClient(),A=P.getMap("customerTokens");if(!(A!=null&&A.has(e)))return!1;const n=A.get(e);if(!n)return!1;const i=(o=(await t.mutate({mutation:ha,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data)==null?void 0:o.customerAuthenticate;return i?(this.storeCustomer(i),rt(n),this.customer=i,!0):!1}async generateVerificationCode(e){await N.getShadowGraphqlClient().mutate({mutation:Ca,variables:{emailAddress:e}})}async verifyCode(e,t){var a,i;const n=(a=(await N.getShadowGraphqlClient().mutate({mutation:Qa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:e,verificationCode:t}})).data)==null?void 0:a.customerVerifyCode;if(n!=null&&n.loginToken){if(!((i=n.partner)!=null&&i.id))throw new Error(`Unable to find customer: ${e}`);const o=P.getMap("customerTokens")||new Map;return o.set(n.id,n.loginToken),P.setMap("customerTokens",o),this.storeCustomer(n),rt(n.loginToken),this.customer={...n,loginToken:void 0},!0}return!1}async getNewBundle(e,t,A){var s,r,l;const a=(l=(await N.getShadowGraphqlClient().mutate({mutation:Ln(((r=(s=A==null?void 0:A.graphql)==null?void 0:s.productCollection)==null?void 0:r.eagerFetchProducts)||!1),variables:{collectionId:e,initialMetadata:t?Object.entries(t).map((d,B)=>({key:d[0],value:d[1]})):void 0},fetchPolicy:"no-cache"})).data)==null?void 0:l.bundleCreate;if(!(a!=null&&a.id))throw new Error("Unable to create bundle");const i=P.getMap("bundlePartnerIds")||new Map;i.set(a.id,a.partner.id),P.setMap("bundlePartnerIds",i);const o=P.getMap("bundleOwnerIds")||new Map;return o.set(a.id,a.bundleOwnerId),P.setMap("bundleOwnerIds",o),new AA(this,a,void 0,void 0,a.bundleOwnerId)}async getExistingBundle(e,t,A,n){var d,B,w,E,C,h;const a=P.getMap("bundleOwnerIds"),i=a==null?void 0:a.get(e),o=await N.getShadowGraphqlClient().query({query:kn(((B=(d=n==null?void 0:n.graphql)==null?void 0:d.productCollection)==null?void 0:B.eagerFetchProducts)||!1),variables:{id:e},fetchPolicy:"no-cache",context:{bundleOwnerId:i}});if(!((w=o.data)!=null&&w.bundles)||((E=o.data)==null?void 0:E.bundles.length)===0||!((C=o.data)!=null&&C.bundles[0]))throw new Error(`Unable to find bundle: ${e}`);const s=(h=o.data)==null?void 0:h.bundles[0],r=P.getMap("bundlePartnerIds")||new Map;r.set(s.id,s.partner.id),P.setMap("bundlePartnerIds",r);const l=new AA(this,s,t,A,i);return await l.getInitializationPromise(),l}async getBundleStakeholders(){var a;if(!this.customer)throw new Error("Customer not authenticated.");const e=await N.getShadowGraphqlClient().query({query:Jn,variables:{id:this.customer.id},fetchPolicy:"no-cache"});if(!((a=e.data)!=null&&a.customers)||e.data.customers.length===0)throw new Error("Unable to find customer.");const A=e.data.customers[0].bundleStakeholders||[],n=P.getMap("bundlePartnerIds")||new Map;return A.forEach(i=>{var o,s;(o=i.bundle)!=null&&o.id&&((s=i.bundle.partner)!=null&&s.id)&&n.set(i.bundle.id,i.bundle.partner.id)}),P.setMap("bundlePartnerIds",n),A}async getWorkflowExperience(e,t,A,n){var d,B,w,E,C;if(!n)return await this.getWorkflowExperienceDeprecated(e,t,A);const a=async()=>{var m,u;const h=N.getShadowGraphqlClient();if(n.type==="transaction"){const{transactionId:F,readOnly:I}=n,f=await h.query({query:ue,variables:{ids:[F]},errorPolicy:"all",fetchPolicy:"no-cache"});if(!((m=f.data)!=null&&m.transactions)||f.data.transactions.length===0)throw new G("Existing transaction not found.");const D=(u=f.data)==null?void 0:u.transactions[0];if(!D.workflowId)throw new G("Existing transaction has no workflow ID.");const p=await we(D.workflowId);if(!D.product)throw new G("Failed to load transaction, product not available.");return{transaction:D,workflow:p,readOnly:I}}if(n.type==="integration"||n.type==="external"){const F=async()=>{const p=n.type==="integration"?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},S=await h.mutate({mutation:Et,variables:{...p,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!S.data||!S.data.transactionCreate)throw new G("Failed to create transaction!");const y=S.data.transactionCreate;if(!y.product)throw new G("Failed to create transaction, product not available.");return y},I=we(n.workflowId,n==null?void 0:n.graphql),[f,D]=await Promise.all([F(),I]);return{transaction:f,workflow:D}}throw new G("No workflow ID provided.")},{transaction:i,workflow:o,readOnly:s}=await a();this.currencyCode=(d=i.product.partner)==null?void 0:d.currencyCode;const r={product:i.product,transaction:i,layouts:[],singleVariantsRenderable:(B=n==null?void 0:n.workflowConfiguration)==null?void 0:B.singleVariantsRenderable,stateMutationFunc:s?async()=>{throw new v("State mutation is forbidden in read only mode!")}:async h=>{const u=(P.getMap("transactionOwnerIds")||new Map).get(i.id)||void 0;return this.updateTransactionState({...h,context:{transactionOwnerId:u}})},readOnly:s,workflow:o};if(n.type==="transaction"&&i.workflowState){const h=JSON.parse(i.workflowState);r.layouts=Object.values(h.layouts).map(m=>m.layout),await g.rehydrateSerializedLayout(h),await Ae(h),r.reloadedState=h}else if(!s&&n.workflowState){const h=JSON.parse(n.workflowState);r.layouts=Object.values(h.layouts).map(m=>m.layout),await g.rehydrateSerializedLayout(h),await Ae(h),r.reloadedState=h}else r.layouts=Ze(r.transaction,r.workflow);if(r.renderableContextService=new Me(r.layouts),n.previewService?(r.previewService=n.previewService,(w=r.product)!=null&&w.modelUrl&&(r.modelContainer=r.previewService.loadModel({model:r.product.modelUrl,contextService:r.renderableContextService}))):(r.previewService=A&&A(o),(E=r.product)!=null&&E.modelUrl&&(r.modelContainer=(C=r.previewService)==null?void 0:C.loadModel({model:r.product.modelUrl,contextService:r.renderableContextService}))),n.type!=="transaction"){const h=P.getMap("transactionOwnerIds")||new Map;h.set(i.id,i.transactionOwnerId),P.setMap("transactionOwnerIds",h)}else r.isReloadedTransaction=!0;this.initialized=!0,this.experienceOptions=r;const l=new le(this,r);return await l.getWorkflowManager().getInitializationPromise(),n.type!=="transaction"&&this.customer&&await l.attachCustomerDetails({email:this.customer.emailAddress}),l}async getWorkflowExperiences(e,t){if(e.length===0)throw new G("No options provided!");const A=N.getShadowGraphqlClient(),n=async f=>{var y,x;if(f.length===0)return[];const D=f.map(Y=>Y.option.transactionId),p=await A.query({query:ue,variables:{ids:D},errorPolicy:"all",fetchPolicy:"no-cache"}),S=p.data.transactions;if(S.length!==f.length){const Y=((x=(y=p.errors)==null?void 0:y[0])==null?void 0:x.message)||"Unknown error";throw new G(`Not all transactions were found: ${Y}`)}return S.map((Y,H)=>{var R;return{transaction:Y,workflowId:Y.workflowId,readOnly:((R=f.find(T=>T.option.transactionId===Y.id))==null?void 0:R.option.readOnly)??!1,index:f[H].index}})},a=async f=>{var S,y,x;if(f.length===0)return[];const D=await A.mutate({mutation:xA,variables:{inputs:f.map(Y=>({integrationProductId:Y.option.type==="integration"?Y.option.integrationProductId:void 0,externalIntegrationId:Y.option.type==="external"?Y.option.externalIntegrationId:void 0,externalProductId:Y.option.type==="external"?Y.option.externalProductId:void 0,workflowId:Y.option.workflowId,claim:!0}))},errorPolicy:"all",fetchPolicy:"no-cache"}),p=(S=D.data)==null?void 0:S.transactionCreateMany;if(!p||p.length===0){const Y=((x=(y=D.errors)==null?void 0:y[0])==null?void 0:x.message)||"Unknown error";throw new G(`Failed to create transactions: ${Y}`)}return p.map((Y,H)=>({transaction:Y,workflowId:Y.workflowId,readOnly:!1,index:f[H].index}))},i=e.map((f,D)=>({option:f,index:D})),o=i.filter(f=>f.option.type==="transaction"),s=i.filter(f=>f.option.type==="integration"||f.option.type==="external"),r=at(o,10),l=at(s,10),d=(await Promise.all([...r.map(n),...l.map(a)])).flat(),B=[...new Set(d.map(f=>f.workflowId))],w=await qe(B,t),E=new Map(w.map(f=>[f.id,f])),C=P.getMap("transactionOwnerIds")||new Map,h=d.map(async f=>{var T;const{transaction:D,workflowId:p,readOnly:S,index:y}=f,x=E.get(p),Y=e[y];!C.get(D.id)&&D.transactionOwnerId&&C.set(D.id,D.transactionOwnerId);const H=C.get(D.id)||void 0,R={product:D.product,transaction:D,layouts:[],singleVariantsRenderable:(T=Y==null?void 0:Y.workflowConfiguration)==null?void 0:T.singleVariantsRenderable,stateMutationFunc:S?async()=>{throw new v("State mutation is forbidden in read only mode!")}:async b=>this.updateTransactionState({...b,context:{transactionOwnerId:H}}),readOnly:S,workflow:x,isReloadedTransaction:Y.type==="transaction"};if(Y.type==="transaction"&&D.workflowState){const b=JSON.parse(D.workflowState);R.layouts=Object.values(b.layouts).map(z=>z.layout),await g.rehydrateSerializedLayout(b),await Ae(b),R.reloadedState=b}else if(!S&&Y.workflowState){const b=JSON.parse(Y.workflowState);R.layouts=Object.values(b.layouts).map(z=>z.layout),await g.rehydrateSerializedLayout(b),await Ae(b),R.reloadedState=b}else R.layouts=Ze(R.transaction,R.workflow);return R.renderableContextService=new Me(R.layouts),R.delayWorkflowStateSync=!0,this.initialized=!0,this.experienceOptions=R,{experienceOptions:R,index:y,options:Y}});P.setMap("transactionOwnerIds",C);const F=(await Promise.all(h)).sort((f,D)=>f.index-D.index).map(async f=>{const{experienceOptions:D,options:p}=f,S=new le(this,D);return await S.getWorkflowManager().getInitializationPromise(),p.type!=="transaction"&&this.customer&&await S.attachCustomerDetails({email:this.customer.emailAddress}),S}),I=await Promise.all(F);return I.forEach(f=>f.getWorkflowManager().setWorkflowStateSyncEnabled(!0)),I}async initFromIntegrationProduct(e){var i;if(e==="")throw new G("No integration product ID provided.");const A=await N.getShadowGraphqlClient().mutate({mutation:Et,variables:{integrationProductId:e,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!A.data||!A.data.transactionCreate)throw new G("Failed to create transaction!");const n=A.data.transactionCreate;if(!n.product)throw new G("Failed to create transaction, product not available.");this.currencyCode=(i=n.product.partner)==null?void 0:i.currencyCode;const a=P.getMap("transactionOwnerIds")||new Map;a.set(n.id,n.transactionOwnerId),P.setMap("transactionOwnerIds",a),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async o=>this.updateTransactionState({...o,context:{transactionOwnerId:n.transactionOwnerId}})},this.initialized=!0}async initFromTransaction(e,t=!1){var o,s,r,l;if(e==="")throw new G("No transaction ID provided.");const A=N.getShadowGraphqlClient(),n=async()=>{var w,E;const B=(w=(await A.query({query:ue,variables:{ids:[e]},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:w.transactions[0];if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(E=B.product.partner)==null?void 0:E.currencyCode,this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async()=>{throw new v("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0};if(t)return await n();const a=P.getMap("transactionOwnerIds")||new Map,i=a.get(e);if(i){const B=(o=(await A.query({query:ue,variables:{ids:[e]},errorPolicy:"all"})).data)==null?void 0:o.transactions[0];if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(s=B.product.partner)==null?void 0:s.currencyCode,this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async w=>this.updateTransactionState({...w,context:{transactionOwnerId:i}}),readOnly:t},this.initialized=!0;return}try{const B=(r=(await A.mutate({mutation:NA,variables:{id:e},errorPolicy:"all"})).data)==null?void 0:r.transactionClaim;if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(l=B.product.partner)==null?void 0:l.currencyCode,B.transactionOwnerId&&(a.set(B.id,B.transactionOwnerId),P.setMap("transactionOwnerIds",a)),this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async w=>this.updateTransactionState({...w,context:{transactionOwnerId:B.transactionOwnerId}}),readOnly:t},this.initialized=!0}catch{throw new G("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(e,t,A){var n,a,i,o;if(!this.initialized||!this.experienceOptions)throw new G("Cannot launch experience: Not initialized.");if(this.experienceOptions.transaction.workflowId){const s=await we(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=s,this.experienceOptions.transaction.workflowState){const l=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(l.layouts).map(d=>d.layout),await g.rehydrateSerializedLayout(l),await Ae(l),this.experienceOptions.reloadedState=l}this.experienceOptions.previewService=A&&A(s),this.experienceOptions.renderableContextService=new Me(this.experienceOptions.layouts),(n=this.experienceOptions.product)!=null&&n.modelUrl&&(this.experienceOptions.modelContainer=(a=this.experienceOptions.previewService)==null?void 0:a.loadModel({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}));const r=new le(this,this.experienceOptions);return await r.getWorkflowManager().getInitializationPromise(),r}if(e){const r=(P.getMap("transactionOwnerIds")||new Map).get(this.experienceOptions.transaction.id),l=N.getShadowGraphqlClient().mutate({mutation:RA,variables:{workflowId:e,id:this.experienceOptions.transaction.id},context:{transactionOwnerId:r}}),d=we(e);if(await Promise.all([l,d]),this.experienceOptions.workflow=await d,t){const w=JSON.parse(t);this.experienceOptions.layouts=Object.values(w.layouts).map(E=>E.layout),await g.rehydrateSerializedLayout(w),await Ae(w),this.experienceOptions.reloadedState=w}else this.experienceOptions.layouts=Ze(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=A&&A(await d),this.experienceOptions.renderableContextService=new Me(this.experienceOptions.layouts),(i=this.experienceOptions.product)!=null&&i.modelUrl&&(this.experienceOptions.modelContainer=(o=this.experienceOptions.previewService)==null?void 0:o.loadModel({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}));const B=new le(this,this.experienceOptions);return await B.getWorkflowManager().getInitializationPromise(),B}throw new G("No workflow ID provided.")}getPreviewService(){var e;return(e=this.experienceOptions)==null?void 0:e.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new G("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new G("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}configureUrls(e,t,A){W.setHubUrl(e),W.setServerUrl(t),W.setServicesApiUrl(A)}storeCustomer(e){const t=P.getMap("partnerCustomerIds")||new Map;t.set(e.partner.id,e.id),P.setMap("partnerCustomerIds",t)}async getIntegrationProductById(e){var a,i;const n=(a=(await N.getShadowGraphqlClient().query({query:GA,variables:{ids:[e]},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:a.integrationProducts;if(!n||n.length===0||!((i=n[0])!=null&&i.id))throw new Error("Integration product not found.");return new Xe(n[0])}async getIntegrationProductFromExternalIds(e,t){var i;const a=(i=(await N.getShadowGraphqlClient().query({query:vA,variables:{externalProductId:t,externalIntegrationId:e},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:i.integrationProductFromExternalIds;if(!(a!=null&&a.id))throw new Error("Integration product not found.");return new Xe(a)}async getIntegrationProduct(e){return e.type==="integration"?this.getIntegrationProductById(e.integrationProductId):this.getIntegrationProductFromExternalIds(e.externalIntegrationId,e.externalProductId)}}class fa{getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}async reset(){}updateStateWithServer(e){}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(e){}addPoller(e){}addConfirmCallback(e){}addEditedCallback(e){}addElementsCallback(e){}addInformationResultCallback(e){}addInitCallback(e){}addMakingAdjustmentsCallback(e){}addMandatoryCallback(e){}addMetadataCallback(e){}addSelectionCallback(e){}addStepSpecificStorageCallback(e,t){}addStorageCallback(e){}getCommandDispatcher(){return e=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getModelContainer(){}getProfanities(){return[]}getRegionElements(e){return[]}getSerializedStep(e,t){}getStepSpecificServices(e){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(e){}markUpdateCompleted(e){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(e){}setEditedStatus(e,t){}setInformationResults(e){}setMandatoryFulfilled(e,t){}async setSelectionsAndElements(e,t,A){}toggleDesignConfirmed(){}updateMetadata(e,t){}async updateStorage(e,t){}injectIntoPreviewService(e){return Promise.resolve()}ejectFromPreviewService(){}setWorkflowStateSyncEnabled(e){}}var sA=(c=>(c.SelectFrame="SelectFrame",c.SelectImage="SelectImage",c.Position="Position",c))(sA||{});class rA extends j{constructor(e,t){var A;super(e,t),this.frameService=(A=this.manager.getStepSpecificServices(this.getId()))==null?void 0:A.frameService}selectVariant(e){const t=this.manager.getRegionElements(this.step.stepName);return Ie.selectVariant(this.step,e.getResource(),t,this.manager,A=>this.setUpdateState(A))}onFrameDataChanged(e){this.frameService&&this.frameService.onFrameDataChanged(t=>{t&&e(t)})}selectImage(e){return Ie.selectImage(this.step,e,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(e,t,A,n){return n&&n.length>1&&e===void 0?"SelectFrame":t||A||this.getImageData()?"Position":"SelectImage"}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}}Object.defineProperty(Q,"AspectType",{enumerable:!0,get:()=>g.AspectType}),Object.defineProperty(Q,"AssetType",{enumerable:!0,get:()=>g.AssetType}),Object.defineProperty(Q,"BringForwardCommand",{enumerable:!0,get:()=>g.BringForwardCommand}),Object.defineProperty(Q,"BringToBackCommand",{enumerable:!0,get:()=>g.BringToBackCommand}),Object.defineProperty(Q,"BringToFrontCommand",{enumerable:!0,get:()=>g.BringToFrontCommand}),Object.defineProperty(Q,"CanvasCommand",{enumerable:!0,get:()=>g.CanvasCommand}),Object.defineProperty(Q,"CommandContext",{enumerable:!0,get:()=>g.CommandContext}),Object.defineProperty(Q,"CreateElementCommand",{enumerable:!0,get:()=>g.CreateElementCommand}),Object.defineProperty(Q,"CreateLayoutCommand",{enumerable:!0,get:()=>g.CreateLayoutCommand}),Object.defineProperty(Q,"DeleteElementCommand",{enumerable:!0,get:()=>g.DeleteElementCommand}),Object.defineProperty(Q,"FontAlignmentCommand",{enumerable:!0,get:()=>g.FontAlignmentCommand}),Object.defineProperty(Q,"FontColorCommand",{enumerable:!0,get:()=>g.FontColorCommand}),Object.defineProperty(Q,"FontSizeCommand",{enumerable:!0,get:()=>g.FontSizeCommand}),Object.defineProperty(Q,"FontSourceCommand",{enumerable:!0,get:()=>g.FontSourceCommand}),Object.defineProperty(Q,"GroupCommand",{enumerable:!0,get:()=>g.GroupCommand}),Object.defineProperty(Q,"LayoutElementFactory",{enumerable:!0,get:()=>g.LayoutElementFactory}),Object.defineProperty(Q,"LayoutElementType",{enumerable:!0,get:()=>g.LayoutElementType}),Object.defineProperty(Q,"MoveCommand",{enumerable:!0,get:()=>g.MoveCommand}),Object.defineProperty(Q,"ResizeCommand",{enumerable:!0,get:()=>g.ResizeCommand}),Object.defineProperty(Q,"RotateCommand",{enumerable:!0,get:()=>g.RotateCommand}),Object.defineProperty(Q,"SendBackwardsCommand",{enumerable:!0,get:()=>g.SendBackwardsCommand}),Object.defineProperty(Q,"StepAspectType",{enumerable:!0,get:()=>g.StepAspectType}),Object.defineProperty(Q,"StepType",{enumerable:!0,get:()=>g.StepType}),Object.defineProperty(Q,"TextChangeCommand",{enumerable:!0,get:()=>g.TextChangeCommand}),Object.defineProperty(Q,"UnitOfMeasurement",{enumerable:!0,get:()=>g.UnitOfMeasurement}),Object.defineProperty(Q,"dataUrlFromExternalUrl",{enumerable:!0,get:()=>g.dataUrlFromExternalUrl}),Object.defineProperty(Q,"determineCorrectFontSizeAndLines",{enumerable:!0,get:()=>g.determineCorrectFontSizeAndLines}),Object.defineProperty(Q,"findElement",{enumerable:!0,get:()=>g.findElement}),Object.defineProperty(Q,"frameDataCache",{enumerable:!0,get:()=>g.frameDataCache}),Object.defineProperty(Q,"generate",{enumerable:!0,get:()=>g.generate}),Object.defineProperty(Q,"generateSVGWithUnknownColors",{enumerable:!0,get:()=>g.generateSVGWithUnknownColors}),Object.defineProperty(Q,"getAttributesFromArrayBuffer",{enumerable:!0,get:()=>g.getAttributesFromArrayBuffer}),Object.defineProperty(Q,"getAxisAlignedBoundingBox",{enumerable:!0,get:()=>g.getAxisAlignedBoundingBox}),Object.defineProperty(Q,"getFrameData",{enumerable:!0,get:()=>g.getFrameData}),Object.defineProperty(Q,"getSvgElement",{enumerable:!0,get:()=>g.getSvgElement}),Object.defineProperty(Q,"loadFont",{enumerable:!0,get:()=>g.loadFont}),Object.defineProperty(Q,"patternImageDataCache",{enumerable:!0,get:()=>g.patternImageDataCache}),Object.defineProperty(Q,"registerFetchImplementation",{enumerable:!0,get:()=>g.registerFetchImplementation}),Object.defineProperty(Q,"registerWindowImplementation",{enumerable:!0,get:()=>g.registerWindowImplementation}),Object.defineProperty(Q,"rehydrateSerializedLayout",{enumerable:!0,get:()=>g.rehydrateSerializedLayout}),Object.defineProperty(Q,"setCanvasModule",{enumerable:!0,get:()=>g.setCanvasModule}),Q.ArrayInput=ia,Q.AssetNotFoundError=V,Q.CollectionProduct=ye,Q.ColorOptionGlobalPropertyHandle=$t,Q.ConversionDataType=wt,Q.ConversionLocation=dt,Q.FileUploadGlobalPropertyHandle=qt,Q.FlowExecutionNodeResult=de,Q.FlowExecutionResult=aA,Q.FlowService=nA,Q.FrameService=ut,Q.FrameStep=sA,Q.FrameStepHandle=rA,Q.GlobalPropertyHandle=Se,Q.IllustrationStepHandle=Rt,Q.InformationMessageType=ge,Q.InformationStepHandle=Tt,Q.IntegrationProduct=Xe,Q.IntegrationType=lt,Q.LayoutNotFoundError=J,Q.MaterialStepHandle=Ut,Q.MisconfigurationError=ie,Q.MockWorkflowManager=fa,Q.ModelStepHandle=Gt,Q.ObjectInput=We,Q.ObjectInputType=iA,Q.OptionGlobalPropertyHandle=Ke,Q.OptionNotFoundError=ae,Q.ParseError=q,Q.PictureStepHandle=vt,Q.ProductCameraRig=Bt,Q.ProductCollection=_t,Q.ProductWorkflow=Be,Q.PromiseCache=Z,Q.PromiseQueue=Ue,Q.QuestionStepHandle=kt,Q.QueueablePromise=Re,Q.ResourceNotFoundError=X,Q.ShapeStepHandle=bt,Q.SpiffCommerceClient=oA,Q.StakeholderType=se,Q.StepHandle=j,Q.TextGlobalPropertyHandle=Zt,Q.TextInput=aa,Q.TextStepHandle=Jt,Q.Transform=tA,Q.TransformCollection=eA,Q.UnhandledBehaviorError=v,Q.Variant=K,Q.WorkflowExperienceEventType=Kt,Q.WorkflowExperienceImpl=le,Q.assetService=k,Q.createDesign=jt,Q.designService=Fe,Q.digitalContentStepService=Dt,Q.frameStepService=Ie,Q.generateCommands=Vt,Q.generateStateFromDesignInputSteps=Gn,Q.getBoundedOffsets=Qt,Q.getWorkflow=we,Q.getWorkflows=qe,Q.graphQlManager=N,Q.illustrationStepService=ce,Q.materialStepService=Ge,Q.modelStepService=ve,Q.moduleStepService=pt,Q.optionService=L,Q.persistenceService=P,Q.pictureStepService=ke,Q.questionStepService=be,Q.shapeStepService=te,Q.shortenUrl=It,Q.spiffCoreConfiguration=W,Q.stepAspectValuesToDesignInputSteps=Un,Q.textStepService=O,Q.toast=Ft,Object.defineProperty(Q,Symbol.toStringTag,{value:"Module"})});
|