@workday/canvas-kit-react 9.0.0-alpha.415-next.17 → 9.0.0-alpha.417-next.19

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 (192) hide show
  1. package/collection/index.ts +1 -0
  2. package/collection/lib/useCursorListModel.tsx +17 -18
  3. package/collection/lib/useListItemAllowChildStrings.ts +3 -3
  4. package/collection/lib/useListItemRovingFocus.tsx +26 -7
  5. package/collection/lib/useListLoader.ts +313 -0
  6. package/dist/commonjs/action-bar/lib/ActionBar.d.ts +427 -124
  7. package/dist/commonjs/action-bar/lib/ActionBar.d.ts.map +1 -1
  8. package/dist/commonjs/action-bar/lib/ActionBarItem.d.ts +21 -12
  9. package/dist/commonjs/action-bar/lib/ActionBarItem.d.ts.map +1 -1
  10. package/dist/commonjs/action-bar/lib/ActionBarList.d.ts +21 -12
  11. package/dist/commonjs/action-bar/lib/ActionBarList.d.ts.map +1 -1
  12. package/dist/commonjs/action-bar/lib/ActionBarOverflowButton.d.ts +28 -16
  13. package/dist/commonjs/action-bar/lib/ActionBarOverflowButton.d.ts.map +1 -1
  14. package/dist/commonjs/action-bar/lib/useActionBarModel.d.ts +205 -52
  15. package/dist/commonjs/action-bar/lib/useActionBarModel.d.ts.map +1 -1
  16. package/dist/commonjs/breadcrumbs/lib/Breadcrumbs.d.ts +448 -136
  17. package/dist/commonjs/breadcrumbs/lib/Breadcrumbs.d.ts.map +1 -1
  18. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsCurrentItem.d.ts +28 -16
  19. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsCurrentItem.d.ts.map +1 -1
  20. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsItem.d.ts +21 -12
  21. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsItem.d.ts.map +1 -1
  22. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsList.d.ts +14 -8
  23. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsList.d.ts.map +1 -1
  24. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsMenu.d.ts +208 -64
  25. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsMenu.d.ts.map +1 -1
  26. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsOverflowButton.d.ts +28 -16
  27. package/dist/commonjs/breadcrumbs/lib/BreadcrumbsOverflowButton.d.ts.map +1 -1
  28. package/dist/commonjs/breadcrumbs/lib/hooks/useBreadcrumbsModel.d.ts +205 -52
  29. package/dist/commonjs/breadcrumbs/lib/hooks/useBreadcrumbsModel.d.ts.map +1 -1
  30. package/dist/commonjs/collection/index.d.ts +1 -0
  31. package/dist/commonjs/collection/index.d.ts.map +1 -1
  32. package/dist/commonjs/collection/index.js +1 -0
  33. package/dist/commonjs/collection/lib/ListBox.d.ts +162 -48
  34. package/dist/commonjs/collection/lib/ListBox.d.ts.map +1 -1
  35. package/dist/commonjs/collection/lib/useCursorListModel.d.ts +354 -56
  36. package/dist/commonjs/collection/lib/useCursorListModel.d.ts.map +1 -1
  37. package/dist/commonjs/collection/lib/useCursorListModel.js +12 -15
  38. package/dist/commonjs/collection/lib/useGridModel.d.ts +155 -44
  39. package/dist/commonjs/collection/lib/useGridModel.d.ts.map +1 -1
  40. package/dist/commonjs/collection/lib/useListItemAllowChildStrings.d.ts +10 -7
  41. package/dist/commonjs/collection/lib/useListItemAllowChildStrings.d.ts.map +1 -1
  42. package/dist/commonjs/collection/lib/useListItemAllowChildStrings.js +3 -3
  43. package/dist/commonjs/collection/lib/useListItemRegister.d.ts +7 -4
  44. package/dist/commonjs/collection/lib/useListItemRegister.d.ts.map +1 -1
  45. package/dist/commonjs/collection/lib/useListItemRovingFocus.d.ts +7 -5
  46. package/dist/commonjs/collection/lib/useListItemRovingFocus.d.ts.map +1 -1
  47. package/dist/commonjs/collection/lib/useListItemRovingFocus.js +21 -8
  48. package/dist/commonjs/collection/lib/useListItemSelect.d.ts +7 -4
  49. package/dist/commonjs/collection/lib/useListItemSelect.d.ts.map +1 -1
  50. package/dist/commonjs/collection/lib/useListLoader.d.ts +67 -0
  51. package/dist/commonjs/collection/lib/useListLoader.d.ts.map +1 -0
  52. package/dist/commonjs/collection/lib/useListLoader.js +213 -0
  53. package/dist/commonjs/collection/lib/useListModel.d.ts +155 -44
  54. package/dist/commonjs/collection/lib/useListModel.d.ts.map +1 -1
  55. package/dist/commonjs/collection/lib/useListResetCursorOnBlur.d.ts +7 -4
  56. package/dist/commonjs/collection/lib/useListResetCursorOnBlur.d.ts.map +1 -1
  57. package/dist/commonjs/collection/lib/useOverflowListItemMeasure.d.ts +7 -4
  58. package/dist/commonjs/collection/lib/useOverflowListItemMeasure.d.ts.map +1 -1
  59. package/dist/commonjs/collection/lib/useOverflowListMeasure.d.ts +7 -4
  60. package/dist/commonjs/collection/lib/useOverflowListMeasure.d.ts.map +1 -1
  61. package/dist/commonjs/collection/lib/useOverflowListModel.d.ts +191 -44
  62. package/dist/commonjs/collection/lib/useOverflowListModel.d.ts.map +1 -1
  63. package/dist/commonjs/collection/lib/useOverflowListTarget.d.ts +7 -4
  64. package/dist/commonjs/collection/lib/useOverflowListTarget.d.ts.map +1 -1
  65. package/dist/commonjs/collection/lib/useSelectionListModel.d.ts +155 -44
  66. package/dist/commonjs/collection/lib/useSelectionListModel.d.ts.map +1 -1
  67. package/dist/commonjs/menu/lib/Menu.d.ts +201 -60
  68. package/dist/commonjs/menu/lib/Menu.d.ts.map +1 -1
  69. package/dist/commonjs/menu/lib/MenuCard.d.ts +14 -8
  70. package/dist/commonjs/menu/lib/MenuCard.d.ts.map +1 -1
  71. package/dist/commonjs/menu/lib/MenuContextTarget.d.ts +21 -12
  72. package/dist/commonjs/menu/lib/MenuContextTarget.d.ts.map +1 -1
  73. package/dist/commonjs/menu/lib/MenuItem.d.ts +14 -9
  74. package/dist/commonjs/menu/lib/MenuItem.d.ts.map +1 -1
  75. package/dist/commonjs/menu/lib/MenuList.d.ts +14 -8
  76. package/dist/commonjs/menu/lib/MenuList.d.ts.map +1 -1
  77. package/dist/commonjs/menu/lib/MenuPopper.d.ts +7 -4
  78. package/dist/commonjs/menu/lib/MenuPopper.d.ts.map +1 -1
  79. package/dist/commonjs/menu/lib/MenuTarget.d.ts +35 -20
  80. package/dist/commonjs/menu/lib/MenuTarget.d.ts.map +1 -1
  81. package/dist/commonjs/menu/lib/useMenuModel.d.ts +173 -44
  82. package/dist/commonjs/menu/lib/useMenuModel.d.ts.map +1 -1
  83. package/dist/commonjs/tabs/lib/Tabs.d.ts +626 -176
  84. package/dist/commonjs/tabs/lib/Tabs.d.ts.map +1 -1
  85. package/dist/commonjs/tabs/lib/TabsItem.d.ts +28 -17
  86. package/dist/commonjs/tabs/lib/TabsItem.d.ts.map +1 -1
  87. package/dist/commonjs/tabs/lib/TabsList.d.ts +28 -16
  88. package/dist/commonjs/tabs/lib/TabsList.d.ts.map +1 -1
  89. package/dist/commonjs/tabs/lib/TabsMenuPopper.d.ts +7 -4
  90. package/dist/commonjs/tabs/lib/TabsMenuPopper.d.ts.map +1 -1
  91. package/dist/commonjs/tabs/lib/TabsOverflowButton.d.ts +28 -16
  92. package/dist/commonjs/tabs/lib/TabsOverflowButton.d.ts.map +1 -1
  93. package/dist/commonjs/tabs/lib/TabsPanel.d.ts +28 -16
  94. package/dist/commonjs/tabs/lib/TabsPanel.d.ts.map +1 -1
  95. package/dist/commonjs/tabs/lib/TabsPanels.d.ts +14 -8
  96. package/dist/commonjs/tabs/lib/TabsPanels.d.ts.map +1 -1
  97. package/dist/commonjs/tabs/lib/useTabsModel.d.ts +521 -116
  98. package/dist/commonjs/tabs/lib/useTabsModel.d.ts.map +1 -1
  99. package/dist/es6/action-bar/lib/ActionBar.d.ts +427 -124
  100. package/dist/es6/action-bar/lib/ActionBar.d.ts.map +1 -1
  101. package/dist/es6/action-bar/lib/ActionBarItem.d.ts +21 -12
  102. package/dist/es6/action-bar/lib/ActionBarItem.d.ts.map +1 -1
  103. package/dist/es6/action-bar/lib/ActionBarList.d.ts +21 -12
  104. package/dist/es6/action-bar/lib/ActionBarList.d.ts.map +1 -1
  105. package/dist/es6/action-bar/lib/ActionBarOverflowButton.d.ts +28 -16
  106. package/dist/es6/action-bar/lib/ActionBarOverflowButton.d.ts.map +1 -1
  107. package/dist/es6/action-bar/lib/useActionBarModel.d.ts +205 -52
  108. package/dist/es6/action-bar/lib/useActionBarModel.d.ts.map +1 -1
  109. package/dist/es6/breadcrumbs/lib/Breadcrumbs.d.ts +448 -136
  110. package/dist/es6/breadcrumbs/lib/Breadcrumbs.d.ts.map +1 -1
  111. package/dist/es6/breadcrumbs/lib/BreadcrumbsCurrentItem.d.ts +28 -16
  112. package/dist/es6/breadcrumbs/lib/BreadcrumbsCurrentItem.d.ts.map +1 -1
  113. package/dist/es6/breadcrumbs/lib/BreadcrumbsItem.d.ts +21 -12
  114. package/dist/es6/breadcrumbs/lib/BreadcrumbsItem.d.ts.map +1 -1
  115. package/dist/es6/breadcrumbs/lib/BreadcrumbsList.d.ts +14 -8
  116. package/dist/es6/breadcrumbs/lib/BreadcrumbsList.d.ts.map +1 -1
  117. package/dist/es6/breadcrumbs/lib/BreadcrumbsMenu.d.ts +208 -64
  118. package/dist/es6/breadcrumbs/lib/BreadcrumbsMenu.d.ts.map +1 -1
  119. package/dist/es6/breadcrumbs/lib/BreadcrumbsOverflowButton.d.ts +28 -16
  120. package/dist/es6/breadcrumbs/lib/BreadcrumbsOverflowButton.d.ts.map +1 -1
  121. package/dist/es6/breadcrumbs/lib/hooks/useBreadcrumbsModel.d.ts +205 -52
  122. package/dist/es6/breadcrumbs/lib/hooks/useBreadcrumbsModel.d.ts.map +1 -1
  123. package/dist/es6/collection/index.d.ts +1 -0
  124. package/dist/es6/collection/index.d.ts.map +1 -1
  125. package/dist/es6/collection/index.js +1 -0
  126. package/dist/es6/collection/lib/ListBox.d.ts +162 -48
  127. package/dist/es6/collection/lib/ListBox.d.ts.map +1 -1
  128. package/dist/es6/collection/lib/useCursorListModel.d.ts +354 -56
  129. package/dist/es6/collection/lib/useCursorListModel.d.ts.map +1 -1
  130. package/dist/es6/collection/lib/useCursorListModel.js +12 -15
  131. package/dist/es6/collection/lib/useGridModel.d.ts +155 -44
  132. package/dist/es6/collection/lib/useGridModel.d.ts.map +1 -1
  133. package/dist/es6/collection/lib/useListItemAllowChildStrings.d.ts +10 -7
  134. package/dist/es6/collection/lib/useListItemAllowChildStrings.d.ts.map +1 -1
  135. package/dist/es6/collection/lib/useListItemAllowChildStrings.js +3 -3
  136. package/dist/es6/collection/lib/useListItemRegister.d.ts +7 -4
  137. package/dist/es6/collection/lib/useListItemRegister.d.ts.map +1 -1
  138. package/dist/es6/collection/lib/useListItemRovingFocus.d.ts +7 -5
  139. package/dist/es6/collection/lib/useListItemRovingFocus.d.ts.map +1 -1
  140. package/dist/es6/collection/lib/useListItemRovingFocus.js +21 -8
  141. package/dist/es6/collection/lib/useListItemSelect.d.ts +7 -4
  142. package/dist/es6/collection/lib/useListItemSelect.d.ts.map +1 -1
  143. package/dist/es6/collection/lib/useListLoader.d.ts +67 -0
  144. package/dist/es6/collection/lib/useListLoader.d.ts.map +1 -0
  145. package/dist/es6/collection/lib/useListLoader.js +204 -0
  146. package/dist/es6/collection/lib/useListModel.d.ts +155 -44
  147. package/dist/es6/collection/lib/useListModel.d.ts.map +1 -1
  148. package/dist/es6/collection/lib/useListResetCursorOnBlur.d.ts +7 -4
  149. package/dist/es6/collection/lib/useListResetCursorOnBlur.d.ts.map +1 -1
  150. package/dist/es6/collection/lib/useOverflowListItemMeasure.d.ts +7 -4
  151. package/dist/es6/collection/lib/useOverflowListItemMeasure.d.ts.map +1 -1
  152. package/dist/es6/collection/lib/useOverflowListMeasure.d.ts +7 -4
  153. package/dist/es6/collection/lib/useOverflowListMeasure.d.ts.map +1 -1
  154. package/dist/es6/collection/lib/useOverflowListModel.d.ts +191 -44
  155. package/dist/es6/collection/lib/useOverflowListModel.d.ts.map +1 -1
  156. package/dist/es6/collection/lib/useOverflowListTarget.d.ts +7 -4
  157. package/dist/es6/collection/lib/useOverflowListTarget.d.ts.map +1 -1
  158. package/dist/es6/collection/lib/useSelectionListModel.d.ts +155 -44
  159. package/dist/es6/collection/lib/useSelectionListModel.d.ts.map +1 -1
  160. package/dist/es6/menu/lib/Menu.d.ts +201 -60
  161. package/dist/es6/menu/lib/Menu.d.ts.map +1 -1
  162. package/dist/es6/menu/lib/MenuCard.d.ts +14 -8
  163. package/dist/es6/menu/lib/MenuCard.d.ts.map +1 -1
  164. package/dist/es6/menu/lib/MenuContextTarget.d.ts +21 -12
  165. package/dist/es6/menu/lib/MenuContextTarget.d.ts.map +1 -1
  166. package/dist/es6/menu/lib/MenuItem.d.ts +14 -9
  167. package/dist/es6/menu/lib/MenuItem.d.ts.map +1 -1
  168. package/dist/es6/menu/lib/MenuList.d.ts +14 -8
  169. package/dist/es6/menu/lib/MenuList.d.ts.map +1 -1
  170. package/dist/es6/menu/lib/MenuPopper.d.ts +7 -4
  171. package/dist/es6/menu/lib/MenuPopper.d.ts.map +1 -1
  172. package/dist/es6/menu/lib/MenuTarget.d.ts +35 -20
  173. package/dist/es6/menu/lib/MenuTarget.d.ts.map +1 -1
  174. package/dist/es6/menu/lib/useMenuModel.d.ts +173 -44
  175. package/dist/es6/menu/lib/useMenuModel.d.ts.map +1 -1
  176. package/dist/es6/tabs/lib/Tabs.d.ts +626 -176
  177. package/dist/es6/tabs/lib/Tabs.d.ts.map +1 -1
  178. package/dist/es6/tabs/lib/TabsItem.d.ts +28 -17
  179. package/dist/es6/tabs/lib/TabsItem.d.ts.map +1 -1
  180. package/dist/es6/tabs/lib/TabsList.d.ts +28 -16
  181. package/dist/es6/tabs/lib/TabsList.d.ts.map +1 -1
  182. package/dist/es6/tabs/lib/TabsMenuPopper.d.ts +7 -4
  183. package/dist/es6/tabs/lib/TabsMenuPopper.d.ts.map +1 -1
  184. package/dist/es6/tabs/lib/TabsOverflowButton.d.ts +28 -16
  185. package/dist/es6/tabs/lib/TabsOverflowButton.d.ts.map +1 -1
  186. package/dist/es6/tabs/lib/TabsPanel.d.ts +28 -16
  187. package/dist/es6/tabs/lib/TabsPanel.d.ts.map +1 -1
  188. package/dist/es6/tabs/lib/TabsPanels.d.ts +14 -8
  189. package/dist/es6/tabs/lib/TabsPanels.d.ts.map +1 -1
  190. package/dist/es6/tabs/lib/useTabsModel.d.ts +521 -116
  191. package/dist/es6/tabs/lib/useTabsModel.d.ts.map +1 -1
  192. package/package.json +3 -3
@@ -21,6 +21,9 @@ export declare const useListItemRegister: import("@workday/canvas-kit-react/comm
21
21
  cursorId: string;
22
22
  columnCount: number;
23
23
  pageSizeRef: React.MutableRefObject<number>;
24
+ cursorIndexRef: {
25
+ readonly current: number;
26
+ };
24
27
  UNSTABLE_virtual: {
25
28
  virtualItems: VirtualItem[];
26
29
  totalSize: number;
@@ -43,10 +46,6 @@ export declare const useListItemRegister: import("@workday/canvas-kit-react/comm
43
46
  }): void;
44
47
  selectAll(): void;
45
48
  unselectAll(): void;
46
- registerItem(data: {
47
- item: any;
48
- textValue: string;
49
- }): void;
50
49
  goTo(data: {
51
50
  id: string;
52
51
  }): void;
@@ -60,6 +59,10 @@ export declare const useListItemRegister: import("@workday/canvas-kit-react/comm
60
59
  goToLastOfRow(): void;
61
60
  goToNextPage(): void;
62
61
  goToPreviousPage(): void;
62
+ registerItem(data: {
63
+ item: any;
64
+ textValue: string;
65
+ }): void;
63
66
  unregisterItem(data: {
64
67
  id: string;
65
68
  }): void;
@@ -1 +1 @@
1
- {"version":3,"file":"useListItemRegister.d.ts","sourceRoot":"","sources":["../../../../collection/lib/useListItemRegister.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAU3C,OAAO,EAAC,IAAI,EAAC,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAG5C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoE/B,CAAC"}
1
+ {"version":3,"file":"useListItemRegister.d.ts","sourceRoot":"","sources":["../../../../collection/lib/useListItemRegister.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAU3C,OAAO,EAAC,IAAI,EAAC,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAG5C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoE/B,CAAC"}
@@ -18,6 +18,9 @@ export declare const useListItemRovingFocus: import("@workday/canvas-kit-react/c
18
18
  cursorId: string;
19
19
  columnCount: number;
20
20
  pageSizeRef: React.MutableRefObject<number>;
21
+ cursorIndexRef: {
22
+ readonly current: number;
23
+ };
21
24
  UNSTABLE_virtual: {
22
25
  virtualItems: import("./react-virtual").VirtualItem[];
23
26
  totalSize: number;
@@ -35,10 +38,6 @@ export declare const useListItemRovingFocus: import("@workday/canvas-kit-react/c
35
38
  items: import("./useBaseListModel").Item<any>[];
36
39
  };
37
40
  events: {
38
- registerItem(data: {
39
- item: any;
40
- textValue: string;
41
- }): void;
42
41
  goTo(data: {
43
42
  id: string;
44
43
  }): void;
@@ -52,6 +51,10 @@ export declare const useListItemRovingFocus: import("@workday/canvas-kit-react/c
52
51
  goToLastOfRow(): void;
53
52
  goToNextPage(): void;
54
53
  goToPreviousPage(): void;
54
+ registerItem(data: {
55
+ item: any;
56
+ textValue: string;
57
+ }): void;
55
58
  unregisterItem(data: {
56
59
  id: string;
57
60
  }): void;
@@ -66,6 +69,5 @@ export declare const useListItemRovingFocus: import("@workday/canvas-kit-react/c
66
69
  onClick(): void;
67
70
  'data-focus-id': string;
68
71
  tabIndex: number;
69
- ref: React.Ref<any> | undefined;
70
72
  }>;
71
73
  //# sourceMappingURL=useListItemRovingFocus.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useListItemRovingFocus.d.ts","sourceRoot":"","sources":["../../../../collection/lib/useListItemRovingFocus.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA8BZ,mBAAmB;;;;;EAmBzC,CAAC"}
1
+ {"version":3,"file":"useListItemRovingFocus.d.ts","sourceRoot":"","sources":["../../../../collection/lib/useListItemRovingFocus.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA2CZ,mBAAmB;;;;EAkBzC,CAAC"}
@@ -8,6 +8,12 @@ const react_1 = __importDefault(require("react"));
8
8
  const common_1 = require("@workday/canvas-kit-react/common");
9
9
  const useCursorListModel_1 = require("./useCursorListModel");
10
10
  const keyUtils_1 = require("./keyUtils");
11
+ // retry a function each frame so we don't rely on the timing mechanism of React's render cycle.
12
+ const retryEachFrame = (cb, iterations) => {
13
+ if (cb() === false && iterations > 1) {
14
+ requestAnimationFrame(() => retryEachFrame(cb, iterations - 1));
15
+ }
16
+ };
11
17
  /**
12
18
  * This elemProps hook is used for cursor navigation by using [Roving
13
19
  * Tabindex](https://w3c.github.io/aria-practices/#kbd_roving_tabindex). Only a single item in the
@@ -22,7 +28,7 @@ const keyUtils_1 = require("./keyUtils");
22
28
  * );
23
29
  ```
24
30
  */
25
- exports.useListItemRovingFocus = common_1.createElemPropsHook(useCursorListModel_1.useCursorListModel)((model, ref, elemProps = {}) => {
31
+ exports.useListItemRovingFocus = common_1.createElemPropsHook(useCursorListModel_1.useCursorListModel)((model, _ref, elemProps = {}) => {
26
32
  // Create a ref out of state. We don't want to watch state on unmount, so we use a ref to get the
27
33
  // current value at the time of unmounting. Otherwise, `state.items` would be a cached value of an
28
34
  // empty array
@@ -36,16 +42,24 @@ exports.useListItemRovingFocus = common_1.createElemPropsHook(useCursorListModel
36
42
  if (model.state.isVirtualized) {
37
43
  model.state.UNSTABLE_virtual.scrollToIndex(item.index);
38
44
  }
39
- requestAnimationFrame(() => {
40
- var _a;
41
- (_a = document
42
- .querySelector(`[data-focus-id="${`${model.state.id}-${item.id}`}"]`)) === null || _a === void 0 ? void 0 : _a.focus();
43
- });
45
+ // In React concurrent mode, there could be several render attempts before the element we're
46
+ // looking for could be available in the DOM
47
+ retryEachFrame(() => {
48
+ const element = document.querySelector(`[data-focus-id="${`${model.state.id}-${item.id}`}"]`);
49
+ element === null || element === void 0 ? void 0 : element.focus();
50
+ return !!element;
51
+ }, 5); // 5 should be enough, right?!
44
52
  keyDownRef.current = false;
45
53
  }
46
54
  // we only want to run this effect if the cursor changes and not any other time
47
55
  // eslint-disable-next-line react-hooks/exhaustive-deps
48
56
  }, [model.state.cursorId]);
57
+ // Roving focus must always have a focus stop to function correctly
58
+ react_1.default.useEffect(() => {
59
+ if (!model.state.cursorId && model.state.items.length) {
60
+ model.events.goTo({ id: model.state.items[0].id });
61
+ }
62
+ }, [model.state.cursorId, model.state.items, model.events]);
49
63
  return {
50
64
  onKeyDown(event) {
51
65
  const handled = keyUtils_1.keyboardEventToCursorEvents(event, model, isRTL);
@@ -62,7 +76,6 @@ exports.useListItemRovingFocus = common_1.createElemPropsHook(useCursorListModel
62
76
  ? 0 // cursor isn't known yet, be safe and mark this as focusable
63
77
  : !!elemProps['data-id'] && model.state.cursorId === elemProps['data-id']
64
78
  ? 0 // A name is known and cursor is here
65
- : -1,
66
- ref,
79
+ : -1, // A name is known an cursor is somewhere else
67
80
  };
68
81
  });
@@ -18,6 +18,9 @@ export declare const useListItemSelect: import("@workday/canvas-kit-react/common
18
18
  cursorId: string;
19
19
  columnCount: number;
20
20
  pageSizeRef: React.MutableRefObject<number>;
21
+ cursorIndexRef: {
22
+ readonly current: number;
23
+ };
21
24
  UNSTABLE_virtual: {
22
25
  virtualItems: import("./react-virtual").VirtualItem[];
23
26
  totalSize: number;
@@ -40,10 +43,6 @@ export declare const useListItemSelect: import("@workday/canvas-kit-react/common
40
43
  }): void;
41
44
  selectAll(): void;
42
45
  unselectAll(): void;
43
- registerItem(data: {
44
- item: any;
45
- textValue: string;
46
- }): void;
47
46
  goTo(data: {
48
47
  id: string;
49
48
  }): void;
@@ -57,6 +56,10 @@ export declare const useListItemSelect: import("@workday/canvas-kit-react/common
57
56
  goToLastOfRow(): void;
58
57
  goToNextPage(): void;
59
58
  goToPreviousPage(): void;
59
+ registerItem(data: {
60
+ item: any;
61
+ textValue: string;
62
+ }): void;
60
63
  unregisterItem(data: {
61
64
  id: string;
62
65
  }): void;
@@ -1 +1 @@
1
- {"version":3,"file":"useListItemSelect.d.ts","sourceRoot":"","sources":["../../../../collection/lib/useListItemSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAGF,gBAAgB,CAAC,WAAW,CAAC;EAWxD,CAAC"}
1
+ {"version":3,"file":"useListItemSelect.d.ts","sourceRoot":"","sources":["../../../../collection/lib/useListItemSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAGF,gBAAgB,CAAC,WAAW,CAAC;EAWxD,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { useListModel } from './useListModel';
2
+ export interface LoadReturn<T> {
3
+ items: T[];
4
+ total?: number;
5
+ }
6
+ export interface LoadParams {
7
+ pageNumber: number;
8
+ pageSize: number;
9
+ filter: CollectionLoader['filter'];
10
+ sorter: CollectionLoader['sorter'];
11
+ }
12
+ export interface AsyncCollectionConfig<T> {
13
+ pageSize: number;
14
+ total: number;
15
+ load(params: LoadParams): LoadReturn<T> | Promise<LoadReturn<T>>;
16
+ }
17
+ export interface CollectionLoader {
18
+ filter: string | Record<string, string>;
19
+ updateFilter(value: string): void;
20
+ sorter: string | Record<string, string>;
21
+ updateSorter(value: string): void;
22
+ isLoading: boolean;
23
+ }
24
+ export declare function getPageNumber(index: number, pageSize: number): number;
25
+ /**
26
+ *
27
+ * @param start The start index of the virtual window
28
+ * @param end The end index of the virtual window
29
+ * @param pageSize Expected load page size
30
+ * @param items Sparse array of all loaded items
31
+ * @param overScan How many items ahead we want to look ahead to trigger loading. Unloaded items
32
+ * that are this many items outside the current start and end numbers will trigger a loading of
33
+ * a page
34
+ */
35
+ export declare function getPagesToLoad<T>(start: number, end: number, pageSize: number, items: T[], overScan?: number): number[];
36
+ /**
37
+ * Create a data loader and a model. The model should be passed to a collection component. The
38
+ * loader can be used to manipulate filters, sorters, and clear cache.
39
+ *
40
+ * A simple loader using [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
41
+ * could look like the following:
42
+ *
43
+ * ```ts
44
+ * const {model, loader} = useListLoader(
45
+ * {
46
+ * total: 1000,
47
+ * pageSize: 20,
48
+ * async load({pageNumber, pageSize}) {
49
+ * return fetch('/myUrl')
50
+ * .then(response => response.json())
51
+ * .then(response => {
52
+ * return {total: response.total, items: response.items};
53
+ * });
54
+ * },
55
+ * },
56
+ * useListModel
57
+ * );
58
+ * ```
59
+ *
60
+ * @param config Config that contains the loader config and the model config
61
+ * @param modelHook A model hook that describes which model should be returned.
62
+ */
63
+ export declare function useListLoader<T, M extends ((...args: any[]) => any) & Omit<typeof useListModel, 'TConfig' | 'Context'>>(config: AsyncCollectionConfig<T> & typeof useListModel.TConfig, modelHook: M): {
64
+ model: ReturnType<M>;
65
+ loader: CollectionLoader;
66
+ };
67
+ //# sourceMappingURL=useListLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useListLoader.d.ts","sourceRoot":"","sources":["../../../../collection/lib/useListLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;CACpC;AACD,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;CACpB;AA8CD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAM5D;AAMD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,EAAE,EACV,QAAQ,SAAI,GACX,MAAM,EAAE,CAkBV;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,aAAa,CAC3B,CAAC,EAED,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC,EAEtF,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,YAAY,CAAC,OAAO,EAC9D,SAAS,EAAE,CAAC,GACX;IAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAC,CA2JlD"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useListLoader = exports.getPagesToLoad = exports.getPageNumber = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ /**
9
+ * A loading buffer is how many items we want to look at ahead of the current virtual window. A
10
+ * higher amount can load too many pages initially. A lower number can cause items to not be loaded
11
+ * yet when scrolling. This will probably become a floating number later based on scrolling speed.
12
+ * Ideally the faster the user scrolls, this number will be higher or "predict" where to focus loading
13
+ * so the user doesn't see unloaded items. But if the user is scrolling too fast, we may simply delay
14
+ * data loading. That logic would be based on timers. For now, we'll just hardcode.
15
+ */
16
+ const loadingBuffer = 3;
17
+ function updateItems(newItems, startIndex = 0) {
18
+ return function itemStateUpdater(items) {
19
+ // replace existing indexes with data from external service
20
+ newItems.forEach((item, index) => {
21
+ items[index + startIndex] = item;
22
+ });
23
+ const returnedItems = items.concat([]);
24
+ return returnedItems; // return a new reference
25
+ };
26
+ }
27
+ function load(params, loadCb, loadingCache) {
28
+ if (loadingCache[params.pageNumber]) {
29
+ return Promise.resolve({ updater: items => items });
30
+ }
31
+ loadingCache[params.pageNumber] = true;
32
+ return Promise.resolve(loadCb(params)).then(({ items, total }) => {
33
+ loadingCache[params.pageNumber] = false;
34
+ return { total, updater: updateItems(items, (params.pageNumber - 1) * params.pageSize) };
35
+ });
36
+ }
37
+ function getPageNumber(index, pageSize) {
38
+ if (index <= 0) {
39
+ return 1;
40
+ }
41
+ return Math.ceil((index + 1) / pageSize);
42
+ }
43
+ exports.getPageNumber = getPageNumber;
44
+ function clamp(input, min, max) {
45
+ return Math.max(Math.min(input, max), min);
46
+ }
47
+ /**
48
+ *
49
+ * @param start The start index of the virtual window
50
+ * @param end The end index of the virtual window
51
+ * @param pageSize Expected load page size
52
+ * @param items Sparse array of all loaded items
53
+ * @param overScan How many items ahead we want to look ahead to trigger loading. Unloaded items
54
+ * that are this many items outside the current start and end numbers will trigger a loading of
55
+ * a page
56
+ */
57
+ function getPagesToLoad(start, end, pageSize, items, overScan = 3) {
58
+ const pagesToLoad = [];
59
+ const lookBehindIndex = clamp(start - overScan, 0, items.length - 1);
60
+ if (start >= 0 && !items[lookBehindIndex]) {
61
+ const pageNumber = getPageNumber(lookBehindIndex, pageSize);
62
+ pagesToLoad.push(pageNumber);
63
+ }
64
+ const lookaheadIndex = clamp(end + overScan - 1, 0, items.length - 1);
65
+ if (end < items.length - 1 && !items[lookaheadIndex]) {
66
+ const pageNumber = getPageNumber(lookaheadIndex, pageSize);
67
+ if (!pagesToLoad.includes(pageNumber)) {
68
+ pagesToLoad.push(pageNumber);
69
+ }
70
+ }
71
+ return pagesToLoad;
72
+ }
73
+ exports.getPagesToLoad = getPagesToLoad;
74
+ const resetItems = (total) => Array(total).fill(undefined);
75
+ /**
76
+ * Create a data loader and a model. The model should be passed to a collection component. The
77
+ * loader can be used to manipulate filters, sorters, and clear cache.
78
+ *
79
+ * A simple loader using [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
80
+ * could look like the following:
81
+ *
82
+ * ```ts
83
+ * const {model, loader} = useListLoader(
84
+ * {
85
+ * total: 1000,
86
+ * pageSize: 20,
87
+ * async load({pageNumber, pageSize}) {
88
+ * return fetch('/myUrl')
89
+ * .then(response => response.json())
90
+ * .then(response => {
91
+ * return {total: response.total, items: response.items};
92
+ * });
93
+ * },
94
+ * },
95
+ * useListModel
96
+ * );
97
+ * ```
98
+ *
99
+ * @param config Config that contains the loader config and the model config
100
+ * @param modelHook A model hook that describes which model should be returned.
101
+ */
102
+ function useListLoader(config, modelHook) {
103
+ const [total, setTotal] = react_1.default.useState(config.total);
104
+ const [items, setItems] = react_1.default.useState(() => {
105
+ return resetItems(config.total);
106
+ });
107
+ // keep track of pages that are currently loading
108
+ const loadingRef = react_1.default.useRef({});
109
+ const [filter, setFilter] = react_1.default.useState('');
110
+ const [sorter, setSorter] = react_1.default.useState('');
111
+ const updateItems = react_1.default.useCallback(({ updater, total: newTotal }) => {
112
+ if (newTotal !== undefined && total !== newTotal) {
113
+ setTotal(newTotal);
114
+ setItems(() => {
115
+ const items = resetItems(newTotal);
116
+ return updater(items);
117
+ });
118
+ return;
119
+ }
120
+ setItems(updater);
121
+ }, [total]);
122
+ const updateFilter = (filter) => {
123
+ loadingRef.current = {};
124
+ setFilter(filter);
125
+ const params = {
126
+ pageNumber: 1,
127
+ pageSize: config.pageSize,
128
+ filter,
129
+ sorter,
130
+ };
131
+ load(params, loadRef.current, loadingRef.current).then(updateItems);
132
+ };
133
+ const updateSorter = (sorter) => {
134
+ loadingRef.current = {};
135
+ setSorter(sorter);
136
+ load({
137
+ pageNumber: 1,
138
+ pageSize: config.pageSize,
139
+ filter,
140
+ sorter,
141
+ }, loadRef.current, loadingRef.current).then(updateItems);
142
+ };
143
+ // Our `useEffect` functions use `config.load`, but we don't want to rerun the effects if the user
144
+ // sends a different load function every render
145
+ const loadRef = react_1.default.useRef(config.load);
146
+ loadRef.current = config.load;
147
+ const itemsRef = react_1.default.useRef(items);
148
+ itemsRef.current = items;
149
+ const requestAnimationFrameRef = react_1.default.useRef(0);
150
+ const shouldLoadIndex = (navigationMethod, eventKey) => {
151
+ return (data) => {
152
+ const index = model.navigation[navigationMethod](model.state.cursorIndexRef.current, model);
153
+ if (!items[index]) {
154
+ load({
155
+ pageNumber: Math.floor(index / config.pageSize) + 1,
156
+ pageSize: config.pageSize,
157
+ filter,
158
+ sorter,
159
+ }, loadRef.current, loadingRef.current)
160
+ .then(updateItems)
161
+ .then(() => {
162
+ cancelAnimationFrame(requestAnimationFrameRef.current);
163
+ requestAnimationFrameRef.current = requestAnimationFrame(() => {
164
+ model.events[eventKey](data);
165
+ });
166
+ });
167
+ return false;
168
+ }
169
+ return true;
170
+ };
171
+ };
172
+ const model = modelHook(modelHook.mergeConfig(config, {
173
+ items,
174
+ shouldGoToNext: shouldLoadIndex('getNext', 'goToNext'),
175
+ shouldGoToPrevious: shouldLoadIndex('getPrevious', 'goToPrevious'),
176
+ shouldGoToLast: shouldLoadIndex('getLast', 'goToLast'),
177
+ shouldGoToFirst: shouldLoadIndex('getFirst', 'goToFirst'),
178
+ shouldGoToNextPage: shouldLoadIndex('getNextPage', 'goToNextPage'),
179
+ shouldGoToPreviousPage: shouldLoadIndex('getPreviousPage', 'goToPreviousPage'),
180
+ }));
181
+ const { virtualItems } = model.state.UNSTABLE_virtual;
182
+ // Our only signal to trigger loading is if our virtual indexes are too close to boundaries.
183
+ react_1.default.useEffect(() => {
184
+ if (!virtualItems.length) {
185
+ return;
186
+ }
187
+ const firstItem = virtualItems[0];
188
+ const lastItem = virtualItems[virtualItems.length - 1];
189
+ const pagesToLoad = getPagesToLoad(firstItem.index, lastItem.index, config.pageSize, itemsRef.current, loadingBuffer);
190
+ pagesToLoad.forEach(pageNumber => {
191
+ load({ pageNumber, pageSize: config.pageSize, filter, sorter }, loadRef.current, loadingRef.current).then(updateItems);
192
+ });
193
+ return () => {
194
+ cancelAnimationFrame(requestAnimationFrameRef.current);
195
+ };
196
+ }, [virtualItems, config.pageSize, filter, sorter, updateItems]);
197
+ // Typescript won't allow me to say the included model extends `useListModel` for some reason, so
198
+ // we have no way to type check it. Without the constraint, Typescript doesn't know how type it
199
+ // properly, so we have an `as any`.
200
+ return {
201
+ model: model,
202
+ loader: {
203
+ filter,
204
+ updateFilter,
205
+ sorter,
206
+ updateSorter,
207
+ // we reduce the ref instead of a state variable because the loader mutates this ref and
208
+ // triggers state changes when loading is finished.
209
+ isLoading: Object.values(loadingRef.current).reduce((loading, result) => loading || result, false),
210
+ },
211
+ };
212
+ }
213
+ exports.useListLoader = useListLoader;