@useinsider/guido 3.1.1 → 3.2.0-beta.080341b
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/README.md +117 -0
- package/dist/@types/config/schemas.js +166 -96
- package/dist/components/Guido.vue.js +4 -4
- package/dist/components/Guido.vue2.js +92 -80
- package/dist/components/organisms/AutoSaveController.vue.js +17 -0
- package/dist/components/organisms/AutoSaveController.vue2.js +13 -0
- package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue.js +7 -7
- package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue2.js +12 -20
- package/dist/components/organisms/header/AutoSaveToggle.vue.js +22 -0
- package/dist/components/organisms/header/AutoSaveToggle.vue2.js +19 -0
- package/dist/components/organisms/header/EditorActions.vue.js +2 -2
- package/dist/components/organisms/header/EditorActions.vue2.js +51 -36
- package/dist/components/organisms/header/RightSlot.vue.js +11 -11
- package/dist/components/organisms/header/RightSlot.vue2.js +17 -13
- package/dist/components/organisms/onboarding/AMPOnboarding.vue2.js +51 -31
- package/dist/components/organisms/onboarding/GenericOnboarding.vue.js +1 -1
- package/dist/components/organisms/onboarding/GenericOnboarding.vue2.js +23 -22
- package/dist/components/organisms/onboarding/ItemsOnboarding.vue.js +1 -1
- package/dist/components/organisms/onboarding/ItemsOnboarding.vue2.js +37 -39
- package/dist/components/organisms/onboarding/TextBlockOnboarding.vue.js +3 -3
- package/dist/components/organisms/onboarding/TextBlockOnboarding.vue2.js +30 -41
- package/dist/components/organisms/onboarding/VersionHistoryOnboarding.vue2.js +15 -14
- package/dist/components/organisms/save-as-template/SaveAsTemplateDrawer.vue2.js +18 -17
- package/dist/composables/useActionsApi.js +4 -4
- package/dist/composables/useAutoSave.js +71 -0
- package/dist/composables/useFullStoryBridge.js +14 -0
- package/dist/composables/useHtmlCompiler.js +23 -21
- package/dist/composables/useHtmlValidator.js +40 -38
- package/dist/composables/usePreviewMode.js +20 -16
- package/dist/composables/useRecommendation.js +46 -26
- package/dist/composables/useRibbonOffset.js +21 -0
- package/dist/composables/useSave.js +26 -15
- package/dist/composables/useStripo.js +48 -45
- package/dist/composables/validators/useCouponBlockValidator.js +24 -0
- package/dist/composables/validators/useLiquidValidator.js +42 -0
- package/dist/config/compiler/liquidCompilerRules.js +15 -0
- package/dist/config/compiler/recommendationCompilerRules.js +162 -43
- package/dist/config/compiler/unsubscribeCompilerRules.js +48 -45
- package/dist/config/compiler/utils/recommendationCompilerUtils.js +110 -71
- package/dist/config/i18n/en/tooltips.json.js +2 -1
- package/dist/config/migrator/checkboxMigrator.js +5 -3
- package/dist/config/migrator/index.js +9 -9
- package/dist/config/migrator/radioButtonMigrator.js +66 -44
- package/dist/config/migrator/recommendation/compositionMapper.js +98 -0
- package/dist/config/migrator/recommendation/extractors.js +27 -0
- package/dist/config/migrator/recommendation/htmlBuilder.js +496 -0
- package/dist/config/migrator/recommendation/parseLegacyConfig.js +33 -0
- package/dist/config/migrator/recommendation/settingsMapper.js +70 -0
- package/dist/config/migrator/recommendation/themeMapper.js +93 -0
- package/dist/config/migrator/recommendationMigrator.js +74 -290
- package/dist/enums/extensions/recommendationBlock.js +16 -12
- package/dist/enums/onboarding.js +7 -2
- package/dist/enums/recommendation.js +2 -2
- package/dist/enums/unsubscribe.js +34 -27
- package/dist/extensions/Blocks/CouponBlock/template.js +24 -13
- package/dist/extensions/Blocks/Items/controls/price/singlePrice.js +38 -38
- package/dist/extensions/Blocks/Items/enums/productEnums.js +19 -7
- package/dist/extensions/Blocks/RadioButton/template.js +1 -1
- package/dist/extensions/Blocks/Recommendation/block.js +60 -50
- package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +1 -1
- package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +5 -5
- package/dist/extensions/Blocks/Recommendation/constants/selectors.js +27 -11
- package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +185 -172
- package/dist/extensions/Blocks/Recommendation/controls/customAttribute/index.js +21 -18
- package/dist/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.js +99 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +27 -26
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +3 -1
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +211 -162
- package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +27 -57
- package/dist/extensions/Blocks/Recommendation/controls/shared/textTrimCssRules.js +14 -0
- package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +75 -73
- package/dist/extensions/Blocks/Recommendation/services/configService.js +76 -33
- package/dist/extensions/Blocks/Recommendation/settingsPanel.js +18 -17
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +123 -79
- package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +24 -13
- package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +30 -29
- package/dist/extensions/Blocks/Recommendation/templates/index.js +7 -7
- package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +27 -15
- package/dist/extensions/Blocks/Recommendation/templates/list/template.js +21 -21
- package/dist/extensions/Blocks/Recommendation/templates/utils.js +57 -50
- package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +17 -14
- package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMap.js +21 -0
- package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +13 -22
- package/dist/extensions/Blocks/Recommendation/utils/tagName.js +6 -6
- package/dist/extensions/Blocks/Unsubscribe/block.js +11 -11
- package/dist/extensions/Blocks/Unsubscribe/settingsPanel.js +16 -17
- package/dist/extensions/DynamicContent/dynamic-content.js +17 -12
- package/dist/guido.css +1 -1
- package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +393 -264
- package/dist/node_modules/valibot/dist/index.js +450 -235
- package/dist/package.json.js +1 -1
- package/dist/services/recommendationApi.js +15 -15
- package/dist/services/stripoApi.js +9 -9
- package/dist/services/templateLibraryApi.js +49 -46
- package/dist/src/@types/config/defaults.d.ts +5 -1
- package/dist/src/@types/config/index.d.ts +3 -3
- package/dist/src/@types/config/schemas.d.ts +245 -0
- package/dist/src/@types/config/types.d.ts +11 -1
- package/dist/src/@types/generic.d.ts +0 -1
- package/dist/src/@types/save-as-template.d.ts +1 -0
- package/dist/src/components/Guido.vue.d.ts +1 -1
- package/dist/src/components/organisms/AutoSaveController.vue.d.ts +2 -0
- package/dist/src/components/organisms/header/AutoSaveToggle.vue.d.ts +2 -0
- package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
- package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
- package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
- package/dist/src/components/wrappers/WpModal.vue.d.ts +1 -1
- package/dist/src/composables/useActionsApi.d.ts +1 -1
- package/dist/src/composables/useAutoSave.d.ts +3 -0
- package/dist/src/composables/useConfig.d.ts +70 -0
- package/dist/src/composables/useFullStoryBridge.d.ts +11 -0
- package/dist/src/composables/useRecommendation.d.ts +10 -1
- package/dist/src/composables/useRecommendation.test.d.ts +1 -0
- package/dist/src/composables/useRibbonOffset.d.ts +4 -0
- package/dist/src/composables/useSave.d.ts +1 -1
- package/dist/src/composables/validators/useCouponBlockValidator.d.ts +3 -0
- package/dist/src/composables/validators/useLiquidValidator.d.ts +3 -0
- package/dist/src/config/compiler/liquidCompilerRules.d.ts +2 -0
- package/dist/src/config/compiler/utils/recommendationCompilerUtils.d.ts +1 -1
- package/dist/src/config/migrator/index.d.ts +2 -1
- package/dist/src/config/migrator/recommendation/compositionMapper.d.ts +2 -0
- package/dist/src/config/migrator/recommendation/compositionMapper.test.d.ts +1 -0
- package/dist/src/config/migrator/recommendation/extractors.d.ts +7 -0
- package/dist/src/config/migrator/recommendation/extractors.test.d.ts +1 -0
- package/dist/src/config/migrator/recommendation/htmlBuilder.d.ts +11 -0
- package/dist/src/config/migrator/recommendation/parseLegacyConfig.d.ts +15 -0
- package/dist/src/config/migrator/recommendation/parseLegacyConfig.test.d.ts +1 -0
- package/dist/src/config/migrator/recommendation/settingsMapper.d.ts +7 -0
- package/dist/src/config/migrator/recommendation/settingsMapper.test.d.ts +1 -0
- package/dist/src/config/migrator/recommendation/themeMapper.d.ts +5 -0
- package/dist/src/config/migrator/recommendation/themeMapper.test.d.ts +1 -0
- package/dist/src/config/migrator/recommendation/types.d.ts +205 -0
- package/dist/src/config/migrator/recommendationMigrator.d.ts +13 -1
- package/dist/src/config/migrator/recommendationMigrator.test.d.ts +1 -0
- package/dist/src/enums/extensions/recommendationBlock.d.ts +3 -0
- package/dist/src/enums/onboarding.d.ts +6 -0
- package/dist/src/enums/unsubscribe.d.ts +5 -0
- package/dist/src/extensions/Blocks/CouponBlock/template.d.ts +2 -0
- package/dist/src/extensions/Blocks/RadioButton/template.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/constants/controlIds.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/cardComposition/index.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/index.d.ts +3 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.d.ts +35 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.test.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +3 -20
- package/dist/src/extensions/Blocks/Recommendation/controls/shared/textTrimCssRules.d.ts +29 -0
- package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +21 -3
- package/dist/src/extensions/Blocks/Recommendation/services/configService.test.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +34 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +4 -4
- package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +3 -3
- package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +20 -3
- package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMap.d.ts +21 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMap.test.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/preserveTextStyles.d.ts +0 -3
- package/dist/src/library.d.ts +1 -1
- package/dist/src/services/templateLibraryApi.d.ts +1 -1
- package/dist/src/stores/autosave.d.ts +12 -0
- package/dist/src/stores/config.d.ts +630 -0
- package/dist/src/stores/editor.d.ts +23 -0
- package/dist/src/stores/onboarding.d.ts +4 -0
- package/dist/src/stores/preview.d.ts +3 -0
- package/dist/src/utils/genericUtil.d.ts +1 -1
- package/dist/src/utils/htmlCompiler.d.ts +2 -1
- package/dist/src/utils/htmlEscape.d.ts +5 -0
- package/dist/src/utils/htmlEscape.test.d.ts +1 -0
- package/dist/src/utils/timeUtil.d.ts +8 -0
- package/dist/static/styles/base.css.js +7 -2
- package/dist/static/styles/components/button.css.js +16 -9
- package/dist/static/styles/components/loader.css.js +4 -0
- package/dist/static/styles/components/narrow-panel.css.js +52 -0
- package/dist/stores/autosave.js +17 -0
- package/dist/stores/editor.js +3 -1
- package/dist/stores/onboarding.js +4 -0
- package/dist/stores/preview.js +4 -3
- package/dist/utils/genericUtil.js +42 -20
- package/dist/utils/htmlCompiler.js +48 -41
- package/dist/utils/htmlEscape.js +13 -0
- package/dist/utils/pairProductVariables.js +89 -88
- package/dist/utils/templatePreparation.js +75 -24
- package/dist/utils/timeUtil.js +19 -0
- package/dist/utils/tooltipUtils.js +4 -5
- package/package.json +8 -4
- package/dist/enums/displayConditions.js +0 -80
- package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +0 -251
- package/dist/src/enums/displayConditions.d.ts +0 -2
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { ModificationDescription as
|
|
2
|
-
import { CommonControl as
|
|
3
|
-
import { RecommendationBlockId as
|
|
4
|
-
import { RecommendationControlId as
|
|
5
|
-
import { BLOCK_ROOT_SELECTOR as
|
|
6
|
-
|
|
1
|
+
import { ModificationDescription as l } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
2
|
+
import { CommonControl as u } from "../../../common-control.js";
|
|
3
|
+
import { RecommendationBlockId as a } from "../../constants/blockIds.js";
|
|
4
|
+
import { RecommendationControlId as d } from "../../constants/controlIds.js";
|
|
5
|
+
import { BLOCK_ROOT_SELECTOR as m } from "../../constants/selectors.js";
|
|
6
|
+
import { CSS_CLASS_TEXT_TRIM as r, ensureTextTrimCssRulesExist as T } from "../shared/textTrimCssRules.js";
|
|
7
|
+
const s = {
|
|
7
8
|
TEXT_TRIM_ENABLED: "textTrimEnabled"
|
|
8
|
-
}
|
|
9
|
-
class N extends
|
|
9
|
+
};
|
|
10
|
+
class N extends u {
|
|
10
11
|
getId() {
|
|
11
|
-
return
|
|
12
|
+
return d.NAME_TEXT_TRIM;
|
|
12
13
|
}
|
|
13
14
|
getTemplate() {
|
|
14
15
|
return `
|
|
@@ -16,7 +17,7 @@ class N extends d {
|
|
|
16
17
|
<div class="name-text-trim-control-container">
|
|
17
18
|
${this._GuTwoColumns([
|
|
18
19
|
this._GuLabel({ text: this.api.translate("Trim Long Text") }),
|
|
19
|
-
this._GuToggle(
|
|
20
|
+
this._GuToggle(s.TEXT_TRIM_ENABLED)
|
|
20
21
|
])}
|
|
21
22
|
</div>
|
|
22
23
|
`;
|
|
@@ -30,76 +31,45 @@ class N extends d {
|
|
|
30
31
|
_setFormValues() {
|
|
31
32
|
const e = this._getCurrentTrimState();
|
|
32
33
|
this.api.updateValues({
|
|
33
|
-
[
|
|
34
|
+
[s.TEXT_TRIM_ENABLED]: e
|
|
34
35
|
});
|
|
35
36
|
}
|
|
36
37
|
_getCurrentTrimState() {
|
|
37
38
|
if (!this.currentNode || !("hasClass" in this.currentNode))
|
|
38
39
|
return !1;
|
|
39
|
-
if (this.currentNode.hasClass(
|
|
40
|
+
if (this.currentNode.hasClass(r))
|
|
40
41
|
return !0;
|
|
41
|
-
const e = this.currentNode.closest(
|
|
42
|
+
const e = this.currentNode.closest(m);
|
|
42
43
|
if (!e)
|
|
43
44
|
return !1;
|
|
44
45
|
const t = e.querySelector(
|
|
45
|
-
`[esd-extension-block-id="${
|
|
46
|
+
`[esd-extension-block-id="${a.NAME}"]`
|
|
46
47
|
);
|
|
47
|
-
return t && "hasClass" in t ? t.hasClass(
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Finds an existing CSS rule in the document stylesheet by exact query
|
|
51
|
-
* @param query - The CSS query to search for (uses Stripo's CSS query syntax)
|
|
52
|
-
* @returns The CSS rule node if found, undefined otherwise
|
|
53
|
-
*/
|
|
54
|
-
_findCssRule(e) {
|
|
55
|
-
const t = this.api.getDocumentRootCssNode();
|
|
56
|
-
if (t)
|
|
57
|
-
return t.querySelector(e);
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Finds the .text-trim-enabled p rule by searching all text-trim rules and comparing selectors
|
|
61
|
-
* This is needed because Stripo's CSS query syntax interprets spaces as path separators
|
|
62
|
-
* @returns true if the rule exists
|
|
63
|
-
*/
|
|
64
|
-
_hasParagraphRule() {
|
|
65
|
-
const e = this.api.getDocumentRootCssNode();
|
|
66
|
-
return e ? e.querySelectorAll(`*${o}`).some((s) => "getSelector" in s && typeof s.getSelector == "function" ? s.getSelector() === T : !1) : !1;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Ensures the text-trim CSS rules exist in the document stylesheet
|
|
70
|
-
* Only adds rules if they don't already exist (prevents duplicates across multiple blocks)
|
|
71
|
-
*/
|
|
72
|
-
_ensureCssRulesExist() {
|
|
73
|
-
const e = this.api.getDocumentRootCssNode();
|
|
74
|
-
if (!e)
|
|
75
|
-
return;
|
|
76
|
-
const t = this.api.getDocumentModifier();
|
|
77
|
-
let s = !1;
|
|
78
|
-
this._findCssRule(c) || (t.modifyCss(e).appendRule(p), s = !0), this._hasParagraphRule() || (t.modifyCss(e).appendRule(_), s = !0), s && t.apply(new a("Add text trim CSS rules"));
|
|
48
|
+
return t && "hasClass" in t ? t.hasClass(r) : !1;
|
|
79
49
|
}
|
|
80
50
|
_onTextTrimChange(e) {
|
|
81
51
|
if (!this.currentNode || !("closest" in this.currentNode))
|
|
82
52
|
return;
|
|
83
|
-
const t = this.currentNode.closest(
|
|
53
|
+
const t = this.currentNode.closest(m);
|
|
84
54
|
if (!t || !("querySelectorAll" in t))
|
|
85
55
|
return;
|
|
86
|
-
const
|
|
87
|
-
t.querySelectorAll(`[esd-extension-block-id="${
|
|
56
|
+
const i = Array.from(
|
|
57
|
+
t.querySelectorAll(`[esd-extension-block-id="${a.NAME}"]`)
|
|
88
58
|
);
|
|
89
|
-
if (!
|
|
59
|
+
if (!i.length)
|
|
90
60
|
return;
|
|
91
|
-
e && this.
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
e ?
|
|
95
|
-
}),
|
|
96
|
-
new
|
|
61
|
+
e && T(this.api);
|
|
62
|
+
const o = this.api.getDocumentModifier();
|
|
63
|
+
i.forEach((n) => {
|
|
64
|
+
e ? o.modifyHtml(n).setClass(r) : o.modifyHtml(n).removeClass(r);
|
|
65
|
+
}), o.apply(
|
|
66
|
+
new l(
|
|
97
67
|
e ? "Enable product name text trimming" : "Disable product name text trimming"
|
|
98
68
|
)
|
|
99
69
|
);
|
|
100
70
|
}
|
|
101
71
|
_listenToFormUpdates() {
|
|
102
|
-
this.api.onValueChanged(
|
|
72
|
+
this.api.onValueChanged(s.TEXT_TRIM_ENABLED, (e) => {
|
|
103
73
|
this._onTextTrimChange(e);
|
|
104
74
|
});
|
|
105
75
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ModificationDescription as r } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
2
|
+
const t = "text-trim-enabled", l = `.${t}`, c = `.${t} p`, S = `.${t} { max-width: 0; }`, T = `.${t} p { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin: 0; display: block; }`;
|
|
3
|
+
function f(n) {
|
|
4
|
+
const e = n.getDocumentRootCssNode();
|
|
5
|
+
if (!e)
|
|
6
|
+
return;
|
|
7
|
+
const o = n.getDocumentModifier();
|
|
8
|
+
let i = !1;
|
|
9
|
+
e.querySelector(l) || (o.modifyCss(e).appendRule(S), i = !0), e.querySelectorAll(`*${t}`).some((s) => "getSelector" in s && typeof s.getSelector == "function" && s.getSelector() === c) || (o.modifyCss(e).appendRule(T), i = !0), i && o.apply(new r("Add text trim CSS rules"));
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
t as CSS_CLASS_TEXT_TRIM,
|
|
13
|
+
f as ensureTextTrimCssRulesExist
|
|
14
|
+
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
var G = Object.defineProperty;
|
|
2
|
-
var P = (u,
|
|
3
|
-
var
|
|
4
|
-
import { ModificationDescription as
|
|
2
|
+
var P = (u, s, t) => s in u ? G(u, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : u[s] = t;
|
|
3
|
+
var C = (u, s, t) => P(u, typeof s != "symbol" ? s + "" : s, t);
|
|
4
|
+
import { ModificationDescription as m } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
5
5
|
import { CommonControl as R } from "../../../common-control.js";
|
|
6
|
-
import { DESKTOP_CONTAINER_SELECTOR as
|
|
7
|
-
import { SPACING_STEP as
|
|
6
|
+
import { DESKTOP_CONTAINER_SELECTOR as S, MOBILE_CONTAINER_SELECTOR as M } from "../../constants/selectors.js";
|
|
7
|
+
import { SPACING_STEP as _, MAX_SPACING as N, MIN_SPACING as b, DEFAULT_COLUMN_SPACING as g, DEFAULT_ROW_SPACING as E } from "../../constants/layout.js";
|
|
8
8
|
import { RecommendationConfigService as p } from "../../services/configService.js";
|
|
9
|
-
import { useRecommendationExtensionStore as
|
|
10
|
-
import { safeGetStyle as
|
|
11
|
-
import { getCurrentLayout as
|
|
12
|
-
import { useDebounceFn as
|
|
9
|
+
import { useRecommendationExtensionStore as w } from "../../store/recommendation.js";
|
|
10
|
+
import { safeGetStyle as L, safeGetParent as V } from "../../utils/tagName.js";
|
|
11
|
+
import { getCurrentLayout as f, getBlockElement as B } from "../main/utils.js";
|
|
12
|
+
import { useDebounceFn as O } from "../../../../../node_modules/@vueuse/shared/index.js";
|
|
13
13
|
const U = "recommendation-spacing-control", n = {
|
|
14
14
|
COLUMN_SPACING: "columnSpacing",
|
|
15
15
|
COLUMN_SPACING_LABEL: "columnSpacingLabel",
|
|
@@ -19,46 +19,46 @@ const U = "recommendation-spacing-control", n = {
|
|
|
19
19
|
MOBILE_COLUMN_SPACING_LABEL: "mobileColumnSpacingLabel",
|
|
20
20
|
MOBILE_ROW_SPACING: "mobileRowSpacing",
|
|
21
21
|
MOBILE_ROW_SPACING_LABEL: "mobileRowSpacingLabel"
|
|
22
|
-
},
|
|
22
|
+
}, A = {
|
|
23
23
|
COLUMN_SPACING: "data-column-spacing",
|
|
24
24
|
ROW_SPACING: "data-row-spacing",
|
|
25
25
|
MOBILE_COLUMN_SPACING: "data-mobile-column-spacing",
|
|
26
26
|
MOBILE_ROW_SPACING: "data-mobile-row-spacing"
|
|
27
27
|
};
|
|
28
|
-
function
|
|
28
|
+
function I(u, s) {
|
|
29
29
|
if (!u)
|
|
30
|
-
return
|
|
30
|
+
return s;
|
|
31
31
|
const t = parseFloat(u);
|
|
32
|
-
return Number.isNaN(t) ?
|
|
32
|
+
return Number.isNaN(t) ? s : t;
|
|
33
33
|
}
|
|
34
34
|
class j extends R {
|
|
35
35
|
constructor() {
|
|
36
36
|
super(...arguments);
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
C(this, "store", w());
|
|
38
|
+
C(this, "unsubscribeOrientation", null);
|
|
39
39
|
/**
|
|
40
40
|
* Debounced version of _onColumnSpacingChange
|
|
41
41
|
* Prevents excessive DOM updates when user rapidly adjusts the counter
|
|
42
42
|
*/
|
|
43
|
-
|
|
43
|
+
C(this, "_debouncedOnColumnSpacingChange", O((t) => {
|
|
44
44
|
this._onColumnSpacingChange(t);
|
|
45
45
|
}, 300));
|
|
46
46
|
/**
|
|
47
47
|
* Debounced version of _onRowSpacingChange
|
|
48
48
|
*/
|
|
49
|
-
|
|
49
|
+
C(this, "_debouncedOnRowSpacingChange", O((t) => {
|
|
50
50
|
this._onRowSpacingChange(t);
|
|
51
51
|
}, 300));
|
|
52
52
|
/**
|
|
53
53
|
* Debounced version of _onMobileColumnSpacingChange
|
|
54
54
|
*/
|
|
55
|
-
|
|
55
|
+
C(this, "_debouncedOnMobileColumnSpacingChange", O((t) => {
|
|
56
56
|
this._onMobileColumnSpacingChange(t);
|
|
57
57
|
}, 300));
|
|
58
58
|
/**
|
|
59
59
|
* Debounced version of _onMobileRowSpacingChange
|
|
60
60
|
*/
|
|
61
|
-
|
|
61
|
+
C(this, "_debouncedOnMobileRowSpacingChange", O((t) => {
|
|
62
62
|
this._onMobileRowSpacingChange(t);
|
|
63
63
|
}, 300));
|
|
64
64
|
}
|
|
@@ -75,9 +75,9 @@ class j extends R {
|
|
|
75
75
|
}),
|
|
76
76
|
this._GuCounter({
|
|
77
77
|
name: n.COLUMN_SPACING,
|
|
78
|
-
minValue:
|
|
79
|
-
maxValue:
|
|
80
|
-
step:
|
|
78
|
+
minValue: b,
|
|
79
|
+
maxValue: N,
|
|
80
|
+
step: _
|
|
81
81
|
}),
|
|
82
82
|
this._GuLabel({
|
|
83
83
|
text: this.api.translate("Row Spacing (px)"),
|
|
@@ -85,9 +85,9 @@ class j extends R {
|
|
|
85
85
|
}),
|
|
86
86
|
this._GuCounter({
|
|
87
87
|
name: n.ROW_SPACING,
|
|
88
|
-
minValue:
|
|
89
|
-
maxValue:
|
|
90
|
-
step:
|
|
88
|
+
minValue: b,
|
|
89
|
+
maxValue: N,
|
|
90
|
+
step: _
|
|
91
91
|
}),
|
|
92
92
|
this._GuLabel({
|
|
93
93
|
text: this.api.translate("Column Spacing on Mobile (px)"),
|
|
@@ -95,9 +95,9 @@ class j extends R {
|
|
|
95
95
|
}),
|
|
96
96
|
this._GuCounter({
|
|
97
97
|
name: n.MOBILE_COLUMN_SPACING,
|
|
98
|
-
minValue:
|
|
99
|
-
maxValue:
|
|
100
|
-
step:
|
|
98
|
+
minValue: b,
|
|
99
|
+
maxValue: N,
|
|
100
|
+
step: _
|
|
101
101
|
}),
|
|
102
102
|
this._GuLabel({
|
|
103
103
|
text: this.api.translate("Row Spacing on Mobile (px)"),
|
|
@@ -105,9 +105,9 @@ class j extends R {
|
|
|
105
105
|
}),
|
|
106
106
|
this._GuCounter({
|
|
107
107
|
name: n.MOBILE_ROW_SPACING,
|
|
108
|
-
minValue:
|
|
109
|
-
maxValue:
|
|
110
|
-
step:
|
|
108
|
+
minValue: b,
|
|
109
|
+
maxValue: N,
|
|
110
|
+
step: _
|
|
111
111
|
})
|
|
112
112
|
])}
|
|
113
113
|
</div>
|
|
@@ -132,13 +132,13 @@ class j extends R {
|
|
|
132
132
|
_updateSpacingVisibility() {
|
|
133
133
|
if (!this.api)
|
|
134
134
|
return;
|
|
135
|
-
const t = p.getConfig(this.currentNode), e = this.store.recommendationConfigs.orientation, i = (t.layout || e ||
|
|
135
|
+
const t = p.getConfig(this.currentNode), e = this.store.recommendationConfigs.orientation, i = (t.layout || e || f(this.currentNode)) === "grid", { mobileLayoutEnabled: a } = t, r = t.cardsInRow > 1, c = t.mobileCardsInRow > 1;
|
|
136
136
|
this.api.setVisibility(n.COLUMN_SPACING, i && r), this.api.setVisibility(n.COLUMN_SPACING_LABEL, i && r), this.api.setVisibility(n.ROW_SPACING, !0), this.api.setVisibility(n.ROW_SPACING_LABEL, !0), this.api.setVisibility(
|
|
137
137
|
n.MOBILE_COLUMN_SPACING,
|
|
138
|
-
i && a &&
|
|
138
|
+
i && a && c
|
|
139
139
|
), this.api.setVisibility(
|
|
140
140
|
n.MOBILE_COLUMN_SPACING_LABEL,
|
|
141
|
-
i && a &&
|
|
141
|
+
i && a && c
|
|
142
142
|
), this.api.setVisibility(n.MOBILE_ROW_SPACING, i && a), this.api.setVisibility(n.MOBILE_ROW_SPACING_LABEL, i && a);
|
|
143
143
|
}
|
|
144
144
|
/**
|
|
@@ -165,20 +165,20 @@ class j extends R {
|
|
|
165
165
|
*/
|
|
166
166
|
_getStoredColumnSpacing() {
|
|
167
167
|
if (!this.currentNode)
|
|
168
|
-
return
|
|
169
|
-
const t = this.currentNode.querySelector(
|
|
170
|
-
if (
|
|
171
|
-
const
|
|
172
|
-
if (!
|
|
173
|
-
return
|
|
174
|
-
const y =
|
|
175
|
-
return y.length < 2 ?
|
|
168
|
+
return g;
|
|
169
|
+
const t = this.currentNode.querySelector(S) ?? this.currentNode;
|
|
170
|
+
if (f(this.currentNode) === "grid") {
|
|
171
|
+
const h = t.querySelector(".recommendation-attribute-row"), l = (h == null ? void 0 : h.querySelector("td")) ?? null, d = L(l, "padding");
|
|
172
|
+
if (!d)
|
|
173
|
+
return g;
|
|
174
|
+
const y = d.trim().split(/\s+/);
|
|
175
|
+
return y.length < 2 ? g : I(y[1], g / 2) * 2;
|
|
176
176
|
}
|
|
177
|
-
const o = t.querySelector(".product-card-wrapper"), i =
|
|
177
|
+
const o = t.querySelector(".product-card-wrapper") ?? null, i = V(o), a = L(i, "padding");
|
|
178
178
|
if (!a)
|
|
179
|
-
return
|
|
179
|
+
return g;
|
|
180
180
|
const r = a.trim().split(/\s+/);
|
|
181
|
-
return r.length < 2 ?
|
|
181
|
+
return r.length < 2 ? g : I(r[1], g / 2) * 2;
|
|
182
182
|
}
|
|
183
183
|
/**
|
|
184
184
|
* Gets stored row spacing from the first spacer element's height style
|
|
@@ -187,8 +187,8 @@ class j extends R {
|
|
|
187
187
|
_getStoredRowSpacing() {
|
|
188
188
|
if (!this.currentNode)
|
|
189
189
|
return E;
|
|
190
|
-
const e = (this.currentNode.querySelector(
|
|
191
|
-
return
|
|
190
|
+
const e = (this.currentNode.querySelector(S) ?? this.currentNode).querySelector(".spacer") ?? null, o = L(e, "height");
|
|
191
|
+
return I(o, E);
|
|
192
192
|
}
|
|
193
193
|
// ========================================================================
|
|
194
194
|
// Desktop Spacing Handlers
|
|
@@ -205,17 +205,18 @@ class j extends R {
|
|
|
205
205
|
this.currentNode,
|
|
206
206
|
{ columnSpacing: t },
|
|
207
207
|
`Changed column spacing to ${t}px`
|
|
208
|
-
), this._storeDataAttribute(
|
|
209
|
-
const o = p.getConfig(this.currentNode).layout ||
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
).forEach((
|
|
213
|
-
i.modifyHtml(
|
|
208
|
+
), this._storeDataAttribute(A.COLUMN_SPACING, t);
|
|
209
|
+
const o = p.getConfig(this.currentNode).layout || f(this.currentNode), i = this.api.getDocumentModifier(), r = `0 ${t / 2}px`, c = this.currentNode.querySelector(S);
|
|
210
|
+
c && (o === "grid" ? Array.from(
|
|
211
|
+
c.querySelectorAll(".attribute-cell")
|
|
212
|
+
).forEach((l) => {
|
|
213
|
+
i.modifyHtml(l).setStyle("padding", r);
|
|
214
214
|
}) : Array.from(
|
|
215
|
-
|
|
216
|
-
).forEach((
|
|
217
|
-
"parent" in
|
|
218
|
-
|
|
215
|
+
c.querySelectorAll(".product-card-wrapper")
|
|
216
|
+
).forEach((l) => {
|
|
217
|
+
const d = "parent" in l ? l.parent() : void 0;
|
|
218
|
+
d && i.modifyHtml(d).setStyle("padding", r);
|
|
219
|
+
}), i.apply(new m(`Update column spacing to ${t}px`)));
|
|
219
220
|
}
|
|
220
221
|
/**
|
|
221
222
|
* Handles row spacing changes for desktop.
|
|
@@ -229,8 +230,8 @@ class j extends R {
|
|
|
229
230
|
this.currentNode,
|
|
230
231
|
{ rowSpacing: t },
|
|
231
232
|
`Changed row spacing to ${t}px`
|
|
232
|
-
), this._storeDataAttribute(
|
|
233
|
-
const e = this.currentNode.querySelector(
|
|
233
|
+
), this._storeDataAttribute(A.ROW_SPACING, t);
|
|
234
|
+
const e = this.currentNode.querySelector(S);
|
|
234
235
|
if (!e)
|
|
235
236
|
return;
|
|
236
237
|
const o = Array.from(
|
|
@@ -241,7 +242,7 @@ class j extends R {
|
|
|
241
242
|
const i = this.api.getDocumentModifier(), a = `${t}px`;
|
|
242
243
|
o.forEach((r) => {
|
|
243
244
|
i.modifyHtml(r).setStyle("height", a);
|
|
244
|
-
}), i.apply(new
|
|
245
|
+
}), i.apply(new m(`Update row spacing to ${t}px`));
|
|
245
246
|
}
|
|
246
247
|
// ========================================================================
|
|
247
248
|
// Mobile Spacing Handlers
|
|
@@ -258,17 +259,18 @@ class j extends R {
|
|
|
258
259
|
this.currentNode,
|
|
259
260
|
{ mobileColumnSpacing: t },
|
|
260
261
|
`Changed mobile column spacing to ${t}px`
|
|
261
|
-
), this._storeDataAttribute(
|
|
262
|
-
const o = p.getConfig(this.currentNode).layout ||
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
).forEach((
|
|
266
|
-
i.modifyHtml(
|
|
262
|
+
), this._storeDataAttribute(A.MOBILE_COLUMN_SPACING, t);
|
|
263
|
+
const o = p.getConfig(this.currentNode).layout || f(this.currentNode), i = this.api.getDocumentModifier(), r = `0 ${t / 2}px`, c = this.currentNode.querySelector(M);
|
|
264
|
+
c && (o === "grid" ? Array.from(
|
|
265
|
+
c.querySelectorAll(".attribute-cell")
|
|
266
|
+
).forEach((l) => {
|
|
267
|
+
i.modifyHtml(l).setStyle("padding", r);
|
|
267
268
|
}) : Array.from(
|
|
268
|
-
|
|
269
|
-
).forEach((
|
|
270
|
-
"parent" in
|
|
271
|
-
|
|
269
|
+
c.querySelectorAll(".product-card-wrapper")
|
|
270
|
+
).forEach((l) => {
|
|
271
|
+
const d = "parent" in l ? l.parent() : void 0;
|
|
272
|
+
d && i.modifyHtml(d).setStyle("padding", r);
|
|
273
|
+
}), i.apply(new m(`Update mobile column spacing to ${t}px`)));
|
|
272
274
|
}
|
|
273
275
|
/**
|
|
274
276
|
* Handles row spacing changes for mobile.
|
|
@@ -282,7 +284,7 @@ class j extends R {
|
|
|
282
284
|
this.currentNode,
|
|
283
285
|
{ mobileRowSpacing: t },
|
|
284
286
|
`Changed mobile row spacing to ${t}px`
|
|
285
|
-
), this._storeDataAttribute(
|
|
287
|
+
), this._storeDataAttribute(A.MOBILE_ROW_SPACING, t);
|
|
286
288
|
const e = this.currentNode.querySelector(M);
|
|
287
289
|
if (!e)
|
|
288
290
|
return;
|
|
@@ -294,7 +296,7 @@ class j extends R {
|
|
|
294
296
|
const i = this.api.getDocumentModifier(), a = `${t}px`;
|
|
295
297
|
o.forEach((r) => {
|
|
296
298
|
i.modifyHtml(r).setStyle("height", a);
|
|
297
|
-
}), i.apply(new
|
|
299
|
+
}), i.apply(new m(`Update mobile row spacing to ${t}px`));
|
|
298
300
|
}
|
|
299
301
|
// ========================================================================
|
|
300
302
|
// Data Attribute Storage
|
|
@@ -304,7 +306,7 @@ class j extends R {
|
|
|
304
306
|
*/
|
|
305
307
|
_storeDataAttribute(t, e) {
|
|
306
308
|
const o = B(this.currentNode);
|
|
307
|
-
o && this.api.getDocumentModifier().modifyHtml(o).setAttribute(t, e.toString()).apply(new
|
|
309
|
+
o && this.api.getDocumentModifier().modifyHtml(o).setAttribute(t, e.toString()).apply(new m(`Store ${t}`));
|
|
308
310
|
}
|
|
309
311
|
// ========================================================================
|
|
310
312
|
// Event Listeners
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import { ModificationDescription as
|
|
2
|
-
import { CURRENT_CONFIG_VERSION as
|
|
3
|
-
import { setCurrencyAttributes as
|
|
4
|
-
import { hasMinimalConfig as
|
|
5
|
-
|
|
1
|
+
import { ModificationDescription as C } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
2
|
+
import { CURRENT_CONFIG_VERSION as l, DEFAULT_NODE_CONFIG as c } from "../constants/defaultConfig.js";
|
|
3
|
+
import { setCurrencyAttributes as D } from "../controls/main/utils.js";
|
|
4
|
+
import { hasMinimalConfig as A } from "../types/nodeConfig.js";
|
|
5
|
+
function S(e) {
|
|
6
|
+
return e === "." || e === "," || e === " ";
|
|
7
|
+
}
|
|
8
|
+
function N(e) {
|
|
9
|
+
return e === "." || e === "," || e === " " || e === "";
|
|
10
|
+
}
|
|
11
|
+
class M {
|
|
6
12
|
// ========================================================================
|
|
7
13
|
// Read Operations
|
|
8
14
|
// ========================================================================
|
|
@@ -42,7 +48,7 @@ class C {
|
|
|
42
48
|
return !1;
|
|
43
49
|
try {
|
|
44
50
|
const t = i.getNodeConfig();
|
|
45
|
-
return
|
|
51
|
+
return A(t);
|
|
46
52
|
} catch {
|
|
47
53
|
return !1;
|
|
48
54
|
}
|
|
@@ -77,29 +83,36 @@ class C {
|
|
|
77
83
|
* @returns The new complete configuration
|
|
78
84
|
*/
|
|
79
85
|
static updateConfig(i, t, o, n) {
|
|
80
|
-
const
|
|
81
|
-
return this.saveConfig(i, t,
|
|
86
|
+
const r = this.getConfig(t), u = this.deepMerge(r, o);
|
|
87
|
+
return this.saveConfig(i, t, u, n), u;
|
|
82
88
|
}
|
|
83
89
|
/**
|
|
84
90
|
* Initialize configuration for a new block
|
|
85
91
|
*
|
|
86
92
|
* Called when a block is first created (dropped into template).
|
|
87
93
|
* Can optionally merge in partial config from migration.
|
|
94
|
+
*
|
|
95
|
+
* The `wasFreshDrop` flag distinguishes a brand-new drop (no prior config)
|
|
96
|
+
* from a clone (Stripo replays the source's setNodeConfig payload before
|
|
97
|
+
* onCreated fires). Callers use this to skip side-effects already inherited
|
|
98
|
+
* from the source.
|
|
88
99
|
* @example
|
|
89
100
|
* // In Block.onCreated lifecycle
|
|
90
|
-
* RecommendationConfigService.initializeConfig(this.api, node);
|
|
101
|
+
* const { config, wasFreshDrop } = RecommendationConfigService.initializeConfig(this.api, node);
|
|
91
102
|
* @param api - Stripo extension API with document modifier
|
|
92
103
|
* @param node - The immutable HTML node to initialize
|
|
93
104
|
* @param partialConfig - Optional partial config to merge with defaults
|
|
94
|
-
* @returns The initialized configuration
|
|
105
|
+
* @returns The initialized configuration and whether the node was a fresh drop
|
|
95
106
|
*/
|
|
96
107
|
static initializeConfig(i, t, o) {
|
|
108
|
+
if (this.hasConfig(t))
|
|
109
|
+
return { config: o ? this.updateConfig(i, t, o, "Initialize recommendation block") : this.getConfig(t), wasFreshDrop: !1 };
|
|
97
110
|
const n = o ? this.mergeWithDefaults(o) : this.cloneDefaults();
|
|
98
|
-
return this.saveConfig(i, t, n, "Initialize recommendation block"),
|
|
111
|
+
return this.saveConfig(i, t, n, "Initialize recommendation block"), D({
|
|
99
112
|
currentNode: t,
|
|
100
113
|
documentModifier: i.getDocumentModifier(),
|
|
101
114
|
currency: n.currency
|
|
102
|
-
}), n;
|
|
115
|
+
}), { config: n, wasFreshDrop: !0 };
|
|
103
116
|
}
|
|
104
117
|
/**
|
|
105
118
|
* Save complete configuration to a node
|
|
@@ -112,9 +125,9 @@ class C {
|
|
|
112
125
|
*/
|
|
113
126
|
static saveConfig(i, t, o, n) {
|
|
114
127
|
try {
|
|
115
|
-
i.getDocumentModifier().modifyHtml(t).setNodeConfig(o).apply(new
|
|
116
|
-
} catch (
|
|
117
|
-
console.warn("[RecommendationConfigService] Failed to save config:",
|
|
128
|
+
i.getDocumentModifier().modifyHtml(t).setNodeConfig(o).apply(new C(n));
|
|
129
|
+
} catch (r) {
|
|
130
|
+
console.warn("[RecommendationConfigService] Failed to save config:", r);
|
|
118
131
|
}
|
|
119
132
|
}
|
|
120
133
|
// ========================================================================
|
|
@@ -125,25 +138,55 @@ class C {
|
|
|
125
138
|
*
|
|
126
139
|
* Reads existing data-attributes and creates a proper node config.
|
|
127
140
|
* Used when loading templates created before node config was implemented.
|
|
141
|
+
*
|
|
142
|
+
* Sources, in priority order (later overrides earlier):
|
|
143
|
+
* 1. `esd-ext-config` JSON blob — emitted by the recommendation migrator and
|
|
144
|
+
* by hand-authored new templates. Carries the full RecommendationNodeConfig
|
|
145
|
+
* (strategy, language, currency, filters, productIds, etc.) which the
|
|
146
|
+
* discrete data-* attrs below cannot capture.
|
|
147
|
+
* 2. Discrete `data-*` attributes — runtime source of truth for
|
|
148
|
+
* layout/composition/spacing; controls keep these in sync as the user
|
|
149
|
+
* edits, so we let them override the JSON blob if they disagree.
|
|
150
|
+
* 3. `currency-*` attributes — durable currency source on the block element.
|
|
128
151
|
* @param api - Stripo extension API with document modifier
|
|
129
152
|
* @param node - The block node to migrate
|
|
130
153
|
* @returns The migrated configuration
|
|
131
154
|
*/
|
|
132
155
|
static migrateFromDataAttributes(i, t) {
|
|
133
156
|
const o = {
|
|
134
|
-
configVersion:
|
|
157
|
+
configVersion: l
|
|
135
158
|
};
|
|
136
159
|
if ("getAttribute" in t && typeof t.getAttribute == "function") {
|
|
137
|
-
const n = t.getAttribute("
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
160
|
+
const n = t.getAttribute("esd-ext-config");
|
|
161
|
+
if (n)
|
|
162
|
+
try {
|
|
163
|
+
const s = JSON.parse(n);
|
|
164
|
+
s && typeof s == "object" && (Object.assign(o, s), o.configVersion = l);
|
|
165
|
+
} catch {
|
|
166
|
+
}
|
|
167
|
+
const r = t.getAttribute("data-layout");
|
|
168
|
+
r === "list" || r === "horizontal" ? o.layout = "list" : (r === "grid" || r === "vertical") && (o.layout = "grid");
|
|
169
|
+
const u = t.getAttribute("data-card-composition");
|
|
170
|
+
u && (o.composition = u.split(",").filter(Boolean));
|
|
171
|
+
const b = t.getAttribute("data-column-spacing");
|
|
172
|
+
b && (o.columnSpacing = parseInt(b) || c.columnSpacing);
|
|
173
|
+
const p = t.getAttribute("data-row-spacing");
|
|
174
|
+
if (p && (o.rowSpacing = parseInt(p) || c.rowSpacing), !o.currency) {
|
|
175
|
+
const s = t.getAttribute("currency"), y = t.getAttribute("currency-symbol"), d = t.getAttribute("currency-alignment"), f = t.getAttribute("currency-thousand-separator"), g = t.getAttribute("currency-decimal-separator"), m = t.getAttribute("currency-decimal-count");
|
|
176
|
+
if (s || y || d || f || g || m) {
|
|
177
|
+
const a = c.currency, h = m ? parseInt(m) : NaN;
|
|
178
|
+
o.currency = {
|
|
179
|
+
code: s ?? a.code,
|
|
180
|
+
symbol: y ?? a.symbol,
|
|
181
|
+
alignment: d === "0" ? "before" : "after",
|
|
182
|
+
decimalCount: Number.isFinite(h) ? h : a.decimalCount,
|
|
183
|
+
decimalSeparator: S(g) ? g : a.decimalSeparator,
|
|
184
|
+
thousandSeparator: N(f) ? f : a.thousandSeparator
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
145
188
|
}
|
|
146
|
-
return this.initializeConfig(i, t, o);
|
|
189
|
+
return this.initializeConfig(i, t, o).config;
|
|
147
190
|
}
|
|
148
191
|
/**
|
|
149
192
|
* Check if configuration needs migration
|
|
@@ -151,7 +194,7 @@ class C {
|
|
|
151
194
|
* @returns True if migration is needed
|
|
152
195
|
*/
|
|
153
196
|
static needsMigration(i) {
|
|
154
|
-
return i ? this.hasConfig(i) ? this.getConfigVersion(i) <
|
|
197
|
+
return i ? this.hasConfig(i) ? this.getConfigVersion(i) < l : !0 : !1;
|
|
155
198
|
}
|
|
156
199
|
// ========================================================================
|
|
157
200
|
// Internal Helpers
|
|
@@ -161,12 +204,12 @@ class C {
|
|
|
161
204
|
*/
|
|
162
205
|
static cloneDefaults() {
|
|
163
206
|
return {
|
|
164
|
-
...
|
|
165
|
-
currency: { ...
|
|
166
|
-
omnibusPrice: { ...
|
|
167
|
-
omnibusDiscount: { ...
|
|
168
|
-
composition: [...
|
|
169
|
-
visibility: { ...
|
|
207
|
+
...c,
|
|
208
|
+
currency: { ...c.currency },
|
|
209
|
+
omnibusPrice: { ...c.omnibusPrice },
|
|
210
|
+
omnibusDiscount: { ...c.omnibusDiscount },
|
|
211
|
+
composition: [...c.composition],
|
|
212
|
+
visibility: { ...c.visibility },
|
|
170
213
|
filters: [],
|
|
171
214
|
productIds: [],
|
|
172
215
|
recommendationId: 0
|
|
@@ -236,5 +279,5 @@ class C {
|
|
|
236
279
|
}
|
|
237
280
|
}
|
|
238
281
|
export {
|
|
239
|
-
|
|
282
|
+
M as RecommendationConfigService
|
|
240
283
|
};
|