@useinsider/guido 3.18.1-beta.fd927f4 → 3.18.1-beta.fefef3c
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 +21 -3
- package/dist/@types/config/schemas.js +59 -51
- package/dist/components/Guido.vue.js +4 -4
- package/dist/components/Guido.vue2.js +83 -87
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +7 -7
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +82 -57
- package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js +18 -0
- package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue2.js +25 -0
- package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +24 -22
- package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +28 -24
- package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.js +21 -0
- package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue2.js +46 -0
- package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +21 -0
- package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +46 -0
- package/dist/composables/useActionsApi.js +20 -24
- package/dist/composables/useCortexBlueprintBridge.js +54 -115
- package/dist/composables/useCustomInterfaceAppearance.js +46 -42
- package/dist/composables/useEmailTemplateApplier.js +50 -93
- package/dist/composables/useLegacyStrategyConversion.js +61 -0
- package/dist/enums/extensions/recommendationBlock.js +17 -14
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +70 -69
- package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +72 -28
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +45 -44
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +104 -58
- package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.js +72 -0
- package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +7 -7
- package/dist/guido.css +1 -1
- package/dist/services/recommendationApi.js +93 -84
- package/dist/src/@types/config/schemas.d.ts +16 -0
- package/dist/src/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.d.ts +2 -0
- package/dist/src/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.d.ts +2 -0
- package/dist/src/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.d.ts +2 -0
- package/dist/src/composables/useConfig.d.ts +4 -0
- package/dist/src/composables/useCortexBlueprintBridge.d.ts +3 -4
- package/dist/src/composables/useEmailTemplateApplier.d.ts +2 -22
- package/dist/src/composables/useLegacyStrategyConversion.d.ts +3 -0
- package/dist/src/enums/extensions/recommendationBlock.d.ts +3 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +2 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +4 -0
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +54 -1
- package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.d.ts +44 -0
- package/dist/src/services/recommendationApi.d.ts +2 -1
- package/dist/src/stores/config.d.ts +322 -0
- package/dist/src/stores/guido-email-editor.d.ts +7 -29
- package/dist/src/stores/onboarding.d.ts +808 -10
- package/dist/static/assets/icons/filled-arrow-rising.svg.js +5 -0
- package/dist/static/assets/icons/line-info.svg.js +5 -0
- package/dist/static/styles/components/recommendation-strategy.css.js +70 -5
- package/dist/stores/config.js +74 -60
- package/dist/stores/guido-email-editor.js +1 -5
- package/dist/stores/onboarding.js +46 -36
- package/package.json +1 -1
|
@@ -1,91 +1,100 @@
|
|
|
1
|
-
import { useHttp as
|
|
2
|
-
import { URLS as
|
|
3
|
-
const
|
|
4
|
-
(
|
|
5
|
-
attributeName:
|
|
6
|
-
attributeJs:
|
|
7
|
-
attributeType:
|
|
8
|
-
type:
|
|
9
|
-
displayName:
|
|
10
|
-
isFilterable:
|
|
11
|
-
},
|
|
1
|
+
import { useHttp as T } from "../composables/useHttp.js";
|
|
2
|
+
import { URLS as c, QUERY_PARAMS as m, TEMPLATE_MIGRATION_SCOPE_SEGMENT as _, MIGRATE_STRATEGIES_SEGMENT as u } from "../enums/extensions/recommendationBlock.js";
|
|
3
|
+
const h = "[sr_strategies.status][=][active]*[sr_strategies.suitable_channels][~][EMAIL]", S = (i) => i.reduce(
|
|
4
|
+
(d, o, E) => (d[E] = {
|
|
5
|
+
attributeName: o.attributeName,
|
|
6
|
+
attributeJs: o.attributeJs,
|
|
7
|
+
attributeType: o.attributeType,
|
|
8
|
+
type: o.type,
|
|
9
|
+
displayName: o.displayName,
|
|
10
|
+
isFilterable: o.isFilterable
|
|
11
|
+
}, d),
|
|
12
12
|
{}
|
|
13
|
-
),
|
|
14
|
-
const { get:
|
|
13
|
+
), f = () => {
|
|
14
|
+
const { get: i, post: d } = T(), { get: o } = T({ headers: {} }), E = "6KcLM9TwheVB1mgK", y = async () => {
|
|
15
|
+
try {
|
|
16
|
+
return (await i(`${c.NEWSLETTER_RECOMMENDATIONS_PATH}/create-data`)).data;
|
|
17
|
+
} catch (t) {
|
|
18
|
+
throw console.error("fetchUserModalState error:", t), t;
|
|
19
|
+
}
|
|
20
|
+
}, R = async () => {
|
|
21
|
+
try {
|
|
22
|
+
const { data: t } = await i(
|
|
23
|
+
c.PRODUCT_ATTRIBUTES_PATH
|
|
24
|
+
), a = Array.isArray(t) ? t : (t == null ? void 0 : t.data) ?? [];
|
|
25
|
+
return S(a);
|
|
26
|
+
} catch (t) {
|
|
27
|
+
throw console.error("fetchRecommendationFilters error:", t), t;
|
|
28
|
+
}
|
|
29
|
+
}, l = async (t, a) => {
|
|
30
|
+
var e;
|
|
31
|
+
try {
|
|
32
|
+
const r = new URLSearchParams(Object.entries(a));
|
|
33
|
+
r.set(m.CLIENT_ID, E);
|
|
34
|
+
const n = decodeURIComponent(r.toString());
|
|
35
|
+
console.debug("🏁 Recommendation API Query:", n);
|
|
36
|
+
const s = await o(
|
|
37
|
+
`${c.RECOMMENDATION_API_URL}/v2/${t}?${n}`
|
|
38
|
+
);
|
|
39
|
+
return ((e = s == null ? void 0 : s.data) == null ? void 0 : e.data) ?? [];
|
|
40
|
+
} catch (r) {
|
|
41
|
+
throw console.error("fetchRecommendationProducts error:", r), r;
|
|
42
|
+
}
|
|
43
|
+
}, g = async (t) => {
|
|
44
|
+
var a;
|
|
45
|
+
try {
|
|
46
|
+
const e = new RegExp(`[?&]${m.CLIENT_ID}=`).test(t), r = t.includes("?") ? "&" : "?", n = e ? t : `${t}${r}${m.CLIENT_ID}=${E}`, s = await o(
|
|
47
|
+
n
|
|
48
|
+
);
|
|
49
|
+
return ((a = s == null ? void 0 : s.data) == null ? void 0 : a.data) ?? [];
|
|
50
|
+
} catch (e) {
|
|
51
|
+
return console.error("fetchRecommendationProductsByUrl error:", e), [];
|
|
52
|
+
}
|
|
53
|
+
}, p = async () => {
|
|
54
|
+
try {
|
|
55
|
+
const { data: t } = await i(
|
|
56
|
+
`${c.RECOMMENDATION_STRATEGIES_PATH}?filters=${encodeURIComponent(h)}`
|
|
57
|
+
);
|
|
58
|
+
return Array.isArray(t) ? t : (t == null ? void 0 : t.data) ?? [];
|
|
59
|
+
} catch (t) {
|
|
60
|
+
throw console.error("fetchRecommendationStrategies error:", t), t;
|
|
61
|
+
}
|
|
62
|
+
}, I = async (t, a) => {
|
|
63
|
+
try {
|
|
64
|
+
const { data: e } = await d(
|
|
65
|
+
`${c.RECOMMENDATION_STRATEGIES_PATH}/endpoint-generate`,
|
|
66
|
+
{
|
|
67
|
+
campaignId: 0,
|
|
68
|
+
pageTypes: [],
|
|
69
|
+
isPreviewer: !1,
|
|
70
|
+
strategy: t,
|
|
71
|
+
userId: "",
|
|
72
|
+
currency: a
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
return !e || typeof e != "object" || !("full_path" in e || "data" in e) ? (console.error("generateStrategyEndpoint unexpected response shape:", e), null) : "full_path" in e ? e : e.data;
|
|
76
|
+
} catch (e) {
|
|
77
|
+
return console.error("generateStrategyEndpoint error:", e), null;
|
|
78
|
+
}
|
|
79
|
+
}, A = (t) => t.scope === "template" ? `${c.NEWSLETTER_RECOMMENDATIONS_PATH}/${_}/${u}` : `${c.NEWSLETTER_RECOMMENDATIONS_PATH}/${u}`;
|
|
15
80
|
return {
|
|
16
|
-
fetchRecommendationCreateData:
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
throw console.error("fetchRecommendationFilters error:", e), e;
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
fetchRecommendationProducts: async (e, o) => {
|
|
34
|
-
var t;
|
|
35
|
-
try {
|
|
36
|
-
const n = new URLSearchParams(Object.entries(o));
|
|
37
|
-
n.set(u.CLIENT_ID, i);
|
|
38
|
-
const d = decodeURIComponent(n.toString());
|
|
39
|
-
console.debug("🏁 Recommendation API Query:", d);
|
|
40
|
-
const a = await r(
|
|
41
|
-
`${m.RECOMMENDATION_API_URL}/v2/${e}?${d}`
|
|
42
|
-
);
|
|
43
|
-
return ((t = a == null ? void 0 : a.data) == null ? void 0 : t.data) ?? [];
|
|
44
|
-
} catch (n) {
|
|
45
|
-
throw console.error("fetchRecommendationProducts error:", n), n;
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
fetchRecommendationProductsByUrl: async (e) => {
|
|
49
|
-
var o;
|
|
50
|
-
try {
|
|
51
|
-
const t = new RegExp(`[?&]${u.CLIENT_ID}=`).test(e), n = e.includes("?") ? "&" : "?", d = t ? e : `${e}${n}${u.CLIENT_ID}=${i}`, a = await r(
|
|
52
|
-
d
|
|
53
|
-
);
|
|
54
|
-
return ((o = a == null ? void 0 : a.data) == null ? void 0 : o.data) ?? [];
|
|
55
|
-
} catch (t) {
|
|
56
|
-
return console.error("fetchRecommendationProductsByUrl error:", t), [];
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
fetchRecommendationStrategies: async () => {
|
|
60
|
-
try {
|
|
61
|
-
const { data: e } = await c(
|
|
62
|
-
`${m.RECOMMENDATION_STRATEGIES_PATH}?filters=${encodeURIComponent(y)}`
|
|
63
|
-
);
|
|
64
|
-
return Array.isArray(e) ? e : (e == null ? void 0 : e.data) ?? [];
|
|
65
|
-
} catch (e) {
|
|
66
|
-
throw console.error("fetchRecommendationStrategies error:", e), e;
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
generateStrategyEndpoint: async (e, o) => {
|
|
70
|
-
try {
|
|
71
|
-
const { data: t } = await s(
|
|
72
|
-
`${m.RECOMMENDATION_STRATEGIES_PATH}/endpoint-generate`,
|
|
73
|
-
{
|
|
74
|
-
campaignId: 0,
|
|
75
|
-
pageTypes: [],
|
|
76
|
-
isPreviewer: !1,
|
|
77
|
-
strategy: e,
|
|
78
|
-
userId: "",
|
|
79
|
-
currency: o
|
|
80
|
-
}
|
|
81
|
-
);
|
|
82
|
-
return !t || typeof t != "object" || !("full_path" in t || "data" in t) ? (console.error("generateStrategyEndpoint unexpected response shape:", t), null) : "full_path" in t ? t : t.data;
|
|
83
|
-
} catch (t) {
|
|
84
|
-
return console.error("generateStrategyEndpoint error:", t), null;
|
|
85
|
-
}
|
|
81
|
+
fetchRecommendationCreateData: y,
|
|
82
|
+
fetchRecommendationFilters: R,
|
|
83
|
+
fetchRecommendationProducts: l,
|
|
84
|
+
fetchRecommendationProductsByUrl: g,
|
|
85
|
+
fetchRecommendationStrategies: p,
|
|
86
|
+
generateStrategyEndpoint: I,
|
|
87
|
+
migrateLegacyStrategy: async (t, a = { scope: "campaign" }) => {
|
|
88
|
+
const { data: e } = await d(
|
|
89
|
+
A(a),
|
|
90
|
+
t
|
|
91
|
+
), r = e && typeof e == "object" && "data" in e ? e.data : e, n = r == null ? void 0 : r.strategyId;
|
|
92
|
+
if (n == null || n === "")
|
|
93
|
+
throw new Error("[Guido] migrate-strategies returned no strategyId");
|
|
94
|
+
return String(n);
|
|
86
95
|
}
|
|
87
96
|
};
|
|
88
97
|
};
|
|
89
98
|
export {
|
|
90
|
-
|
|
99
|
+
f as useRecommendationApi
|
|
91
100
|
};
|
|
@@ -50,6 +50,14 @@ export declare const IdentitySchema: v.ObjectSchema<{
|
|
|
50
50
|
readonly userId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "userId is required">]>;
|
|
51
51
|
/** Optional variation ID for A/B testing */
|
|
52
52
|
readonly variationId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
53
|
+
/** Optional numeric campaign ID of the host campaign; absent for templates and modules */
|
|
54
|
+
readonly campaignId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
55
|
+
/**
|
|
56
|
+
* Optional numeric template-library id of the host template; absent for campaigns and
|
|
57
|
+
* modules. Distinct from `templateId`, which is the editor's document identity (a uuid /
|
|
58
|
+
* Stripo doc id) and is never an endpoint id.
|
|
59
|
+
*/
|
|
60
|
+
readonly templateLibraryId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
53
61
|
}, undefined>;
|
|
54
62
|
/**
|
|
55
63
|
* Partner configuration - organization and product context
|
|
@@ -625,6 +633,14 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
|
|
|
625
633
|
readonly userId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, "userId is required">]>;
|
|
626
634
|
/** Optional variation ID for A/B testing */
|
|
627
635
|
readonly variationId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
636
|
+
/** Optional numeric campaign ID of the host campaign; absent for templates and modules */
|
|
637
|
+
readonly campaignId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
638
|
+
/**
|
|
639
|
+
* Optional numeric template-library id of the host template; absent for campaigns and
|
|
640
|
+
* modules. Distinct from `templateId`, which is the editor's document identity (a uuid /
|
|
641
|
+
* Stripo doc id) and is never an endpoint id.
|
|
642
|
+
*/
|
|
643
|
+
readonly templateLibraryId: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
628
644
|
}, undefined>;
|
|
629
645
|
/** Partner configuration (required) */
|
|
630
646
|
readonly partner: v.ObjectSchema<{
|
package/dist/src/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
2
|
+
export default _default;
|
package/dist/src/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
2
|
+
export default _default;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
2
|
+
export default _default;
|
|
@@ -11,6 +11,8 @@ export declare const useConfig: () => {
|
|
|
11
11
|
templateId: string;
|
|
12
12
|
userId: string;
|
|
13
13
|
variationId?: string | undefined;
|
|
14
|
+
campaignId?: string | undefined;
|
|
15
|
+
templateLibraryId?: string | undefined;
|
|
14
16
|
};
|
|
15
17
|
partner: {
|
|
16
18
|
name: string;
|
|
@@ -146,6 +148,8 @@ export declare const useConfig: () => {
|
|
|
146
148
|
templateId: string;
|
|
147
149
|
userId: string;
|
|
148
150
|
variationId?: string | undefined;
|
|
151
|
+
campaignId?: string | undefined;
|
|
152
|
+
templateLibraryId?: string | undefined;
|
|
149
153
|
} | null>;
|
|
150
154
|
partner: import("vue").ComputedRef<{
|
|
151
155
|
name: string;
|
|
@@ -17,13 +17,12 @@
|
|
|
17
17
|
* - `error` segments (and message-level `isError` / `isCancelled`) trigger
|
|
18
18
|
* a localized toaster.
|
|
19
19
|
*
|
|
20
|
-
* Every apply settles into a terminal `applyAcks` entry on the public store, so
|
|
21
|
-
* cortex can move its Apply button on the truth of the editor write rather than
|
|
22
|
-
* on the click.
|
|
23
|
-
*
|
|
24
20
|
* In dev (`import.meta.env.DEV`) every observed segment + message-level flag
|
|
25
21
|
* change is also `console.debug`-logged with the prefix `[guido:cortex]` so a
|
|
26
22
|
* developer can watch the agent stream in real time. In production this is
|
|
27
23
|
* gated behind `localStorage.guido:debug:ai === '1'`.
|
|
24
|
+
*
|
|
25
|
+
* If cortex-fe isn't loaded the chat store is undefined and the bridge is a
|
|
26
|
+
* no-op (intentional — Guido must still work standalone).
|
|
28
27
|
*/
|
|
29
28
|
export declare const useCortexBlueprintBridge: () => void;
|
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
type ApplyStatus = 'pending' | 'applying' | 'applied' | 'failed';
|
|
2
|
-
/**
|
|
3
|
-
* Terminal outcome of an apply. Every promise this composable hands out settles
|
|
4
|
-
* with exactly one of these — callers (the cortex bridge) ack on it, so a
|
|
5
|
-
* never-settling promise would strand cortex's Apply button forever.
|
|
6
|
-
*
|
|
7
|
-
* `superseded` means a newer payload for the same blueprint replaced this one:
|
|
8
|
-
* not a success, not a failure, and deliberately never acked.
|
|
9
|
-
*/
|
|
10
|
-
export type ApplyOutcome = {
|
|
11
|
-
status: 'applied';
|
|
12
|
-
} | {
|
|
13
|
-
status: 'failed';
|
|
14
|
-
error: unknown;
|
|
15
|
-
} | {
|
|
16
|
-
status: 'superseded';
|
|
17
|
-
};
|
|
18
2
|
/**
|
|
19
3
|
* Applies email_template blueprints from the chat agent to the Stripo editor.
|
|
20
4
|
*
|
|
@@ -25,10 +9,6 @@ export type ApplyOutcome = {
|
|
|
25
9
|
* - manual Apply click (first apply): immediate.
|
|
26
10
|
* - blueprint_update after the user has applied once: debounced 250 ms trailing
|
|
27
11
|
* so rapid mid-stream updates don't thrash updateHtmlAndCss.
|
|
28
|
-
*
|
|
29
|
-
* A click that lands before Stripo finished initializing is queued rather than
|
|
30
|
-
* dropped, and flushed when `isStripoInitialized` flips — the user does not
|
|
31
|
-
* have to click again.
|
|
32
12
|
*/
|
|
33
13
|
export declare const useEmailTemplateApplier: () => {
|
|
34
14
|
applyStatus: import("vue").Ref<Record<string, ApplyStatus>>;
|
|
@@ -36,11 +16,11 @@ export declare const useEmailTemplateApplier: () => {
|
|
|
36
16
|
applyTemplate: (blueprintId: string, data: {
|
|
37
17
|
html?: string;
|
|
38
18
|
css?: string;
|
|
39
|
-
}) =>
|
|
19
|
+
}) => void;
|
|
40
20
|
applyTemplateDebounced: (blueprintId: string, data: {
|
|
41
21
|
html?: string;
|
|
42
22
|
css?: string;
|
|
43
|
-
}) =>
|
|
23
|
+
}) => void;
|
|
44
24
|
};
|
|
45
25
|
export declare const resetEmailTemplateApplier: () => void;
|
|
46
26
|
export {};
|
|
@@ -5,7 +5,10 @@ export declare const URLS: {
|
|
|
5
5
|
PRODUCT_ATTRIBUTES_PATH: string;
|
|
6
6
|
RECOMMENDATION_STRATEGIES_PATH: string;
|
|
7
7
|
RECOMMENDATION_STRATEGIES_PANEL_PATH: string;
|
|
8
|
+
NEWSLETTER_RECOMMENDATIONS_PATH: string;
|
|
8
9
|
};
|
|
10
|
+
export declare const MIGRATE_STRATEGIES_SEGMENT = "migrate-strategies";
|
|
11
|
+
export declare const TEMPLATE_MIGRATION_SCOPE_SEGMENT = "template";
|
|
9
12
|
export declare const QUERY_PARAMS: {
|
|
10
13
|
CLIENT_ID: string;
|
|
11
14
|
};
|
|
@@ -2,6 +2,8 @@ import { CommonControl } from '../../../common-control';
|
|
|
2
2
|
export declare const STRATEGY_CONTROL_ID = "recommendation-strategy-control";
|
|
3
3
|
export declare class StrategyControl extends CommonControl {
|
|
4
4
|
private store;
|
|
5
|
+
private onboardingStore;
|
|
6
|
+
private legacyConversion;
|
|
5
7
|
private storeUnsubscription;
|
|
6
8
|
private listeners;
|
|
7
9
|
private lastPaintedState;
|
|
@@ -88,6 +88,8 @@ export interface RegenerateWithStylesOptions extends Omit<RegenerateProductRowsO
|
|
|
88
88
|
products?: RecommendationProduct[];
|
|
89
89
|
/** Optional: pass layout directly to avoid stale DOM reads after setAttribute */
|
|
90
90
|
layout?: Orientation;
|
|
91
|
+
/** Applies the batch even when the rows are unchanged, for callers that staged their own edits. */
|
|
92
|
+
forceApply?: boolean;
|
|
91
93
|
}
|
|
92
94
|
/**
|
|
93
95
|
* Regenerates product rows while preserving user-applied styles, in a SINGLE commit.
|
|
@@ -151,6 +153,8 @@ export interface UpdateProductContentInPlaceOptions {
|
|
|
151
153
|
currentNode: ImmutableHtmlNode | null | undefined;
|
|
152
154
|
documentModifier: DocumentModifier;
|
|
153
155
|
products: RecommendationProduct[];
|
|
156
|
+
/** Applies the batch even when the cards are unchanged, for callers that staged their own edits. */
|
|
157
|
+
forceApply?: boolean;
|
|
154
158
|
}
|
|
155
159
|
/**
|
|
156
160
|
* Updates product content in-place without regenerating HTML structure.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Orientation, Languages, Currency, NumericSeparator, FiltersResponse, Filter, RecommendationCampaignUrlValue, RecommendationProduct, RrsStrategy } from '@@/Types/recommendation';
|
|
1
|
+
import type { Orientation, Languages, Currency, NumericSeparator, FiltersResponse, Filter, RecommendationCampaignUrlValue, RecommendationProduct, RrsMigrationPayload, RrsMigrationTarget, RrsStrategy } from '@@/Types/recommendation';
|
|
2
2
|
export interface PerBlockConfigs {
|
|
3
3
|
cardsInRow: number;
|
|
4
4
|
currencySettings: {
|
|
@@ -22,6 +22,7 @@ export interface PerBlockConfigs {
|
|
|
22
22
|
shuffleProducts: boolean;
|
|
23
23
|
strategy: string;
|
|
24
24
|
strategyId: string;
|
|
25
|
+
nodeConfigVersion: number;
|
|
25
26
|
textTrimming: boolean;
|
|
26
27
|
unresponsive: boolean;
|
|
27
28
|
size: string;
|
|
@@ -36,11 +37,13 @@ interface PerBlockState {
|
|
|
36
37
|
filterSelectionDrawerStatus: boolean;
|
|
37
38
|
assignStrategyDrawerStatus: boolean;
|
|
38
39
|
removeStrategyModalStatus: boolean;
|
|
40
|
+
legacyStrategyUpdatedModalStatus: boolean;
|
|
39
41
|
filterGroup: number;
|
|
40
42
|
/** Whether initial API data (filters, algorithms, products) has been fetched for this block */
|
|
41
43
|
isInitialized: boolean;
|
|
42
44
|
/** Snapshot of filters taken when the drawer opens, used to revert on cancel */
|
|
43
45
|
filterSnapshot: Filter[] | null;
|
|
46
|
+
legacyConversionLoading: boolean;
|
|
44
47
|
}
|
|
45
48
|
/**
|
|
46
49
|
* Persisted-config subset used by `seedBlockUrlConfig` to reconstruct
|
|
@@ -201,6 +204,53 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
|
|
|
201
204
|
currentRecommendationId: number | null;
|
|
202
205
|
configVersion: number;
|
|
203
206
|
} & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
|
|
207
|
+
isLegacyStrategyBlock(): boolean;
|
|
208
|
+
legacyConversionLoading(state: {
|
|
209
|
+
recommendationCampaignUrls: Record<string, RecommendationCampaignUrlValue>;
|
|
210
|
+
activePredictiveAlgorithms: number[];
|
|
211
|
+
languages: Languages;
|
|
212
|
+
currencyList: {
|
|
213
|
+
text: string;
|
|
214
|
+
value: string;
|
|
215
|
+
}[];
|
|
216
|
+
filterList: FiltersResponse;
|
|
217
|
+
strategies: {
|
|
218
|
+
[x: string]: unknown;
|
|
219
|
+
strategy_id: number;
|
|
220
|
+
name: string;
|
|
221
|
+
status: string;
|
|
222
|
+
suitable_channels: string;
|
|
223
|
+
size?: (number | string) | undefined;
|
|
224
|
+
}[];
|
|
225
|
+
strategiesLoading: boolean;
|
|
226
|
+
strategyUrlTemplates: Record<string, string>;
|
|
227
|
+
blockStates: Record<number, PerBlockState>;
|
|
228
|
+
currentRecommendationId: number | null;
|
|
229
|
+
configVersion: number;
|
|
230
|
+
} & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
|
|
231
|
+
legacyStrategyUpdatedModalStatus(state: {
|
|
232
|
+
recommendationCampaignUrls: Record<string, RecommendationCampaignUrlValue>;
|
|
233
|
+
activePredictiveAlgorithms: number[];
|
|
234
|
+
languages: Languages;
|
|
235
|
+
currencyList: {
|
|
236
|
+
text: string;
|
|
237
|
+
value: string;
|
|
238
|
+
}[];
|
|
239
|
+
filterList: FiltersResponse;
|
|
240
|
+
strategies: {
|
|
241
|
+
[x: string]: unknown;
|
|
242
|
+
strategy_id: number;
|
|
243
|
+
name: string;
|
|
244
|
+
status: string;
|
|
245
|
+
suitable_channels: string;
|
|
246
|
+
size?: (number | string) | undefined;
|
|
247
|
+
}[];
|
|
248
|
+
strategiesLoading: boolean;
|
|
249
|
+
strategyUrlTemplates: Record<string, string>;
|
|
250
|
+
blockStates: Record<number, PerBlockState>;
|
|
251
|
+
currentRecommendationId: number | null;
|
|
252
|
+
configVersion: number;
|
|
253
|
+
} & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
|
|
204
254
|
assignedStrategy(state: {
|
|
205
255
|
recommendationCampaignUrls: Record<string, RecommendationCampaignUrlValue>;
|
|
206
256
|
activePredictiveAlgorithms: number[];
|
|
@@ -430,11 +480,14 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
|
|
|
430
480
|
cancelFilterDrawer(): void;
|
|
431
481
|
openAssignStrategyDrawer(): void;
|
|
432
482
|
closeAssignStrategyDrawer(): void;
|
|
483
|
+
openLegacyStrategyUpdatedModal(): void;
|
|
484
|
+
closeLegacyStrategyUpdatedModal(): void;
|
|
433
485
|
openRemoveStrategyModal(): void;
|
|
434
486
|
closeRemoveStrategyModal(): void;
|
|
435
487
|
fetchStrategies(): Promise<void>;
|
|
436
488
|
resolveStrategyUrlTemplate(strategy: RrsStrategy, currency: string): Promise<string>;
|
|
437
489
|
assignStrategy(strategy: RrsStrategy): void;
|
|
490
|
+
convertLegacyStrategy(payload: RrsMigrationPayload, target?: RrsMigrationTarget): Promise<string>;
|
|
438
491
|
removeStrategy(): void;
|
|
439
492
|
fetchRecommendationCreateData(): Promise<void>;
|
|
440
493
|
fetchRecommendationFilters(): Promise<void>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Filter, RrsMigrationFilterGroup, RrsMigrationPayload, RrsMigrationTarget } from '@@/Types/recommendation';
|
|
2
|
+
type FilterAttribute = {
|
|
3
|
+
value: string;
|
|
4
|
+
type: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* A block authored before reusable strategies: it still carries a plain feed
|
|
8
|
+
* configuration (compiled into a feed URL string) instead of a strategy id.
|
|
9
|
+
* Blocks created under RRS stamp `CURRENT_CONFIG_VERSION`, so the version is
|
|
10
|
+
* what separates "never converted" from "not assigned yet".
|
|
11
|
+
*/
|
|
12
|
+
export declare function isLegacyStrategyConfig({ strategyId, nodeConfigVersion }: {
|
|
13
|
+
strategyId: string;
|
|
14
|
+
nodeConfigVersion: number;
|
|
15
|
+
}): boolean;
|
|
16
|
+
export declare function resolveMigrationTarget({ campaignId, templateLibraryId }: {
|
|
17
|
+
campaignId?: string;
|
|
18
|
+
templateLibraryId?: string;
|
|
19
|
+
}): RrsMigrationTarget;
|
|
20
|
+
/**
|
|
21
|
+
* Groups the block's valid filters the way the feed URL groups them, in the
|
|
22
|
+
* shape the migration endpoint validates. The URL's filter DSL states no
|
|
23
|
+
* attribute type and cannot express a mixed-operator group, which is exactly
|
|
24
|
+
* what this override exists to supply.
|
|
25
|
+
*/
|
|
26
|
+
export declare function toMigrationFilterGroups(filters: Filter[], attributes: FilterAttribute[]): RrsMigrationFilterGroup[];
|
|
27
|
+
interface MigrationInputs {
|
|
28
|
+
blockId: number;
|
|
29
|
+
url: string;
|
|
30
|
+
campaignId: string;
|
|
31
|
+
variationId: string;
|
|
32
|
+
strategy: string;
|
|
33
|
+
productIds: string[];
|
|
34
|
+
filters: Filter[];
|
|
35
|
+
attributes: FilterAttribute[];
|
|
36
|
+
target: RrsMigrationTarget;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The server names and de-duplicates the strategy, so nothing here derives a name. The two
|
|
40
|
+
* routes take different identity fields — the campaign one names from `campaignId`/`variationId`
|
|
41
|
+
* (0 for modules, which carry no numeric campaign), the template one from `templateId`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildLegacyMigrationPayload({ blockId, url, campaignId, variationId, strategy, productIds, filters, attributes, target, }: MigrationInputs): RrsMigrationPayload;
|
|
44
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { InitialResponse, FiltersResponse, RecommendationProduct, RecommendationProductsParams, RrsEndpointGenerateResponse, RrsStrategy } from '@@/Types/recommendation';
|
|
1
|
+
import type { InitialResponse, FiltersResponse, RecommendationProduct, RecommendationProductsParams, RrsEndpointGenerateResponse, RrsMigrationPayload, RrsMigrationTarget, RrsStrategy } from '@@/Types/recommendation';
|
|
2
2
|
export declare const useRecommendationApi: () => {
|
|
3
3
|
fetchRecommendationCreateData: () => Promise<InitialResponse>;
|
|
4
4
|
fetchRecommendationFilters: () => Promise<FiltersResponse>;
|
|
@@ -6,4 +6,5 @@ export declare const useRecommendationApi: () => {
|
|
|
6
6
|
fetchRecommendationProductsByUrl: (url: string) => Promise<RecommendationProduct[]>;
|
|
7
7
|
fetchRecommendationStrategies: () => Promise<RrsStrategy[]>;
|
|
8
8
|
generateStrategyEndpoint: (strategy: RrsStrategy, currency: string) => Promise<RrsEndpointGenerateResponse | null>;
|
|
9
|
+
migrateLegacyStrategy: (payload: RrsMigrationPayload, target?: RrsMigrationTarget) => Promise<string>;
|
|
9
10
|
};
|