@wix/patterns 1.366.0 → 1.369.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.
Files changed (672) hide show
  1. package/dist/cjs/components/CardContainer/CardContainer.st.css.js +2 -2
  2. package/dist/cjs/components/CardContainer/CardContainer.st.css.js.map +1 -1
  3. package/dist/cjs/components/Collapse/Collapse.st.css.js +3 -3
  4. package/dist/cjs/components/Collapse/Collapse.st.css.js.map +1 -1
  5. package/dist/cjs/components/CollectionPageNew/CollectionPage.st.css.js +2 -2
  6. package/dist/cjs/components/CollectionPageNew/CollectionPage.st.css.js.map +1 -1
  7. package/dist/cjs/components/CollectionSectionHeader/CollectionSectionHeader.st.css.js +3 -3
  8. package/dist/cjs/components/CollectionSectionHeader/CollectionSectionHeader.st.css.js.map +1 -1
  9. package/dist/cjs/components/CollectionTable/CollectionTable.st.css.js +2 -2
  10. package/dist/cjs/components/CollectionTable/CollectionTable.st.css.js.map +1 -1
  11. package/dist/cjs/components/CollectionTable/CollectionTableWSRTable.js +6 -3
  12. package/dist/cjs/components/CollectionTable/CollectionTableWSRTable.js.map +1 -1
  13. package/dist/cjs/components/CollectionToolbar/CollectionToolbar.js +25 -30
  14. package/dist/cjs/components/CollectionToolbar/CollectionToolbar.js.map +1 -1
  15. package/dist/cjs/components/CollectionToolbar/CollectionToolbar.st.css.js +5 -5
  16. package/dist/cjs/components/CollectionToolbar/CollectionToolbar.st.css.js.map +1 -1
  17. package/dist/cjs/components/CollectionToolbar/CollectionToolbarActionsGroupProps.js.map +1 -1
  18. package/dist/cjs/components/CollectionToolbar/CollectionToolbarActionsGroupResponsiveLayout.js +66 -17
  19. package/dist/cjs/components/CollectionToolbar/CollectionToolbarActionsGroupResponsiveLayout.js.map +1 -1
  20. package/dist/cjs/components/CollectionToolbar/CollectionToolbarActionsToolbarItemsGroup.js +22 -14
  21. package/dist/cjs/components/CollectionToolbar/CollectionToolbarActionsToolbarItemsGroup.js.map +1 -1
  22. package/dist/cjs/components/CollectionToolbar/SearchOrCustomFilter.st.css.js +4 -4
  23. package/dist/cjs/components/CollectionToolbar/SearchOrCustomFilter.st.css.js.map +1 -1
  24. package/dist/cjs/components/CollectionToolbar/ToolbarOverflowMenu.js +329 -0
  25. package/dist/cjs/components/CollectionToolbar/ToolbarOverflowMenu.js.map +1 -0
  26. package/dist/cjs/components/CollectionToolbar/useToolbarOverflowItems.js +85 -0
  27. package/dist/cjs/components/CollectionToolbar/useToolbarOverflowItems.js.map +1 -0
  28. package/dist/cjs/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.js +2 -2
  29. package/dist/cjs/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.js.map +1 -1
  30. package/dist/cjs/components/CollectionViewsDropdown/ViewsDropdown.st.css.js +2 -2
  31. package/dist/cjs/components/CollectionViewsDropdown/ViewsDropdown.st.css.js.map +1 -1
  32. package/dist/cjs/components/CtaProps.js.map +1 -1
  33. package/dist/cjs/components/DragHandle/DragHandle.st.css.js +2 -2
  34. package/dist/cjs/components/DragHandle/DragHandle.st.css.js.map +1 -1
  35. package/dist/cjs/components/EditableTable/EditableCell.st.css.js +3 -3
  36. package/dist/cjs/components/EditableTable/EditableCell.st.css.js.map +1 -1
  37. package/dist/cjs/components/EditableTable/cellTypes/boolean/Edit.st.css.js +3 -3
  38. package/dist/cjs/components/EditableTable/cellTypes/boolean/Edit.st.css.js.map +1 -1
  39. package/dist/cjs/components/EditableTable/cellTypes/boolean/View.st.css.js +3 -3
  40. package/dist/cjs/components/EditableTable/cellTypes/boolean/View.st.css.js.map +1 -1
  41. package/dist/cjs/components/EditableTable/cellTypes/date/Edit.st.css.js +3 -3
  42. package/dist/cjs/components/EditableTable/cellTypes/date/Edit.st.css.js.map +1 -1
  43. package/dist/cjs/components/EditableTable/cellTypes/date/View.st.css.js +3 -3
  44. package/dist/cjs/components/EditableTable/cellTypes/date/View.st.css.js.map +1 -1
  45. package/dist/cjs/components/EditableTable/cellTypes/email/Edit.js +59 -0
  46. package/dist/cjs/components/EditableTable/cellTypes/email/Edit.js.map +1 -0
  47. package/dist/cjs/components/EditableTable/cellTypes/email/Edit.st.css +4 -0
  48. package/dist/cjs/components/EditableTable/cellTypes/email/Edit.st.css.js +23 -0
  49. package/dist/cjs/components/EditableTable/cellTypes/email/Edit.st.css.js.map +1 -0
  50. package/dist/cjs/components/EditableTable/cellTypes/email/Edit.uni.driver.js +20 -0
  51. package/dist/cjs/components/EditableTable/cellTypes/email/Edit.uni.driver.js.map +1 -0
  52. package/dist/cjs/components/EditableTable/cellTypes/email/View.js +23 -0
  53. package/dist/cjs/components/EditableTable/cellTypes/email/View.js.map +1 -0
  54. package/dist/cjs/components/EditableTable/cellTypes/email/View.st.css +4 -0
  55. package/dist/cjs/components/EditableTable/cellTypes/email/View.st.css.js +23 -0
  56. package/dist/cjs/components/EditableTable/cellTypes/email/View.st.css.js.map +1 -0
  57. package/dist/cjs/components/EditableTable/cellTypes/email/View.uni.driver.js +12 -0
  58. package/dist/cjs/components/EditableTable/cellTypes/email/View.uni.driver.js.map +1 -0
  59. package/dist/cjs/components/EditableTable/cellTypes/email/index.js +31 -0
  60. package/dist/cjs/components/EditableTable/cellTypes/email/index.js.map +1 -0
  61. package/dist/cjs/components/EditableTable/cellTypes/index.js +5 -1
  62. package/dist/cjs/components/EditableTable/cellTypes/index.js.map +1 -1
  63. package/dist/cjs/components/EditableTable/cellTypes/number/Edit.js +4 -9
  64. package/dist/cjs/components/EditableTable/cellTypes/number/Edit.js.map +1 -1
  65. package/dist/cjs/components/EditableTable/cellTypes/number/Edit.st.css.js +3 -3
  66. package/dist/cjs/components/EditableTable/cellTypes/number/Edit.st.css.js.map +1 -1
  67. package/dist/cjs/components/EditableTable/cellTypes/number/View.js +4 -5
  68. package/dist/cjs/components/EditableTable/cellTypes/number/View.js.map +1 -1
  69. package/dist/cjs/components/EditableTable/cellTypes/number/View.st.css.js +3 -3
  70. package/dist/cjs/components/EditableTable/cellTypes/number/View.st.css.js.map +1 -1
  71. package/dist/cjs/components/EditableTable/cellTypes/object/Edit.js +79 -0
  72. package/dist/cjs/components/EditableTable/cellTypes/object/Edit.js.map +1 -0
  73. package/dist/cjs/components/EditableTable/cellTypes/object/Edit.st.css +4 -0
  74. package/dist/cjs/components/EditableTable/cellTypes/object/Edit.st.css.js +23 -0
  75. package/dist/cjs/components/EditableTable/cellTypes/object/Edit.st.css.js.map +1 -0
  76. package/dist/cjs/components/EditableTable/cellTypes/object/Edit.uni.driver.js +20 -0
  77. package/dist/cjs/components/EditableTable/cellTypes/object/Edit.uni.driver.js.map +1 -0
  78. package/dist/cjs/components/EditableTable/cellTypes/object/View.js +30 -0
  79. package/dist/cjs/components/EditableTable/cellTypes/object/View.js.map +1 -0
  80. package/dist/cjs/components/EditableTable/cellTypes/object/View.st.css +4 -0
  81. package/dist/cjs/components/EditableTable/cellTypes/object/View.st.css.js +23 -0
  82. package/dist/cjs/components/EditableTable/cellTypes/object/View.st.css.js.map +1 -0
  83. package/dist/cjs/components/EditableTable/cellTypes/object/View.uni.driver.js +12 -0
  84. package/dist/cjs/components/EditableTable/cellTypes/object/View.uni.driver.js.map +1 -0
  85. package/dist/cjs/components/EditableTable/cellTypes/object/index.js +45 -0
  86. package/dist/cjs/components/EditableTable/cellTypes/object/index.js.map +1 -0
  87. package/dist/cjs/components/EditableTable/cellTypes/select/Edit.st.css.js +3 -3
  88. package/dist/cjs/components/EditableTable/cellTypes/select/Edit.st.css.js.map +1 -1
  89. package/dist/cjs/components/EditableTable/cellTypes/select/View.st.css.js +3 -3
  90. package/dist/cjs/components/EditableTable/cellTypes/select/View.st.css.js.map +1 -1
  91. package/dist/cjs/components/EditableTable/cellTypes/text/Edit.st.css.js +4 -4
  92. package/dist/cjs/components/EditableTable/cellTypes/text/Edit.st.css.js.map +1 -1
  93. package/dist/cjs/components/EditableTable/cellTypes/text/View.st.css.js +3 -3
  94. package/dist/cjs/components/EditableTable/cellTypes/text/View.st.css.js.map +1 -1
  95. package/dist/cjs/components/EditableTable/cellTypes/url/Edit.st.css.js +3 -3
  96. package/dist/cjs/components/EditableTable/cellTypes/url/Edit.st.css.js.map +1 -1
  97. package/dist/cjs/components/EditableTable/cellTypes/url/View.st.css.js +5 -5
  98. package/dist/cjs/components/EditableTable/cellTypes/url/View.st.css.js.map +1 -1
  99. package/dist/cjs/components/EditableTable/useCellFocusAndEditing.js +15 -0
  100. package/dist/cjs/components/EditableTable/useCellFocusAndEditing.js.map +1 -1
  101. package/dist/cjs/components/EditableTable/useKeyboardNavigation.js +10 -0
  102. package/dist/cjs/components/EditableTable/useKeyboardNavigation.js.map +1 -1
  103. package/dist/cjs/components/EntityPage/EntityPagePlain.st.css.js +2 -2
  104. package/dist/cjs/components/EntityPage/EntityPagePlain.st.css.js.map +1 -1
  105. package/dist/cjs/components/Fade/Fade.st.css.js +2 -2
  106. package/dist/cjs/components/Fade/Fade.st.css.js.map +1 -1
  107. package/dist/cjs/components/Heading/Heading.st.css.js +2 -2
  108. package/dist/cjs/components/Heading/Heading.st.css.js.map +1 -1
  109. package/dist/cjs/components/ImportButton/ImportStepUpload.st.css.js +3 -3
  110. package/dist/cjs/components/ImportButton/ImportStepUpload.st.css.js.map +1 -1
  111. package/dist/cjs/components/InputOverflow/InputOverflow.st.css.js +2 -2
  112. package/dist/cjs/components/InputOverflow/InputOverflow.st.css.js.map +1 -1
  113. package/dist/cjs/components/LoadingRow/LoadingRow.st.css.js +3 -3
  114. package/dist/cjs/components/LoadingRow/LoadingRow.st.css.js.map +1 -1
  115. package/dist/cjs/components/MaxHeightText/MaxHeightText.st.css.js +2 -2
  116. package/dist/cjs/components/MaxHeightText/MaxHeightText.st.css.js.map +1 -1
  117. package/dist/cjs/components/MaxLines/MaxLines.st.css.js +2 -2
  118. package/dist/cjs/components/MaxLines/MaxLines.st.css.js.map +1 -1
  119. package/dist/cjs/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js +5 -5
  120. package/dist/cjs/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js.map +1 -1
  121. package/dist/cjs/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js +2 -2
  122. package/dist/cjs/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js.map +1 -1
  123. package/dist/cjs/components/NestedTable/NestedTableRow.st.css.js +5 -5
  124. package/dist/cjs/components/NestedTable/NestedTableRow.st.css.js.map +1 -1
  125. package/dist/cjs/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.js +2 -2
  126. package/dist/cjs/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.js.map +1 -1
  127. package/dist/cjs/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js +2 -2
  128. package/dist/cjs/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js.map +1 -1
  129. package/dist/cjs/components/PickerContent/PickerContent.st.css.js +2 -2
  130. package/dist/cjs/components/PickerContent/PickerContent.st.css.js.map +1 -1
  131. package/dist/cjs/components/PickerContent/PickerContentAdditionalStep.st.css.js +4 -4
  132. package/dist/cjs/components/PickerContent/PickerContentAdditionalStep.st.css.js.map +1 -1
  133. package/dist/cjs/components/PickerTableListItem/PickerTableListItem.st.css.js +2 -2
  134. package/dist/cjs/components/PickerTableListItem/PickerTableListItem.st.css.js.map +1 -1
  135. package/dist/cjs/components/ScrollableContent/ScrollableContent.st.css.js +2 -2
  136. package/dist/cjs/components/ScrollableContent/ScrollableContent.st.css.js.map +1 -1
  137. package/dist/cjs/components/SkeletonCard/SkeletonCard.st.css.js +3 -3
  138. package/dist/cjs/components/SkeletonCard/SkeletonCard.st.css.js.map +1 -1
  139. package/dist/cjs/components/SlidingModal/SlidingModal.st.css.js +2 -2
  140. package/dist/cjs/components/SlidingModal/SlidingModal.st.css.js.map +1 -1
  141. package/dist/cjs/components/TableGridSwitchButton/TableGridSwitchButton.js +14 -38
  142. package/dist/cjs/components/TableGridSwitchButton/TableGridSwitchButton.js.map +1 -1
  143. package/dist/cjs/components/TableGridSwitchButton/layoutConfig.js +34 -0
  144. package/dist/cjs/components/TableGridSwitchButton/layoutConfig.js.map +1 -0
  145. package/dist/cjs/components/TabsFilter/TabsFilter.st.css.js +3 -3
  146. package/dist/cjs/components/TabsFilter/TabsFilter.st.css.js.map +1 -1
  147. package/dist/cjs/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.js +2 -2
  148. package/dist/cjs/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.js.map +1 -1
  149. package/dist/cjs/components/ToolbarItem/ToolbarItem.st.css.js +2 -2
  150. package/dist/cjs/components/ToolbarItem/ToolbarItem.st.css.js.map +1 -1
  151. package/dist/cjs/components/ToolbarItemBox/ToolbarItemBox.st.css.js +2 -2
  152. package/dist/cjs/components/ToolbarItemBox/ToolbarItemBox.st.css.js.map +1 -1
  153. package/dist/cjs/components/common.st.css.js +4 -4
  154. package/dist/cjs/components/common.st.css.js.map +1 -1
  155. package/dist/cjs/hooks/useStaticListFilterCollection.js +2 -1
  156. package/dist/cjs/hooks/useStaticListFilterCollection.js.map +1 -1
  157. package/dist/cjs/state/CollectionPage/CollectionPageHeader.st.css.js +2 -2
  158. package/dist/cjs/state/CollectionPage/CollectionPageHeader.st.css.js.map +1 -1
  159. package/dist/cjs/state/EditableTable/CellInteractionState.js +65 -0
  160. package/dist/cjs/state/EditableTable/CellInteractionState.js.map +1 -1
  161. package/dist/cjs/state/EditableTable/types.js.map +1 -1
  162. package/dist/cjs/state/FormPage/FormPageHeader.st.css.js +2 -2
  163. package/dist/cjs/state/FormPage/FormPageHeader.st.css.js.map +1 -1
  164. package/dist/cjs/state/TableState.js +2 -0
  165. package/dist/cjs/state/TableState.js.map +1 -1
  166. package/dist/cjs/state/Toolbar/ToolbarResponsiveState.js +38 -4
  167. package/dist/cjs/state/Toolbar/ToolbarResponsiveState.js.map +1 -1
  168. package/dist/cjs/state/Toolbar/computeResponsiveTargetState.js +56 -17
  169. package/dist/cjs/state/Toolbar/computeResponsiveTargetState.js.map +1 -1
  170. package/dist/cjs/state/Toolbar/toolbarResponsiveConstants.js +5 -1
  171. package/dist/cjs/state/Toolbar/toolbarResponsiveConstants.js.map +1 -1
  172. package/dist/cjs/styles.global.css +1 -1
  173. package/dist/cjs/version.js +1 -1
  174. package/dist/cjs/version.js.map +1 -1
  175. package/dist/docs/AI Assistant.md +171 -0
  176. package/dist/docs/ActionCellProps.md +40 -0
  177. package/dist/docs/ActionSubItem.md +24 -0
  178. package/dist/docs/Allow Users to Add Extended Fields.md +194 -0
  179. package/dist/docs/AutoCompleteFilter.md +276 -0
  180. package/dist/docs/BulkActionModalRenderProp.md +22 -0
  181. package/dist/docs/BulkSelectState.md +18 -0
  182. package/dist/docs/Category.md +19 -0
  183. package/dist/docs/CollectionEmptyState.md +240 -0
  184. package/dist/docs/CollectionErrorState.md +107 -0
  185. package/dist/docs/CollectionNoResultsState.md +116 -0
  186. package/dist/docs/CollectionOptimisticActions.md +1074 -0
  187. package/dist/docs/CollectionPage.Content.md +154 -0
  188. package/dist/docs/CollectionPage.Header.md +216 -0
  189. package/dist/docs/CollectionPage.md +183 -0
  190. package/dist/docs/CollectionPremiumEmptyState.md +115 -0
  191. package/dist/docs/CollectionSearch.md +345 -0
  192. package/dist/docs/CollectionSection.md +16 -0
  193. package/dist/docs/CollectionState.md +29 -0
  194. package/dist/docs/CollectionSubToolbar.md +14 -0
  195. package/dist/docs/CollectionToolbar.md +18 -0
  196. package/dist/docs/Component Tests.md +191 -0
  197. package/dist/docs/ComputedQuery.md +45 -0
  198. package/dist/docs/CtaBaseProps.md +19 -0
  199. package/dist/docs/CustomColumns.md +916 -0
  200. package/dist/docs/CustomFieldsViewWidget.md +191 -0
  201. package/dist/docs/CustomFieldsWidget.md +635 -0
  202. package/dist/docs/Data Extension Overview.md +85 -0
  203. package/dist/docs/DataResultRaw.md +25 -0
  204. package/dist/docs/DateRangeFilter.md +202 -0
  205. package/dist/docs/Display Extended Fields.md +244 -0
  206. package/dist/docs/Enable Filters for Extended Fields.md +243 -0
  207. package/dist/docs/EntityPage.AdditionalContent.md +25 -0
  208. package/dist/docs/EntityPage.Card.md +250 -0
  209. package/dist/docs/EntityPage.Content.md +24 -0
  210. package/dist/docs/EntityPage.Header.md +260 -0
  211. package/dist/docs/EntityPage.MainContent.md +24 -0
  212. package/dist/docs/EntityPage.Slots.md +75 -0
  213. package/dist/docs/EntityPage.md +1030 -0
  214. package/dist/docs/EntityPageState.md +23 -0
  215. package/dist/docs/Explore Apps.md +170 -0
  216. package/dist/docs/ExportTo.md +894 -0
  217. package/dist/docs/Filter Overview.md +448 -0
  218. package/dist/docs/FilterProps.md +26 -0
  219. package/dist/docs/FormPageState.md +17 -0
  220. package/dist/docs/Grid Sections.md +170 -0
  221. package/dist/docs/Grid.md +598 -0
  222. package/dist/docs/GridDragAndDrop.md +131 -0
  223. package/dist/docs/GridFolders.md +259 -0
  224. package/dist/docs/GridFoldersSection.md +16 -0
  225. package/dist/docs/GridFoldersState.md +20 -0
  226. package/dist/docs/GridSectionsProp.md +22 -0
  227. package/dist/docs/GridState.md +22 -0
  228. package/dist/docs/Highlighted Search.md +114 -0
  229. package/dist/docs/InMemoryBackend.md +81 -0
  230. package/dist/docs/Indeterminate.md +273 -0
  231. package/dist/docs/Internal Scroll.md +236 -0
  232. package/dist/docs/More Actions.md +1015 -0
  233. package/dist/docs/MoreActionsItem.md +33 -0
  234. package/dist/docs/MultiAutoInlineCheckboxFilter.md +850 -0
  235. package/dist/docs/MultiBulkActionToolbar.md +1174 -0
  236. package/dist/docs/MultiInlineCheckboxFilter.md +871 -0
  237. package/dist/docs/MultiLevelSorting.md +376 -0
  238. package/dist/docs/MultiSelectCheckboxFilter.md +369 -0
  239. package/dist/docs/MultiSelectCollectionFilter.md +218 -0
  240. package/dist/docs/NestedTable.md +1101 -0
  241. package/dist/docs/NestedTableLevel.md +24 -0
  242. package/dist/docs/NestedTableNodeState.md +23 -0
  243. package/dist/docs/NestedTableOptimisticActions.md +21 -0
  244. package/dist/docs/NestedTableState.md +21 -0
  245. package/dist/docs/Next.js.md +143 -0
  246. package/dist/docs/NumberRangeFilter.md +230 -0
  247. package/dist/docs/OperatorFilterPicker.md +195 -0
  248. package/dist/docs/PageWrapper.md +50 -0
  249. package/dist/docs/PatternsReactRoute.md +31 -0
  250. package/dist/docs/PatternsReactRouter.md +24 -0
  251. package/dist/docs/PickerContent.md +129 -0
  252. package/dist/docs/PickerModal.md +680 -0
  253. package/dist/docs/PickerStandalone.md +332 -0
  254. package/dist/docs/PrimaryActionButton.md +323 -0
  255. package/dist/docs/PrimaryActions.md +173 -0
  256. package/dist/docs/PrimaryPageButton.md +140 -0
  257. package/dist/docs/RadioGroupFilter.md +73 -0
  258. package/dist/docs/RequestId.md +58 -0
  259. package/dist/docs/SecondaryActions.md +175 -0
  260. package/dist/docs/SettingsPage.AdditionalContent.md +25 -0
  261. package/dist/docs/SettingsPage.Card.md +246 -0
  262. package/dist/docs/SettingsPage.Content.md +24 -0
  263. package/dist/docs/SettingsPage.Header.md +176 -0
  264. package/dist/docs/SettingsPage.MainContent.md +24 -0
  265. package/dist/docs/SettingsPage.md +680 -0
  266. package/dist/docs/SettingsPageState.md +22 -0
  267. package/dist/docs/SingleSelectFilter.md +401 -0
  268. package/dist/docs/Sled Tests.md +109 -0
  269. package/dist/docs/Sortable Columns.md +250 -0
  270. package/dist/docs/Suggestions.md +370 -0
  271. package/dist/docs/SummaryBar.md +515 -0
  272. package/dist/docs/Table Sections.md +473 -0
  273. package/dist/docs/Table.md +1065 -0
  274. package/dist/docs/TableColumn.md +35 -0
  275. package/dist/docs/TableDragAndDrop.md +502 -0
  276. package/dist/docs/TableFolders.md +419 -0
  277. package/dist/docs/TableFoldersState.md +22 -0
  278. package/dist/docs/TableGridSwitch.md +298 -0
  279. package/dist/docs/TableGridSwitchDragAndDrop.md +170 -0
  280. package/dist/docs/TableGridSwitchFolders.md +446 -0
  281. package/dist/docs/TableGridSwitchFoldersState.md +22 -0
  282. package/dist/docs/TableGridSwitchState.md +23 -0
  283. package/dist/docs/TableSectionsProp.md +22 -0
  284. package/dist/docs/TableState.md +24 -0
  285. package/dist/docs/TableTopNotification.md +314 -0
  286. package/dist/docs/TabsFilter.md +484 -0
  287. package/dist/docs/Tags Overview.md +118 -0
  288. package/dist/docs/Tags.md +718 -0
  289. package/dist/docs/TagsWidget.md +419 -0
  290. package/dist/docs/ToolbarCollectionState.md +19 -0
  291. package/dist/docs/ToolbarFilters.md +1588 -0
  292. package/dist/docs/ToolbarSecondaryActions.md +383 -0
  293. package/dist/docs/ToolbarTitle.md +324 -0
  294. package/dist/docs/View.md +23 -0
  295. package/dist/docs/Views.md +786 -0
  296. package/dist/docs/WidgetsFormProvider.md +61 -0
  297. package/dist/docs/WixPatternsBMProvider.md +31 -0
  298. package/dist/docs/WixPatternsBaseProvider.md +87 -0
  299. package/dist/docs/WixPatternsEssentialsProvider.md +43 -0
  300. package/dist/docs/WixPatternsGizaProvider.md +37 -0
  301. package/dist/docs/WixPatternsProvider.md +68 -0
  302. package/dist/docs/Working with Cache.md +114 -0
  303. package/dist/docs/arrayFilter.md +226 -0
  304. package/dist/docs/bulkActionModal.md +40 -0
  305. package/dist/docs/createNestedTableLevel.md +24 -0
  306. package/dist/docs/createNestedTableSingleEntityLevels.md +20 -0
  307. package/dist/docs/customFilter.md +182 -0
  308. package/dist/docs/dateRangeFilter.md +55 -0
  309. package/dist/docs/deleteSecondaryAction.md +122 -0
  310. package/dist/docs/idNameArrayFilter.md +206 -0
  311. package/dist/docs/index.json +662 -0
  312. package/dist/docs/operatorFilter.md +183 -0
  313. package/dist/docs/stringFilter.md +204 -0
  314. package/dist/docs/stringsArrayFilter.md +118 -0
  315. package/dist/docs/useAmbassadorCollection.md +45 -0
  316. package/dist/docs/useCollection.md +61 -0
  317. package/dist/docs/useCreateCollection.md +32 -0
  318. package/dist/docs/useCreateNestedOptimisticActions.md +21 -0
  319. package/dist/docs/useEntity.md +44 -0
  320. package/dist/docs/useEntityPage.md +57 -0
  321. package/dist/docs/useEntityPageContext.md +28 -0
  322. package/dist/docs/useFilterCollection.md +163 -0
  323. package/dist/docs/useGridCollection.md +58 -0
  324. package/dist/docs/useGridFolders.md +25 -0
  325. package/dist/docs/useItemsSelectionFilter.md +60 -0
  326. package/dist/docs/useNestedTable.md +66 -0
  327. package/dist/docs/useOptimisticActions.md +1288 -0
  328. package/dist/docs/usePatternsNavigate.md +57 -0
  329. package/dist/docs/usePickerContent.md +61 -0
  330. package/dist/docs/usePickerModal.md +68 -0
  331. package/dist/docs/usePickerStandalone.md +56 -0
  332. package/dist/docs/useSelector.md +181 -0
  333. package/dist/docs/useSettingsPage.md +54 -0
  334. package/dist/docs/useSettingsPageContext.md +28 -0
  335. package/dist/docs/useStaticListFilterCollection.md +194 -0
  336. package/dist/docs/useTableCollection.md +58 -0
  337. package/dist/docs/useTableFolders.md +25 -0
  338. package/dist/docs/useTableGridSwitchCollection.md +58 -0
  339. package/dist/docs/useTableGridSwitchFolders.md +25 -0
  340. package/dist/docs/useWidgetsFormContext.md +19 -0
  341. package/dist/esm/components/CardContainer/CardContainer.st.css.js +2 -2
  342. package/dist/esm/components/Collapse/Collapse.st.css.js +2 -2
  343. package/dist/esm/components/Collapse/Collapse.st.css.js.map +1 -1
  344. package/dist/esm/components/CollectionPageNew/CollectionPage.st.css.js +2 -2
  345. package/dist/esm/components/CollectionPageNew/CollectionPage.st.css.js.map +1 -1
  346. package/dist/esm/components/CollectionSectionHeader/CollectionSectionHeader.st.css.js +2 -2
  347. package/dist/esm/components/CollectionTable/CollectionTable.st.css.js +2 -2
  348. package/dist/esm/components/CollectionTable/CollectionTableWSRTable.js +3 -1
  349. package/dist/esm/components/CollectionTable/CollectionTableWSRTable.js.map +1 -1
  350. package/dist/esm/components/CollectionToolbar/CollectionToolbar.js +3 -2
  351. package/dist/esm/components/CollectionToolbar/CollectionToolbar.js.map +1 -1
  352. package/dist/esm/components/CollectionToolbar/CollectionToolbar.st.css.js +2 -2
  353. package/dist/esm/components/CollectionToolbar/CollectionToolbarActionsGroupResponsiveLayout.js +39 -6
  354. package/dist/esm/components/CollectionToolbar/CollectionToolbarActionsGroupResponsiveLayout.js.map +1 -1
  355. package/dist/esm/components/CollectionToolbar/CollectionToolbarActionsToolbarItemsGroup.js +2 -1
  356. package/dist/esm/components/CollectionToolbar/CollectionToolbarActionsToolbarItemsGroup.js.map +1 -1
  357. package/dist/esm/components/CollectionToolbar/SearchOrCustomFilter.st.css.js +2 -2
  358. package/dist/esm/components/CollectionToolbar/SearchOrCustomFilter.st.css.js.map +1 -1
  359. package/dist/esm/components/CollectionToolbar/ToolbarOverflowMenu.js +110 -0
  360. package/dist/esm/components/CollectionToolbar/ToolbarOverflowMenu.js.map +1 -0
  361. package/dist/esm/components/CollectionToolbar/useToolbarOverflowItems.js +74 -0
  362. package/dist/esm/components/CollectionToolbar/useToolbarOverflowItems.js.map +1 -0
  363. package/dist/esm/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.js +2 -2
  364. package/dist/esm/components/CollectionViewsDropdown/ViewsDropdown.st.css.js +2 -2
  365. package/dist/esm/components/CollectionViewsDropdown/ViewsDropdown.st.css.js.map +1 -1
  366. package/dist/esm/components/DragHandle/DragHandle.st.css.js +2 -2
  367. package/dist/esm/components/EditableTable/EditableCell.st.css.js +2 -2
  368. package/dist/esm/components/EditableTable/cellTypes/boolean/Edit.st.css.js +2 -2
  369. package/dist/esm/components/EditableTable/cellTypes/boolean/View.st.css.js +2 -2
  370. package/dist/esm/components/EditableTable/cellTypes/date/Edit.st.css.js +2 -2
  371. package/dist/esm/components/EditableTable/cellTypes/date/View.st.css.js +2 -2
  372. package/dist/esm/components/EditableTable/cellTypes/date/View.st.css.js.map +1 -1
  373. package/dist/esm/components/EditableTable/cellTypes/email/Edit.js +21 -0
  374. package/dist/esm/components/EditableTable/cellTypes/email/Edit.js.map +1 -0
  375. package/dist/esm/components/EditableTable/cellTypes/email/Edit.st.css +4 -0
  376. package/dist/esm/components/EditableTable/cellTypes/email/Edit.st.css.js +15 -0
  377. package/dist/esm/components/EditableTable/cellTypes/email/Edit.st.css.js.map +1 -0
  378. package/dist/esm/components/EditableTable/cellTypes/email/Edit.uni.driver.js +13 -0
  379. package/dist/esm/components/EditableTable/cellTypes/email/Edit.uni.driver.js.map +1 -0
  380. package/dist/esm/components/EditableTable/cellTypes/email/View.js +5 -0
  381. package/dist/esm/components/EditableTable/cellTypes/email/View.js.map +1 -0
  382. package/dist/esm/components/EditableTable/cellTypes/email/View.st.css +4 -0
  383. package/dist/esm/components/EditableTable/cellTypes/email/View.st.css.js +15 -0
  384. package/dist/esm/components/EditableTable/cellTypes/email/View.st.css.js.map +1 -0
  385. package/dist/esm/components/EditableTable/cellTypes/email/View.uni.driver.js +8 -0
  386. package/dist/esm/components/EditableTable/cellTypes/email/View.uni.driver.js.map +1 -0
  387. package/dist/esm/components/EditableTable/cellTypes/email/index.js +22 -0
  388. package/dist/esm/components/EditableTable/cellTypes/email/index.js.map +1 -0
  389. package/dist/esm/components/EditableTable/cellTypes/index.js +5 -1
  390. package/dist/esm/components/EditableTable/cellTypes/index.js.map +1 -1
  391. package/dist/esm/components/EditableTable/cellTypes/number/Edit.js +2 -5
  392. package/dist/esm/components/EditableTable/cellTypes/number/Edit.js.map +1 -1
  393. package/dist/esm/components/EditableTable/cellTypes/number/Edit.st.css.js +2 -2
  394. package/dist/esm/components/EditableTable/cellTypes/number/View.js +2 -2
  395. package/dist/esm/components/EditableTable/cellTypes/number/View.js.map +1 -1
  396. package/dist/esm/components/EditableTable/cellTypes/number/View.st.css.js +2 -2
  397. package/dist/esm/components/EditableTable/cellTypes/number/View.st.css.js.map +1 -1
  398. package/dist/esm/components/EditableTable/cellTypes/object/Edit.js +39 -0
  399. package/dist/esm/components/EditableTable/cellTypes/object/Edit.js.map +1 -0
  400. package/dist/esm/components/EditableTable/cellTypes/object/Edit.st.css +4 -0
  401. package/dist/esm/components/EditableTable/cellTypes/object/Edit.st.css.js +15 -0
  402. package/dist/esm/components/EditableTable/cellTypes/object/Edit.st.css.js.map +1 -0
  403. package/dist/esm/components/EditableTable/cellTypes/object/Edit.uni.driver.js +13 -0
  404. package/dist/esm/components/EditableTable/cellTypes/object/Edit.uni.driver.js.map +1 -0
  405. package/dist/esm/components/EditableTable/cellTypes/object/View.js +5 -0
  406. package/dist/esm/components/EditableTable/cellTypes/object/View.js.map +1 -0
  407. package/dist/esm/components/EditableTable/cellTypes/object/View.st.css +4 -0
  408. package/dist/esm/components/EditableTable/cellTypes/object/View.st.css.js +15 -0
  409. package/dist/esm/components/EditableTable/cellTypes/object/View.st.css.js.map +1 -0
  410. package/dist/esm/components/EditableTable/cellTypes/object/View.uni.driver.js +8 -0
  411. package/dist/esm/components/EditableTable/cellTypes/object/View.uni.driver.js.map +1 -0
  412. package/dist/esm/components/EditableTable/cellTypes/object/index.js +47 -0
  413. package/dist/esm/components/EditableTable/cellTypes/object/index.js.map +1 -0
  414. package/dist/esm/components/EditableTable/cellTypes/select/Edit.st.css.js +2 -2
  415. package/dist/esm/components/EditableTable/cellTypes/select/View.st.css.js +2 -2
  416. package/dist/esm/components/EditableTable/cellTypes/text/Edit.st.css.js +2 -2
  417. package/dist/esm/components/EditableTable/cellTypes/text/Edit.st.css.js.map +1 -1
  418. package/dist/esm/components/EditableTable/cellTypes/text/View.st.css.js +2 -2
  419. package/dist/esm/components/EditableTable/cellTypes/text/View.st.css.js.map +1 -1
  420. package/dist/esm/components/EditableTable/cellTypes/url/Edit.st.css.js +2 -2
  421. package/dist/esm/components/EditableTable/cellTypes/url/View.st.css.js +2 -2
  422. package/dist/esm/components/EditableTable/useCellFocusAndEditing.js +15 -1
  423. package/dist/esm/components/EditableTable/useCellFocusAndEditing.js.map +1 -1
  424. package/dist/esm/components/EditableTable/useKeyboardNavigation.js +10 -0
  425. package/dist/esm/components/EditableTable/useKeyboardNavigation.js.map +1 -1
  426. package/dist/esm/components/EntityPage/EntityPagePlain.st.css.js +2 -2
  427. package/dist/esm/components/Fade/Fade.st.css.js +2 -2
  428. package/dist/esm/components/Fade/Fade.st.css.js.map +1 -1
  429. package/dist/esm/components/Heading/Heading.st.css.js +2 -2
  430. package/dist/esm/components/ImportButton/ImportStepUpload.st.css.js +2 -2
  431. package/dist/esm/components/ImportButton/ImportStepUpload.st.css.js.map +1 -1
  432. package/dist/esm/components/InputOverflow/InputOverflow.st.css.js +2 -2
  433. package/dist/esm/components/LoadingRow/LoadingRow.st.css.js +3 -3
  434. package/dist/esm/components/MaxHeightText/MaxHeightText.st.css.js +2 -2
  435. package/dist/esm/components/MaxHeightText/MaxHeightText.st.css.js.map +1 -1
  436. package/dist/esm/components/MaxLines/MaxLines.st.css.js +2 -2
  437. package/dist/esm/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js +2 -2
  438. package/dist/esm/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.js.map +1 -1
  439. package/dist/esm/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.js +2 -2
  440. package/dist/esm/components/NestedTable/NestedTableRow.st.css.js +2 -2
  441. package/dist/esm/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.js +2 -2
  442. package/dist/esm/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js +2 -2
  443. package/dist/esm/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.js.map +1 -1
  444. package/dist/esm/components/PickerContent/PickerContent.st.css.js +2 -2
  445. package/dist/esm/components/PickerContent/PickerContentAdditionalStep.st.css.js +2 -2
  446. package/dist/esm/components/PickerContent/PickerContentAdditionalStep.st.css.js.map +1 -1
  447. package/dist/esm/components/PickerTableListItem/PickerTableListItem.st.css.js +2 -2
  448. package/dist/esm/components/ScrollableContent/ScrollableContent.st.css.js +2 -2
  449. package/dist/esm/components/SkeletonCard/SkeletonCard.st.css.js +2 -2
  450. package/dist/esm/components/SlidingModal/SlidingModal.st.css.js +2 -2
  451. package/dist/esm/components/SlidingModal/SlidingModal.st.css.js.map +1 -1
  452. package/dist/esm/components/TableGridSwitchButton/TableGridSwitchButton.js +2 -12
  453. package/dist/esm/components/TableGridSwitchButton/TableGridSwitchButton.js.map +1 -1
  454. package/dist/esm/components/TableGridSwitchButton/layoutConfig.js +14 -0
  455. package/dist/esm/components/TableGridSwitchButton/layoutConfig.js.map +1 -0
  456. package/dist/esm/components/TabsFilter/TabsFilter.st.css.js +2 -2
  457. package/dist/esm/components/TabsFilter/TabsFilter.st.css.js.map +1 -1
  458. package/dist/esm/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.js +2 -2
  459. package/dist/esm/components/ToolbarItem/ToolbarItem.st.css.js +2 -2
  460. package/dist/esm/components/ToolbarItem/ToolbarItem.st.css.js.map +1 -1
  461. package/dist/esm/components/ToolbarItemBox/ToolbarItemBox.st.css.js +2 -2
  462. package/dist/esm/components/ToolbarItemBox/ToolbarItemBox.st.css.js.map +1 -1
  463. package/dist/esm/components/common.st.css.js +2 -2
  464. package/dist/esm/hooks/useStaticListFilterCollection.js +1 -0
  465. package/dist/esm/hooks/useStaticListFilterCollection.js.map +1 -1
  466. package/dist/esm/state/CollectionPage/CollectionPageHeader.st.css.js +2 -2
  467. package/dist/esm/state/EditableTable/CellInteractionState.js +58 -0
  468. package/dist/esm/state/EditableTable/CellInteractionState.js.map +1 -1
  469. package/dist/esm/state/FormPage/FormPageHeader.st.css.js +2 -2
  470. package/dist/esm/state/TableState.js +2 -0
  471. package/dist/esm/state/TableState.js.map +1 -1
  472. package/dist/esm/state/Toolbar/ToolbarResponsiveState.js +40 -5
  473. package/dist/esm/state/Toolbar/ToolbarResponsiveState.js.map +1 -1
  474. package/dist/esm/state/Toolbar/computeResponsiveTargetState.js +46 -18
  475. package/dist/esm/state/Toolbar/computeResponsiveTargetState.js.map +1 -1
  476. package/dist/esm/state/Toolbar/toolbarResponsiveConstants.js +4 -0
  477. package/dist/esm/state/Toolbar/toolbarResponsiveConstants.js.map +1 -1
  478. package/dist/esm/styles.global.css +1 -1
  479. package/dist/esm/version.js +1 -1
  480. package/dist/types/components/Collapse/Collapse.st.css.d.ts.map +1 -1
  481. package/dist/types/components/CollectionPageNew/CollectionPage.st.css.d.ts.map +1 -1
  482. package/dist/types/components/CollectionTable/CollectionTable.uni.driver.d.ts +24 -24
  483. package/dist/types/components/CollectionTable/CollectionTableWSRTable.d.ts.map +1 -1
  484. package/dist/types/components/CollectionToolbar/CollectionToolbar.d.ts.map +1 -1
  485. package/dist/types/components/CollectionToolbar/CollectionToolbar.uni.driver.d.ts +11 -11
  486. package/dist/types/components/CollectionToolbar/CollectionToolbarActionsGroupProps.d.ts +3 -0
  487. package/dist/types/components/CollectionToolbar/CollectionToolbarActionsGroupProps.d.ts.map +1 -1
  488. package/dist/types/components/CollectionToolbar/CollectionToolbarActionsGroupResponsiveLayout.d.ts +5 -1
  489. package/dist/types/components/CollectionToolbar/CollectionToolbarActionsGroupResponsiveLayout.d.ts.map +1 -1
  490. package/dist/types/components/CollectionToolbar/CollectionToolbarActionsToolbarItemsGroup.d.ts.map +1 -1
  491. package/dist/types/components/CollectionToolbar/SearchOrCustomFilter.st.css.d.ts.map +1 -1
  492. package/dist/types/components/CollectionToolbar/ToolbarOverflowMenu.d.ts +24 -0
  493. package/dist/types/components/CollectionToolbar/ToolbarOverflowMenu.d.ts.map +1 -0
  494. package/dist/types/components/CollectionToolbar/useToolbarOverflowItems.d.ts +17 -0
  495. package/dist/types/components/CollectionToolbar/useToolbarOverflowItems.d.ts.map +1 -0
  496. package/dist/types/components/CollectionViewsDropdown/ViewsDropdown.st.css.d.ts.map +1 -1
  497. package/dist/types/components/CtaProps.d.ts +1 -1
  498. package/dist/types/components/CustomFieldModal/CustomFieldModal.uni.driver.d.ts +2 -2
  499. package/dist/types/components/CustomFieldsWidget/CustomFieldsWidget.uni.driver.d.ts +3 -3
  500. package/dist/types/components/DropdownFilter/CollectionDropdownFilter.uni.driver.d.ts +1 -1
  501. package/dist/types/components/EditableTable/cellTypes/date/View.st.css.d.ts.map +1 -1
  502. package/dist/types/components/EditableTable/cellTypes/email/Edit.d.ts +4 -0
  503. package/dist/types/components/EditableTable/cellTypes/email/Edit.d.ts.map +1 -0
  504. package/dist/types/components/EditableTable/cellTypes/email/Edit.st.css.d.ts +14 -0
  505. package/dist/types/components/EditableTable/cellTypes/email/Edit.st.css.d.ts.map +1 -0
  506. package/dist/types/components/EditableTable/cellTypes/email/Edit.uni.driver.d.ts +22 -0
  507. package/dist/types/components/EditableTable/cellTypes/email/Edit.uni.driver.d.ts.map +1 -0
  508. package/dist/types/components/EditableTable/cellTypes/email/View.d.ts +4 -0
  509. package/dist/types/components/EditableTable/cellTypes/email/View.d.ts.map +1 -0
  510. package/dist/types/components/EditableTable/cellTypes/email/View.st.css.d.ts +14 -0
  511. package/dist/types/components/EditableTable/cellTypes/email/View.st.css.d.ts.map +1 -0
  512. package/dist/types/components/EditableTable/cellTypes/email/View.uni.driver.d.ts +15 -0
  513. package/dist/types/components/EditableTable/cellTypes/email/View.uni.driver.d.ts.map +1 -0
  514. package/dist/types/components/EditableTable/cellTypes/email/index.d.ts +5 -0
  515. package/dist/types/components/EditableTable/cellTypes/email/index.d.ts.map +1 -0
  516. package/dist/types/components/EditableTable/cellTypes/index.d.ts +3 -1
  517. package/dist/types/components/EditableTable/cellTypes/index.d.ts.map +1 -1
  518. package/dist/types/components/EditableTable/cellTypes/number/Edit.d.ts.map +1 -1
  519. package/dist/types/components/EditableTable/cellTypes/number/View.d.ts.map +1 -1
  520. package/dist/types/components/EditableTable/cellTypes/number/View.st.css.d.ts.map +1 -1
  521. package/dist/types/components/EditableTable/cellTypes/object/Edit.d.ts +4 -0
  522. package/dist/types/components/EditableTable/cellTypes/object/Edit.d.ts.map +1 -0
  523. package/dist/types/components/EditableTable/cellTypes/object/Edit.st.css.d.ts +14 -0
  524. package/dist/types/components/EditableTable/cellTypes/object/Edit.st.css.d.ts.map +1 -0
  525. package/dist/types/components/EditableTable/cellTypes/object/Edit.uni.driver.d.ts +22 -0
  526. package/dist/types/components/EditableTable/cellTypes/object/Edit.uni.driver.d.ts.map +1 -0
  527. package/dist/types/components/EditableTable/cellTypes/object/View.d.ts +4 -0
  528. package/dist/types/components/EditableTable/cellTypes/object/View.d.ts.map +1 -0
  529. package/dist/types/components/EditableTable/cellTypes/object/View.st.css.d.ts +14 -0
  530. package/dist/types/components/EditableTable/cellTypes/object/View.st.css.d.ts.map +1 -0
  531. package/dist/types/components/EditableTable/cellTypes/object/View.uni.driver.d.ts +15 -0
  532. package/dist/types/components/EditableTable/cellTypes/object/View.uni.driver.d.ts.map +1 -0
  533. package/dist/types/components/EditableTable/cellTypes/object/index.d.ts +5 -0
  534. package/dist/types/components/EditableTable/cellTypes/object/index.d.ts.map +1 -0
  535. package/dist/types/components/EditableTable/cellTypes/text/Edit.st.css.d.ts.map +1 -1
  536. package/dist/types/components/EditableTable/cellTypes/text/View.st.css.d.ts.map +1 -1
  537. package/dist/types/components/EditableTable/useCellFocusAndEditing.d.ts.map +1 -1
  538. package/dist/types/components/EditableTable/useKeyboardNavigation.d.ts.map +1 -1
  539. package/dist/types/components/Fade/Fade.st.css.d.ts.map +1 -1
  540. package/dist/types/components/FiltersPanel/FiltersPanel.uni.driver.d.ts +4 -4
  541. package/dist/types/components/Grid/Grid.uni.driver.d.ts +13 -13
  542. package/dist/types/components/Grid/GridFolders.uni.driver.d.ts +38 -38
  543. package/dist/types/components/Grid/GridFoldersSection.uni.driver.d.ts +13 -13
  544. package/dist/types/components/ImportButton/ImportStepUpload.st.css.d.ts.map +1 -1
  545. package/dist/types/components/Kanban/Kanban.uni.driver.d.ts +11 -11
  546. package/dist/types/components/MaxHeightText/MaxHeightText.st.css.d.ts.map +1 -1
  547. package/dist/types/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.d.ts.map +1 -1
  548. package/dist/types/components/NestedTable/NestedTable.uni.driver.d.ts +37 -37
  549. package/dist/types/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.d.ts.map +1 -1
  550. package/dist/types/components/PickerContent/PickerContentAdditionalStep.st.css.d.ts.map +1 -1
  551. package/dist/types/components/SlidingModal/SlidingModal.st.css.d.ts.map +1 -1
  552. package/dist/types/components/SummaryBar/SummaryBar.uni.driver.d.ts +1 -1
  553. package/dist/types/components/Table/Table.uni.driver.d.ts +26 -26
  554. package/dist/types/components/TableFolders/TableFolders.uni.driver.d.ts +37 -37
  555. package/dist/types/components/TableGridSwitch/TableGridSwitch.uni.driver.d.ts +40 -40
  556. package/dist/types/components/TableGridSwitchButton/TableGridSwitchButton.d.ts.map +1 -1
  557. package/dist/types/components/TableGridSwitchButton/layoutConfig.d.ts +9 -0
  558. package/dist/types/components/TableGridSwitchButton/layoutConfig.d.ts.map +1 -0
  559. package/dist/types/components/TabsFilter/TabsFilter.st.css.d.ts.map +1 -1
  560. package/dist/types/components/TabsFilter/TabsFilter.uni.driver.d.ts +1 -1
  561. package/dist/types/components/ToolbarItem/ToolbarItem.st.css.d.ts.map +1 -1
  562. package/dist/types/components/ToolbarItemBox/ToolbarItemBox.st.css.d.ts.map +1 -1
  563. package/dist/types/hooks/useStaticListFilterCollection.d.ts.map +1 -1
  564. package/dist/types/state/EditableTable/CellInteractionState.d.ts +7 -0
  565. package/dist/types/state/EditableTable/CellInteractionState.d.ts.map +1 -1
  566. package/dist/types/state/EditableTable/types.d.ts +2 -0
  567. package/dist/types/state/EditableTable/types.d.ts.map +1 -1
  568. package/dist/types/state/TableState.d.ts +2 -0
  569. package/dist/types/state/TableState.d.ts.map +1 -1
  570. package/dist/types/state/Toolbar/ToolbarResponsiveState.d.ts +3 -0
  571. package/dist/types/state/Toolbar/ToolbarResponsiveState.d.ts.map +1 -1
  572. package/dist/types/state/Toolbar/computeResponsiveTargetState.d.ts +8 -1
  573. package/dist/types/state/Toolbar/computeResponsiveTargetState.d.ts.map +1 -1
  574. package/dist/types/state/Toolbar/toolbarResponsiveConstants.d.ts +2 -0
  575. package/dist/types/state/Toolbar/toolbarResponsiveConstants.d.ts.map +1 -1
  576. package/dist/types/testkit/enzyme.d.ts +194 -194
  577. package/dist/types/testkit/jsdom.d.ts +207 -207
  578. package/dist/types/testkit/playwright.d.ts +194 -194
  579. package/dist/types/testkit/puppeteer.d.ts +205 -205
  580. package/dist/types/version.d.ts +1 -1
  581. package/package.json +10 -7
  582. package/src/components/CardContainer/CardContainer.st.css.ts +2 -2
  583. package/src/components/Collapse/Collapse.st.css.ts +2 -2
  584. package/src/components/CollectionPageNew/CollectionPage.st.css.ts +2 -2
  585. package/src/components/CollectionSectionHeader/CollectionSectionHeader.st.css.ts +2 -2
  586. package/src/components/CollectionTable/CollectionTable.st.css.ts +2 -2
  587. package/src/components/CollectionTable/CollectionTableWSRTable.tsx +3 -0
  588. package/src/components/CollectionToolbar/CollectionToolbar.st.css.ts +2 -2
  589. package/src/components/CollectionToolbar/CollectionToolbar.tsx +11 -4
  590. package/src/components/CollectionToolbar/CollectionToolbarActionsGroupProps.ts +3 -0
  591. package/src/components/CollectionToolbar/CollectionToolbarActionsGroupResponsiveLayout.tsx +73 -16
  592. package/src/components/CollectionToolbar/CollectionToolbarActionsToolbarItemsGroup.tsx +4 -0
  593. package/src/components/CollectionToolbar/SearchOrCustomFilter.st.css.ts +2 -2
  594. package/src/components/CollectionToolbar/ToolbarOverflowMenu.tsx +323 -0
  595. package/src/components/CollectionToolbar/useToolbarOverflowItems.ts +112 -0
  596. package/src/components/CollectionViewsDropdown/AutoCompleteReadonly.st.css.ts +2 -2
  597. package/src/components/CollectionViewsDropdown/ViewsDropdown.st.css.ts +2 -2
  598. package/src/components/CtaProps.ts +1 -1
  599. package/src/components/DragHandle/DragHandle.st.css.ts +2 -2
  600. package/src/components/EditableTable/EditableCell.st.css.ts +2 -2
  601. package/src/components/EditableTable/cellTypes/boolean/Edit.st.css.ts +2 -2
  602. package/src/components/EditableTable/cellTypes/boolean/View.st.css.ts +2 -2
  603. package/src/components/EditableTable/cellTypes/date/Edit.st.css.ts +2 -2
  604. package/src/components/EditableTable/cellTypes/date/View.st.css.ts +2 -2
  605. package/src/components/EditableTable/cellTypes/email/Edit.st.css +4 -0
  606. package/src/components/EditableTable/cellTypes/email/Edit.st.css.ts +25 -0
  607. package/src/components/EditableTable/cellTypes/email/Edit.tsx +46 -0
  608. package/src/components/EditableTable/cellTypes/email/Edit.uni.driver.ts +23 -0
  609. package/src/components/EditableTable/cellTypes/email/View.st.css +4 -0
  610. package/src/components/EditableTable/cellTypes/email/View.st.css.ts +25 -0
  611. package/src/components/EditableTable/cellTypes/email/View.tsx +8 -0
  612. package/src/components/EditableTable/cellTypes/email/View.uni.driver.ts +9 -0
  613. package/src/components/EditableTable/cellTypes/email/index.ts +23 -0
  614. package/src/components/EditableTable/cellTypes/index.ts +6 -0
  615. package/src/components/EditableTable/cellTypes/number/Edit.st.css.ts +2 -2
  616. package/src/components/EditableTable/cellTypes/number/Edit.tsx +3 -8
  617. package/src/components/EditableTable/cellTypes/number/View.st.css.ts +2 -2
  618. package/src/components/EditableTable/cellTypes/number/View.tsx +2 -4
  619. package/src/components/EditableTable/cellTypes/object/Edit.st.css +4 -0
  620. package/src/components/EditableTable/cellTypes/object/Edit.st.css.ts +25 -0
  621. package/src/components/EditableTable/cellTypes/object/Edit.tsx +72 -0
  622. package/src/components/EditableTable/cellTypes/object/Edit.uni.driver.ts +22 -0
  623. package/src/components/EditableTable/cellTypes/object/View.st.css +4 -0
  624. package/src/components/EditableTable/cellTypes/object/View.st.css.ts +25 -0
  625. package/src/components/EditableTable/cellTypes/object/View.tsx +12 -0
  626. package/src/components/EditableTable/cellTypes/object/View.uni.driver.ts +9 -0
  627. package/src/components/EditableTable/cellTypes/object/index.ts +49 -0
  628. package/src/components/EditableTable/cellTypes/select/Edit.st.css.ts +2 -2
  629. package/src/components/EditableTable/cellTypes/select/View.st.css.ts +2 -2
  630. package/src/components/EditableTable/cellTypes/text/Edit.st.css.ts +2 -2
  631. package/src/components/EditableTable/cellTypes/text/View.st.css.ts +2 -2
  632. package/src/components/EditableTable/cellTypes/url/Edit.st.css.ts +2 -2
  633. package/src/components/EditableTable/cellTypes/url/View.st.css.ts +2 -2
  634. package/src/components/EditableTable/useCellFocusAndEditing.ts +16 -1
  635. package/src/components/EditableTable/useKeyboardNavigation.ts +11 -0
  636. package/src/components/EntityPage/EntityPagePlain.st.css.ts +2 -2
  637. package/src/components/Fade/Fade.st.css.ts +2 -2
  638. package/src/components/Heading/Heading.st.css.ts +2 -2
  639. package/src/components/ImportButton/ImportStepUpload.st.css.ts +2 -2
  640. package/src/components/InputOverflow/InputOverflow.st.css.ts +2 -2
  641. package/src/components/LoadingRow/LoadingRow.st.css.ts +3 -3
  642. package/src/components/MaxHeightText/MaxHeightText.st.css.ts +2 -2
  643. package/src/components/MaxLines/MaxLines.st.css.ts +2 -2
  644. package/src/components/MultiBulkActionToolbar/MultiBulkActionToolbar.st.css.ts +2 -2
  645. package/src/components/NestedTable/NestedTablePlaceholderStatesRow.st.css.ts +2 -2
  646. package/src/components/NestedTable/NestedTableRow.st.css.ts +2 -2
  647. package/src/components/NestedTableDragAndDrop/MultipleDragOverlayEffect.st.css.ts +2 -2
  648. package/src/components/NestedTableDragAndDrop/NestedTableDragAndDropRow.st.css.ts +2 -2
  649. package/src/components/PickerContent/PickerContent.st.css.ts +2 -2
  650. package/src/components/PickerContent/PickerContentAdditionalStep.st.css.ts +2 -2
  651. package/src/components/PickerTableListItem/PickerTableListItem.st.css.ts +2 -2
  652. package/src/components/ScrollableContent/ScrollableContent.st.css.ts +2 -2
  653. package/src/components/SkeletonCard/SkeletonCard.st.css.ts +2 -2
  654. package/src/components/SlidingModal/SlidingModal.st.css.ts +2 -2
  655. package/src/components/TableGridSwitchButton/TableGridSwitchButton.tsx +2 -21
  656. package/src/components/TableGridSwitchButton/layoutConfig.tsx +20 -0
  657. package/src/components/TabsFilter/TabsFilter.st.css.ts +2 -2
  658. package/src/components/Tags/ManageTags/ManageTagsModal/ManageTagsModal.st.css.ts +2 -2
  659. package/src/components/ToolbarItem/ToolbarItem.st.css.ts +2 -2
  660. package/src/components/ToolbarItemBox/ToolbarItemBox.st.css.ts +2 -2
  661. package/src/components/common.st.css.ts +2 -2
  662. package/src/hooks/useStaticListFilterCollection.ts +1 -0
  663. package/src/state/CollectionPage/CollectionPageHeader.st.css.ts +2 -2
  664. package/src/state/EditableTable/CellInteractionState.ts +63 -0
  665. package/src/state/EditableTable/types.ts +2 -0
  666. package/src/state/FormPage/FormPageHeader.st.css.ts +2 -2
  667. package/src/state/TableState.ts +3 -0
  668. package/src/state/Toolbar/ToolbarResponsiveState.ts +64 -10
  669. package/src/state/Toolbar/computeResponsiveTargetState.ts +68 -18
  670. package/src/state/Toolbar/toolbarResponsiveConstants.ts +4 -0
  671. package/src/styles.global.css +1 -1
  672. package/src/version.ts +1 -1
@@ -0,0 +1,1288 @@
1
+ # useOptimisticActions
2
+
3
+ **Category:** Features/Actions/Updates
4
+
5
+ ## Design
6
+
7
+ ### Description
8
+
9
+ The `useOptimisticActions` is a hook used to manage optimistic actions for a collection. It provides functionality to perform optimistic CRUD operations on a collection of items, such as creating, updating, and deleting items, while awaiting confirmation from the server. This hook is particularly useful in scenarios where immediate feedback to the user is desired, even before the server has processed the action.
10
+
11
+ The hook receives two parameters:
12
+ - **collection** - The collection state object representing the data collection to perform optimistic actions on.
13
+
14
+ - **params** - Optional parameters to configure the behavior of the optimistic actions.
15
+
16
+ The hook returns an instance of [CollectionOptimisticActions](./?path=/story/features-actions-updates--collectionoptimisticactions), which encapsulates the optimistic actions for the provided collection.
17
+
18
+ ### Returns
19
+ [CollectionOptimisticActions](./?path=/story/features-actions-updates--collectionoptimisticactions)
20
+
21
+ ### Usage
22
+ The following example uses the `useOptimisticActions` hook to initialize optimistic actions for the `state.collection`. It also passed optional parameters to configure the behavior of optimistic actions, such as custom predicate logic for filtering items.
23
+ ```diff
24
+ - import { OffsetQuery, useTableCollection } from '@wix/patterns';
25
+ + import { OffsetQuery, useTableCollection, useOptimisticActions } from '@wix/patterns';
26
+
27
+ const state = useTableCollection({
28
+ fetchData: (query: OffsetQuery) => {
29
+ // server call to fetch data
30
+ },
31
+ });
32
+
33
+ + const optimisticActions = useOptimisticActions(state.collection, {
34
+ + orderBy: () => [],
35
+ + predicate: ({ filters }) => {
36
+ + // Custom predicate logic based on filters
37
+ + },
38
+ + });
39
+
40
+ const promoteContacts = () => {
41
+ - // show loading
42
+ - const response = (await Promise.all(
43
+ - contacts.map((contact) =>
44
+ - updateContact(
45
+ - contact._id as string,
46
+ - contact.info as contacts.ContactInfo,
47
+ - contact.revision as number,
48
+ - ),
49
+ - ),
50
+ - )) as contacts.UpdateContactResponse[];
51
+ -
52
+ - return response.map(({ contact }) => contact as contacts.Contact);
53
+
54
+ - // update collection
55
+ - // show result
56
+ + optimisticActions.updateMany(updatedContacts, {
57
+ + successToast: `${contacts.length} contacts updated`,
58
+ + submit: async (contacts) => {
59
+ + const response = (await Promise.all(
60
+ + contacts.map((contact) =>
61
+ + updateContact(
62
+ + contact._id as string,
63
+ + contact.info as contacts.ContactInfo,
64
+ + contact.revision as number,
65
+ + ),
66
+ + ),
67
+ + )) as contacts.UpdateContactResponse[];
68
+ +
69
+ + return response.map(({ contact }) => contact as contacts.Contact);
70
+ + },
71
+ + });
72
+ + };
73
+ ```
74
+
75
+
76
+
77
+
78
+ ```tsx
79
+ import { useOptimisticActions } from '@wix/patterns';
80
+ ```
81
+
82
+ ### Default behaviour
83
+
84
+ Default behaviour of create, update and delete.
85
+
86
+ ```tsx
87
+ import { Avatar } from '@wix/design-system';
88
+ import React from 'react';
89
+ import { CollectionPage } from '@wix/patterns/page';
90
+ import {
91
+ Table,
92
+ OffsetQuery,
93
+ PrimaryActionButton,
94
+ useTableCollection,
95
+ useOptimisticActions,
96
+ } from '@wix/patterns';
97
+ import { Delete } from '@wix/wix-ui-icons-common';
98
+ import { contacts } from '@wix/crm';
99
+
100
+ function DefaultBehaviour() {
101
+ const state = useTableCollection<contacts.Contact>({
102
+ queryName: 'contacts-DefaultBehaviour',
103
+ itemName: (item) => `${item.info?.name?.first} ${item.info?.name?.last}`,
104
+ fetchData: (query: OffsetQuery) => {
105
+ const { limit, offset, search, filters } = query;
106
+
107
+ let queryBuilder = contacts.queryContacts().limit(limit).skip(offset);
108
+
109
+ if (search) {
110
+ queryBuilder = queryBuilder.startsWith('info.name.first', search);
111
+ }
112
+
113
+ return queryBuilder.find().then(({ items = [], totalCount: total }) => ({
114
+ items,
115
+ total,
116
+ }));
117
+ },
118
+ fetchErrorMessage: () => 'Error fetching contacts',
119
+ });
120
+
121
+ const collection = state.collection;
122
+
123
+ const optimisticActions = useOptimisticActions(collection);
124
+
125
+ const _createContact = () => {
126
+ const newContact = {
127
+ id: new window.Date().toString(),
128
+ info: {
129
+ name: {
130
+ first: 'New',
131
+ last: 'Contact',
132
+ },
133
+ },
134
+ };
135
+
136
+ optimisticActions.createOne(newContact, {
137
+ submit: async (_contacts) => {
138
+ const response = (await Promise.all(
139
+ _contacts.map((contact) =>
140
+ contacts.createContact(contact.info as contacts.ContactInfo),
141
+ ),
142
+ )) as contacts.CreateContactResponse[];
143
+
144
+ return response.map(({ contact }) => contact as contacts.Contact);
145
+ },
146
+ });
147
+ };
148
+
149
+ const _updateContact = (contact: contacts.Contact) => {
150
+ const updatedContact = {
151
+ ...contact,
152
+ info: {
153
+ ...contact.info,
154
+ jobTitle: 'Ultimate',
155
+ },
156
+ };
157
+
158
+ optimisticActions.updateOne(updatedContact, {
159
+ submit: async (_contacts) => {
160
+ const response = (await Promise.all(
161
+ _contacts.map((contact) =>
162
+ contacts.updateContact(
163
+ contact._id as string,
164
+ contact.info as contacts.ContactInfo,
165
+ contact.revision as number,
166
+ ),
167
+ ),
168
+ )) as contacts.UpdateContactResponse[];
169
+
170
+ return response.map(({ contact }) => contact as contacts.Contact);
171
+ },
172
+ });
173
+ };
174
+
175
+ const _deleteContact = (contact: contacts.Contact) => {
176
+ optimisticActions.deleteOne(contact, {
177
+ submit: async (_contacts) =>
178
+ Promise.all(
179
+ _contacts.map((contact) =>
180
+ contacts.deleteContact(contact._id as string),
181
+ ),
182
+ ),
183
+ });
184
+ };
185
+
186
+ return (
187
+ <CollectionPage height="400px">
188
+ <CollectionPage.Header title={{ text: 'Contacts' }} />
189
+ <CollectionPage.Content>
190
+ <Table
191
+ state={collection}
192
+ primaryActionButton={<PrimaryActionButton onClick={_createContact} />}
193
+ columns={[
194
+ {
195
+ title: '',
196
+ width: '50px',
197
+ render: (contact) => (
198
+ <Avatar
199
+ name={`${contact.info?.name?.first} ${contact.info?.name?.last}`}
200
+ imgProps={{ src: contact.info?.picture?.image }}
201
+ />
202
+ ),
203
+ },
204
+ {
205
+ title: 'Name',
206
+ width: '250px',
207
+ render: (contact) =>
208
+ `${contact.info?.name?.first} ${contact.info?.name?.last}`,
209
+ },
210
+ {
211
+ title: 'Level',
212
+ render: (contact) => contact.info?.jobTitle,
213
+ },
214
+ {
215
+ title: 'Last Activity',
216
+ render: (contact) =>
217
+ contact.lastActivity?.activityDate?.toLocaleString(),
218
+ },
219
+ ]}
220
+ actionCell={(contact) => ({
221
+ primaryAction: {
222
+ text: 'Update',
223
+ onClick: () => {
224
+ _updateContact(contact);
225
+ },
226
+ },
227
+ secondaryActions: [
228
+ {
229
+ icon: <Delete />,
230
+ text: 'Delete',
231
+ onClick: () => {
232
+ _deleteContact(contact);
233
+ },
234
+ },
235
+ ],
236
+ })}
237
+ />
238
+ </CollectionPage.Content>
239
+ </CollectionPage>
240
+ );
241
+ }
242
+ ```
243
+
244
+ ### Success toast with undo
245
+
246
+ You have the option to postpone the server request, giving the user a few seconds to regret using "Undo" button.
247
+ You can also show a toast after the undo action with `showUndoSuccessToast`
248
+
249
+ ```tsx
250
+ import { Avatar } from '@wix/design-system';
251
+ import React from 'react';
252
+ import { CollectionPage } from '@wix/patterns/page';
253
+ import {
254
+ Table,
255
+ OffsetQuery,
256
+ PrimaryActionButton,
257
+ useTableCollection,
258
+ useOptimisticActions,
259
+ } from '@wix/patterns';
260
+ import { Delete } from '@wix/wix-ui-icons-common';
261
+ import { contacts } from '@wix/crm';
262
+
263
+ function UndoBeforeSending() {
264
+ const state = useTableCollection<contacts.Contact>({
265
+ queryName: 'contacts-UndoBeforeSending',
266
+ itemName: (item) => `${item.info?.name?.first} ${item.info?.name?.last}`,
267
+ fetchData: (query: OffsetQuery) => {
268
+ const { limit, offset, search, filters } = query;
269
+
270
+ let queryBuilder = contacts.queryContacts().limit(limit).skip(offset);
271
+
272
+ if (search) {
273
+ queryBuilder = queryBuilder.startsWith('info.name.first', search);
274
+ }
275
+
276
+ return queryBuilder.find().then(({ items = [], totalCount: total }) => ({
277
+ items,
278
+ total,
279
+ }));
280
+ },
281
+ fetchErrorMessage: () => 'Error fetching contacts',
282
+ });
283
+
284
+ const collection = state.collection;
285
+
286
+ const optimisticActions = useOptimisticActions(collection);
287
+
288
+ const _createContact = () => {
289
+ const newContact = {
290
+ id: new window.Date().toString(),
291
+ info: {
292
+ name: {
293
+ first: 'New',
294
+ last: 'Contact',
295
+ },
296
+ },
297
+ };
298
+
299
+ optimisticActions.createOne(newContact, {
300
+ showUndoToast: true,
301
+ showUndoSuccessToast: true,
302
+ successToast: 'New contact is created',
303
+ submit: async (_contacts) => {
304
+ const response = (await Promise.all(
305
+ _contacts.map((contact) =>
306
+ contacts.createContact(contact.info as contacts.ContactInfo),
307
+ ),
308
+ )) as contacts.CreateContactResponse[];
309
+
310
+ return response.map(({ contact }) => contact as contacts.Contact);
311
+ },
312
+ });
313
+ };
314
+
315
+ const _updateContact = (contact: contacts.Contact) => {
316
+ const updatedContact = {
317
+ ...contact,
318
+ info: {
319
+ ...contact.info,
320
+ jobTitle: 'Ultimate',
321
+ },
322
+ };
323
+
324
+ optimisticActions.updateOne(updatedContact, {
325
+ showUndoToast: true,
326
+ showUndoSuccessToast: true,
327
+ successToast: 'A contact has been updated',
328
+ submit: async (_contacts) => {
329
+ const response = (await Promise.all(
330
+ _contacts.map((contact) =>
331
+ contacts.updateContact(
332
+ contact._id as string,
333
+ contact.info as contacts.ContactInfo,
334
+ contact.revision as number,
335
+ ),
336
+ ),
337
+ )) as contacts.UpdateContactResponse[];
338
+
339
+ return response.map(({ contact }) => contact as contacts.Contact);
340
+ },
341
+ });
342
+ };
343
+
344
+ const _deleteContact = (contact: contacts.Contact) => {
345
+ optimisticActions.deleteOne(contact, {
346
+ showUndoToast: true,
347
+ showUndoSuccessToast: true,
348
+ successToast: 'A contact was deleted',
349
+ submit: async (_contacts) =>
350
+ Promise.all(
351
+ _contacts.map((contact) =>
352
+ contacts.deleteContact(contact._id as string),
353
+ ),
354
+ ),
355
+ });
356
+ };
357
+
358
+ return (
359
+ <CollectionPage height="400px">
360
+ <CollectionPage.Header title={{ text: 'Contacts' }} />
361
+ <CollectionPage.Content>
362
+ <Table
363
+ state={collection}
364
+ primaryActionButton={<PrimaryActionButton onClick={_createContact} />}
365
+ columns={[
366
+ {
367
+ title: '',
368
+ width: '50px',
369
+ render: (contact) => (
370
+ <Avatar
371
+ name={`${contact.info?.name?.first} ${contact.info?.name?.last}`}
372
+ imgProps={{ src: contact.info?.picture?.image }}
373
+ />
374
+ ),
375
+ },
376
+ {
377
+ title: 'Name',
378
+ width: '250px',
379
+ render: (contact) =>
380
+ `${contact.info?.name?.first} ${contact.info?.name?.last}`,
381
+ },
382
+ {
383
+ title: 'Level',
384
+ render: (contact) => contact.info?.jobTitle,
385
+ },
386
+ {
387
+ title: 'Last Activity',
388
+ render: (contact) =>
389
+ contact.lastActivity?.activityDate?.toLocaleString(),
390
+ },
391
+ ]}
392
+ actionCell={(contact) => ({
393
+ primaryAction: {
394
+ text: 'Update',
395
+ onClick: () => {
396
+ _updateContact(contact);
397
+ },
398
+ },
399
+ secondaryActions: [
400
+ {
401
+ icon: <Delete />,
402
+ text: 'Delete',
403
+ onClick: () => {
404
+ _deleteContact(contact);
405
+ },
406
+ },
407
+ ],
408
+ })}
409
+ />
410
+ </CollectionPage.Content>
411
+ </CollectionPage>
412
+ );
413
+ }
414
+ ```
415
+
416
+ ### Error handling and retries
417
+
418
+ In case of an error from the server, you can define what to show the user and what to do during it.
419
+ Additionally, you can allow the user the option to try to execute the action again
420
+
421
+ ```tsx
422
+ import { Avatar } from '@wix/design-system';
423
+ import React from 'react';
424
+ import { CollectionPage } from '@wix/patterns/page';
425
+ import {
426
+ Table,
427
+ OffsetQuery,
428
+ PrimaryActionButton,
429
+ useTableCollection,
430
+ useOptimisticActions,
431
+ } from '@wix/patterns';
432
+ import { Delete } from '@wix/wix-ui-icons-common';
433
+ import { contacts } from '@wix/crm';
434
+
435
+ function ErrorHandlingAndRetries() {
436
+
437
+ const state = useTableCollection<contacts.Contact>({
438
+ queryName: 'contacts-ErrorHandlingAndRetries',
439
+ itemName: (item) => `${item.info?.name?.first} ${item.info?.name?.last}`,
440
+ fetchData: (query: OffsetQuery) => {
441
+ const { limit, offset, search, filters } = query;
442
+
443
+ let queryBuilder = contacts.queryContacts().limit(limit).skip(offset);
444
+
445
+ if (search) {
446
+ queryBuilder = queryBuilder.startsWith('info.name.first', search);
447
+ }
448
+
449
+ return queryBuilder.find().then(({ items = [], totalCount: total }) => ({
450
+ items,
451
+ total,
452
+ }));
453
+ },
454
+ fetchErrorMessage: () => 'Error fetching contacts',
455
+ });
456
+
457
+ const collection = state.collection;
458
+
459
+ const optimisticActions = useOptimisticActions(collection);
460
+
461
+ const _createContact = () => {
462
+ const newContact = {
463
+ id: new window.Date().toString(),
464
+ info: {
465
+ name: {
466
+ first: 'New',
467
+ last: 'Contact',
468
+ },
469
+ },
470
+ };
471
+
472
+ optimisticActions.createOne(newContact, {
473
+ errorToast: (err) => 'failed to create a contact',
474
+ onError: (err) => {
475
+ // report error to server
476
+ console.log('error');
477
+ },
478
+ onTryAgain: () => {
479
+ // report error to server
480
+ console.log('try again');
481
+ },
482
+ submit: async (contacts) => {
483
+ return new Promise((resolve, reject) => {
484
+ window.setTimeout(() => {
485
+ reject(new Error('error'));
486
+ }, 1000);
487
+ });
488
+ },
489
+ });
490
+ };
491
+
492
+ const _updateContact = (contact: contacts.Contact) => {
493
+ const updatedContact = {
494
+ ...contact,
495
+ info: {
496
+ ...contact.info,
497
+ jobTitle: 'Ultimate',
498
+ },
499
+ };
500
+ optimisticActions.updateOne(updatedContact, {
501
+ errorToast: (err) => 'failed to update a contact',
502
+ onError: (err) => {
503
+ // report error to server
504
+ console.log('error');
505
+ },
506
+ onTryAgain: () => {
507
+ // report error to server
508
+ console.log('try again');
509
+ },
510
+ submit: async (contacts) => {
511
+ return new Promise((resolve, reject) => {
512
+ window.setTimeout(() => {
513
+ reject(new Error('error'));
514
+ }, 1000);
515
+ });
516
+ },
517
+ });
518
+ };
519
+
520
+ const _deleteContact = (contact: contacts.Contact) => {
521
+ optimisticActions.deleteOne(contact, {
522
+ errorToast: (err) => 'failed to delete a contact',
523
+ onError: (err) => {
524
+ // report error to server
525
+ console.log('error');
526
+ },
527
+ onTryAgain: () => {
528
+ // report error to server
529
+ console.log('try again');
530
+ },
531
+ submit: async (contacts) => {
532
+ return new Promise((resolve, reject) => {
533
+ window.setTimeout(() => {
534
+ reject(new Error('error'));
535
+ }, 1000);
536
+ });
537
+ },
538
+ });
539
+ };
540
+
541
+ return (
542
+ <CollectionPage height="400px">
543
+ <CollectionPage.Header title={{ text: 'Contacts' }} />
544
+ <CollectionPage.Content>
545
+ <Table
546
+ state={collection}
547
+ primaryActionButton={<PrimaryActionButton onClick={_createContact} />}
548
+ columns={[
549
+ {
550
+ title: '',
551
+ width: '50px',
552
+ render: (contact) => (
553
+ <Avatar
554
+ name={`${contact.info?.name?.first} ${contact.info?.name?.last}`}
555
+ imgProps={{ src: contact.info?.picture?.image }}
556
+ />
557
+ ),
558
+ },
559
+ {
560
+ title: 'Name',
561
+ width: '250px',
562
+ render: (contact) =>
563
+ `${contact.info?.name?.first} ${contact.info?.name?.last}`,
564
+ },
565
+ {
566
+ title: 'Level',
567
+ render: (contact) => contact.info?.jobTitle,
568
+ },
569
+ {
570
+ title: 'Last Activity',
571
+ render: (contact) =>
572
+ contact.lastActivity?.activityDate?.toLocaleString(),
573
+ },
574
+ ]}
575
+ actionCell={(contact) => ({
576
+ primaryAction: {
577
+ text: 'Update',
578
+ onClick: () => {
579
+ _updateContact(contact);
580
+ },
581
+ },
582
+ secondaryActions: [
583
+ {
584
+ icon: <Delete />,
585
+ text: 'Delete',
586
+ onClick: () => {
587
+ _deleteContact(contact);
588
+ },
589
+ },
590
+ ],
591
+ })}
592
+ />
593
+ </CollectionPage.Content>
594
+ </CollectionPage>
595
+ );
596
+ }
597
+ ```
598
+
599
+ ### Items orders
600
+
601
+ You can decide the orders of the item with `OrdeyBy`
602
+
603
+ ```tsx
604
+ import { Avatar } from '@wix/design-system';
605
+ import React from 'react';
606
+ import { CollectionPage } from '@wix/patterns/page';
607
+ import {
608
+ Table,
609
+ OffsetQuery,
610
+ PrimaryActionButton,
611
+ useTableCollection,
612
+ useOptimisticActions,
613
+ } from '@wix/patterns';
614
+ import { Delete } from '@wix/wix-ui-icons-common';
615
+ import { contacts } from '@wix/crm';
616
+
617
+ function UndoAfterSuccess() {
618
+ const state = useTableCollection<contacts.Contact>({
619
+ queryName: 'contacts-UndoAfterSuccess',
620
+ itemName: (item) => `${item.info?.name?.first} ${item.info?.name?.last}`,
621
+ fetchData: (query: OffsetQuery) => {
622
+ const { limit, offset, search, sort, filters } = query;
623
+
624
+ let queryBuilder = contacts.queryContacts().limit(limit).skip(offset);
625
+
626
+ if (search) {
627
+ queryBuilder = queryBuilder.startsWith('info.name.first', search);
628
+ }
629
+
630
+ queryBuilder = queryBuilder.ascending('info.name.first');
631
+
632
+ return queryBuilder.find().then(({ items = [], totalCount: total }) => ({
633
+ items,
634
+ total,
635
+ }));
636
+ },
637
+ fetchErrorMessage: () => 'Error fetching contacts',
638
+ });
639
+
640
+ const collection = state.collection;
641
+
642
+ const optimisticActions = useOptimisticActions(collection, {
643
+ orderBy: ({ sort }) => [
644
+ ...(sort || []),
645
+ {
646
+ fieldName: (item) => item.info?.name?.first || '',
647
+ order: 'asc',
648
+ },
649
+ ],
650
+ });
651
+
652
+ const _createContact = () => {
653
+ const newContact = {
654
+ id: new window.Date().toString(),
655
+ info: {
656
+ name: {
657
+ first: 'Aaa',
658
+ last: 'Contact',
659
+ },
660
+ },
661
+ };
662
+
663
+ optimisticActions.createOne(newContact, {
664
+ submit: async (_contacts) => {
665
+ const response = (await Promise.all(
666
+ _contacts.map((contact) =>
667
+ contacts.createContact(contact.info as contacts.ContactInfo),
668
+ ),
669
+ )) as contacts.CreateContactResponse[];
670
+
671
+ return response.map(({ contact }) => contact as contacts.Contact);
672
+ },
673
+ });
674
+ };
675
+
676
+ const _updateContact = (contact: contacts.Contact) => {
677
+ const updatedContact = {
678
+ ...contact,
679
+ info: {
680
+ ...contact.info,
681
+ jobTitle: 'Ultimate',
682
+ },
683
+ };
684
+
685
+ optimisticActions.updateOne(updatedContact, {
686
+ submit: async (_contacts) => {
687
+ const response = (await Promise.all(
688
+ _contacts.map((contact) =>
689
+ contacts.updateContact(
690
+ contact._id as string,
691
+ contact.info as contacts.ContactInfo,
692
+ contact.revision as number,
693
+ ),
694
+ ),
695
+ )) as contacts.UpdateContactResponse[];
696
+
697
+ return response.map(({ contact }) => contact as contacts.Contact);
698
+ },
699
+ });
700
+ };
701
+
702
+ const _deleteContact = (contact: contacts.Contact) => {
703
+ optimisticActions.deleteOne(contact, {
704
+ submit: async (_contacts) =>
705
+ Promise.all(
706
+ _contacts.map((contact) =>
707
+ contacts.deleteContact(contact._id as string),
708
+ ),
709
+ ),
710
+ });
711
+ };
712
+
713
+ return (
714
+ <CollectionPage height="400px">
715
+ <CollectionPage.Header title={{ text: 'Contacts' }} />
716
+ <CollectionPage.Content>
717
+ <Table
718
+ state={collection}
719
+ primaryActionButton={<PrimaryActionButton onClick={_createContact} />}
720
+ columns={[
721
+ {
722
+ title: '',
723
+ width: '50px',
724
+ render: (contact) => (
725
+ <Avatar
726
+ name={`${contact.info?.name?.first} ${contact.info?.name?.last}`}
727
+ imgProps={{ src: contact.info?.picture?.image }}
728
+ />
729
+ ),
730
+ },
731
+ {
732
+ title: 'Name',
733
+ width: '250px',
734
+ render: (contact) =>
735
+ `${contact.info?.name?.first} ${contact.info?.name?.last}`,
736
+ },
737
+ {
738
+ title: 'Level',
739
+ render: (contact) => contact.info?.jobTitle,
740
+ },
741
+ {
742
+ title: 'Last Activity',
743
+ render: (contact) =>
744
+ contact.lastActivity?.activityDate?.toLocaleString(),
745
+ },
746
+ ]}
747
+ actionCell={(contact) => ({
748
+ primaryAction: {
749
+ text: 'Update',
750
+ onClick: () => {
751
+ _updateContact(contact);
752
+ },
753
+ },
754
+ secondaryActions: [
755
+ {
756
+ icon: <Delete />,
757
+ text: 'Delete',
758
+ onClick: () => {
759
+ _deleteContact(contact);
760
+ },
761
+ },
762
+ ],
763
+ })}
764
+ />
765
+ </CollectionPage.Content>
766
+ </CollectionPage>
767
+ );
768
+ }
769
+ ```
770
+
771
+ ### Update with query
772
+
773
+ When you update the data when query exists (filters, search) you need to define `predicate` and `orderBy` in order to update the relevant items.
774
+ In this example, try to update the filtered items, remove the filters and see that only the filtered items were updated.
775
+
776
+ ```tsx
777
+ import { Avatar } from '@wix/design-system';
778
+ import React from 'react';
779
+ import { CollectionPage } from '@wix/patterns/page';
780
+ import {
781
+ BulkActionButton,
782
+ BulkActionToolbar,
783
+ CollectionToolbarFilters,
784
+ Filter,
785
+ Table,
786
+ MultiSelectCheckboxFilter,
787
+ OffsetQuery,
788
+ stringsArrayFilter,
789
+ useTableCollection,
790
+ useOptimisticActions,
791
+ useStaticListFilterCollection,
792
+ } from '@wix/patterns';
793
+ import {
794
+ bulkUpdateContacts,
795
+ queryContacts,
796
+ updateContact,
797
+ } from '@wix/ambassador-contacts-v4-contact/http';
798
+ import {
799
+ Contact,
800
+ ContactInfo,
801
+ UpdateContactRequest,
802
+ } from '@wix/ambassador-contacts-v4-contact/types';
803
+ import { useHttpClient } from '@wix/yoshi-flow-bm';
804
+
805
+ type ContactsFilters = {
806
+ level: Filter<string[]>;
807
+ };
808
+
809
+ function OrderBy() {
810
+ const httpClient = useHttpClient();
811
+
812
+ const state = useTableCollection<Contact, ContactsFilters>({
813
+ queryName: 'contacts-OrderBy',
814
+ fetchData: (query: OffsetQuery<ContactsFilters>) => {
815
+ const { limit, offset, search, filters } = query;
816
+ return httpClient
817
+ .request(
818
+ queryContacts({
819
+ query: { paging: { limit, offset }, filter: filters },
820
+ search,
821
+ }),
822
+ )
823
+ .then(({ data: { contacts = [], pagingMetadata } }) => ({
824
+ items: contacts,
825
+ total: pagingMetadata?.total,
826
+ }));
827
+ },
828
+ itemKey: (item) => item.id as string,
829
+ itemName: (item) => item.name as string,
830
+ fetchErrorMessage: () => 'Error fetching contacts',
831
+ filters: {
832
+ level: stringsArrayFilter({
833
+ initialValue: ['Beginner'],
834
+ }),
835
+ },
836
+ });
837
+
838
+ const collection = state.collection;
839
+
840
+ const optimisticActions = useOptimisticActions(collection, {
841
+ predicate: ({ filters }) => {
842
+ const { level } = filters;
843
+ return (item) => {
844
+ if (level && !level.some((level) => level === String(item.level))) {
845
+ return false;
846
+ }
847
+ return true;
848
+ };
849
+ },
850
+ orderBy: ({ sort }) => [
851
+ ...(sort || []),
852
+ {
853
+ fieldName: (item) => item.createdDate || new Date(0),
854
+ order: 'desc',
855
+ },
856
+ ],
857
+ });
858
+
859
+ const _updateContacts = (
860
+ contacts: Contact[],
861
+ { allSelected, total }: { allSelected: boolean; total: number },
862
+ ) => {
863
+ if (allSelected) {
864
+ const newNameContact = { name: 'new name' } as Partial<Contact>;
865
+
866
+ optimisticActions.updateAll(newNameContact, {
867
+ successToast: `${total} contacts changed`,
868
+ submit: () =>
869
+ httpClient.request(
870
+ bulkUpdateContacts({
871
+ filter: {
872
+ level: collection.filters.level.value,
873
+ },
874
+ info: newNameContact as ContactInfo,
875
+ }),
876
+ ),
877
+ });
878
+ } else {
879
+ const updatedContacts = contacts.map((c) => ({ ...c, name: 'new name' }));
880
+
881
+ optimisticActions.updateMany(updatedContacts, {
882
+ successToast: `${contacts.length} contacts changed`,
883
+ submit: (contacts) =>
884
+ Promise.all(
885
+ contacts.map((contact) =>
886
+ httpClient.request(
887
+ updateContact(contact as UpdateContactRequest),
888
+ ),
889
+ ),
890
+ ),
891
+ });
892
+ }
893
+ };
894
+
895
+ const levelsCollection = useStaticListFilterCollection(
896
+ collection.filters.level,
897
+ [
898
+ 'Beginner',
899
+ 'Amateur',
900
+ 'Semi-Pro',
901
+ 'Professional',
902
+ 'World Class',
903
+ 'Legendary',
904
+ 'Ultimate',
905
+ ],
906
+ );
907
+
908
+ return (
909
+ <CollectionPage height="400px">
910
+ <CollectionPage.Header title={{ text: 'Contacts' }} />
911
+ <CollectionPage.Content>
912
+ <Table
913
+ state={collection}
914
+ columns={[
915
+ {
916
+ title: '',
917
+ width: '50px',
918
+ render: (contact) => (
919
+ <Avatar name={contact.name} imgProps={{ src: contact.image }} />
920
+ ),
921
+ },
922
+ {
923
+ title: 'Name',
924
+ width: '250px',
925
+ render: (contact) => contact.name,
926
+ },
927
+ {
928
+ title: 'Level',
929
+ render: (contact) => contact.level,
930
+ },
931
+ {
932
+ title: 'Last Seen',
933
+ render: (contact) => contact.lastSeen?.toLocaleString(),
934
+ },
935
+ ]}
936
+ filters={
937
+ <CollectionToolbarFilters>
938
+ <MultiSelectCheckboxFilter
939
+ accordionItemProps={{ label: 'Level' }}
940
+ popoverProps={{ appendTo: 'window' }}
941
+ filter={collection.filters.level!}
942
+ collection={levelsCollection}
943
+ renderItem={(level) => ({ title: level })}
944
+ />
945
+ </CollectionToolbarFilters>
946
+ }
947
+ showSelection
948
+ bulkActionToolbar={({
949
+ selectedValues,
950
+ clearSelection,
951
+ allSelected,
952
+ total,
953
+ }) => (
954
+ <BulkActionToolbar
955
+ actionButton={
956
+ <BulkActionButton
957
+ onClick={() => {
958
+ _updateContacts(selectedValues, { allSelected, total });
959
+ clearSelection();
960
+ }}
961
+ >
962
+ Update Contacts' Names
963
+ </BulkActionButton>
964
+ }
965
+ />
966
+ )}
967
+ />
968
+ </CollectionPage.Content>
969
+ </CollectionPage>
970
+ );
971
+ }
972
+ ```
973
+
974
+ ### Revision handling
975
+
976
+ In case your server works with revision, you can need to update the revision by yourself
977
+
978
+ ```tsx
979
+ import { Avatar } from '@wix/design-system';
980
+ import React from 'react';
981
+ import { CollectionPage } from '@wix/patterns/page';
982
+ import {
983
+ Table,
984
+ OffsetQuery,
985
+ useTableCollection,
986
+ useOptimisticActions,
987
+ } from '@wix/patterns';
988
+ import { contacts } from '@wix/crm';
989
+
990
+ function RevisionHandling() {
991
+ const state = useTableCollection<contacts.Contact>({
992
+ queryName: 'contacts-RevisionHandling',
993
+ itemName: (item) => `${item.info?.name?.first} ${item.info?.name?.last}`,
994
+ fetchData: (query: OffsetQuery) => {
995
+ const { limit, offset, search, filters } = query;
996
+
997
+ let queryBuilder = contacts.queryContacts().limit(limit).skip(offset);
998
+
999
+ if (search) {
1000
+ queryBuilder = queryBuilder.startsWith('info.name.first', search);
1001
+ }
1002
+
1003
+ return queryBuilder.find().then(({ items = [], totalCount: total }) => ({
1004
+ items,
1005
+ total,
1006
+ }));
1007
+ },
1008
+ fetchErrorMessage: () => 'Error fetching contacts',
1009
+ });
1010
+
1011
+ const collection = state.collection;
1012
+
1013
+ const optimisticActions = useOptimisticActions(collection);
1014
+
1015
+ const _updateContact = (contact: contacts.Contact) => {
1016
+ const updatedContact = {
1017
+ ...contact,
1018
+ info: {
1019
+ ...contact.info,
1020
+ jobTitle: 'Ultimate',
1021
+ },
1022
+ revision: +contact.revision! + 1,
1023
+ } as Partial<contacts.Contact>;
1024
+
1025
+ optimisticActions.updateOne(updatedContact, {
1026
+ submit: async (_contacts) => {
1027
+ const response = (await Promise.all(
1028
+ _contacts.map((contact) =>
1029
+ contacts.updateContact(
1030
+ contact._id as string,
1031
+ contact.info as contacts.ContactInfo,
1032
+ contact.revision as number,
1033
+ ),
1034
+ ),
1035
+ )) as contacts.UpdateContactResponse[];
1036
+
1037
+ return response.map(({ contact }) => contact as contacts.Contact);
1038
+ },
1039
+ });
1040
+ };
1041
+
1042
+ return (
1043
+ <CollectionPage height="400px">
1044
+ <CollectionPage.Header title={{ text: 'Contacts' }} />
1045
+ <CollectionPage.Content>
1046
+ <Table
1047
+ state={collection}
1048
+ columns={[
1049
+ {
1050
+ title: '',
1051
+ width: '50px',
1052
+ render: (contact) => (
1053
+ <Avatar
1054
+ name={`${contact.info?.name?.first} ${contact.info?.name?.last}`}
1055
+ imgProps={{ src: contact.info?.picture?.image }}
1056
+ />
1057
+ ),
1058
+ },
1059
+ {
1060
+ title: 'Name',
1061
+ width: '250px',
1062
+ render: (contact) =>
1063
+ `${contact.info?.name?.first} ${contact.info?.name?.last}`,
1064
+ },
1065
+ {
1066
+ title: 'Level',
1067
+ render: (contact) => contact.info?.jobTitle,
1068
+ },
1069
+ {
1070
+ title: 'Last Activity',
1071
+ render: (contact) =>
1072
+ contact.lastActivity?.activityDate?.toLocaleString(),
1073
+ },
1074
+ ]}
1075
+ actionCell={(contact) => ({
1076
+ primaryAction: {
1077
+ text: 'Update',
1078
+ onClick: () => {
1079
+ _updateContact(contact);
1080
+ },
1081
+ },
1082
+ })}
1083
+ />
1084
+ </CollectionPage.Content>
1085
+ </CollectionPage>
1086
+ );
1087
+ }
1088
+ ```
1089
+
1090
+ ### Custom error handling
1091
+
1092
+ You can define your own error handling wirh errorToast prop
1093
+
1094
+ ```tsx
1095
+ import { Avatar } from '@wix/design-system';
1096
+ import React from 'react';
1097
+ import { CollectionPage } from '@wix/patterns/page';
1098
+ import {
1099
+ Table,
1100
+ OffsetQuery,
1101
+ PrimaryActionButton,
1102
+ useTableCollection,
1103
+ useOptimisticActions,
1104
+ } from '@wix/patterns';
1105
+ import { Delete } from '@wix/wix-ui-icons-common';
1106
+ import { contacts } from '@wix/crm';
1107
+
1108
+ function CustomErrorHandling() {
1109
+
1110
+ const state = useTableCollection<contacts.Contact>({
1111
+ queryName: 'contacts-CustomErrorHandling',
1112
+ itemName: (item) => `${item.info?.name?.first} ${item.info?.name?.last}`,
1113
+ fetchData: (query: OffsetQuery) => {
1114
+ const { limit, offset, search } = query;
1115
+
1116
+ let queryBuilder = contacts.queryContacts().limit(limit).skip(offset);
1117
+
1118
+ if (search) {
1119
+ queryBuilder = queryBuilder.startsWith('info.name.first', search);
1120
+ }
1121
+
1122
+ return queryBuilder.find().then(({ items = [], totalCount: total }) => ({
1123
+ items,
1124
+ total,
1125
+ }));
1126
+ },
1127
+ fetchErrorMessage: () => 'Error fetching contacts',
1128
+ });
1129
+
1130
+ const collection = state.collection;
1131
+
1132
+ const optimisticActions = useOptimisticActions(collection);
1133
+
1134
+ const _createContact = () => {
1135
+ const newContact = {
1136
+ id: new window.Date().toString(),
1137
+ info: {
1138
+ name: {
1139
+ first: 'New',
1140
+ last: 'Contact',
1141
+ },
1142
+ },
1143
+ };
1144
+
1145
+ optimisticActions.createOne(newContact, {
1146
+ errorToast: (err, { retry }) => ({
1147
+ message: 'failed to create a contact',
1148
+ action: {
1149
+ text: 'My custom action',
1150
+ onClick: () => {
1151
+ retry();
1152
+ console.log('retry');
1153
+ },
1154
+ },
1155
+ }),
1156
+ submit: async (contacts) => {
1157
+ return new Promise((resolve, reject) => {
1158
+ window.setTimeout(() => {
1159
+ reject(new Error('error'));
1160
+ }, 1000);
1161
+ });
1162
+ },
1163
+ });
1164
+ };
1165
+
1166
+ const _updateContact = (contact: contacts.Contact) => {
1167
+ const updatedContact = {
1168
+ ...contact,
1169
+ info: {
1170
+ ...contact.info,
1171
+ jobTitle: 'Ultimate',
1172
+ },
1173
+ };
1174
+ optimisticActions.updateOne(updatedContact, {
1175
+ errorToast: (err, { retry }) => ({
1176
+ message: 'failed to update a contact',
1177
+ action: {
1178
+ text: 'My custom action',
1179
+ onClick: () => {
1180
+ retry();
1181
+ console.log('retry');
1182
+ },
1183
+ },
1184
+ }),
1185
+ submit: async (contacts) => {
1186
+ return new Promise((resolve, reject) => {
1187
+ window.setTimeout(() => {
1188
+ reject(new Error('error'));
1189
+ }, 1000);
1190
+ });
1191
+ },
1192
+ });
1193
+ };
1194
+
1195
+ const _deleteContact = (contact: contacts.Contact) => {
1196
+ optimisticActions.deleteOne(contact, {
1197
+ errorToast: (err, { retry }) => ({
1198
+ message: 'failed to delete a contact',
1199
+ action: {
1200
+ text: 'My custom action',
1201
+ onClick: () => {
1202
+ retry();
1203
+ console.log('retry');
1204
+ },
1205
+ },
1206
+ }),
1207
+ submit: async (contacts) => {
1208
+ return new Promise((resolve, reject) => {
1209
+ window.setTimeout(() => {
1210
+ reject(new Error('error'));
1211
+ }, 1000);
1212
+ });
1213
+ },
1214
+ });
1215
+ };
1216
+
1217
+ return (
1218
+ <CollectionPage height="400px">
1219
+ <CollectionPage.Header title={{ text: 'Contacts' }} />
1220
+ <CollectionPage.Content>
1221
+ <Table
1222
+ state={collection}
1223
+ primaryActionButton={<PrimaryActionButton onClick={_createContact} />}
1224
+ columns={[
1225
+ {
1226
+ title: '',
1227
+ width: '50px',
1228
+ render: (contact) => (
1229
+ <Avatar
1230
+ name={`${contact.info?.name?.first} ${contact.info?.name?.last}`}
1231
+ imgProps={{ src: contact.info?.picture?.image }}
1232
+ />
1233
+ ),
1234
+ },
1235
+ {
1236
+ title: 'Name',
1237
+ width: '250px',
1238
+ render: (contact) =>
1239
+ `${contact.info?.name?.first} ${contact.info?.name?.last}`,
1240
+ },
1241
+ {
1242
+ title: 'Level',
1243
+ render: (contact) => contact.info?.jobTitle,
1244
+ },
1245
+ {
1246
+ title: 'Last Activity',
1247
+ render: (contact) =>
1248
+ contact.lastActivity?.activityDate?.toLocaleString(),
1249
+ },
1250
+ ]}
1251
+ actionCell={(contact) => ({
1252
+ primaryAction: {
1253
+ text: 'Update',
1254
+ onClick: () => {
1255
+ _updateContact(contact);
1256
+ },
1257
+ },
1258
+ secondaryActions: [
1259
+ {
1260
+ icon: <Delete />,
1261
+ text: 'Delete',
1262
+ onClick: () => {
1263
+ _deleteContact(contact);
1264
+ },
1265
+ },
1266
+ ],
1267
+ })}
1268
+ />
1269
+ </CollectionPage.Content>
1270
+ </CollectionPage>
1271
+ );
1272
+ }
1273
+ ```
1274
+
1275
+ ## API
1276
+
1277
+ ### Props
1278
+
1279
+ | Prop | Type | Required | Default | Description |
1280
+ |------|------|----------|---------|-------------|
1281
+ | `collection` | `CollectionState<T, F>` | No | - | The collection state object representing the data collection to perform optimistic actions on |
1282
+ | `predicate` | `((computedQuery: ComputedQuery<F>) => (item: T) => boolean)` | No | - | A function that simulates the filtering in the server. The function should return another function that accepts an item, and return a boolean that indicates whether the item passes the query filters or not. @param computedQuery - The computed query object. |
1283
+ | `orderBy` | `((computedQuery: ComputedQuery<F>) => Order<T>[])` | No | - | A function that simulates the ordering of the items in the server.<br> The function should return a list of rules in the form of `{fieldName: string; order: 'asc' \| 'desc';}` to order the items by @param computedQuery - The computed query object. |
1284
+ | `createdAt` | `((item: T) => Date)` | No | - | A function to retrieve the creation date of an item. @param item - The item. |
1285
+ | `batchWait` | `number` | No | `0` | Time to wait before batching multiple `updateMany` calls into a single server call. |
1286
+ | `noInvalidate` | `boolean` | No | - | Indicates whether to refresh the current page without invalidating the cache. |
1287
+ | `cacheNamespace` | `string` | No | - | Adds a namespace to the cache key. |
1288
+