@useinsider/guido 3.18.0 → 3.18.1-beta.0725bd5

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.
Files changed (38) hide show
  1. package/dist/components/Guido.vue.js +1 -1
  2. package/dist/components/Guido.vue2.js +86 -82
  3. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +13 -11
  4. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +65 -53
  5. package/dist/components/organisms/header/EditorActions.vue.js +1 -1
  6. package/dist/components/organisms/header/EditorActions.vue2.js +54 -41
  7. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +20 -18
  8. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +21 -0
  9. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +47 -0
  10. package/dist/composables/useActionsApi.js +82 -67
  11. package/dist/composables/useAutoSave.js +31 -26
  12. package/dist/composables/useCustomInterfaceAppearance.js +46 -41
  13. package/dist/composables/useEditorLock.js +20 -0
  14. package/dist/composables/useGuidoStateBridge.js +37 -31
  15. package/dist/composables/useHtmlValidator.js +84 -79
  16. package/dist/composables/useRecommendation.js +21 -18
  17. package/dist/composables/useSave.js +42 -39
  18. package/dist/composables/useStripo.js +7 -7
  19. package/dist/enums/extensions/recommendationBlock.js +38 -31
  20. package/dist/extensions/Blocks/Recommendation/block.js +43 -39
  21. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +62 -57
  22. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +84 -52
  23. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +210 -130
  24. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +21 -12
  25. package/dist/guido.css +1 -1
  26. package/dist/package.json.js +1 -1
  27. package/dist/src/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.d.ts +2 -0
  28. package/dist/src/composables/useEditorLock.d.ts +10 -0
  29. package/dist/src/enums/extensions/recommendationBlock.d.ts +2 -0
  30. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +2 -0
  31. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +9 -0
  32. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +74 -0
  33. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +4 -0
  34. package/dist/src/stores/onboarding.d.ts +377 -0
  35. package/dist/static/styles/components/recommendation-strategy.css.js +51 -4
  36. package/dist/stores/onboarding.js +41 -36
  37. package/dist/utils/templatePreparation.js +50 -50
  38. package/package.json +2 -2
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-87033101]{position:relative;display:inline-block}.new-tag[data-v-87033101]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-87033101] .guido__view-option-selection-desktop svg,[data-v-87033101] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-87033101] .in-segments-wrapper__button_selected,[data-v-87033101] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-87033101] .in-tooltip-wrapper-v2__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-6ebabfe4]{position:relative;display:inline-block}.new-tag[data-v-6ebabfe4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-6ebabfe4] .guido__verion-history-view-option-selection-desktop svg,[data-v-6ebabfe4] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6ebabfe4] .in-segments-wrapper__button_selected,[data-v-6ebabfe4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-6ebabfe4] .in-tooltip-wrapper-v2__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-6e711fd7]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-5c588dc5]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-5c588dc5]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-5c588dc5]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}.assign-strategy-drawer-content .assign-strategy-select[data-v-2580a7d9]{width:100%;max-width:none}.assign-strategy-drawer-content .assign-strategy-select[data-v-2580a7d9] .in-dropdown-box__container{width:413px}.assign-strategy-drawer .spaced-dot-sep{background-image:linear-gradient(90deg,#91949f 20%,#fff0 0);background-position:center bottom;background-repeat:repeat-x;background-size:5px 1px}.assign-strategy-drawer .spaced-dot-sep--top{background-position:center top}.assign-strategy-drawer .spaced-dot-sep--fc-n:first-child{background:none}
1
+ @charset "UTF-8";.gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-87033101]{position:relative;display:inline-block}.new-tag[data-v-87033101]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-87033101] .guido__view-option-selection-desktop svg,[data-v-87033101] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-87033101] .in-segments-wrapper__button_selected,[data-v-87033101] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-87033101] .in-tooltip-wrapper-v2__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-6ebabfe4]{position:relative;display:inline-block}.new-tag[data-v-6ebabfe4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-6ebabfe4] .guido__verion-history-view-option-selection-desktop svg,[data-v-6ebabfe4] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6ebabfe4] .in-segments-wrapper__button_selected,[data-v-6ebabfe4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-6ebabfe4] .in-tooltip-wrapper-v2__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-1ca6baf0]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-cc5ee925]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-cc5ee925]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-cc5ee925]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-ec2027ff] .vueperslides__bullets,[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}.assign-strategy-drawer-content .assign-strategy-select[data-v-b447f626]{width:100%;max-width:none}.assign-strategy-drawer-content .assign-strategy-select[data-v-b447f626] .in-dropdown-box__container{width:413px}.assign-strategy-drawer .spaced-dot-sep{background-image:linear-gradient(90deg,#91949f 20%,#fff0 0);background-position:center bottom;background-repeat:repeat-x;background-size:5px 1px}.assign-strategy-drawer .spaced-dot-sep--top{background-position:center top}.assign-strategy-drawer .spaced-dot-sep--fc-n:first-child{background:none}
@@ -1,4 +1,4 @@
1
- const o = { stripo: { version: "2.72.1" } }, s = {
1
+ const o = { stripo: { version: "2.73.0" } }, s = {
2
2
  guido: o
3
3
  };
4
4
  export {
@@ -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,10 @@
1
+ export declare const isEditorBusy: () => boolean;
2
+ export declare const beginMount: () => number;
3
+ export declare const isCurrentMount: (generation: number) => boolean;
4
+ export declare const runExclusive: <T>(task: () => Promise<T>) => Promise<T>;
5
+ export declare const useEditorLock: () => {
6
+ runExclusive: <T>(task: () => Promise<T>) => Promise<T>;
7
+ isEditorBusy: () => boolean;
8
+ beginMount: () => number;
9
+ isCurrentMount: (generation: number) => boolean;
10
+ };
@@ -5,7 +5,9 @@ export declare const URLS: {
5
5
  PRODUCT_ATTRIBUTES_PATH: string;
6
6
  RECOMMENDATION_STRATEGIES_PATH: string;
7
7
  RECOMMENDATION_STRATEGIES_PANEL_PATH: string;
8
+ RECOMMENDATION_STRATEGY_CREATE_PATH: string;
8
9
  };
10
+ export declare const strategyEditPath: (strategyId: string | number) => string;
9
11
  export declare const QUERY_PARAMS: {
10
12
  CLIENT_ID: string;
11
13
  };
@@ -66,6 +66,8 @@ export declare class RecommendationBlockControl extends CommonControl {
66
66
  * edits are never clobbered (SD-141049).
67
67
  */
68
68
  private _syncNodeConfigIfChanged;
69
+ /** Whether the deferred write would move the node's strategyId — see the caller (SD-149916). */
70
+ private _isPendingStrategyIdChange;
69
71
  private _capturePendingNodeConfigWrite;
70
72
  /**
71
73
  * Accumulates the pending write into `documentModifier` without applying, so the
@@ -2,6 +2,7 @@ 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;
5
6
  private storeUnsubscription;
6
7
  private listeners;
7
8
  private lastPaintedState;
@@ -9,6 +10,14 @@ export declare class StrategyControl extends CommonControl {
9
10
  getTemplate(): string;
10
11
  private _strategyAction;
11
12
  onRender(): void;
13
+ /**
14
+ * Whether the document itself says this block has no strategy.
15
+ *
16
+ * Read the node, not the store: when the main control cannot resolve the block id off the
17
+ * node it never syncs the persisted config, so the store still holds defaults (empty
18
+ * strategyId) for an assigned block.
19
+ */
20
+ private _isNodeUnassigned;
12
21
  onDestroy(): void;
13
22
  private _teardown;
14
23
  private _setupButtonListeners;
@@ -71,8 +71,11 @@ interface StoreState {
71
71
  strategies: RrsStrategy[];
72
72
  strategiesLoading: boolean;
73
73
  strategyUrlTemplates: Record<string, string>;
74
+ strategiesFetched: boolean;
75
+ strategiesSettled: boolean;
74
76
  blockStates: Record<number, PerBlockState>;
75
77
  currentRecommendationId: number | null;
78
+ strategyPanelOpen: boolean;
76
79
  configVersion: number;
77
80
  }
78
81
  export declare const useRecommendationExtensionStore: import("pinia").StoreDefinition<"guidoRecommendationExtension", StoreState, {
@@ -99,8 +102,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
99
102
  }[];
100
103
  strategiesLoading: boolean;
101
104
  strategyUrlTemplates: Record<string, string>;
105
+ strategiesFetched: boolean;
106
+ strategiesSettled: boolean;
102
107
  blockStates: Record<number, PerBlockState>;
103
108
  currentRecommendationId: number | null;
109
+ strategyPanelOpen: boolean;
104
110
  configVersion: number;
105
111
  } & import("pinia").PiniaCustomStateProperties<StoreState>): PerBlockConfigs;
106
112
  /**
@@ -125,8 +131,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
125
131
  }[];
126
132
  strategiesLoading: boolean;
127
133
  strategyUrlTemplates: Record<string, string>;
134
+ strategiesFetched: boolean;
135
+ strategiesSettled: boolean;
128
136
  blockStates: Record<number, PerBlockState>;
129
137
  currentRecommendationId: number | null;
138
+ strategyPanelOpen: boolean;
130
139
  configVersion: number;
131
140
  } & import("pinia").PiniaCustomStateProperties<StoreState>): RecommendationProduct[];
132
141
  /**
@@ -151,8 +160,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
151
160
  }[];
152
161
  strategiesLoading: boolean;
153
162
  strategyUrlTemplates: Record<string, string>;
163
+ strategiesFetched: boolean;
164
+ strategiesSettled: boolean;
154
165
  blockStates: Record<number, PerBlockState>;
155
166
  currentRecommendationId: number | null;
167
+ strategyPanelOpen: boolean;
156
168
  configVersion: number;
157
169
  } & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
158
170
  assignStrategyDrawerStatus(state: {
@@ -174,8 +186,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
174
186
  }[];
175
187
  strategiesLoading: boolean;
176
188
  strategyUrlTemplates: Record<string, string>;
189
+ strategiesFetched: boolean;
190
+ strategiesSettled: boolean;
177
191
  blockStates: Record<number, PerBlockState>;
178
192
  currentRecommendationId: number | null;
193
+ strategyPanelOpen: boolean;
179
194
  configVersion: number;
180
195
  } & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
181
196
  removeStrategyModalStatus(state: {
@@ -197,8 +212,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
197
212
  }[];
198
213
  strategiesLoading: boolean;
199
214
  strategyUrlTemplates: Record<string, string>;
215
+ strategiesFetched: boolean;
216
+ strategiesSettled: boolean;
200
217
  blockStates: Record<number, PerBlockState>;
201
218
  currentRecommendationId: number | null;
219
+ strategyPanelOpen: boolean;
202
220
  configVersion: number;
203
221
  } & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
204
222
  assignedStrategy(state: {
@@ -220,8 +238,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
220
238
  }[];
221
239
  strategiesLoading: boolean;
222
240
  strategyUrlTemplates: Record<string, string>;
241
+ strategiesFetched: boolean;
242
+ strategiesSettled: boolean;
223
243
  blockStates: Record<number, PerBlockState>;
224
244
  currentRecommendationId: number | null;
245
+ strategyPanelOpen: boolean;
225
246
  configVersion: number;
226
247
  } & import("pinia").PiniaCustomStateProperties<StoreState>): RrsStrategy | null;
227
248
  /**
@@ -246,8 +267,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
246
267
  }[];
247
268
  strategiesLoading: boolean;
248
269
  strategyUrlTemplates: Record<string, string>;
270
+ strategiesFetched: boolean;
271
+ strategiesSettled: boolean;
249
272
  blockStates: Record<number, PerBlockState>;
250
273
  currentRecommendationId: number | null;
274
+ strategyPanelOpen: boolean;
251
275
  configVersion: number;
252
276
  } & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
253
277
  /**
@@ -272,8 +296,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
272
296
  }[];
273
297
  strategiesLoading: boolean;
274
298
  strategyUrlTemplates: Record<string, string>;
299
+ strategiesFetched: boolean;
300
+ strategiesSettled: boolean;
275
301
  blockStates: Record<number, PerBlockState>;
276
302
  currentRecommendationId: number | null;
303
+ strategyPanelOpen: boolean;
277
304
  configVersion: number;
278
305
  } & import("pinia").PiniaCustomStateProperties<StoreState>): number;
279
306
  hasFilters(): boolean;
@@ -299,8 +326,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
299
326
  }[];
300
327
  strategiesLoading: boolean;
301
328
  strategyUrlTemplates: Record<string, string>;
329
+ strategiesFetched: boolean;
330
+ strategiesSettled: boolean;
302
331
  blockStates: Record<number, PerBlockState>;
303
332
  currentRecommendationId: number | null;
333
+ strategyPanelOpen: boolean;
304
334
  configVersion: number;
305
335
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => {
306
336
  text: string;
@@ -325,8 +355,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
325
355
  }[];
326
356
  strategiesLoading: boolean;
327
357
  strategyUrlTemplates: Record<string, string>;
358
+ strategiesFetched: boolean;
359
+ strategiesSettled: boolean;
328
360
  blockStates: Record<number, PerBlockState>;
329
361
  currentRecommendationId: number | null;
362
+ strategyPanelOpen: boolean;
330
363
  configVersion: number;
331
364
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => {
332
365
  text: string;
@@ -351,8 +384,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
351
384
  }[];
352
385
  strategiesLoading: boolean;
353
386
  strategyUrlTemplates: Record<string, string>;
387
+ strategiesFetched: boolean;
388
+ strategiesSettled: boolean;
354
389
  blockStates: Record<number, PerBlockState>;
355
390
  currentRecommendationId: number | null;
391
+ strategyPanelOpen: boolean;
356
392
  configVersion: number;
357
393
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => {
358
394
  text: string;
@@ -433,6 +469,39 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
433
469
  openRemoveStrategyModal(): void;
434
470
  closeRemoveStrategyModal(): void;
435
471
  fetchStrategies(): Promise<void>;
472
+ invalidateStrategies(): void;
473
+ /**
474
+ * Opens a Smart Recommender strategy page in a new tab and refreshes the list every time
475
+ * the user comes back. `visibilitychange` covers the tab case; `focus` covers the page
476
+ * landing in a separate window, where this document never goes hidden.
477
+ *
478
+ * Deliberately NOT one-shot: the strategy tab stays open, so a user can create a second
479
+ * strategy in it and come back again — a listener that disarmed on the first return would
480
+ * leave that one missing from the list. It disarms on the first return AFTER that tab is
481
+ * closed instead, so an ordinary alt-tab later in the session costs nothing. Armed only
482
+ * once the user actually opens a strategy page, so anyone who never does pays nothing.
483
+ */
484
+ _armStrategyPageReturn(url: string): void;
485
+ /**
486
+ * Reloads the products of the block the user is on, so an edit made in the strategy tab
487
+ * lands on the canvas instead of waiting for the assign drawer to be reopened.
488
+ *
489
+ * Only the selected block: the canvas regeneration is driven off the active block's
490
+ * product array, so refreshing an unselected block would fetch without redrawing it.
491
+ */
492
+ _refreshAssignedStrategyProducts(): Promise<void>;
493
+ /** Lets the editor tear the return listeners down when it unmounts. */
494
+ disposeStrategyPageReturn(): void;
495
+ /**
496
+ * Opens Smart Recommender's strategy creation page. Every return refreshes the list so the
497
+ * new strategy is offered; the user picks it themselves.
498
+ */
499
+ openStrategyCreation(): void;
500
+ /**
501
+ * Opens the strategy's edit page. Every return refreshes the list so the block reflects the
502
+ * edited configuration.
503
+ */
504
+ openStrategyEdit(strategyId: string | number): void;
436
505
  resolveStrategyUrlTemplate(strategy: RrsStrategy, currency: string): Promise<string>;
437
506
  assignStrategy(strategy: RrsStrategy): void;
438
507
  removeStrategy(): void;
@@ -450,6 +519,11 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
450
519
  * every block's recommendationConfigs across user edits.
451
520
  */
452
521
  hasInvalidBlock(): boolean;
522
+ /**
523
+ * Which required fields are missing across the design's blocks, so the save
524
+ * toaster can name the cause instead of always showing the generic message.
525
+ */
526
+ invalidBlockFields(): string[];
453
527
  fetchRecommendationProducts(): Promise<void>;
454
528
  _doFetchProducts(): Promise<void>;
455
529
  _doFetchStrategyProducts(blockId: number): Promise<void>;
@@ -15,7 +15,11 @@ export interface RequiredField {
15
15
  getAvailableOptions?: (store: ExtensionStoreSlice) => string[];
16
16
  condition?: (config: PerBlockConfigs) => boolean;
17
17
  }
18
+ /** Field key of the strategy/algorithm descriptor, used to pick the toaster message. */
19
+ export declare const STRATEGY_FIELD_KEY = "strategy";
18
20
  export declare const REQUIRED_RECOMMENDATION_FIELDS: RequiredField[];
19
21
  export declare const RecommendationRequiredFieldsKey = "newsletter.recommendation-fill-required-fields";
22
+ /** Shown instead of the generic message when the only thing missing is the strategy. */
23
+ export declare const RecommendationAssignStrategyKey = "newsletter.recommendation-assign-strategy";
20
24
  export declare function getInvalidFields(config: PerBlockConfigs, store: ExtensionStoreSlice, fields?: RequiredField[]): string[];
21
25
  export declare function isConfigValid(config: PerBlockConfigs, store: ExtensionStoreSlice): boolean;