@wix/auto-patterns 1.27.0 → 1.29.0
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/cjs/components/AutoPatternsCollectionPage/AutoPatternsCollectionPage.js +19 -58
- package/dist/cjs/components/AutoPatternsCollectionPage/AutoPatternsCollectionPage.js.map +1 -1
- package/dist/cjs/components/AutoPatternsCollectionPageContent/AutoPatternsCollectionPageContent.js +1 -1
- package/dist/cjs/components/AutoPatternsCollectionPageContent/AutoPatternsCollectionPageContent.js.map +1 -1
- package/dist/cjs/components/AutoPatternsCollectionPageFooter/AutoPatternsCollectionPageFooter.js +48 -0
- package/dist/cjs/components/AutoPatternsCollectionPageFooter/AutoPatternsCollectionPageFooter.js.map +1 -0
- package/dist/cjs/components/AutoPatternsEntityPage/RenderLayout/RenderLayoutContent.js +1 -1
- package/dist/cjs/components/AutoPatternsEntityPage/RenderLayout/RenderLayoutContent.js.map +1 -1
- package/dist/cjs/components/AutoPatternsEntityPage/ViewEntityPage/RenderViewLayoutContent.js +1 -1
- package/dist/cjs/components/AutoPatternsEntityPage/ViewEntityPage/RenderViewLayoutContent.js.map +1 -1
- package/dist/cjs/components/AutoPatternsRoute/AutoPatternsRoutes.js +11 -7
- package/dist/cjs/components/AutoPatternsRoute/AutoPatternsRoutes.js.map +1 -1
- package/dist/cjs/components/ModalRenderer.js +1 -1
- package/dist/cjs/components/ModalRenderer.js.map +1 -1
- package/dist/cjs/dataSourceAdapters/cms/cmsAdapter.js +5 -0
- package/dist/cjs/dataSourceAdapters/cms/cmsAdapter.js.map +1 -1
- package/dist/cjs/dataSourceAdapters/cms/fetchCmsData.js +1 -1
- package/dist/cjs/dataSourceAdapters/cms/fetchCmsData.js.map +1 -1
- package/dist/cjs/hooks/useAutoPatternsOptimisticActions.js +13 -6
- package/dist/cjs/hooks/useAutoPatternsOptimisticActions.js.map +1 -1
- package/dist/cjs/hooks/useBaseCollectionParams.js +38 -0
- package/dist/cjs/hooks/useBaseCollectionParams.js.map +1 -0
- package/dist/cjs/hooks/useBaseSDK.js +1 -1
- package/dist/cjs/hooks/useBaseSDK.js.map +1 -1
- package/dist/cjs/hooks/useColumns.js +1 -1
- package/dist/cjs/hooks/useColumns.js.map +1 -1
- package/dist/cjs/hooks/useCommonCollectionFeatures.js +13 -6
- package/dist/cjs/hooks/useCommonCollectionFeatures.js.map +1 -1
- package/dist/cjs/hooks/useEmptyStates.js +1 -1
- package/dist/cjs/hooks/useEmptyStates.js.map +1 -1
- package/dist/cjs/hooks/useEntityPageHeaderTexts.js +2 -2
- package/dist/cjs/hooks/useEntityPageHeaderTexts.js.map +1 -1
- package/dist/cjs/hooks/useFetchData.js +4 -5
- package/dist/cjs/hooks/useFetchData.js.map +1 -1
- package/dist/cjs/hooks/useFilters.js +2 -2
- package/dist/cjs/hooks/useFilters.js.map +1 -1
- package/dist/cjs/hooks/useGridFeatures.js +6 -26
- package/dist/cjs/hooks/useGridFeatures.js.map +1 -1
- package/dist/cjs/hooks/useTableFeatures.js +8 -28
- package/dist/cjs/hooks/useTableFeatures.js.map +1 -1
- package/dist/cjs/hooks/useTableGridSwitchFeatures.js +8 -28
- package/dist/cjs/hooks/useTableGridSwitchFeatures.js.map +1 -1
- package/dist/cjs/providers/{PatternsWizardOverridesContext.js → AutoPatternsOverridesContext.js} +14 -11
- package/dist/cjs/providers/AutoPatternsOverridesContext.js.map +1 -0
- package/dist/cjs/providers/SchemaContext.js +24 -7
- package/dist/cjs/providers/SchemaContext.js.map +1 -1
- package/dist/cjs/providers/index.js +4 -4
- package/dist/cjs/providers/index.js.map +1 -1
- package/dist/cjs/types/BaseSDK.js.map +1 -1
- package/dist/cjs/types/CollectionPageConfig.js.map +1 -1
- package/dist/cjs/types/actions/base.js.map +1 -1
- package/dist/cjs/types/fetchData.js +4 -0
- package/dist/cjs/types/fetchData.js.map +1 -0
- package/dist/cjs/types/index.js +6 -0
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/types.js.map +1 -1
- package/dist/cjs/utils/actions/resolveAction.js +2 -1
- package/dist/cjs/utils/actions/resolveAction.js.map +1 -1
- package/dist/cjs/utils/actions/types.js.map +1 -1
- package/dist/cjs/utils/vibe.js +11 -0
- package/dist/cjs/utils/vibe.js.map +1 -0
- package/dist/docs/action_cell.md +18 -8
- package/dist/docs/app_config_structure.md +37 -1
- package/dist/docs/app_context.md +45 -0
- package/dist/docs/auto-patterns-guide.md +331 -82
- package/dist/docs/bulk_actions.md +10 -5
- package/dist/docs/collection_page.md +1 -1
- package/dist/docs/collection_page_actions.md +16 -9
- package/dist/docs/custom_overrides.md +22 -36
- package/dist/docs/entity_page.md +10 -10
- package/dist/docs/entity_page_actions.md +11 -4
- package/dist/docs/error_handling.md +135 -0
- package/dist/docs/index.md +8 -0
- package/dist/docs/installation.md +3 -3
- package/dist/docs/resolved_action.md +6 -2
- package/dist/docs/schema_config.md +11 -3
- package/dist/docs/wix_fqdn_custom_data_source.md +51 -9
- package/dist/esm/components/AutoPatternsCollectionPage/AutoPatternsCollectionPage.js +2 -25
- package/dist/esm/components/AutoPatternsCollectionPage/AutoPatternsCollectionPage.js.map +1 -1
- package/dist/esm/components/AutoPatternsCollectionPageContent/AutoPatternsCollectionPageContent.js +2 -2
- package/dist/esm/components/AutoPatternsCollectionPageContent/AutoPatternsCollectionPageContent.js.map +1 -1
- package/dist/esm/components/AutoPatternsCollectionPageFooter/AutoPatternsCollectionPageFooter.js +29 -0
- package/dist/esm/components/AutoPatternsCollectionPageFooter/AutoPatternsCollectionPageFooter.js.map +1 -0
- package/dist/esm/components/AutoPatternsEntityPage/RenderLayout/RenderLayoutContent.js +2 -2
- package/dist/esm/components/AutoPatternsEntityPage/RenderLayout/RenderLayoutContent.js.map +1 -1
- package/dist/esm/components/AutoPatternsEntityPage/ViewEntityPage/RenderViewLayoutContent.js +2 -2
- package/dist/esm/components/AutoPatternsEntityPage/ViewEntityPage/RenderViewLayoutContent.js.map +1 -1
- package/dist/esm/components/AutoPatternsRoute/AutoPatternsRoutes.js +5 -1
- package/dist/esm/components/AutoPatternsRoute/AutoPatternsRoutes.js.map +1 -1
- package/dist/esm/components/ModalRenderer.js +2 -2
- package/dist/esm/components/ModalRenderer.js.map +1 -1
- package/dist/esm/dataSourceAdapters/cms/cmsAdapter.js +4 -0
- package/dist/esm/dataSourceAdapters/cms/cmsAdapter.js.map +1 -1
- package/dist/esm/dataSourceAdapters/cms/fetchCmsData.js +1 -1
- package/dist/esm/dataSourceAdapters/cms/fetchCmsData.js.map +1 -1
- package/dist/esm/hooks/useAutoPatternsOptimisticActions.js +14 -9
- package/dist/esm/hooks/useAutoPatternsOptimisticActions.js.map +1 -1
- package/dist/esm/hooks/useBaseCollectionParams.js +37 -0
- package/dist/esm/hooks/useBaseCollectionParams.js.map +1 -0
- package/dist/esm/hooks/useBaseSDK.js +2 -2
- package/dist/esm/hooks/useBaseSDK.js.map +1 -1
- package/dist/esm/hooks/useColumns.js +2 -2
- package/dist/esm/hooks/useColumns.js.map +1 -1
- package/dist/esm/hooks/useCommonCollectionFeatures.js +9 -2
- package/dist/esm/hooks/useCommonCollectionFeatures.js.map +1 -1
- package/dist/esm/hooks/useEmptyStates.js +2 -2
- package/dist/esm/hooks/useEmptyStates.js.map +1 -1
- package/dist/esm/hooks/useEntityPageHeaderTexts.js +2 -2
- package/dist/esm/hooks/useEntityPageHeaderTexts.js.map +1 -1
- package/dist/esm/hooks/useFetchData.js +2 -2
- package/dist/esm/hooks/useFetchData.js.map +1 -1
- package/dist/esm/hooks/useFilters.js +2 -2
- package/dist/esm/hooks/useFilters.js.map +1 -1
- package/dist/esm/hooks/useGridFeatures.js +6 -29
- package/dist/esm/hooks/useGridFeatures.js.map +1 -1
- package/dist/esm/hooks/useTableFeatures.js +8 -31
- package/dist/esm/hooks/useTableFeatures.js.map +1 -1
- package/dist/esm/hooks/useTableGridSwitchFeatures.js +8 -31
- package/dist/esm/hooks/useTableGridSwitchFeatures.js.map +1 -1
- package/dist/esm/providers/AutoPatternsOverridesContext.js +19 -0
- package/dist/esm/providers/AutoPatternsOverridesContext.js.map +1 -0
- package/dist/esm/providers/SchemaContext.js +23 -6
- package/dist/esm/providers/SchemaContext.js.map +1 -1
- package/dist/esm/providers/index.js +1 -1
- package/dist/esm/providers/index.js.map +1 -1
- package/dist/esm/types/BaseSDK.js.map +1 -1
- package/dist/esm/types/CollectionPageConfig.js.map +1 -1
- package/dist/esm/types/actions/base.js.map +1 -1
- package/dist/esm/types/fetchData.js +2 -0
- package/dist/esm/types/fetchData.js.map +1 -0
- package/dist/esm/types/index.js +1 -0
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/types.js.map +1 -1
- package/dist/esm/utils/actions/resolveAction.js +2 -1
- package/dist/esm/utils/actions/resolveAction.js.map +1 -1
- package/dist/esm/utils/actions/types.js.map +1 -1
- package/dist/esm/utils/vibe.js +6 -0
- package/dist/esm/utils/vibe.js.map +1 -0
- package/dist/types/components/AutoPatternsCollectionPage/AutoPatternsCollectionPage.d.ts.map +1 -1
- package/dist/types/components/AutoPatternsCollectionPageFooter/AutoPatternsCollectionPageFooter.d.ts +3 -0
- package/dist/types/components/AutoPatternsCollectionPageFooter/AutoPatternsCollectionPageFooter.d.ts.map +1 -0
- package/dist/types/components/AutoPatternsRoute/AutoPatternsRoutes.d.ts.map +1 -1
- package/dist/types/dataSourceAdapters/cms/cmsAdapter.d.ts +2 -1
- package/dist/types/dataSourceAdapters/cms/cmsAdapter.d.ts.map +1 -1
- package/dist/types/hooks/useAutoPatternsOptimisticActions.d.ts +7 -1
- package/dist/types/hooks/useAutoPatternsOptimisticActions.d.ts.map +1 -1
- package/dist/types/hooks/useBaseCollectionParams.d.ts +27 -0
- package/dist/types/hooks/useBaseCollectionParams.d.ts.map +1 -0
- package/dist/types/hooks/useCommonCollectionFeatures.d.ts +4 -3
- package/dist/types/hooks/useCommonCollectionFeatures.d.ts.map +1 -1
- package/dist/types/hooks/useEntityPageHeaderTexts.d.ts.map +1 -1
- package/dist/types/hooks/useFetchData.d.ts +3 -13
- package/dist/types/hooks/useFetchData.d.ts.map +1 -1
- package/dist/types/hooks/useGridFeatures.d.ts +1 -1
- package/dist/types/hooks/useGridFeatures.d.ts.map +1 -1
- package/dist/types/hooks/useTableFeatures.d.ts +1 -1
- package/dist/types/hooks/useTableFeatures.d.ts.map +1 -1
- package/dist/types/hooks/useTableGridSwitchFeatures.d.ts +1 -1
- package/dist/types/hooks/useTableGridSwitchFeatures.d.ts.map +1 -1
- package/dist/types/providers/{PatternsWizardOverridesContext.d.ts → AutoPatternsOverridesContext.d.ts} +14 -5
- package/dist/types/providers/AutoPatternsOverridesContext.d.ts.map +1 -0
- package/dist/types/providers/SchemaContext.d.ts.map +1 -1
- package/dist/types/providers/index.d.ts +1 -1
- package/dist/types/providers/index.d.ts.map +1 -1
- package/dist/types/types/BaseSDK.d.ts +2 -2
- package/dist/types/types/BaseSDK.d.ts.map +1 -1
- package/dist/types/types/CollectionPageConfig.d.ts +4 -0
- package/dist/types/types/CollectionPageConfig.d.ts.map +1 -1
- package/dist/types/types/actions/base.d.ts +1 -0
- package/dist/types/types/actions/base.d.ts.map +1 -1
- package/dist/types/types/fetchData.d.ts +21 -0
- package/dist/types/types/fetchData.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/types/types.d.ts +12 -7
- package/dist/types/types/types.d.ts.map +1 -1
- package/dist/types/utils/actions/resolveAction.d.ts +1 -0
- package/dist/types/utils/actions/resolveAction.d.ts.map +1 -1
- package/dist/types/utils/actions/types.d.ts +1 -0
- package/dist/types/utils/actions/types.d.ts.map +1 -1
- package/dist/types/utils/vibe.d.ts +2 -0
- package/dist/types/utils/vibe.d.ts.map +1 -0
- package/package.json +10 -10
- package/dist/cjs/dataSourceAdapters/factory.js +0 -14
- package/dist/cjs/dataSourceAdapters/factory.js.map +0 -1
- package/dist/cjs/providers/PatternsWizardOverridesContext.js.map +0 -1
- package/dist/esm/dataSourceAdapters/factory.js +0 -10
- package/dist/esm/dataSourceAdapters/factory.js.map +0 -1
- package/dist/esm/providers/PatternsWizardOverridesContext.js +0 -15
- package/dist/esm/providers/PatternsWizardOverridesContext.js.map +0 -1
- package/dist/types/dataSourceAdapters/factory.d.ts +0 -3
- package/dist/types/dataSourceAdapters/factory.d.ts.map +0 -1
- package/dist/types/providers/PatternsWizardOverridesContext.d.ts.map +0 -1
|
@@ -78,6 +78,34 @@ It is configured using a TypeScript file conforming to the `AppConfig` interface
|
|
|
78
78
|
|
|
79
79
|
# AppConfig Structure
|
|
80
80
|
|
|
81
|
+
## ⚠️ CRITICAL REQUIREMENT: Mandatory `biName` Property
|
|
82
|
+
|
|
83
|
+
**Every action configuration in auto-patterns MUST include a `biName` property.** This is not optional - it's a mandatory requirement for all auto-patterns applications.
|
|
84
|
+
|
|
85
|
+
### Why `biName` is Mandatory:
|
|
86
|
+
- **Analytics Tracking**: Enables tracking of user interactions with actions
|
|
87
|
+
- **Feature Usage**: Helps understand which features are most/least used
|
|
88
|
+
- **User Behavior**: Provides insights into user workflows and preferences
|
|
89
|
+
- **Business Intelligence**: Supports data-driven decision making
|
|
90
|
+
- **A/B Testing**: Enables testing different action configurations
|
|
91
|
+
- **Compliance**: Required for proper application monitoring and reporting
|
|
92
|
+
|
|
93
|
+
### `biName` Requirements:
|
|
94
|
+
- **MUST be included** in every action configuration
|
|
95
|
+
- **Use descriptive, kebab-case naming** (e.g., "toggle-vaccination-action")
|
|
96
|
+
- **Must be unique** across the application
|
|
97
|
+
- **Follow the pattern**: `{action-purpose}-action`
|
|
98
|
+
|
|
99
|
+
### Example:
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"id": "toggleVaccination",
|
|
103
|
+
"type": "custom",
|
|
104
|
+
"label": "Toggle Vaccination",
|
|
105
|
+
"biName": "toggle-vaccination-action" // MANDATORY
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
81
109
|
## Configuration Rules
|
|
82
110
|
|
|
83
111
|
- **Configuration must come only from a TypeScript file** - never inline or from other sources
|
|
@@ -102,6 +130,8 @@ It is configured using a TypeScript file conforming to the `AppConfig` interface
|
|
|
102
130
|
- **Missing action type properties**: Not including `create`, `update`, `delete`, or `bulkDelete` properties when required by the action type
|
|
103
131
|
- **Including wrong action properties**: Adding properties from different action types in the same action configuration
|
|
104
132
|
- **Action type mismatches**: Using action cell types in collection actions, or bulk action types in regular actions
|
|
133
|
+
- **Missing `biName` property**: Every action configuration MUST include a `biName` property for analytics tracking
|
|
134
|
+
- **Generic `biName` values**: Using generic names like "action" or "button" instead of descriptive, kebab-case names
|
|
105
135
|
|
|
106
136
|
```ts
|
|
107
137
|
export interface AppConfig {
|
|
@@ -128,6 +158,7 @@ export interface AppConfig {
|
|
|
128
158
|
id: string; // Unique identifier for the action
|
|
129
159
|
type: 'create' | 'custom'; // Action type
|
|
130
160
|
label?: string; // Text displayed for the action
|
|
161
|
+
biName: string; // MANDATORY: Business intelligence name for analytics tracking
|
|
131
162
|
collection: {
|
|
132
163
|
collectionId: string; // ID of the Wix Data collection
|
|
133
164
|
entityTypeSource: 'cms' | 'custom'; // Data source type.
|
|
@@ -167,6 +198,7 @@ export interface AppConfig {
|
|
|
167
198
|
reflectQueryInUrl?: boolean; // Reflects query state (search, filters, sorting) in the browser URL. Default: false
|
|
168
199
|
selectAllScope?: 'page' | 'all'; // Controls "Select All" scope. 'all' selects entire collection, 'page' selects only visible items. Default: 'all'
|
|
169
200
|
selectionUpdateMode?: 'preserve' | 'clear'; // Controls selection behavior when data changes. 'preserve' maintains selections, 'clear' clears them. Default: 'clear'
|
|
201
|
+
paginationMode?: 'cursor' | 'offset'; // Controls pagination strategy and expected find() return shape. 'cursor' => { items, cursor, total? }, 'offset' (default) => { items, hasNext, total? }
|
|
170
202
|
};
|
|
171
203
|
filters?: {
|
|
172
204
|
panelTitle?: string; // Title of the filters panel
|
|
@@ -221,6 +253,7 @@ export interface AppConfig {
|
|
|
221
253
|
type: 'update' | 'delete' | 'custom'; // Action type
|
|
222
254
|
label?: string; // Text displayed for the action
|
|
223
255
|
skin?: string; // Visual appearance of the action button (see Action Button Skin Values section)
|
|
256
|
+
biName: string; // MANDATORY: Business intelligence name for analytics tracking
|
|
224
257
|
disabled?: boolean; // Whether the action is disabled
|
|
225
258
|
tooltip?: string; // Tooltip text shown on hover
|
|
226
259
|
update?: { // Required when type is 'update'
|
|
@@ -273,6 +306,7 @@ export interface AppConfig {
|
|
|
273
306
|
id: string; // Unique identifier for the bulk action
|
|
274
307
|
type: 'bulkDelete' | 'custom'; // Bulk action type
|
|
275
308
|
label?: string; // Text displayed for the action
|
|
309
|
+
biName: string; // MANDATORY: Business intelligence name for analytics tracking
|
|
276
310
|
bulkDelete?: { // Required when type is 'bulkDelete'
|
|
277
311
|
mode: 'modal'; // Currently only 'modal' is supported
|
|
278
312
|
modal: {
|
|
@@ -378,7 +412,7 @@ export interface AppConfig {
|
|
|
378
412
|
} |
|
|
379
413
|
{
|
|
380
414
|
type: 'custom'; // Component type for custom slot components
|
|
381
|
-
id: string; // Unique identifier that maps to a custom React component provided through
|
|
415
|
+
id: string; // Unique identifier that maps to a custom React component provided through AutoPatternsOverridesProvider slots
|
|
382
416
|
}
|
|
383
417
|
]; // End of components array
|
|
384
418
|
};
|
|
@@ -410,6 +444,7 @@ export interface AppConfig {
|
|
|
410
444
|
id: string;
|
|
411
445
|
type: 'create' | 'custom';
|
|
412
446
|
label?: string;
|
|
447
|
+
biName: string; // MANDATORY: Business intelligence name for analytics tracking
|
|
413
448
|
create?: { // Required when type is 'create'
|
|
414
449
|
mode: 'page';
|
|
415
450
|
page: {
|
|
@@ -432,6 +467,7 @@ export interface AppConfig {
|
|
|
432
467
|
id: string;
|
|
433
468
|
type: 'custom';
|
|
434
469
|
label?: string;
|
|
470
|
+
biName: string; // MANDATORY: Business intelligence name for analytics tracking
|
|
435
471
|
}[];
|
|
436
472
|
};
|
|
437
473
|
parentPageId?: string; // ID of the parent collection page
|
|
@@ -708,7 +744,7 @@ The `layout` array contains the rendering components for the collection. Each la
|
|
|
708
744
|
1. **Table Layout Item** (`type: 'Table'`):
|
|
709
745
|
* `table` field contains table-specific configuration
|
|
710
746
|
* Used for displaying collection in a **table view**
|
|
711
|
-
* Includes columns,
|
|
747
|
+
* Includes columns, bulkActionToolbar, etc.
|
|
712
748
|
|
|
713
749
|
2. **Grid Layout Item** (`type: 'Grid'`):
|
|
714
750
|
* `grid` field contains grid-specific configuration
|
|
@@ -773,7 +809,7 @@ In addition to these common properties, each action item must specify a `type` w
|
|
|
773
809
|
### 2. `type: "custom"`
|
|
774
810
|
* **Purpose**: Executes custom JavaScript logic defined in your application's overrides.
|
|
775
811
|
* **Details**:
|
|
776
|
-
* The `custom` object in the configuration is typically empty. The functionality is determined by a custom action resolver function that you implement and register in the `actions` section of your `
|
|
812
|
+
* The `custom` object in the configuration is typically empty. The functionality is determined by a custom action resolver function that you implement and register in the `actions` section of your `AutoPatternsOverridesProvider`. The `id` of this action item must exactly match the name (key) of the registered custom action resolver. The resolver will receive parameters including `collectionId`.
|
|
777
813
|
|
|
778
814
|
### 3. `type: "divider"`
|
|
779
815
|
* **Purpose**: Creates a visual separator between action groups in menus and lists.
|
|
@@ -862,6 +898,7 @@ Custom collection page actions execute JavaScript code that you define for colle
|
|
|
862
898
|
"id": "exportCollection", // MUST match the function name exactly
|
|
863
899
|
"type": "custom", // REQUIRED: Must be exactly "custom"
|
|
864
900
|
"label": "Export Collection", // Optional: Displayed text
|
|
901
|
+
"biName": "export-collection-action", // MANDATORY: Analytics tracking identifier
|
|
865
902
|
"collection": {
|
|
866
903
|
"collectionId": "WixPets",
|
|
867
904
|
"entityTypeSource": "cms"
|
|
@@ -869,7 +906,7 @@ Custom collection page actions execute JavaScript code that you define for colle
|
|
|
869
906
|
}
|
|
870
907
|
```
|
|
871
908
|
|
|
872
|
-
5. Register your action in the `
|
|
909
|
+
5. Register your action in the `AutoPatternsOverridesProvider`:
|
|
873
910
|
```typescript
|
|
874
911
|
import { useActions } from '../components/actions';
|
|
875
912
|
|
|
@@ -877,9 +914,9 @@ Custom collection page actions execute JavaScript code that you define for colle
|
|
|
877
914
|
const actions = useActions();
|
|
878
915
|
|
|
879
916
|
return (
|
|
880
|
-
<
|
|
917
|
+
<AutoPatternsOverridesProvider value={{ actions }}>
|
|
881
918
|
<AutoPatternsApp configuration={config} />
|
|
882
|
-
</
|
|
919
|
+
</AutoPatternsOverridesProvider>
|
|
883
920
|
);
|
|
884
921
|
}
|
|
885
922
|
```
|
|
@@ -951,6 +988,7 @@ export const handleRowClick: CustomActionCollectionPageActionOnRowClickResolver
|
|
|
951
988
|
|
|
952
989
|
// Your custom logic...
|
|
953
990
|
},
|
|
991
|
+
biName: 'view-details-action' // MANDATORY: For analytics tracking
|
|
954
992
|
};
|
|
955
993
|
};
|
|
956
994
|
```
|
|
@@ -986,6 +1024,7 @@ export const openSidePanel: CustomActionCollectionPageActionOnRowClickResolver =
|
|
|
986
1024
|
// Or use a modal service/context that you've set up
|
|
987
1025
|
// modalService.openSidePanel(item);
|
|
988
1026
|
},
|
|
1027
|
+
biName: 'open-side-panel-action' // MANDATORY: For analytics tracking
|
|
989
1028
|
};
|
|
990
1029
|
};
|
|
991
1030
|
```
|
|
@@ -1015,7 +1054,7 @@ export const useActions = () => {
|
|
|
1015
1054
|
}
|
|
1016
1055
|
```
|
|
1017
1056
|
|
|
1018
|
-
**Step 4: Register in `
|
|
1057
|
+
**Step 4: Register in `AutoPatternsOverridesProvider`**:
|
|
1019
1058
|
```typescript
|
|
1020
1059
|
import { useActions } from '../components/actions';
|
|
1021
1060
|
|
|
@@ -1023,9 +1062,9 @@ export default function YourPage() {
|
|
|
1023
1062
|
const actions = useActions();
|
|
1024
1063
|
|
|
1025
1064
|
return (
|
|
1026
|
-
<
|
|
1065
|
+
<AutoPatternsOverridesProvider value={{ actions }}>
|
|
1027
1066
|
<AutoPatternsApp configuration={config} />
|
|
1028
|
-
</
|
|
1067
|
+
</AutoPatternsOverridesProvider>
|
|
1029
1068
|
);
|
|
1030
1069
|
}
|
|
1031
1070
|
```
|
|
@@ -1062,6 +1101,7 @@ export const quickToggle: CustomActionCollectionPageActionOnRowClickResolver = (
|
|
|
1062
1101
|
})
|
|
1063
1102
|
});
|
|
1064
1103
|
},
|
|
1104
|
+
biName: 'quick-toggle-action' // MANDATORY: For analytics tracking
|
|
1065
1105
|
};
|
|
1066
1106
|
};
|
|
1067
1107
|
```
|
|
@@ -1085,7 +1125,7 @@ export const quickToggle: CustomActionCollectionPageActionOnRowClickResolver = (
|
|
|
1085
1125
|
- The implementation must use the `CustomActionCollectionPageActionOnRowClickResolver` type
|
|
1086
1126
|
- **Required Return Object**: Must return a `ResolvedAction` object - see [ResolvedAction Reference](./resolved_action.md)
|
|
1087
1127
|
- Access the clicked item's data through `actionParams.item`
|
|
1088
|
-
- The implementation must be exported as a named export and registered in your `
|
|
1128
|
+
- The implementation must be exported as a named export and registered in your `AutoPatternsOverridesProvider`
|
|
1089
1129
|
- When `onRowClick` is configured, the default navigation to entity page is completely disabled
|
|
1090
1130
|
- **Complete Setup Required**: You need to create the action file, export it in the index, and register it in the provider - missing any step will cause errors
|
|
1091
1131
|
|
|
@@ -1103,10 +1143,13 @@ export const quickToggle: CustomActionCollectionPageActionOnRowClickResolver = (
|
|
|
1103
1143
|
✓ Divider actions use `{ "type": "divider" }` format and require no additional properties.
|
|
1104
1144
|
✓ If `onRowClick` is configured in table layout, it must have a valid `id` and `type: "custom"`.
|
|
1105
1145
|
✓ **CRITICAL**: Custom row click actions must have corresponding implementations registered in the `actions` override - configuration without implementation will cause errors.
|
|
1106
|
-
✓ Custom row click action implementations must return
|
|
1146
|
+
✓ Custom row click action implementations must return a `ResolvedAction` object with `label`, `icon`, `onClick`, and `biName` properties - all are required. See [ResolvedAction Reference](./resolved_action.md) for complete field documentation.
|
|
1107
1147
|
✓ Custom row click action implementations must be exported as named exports and included in the actions index file.
|
|
1108
1148
|
✓ `onRowClick` is optional - when not configured, rows navigate to entity page by default.
|
|
1109
1149
|
✓ **IMPORTANT**: Configuring `onRowClick` completely disables default navigation - you must handle all row click logic in your custom implementation.
|
|
1150
|
+
✓ **MANDATORY**: Every action configuration MUST include a `biName` property for analytics tracking.
|
|
1151
|
+
✓ **MANDATORY**: `biName` must use descriptive, kebab-case naming (e.g., "export-collection-action").
|
|
1152
|
+
✓ **MANDATORY**: `biName` must be unique across the application and follow the pattern `{action-purpose}-action`.
|
|
1110
1153
|
|
|
1111
1154
|
---
|
|
1112
1155
|
|
|
@@ -1235,19 +1278,25 @@ export interface SchemaConfig {
|
|
|
1235
1278
|
update: (updatedEntity: any) => Promise<any>;
|
|
1236
1279
|
delete: (entityId: string) => Promise<any>;
|
|
1237
1280
|
bulkDelete: (entityIds: string[]) => Promise<any>;
|
|
1281
|
+
// The return shape depends on pagination mode (see AppConfig.collection.paginationMode)
|
|
1282
|
+
// - Cursor mode: { items, cursor, total? }
|
|
1283
|
+
// - Offset mode (default): { items, hasNext, total? }
|
|
1238
1284
|
find: (
|
|
1239
1285
|
query: Query,
|
|
1240
1286
|
options?: {
|
|
1241
1287
|
searchableFieldIds?: string[];
|
|
1242
1288
|
filterFieldMapping?: Record<string, { fieldId: string }>;
|
|
1243
1289
|
},
|
|
1244
|
-
) => Promise<
|
|
1290
|
+
) => Promise<
|
|
1291
|
+
| { items: any[]; cursor?: string | null; total?: number | null }
|
|
1292
|
+
| { items: any[]; hasNext?: boolean; total?: number | null }
|
|
1293
|
+
>;
|
|
1245
1294
|
};
|
|
1246
1295
|
}
|
|
1247
1296
|
|
|
1248
1297
|
export interface Query {
|
|
1249
1298
|
limit: number; // Maximum number of items to return per request (controls page size)
|
|
1250
|
-
offset
|
|
1299
|
+
offset?: number; // Number of items to skip from the beginning (for pagination)
|
|
1251
1300
|
page: number; // Current page number (1-based, works with limit for pagination)
|
|
1252
1301
|
search?: string; // Text search query applied to searchable fields
|
|
1253
1302
|
cursor?: string | null; // Cursor-based pagination token (alternative to offset-based pagination)
|
|
@@ -1346,7 +1395,9 @@ export type Field = ReferenceField | NonReferenceField;
|
|
|
1346
1395
|
- `query`: Query object with pagination, filtering, sorting, and search criteria (see Query Interface section)
|
|
1347
1396
|
- `options.searchableFieldIds`: Array of field IDs that support text search
|
|
1348
1397
|
- `options.filterFieldMapping`: Maps filter IDs to actual field IDs for complex filtering
|
|
1349
|
-
- Returns
|
|
1398
|
+
- Returns (depends on pagination mode):
|
|
1399
|
+
- Cursor mode: `{ items: any[]; cursor?: string | null; total?: number | null }`
|
|
1400
|
+
- Offset mode (default): `{ items: any[]; hasNext?: boolean; total?: number | null }`
|
|
1350
1401
|
|
|
1351
1402
|
### Field Type Information
|
|
1352
1403
|
|
|
@@ -1540,6 +1591,7 @@ Custom actions execute JavaScript code that you define. These actions receive pa
|
|
|
1540
1591
|
})
|
|
1541
1592
|
});
|
|
1542
1593
|
},
|
|
1594
|
+
biName: 'download-pet-details-action' // MANDATORY: For analytics tracking
|
|
1543
1595
|
};
|
|
1544
1596
|
};
|
|
1545
1597
|
```
|
|
@@ -1564,10 +1616,11 @@ Custom actions execute JavaScript code that you define. These actions receive pa
|
|
|
1564
1616
|
"id": "downloadPetDetails", // MUST match the function name exactly
|
|
1565
1617
|
"type": "custom", // REQUIRED: Must be exactly "custom"
|
|
1566
1618
|
"label": "Download Details", // Optional: Displayed text
|
|
1619
|
+
"biName": "download-pet-details-action" // MANDATORY: Analytics tracking identifier
|
|
1567
1620
|
}
|
|
1568
1621
|
```
|
|
1569
1622
|
|
|
1570
|
-
5. Register your action in the `
|
|
1623
|
+
5. Register your action in the `AutoPatternsOverridesProvider`:
|
|
1571
1624
|
```typescript
|
|
1572
1625
|
import { useActions } from '../components/actions';
|
|
1573
1626
|
|
|
@@ -1575,9 +1628,9 @@ Custom actions execute JavaScript code that you define. These actions receive pa
|
|
|
1575
1628
|
const actions = useActions();
|
|
1576
1629
|
|
|
1577
1630
|
return (
|
|
1578
|
-
<
|
|
1631
|
+
<AutoPatternsOverridesProvider value={{ actions }}>
|
|
1579
1632
|
<AutoPatternsApp configuration={config} />
|
|
1580
|
-
</
|
|
1633
|
+
</AutoPatternsOverridesProvider>
|
|
1581
1634
|
);
|
|
1582
1635
|
}
|
|
1583
1636
|
```
|
|
@@ -1592,13 +1645,21 @@ Custom actions execute JavaScript code that you define. These actions receive pa
|
|
|
1592
1645
|
|
|
1593
1646
|
1. `id` must:
|
|
1594
1647
|
- Match exactly the function name of the custom action implementation
|
|
1595
|
-
- Be registered in the `actions` property of your `
|
|
1648
|
+
- Be registered in the `actions` property of your `AutoPatternsOverridesProvider`
|
|
1596
1649
|
- Follow JavaScript identifier naming rules (camelCase recommended)
|
|
1597
1650
|
|
|
1598
|
-
2.
|
|
1599
|
-
-
|
|
1651
|
+
2. `biName` must:
|
|
1652
|
+
- Be included in every action configuration (MANDATORY)
|
|
1653
|
+
- Use descriptive, kebab-case naming (e.g., "download-pet-details-action")
|
|
1654
|
+
- Be unique across the application
|
|
1655
|
+
- Follow the pattern: `{action-purpose}-action`
|
|
1656
|
+
- Enable analytics tracking for user interactions
|
|
1657
|
+
|
|
1658
|
+
2. The implementation must return a `ResolvedAction` object with:
|
|
1659
|
+
- `label`: Text displayed for the action
|
|
1600
1660
|
- `icon`: An Icon component from "@wix/wix-ui-icons-common"
|
|
1601
1661
|
- `onClick`: Handler function for the action
|
|
1662
|
+
- `biName`: Business intelligence name for analytics tracking. Must match the `biName` in your action configuration (required)
|
|
1602
1663
|
- `hidden` (optional): Boolean to hide the action when true
|
|
1603
1664
|
|
|
1604
1665
|
3. The implementation must:
|
|
@@ -1634,13 +1695,13 @@ Follow this decision process when implementing ActionCell:
|
|
|
1634
1695
|
- Complex, full-entity edits → Use `mode: "page"` to navigate to entity page
|
|
1635
1696
|
|
|
1636
1697
|
6. **Custom Implementation**:
|
|
1637
|
-
- For `custom` actions, you must provide implementations in your code and register them with `
|
|
1698
|
+
- For `custom` actions, you must provide implementations in your code and register them with `AutoPatternsOverridesProvider`
|
|
1638
1699
|
|
|
1639
1700
|
### ActionCell Validation Checklist
|
|
1640
1701
|
|
|
1641
1702
|
AI agents should verify these requirements before generating ActionCell configurations:
|
|
1642
1703
|
|
|
1643
|
-
✓ ActionCell is placed
|
|
1704
|
+
✓ ActionCell is placed at the collection component level (`collectionPage.components[*].actionCell`) as a sibling to `collection`, `layout`, etc. — NOT inside `table` or `grid`
|
|
1644
1705
|
✓ Each action has a unique `id` and correct `type` value
|
|
1645
1706
|
✓ Each action type only includes its required field(s)
|
|
1646
1707
|
✓ Update page action refers to a valid entity page ID
|
|
@@ -1779,6 +1840,7 @@ Custom bulk actions execute JavaScript code that you define for bulk operations.
|
|
|
1779
1840
|
})
|
|
1780
1841
|
});
|
|
1781
1842
|
},
|
|
1843
|
+
biName: 'bulk-export-pets-action' // MANDATORY: For analytics tracking
|
|
1782
1844
|
};
|
|
1783
1845
|
};
|
|
1784
1846
|
```
|
|
@@ -1801,10 +1863,11 @@ Custom bulk actions execute JavaScript code that you define for bulk operations.
|
|
|
1801
1863
|
"id": "bulkExportPets", // MUST match the function name exactly
|
|
1802
1864
|
"type": "custom", // REQUIRED: Must be exactly "custom"
|
|
1803
1865
|
"label": "Export Selected", // Optional: Displayed text
|
|
1866
|
+
"biName": "bulk-export-pets-action" // MANDATORY: Analytics tracking identifier
|
|
1804
1867
|
}
|
|
1805
1868
|
```
|
|
1806
1869
|
|
|
1807
|
-
5. Register your action in the `
|
|
1870
|
+
5. Register your action in the `AutoPatternsOverridesProvider`:
|
|
1808
1871
|
```typescript
|
|
1809
1872
|
import { useActions } from '../components/actions';
|
|
1810
1873
|
|
|
@@ -1812,9 +1875,9 @@ Custom bulk actions execute JavaScript code that you define for bulk operations.
|
|
|
1812
1875
|
const actions = useActions();
|
|
1813
1876
|
|
|
1814
1877
|
return (
|
|
1815
|
-
<
|
|
1878
|
+
<AutoPatternsOverridesProvider value={{ actions }}>
|
|
1816
1879
|
<AutoPatternsApp configuration={config} />
|
|
1817
|
-
</
|
|
1880
|
+
</AutoPatternsOverridesProvider>
|
|
1818
1881
|
);
|
|
1819
1882
|
}
|
|
1820
1883
|
```
|
|
@@ -1831,7 +1894,7 @@ Custom bulk actions execute JavaScript code that you define for bulk operations.
|
|
|
1831
1894
|
|
|
1832
1895
|
1. `id` must:
|
|
1833
1896
|
- Match exactly the function name of the custom bulk action implementation
|
|
1834
|
-
- Be registered in the `actions` property of your `
|
|
1897
|
+
- Be registered in the `actions` property of your `AutoPatternsOverridesProvider`
|
|
1835
1898
|
- Follow JavaScript identifier naming rules (camelCase recommended)
|
|
1836
1899
|
|
|
1837
1900
|
2. The implementation must return a `ResolvedAction`:
|
|
@@ -1921,7 +1984,7 @@ Follow this decision process when implementing Bulk Action Toolbar:
|
|
|
1921
1984
|
- Less common bulk operations → Place in `secondaryActions` array
|
|
1922
1985
|
|
|
1923
1986
|
3. **Custom Implementation**:
|
|
1924
|
-
- For `custom` bulk actions, you must provide implementations in your code and register them with `
|
|
1987
|
+
- For `custom` bulk actions, you must provide implementations in your code and register them with `AutoPatternsOverridesProvider`
|
|
1925
1988
|
|
|
1926
1989
|
### Bulk Action Toolbar Validation Checklist
|
|
1927
1990
|
|
|
@@ -1936,6 +1999,9 @@ AI agents should verify these requirements before generating Bulk Action Toolbar
|
|
|
1936
1999
|
✓ Primary actions use `action`/`menu` structure with proper `action` or `menu` properties
|
|
1937
2000
|
✓ Secondary actions are an array that can include dividers
|
|
1938
2001
|
✓ Menu items within primary actions is array that can include dividers
|
|
2002
|
+
✓ **MANDATORY**: Every action configuration MUST include a `biName` property for analytics tracking
|
|
2003
|
+
✓ **MANDATORY**: `biName` must use descriptive, kebab-case naming (e.g., "bulk-export-pets-action")
|
|
2004
|
+
✓ **MANDATORY**: `biName` must be unique across the application and follow the pattern `bulk-{action}-action`
|
|
1939
2005
|
|
|
1940
2006
|
---
|
|
1941
2007
|
|
|
@@ -1963,7 +2029,7 @@ When a user asks to "add badges to the entity page", understand that they want:
|
|
|
1963
2029
|
1. **Custom component overrides** - NOT direct configuration in JSON
|
|
1964
2030
|
2. **Function that returns badge objects** - NOT JSX components
|
|
1965
2031
|
3. **Badge properties** like `text`, `skin`, `prefixIcon`, etc.
|
|
1966
|
-
4. **Registration in
|
|
2032
|
+
4. **Registration in AutoPatternsOverridesProvider** under `entityPageHeaderBadges`
|
|
1967
2033
|
|
|
1968
2034
|
**Example Request**: "Add 2 badges with random skins and text 'wow'"
|
|
1969
2035
|
**Correct Implementation**: Create a function that returns `[{text: 'wow', skin: 'success'}, {text: 'wow', skin: 'premium'}]`
|
|
@@ -2057,7 +2123,7 @@ const Index: FC = () => {
|
|
|
2057
2123
|
const entityPageHeaderSubtitle = useEntityPageHeaderSubtitle();
|
|
2058
2124
|
|
|
2059
2125
|
return (
|
|
2060
|
-
<
|
|
2126
|
+
<AutoPatternsOverridesProvider
|
|
2061
2127
|
value={{
|
|
2062
2128
|
// ... other overrides
|
|
2063
2129
|
entityPageHeaderSubtitle: {
|
|
@@ -2066,7 +2132,7 @@ const Index: FC = () => {
|
|
|
2066
2132
|
}}
|
|
2067
2133
|
>
|
|
2068
2134
|
<WixPetsPage />
|
|
2069
|
-
</
|
|
2135
|
+
</AutoPatternsOverridesProvider>
|
|
2070
2136
|
);
|
|
2071
2137
|
};
|
|
2072
2138
|
```
|
|
@@ -2117,16 +2183,16 @@ export const myFunction = (entity) => { ... }
|
|
|
2117
2183
|
|
|
2118
2184
|
### Integration
|
|
2119
2185
|
|
|
2120
|
-
Register your subtitle override in the `
|
|
2186
|
+
Register your subtitle override in the `AutoPatternsOverridesProvider`:
|
|
2121
2187
|
|
|
2122
2188
|
```typescript
|
|
2123
|
-
<
|
|
2189
|
+
<AutoPatternsOverridesProvider value={{
|
|
2124
2190
|
entityPageHeaderSubtitle: {
|
|
2125
2191
|
mySubtitleOverride,
|
|
2126
2192
|
},
|
|
2127
2193
|
}}>
|
|
2128
2194
|
<AutoPatternsApp configuration={config} />
|
|
2129
|
-
</
|
|
2195
|
+
</AutoPatternsOverridesProvider>
|
|
2130
2196
|
```
|
|
2131
2197
|
|
|
2132
2198
|
## Entity Page Dynamic Badges
|
|
@@ -2159,7 +2225,7 @@ When implementing badges for entity pages, understand these key points:
|
|
|
2159
2225
|
1. **Badges are CUSTOM COMPONENT OVERRIDES** - NOT direct configuration
|
|
2160
2226
|
2. **Badge function returns an ARRAY of badge objects** - NOT JSX components
|
|
2161
2227
|
3. **Each badge object has properties** like `text`, `skin`, `prefixIcon`, etc.
|
|
2162
|
-
4. **Must be registered in
|
|
2228
|
+
4. **Must be registered in AutoPatternsOverridesProvider** under `entityPageHeaderBadges`
|
|
2163
2229
|
|
|
2164
2230
|
### Complete Implementation Guide
|
|
2165
2231
|
|
|
@@ -2214,7 +2280,7 @@ const Index: FC = () => {
|
|
|
2214
2280
|
const entityPageHeaderBadges = useEntityPageHeaderBadges();
|
|
2215
2281
|
|
|
2216
2282
|
return (
|
|
2217
|
-
<
|
|
2283
|
+
<AutoPatternsOverridesProvider
|
|
2218
2284
|
value={{
|
|
2219
2285
|
// ... other overrides
|
|
2220
2286
|
entityPageHeaderSubtitle: {
|
|
@@ -2226,7 +2292,7 @@ const Index: FC = () => {
|
|
|
2226
2292
|
}}
|
|
2227
2293
|
>
|
|
2228
2294
|
<WixPetsPage />
|
|
2229
|
-
</
|
|
2295
|
+
</AutoPatternsOverridesProvider>
|
|
2230
2296
|
);
|
|
2231
2297
|
};
|
|
2232
2298
|
```
|
|
@@ -2268,7 +2334,7 @@ src/dashboard/
|
|
|
2268
2334
|
|
|
2269
2335
|
1. **❌ DON'T return JSX components** - Return badge objects instead
|
|
2270
2336
|
2. **❌ DON'T use direct configuration** - Use custom component overrides
|
|
2271
|
-
3. **❌ DON'T forget to register in
|
|
2337
|
+
3. **❌ DON'T forget to register in AutoPatternsOverridesProvider**
|
|
2272
2338
|
5. **❌ DON'T forget to export from index.ts** - Must export the function
|
|
2273
2339
|
|
|
2274
2340
|
|
|
@@ -2424,18 +2490,21 @@ Entity pages in **edit mode** support not only built-in actions (such as "Save"
|
|
|
2424
2490
|
{
|
|
2425
2491
|
"id": "sendEmail",
|
|
2426
2492
|
"type": "custom",
|
|
2427
|
-
"label": "Send Email"
|
|
2493
|
+
"label": "Send Email",
|
|
2494
|
+
"biName": "send-email-action"
|
|
2428
2495
|
},
|
|
2429
2496
|
{
|
|
2430
2497
|
"id": "exportData",
|
|
2431
2498
|
"type": "custom",
|
|
2432
|
-
"label": "Export Data"
|
|
2499
|
+
"label": "Export Data",
|
|
2500
|
+
"biName": "export-data-action"
|
|
2433
2501
|
},
|
|
2434
2502
|
{ "type": "divider" },
|
|
2435
2503
|
{
|
|
2436
2504
|
"id": "archiveEntity",
|
|
2437
2505
|
"type": "custom",
|
|
2438
|
-
"label": "Archive"
|
|
2506
|
+
"label": "Archive",
|
|
2507
|
+
"biName": "archive-entity-action"
|
|
2439
2508
|
}
|
|
2440
2509
|
]
|
|
2441
2510
|
}
|
|
@@ -2462,6 +2531,7 @@ export const myMoreAction: CustomEntityPageActionResolver = (params) => {
|
|
|
2462
2531
|
onClick: () => {
|
|
2463
2532
|
// Your custom logic here
|
|
2464
2533
|
},
|
|
2534
|
+
biName: 'my-more-action' // MANDATORY: For analytics tracking
|
|
2465
2535
|
};
|
|
2466
2536
|
};
|
|
2467
2537
|
```
|
|
@@ -2487,9 +2557,12 @@ export const myMoreAction: CustomEntityPageActionResolver = (params) => {
|
|
|
2487
2557
|
✓ Each action in `moreActions` has a unique `id` and correct `type` value
|
|
2488
2558
|
✓ Each action type only includes its required field(s)
|
|
2489
2559
|
✓ Custom actions match implementations in overrides
|
|
2490
|
-
✓ The resolver is exported and registered in the `actions` property of your `
|
|
2560
|
+
✓ The resolver is exported and registered in the `actions` property of your `AutoPatternsOverridesProvider`
|
|
2491
2561
|
✓ The function signature matches `CustomEntityPageActionResolver`
|
|
2492
2562
|
✓ The returned object is a `ResolvedAction` (see [ResolvedAction Reference](./resolved_action.md))
|
|
2563
|
+
✓ **MANDATORY**: Every action configuration MUST include a `biName` property for analytics tracking
|
|
2564
|
+
✓ **MANDATORY**: `biName` must use descriptive, kebab-case naming (e.g., "send-email-action")
|
|
2565
|
+
✓ **MANDATORY**: `biName` must be unique across the application and follow the pattern `{action-purpose}-action`
|
|
2493
2566
|
|
|
2494
2567
|
---
|
|
2495
2568
|
|
|
@@ -2659,6 +2732,7 @@ export interface ResolvedAction {
|
|
|
2659
2732
|
hidden?: boolean;
|
|
2660
2733
|
tooltip?: string;
|
|
2661
2734
|
skin?: string;
|
|
2735
|
+
biName?: string;
|
|
2662
2736
|
}
|
|
2663
2737
|
```
|
|
2664
2738
|
|
|
@@ -2669,6 +2743,7 @@ export interface ResolvedAction {
|
|
|
2669
2743
|
- **`label`** (string): Text displayed in the button or menu item.
|
|
2670
2744
|
- **`icon`** (IconElement): An icon component, typically from `@wix/wix-ui-icons-common`. Example: `icon: <Delete />`.
|
|
2671
2745
|
- **`onClick`** (function): Handler function invoked when the user triggers the action. Can be async.
|
|
2746
|
+
- **`biName`** (string): Business intelligence name for analytics tracking. Used to identify the action in analytics and reporting systems. The value should match the `biName` specified in your action configuration.
|
|
2672
2747
|
|
|
2673
2748
|
### Optional Fields
|
|
2674
2749
|
|
|
@@ -2692,7 +2767,8 @@ return {
|
|
|
2692
2767
|
icon: <Add />,
|
|
2693
2768
|
onClick: () => {
|
|
2694
2769
|
// Your action logic here
|
|
2695
|
-
}
|
|
2770
|
+
},
|
|
2771
|
+
biName: 'create-action' // MANDATORY: For analytics tracking
|
|
2696
2772
|
};
|
|
2697
2773
|
```
|
|
2698
2774
|
|
|
@@ -2715,7 +2791,8 @@ return {
|
|
|
2715
2791
|
disabled: total === 0,
|
|
2716
2792
|
tooltip: total === 0 ? 'Select at least one item to export' : undefined,
|
|
2717
2793
|
hidden: !userHasExportPermission,
|
|
2718
|
-
skin: 'premium'
|
|
2794
|
+
skin: 'premium',
|
|
2795
|
+
biName: 'export_selected_items' // MANDATORY: For analytics tracking
|
|
2719
2796
|
};
|
|
2720
2797
|
```
|
|
2721
2798
|
|
|
@@ -2805,7 +2882,7 @@ import React, { type FC } from 'react';
|
|
|
2805
2882
|
import { WixDesignSystemProvider } from '@wix/design-system';
|
|
2806
2883
|
import '@wix/design-system/styles.global.css';
|
|
2807
2884
|
import { WixPatternsProvider } from '@wix/patterns/provider';
|
|
2808
|
-
import {
|
|
2885
|
+
import { AutoPatternsOverridesProvider, AutoPatternsApp } from '@wix/auto-patterns';
|
|
2809
2886
|
import { withDashboard } from '@wix/patterns';
|
|
2810
2887
|
|
|
2811
2888
|
import { config } from './MyCollectionConfig.patterns';
|
|
@@ -2814,9 +2891,9 @@ const Index: FC = () => {
|
|
|
2814
2891
|
return (
|
|
2815
2892
|
<WixDesignSystemProvider features={{ newColorsBranding: true }}>
|
|
2816
2893
|
<WixPatternsProvider>
|
|
2817
|
-
<
|
|
2894
|
+
<AutoPatternsOverridesProvider value={{ }}>
|
|
2818
2895
|
<AutoPatternsApp configuration={config} />
|
|
2819
|
-
</
|
|
2896
|
+
</AutoPatternsOverridesProvider>
|
|
2820
2897
|
</WixPatternsProvider>
|
|
2821
2898
|
</WixDesignSystemProvider>
|
|
2822
2899
|
);
|
|
@@ -2827,14 +2904,63 @@ export default withDashboard(Index);
|
|
|
2827
2904
|
|
|
2828
2905
|
---
|
|
2829
2906
|
|
|
2907
|
+
# AppContext
|
|
2908
|
+
|
|
2909
|
+
The AppContext feature allows you to add components outside the main AutoPatternsApp flow while still accessing the collection data.
|
|
2910
|
+
|
|
2911
|
+
## 1. Adding Components as Children
|
|
2912
|
+
|
|
2913
|
+
Components that need to be rendered outside the main AutoPatternsApp interface (such as modals or side panels) should be passed as children:
|
|
2914
|
+
|
|
2915
|
+
```tsx
|
|
2916
|
+
import { AutoPatternsApp } from '@wix/auto-patterns';
|
|
2917
|
+
import { MyModal } from './MyModal';
|
|
2918
|
+
import { MySidePanel } from './MySidePanel';
|
|
2919
|
+
|
|
2920
|
+
<AutoPatternsApp configuration={config}>
|
|
2921
|
+
<MyModal />
|
|
2922
|
+
<MySidePanel />
|
|
2923
|
+
</AutoPatternsApp>
|
|
2924
|
+
```
|
|
2925
|
+
|
|
2926
|
+
These children components are typically:
|
|
2927
|
+
- **Modals** - for custom actions, forms, or dialogs
|
|
2928
|
+
- **Side Panels** - for additional information or controls
|
|
2929
|
+
- **Overlay Components** - that need to appear on top of the main interface
|
|
2930
|
+
|
|
2931
|
+
## 2. Accessing Collection Data
|
|
2932
|
+
|
|
2933
|
+
Use the `useAppContext` hook to access the current collection items from within your child components:
|
|
2934
|
+
|
|
2935
|
+
```tsx
|
|
2936
|
+
import React from 'react';
|
|
2937
|
+
import { useAppContext } from '@wix/auto-patterns';
|
|
2938
|
+
|
|
2939
|
+
export const MyModal: React.FC = () => {
|
|
2940
|
+
const { items } = useAppContext();
|
|
2941
|
+
|
|
2942
|
+
return (
|
|
2943
|
+
<div>
|
|
2944
|
+
<p>Current collection has {items.length} items</p>
|
|
2945
|
+
{/* Your modal content */}
|
|
2946
|
+
</div>
|
|
2947
|
+
);
|
|
2948
|
+
};
|
|
2949
|
+
```
|
|
2950
|
+
|
|
2951
|
+
The `items` array contains the current filtered and paginated collection data that matches what's displayed in the table/grid.
|
|
2952
|
+
|
|
2953
|
+
---
|
|
2954
|
+
|
|
2830
2955
|
# Custom Overrides
|
|
2831
2956
|
|
|
2832
2957
|
## Override Rules
|
|
2833
2958
|
|
|
2834
2959
|
- **Custom overrides are restricted to the defined areas only** - attempting to override or modify any other aspect of `AutoPatternsApp` is prohibited and can cause unexpected behavior
|
|
2835
|
-
- **Always verify override implementation** - when implementing custom overrides, you MUST ensure they are correctly imported and passed to the `
|
|
2960
|
+
- **Always verify override implementation** - when implementing custom overrides, you MUST ensure they are correctly imported and passed to the `AutoPatternsOverridesProvider`
|
|
2961
|
+
- **CRITICAL: Error handling for custom actions** - Custom actions that make external API calls (using `fetch()`, `axios`, etc.) should NOT use `errorHandler.withErrorHandler`. Only Wix HTTP requests (httpClient from @wix/essentials, Wix APIs like wix/data and wix/stores, and httpClient.fetchWithAuth()) require errorHandler wrapping. See the "Error Handling for HTTP Requests" section for details.
|
|
2836
2962
|
|
|
2837
|
-
The `
|
|
2963
|
+
The `AutoPatternsOverridesProvider` allows you to inject custom code to override default behaviors or add additional functionality. Below are the areas where overrides can be applied:
|
|
2838
2964
|
|
|
2839
2965
|
> **Note:** These are the only areas where overrides are supported. Avoid attempting to override or modify other parts of the system, as this is not supported and may lead to unexpected behavior.
|
|
2840
2966
|
|
|
@@ -2909,9 +3035,9 @@ export default function YourPage() {
|
|
|
2909
3035
|
const entityPageHeaderBadges = useEntityPageHeaderBadges();
|
|
2910
3036
|
|
|
2911
3037
|
return (
|
|
2912
|
-
<
|
|
3038
|
+
<AutoPatternsOverridesProvider value={{ actions, columns, slots, sections, components, modals, customDataSources, entityPageHeaderSubtitle, entityPageHeaderBadges }}>
|
|
2913
3039
|
<AutoPatternsApp configuration={config} />
|
|
2914
|
-
</
|
|
3040
|
+
</AutoPatternsOverridesProvider>
|
|
2915
3041
|
);
|
|
2916
3042
|
}
|
|
2917
3043
|
```
|
|
@@ -2931,7 +3057,7 @@ For example:
|
|
|
2931
3057
|
- Adding a new subtitle override → Update `../components/entityPageHeaderSubtitle/index.tsx` to include the new subtitle in the `useEntityPageHeaderSubtitle` hook
|
|
2932
3058
|
- Adding a new badges override → Update `../components/entityPageHeaderBadges/index.tsx` to include the new badges in the `useEntityPageHeaderBadges` hook
|
|
2933
3059
|
|
|
2934
|
-
Without updating the hook index files, your implementations won't be available to the `
|
|
3060
|
+
Without updating the hook index files, your implementations won't be available to the `AutoPatternsOverridesProvider`.
|
|
2935
3061
|
|
|
2936
3062
|
## Common Override Mistakes to Avoid
|
|
2937
3063
|
|
|
@@ -3176,9 +3302,9 @@ export default function YourPage() {
|
|
|
3176
3302
|
const columns = useColumns();
|
|
3177
3303
|
|
|
3178
3304
|
return (
|
|
3179
|
-
<
|
|
3305
|
+
<AutoPatternsOverridesProvider value={{ columns }}>
|
|
3180
3306
|
<AutoPatternsApp configuration={config} />
|
|
3181
|
-
</
|
|
3307
|
+
</AutoPatternsOverridesProvider>
|
|
3182
3308
|
);
|
|
3183
3309
|
}
|
|
3184
3310
|
```
|
|
@@ -3196,7 +3322,7 @@ your-page/
|
|
|
3196
3322
|
├── fullName.tsx // Calculated column
|
|
3197
3323
|
└── date.tsx // Enhanced formatting with row context
|
|
3198
3324
|
|
|
3199
|
-
|
|
3325
|
+
AutoPatternsOverridesProvider
|
|
3200
3326
|
└── value.columns (from useColumns hook)
|
|
3201
3327
|
├── name
|
|
3202
3328
|
├── petInfo
|
|
@@ -3353,9 +3479,9 @@ export default function YourPage() {
|
|
|
3353
3479
|
const components = useComponents();
|
|
3354
3480
|
|
|
3355
3481
|
return (
|
|
3356
|
-
<
|
|
3482
|
+
<AutoPatternsOverridesProvider value={{ components }}>
|
|
3357
3483
|
<AutoPatternsApp configuration={config} />
|
|
3358
|
-
</
|
|
3484
|
+
</AutoPatternsOverridesProvider>
|
|
3359
3485
|
);
|
|
3360
3486
|
}
|
|
3361
3487
|
```
|
|
@@ -3484,7 +3610,7 @@ your-page/
|
|
|
3484
3610
|
│ ├── combinedNameFields.tsx // Multiple fields override
|
|
3485
3611
|
│ └── infoCard.tsx // Standalone component
|
|
3486
3612
|
|
|
3487
|
-
|
|
3613
|
+
AutoPatternsOverridesProvider
|
|
3488
3614
|
└── value.components (from useComponents hook)
|
|
3489
3615
|
├── customNameField
|
|
3490
3616
|
├── combinedNameFields
|
|
@@ -3554,7 +3680,7 @@ To enable sections, add the `sections` configuration to your table configuration
|
|
|
3554
3680
|
|
|
3555
3681
|
### Custom Data Source Hook Structure
|
|
3556
3682
|
|
|
3557
|
-
Custom data sources are implemented through the `useCustomDataSources` hook in your `
|
|
3683
|
+
Custom data sources are implemented through the `useCustomDataSources` hook in your `AutoPatternsOverridesProvider`:
|
|
3558
3684
|
|
|
3559
3685
|
```tsx
|
|
3560
3686
|
import { useCustomDataSources } from '../components/customDataSources';
|
|
@@ -3563,9 +3689,9 @@ export default function YourPage() {
|
|
|
3563
3689
|
const customDataSources = useCustomDataSources();
|
|
3564
3690
|
|
|
3565
3691
|
return (
|
|
3566
|
-
<
|
|
3692
|
+
<AutoPatternsOverridesProvider value={{ customDataSources }}>
|
|
3567
3693
|
<AutoPatternsApp configuration={config} />
|
|
3568
|
-
</
|
|
3694
|
+
</AutoPatternsOverridesProvider>
|
|
3569
3695
|
);
|
|
3570
3696
|
}
|
|
3571
3697
|
```
|
|
@@ -3639,22 +3765,7 @@ When implementing custom data sources, you need to map your data source field ty
|
|
|
3639
3765
|
- **Reference fields** → `'REFERENCE'`
|
|
3640
3766
|
- **URL fields** → `'URL'`
|
|
3641
3767
|
|
|
3642
|
-
### Error Handling
|
|
3643
|
-
|
|
3644
|
-
Custom data sources should include proper error handling:
|
|
3645
3768
|
|
|
3646
|
-
```tsx
|
|
3647
|
-
actions: {
|
|
3648
|
-
get: async (entityId: string) => {
|
|
3649
|
-
try {
|
|
3650
|
-
const result = await yourDataSourceCall(entityId);
|
|
3651
|
-
return result;
|
|
3652
|
-
} catch (error) {
|
|
3653
|
-
throw new Error(`Failed to fetch entity: ${error.message}`);
|
|
3654
|
-
}
|
|
3655
|
-
}
|
|
3656
|
-
}
|
|
3657
|
-
```
|
|
3658
3769
|
|
|
3659
3770
|
### Validation Requirements
|
|
3660
3771
|
|
|
@@ -3696,9 +3807,9 @@ export default function YourPage() {
|
|
|
3696
3807
|
const customDataSources = useCustomDataSources();
|
|
3697
3808
|
|
|
3698
3809
|
return (
|
|
3699
|
-
<
|
|
3810
|
+
<AutoPatternsOverridesProvider value={{ customDataSources }}>
|
|
3700
3811
|
<AutoPatternsApp configuration={config} />
|
|
3701
|
-
</
|
|
3812
|
+
</AutoPatternsOverridesProvider>
|
|
3702
3813
|
);
|
|
3703
3814
|
}
|
|
3704
3815
|
```
|
|
@@ -3707,7 +3818,7 @@ export default function YourPage() {
|
|
|
3707
3818
|
|
|
3708
3819
|
### Creating Section Renderers
|
|
3709
3820
|
|
|
3710
|
-
Section renderers are functions that determine how to group items and what information to display in section headers. They must be provided through the `
|
|
3821
|
+
Section renderers are functions that determine how to group items and what information to display in section headers. They must be provided through the `AutoPatternsOverridesProvider`.
|
|
3711
3822
|
|
|
3712
3823
|
#### Function Signature
|
|
3713
3824
|
|
|
@@ -3833,9 +3944,9 @@ import * as sections from './components/sections';
|
|
|
3833
3944
|
import * as columns from './components/columns';
|
|
3834
3945
|
import * as actions from './components/actions';
|
|
3835
3946
|
|
|
3836
|
-
<
|
|
3947
|
+
<AutoPatternsOverridesProvider value={{ sections, columns, actions }}>
|
|
3837
3948
|
<AutoPatternsApp configuration={config} />
|
|
3838
|
-
</
|
|
3949
|
+
</AutoPatternsOverridesProvider>
|
|
3839
3950
|
```
|
|
3840
3951
|
|
|
3841
3952
|
### Important Notes
|
|
@@ -3981,9 +4092,9 @@ export default function YourPage() {
|
|
|
3981
4092
|
const slots = useSlots();
|
|
3982
4093
|
|
|
3983
4094
|
return (
|
|
3984
|
-
<
|
|
4095
|
+
<AutoPatternsOverridesProvider value={{ slots }}>
|
|
3985
4096
|
<AutoPatternsApp configuration={config} />
|
|
3986
|
-
</
|
|
4097
|
+
</AutoPatternsOverridesProvider>
|
|
3987
4098
|
);
|
|
3988
4099
|
}
|
|
3989
4100
|
```
|
|
@@ -4001,3 +4112,141 @@ export default function YourPage() {
|
|
|
4001
4112
|
Slots provide a powerful way to enhance collection pages with custom functionality while maintaining the structure and features of the AutoPatterns system.
|
|
4002
4113
|
|
|
4003
4114
|
---
|
|
4115
|
+
|
|
4116
|
+
# Error Handling for HTTP Requests
|
|
4117
|
+
|
|
4118
|
+
**⚠️ CRITICAL**: When implementing custom data sources that make HTTP requests, you **MUST** wrap specific HTTP calls with proper error handling. This ensures consistent error management, prevents unhandled promise rejections, and provides better user experience.
|
|
4119
|
+
|
|
4120
|
+
## What Requires Error Handling
|
|
4121
|
+
|
|
4122
|
+
**ONLY the following HTTP requests** in your custom data source actions must be wrapped with `errorHandler`:
|
|
4123
|
+
|
|
4124
|
+
- **httpClient from @wix/essentials** (e.g., `httpClient.request(getDummyEntity(...))`)
|
|
4125
|
+
- **Wix APIs** (e.g., `wix/data`, `wix/stores`, `items.get()`, `items.insert()`, `collections.getDataCollection()`)
|
|
4126
|
+
- **httpClient.fetchWithAuth()** calls
|
|
4127
|
+
|
|
4128
|
+
**DO NOT use errorHandler with:**
|
|
4129
|
+
|
|
4130
|
+
- **External API calls** using `fetch()`, `axios.get()`, or other HTTP libraries
|
|
4131
|
+
- **Custom HTTP clients** (e.g., any non-Wix HTTP request library)
|
|
4132
|
+
- **Third-party API calls** using non-Wix HTTP methods
|
|
4133
|
+
|
|
4134
|
+
**EXCEPTION**: SDK actions that you get from the AutoPatterns SDK (e.g., `sdk.getOptimisticActions()`, `sdk.getSchema()`) do NOT need error handling as they are already handled internally.
|
|
4135
|
+
|
|
4136
|
+
## Why Error Handling is Required
|
|
4137
|
+
|
|
4138
|
+
Custom data sources often make HTTP requests to Wix APIs and services. Without proper error handling:
|
|
4139
|
+
|
|
4140
|
+
- **Unhandled Promise Rejections**: HTTP failures can crash your application
|
|
4141
|
+
- **Poor User Experience**: Users don't get meaningful error messages
|
|
4142
|
+
- **Inconsistent Error Management**: Different parts of your app handle errors differently
|
|
4143
|
+
- **Debugging Difficulties**: Hard to trace and diagnose API failures
|
|
4144
|
+
|
|
4145
|
+
## Using @wix/essentials errorHandler
|
|
4146
|
+
|
|
4147
|
+
The recommended approach is to use the `errorHandler` from `@wix/essentials` package, which provides consistent error handling patterns across Wix applications.
|
|
4148
|
+
|
|
4149
|
+
### Installation
|
|
4150
|
+
|
|
4151
|
+
First, ensure `@wix/essentials` is installed in your project:
|
|
4152
|
+
|
|
4153
|
+
```bash
|
|
4154
|
+
npm install @wix/essentials
|
|
4155
|
+
```
|
|
4156
|
+
|
|
4157
|
+
### Basic Error Handling Pattern
|
|
4158
|
+
|
|
4159
|
+
Wrap Wix HTTP requests in your custom data source actions with `errorHandler.withErrorHandler`:
|
|
4160
|
+
|
|
4161
|
+
```typescript
|
|
4162
|
+
import { errorHandler } from '@wix/essentials';
|
|
4163
|
+
|
|
4164
|
+
// In your custom data source actions
|
|
4165
|
+
actions: {
|
|
4166
|
+
get: async (entityId: string) => {
|
|
4167
|
+
return errorHandler.withErrorHandler(
|
|
4168
|
+
async () => {
|
|
4169
|
+
const response = await httpClient.request(
|
|
4170
|
+
getDummyEntity({ dummyEntityId: entityId })
|
|
4171
|
+
);
|
|
4172
|
+
return response.data.dummyEntity;
|
|
4173
|
+
},
|
|
4174
|
+
{}
|
|
4175
|
+
);
|
|
4176
|
+
},
|
|
4177
|
+
}
|
|
4178
|
+
```
|
|
4179
|
+
|
|
4180
|
+
### Examples of HTTP Requests That Need Error Handling
|
|
4181
|
+
|
|
4182
|
+
**httpClient from @wix/essentials:**
|
|
4183
|
+
|
|
4184
|
+
```typescript
|
|
4185
|
+
return errorHandler.withErrorHandler(async () => {
|
|
4186
|
+
const response = await httpClient.request(
|
|
4187
|
+
getDummyEntity({ dummyEntityId: entityId })
|
|
4188
|
+
);
|
|
4189
|
+
return response.data.dummyEntity;
|
|
4190
|
+
}, {});
|
|
4191
|
+
```
|
|
4192
|
+
|
|
4193
|
+
**Wix APIs (wix/data, wix/stores):**
|
|
4194
|
+
|
|
4195
|
+
```typescript
|
|
4196
|
+
return errorHandler.withErrorHandler(async () => {
|
|
4197
|
+
return await items.get(collectionId, entityId);
|
|
4198
|
+
}, {});
|
|
4199
|
+
```
|
|
4200
|
+
|
|
4201
|
+
**httpClient.fetchWithAuth() calls:**
|
|
4202
|
+
|
|
4203
|
+
```typescript
|
|
4204
|
+
return errorHandler.withErrorHandler(async () => {
|
|
4205
|
+
const response = await httpClient.fetchWithAuth("/api/data");
|
|
4206
|
+
return await response.json();
|
|
4207
|
+
}, {});
|
|
4208
|
+
```
|
|
4209
|
+
|
|
4210
|
+
### Examples of HTTP Requests That Do NOT Need Error Handling
|
|
4211
|
+
|
|
4212
|
+
**External API calls (using fetch, axios, etc.):**
|
|
4213
|
+
|
|
4214
|
+
```typescript
|
|
4215
|
+
// ✅ CORRECT - No error handling needed for external APIs
|
|
4216
|
+
const response = await fetch("https://api.example.com/data");
|
|
4217
|
+
return await response.json();
|
|
4218
|
+
|
|
4219
|
+
// ✅ CORRECT - No error handling needed for axios
|
|
4220
|
+
const response = await axios.get("https://api.example.com/data");
|
|
4221
|
+
return response.data;
|
|
4222
|
+
```
|
|
4223
|
+
|
|
4224
|
+
**Third-party HTTP libraries:**
|
|
4225
|
+
|
|
4226
|
+
```typescript
|
|
4227
|
+
// ✅ CORRECT - No error handling needed for third-party HTTP clients
|
|
4228
|
+
const response = await someThirdPartyHttpClient.get("/data");
|
|
4229
|
+
return response.data;
|
|
4230
|
+
```
|
|
4231
|
+
|
|
4232
|
+
## Integration with AutoPatterns Error Handling
|
|
4233
|
+
|
|
4234
|
+
The error handling in your custom data source integrates seamlessly with AutoPatterns' built-in error handling:
|
|
4235
|
+
|
|
4236
|
+
1. **User-Friendly Messages**: Errors are displayed to users in a consistent format
|
|
4237
|
+
2. **Retry Mechanisms**: Users can retry failed operations
|
|
4238
|
+
3. **Loading States**: Proper loading states during HTTP requests
|
|
4239
|
+
4. **Error Boundaries**: Errors are caught and handled gracefully
|
|
4240
|
+
|
|
4241
|
+
## Validation Checklist
|
|
4242
|
+
|
|
4243
|
+
Before deploying your custom data source, ensure:
|
|
4244
|
+
|
|
4245
|
+
✅ **httpClient from @wix/essentials** is wrapped with `errorHandler.withErrorHandler`
|
|
4246
|
+
✅ **Wix APIs (wix/data, wix/stores, etc)** are wrapped with `errorHandler.withErrorHandler`
|
|
4247
|
+
✅ **httpClient.fetchWithAuth()** calls are wrapped with `errorHandler.withErrorHandler`
|
|
4248
|
+
✅ **External API calls are NOT wrapped** with errorHandler (e.g., fetch(), axios, third-party HTTP clients)
|
|
4249
|
+
✅ **SDK actions are used directly** without error handling (e.g., `sdk.getOptimisticActions()`, `sdk.getSchema()`)
|
|
4250
|
+
✅ **@wix/essentials** is installed as a dependency
|
|
4251
|
+
|
|
4252
|
+
---
|