@useinsider/guido 3.19.0-beta.3d545d6 → 3.19.0-beta.3daecd0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/@types/config/schemas.js +104 -91
- package/dist/components/Guido.vue.js +3 -3
- package/dist/components/Guido.vue2.js +89 -79
- package/dist/components/organisms/base/AuthErrorModal.vue.js +5 -5
- package/dist/components/organisms/base/AuthErrorModal.vue2.js +29 -16
- package/dist/composables/useAuthError.js +1 -0
- package/dist/composables/useAutoSave.js +11 -11
- package/dist/composables/useCortexBlueprintBridge.js +122 -54
- package/dist/composables/useEmailTemplateApplier.js +111 -50
- package/dist/composables/useHttp.js +34 -31
- package/dist/composables/useLegacyStrategyConversion.js +23 -19
- package/dist/composables/useStripo.js +24 -20
- package/dist/config/migrator/index.js +14 -13
- package/dist/config/migrator/itemsBlockMigrator.js +236 -248
- package/dist/config/migrator/recommendationMigrator.js +28 -21
- package/dist/config/migrator/recommendationPartnerMigrator.js +56 -0
- package/dist/enums/extensions/recommendationBlock.js +30 -29
- package/dist/extensions/Blocks/Items/block.js +48 -45
- package/dist/extensions/Blocks/Items/constants/cardLayout.js +20 -0
- package/dist/extensions/Blocks/Items/controls/name/trimming.js +18 -17
- package/dist/extensions/Blocks/Items/controls/settingsControl.js +114 -105
- package/dist/extensions/Blocks/Items/enums/productEnums.js +14 -9
- package/dist/extensions/Blocks/Items/layouts/horizontal.html.js +11 -9
- package/dist/extensions/Blocks/Items/template.js +219 -204
- package/dist/extensions/Blocks/Recommendation/block.js +15 -14
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +45 -38
- package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +72 -49
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +30 -29
- package/dist/extensions/Blocks/Recommendation/utils/partnerCustomizations.js +3 -1
- package/dist/extensions/Blocks/Recommendation/utils/partnerScope.js +25 -0
- package/dist/guido.css +1 -1
- package/dist/src/@types/config/schemas.d.ts +16 -0
- package/dist/src/composables/useAuthError.d.ts +1 -0
- package/dist/src/composables/useConfig.d.ts +2 -0
- package/dist/src/composables/useCortexBlueprintBridge.d.ts +2 -3
- package/dist/src/composables/useEmailTemplateApplier.d.ts +18 -5
- package/dist/src/composables/useGuidoActions.d.ts +2 -0
- package/dist/src/config/migrator/index.d.ts +2 -1
- package/dist/src/config/migrator/recommendationPartnerMigrator.d.ts +19 -0
- package/dist/src/enums/extensions/recommendationBlock.d.ts +1 -1
- package/dist/src/extensions/Blocks/Items/constants/cardLayout.d.ts +44 -0
- package/dist/src/extensions/Blocks/Items/enums/productEnums.d.ts +3 -0
- package/dist/src/extensions/Blocks/Items/template.d.ts +19 -0
- package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +6 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/partnerScope.d.ts +33 -0
- package/dist/src/mock/cortexChatStore.d.ts +12 -0
- package/dist/src/stores/config.d.ts +20 -0
- package/dist/src/stores/guido-email-editor.d.ts +20 -10
- package/dist/src/stores/onboarding.d.ts +4 -0
- package/dist/src/stores/recommendation.d.ts +5 -0
- package/dist/src/utils/dateUtil.d.ts +10 -0
- package/dist/src/utils/genericUtil.d.ts +3 -0
- package/dist/static/styles/components/recommendation-strategy.css.js +9 -0
- package/dist/static/styles/components/version-history.css.js +2 -6
- package/dist/stores/guido-email-editor.js +3 -1
- package/dist/stores/onboarding.js +4 -0
- package/dist/utils/pairProductVariables.js +71 -71
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BlockId as f } from "../../enums/block.js";
|
|
2
|
-
import { DEFAULT_NODE_CONFIG as
|
|
3
|
-
import { ATTR_RECOMMENDATION_TITLE as
|
|
2
|
+
import { DEFAULT_NODE_CONFIG as y } from "../../extensions/Blocks/Recommendation/constants/defaultConfig.js";
|
|
3
|
+
import { ATTR_RECOMMENDATION_TITLE as b } from "../../extensions/Blocks/Recommendation/constants/selectors.js";
|
|
4
4
|
import { useTemplateStore as T } from "../../stores/template.js";
|
|
5
5
|
import { mapComposition as v } from "./recommendation/compositionMapper.js";
|
|
6
6
|
import { extractCurrencyFromBlock as C, extractTitleText as M, hasVisibleTitle as R, extractCardBgColor as S, isPartnerManagedBlock as h } from "./recommendation/extractors.js";
|
|
@@ -8,28 +8,28 @@ import { buildBlockHtml as w } from "./recommendation/htmlBuilder.js";
|
|
|
8
8
|
import { parseRecommendationId as x, parseLegacyConfig as E } from "./recommendation/parseLegacyConfig.js";
|
|
9
9
|
import { mapSettings as A } from "./recommendation/settingsMapper.js";
|
|
10
10
|
const H = 'td[esd-dev-product-config][class*="ins-recommendation-v3-block-"]:not(.recommendation-block-v2), td.product-block[esd-handler-name*="EmailRecommendationV3"][esd-dev-product-config]:not(.recommendation-block-v2)';
|
|
11
|
-
function B(n, t,
|
|
11
|
+
function B(n, t, c) {
|
|
12
12
|
var l;
|
|
13
|
-
const
|
|
14
|
-
if (
|
|
13
|
+
const r = x(t);
|
|
14
|
+
if (r === null)
|
|
15
15
|
return console.warn(
|
|
16
16
|
"[RecommendationMigrator] Skipping block — missing/invalid `ins-recommendation-v3-campaign-id`"
|
|
17
17
|
), !1;
|
|
18
|
-
const
|
|
19
|
-
if (!
|
|
18
|
+
const o = E(t);
|
|
19
|
+
if (!o)
|
|
20
20
|
return console.warn(
|
|
21
|
-
`[RecommendationMigrator] Aborting block id=${
|
|
21
|
+
`[RecommendationMigrator] Aborting block id=${r} — \`esd-dev-product-config\` missing or unable to be parsed`
|
|
22
22
|
), !1;
|
|
23
|
-
const
|
|
23
|
+
const a = c[String(r)] ?? {
|
|
24
24
|
currencySettings: C(t)
|
|
25
|
-
},
|
|
26
|
-
e.titleVariable || (e.visibility[
|
|
25
|
+
}, i = A(a, o, r), e = v((l = o.composition) == null ? void 0 : l.variables), d = M(t);
|
|
26
|
+
e.titleVariable || (e.visibility[b] = R(t));
|
|
27
27
|
const p = S(t), g = {
|
|
28
|
-
...
|
|
28
|
+
...i,
|
|
29
29
|
strategyId: "",
|
|
30
30
|
composition: e.composition,
|
|
31
31
|
visibility: e.visibility,
|
|
32
|
-
previousTitleHtml:
|
|
32
|
+
previousTitleHtml: y.previousTitleHtml,
|
|
33
33
|
textTrimming: e.anyTextTrimming
|
|
34
34
|
}, m = h(t), u = `
|
|
35
35
|
<table>
|
|
@@ -56,30 +56,37 @@ function B(n, t, a) {
|
|
|
56
56
|
</table>
|
|
57
57
|
`, s = n.parseFromString(u, "text/html").querySelector("td.esd-structure");
|
|
58
58
|
return !s || !t.parentNode ? (console.warn(
|
|
59
|
-
`[RecommendationMigrator] Aborting block id=${
|
|
59
|
+
`[RecommendationMigrator] Aborting block id=${r} — failed to construct new HTML element`
|
|
60
60
|
), !1) : (t.parentNode.replaceChild(s, t), !0);
|
|
61
61
|
}
|
|
62
62
|
function G(n, t = {}) {
|
|
63
|
-
const
|
|
63
|
+
const c = new DOMParser();
|
|
64
|
+
let r;
|
|
65
|
+
try {
|
|
66
|
+
r = c.parseFromString(n, "text/html");
|
|
67
|
+
} catch (i) {
|
|
68
|
+
return console.error("[RecommendationMigrator] Failed to parse template:", i), n;
|
|
69
|
+
}
|
|
70
|
+
const o = Array.from(r.querySelectorAll(H));
|
|
64
71
|
try {
|
|
65
72
|
T().$patch((e) => {
|
|
66
73
|
e.migrations = {
|
|
67
74
|
...e.migrations,
|
|
68
|
-
[f.Recommendation]:
|
|
75
|
+
[f.Recommendation]: o.length
|
|
69
76
|
};
|
|
70
77
|
});
|
|
71
78
|
} catch {
|
|
72
79
|
}
|
|
73
|
-
if (
|
|
80
|
+
if (o.length === 0)
|
|
74
81
|
return n;
|
|
75
|
-
let
|
|
76
|
-
return
|
|
82
|
+
let a = 0;
|
|
83
|
+
return o.forEach((i) => {
|
|
77
84
|
try {
|
|
78
|
-
B(
|
|
85
|
+
B(c, i, t) && (a += 1);
|
|
79
86
|
} catch (e) {
|
|
80
87
|
console.error("[RecommendationMigrator] Unexpected error migrating block:", e);
|
|
81
88
|
}
|
|
82
|
-
}),
|
|
89
|
+
}), a > 0 && console.info(`[RecommendationMigrator] Migrated ${a} legacy Recommendation block(s)`), r.documentElement.outerHTML;
|
|
83
90
|
}
|
|
84
91
|
export {
|
|
85
92
|
G as migrateRecommendation
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { RECOMMENDATION_ID_ATTR as a, SELECTOR_ATTRIBUTE_ROW as f, ATTR_DATA_ATTRIBUTE_TYPE as _, ATTR_CUSTOM_PREFIX as g, ATTR_DATA_CARD_COMPOSITION as m, ATTR_DATA_CUSTOM_ATTRIBUTES as R } from "../../extensions/Blocks/Recommendation/constants/selectors.js";
|
|
2
|
+
import { carriesForeignPartnerConfig as O, canJudgeUnstampedBlock as d, withoutCustomAttributes as l } from "../../extensions/Blocks/Recommendation/utils/partnerScope.js";
|
|
3
|
+
const E = ".recommendation-block-v2[esd-ext-config]", T = "esd-ext-config";
|
|
4
|
+
function S(t) {
|
|
5
|
+
const r = t.getAttribute(T);
|
|
6
|
+
if (!r)
|
|
7
|
+
return null;
|
|
8
|
+
try {
|
|
9
|
+
const e = JSON.parse(r);
|
|
10
|
+
return e && typeof e == "object" && !Array.isArray(e) ? e : null;
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function p(t, r, e) {
|
|
16
|
+
const s = l(r.composition ?? []);
|
|
17
|
+
t.querySelectorAll(f).forEach((o) => {
|
|
18
|
+
var u;
|
|
19
|
+
(u = o.getAttribute(_)) != null && u.startsWith(g) && o.remove();
|
|
20
|
+
}), t.setAttribute(m, s.join(",")), t.setAttribute(R, "[]"), t.setAttribute(T, JSON.stringify({
|
|
21
|
+
...r,
|
|
22
|
+
strategyId: "",
|
|
23
|
+
strategy: "",
|
|
24
|
+
filters: [],
|
|
25
|
+
productIds: [],
|
|
26
|
+
composition: s,
|
|
27
|
+
partnerName: e
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
function I(t, { partnerName: r, campaignUrls: e, rrsEnabled: s }) {
|
|
31
|
+
if (!r)
|
|
32
|
+
return t;
|
|
33
|
+
let o;
|
|
34
|
+
try {
|
|
35
|
+
o = new DOMParser().parseFromString(t, "text/html");
|
|
36
|
+
} catch (n) {
|
|
37
|
+
return console.error("[RecommendationPartnerMigrator] Failed to parse template:", n), t;
|
|
38
|
+
}
|
|
39
|
+
const u = Array.from(o.querySelectorAll(E));
|
|
40
|
+
if (u.length === 0)
|
|
41
|
+
return t;
|
|
42
|
+
let c = 0;
|
|
43
|
+
return u.forEach((n) => {
|
|
44
|
+
const i = S(n), A = Number(n.getAttribute(a));
|
|
45
|
+
if (!(!i || !Number.isFinite(A))) {
|
|
46
|
+
if (O({ config: i, blockId: A, partnerName: r, campaignUrls: e, rrsEnabled: s })) {
|
|
47
|
+
p(n, i, r), c += 1;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
i.partnerName || !d({ config: i, campaignUrls: e, rrsEnabled: s }) || (n.setAttribute(T, JSON.stringify({ ...i, partnerName: r })), c += 1);
|
|
51
|
+
}
|
|
52
|
+
}), c > 0 ? o.documentElement.outerHTML : t;
|
|
53
|
+
}
|
|
54
|
+
export {
|
|
55
|
+
I as migrateRecommendationPartnerScope
|
|
56
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useTranslations as s } from "../../composables/useTranslations.js";
|
|
2
|
-
const
|
|
2
|
+
const t = {
|
|
3
3
|
RECOMMENDATION_API_URL: "https://recommendationv2.api.useinsider.com",
|
|
4
4
|
// Relative path → same-origin as the embedding inone dashboard.
|
|
5
5
|
PRODUCT_ATTRIBUTES_PATH: "/product-attributes/get-attributes",
|
|
@@ -9,17 +9,17 @@ const a = {
|
|
|
9
9
|
MIGRATE_STRATEGIES_PATH: "/newsletter/recommendations/migrate-strategies",
|
|
10
10
|
// The template route narrows the recommendations resource before the action: the id
|
|
11
11
|
// travels in the body, not the path.
|
|
12
|
-
TEMPLATE_MIGRATE_STRATEGIES_PATH: "/newsletter/recommendations/template/migrate-strategies"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
},
|
|
17
|
-
const { RECOMMENDATION_STRATEGIES_PANEL_PATH: n } =
|
|
18
|
-
return `${n}/${e}/edit
|
|
19
|
-
}, m = {
|
|
20
|
-
campaign: a.MIGRATE_STRATEGIES_PATH,
|
|
21
|
-
template: a.TEMPLATE_MIGRATE_STRATEGIES_PATH
|
|
12
|
+
TEMPLATE_MIGRATE_STRATEGIES_PATH: "/newsletter/recommendations/template/migrate-strategies"
|
|
13
|
+
}, d = () => {
|
|
14
|
+
const { RECOMMENDATION_STRATEGIES_PANEL_PATH: e } = t;
|
|
15
|
+
return `${e}/create`;
|
|
16
|
+
}, m = (e) => {
|
|
17
|
+
const { RECOMMENDATION_STRATEGIES_PANEL_PATH: n } = t;
|
|
18
|
+
return `${n}/${e}/edit`;
|
|
22
19
|
}, T = {
|
|
20
|
+
campaign: t.MIGRATE_STRATEGIES_PATH,
|
|
21
|
+
template: t.TEMPLATE_MIGRATE_STRATEGIES_PATH
|
|
22
|
+
}, p = {
|
|
23
23
|
CLIENT_ID: "clientId"
|
|
24
24
|
}, E = () => {
|
|
25
25
|
const e = s();
|
|
@@ -85,21 +85,21 @@ const a = {
|
|
|
85
85
|
path: "top-sellers"
|
|
86
86
|
}
|
|
87
87
|
];
|
|
88
|
-
},
|
|
88
|
+
}, A = ["discount", "omnibus_price", "omnibus_discount", "price", "original_price"], v = [
|
|
89
89
|
{ text: "before the amount", value: "0" },
|
|
90
90
|
{ text: "after the amount", value: "1" }
|
|
91
|
-
],
|
|
91
|
+
], _ = [
|
|
92
92
|
{ text: "dot(.)", value: "." },
|
|
93
93
|
{ text: "comma(,)", value: "," },
|
|
94
94
|
{ text: "space( )", value: " " }
|
|
95
|
-
],
|
|
95
|
+
], h = [
|
|
96
96
|
{ text: "0", value: "0" },
|
|
97
97
|
{ text: "1", value: "1" },
|
|
98
98
|
{ text: "2", value: "2" },
|
|
99
99
|
{ text: "3", value: "3" },
|
|
100
100
|
{ text: "4", value: "4" },
|
|
101
101
|
{ text: "5", value: "5" }
|
|
102
|
-
], r = "||",
|
|
102
|
+
], r = "||", a = [
|
|
103
103
|
{ text: "is exactly", value: "=" },
|
|
104
104
|
{ text: "contains", value: "~" },
|
|
105
105
|
{ text: "does not contain", value: "!~" },
|
|
@@ -121,9 +121,9 @@ const a = {
|
|
|
121
121
|
], c = [
|
|
122
122
|
{ text: "true", value: "==" },
|
|
123
123
|
{ text: "false", value: "!=" }
|
|
124
|
-
],
|
|
124
|
+
], x = (e) => {
|
|
125
125
|
if (!e)
|
|
126
|
-
return
|
|
126
|
+
return a;
|
|
127
127
|
switch (e) {
|
|
128
128
|
case "Boolean":
|
|
129
129
|
return c;
|
|
@@ -132,28 +132,29 @@ const a = {
|
|
|
132
132
|
case "Number":
|
|
133
133
|
return i;
|
|
134
134
|
case "String":
|
|
135
|
-
return
|
|
135
|
+
return a;
|
|
136
136
|
case "Strings":
|
|
137
137
|
return o;
|
|
138
138
|
default:
|
|
139
|
-
return
|
|
139
|
+
return a;
|
|
140
140
|
}
|
|
141
141
|
};
|
|
142
142
|
export {
|
|
143
|
-
|
|
143
|
+
T as MIGRATION_PATHS,
|
|
144
144
|
r as OP_ANY_OF,
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
145
|
+
A as PriceAttributes,
|
|
146
|
+
p as QUERY_PARAMS,
|
|
147
|
+
t as URLS,
|
|
148
|
+
h as currencyDecimalCounts,
|
|
149
|
+
v as currencyLocationMaps,
|
|
150
|
+
_ as currencyOperators,
|
|
151
|
+
x as getOperatorOptions,
|
|
152
152
|
E as getRecommendationFeedSourceMaps,
|
|
153
153
|
o as operatorOptionsForArrayOfStrings,
|
|
154
154
|
c as operatorOptionsForBooleans,
|
|
155
155
|
u as operatorOptionsForDates,
|
|
156
156
|
i as operatorOptionsForNumbers,
|
|
157
|
-
|
|
158
|
-
d as
|
|
157
|
+
a as operatorOptionsForStrings,
|
|
158
|
+
d as strategyCreatePath,
|
|
159
|
+
m as strategyEditPath
|
|
159
160
|
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
var k = Object.defineProperty;
|
|
2
|
-
var D = (
|
|
3
|
-
var y = (
|
|
2
|
+
var D = (u, l, e) => l in u ? k(u, l, { enumerable: !0, configurable: !0, writable: !0, value: e }) : u[l] = e;
|
|
3
|
+
var y = (u, l, e) => D(u, typeof l != "symbol" ? l + "" : l, e);
|
|
4
4
|
import { BlockId as N } from "../../../enums/block.js";
|
|
5
5
|
import { useOnboardingStore as T } from "../../../stores/onboarding.js";
|
|
6
6
|
import { getMigrationBannerHtml as S } from "../../../utils/migrationBannerHtml.js";
|
|
7
|
-
import { Block as A, BlockCompositionType as M, ModificationDescription as
|
|
8
|
-
import { currencyAttrTargets as H, ITEMS_CURRENCY_ATTR as
|
|
7
|
+
import { Block as A, BlockCompositionType as M, ModificationDescription as m } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
8
|
+
import { currencyAttrTargets as H, ITEMS_CURRENCY_ATTR as I } from "./constants/currency.js";
|
|
9
9
|
import { ItemsBlockId as R } from "./enums/controlEnums.js";
|
|
10
|
-
import { SETTINGS_ENUMS as C, DefaultConfigValues as
|
|
10
|
+
import { SETTINGS_ENUMS as C, DefaultConfigValues as h } from "./enums/settingsEnums.js";
|
|
11
11
|
import { getDefaultTemplate as O } from "./template.js";
|
|
12
|
-
import { getItemsBlockContainer as b, getItemsBlockConfig as
|
|
13
|
-
const _ = N.Items,
|
|
12
|
+
import { getItemsBlockContainer as b, getItemsBlockConfig as g, deriveItemNumber as B, generateBlockInstanceId as E, getDefaultItemsBlockConfig as v } from "./utils/nodeConfigUtils.js";
|
|
13
|
+
const _ = N.Items, w = "Reconcile Items currency DOM attributes";
|
|
14
14
|
class K extends A {
|
|
15
15
|
constructor() {
|
|
16
16
|
super(...arguments);
|
|
@@ -46,9 +46,9 @@ class K extends A {
|
|
|
46
46
|
orientation: C.ORIENTATION.VERTICAL,
|
|
47
47
|
itemsType: C.ITEMS_TYPE.CART_ITEMS,
|
|
48
48
|
itemId: "{{Abandoned Cart Item (1) Url}}",
|
|
49
|
-
currencySymbol:
|
|
50
|
-
currencyLocation:
|
|
51
|
-
formattedPrice:
|
|
49
|
+
currencySymbol: h.productPriceCurrencySymbolControlValue,
|
|
50
|
+
currencyLocation: h.productPriceCurrencyLocationControlValue,
|
|
51
|
+
formattedPrice: h.productPriceFormattedControlValue === "1"
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
allowInnerBlocksDND() {
|
|
@@ -57,27 +57,30 @@ class K extends A {
|
|
|
57
57
|
canBeSavedAsModule() {
|
|
58
58
|
return !0;
|
|
59
59
|
}
|
|
60
|
-
onCreated(
|
|
60
|
+
onCreated(e) {
|
|
61
61
|
const o = this.api.getDocumentModifier(), c = this.api.getDocumentRootCssNode();
|
|
62
62
|
c.querySelector('[product-attr="imageSrc"] img') || o.modifyCss(c).appendRule('[product-attr="imageSrc"] img {object-fit: contain;}');
|
|
63
|
-
const
|
|
64
|
-
if (!
|
|
63
|
+
const n = b(e);
|
|
64
|
+
if (!n)
|
|
65
65
|
return;
|
|
66
|
-
const r =
|
|
67
|
-
if (
|
|
66
|
+
const r = n.getNodeConfig(), s = r && Object.keys(r).length > 0, t = g(e);
|
|
67
|
+
if (t != null && t.initialized) {
|
|
68
68
|
if (!s) {
|
|
69
|
-
const
|
|
70
|
-
|
|
69
|
+
const a = this.api.getDocumentModifier(), d = {
|
|
70
|
+
...t,
|
|
71
|
+
blockInstanceId: this._resolveInstanceId(t.blockInstanceId)
|
|
72
|
+
};
|
|
73
|
+
a.modifyHtml(n).setNodeConfig(d), this._stampProductTdDomAttributes(n, d, a), this._shouldReconcileCurrency(d) && this._reconcileCurrencyDomAttributes(n, d, a), a.apply(new m("Migrate legacy config to nodeConfig")), this._markCurrencyHealed(d.blockInstanceId);
|
|
71
74
|
return;
|
|
72
75
|
}
|
|
73
76
|
} else {
|
|
74
|
-
const
|
|
75
|
-
|
|
77
|
+
const a = v(), d = this.api.getDocumentModifier();
|
|
78
|
+
a.blockInstanceId = this._resolveInstanceId(a.blockInstanceId), d.modifyHtml(n).setNodeConfig(a), this._stampProductTdDomAttributes(n, a, d, !0), d.apply(new m("Initialize Items block with default configuration")), T().startOnboarding("itemsOnboarding");
|
|
76
79
|
return;
|
|
77
80
|
}
|
|
78
|
-
const
|
|
79
|
-
let
|
|
80
|
-
|
|
81
|
+
const i = this._resolveInstanceId(t.blockInstanceId), f = this.api.getDocumentModifier();
|
|
82
|
+
let p = !1;
|
|
83
|
+
i !== t.blockInstanceId && (f.modifyHtml(n).setNodeConfig({ ...t, blockInstanceId: i }), p = !0), !this._currencyHealed.has(i) && this._reconcileCurrencyDomAttributes(n, t, f) && (p = !0), p && f.apply(new m("Assign Items block instance ID and reconcile currency")), this._markCurrencyHealed(i);
|
|
81
84
|
}
|
|
82
85
|
/**
|
|
83
86
|
* Re-seeds nodeConfig from the persisted esd-ext-config when a saved module
|
|
@@ -85,24 +88,24 @@ class K extends A {
|
|
|
85
88
|
* into nodeConfig, so without this a reused module would reset to defaults.
|
|
86
89
|
* Guarded to the nodeConfig-empty case so it runs once and never loops.
|
|
87
90
|
*/
|
|
88
|
-
onDocumentChanged(
|
|
89
|
-
const o = b(
|
|
91
|
+
onDocumentChanged(e) {
|
|
92
|
+
const o = b(e);
|
|
90
93
|
if (!o)
|
|
91
94
|
return;
|
|
92
95
|
const c = o.getNodeConfig();
|
|
93
96
|
if (c && Object.keys(c).length > 0) {
|
|
94
|
-
const
|
|
95
|
-
if (
|
|
96
|
-
const
|
|
97
|
-
this._reconcileCurrencyDomAttributes(o,
|
|
97
|
+
const t = g(e);
|
|
98
|
+
if (t != null && t.initialized && this._shouldReconcileCurrency(t)) {
|
|
99
|
+
const i = this.api.getDocumentModifier();
|
|
100
|
+
this._reconcileCurrencyDomAttributes(o, t, i) && i.apply(new m(w)), this._markCurrencyHealed(t.blockInstanceId);
|
|
98
101
|
}
|
|
99
102
|
return;
|
|
100
103
|
}
|
|
101
|
-
const r =
|
|
104
|
+
const r = g(e);
|
|
102
105
|
if (!(r != null && r.initialized))
|
|
103
106
|
return;
|
|
104
107
|
const s = this.api.getDocumentModifier();
|
|
105
|
-
s.modifyHtml(o).setNodeConfig(r), this._stampProductTdDomAttributes(o, r, s), this._shouldReconcileCurrency(r) && this._reconcileCurrencyDomAttributes(o, r, s), s.apply(new
|
|
108
|
+
s.modifyHtml(o).setNodeConfig(r), this._stampProductTdDomAttributes(o, r, s), this._shouldReconcileCurrency(r) && this._reconcileCurrencyDomAttributes(o, r, s), s.apply(new m("Recover Items block config from saved module")), this._markCurrencyHealed(r.blockInstanceId);
|
|
106
109
|
}
|
|
107
110
|
/**
|
|
108
111
|
* Bakes the compiler-read DOM attributes (`data-type`, `data-number`, `data-nodup`) onto the
|
|
@@ -112,9 +115,9 @@ class K extends A {
|
|
|
112
115
|
* restored before export. The name `<a>` carries no data-type/data-number of its own and
|
|
113
116
|
* relies on this td-level fallback in pairProductVariables.
|
|
114
117
|
*/
|
|
115
|
-
_stampProductTdDomAttributes(
|
|
116
|
-
const r = B(o.itemsSelectValue, o.type), s = (
|
|
117
|
-
|
|
118
|
+
_stampProductTdDomAttributes(e, o, c, n = !1) {
|
|
119
|
+
const r = B(o.itemsSelectValue, o.type), s = (t, i) => {
|
|
120
|
+
n && e.getAttribute(t) || c.modifyHtml(e).setAttribute(t, i);
|
|
118
121
|
};
|
|
119
122
|
s("data-type", o.type), s("data-number", r), s("data-nodup", String(o.priceHideDiscount));
|
|
120
123
|
}
|
|
@@ -126,12 +129,12 @@ class K extends A {
|
|
|
126
129
|
* the symbol write alone is skipped for the 'USD' sentinel — so we must NOT gate the whole pass
|
|
127
130
|
* on symbol customization here, or a default-symbol block with a toggled location never heals.
|
|
128
131
|
*/
|
|
129
|
-
_shouldReconcileCurrency(
|
|
130
|
-
return !
|
|
132
|
+
_shouldReconcileCurrency(e) {
|
|
133
|
+
return !e.blockInstanceId || !this._currencyHealed.has(e.blockInstanceId);
|
|
131
134
|
}
|
|
132
135
|
/** Marks a block instance's currency as reconciled so it is not healed again (undo-safe). */
|
|
133
|
-
_markCurrencyHealed(
|
|
134
|
-
|
|
136
|
+
_markCurrencyHealed(e) {
|
|
137
|
+
e && this._currencyHealed.add(e);
|
|
135
138
|
}
|
|
136
139
|
/**
|
|
137
140
|
* Resolves the id for a just-created block to one that is unique per live instance.
|
|
@@ -140,8 +143,8 @@ class K extends A {
|
|
|
140
143
|
* currency heal guard and settings-panel switch detection. Mint a fresh id on absence
|
|
141
144
|
* or collision, otherwise keep the existing one. Registers the result as claimed.
|
|
142
145
|
*/
|
|
143
|
-
_resolveInstanceId(
|
|
144
|
-
let o =
|
|
146
|
+
_resolveInstanceId(e) {
|
|
147
|
+
let o = e;
|
|
145
148
|
if (!o || this._seenInstanceIds.has(o))
|
|
146
149
|
do
|
|
147
150
|
o = E();
|
|
@@ -159,12 +162,12 @@ class K extends A {
|
|
|
159
162
|
* Returns true only when an attr actually changed, so the caller can skip an empty apply that
|
|
160
163
|
* would otherwise re-trigger onDocumentChanged and loop.
|
|
161
164
|
*/
|
|
162
|
-
_reconcileCurrencyDomAttributes(
|
|
163
|
-
const { position:
|
|
164
|
-
let
|
|
165
|
-
return s.forEach((
|
|
166
|
-
|
|
167
|
-
}),
|
|
165
|
+
_reconcileCurrencyDomAttributes(e, o, c) {
|
|
166
|
+
const { position: n, symbol: r } = H(o), s = e.querySelectorAll(`.${R.PRICE} p`);
|
|
167
|
+
let t = !1;
|
|
168
|
+
return s.forEach((i) => {
|
|
169
|
+
n !== void 0 && i.getAttribute(I.POSITION) !== n && (c.modifyHtml(i).setAttribute(I.POSITION, n), t = !0), r !== void 0 && i.getAttribute(I.SYMBOL) !== r && (c.modifyHtml(i).setAttribute(I.SYMBOL, r), t = !0);
|
|
170
|
+
}), t;
|
|
168
171
|
}
|
|
169
172
|
}
|
|
170
173
|
export {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SETTINGS_ENUMS as r } from "../enums/settingsEnums.js";
|
|
2
|
+
const I = "130px", L = "100%", R = (e) => e === r.ORIENTATION.HORIZONTAL ? I : L, n = {
|
|
3
|
+
VERTICAL: "es-p5b es-p5t",
|
|
4
|
+
HORIZONTAL: "es-p5l es-p5r"
|
|
5
|
+
}, o = "data-items-cell-pad", d = (e) => `${o}="${e ? "v" : "h"}"`, t = (e) => e ? ` ${n.VERTICAL}` : ` ${n.HORIZONTAL}`, E = (e, A) => {
|
|
6
|
+
if (!e.includes(o))
|
|
7
|
+
return e;
|
|
8
|
+
const T = A ? n.HORIZONTAL : n.VERTICAL, s = A ? n.VERTICAL : n.HORIZONTAL, c = A ? "v" : "h";
|
|
9
|
+
return e.includes(T) ? e.replace(T, s).replace(new RegExp(`${o}="[hv]"`), `${o}="${c}"`) : e;
|
|
10
|
+
};
|
|
11
|
+
export {
|
|
12
|
+
n as BLOCK_CELL_PADDING,
|
|
13
|
+
o as BLOCK_CELL_PAD_ATTR,
|
|
14
|
+
I as NAME_HORIZONTAL_MAX_WIDTH,
|
|
15
|
+
L as NAME_VERTICAL_MAX_WIDTH,
|
|
16
|
+
d as blockCellPadMarker,
|
|
17
|
+
t as blockCellPaddingFor,
|
|
18
|
+
R as nameMaxWidthFor,
|
|
19
|
+
E as reorientBlockCellPadding
|
|
20
|
+
};
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { ModificationDescription as
|
|
2
|
-
import { CommonControl as
|
|
1
|
+
import { ModificationDescription as d, UIElementType as s, UEAttr as p } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
2
|
+
import { CommonControl as T } from "../../../common-control.js";
|
|
3
|
+
import { nameMaxWidthFor as h } from "../../constants/cardLayout.js";
|
|
3
4
|
import { ItemsBlockControlId as a } from "../../enums/controlEnums.js";
|
|
4
|
-
import { findNameTextNode as
|
|
5
|
-
import { getItemsBlockConfig as r, setItemsBlockConfig as
|
|
6
|
-
const
|
|
5
|
+
import { findNameTextNode as c } from "../../utils/nameNode.js";
|
|
6
|
+
import { getItemsBlockConfig as r, setItemsBlockConfig as g } from "../../utils/nodeConfigUtils.js";
|
|
7
|
+
const I = a.NAME_TRIMMING, n = {
|
|
7
8
|
TRIMMING: "trimming"
|
|
8
9
|
};
|
|
9
|
-
class
|
|
10
|
+
class E extends T {
|
|
10
11
|
getId() {
|
|
11
|
-
return
|
|
12
|
+
return I;
|
|
12
13
|
}
|
|
13
14
|
getTemplate() {
|
|
14
15
|
return `
|
|
@@ -19,39 +20,39 @@ class y extends p {
|
|
|
19
20
|
}
|
|
20
21
|
onRender() {
|
|
21
22
|
const e = r(this.currentNode);
|
|
22
|
-
this.api.updateValues({ [
|
|
23
|
+
this.api.updateValues({ [n.TRIMMING]: (e == null ? void 0 : e.nameTrimming) ?? !0 }), this.api.onValueChanged(n.TRIMMING, (t) => {
|
|
23
24
|
this._onTrimmingChange(t);
|
|
24
25
|
});
|
|
25
26
|
}
|
|
26
27
|
onTemplateNodeUpdated(e) {
|
|
27
28
|
super.onTemplateNodeUpdated(e), this.handleBlockInstanceChange(() => {
|
|
28
29
|
const t = r(this.currentNode);
|
|
29
|
-
this.api.updateValues({ [
|
|
30
|
+
this.api.updateValues({ [n.TRIMMING]: (t == null ? void 0 : t.nameTrimming) ?? !0 });
|
|
30
31
|
});
|
|
31
32
|
}
|
|
32
33
|
_onTrimmingChange(e) {
|
|
33
|
-
|
|
34
|
+
g(this.currentNode, this.api, { nameTrimming: e }), this.api.updateValues({ [n.TRIMMING]: e }), this._applyTrimmingStyles(e);
|
|
34
35
|
}
|
|
35
36
|
_applyTrimmingStyles(e) {
|
|
36
|
-
const t =
|
|
37
|
+
const t = c(this.currentNode);
|
|
37
38
|
if (!t)
|
|
38
39
|
return;
|
|
39
|
-
const
|
|
40
|
-
m ? o.setStyle("white-space", "nowrap").setStyle("overflow", "hidden").setStyle("text-overflow", "ellipsis") : o.removeStyle("white-space").removeStyle("overflow").removeStyle("text-overflow"), o.setStyle("max-width",
|
|
40
|
+
const i = r(this.currentNode), m = e !== void 0 ? e : (i == null ? void 0 : i.nameTrimming) ?? !0, l = h(i == null ? void 0 : i.orientation), o = this.api.getDocumentModifier().modifyHtml(t);
|
|
41
|
+
m ? o.setStyle("white-space", "nowrap").setStyle("overflow", "hidden").setStyle("text-overflow", "ellipsis") : o.removeStyle("white-space").removeStyle("overflow").removeStyle("text-overflow"), o.setStyle("max-width", l).apply(new d(`Text Trimming ${m ? "Enabled" : "Disabled"}`));
|
|
41
42
|
}
|
|
42
43
|
_getTextTrimming() {
|
|
43
44
|
return `
|
|
44
45
|
<div class="display-flex align-items-center justify-content-between">
|
|
45
46
|
<${s.LABEL}
|
|
46
|
-
${
|
|
47
|
+
${p.LABEL.text}="${this.api.translate("Text Trimming")}"
|
|
47
48
|
>
|
|
48
49
|
</${s.LABEL}>
|
|
49
|
-
${this._GuToggle(
|
|
50
|
+
${this._GuToggle(n.TRIMMING)}
|
|
50
51
|
</div>
|
|
51
52
|
`;
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
export {
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
I as CONTROL_BLOCK_ID,
|
|
57
|
+
E as NameTrimmingControl
|
|
57
58
|
};
|