@useinsider/guido 3.12.0-beta.d2745e7 → 3.12.0-beta.d77b0d2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/@types/config/schemas.js +9 -4
- package/dist/components/Guido.vue.js +6 -6
- package/dist/components/Guido.vue2.js +50 -49
- package/dist/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue.js +38 -0
- package/dist/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue2.js +271 -0
- package/dist/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue.js +18 -0
- package/dist/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue2.js +42 -0
- package/dist/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue.js +20 -0
- package/dist/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue2.js +18 -0
- package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue.js +20 -0
- package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue2.js +60 -0
- package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue.js +19 -0
- package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue2.js +19 -0
- package/dist/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue.js +22 -0
- package/dist/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue2.js +29 -0
- package/dist/composables/useHtmlValidator.js +68 -60
- package/dist/composables/useHttp.js +61 -52
- package/dist/composables/useRecommendation.js +56 -40
- package/dist/composables/useSave.js +22 -22
- package/dist/composables/useStrategyFilters.js +16 -0
- package/dist/config/migrator/recommendationMigrator.js +7 -4
- package/dist/enums/date.js +4 -3
- package/dist/enums/extensions/filteringV2.js +1024 -0
- package/dist/enums/extensions/recommendationBlock.js +45 -24
- package/dist/enums/extensions/strategyDetail.js +149 -0
- package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +12 -11
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +141 -123
- package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +297 -0
- package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +16 -2
- package/dist/extensions/Blocks/Recommendation/recommendation.css.js +137 -0
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +549 -165
- package/dist/extensions/Blocks/Recommendation/utils/strategyHumanizer.js +97 -0
- package/dist/extensions/Blocks/Recommendation/utils/strategyNavigation.js +8 -0
- package/dist/extensions/Blocks/Recommendation/utils/strategySummary.js +95 -0
- package/dist/extensions/Blocks/Recommendation/utils/strategyUrl.js +43 -0
- package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +24 -10
- package/dist/extensions/Blocks/common-control.js +37 -35
- package/dist/guido.css +1 -1
- package/dist/services/recommendationApi.js +127 -33
- package/dist/services/stripoApi.js +18 -18
- package/dist/src/@types/config/schemas.d.ts +10 -0
- package/dist/src/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue.d.ts +2 -0
- package/dist/src/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue.d.ts +43 -0
- package/dist/src/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue.d.ts +29 -0
- package/dist/src/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue.d.ts +40 -0
- package/dist/src/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue.d.ts +38 -0
- package/dist/src/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue.d.ts +51 -0
- package/dist/src/composables/useConfig.d.ts +2 -0
- package/dist/src/composables/useHtmlValidator.d.ts +2 -0
- package/dist/src/composables/useRecommendation.d.ts +2 -0
- package/dist/src/composables/useStrategyFilters.d.ts +24 -0
- package/dist/src/enums/extensions/filteringV2.d.ts +72 -0
- package/dist/src/enums/extensions/recommendationBlock.d.ts +33 -0
- package/dist/src/enums/extensions/strategyDetail.d.ts +90 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +10 -4
- package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +118 -0
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +958 -1
- package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +7 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/strategyHumanizer.d.ts +50 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/strategyNavigation.d.ts +10 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/strategySummary.d.ts +34 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/strategyUrl.d.ts +51 -0
- package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +8 -1
- package/dist/src/extensions/Blocks/common-control.d.ts +5 -2
- package/dist/src/mock/api/recommendation-strategies.d.ts +2 -0
- package/dist/src/services/recommendationApi.d.ts +9 -1
- package/dist/src/stores/config.d.ts +18 -0
- package/dist/src/utils/genericUtil.d.ts +9 -0
- package/dist/static/styles/components/base-input.css.js +6 -7
- package/dist/utils/dateUtil.js +23 -10
- package/dist/utils/genericUtil.js +10 -1
- package/dist/utils/templatePreparation.js +70 -57
- package/package.json +1 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enums for the Reusable Recommendation Strategy (RRS) detail drawer.
|
|
3
|
+
*
|
|
4
|
+
* Ported from design-system-organisms
|
|
5
|
+
* `src/organisms/OrgStrategyDetailModal/enums/details-modal.enum.ts` (branch `develop`).
|
|
6
|
+
*
|
|
7
|
+
* IMPORTANT — this is NOT the same operator table as `@@/Enums/extensions/filteringV2`.
|
|
8
|
+
* The detail modal carries its own, deliberately: it uses different operator values
|
|
9
|
+
* (a `-page-context` suffix where FilteringEnumsV2 uses `_dynamic`) and a different
|
|
10
|
+
* label per operator. The two tables humanize the same JSON for different surfaces —
|
|
11
|
+
* filteringV2 backs the four-row panel summary, this one backs the drawer's filter
|
|
12
|
+
* humanizer. Do not merge them or the drawer starts rendering the wrong operator names.
|
|
13
|
+
*
|
|
14
|
+
* One deliberate deviation from the source: the source resolves `translations[...]` at
|
|
15
|
+
* module-evaluation time. Guido loads translations from editor config after module init,
|
|
16
|
+
* so every `text` here stays a translation KEY and is resolved at render through
|
|
17
|
+
* `useTranslations()`. Resolving eagerly would freeze every label to `undefined`.
|
|
18
|
+
*/
|
|
19
|
+
/** Discriminates a duration-based exclusion from a count-based one. */
|
|
20
|
+
export declare const TIME = "TIME";
|
|
21
|
+
export declare const COUNT = "COUNT";
|
|
22
|
+
export declare const OperatorAbbreviations: {
|
|
23
|
+
readonly OPERATOR: {
|
|
24
|
+
readonly IN_LAST: "in-last";
|
|
25
|
+
readonly IS_EMPTY: "is-empty";
|
|
26
|
+
readonly IS_NOT_EMPTY: "is-not-empty";
|
|
27
|
+
readonly IN_BETWEEN: "is-between";
|
|
28
|
+
readonly IS_TRUE: "true";
|
|
29
|
+
readonly IS_FALSE: "false";
|
|
30
|
+
readonly IN: "in";
|
|
31
|
+
readonly NOT_IN: "not-in";
|
|
32
|
+
};
|
|
33
|
+
readonly OPERATOR_EXPRESSION: {
|
|
34
|
+
readonly IS_EMPTY: "?";
|
|
35
|
+
readonly IS_NOT_EMPTY: "!?";
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
/** One operator option; `text` is a translation key, not a label. */
|
|
39
|
+
export interface DetailOperator {
|
|
40
|
+
value: string;
|
|
41
|
+
text: string;
|
|
42
|
+
operator: string;
|
|
43
|
+
}
|
|
44
|
+
export declare const Operators: Record<string, DetailOperator[]>;
|
|
45
|
+
export declare const DataTypes: {
|
|
46
|
+
readonly STRING: "String";
|
|
47
|
+
readonly BOOLEAN: "Boolean";
|
|
48
|
+
readonly DATE: "Date";
|
|
49
|
+
readonly NUMBER: "Number";
|
|
50
|
+
readonly TEXT: "Text";
|
|
51
|
+
readonly URL: "Image";
|
|
52
|
+
readonly NUMBERS: "Numbers";
|
|
53
|
+
readonly DATES: "Dates";
|
|
54
|
+
readonly BOOLEANS: "Booleans";
|
|
55
|
+
readonly STRINGS: "Strings";
|
|
56
|
+
};
|
|
57
|
+
export declare const MultiSelectDataTypes: string[];
|
|
58
|
+
export declare const OperatorNames: {
|
|
59
|
+
readonly IS_EXACTLY: "is-exactly";
|
|
60
|
+
readonly IS_NOT_EXACTLY: "is-not-exactly";
|
|
61
|
+
readonly CONTAINS: "contains";
|
|
62
|
+
readonly NOT_CONTAINS: "does-not-contain";
|
|
63
|
+
readonly IN: "in";
|
|
64
|
+
readonly NOT_IN: "not-in";
|
|
65
|
+
};
|
|
66
|
+
export declare const FilterTypeNames: {
|
|
67
|
+
readonly STANDARD_FILTER: "standardFilter";
|
|
68
|
+
readonly DYNAMIC_FILTER: "dynamicFilter";
|
|
69
|
+
readonly USER_CONTEXT_FILTER: "userContextFilter";
|
|
70
|
+
readonly USER_ATTRIBUTE_FILTER: "userAttributeFilter";
|
|
71
|
+
readonly USER_EVENT_FILTER: "userEventFilter";
|
|
72
|
+
readonly EVENT_BASED_FILTER: "eventBasedFilter";
|
|
73
|
+
};
|
|
74
|
+
export declare const UserEventKeys: {
|
|
75
|
+
readonly CURRENTLY_VIEWED_ITEM: "page";
|
|
76
|
+
readonly LEGACY_CURRENTLY_VIEWED_ITEM: "currentlyViewedItem";
|
|
77
|
+
};
|
|
78
|
+
/** `text` is a translation key, resolved at render. */
|
|
79
|
+
export declare const UserEvents: {
|
|
80
|
+
value: string;
|
|
81
|
+
text: string;
|
|
82
|
+
}[];
|
|
83
|
+
/** Channel value that must render as the email product's own label. */
|
|
84
|
+
export declare const EMAIL_CHANNEL = "email";
|
|
85
|
+
export declare const PageTypeTranslationKeys: Record<string, string>;
|
|
86
|
+
/** Drawer tab identifiers. */
|
|
87
|
+
export declare const DetailTabs: {
|
|
88
|
+
readonly GENERAL: "general";
|
|
89
|
+
readonly OTHER: "other";
|
|
90
|
+
};
|
|
@@ -9,8 +9,9 @@ import { PricePlacementControl, PRICE_PLACEMENT_CONTROL_ID } from './pricePlacem
|
|
|
9
9
|
import { ProductCountControl, PRODUCT_COUNT_CONTROL_ID } from './productCount';
|
|
10
10
|
import { ProductLayoutControl, PRODUCT_LAYOUT_CONTROL_ID } from './productLayout';
|
|
11
11
|
import { ShuffleControl, SHUFFLE_CONTROL_ID } from './shuffle';
|
|
12
|
+
import { StrategyControl, STRATEGY_CONTROL_ID } from './strategy';
|
|
12
13
|
export declare const CONTROL_BLOCK_ID = "ui-elements-recommendation-block";
|
|
13
|
-
export { AlgorithmControl, ALGORITHM_CONTROL_ID, LocaleControl, LOCALE_CONTROL_ID, CurrencyControl, CURRENCY_CONTROL_ID, ProductCountControl, PRODUCT_COUNT_CONTROL_ID, ProductLayoutControl, PRODUCT_LAYOUT_CONTROL_ID, FiltersControl, FILTERS_CONTROL_ID, ShuffleControl, SHUFFLE_CONTROL_ID, LayoutOrientationControl, LAYOUT_ORIENTATION_CONTROL_ID, PricePlacementControl, PRICE_PLACEMENT_CONTROL_ID, };
|
|
14
|
+
export { AlgorithmControl, ALGORITHM_CONTROL_ID, LocaleControl, LOCALE_CONTROL_ID, CurrencyControl, CURRENCY_CONTROL_ID, ProductCountControl, PRODUCT_COUNT_CONTROL_ID, ProductLayoutControl, PRODUCT_LAYOUT_CONTROL_ID, FiltersControl, FILTERS_CONTROL_ID, ShuffleControl, SHUFFLE_CONTROL_ID, LayoutOrientationControl, LAYOUT_ORIENTATION_CONTROL_ID, PricePlacementControl, PRICE_PLACEMENT_CONTROL_ID, StrategyControl, STRATEGY_CONTROL_ID, };
|
|
14
15
|
export * from './utils';
|
|
15
16
|
/**
|
|
16
17
|
* Main recommendation block control that composes all sub-controls
|
|
@@ -21,6 +22,7 @@ export declare class RecommendationBlockControl extends CommonControl {
|
|
|
21
22
|
private storeUnsubscription;
|
|
22
23
|
private syncedBlockIds;
|
|
23
24
|
private algorithmControl;
|
|
25
|
+
private strategyControl;
|
|
24
26
|
private localeControl;
|
|
25
27
|
private currencyControl;
|
|
26
28
|
private productCountControl;
|
|
@@ -107,8 +109,12 @@ export declare class RecommendationBlockControl extends CommonControl {
|
|
|
107
109
|
*/
|
|
108
110
|
private _listenStateUpdates;
|
|
109
111
|
/**
|
|
110
|
-
* Persists the
|
|
111
|
-
*
|
|
112
|
+
* Persists the Pinia-owned parts of the block config to the Stripo node config,
|
|
113
|
+
* so they survive template save/reload cycles.
|
|
114
|
+
*
|
|
115
|
+
* Filters are edited in a drawer and the strategy in an overlaid picker — neither
|
|
116
|
+
* is a Stripo form element, so neither can write to the node itself. Both ride
|
|
117
|
+
* this one update to keep the undo history to a single entry per change.
|
|
112
118
|
*/
|
|
113
|
-
private
|
|
119
|
+
private _persistStoreConfigToNode;
|
|
114
120
|
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { CommonControl } from '../../../common-control';
|
|
2
|
+
export declare const STRATEGY_CONTROL_ID = "recommendation-strategy-control";
|
|
3
|
+
/**
|
|
4
|
+
* Control for selecting a Reusable Recommendation Strategy
|
|
5
|
+
*/
|
|
6
|
+
export declare class StrategyControl extends CommonControl {
|
|
7
|
+
private store;
|
|
8
|
+
/**
|
|
9
|
+
* InOne's dictionary, not Stripo's. Every dotted key here
|
|
10
|
+
* (`discovery-strategy.*`, `gpt-app-builder.*`) lives in the host panel's
|
|
11
|
+
* translations, which `this.api.translate` does not read — that one is only
|
|
12
|
+
* for the plain-English control labels the rest of this panel uses.
|
|
13
|
+
*/
|
|
14
|
+
private trans;
|
|
15
|
+
private events;
|
|
16
|
+
private unsubscribeStore;
|
|
17
|
+
private cardHideTimer;
|
|
18
|
+
/**
|
|
19
|
+
* Resolved once per render.
|
|
20
|
+
*
|
|
21
|
+
* The card stays INSIDE the control's markup. Parking it at the top of the
|
|
22
|
+
* shadow root positions it identically but places it outside the settings
|
|
23
|
+
* panel, and Stripo reads a press there as a press on the canvas: the block
|
|
24
|
+
* is deselected, the panel closes, and View More never gets its click.
|
|
25
|
+
*/
|
|
26
|
+
private card;
|
|
27
|
+
getId(): string;
|
|
28
|
+
getTemplate(): string;
|
|
29
|
+
onRender(): void;
|
|
30
|
+
onDestroy(): void;
|
|
31
|
+
private _root;
|
|
32
|
+
private _setupEventListeners;
|
|
33
|
+
/**
|
|
34
|
+
* The card follows Stripo's own option rows.
|
|
35
|
+
*
|
|
36
|
+
* Stripo does not render the dropdown inside `ue-select`: it hands the list to
|
|
37
|
+
* `UE-FLOATING-COMPONENTS-CONTAINER`, a sibling of the whole settings panel.
|
|
38
|
+
* The shadow root is the only node that is an ancestor of both, so that is
|
|
39
|
+
* where the listener goes.
|
|
40
|
+
*
|
|
41
|
+
* `capture: true` is load-bearing, not caution. Stripo binds its own
|
|
42
|
+
* `mouseover` on the option row to drive `ue-select`'s `hoverItem` output and
|
|
43
|
+
* stops propagation there — measured: a bubble-phase listener on the shadow
|
|
44
|
+
* root sees nothing, the event dies one level above the row. Capture runs
|
|
45
|
+
* root-to-target, before that handler ever gets to speak.
|
|
46
|
+
*
|
|
47
|
+
* `mouseover`/`mouseout` rather than `mouseenter`/`mouseleave` because the
|
|
48
|
+
* latter do not participate in delegation at all, and the row is resolved
|
|
49
|
+
* through `composedPath()` rather than `event.target`.
|
|
50
|
+
*
|
|
51
|
+
* A row is matched to a strategy by its label, which doubles as the scope
|
|
52
|
+
* check — hovering the Locale or Currency dropdown finds no match and is
|
|
53
|
+
* ignored. Two strategies sharing a name would show the first one's card;
|
|
54
|
+
* Smart Recommender does not enforce unique names, and that is the cost.
|
|
55
|
+
*/
|
|
56
|
+
private _setupCardListeners;
|
|
57
|
+
/**
|
|
58
|
+
* Guarded the same way `AlgorithmControl` guards its own select: writing the
|
|
59
|
+
* value back in `_render()` re-fires `onValueChanged`, and without this the
|
|
60
|
+
* control would re-select on every store change.
|
|
61
|
+
*/
|
|
62
|
+
private _onStrategyChange;
|
|
63
|
+
/**
|
|
64
|
+
* Keeps the select's items, its value and the gear's enabled state in step
|
|
65
|
+
* with the store.
|
|
66
|
+
*
|
|
67
|
+
* All three depend on data that arrives after the first render: the strategy
|
|
68
|
+
* listing is fetched asynchronously, and `strategyId` changes when the user
|
|
69
|
+
* picks, duplicates, or switches blocks.
|
|
70
|
+
*/
|
|
71
|
+
private _subscribeToStoreChanges;
|
|
72
|
+
/**
|
|
73
|
+
* Fingerprint of everything the rendered control depends on.
|
|
74
|
+
*
|
|
75
|
+
* Ids rather than a count: a refetch that renames a strategy or swaps one for
|
|
76
|
+
* another of the same length would otherwise leave the select showing stale
|
|
77
|
+
* copy until some unrelated store change happened to repaint.
|
|
78
|
+
*/
|
|
79
|
+
private _stateKey;
|
|
80
|
+
private _render;
|
|
81
|
+
/**
|
|
82
|
+
* A strategy id the listing no longer knows was deleted in Smart Recommender.
|
|
83
|
+
* The id is deliberately kept (the save gate needs to see it) but the select
|
|
84
|
+
* falls back to its placeholder, so without this a broken block would look
|
|
85
|
+
* like one that was simply never configured.
|
|
86
|
+
*/
|
|
87
|
+
private _renderMissingMessage;
|
|
88
|
+
/**
|
|
89
|
+
* The hover card is `position: fixed`, so it can sit beside the narrow panel
|
|
90
|
+
* instead of being clipped by it. Placed once per hover — the list cannot
|
|
91
|
+
* scroll under the pointer without the pointer leaving, so there is nothing
|
|
92
|
+
* to keep in sync.
|
|
93
|
+
*/
|
|
94
|
+
private _showCard;
|
|
95
|
+
/**
|
|
96
|
+
* Resolves one of Stripo's option rows back to the strategy it was built from.
|
|
97
|
+
*
|
|
98
|
+
* Matched against the *rendered option labels*, not raw strategy names. Stripo's
|
|
99
|
+
* row carries no value of its own — its bindings are disabled/selected/tabindex —
|
|
100
|
+
* so the text is all there is, and `getStrategyOptions` disambiguates duplicate
|
|
101
|
+
* names by appending the id. Comparing to `strategy.name` would miss exactly those
|
|
102
|
+
* rows; going through the option list keeps the label the user sees and the label
|
|
103
|
+
* we match on in lockstep.
|
|
104
|
+
*/
|
|
105
|
+
private _strategyForItem;
|
|
106
|
+
/** Grace period for the pointer to cross the gap between the row and the card. */
|
|
107
|
+
private _scheduleHideCard;
|
|
108
|
+
private _cancelHideCard;
|
|
109
|
+
private _hideCard;
|
|
110
|
+
/**
|
|
111
|
+
* Mirrors the design system's `InInfoBox`: coloured top rule, heading +
|
|
112
|
+
* "last updated" details, content, then a divided footer holding the View
|
|
113
|
+
* More text button. The component itself cannot render here, so the markup
|
|
114
|
+
* and the CSS reproduce its structure and tokens rather than approximating
|
|
115
|
+
* them — the values in `recommendation.css` are read from its stylesheet.
|
|
116
|
+
*/
|
|
117
|
+
private _buildCardHtml;
|
|
118
|
+
}
|