@ndla/ui 14.0.0 → 15.0.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 (189) hide show
  1. package/es/Article/Article.js +22 -3
  2. package/es/Article/ArticleFavoritesButton.js +38 -0
  3. package/es/Article/index.js +2 -1
  4. package/es/Breadcrumb/ActionBreadcrumb.js +57 -0
  5. package/es/Breadcrumb/index.js +1 -0
  6. package/es/InfoBlock/InfoBlock.js +55 -0
  7. package/es/InfoBlock/index.js +1 -0
  8. package/es/MyNdla/Navigation/VerticalNavigation.js +51 -0
  9. package/es/MyNdla/Navigation/index.js +2 -0
  10. package/es/MyNdla/Resource/Folder.js +86 -0
  11. package/{lib/MyNdla/ResourceDash/ResourcesView.d.ts → es/MyNdla/Resource/index.js} +2 -3
  12. package/es/MyNdla/index.js +3 -4
  13. package/es/Resource/BlockResource.js +73 -0
  14. package/es/Resource/ListResource.js +66 -0
  15. package/es/Resource/index.js +10 -0
  16. package/es/Resource/resourceComponents.js +97 -0
  17. package/es/ResourceGroup/ResourceGroup.js +7 -5
  18. package/es/ResourceGroup/ResourceItem.js +25 -24
  19. package/es/ResourceGroup/ResourceList.js +18 -6
  20. package/es/SnackBar/SnackBar.js +117 -0
  21. package/es/SnackBar/index.js +9 -0
  22. package/es/TagSelector/SuggestionInput.js +240 -0
  23. package/es/TagSelector/Suggestions.js +93 -0
  24. package/es/TagSelector/TagSelector.js +137 -0
  25. package/es/TagSelector/index.js +9 -0
  26. package/es/TreeStructure/FolderItem.js +130 -0
  27. package/es/TreeStructure/FolderItems.js +123 -0
  28. package/es/TreeStructure/FolderNameInput.js +112 -0
  29. package/es/TreeStructure/TreeStructure.js +254 -0
  30. package/es/TreeStructure/TreeStructure.types.js +0 -0
  31. package/es/TreeStructure/TreeStructureWrapper.js +13 -0
  32. package/es/TreeStructure/helperFunctions.js +92 -0
  33. package/es/TreeStructure/index.js +9 -0
  34. package/es/TreeStructure/keyboardNavigation/keyboardNavigation.js +182 -0
  35. package/es/TreeStructure/keyboardNavigation/keyboardNavigation.types.js +0 -0
  36. package/es/all.css +72 -0
  37. package/es/index.js +8 -3
  38. package/es/locale/messages-en.js +62 -4
  39. package/es/locale/messages-nb.js +61 -3
  40. package/es/locale/messages-nn.js +61 -3
  41. package/es/locale/messages-se.js +61 -3
  42. package/es/locale/messages-sma.js +61 -3
  43. package/lib/Article/Article.d.ts +3 -1
  44. package/lib/Article/Article.js +43 -23
  45. package/lib/Article/ArticleFavoritesButton.d.ts +15 -0
  46. package/lib/Article/ArticleFavoritesButton.js +56 -0
  47. package/lib/Article/index.d.ts +2 -1
  48. package/lib/Article/index.js +8 -0
  49. package/lib/Breadcrumb/ActionBreadcrumb.d.ts +16 -0
  50. package/lib/Breadcrumb/ActionBreadcrumb.js +72 -0
  51. package/lib/Breadcrumb/index.d.ts +1 -0
  52. package/lib/Breadcrumb/index.js +8 -0
  53. package/lib/InfoBlock/InfoBlock.d.ts +8 -0
  54. package/lib/InfoBlock/InfoBlock.js +58 -0
  55. package/lib/InfoBlock/index.d.ts +1 -0
  56. package/lib/InfoBlock/index.js +13 -0
  57. package/lib/MyNdla/Navigation/VerticalNavigation.d.ts +10 -0
  58. package/lib/MyNdla/Navigation/VerticalNavigation.js +61 -0
  59. package/lib/MyNdla/Navigation/index.d.ts +2 -0
  60. package/lib/MyNdla/Navigation/index.js +15 -0
  61. package/lib/MyNdla/Resource/Folder.d.ts +20 -0
  62. package/lib/MyNdla/Resource/Folder.js +100 -0
  63. package/lib/MyNdla/Resource/index.d.ts +9 -0
  64. package/lib/MyNdla/Resource/index.js +15 -0
  65. package/lib/MyNdla/index.d.ts +3 -4
  66. package/lib/MyNdla/index.js +9 -11
  67. package/lib/Resource/BlockResource.d.ts +20 -0
  68. package/lib/Resource/BlockResource.js +84 -0
  69. package/lib/Resource/ListResource.d.ts +20 -0
  70. package/lib/Resource/ListResource.js +78 -0
  71. package/lib/Resource/index.d.ts +11 -0
  72. package/lib/Resource/index.js +29 -0
  73. package/lib/Resource/resourceComponents.d.ts +24 -0
  74. package/lib/Resource/resourceComponents.js +106 -0
  75. package/lib/ResourceGroup/ResourceGroup.d.ts +2 -1
  76. package/lib/ResourceGroup/ResourceGroup.js +7 -5
  77. package/lib/ResourceGroup/ResourceItem.d.ts +5 -1
  78. package/lib/ResourceGroup/ResourceItem.js +26 -24
  79. package/lib/ResourceGroup/ResourceList.d.ts +3 -1
  80. package/lib/ResourceGroup/ResourceList.js +18 -6
  81. package/lib/SnackBar/SnackBar.d.ts +23 -0
  82. package/lib/SnackBar/SnackBar.js +127 -0
  83. package/lib/SnackBar/index.d.ts +10 -0
  84. package/lib/SnackBar/index.js +15 -0
  85. package/lib/TagSelector/SuggestionInput.d.ts +19 -0
  86. package/lib/TagSelector/SuggestionInput.js +255 -0
  87. package/lib/TagSelector/Suggestions.d.ts +12 -0
  88. package/lib/TagSelector/Suggestions.js +96 -0
  89. package/lib/TagSelector/TagSelector.d.ts +16 -0
  90. package/lib/TagSelector/TagSelector.js +150 -0
  91. package/lib/TagSelector/index.d.ts +10 -0
  92. package/lib/TagSelector/index.js +19 -0
  93. package/lib/TreeStructure/FolderItem.d.ts +27 -0
  94. package/lib/TreeStructure/FolderItem.js +140 -0
  95. package/lib/TreeStructure/FolderItems.d.ts +11 -0
  96. package/lib/TreeStructure/FolderItems.js +130 -0
  97. package/lib/TreeStructure/FolderNameInput.d.ts +15 -0
  98. package/lib/TreeStructure/FolderNameInput.js +125 -0
  99. package/lib/TreeStructure/TreeStructure.d.ts +12 -0
  100. package/lib/TreeStructure/TreeStructure.js +273 -0
  101. package/lib/TreeStructure/TreeStructure.types.d.ts +63 -0
  102. package/lib/TreeStructure/TreeStructure.types.js +1 -0
  103. package/lib/TreeStructure/TreeStructureWrapper.d.ts +12 -0
  104. package/lib/TreeStructure/TreeStructureWrapper.js +24 -0
  105. package/lib/TreeStructure/helperFunctions.d.ts +5 -0
  106. package/lib/TreeStructure/helperFunctions.js +103 -0
  107. package/lib/TreeStructure/index.d.ts +10 -0
  108. package/lib/TreeStructure/index.js +15 -0
  109. package/lib/TreeStructure/keyboardNavigation/keyboardNavigation.d.ts +11 -0
  110. package/lib/TreeStructure/keyboardNavigation/keyboardNavigation.js +186 -0
  111. package/lib/TreeStructure/keyboardNavigation/keyboardNavigation.types.d.ts +26 -0
  112. package/lib/TreeStructure/keyboardNavigation/keyboardNavigation.types.js +1 -0
  113. package/lib/User/apiTypes.d.ts +1 -1
  114. package/lib/User/index.d.ts +2 -2
  115. package/lib/all.css +72 -0
  116. package/lib/index.d.ts +13 -4
  117. package/lib/index.js +68 -9
  118. package/lib/locale/messages-en.d.ts +58 -0
  119. package/lib/locale/messages-en.js +62 -4
  120. package/lib/locale/messages-nb.d.ts +58 -0
  121. package/lib/locale/messages-nb.js +61 -3
  122. package/lib/locale/messages-nn.d.ts +58 -0
  123. package/lib/locale/messages-nn.js +61 -3
  124. package/lib/locale/messages-se.d.ts +58 -0
  125. package/lib/locale/messages-se.js +61 -3
  126. package/lib/locale/messages-sma.d.ts +58 -0
  127. package/lib/locale/messages-sma.js +61 -3
  128. package/lib/types.d.ts +1 -1
  129. package/package.json +11 -11
  130. package/src/Article/Article.tsx +31 -0
  131. package/src/Article/ArticleFavoritesButton.tsx +40 -0
  132. package/src/Article/index.ts +2 -0
  133. package/src/Breadcrumb/ActionBreadcrumb.tsx +68 -0
  134. package/src/Breadcrumb/index.ts +2 -0
  135. package/src/InfoBlock/InfoBlock.tsx +61 -0
  136. package/src/InfoBlock/index.ts +1 -0
  137. package/src/MyNdla/Navigation/VerticalNavigation.tsx +93 -0
  138. package/src/MyNdla/Navigation/index.ts +2 -0
  139. package/src/MyNdla/Resource/Folder.tsx +143 -0
  140. package/src/MyNdla/Resource/index.ts +10 -0
  141. package/src/MyNdla/index.ts +3 -5
  142. package/src/Resource/BlockResource.tsx +101 -0
  143. package/src/Resource/ListResource.tsx +111 -0
  144. package/src/Resource/index.ts +12 -0
  145. package/src/Resource/resourceComponents.tsx +143 -0
  146. package/src/ResourceGroup/ResourceGroup.tsx +3 -0
  147. package/src/ResourceGroup/ResourceItem.tsx +17 -0
  148. package/src/ResourceGroup/ResourceList.tsx +16 -3
  149. package/src/SnackBar/SnackBar.tsx +183 -0
  150. package/src/SnackBar/index.ts +13 -0
  151. package/src/TagSelector/SuggestionInput.tsx +230 -0
  152. package/src/TagSelector/Suggestions.tsx +125 -0
  153. package/src/TagSelector/TagSelector.tsx +111 -0
  154. package/src/TagSelector/index.ts +13 -0
  155. package/src/TreeStructure/FolderItem.tsx +160 -0
  156. package/src/TreeStructure/FolderItems.tsx +109 -0
  157. package/src/TreeStructure/FolderNameInput.tsx +109 -0
  158. package/src/TreeStructure/TreeStructure.tsx +184 -0
  159. package/src/TreeStructure/TreeStructure.types.ts +69 -0
  160. package/src/TreeStructure/TreeStructureWrapper.tsx +34 -0
  161. package/src/TreeStructure/helperFunctions.ts +52 -0
  162. package/src/TreeStructure/index.ts +11 -0
  163. package/src/TreeStructure/keyboardNavigation/keyboardNavigation.ts +161 -0
  164. package/src/TreeStructure/keyboardNavigation/keyboardNavigation.types.ts +28 -0
  165. package/src/User/apiTypes.ts +1 -1
  166. package/src/User/index.ts +2 -2
  167. package/src/all.scss +1 -0
  168. package/src/index.ts +14 -5
  169. package/src/locale/messages-en.ts +56 -3
  170. package/src/locale/messages-nb.ts +55 -2
  171. package/src/locale/messages-nn.ts +55 -2
  172. package/src/locale/messages-se.ts +55 -2
  173. package/src/locale/messages-sma.ts +55 -2
  174. package/src/types.ts +1 -1
  175. package/es/MyNdla/ResourceDash/Breadcrumbs.js +0 -22
  176. package/es/MyNdla/ResourceDash/ResourceElement.js +0 -27
  177. package/es/MyNdla/ResourceDash/ResourcesView.js +0 -43
  178. package/es/MyNdla/ResourceDash/index.js +0 -4
  179. package/lib/MyNdla/ResourceDash/Breadcrumbs.d.ts +0 -15
  180. package/lib/MyNdla/ResourceDash/Breadcrumbs.js +0 -35
  181. package/lib/MyNdla/ResourceDash/ResourceElement.d.ts +0 -18
  182. package/lib/MyNdla/ResourceDash/ResourceElement.js +0 -38
  183. package/lib/MyNdla/ResourceDash/ResourcesView.js +0 -57
  184. package/lib/MyNdla/ResourceDash/index.d.ts +0 -4
  185. package/lib/MyNdla/ResourceDash/index.js +0 -31
  186. package/src/MyNdla/ResourceDash/Breadcrumbs.tsx +0 -31
  187. package/src/MyNdla/ResourceDash/ResourceElement.tsx +0 -50
  188. package/src/MyNdla/ResourceDash/ResourcesView.tsx +0 -42
  189. package/src/MyNdla/ResourceDash/index.ts +0 -5
@@ -0,0 +1,254 @@
1
+ import _styled from "@emotion/styled-base";
2
+
3
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
4
+
5
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6
+
7
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8
+
9
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
10
+
11
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
12
+
13
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
14
+
15
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
16
+
17
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
18
+
19
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
20
+
21
+ function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
22
+
23
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
24
+
25
+ /**
26
+ * Copyright (c) 2022-present, NDLA.
27
+ *
28
+ * This source code is licensed under the GPLv3 license found in the
29
+ * LICENSE file in the root directory of this source tree.
30
+ *
31
+ */
32
+ import React, { useEffect, useState, useRef, useMemo } from 'react';
33
+ import { uuid } from '@ndla/util';
34
+ import Button from '@ndla/button';
35
+ import Tooltip from '@ndla/tooltip';
36
+ import { useTranslation } from 'react-i18next';
37
+ import { spacing, fonts } from '@ndla/core';
38
+ import TreeStructureStyledWrapper from './TreeStructureWrapper';
39
+ import FolderItems from './FolderItems';
40
+ import { getIdPathsOfFolder, getPathOfFolder, getFolderName } from './helperFunctions';
41
+ import keyboardNavigation, { KEYBOARD_KEYS_OF_INTEREST } from './keyboardNavigation/keyboardNavigation';
42
+ import { jsx as ___EmotionJSX } from "@emotion/core";
43
+ export var MAX_LEVEL_FOR_FOLDERS = 4;
44
+
45
+ var StyledLabel = _styled("label", {
46
+ target: "e1dg1gdn0",
47
+ label: "StyledLabel"
48
+ })("font-weight:", fonts.weight.semibold, ";" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyZWVTdHJ1Y3R1cmUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVCZ0MiLCJmaWxlIjoiVHJlZVN0cnVjdHVyZS50c3giLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMi1wcmVzZW50LCBORExBLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTHYzIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICovXG5cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnQG5kbGEvdXRpbCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ0BuZGxhL2J1dHRvbic7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICdAbmRsYS90b29sdGlwJztcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBzcGFjaW5nLCBmb250cyB9IGZyb20gJ0BuZGxhL2NvcmUnO1xuaW1wb3J0IFRyZWVTdHJ1Y3R1cmVTdHlsZWRXcmFwcGVyIGZyb20gJy4vVHJlZVN0cnVjdHVyZVdyYXBwZXInO1xuaW1wb3J0IEZvbGRlckl0ZW1zIGZyb20gJy4vRm9sZGVySXRlbXMnO1xuaW1wb3J0IHsgZ2V0SWRQYXRoc09mRm9sZGVyLCBnZXRQYXRoT2ZGb2xkZXIsIGdldEZvbGRlck5hbWUgfSBmcm9tICcuL2hlbHBlckZ1bmN0aW9ucyc7XG5pbXBvcnQga2V5Ym9hcmROYXZpZ2F0aW9uLCB7IEtFWUJPQVJEX0tFWVNfT0ZfSU5URVJFU1QgfSBmcm9tICcuL2tleWJvYXJkTmF2aWdhdGlvbi9rZXlib2FyZE5hdmlnYXRpb24nO1xuaW1wb3J0IHsgTmV3Rm9sZGVyUHJvcHMsIFRyZWVTdHJ1Y3R1cmVQcm9wcyB9IGZyb20gJy4vVHJlZVN0cnVjdHVyZS50eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBNQVhfTEVWRUxfRk9SX0ZPTERFUlMgPSA0O1xuXG5jb25zdCBTdHlsZWRMYWJlbCA9IHN0eWxlZC5sYWJlbGBcbiAgZm9udC13ZWlnaHQ6ICR7Zm9udHMud2VpZ2h0LnNlbWlib2xkfTtcbmA7XG5cbmNvbnN0IEFkZEZvbGRlcldyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBtYXJnaW4tdG9wOiAke3NwYWNpbmcueHNtYWxsfTtcbmA7XG5cbmNvbnN0IFRyZWVTdHJ1Y3R1cmUgPSAoe1xuICBkYXRhLFxuICBsYWJlbCxcbiAgZWRpdGFibGUsXG4gIGxvYWRpbmcsXG4gIG9uTmV3Rm9sZGVyLFxuICBvcGVuT25Gb2xkZXJDbGljayxcbiAgZnJhbWVkLFxuICBmb2xkZXJJZE1hcmtlZEJ5RGVmYXVsdCxcbiAgZGVmYXVsdE9wZW5Gb2xkZXJzLFxufTogVHJlZVN0cnVjdHVyZVByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW25ld0ZvbGRlciwgc2V0TmV3Rm9sZGVyXSA9IHVzZVN0YXRlPE5ld0ZvbGRlclByb3BzIHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBbb3BlbkZvbGRlcnMsIHNldE9wZW5Gb2xkZXJzXSA9IHVzZVN0YXRlPFNldDxzdHJpbmc+PihuZXcgU2V0KGRlZmF1bHRPcGVuRm9sZGVycyB8fCBbXSkpO1xuICBjb25zdCBbZm9jdXNlZEZvbGRlcklkLCBzZXRGb2N1c2VkRm9sZGVySWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBbbWFya2VkRm9sZGVySWQsIHNldE1hcmtlZEZvbGRlcklkXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oZm9sZGVySWRNYXJrZWRCeURlZmF1bHQgfHwgZGF0YVswXS5pZCk7XG4gIGNvbnN0IHRyZWVzdHJ1Y3R1cmVSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCB3cmFwcGVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3Qgcm9vdExldmVsSWQgPSB1c2VNZW1vKCgpID0+IHV1aWQoKSwgW10pOyAvLyBUT0RPOiB1c2UgdXNlSWQgaG9vayB3aGVuIHdlIHVwZGF0ZSB0byBSZWFjdCAxOFxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0T3BlbkZvbGRlcnMoKHByZXYpID0+IHtcbiAgICAgIGRlZmF1bHRPcGVuRm9sZGVycz8uZm9yRWFjaCgoaWQpID0+IHByZXYuYWRkKGlkKSk7XG4gICAgICByZXR1cm4gbmV3IFNldChwcmV2KTtcbiAgICB9KTtcbiAgfSwgW2RlZmF1bHRPcGVuRm9sZGVyc10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFsb2FkaW5nKSB7XG4gICAgICBzZXROZXdGb2xkZXIodW5kZWZpbmVkKTtcbiAgICB9XG4gIH0sIFtsb2FkaW5nXSk7XG5cbiAgY29uc3Qgb25Ub2dnbGVPcGVuID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICBzZXRPcGVuRm9sZGVycygocHJldikgPT4ge1xuICAgICAgaWYgKHByZXYuaGFzKGlkKSkge1xuICAgICAgICBwcmV2LmRlbGV0ZShpZCk7XG4gICAgICAgIC8vIERpZCB3ZSBqdXN0IGNsb3NlZCBhIGZvbGRlciB3aXRoIGEgbWFya2VkIGZvbGRlciBpbnNpZGUgaXQ/XG4gICAgICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIG1hcmsgdGhlIGZvbGRlciB3ZSBqdXN0IGNsb3NlZC5cbiAgICAgICAgaWYgKG1hcmtlZEZvbGRlcklkKSB7XG4gICAgICAgICAgY29uc3QgY2xvc2luZ0ZvbGRlclBhdGggPSBnZXRQYXRoT2ZGb2xkZXIoZGF0YSwgaWQpO1xuICAgICAgICAgIGNvbnN0IG1hcmtlZEZvbGRlclBhdGggPSBnZXRQYXRoT2ZGb2xkZXIoZGF0YSwgbWFya2VkRm9sZGVySWQpO1xuICAgICAgICAgIGNvbnN0IG1hcmtlZEZvbGRlcklzU3ViUGF0aCA9IGNsb3NpbmdGb2xkZXJQYXRoLmV2ZXJ5KFxuICAgICAgICAgICAgKGZvbGRlcklkLCBfaW5kZXgpID0+IG1hcmtlZEZvbGRlclBhdGhbX2luZGV4XSA9PT0gZm9sZGVySWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobWFya2VkRm9sZGVySXNTdWJQYXRoKSB7XG4gICAgICAgICAgICBzZXRNYXJrZWRGb2xkZXJJZChjbG9zaW5nRm9sZGVyUGF0aFtjbG9zaW5nRm9sZGVyUGF0aC5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2LmFkZChpZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFNldChwcmV2KTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvbkNyZWF0ZU5ld0ZvbGRlciA9IChwcm9wczogeyBpZFBhdGhzOiBudW1iZXJbXTsgcGFyZW50SWQ/OiBzdHJpbmcgfSkgPT4ge1xuICAgIHNldE5ld0ZvbGRlcihwcm9wcyk7XG4gIH07XG5cbiAgY29uc3Qgb25TYXZlTmV3Rm9sZGVyID0gYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAobmV3Rm9sZGVyKSB7XG4gICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSBhIG5ldyBmb2xkZXIgd2l0aCB0aGUgbmFtZSBvZiB2YWx1ZS5cbiAgICAgIC8vIEl0cyBsb2NhdGlvbiBpbiBzdHJ1Y3R1cmUgaXMgYmFzZWQgb24gbmV3Rm9sZGVyIG9iamVjdFxuICAgICAgY29uc3QgbmV3Rm9sZGVySWQgPSBhd2FpdCBvbk5ld0ZvbGRlcih7IC4uLm5ld0ZvbGRlciwgdmFsdWUgfSk7XG4gICAgICBpZiAobmV3Rm9sZGVySWQpIHtcbiAgICAgICAgc2V0TWFya2VkRm9sZGVySWQobmV3Rm9sZGVySWQpO1xuICAgICAgICBzZXRGb2N1c2VkRm9sZGVySWQobmV3Rm9sZGVySWQpO1xuICAgICAgICAvLyBPcGVuIGN1cnJlbnQgZm9sZGVyIGluIGNhc2UgaXQgd2FzIGNsb3NlZC4uXG4gICAgICAgIHNldE9wZW5Gb2xkZXJzKChwcmV2KSA9PiB7XG4gICAgICAgICAgaWYgKG5ld0ZvbGRlci5wYXJlbnRJZCkge1xuICAgICAgICAgICAgcHJldi5hZGQobmV3Rm9sZGVyLnBhcmVudElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTZXQocHJldik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvbkNhbmNlbE5ld0ZvbGRlciA9ICgpID0+IHtcbiAgICBzZXROZXdGb2xkZXIodW5kZWZpbmVkKTtcbiAgfTtcblxuICBjb25zdCBvbk1hcmtGb2xkZXIgPSAoaWQ6IHN0cmluZykgPT4ge1xuICAgIHNldE1hcmtlZEZvbGRlcklkKGlkKTtcbiAgICBzZXRGb2N1c2VkRm9sZGVySWQoaWQpO1xuICB9O1xuXG4gIGNvbnN0IGRpc2FibGVBZGRGb2xkZXJCdXR0b24gPVxuICAgIG1hcmtlZEZvbGRlcklkID09PSB1bmRlZmluZWQgfHwgZ2V0UGF0aE9mRm9sZGVyKGRhdGEsIG1hcmtlZEZvbGRlcklkKS5sZW5ndGggPj0gTUFYX0xFVkVMX0ZPUl9GT0xERVJTO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgcmVmPXt0cmVlc3RydWN0dXJlUmVmfVxuICAgICAgb25LZXlEb3duPXsoZSkgPT4ge1xuICAgICAgICBpZiAod3JhcHBlclJlZi5jdXJyZW50Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSAmJiBLRVlCT0FSRF9LRVlTX09GX0lOVEVSRVNULmluY2x1ZGVzKGUua2V5KSkge1xuICAgICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbih7XG4gICAgICAgICAgICBlLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHNldEZvY3VzZWRGb2xkZXJJZCxcbiAgICAgICAgICAgIGZvY3VzZWRGb2xkZXJJZCxcbiAgICAgICAgICAgIG9uVG9nZ2xlT3BlbixcbiAgICAgICAgICAgIG9wZW5Gb2xkZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9fT5cbiAgICAgIDxTdHlsZWRMYWJlbCBodG1sRm9yPXtyb290TGV2ZWxJZH0+e2xhYmVsfTwvU3R5bGVkTGFiZWw+XG4gICAgICA8VHJlZVN0cnVjdHVyZVN0eWxlZFdyYXBwZXIgcmVmPXt3cmFwcGVyUmVmfSBpZD17cm9vdExldmVsSWR9IGFyaWEtbGFiZWw9XCJNZW51IHRyZWVcIiByb2xlPVwidHJlZVwiIGZyYW1lZD17ZnJhbWVkfT5cbiAgICAgICAgPEZvbGRlckl0ZW1zXG4gICAgICAgICAgaWRQYXRocz17W119XG4gICAgICAgICAgZGF0YT17ZGF0YX1cbiAgICAgICAgICBlZGl0YWJsZT17ZWRpdGFibGV9XG4gICAgICAgICAgb25Ub2dnbGVPcGVuPXtvblRvZ2dsZU9wZW59XG4gICAgICAgICAgbmV3Rm9sZGVyPXtuZXdGb2xkZXJ9XG4gICAgICAgICAgb25DcmVhdGVOZXdGb2xkZXI9e29uQ3JlYXRlTmV3Rm9sZGVyfVxuICAgICAgICAgIG9uQ2FuY2VsTmV3Rm9sZGVyPXtvbkNhbmNlbE5ld0ZvbGRlcn1cbiAgICAgICAgICBvblNhdmVOZXdGb2xkZXI9e29uU2F2ZU5ld0ZvbGRlcn1cbiAgICAgICAgICBvcGVuRm9sZGVycz17b3BlbkZvbGRlcnN9XG4gICAgICAgICAgbWFya2VkRm9sZGVySWQ9e21hcmtlZEZvbGRlcklkfVxuICAgICAgICAgIG9uTWFya0ZvbGRlcj17b25NYXJrRm9sZGVyfVxuICAgICAgICAgIG9wZW5PbkZvbGRlckNsaWNrPXtvcGVuT25Gb2xkZXJDbGlja31cbiAgICAgICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgICAgIGZvY3VzZWRGb2xkZXJJZD17Zm9jdXNlZEZvbGRlcklkfVxuICAgICAgICAgIHNldEZvY3VzZWRGb2xkZXJJZD17c2V0Rm9jdXNlZEZvbGRlcklkfVxuICAgICAgICAgIGZpcnN0TGV2ZWxcbiAgICAgICAgLz5cbiAgICAgIDwvVHJlZVN0cnVjdHVyZVN0eWxlZFdyYXBwZXI+XG4gICAgICB7ZWRpdGFibGUgJiYgKFxuICAgICAgICA8QWRkRm9sZGVyV3JhcHBlcj5cbiAgICAgICAgICA8VG9vbHRpcFxuICAgICAgICAgICAgdG9vbHRpcD17dCgnbXlOZGxhLm5ld0ZvbGRlclVuZGVyJywge1xuICAgICAgICAgICAgICBmb2xkZXJOYW1lOiBnZXRGb2xkZXJOYW1lKGRhdGEsIG1hcmtlZEZvbGRlcklkKSxcbiAgICAgICAgICAgIH0pfT5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgbGlnaHRcbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVBZGRGb2xkZXJCdXR0b259XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRocyA9IGdldFBhdGhPZkZvbGRlcihkYXRhLCBtYXJrZWRGb2xkZXJJZCB8fCAnJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRQYXRocyA9IGdldElkUGF0aHNPZkZvbGRlcihkYXRhLCBtYXJrZWRGb2xkZXJJZCB8fCAnJyk7XG4gICAgICAgICAgICAgICAgc2V0TmV3Rm9sZGVyKHsgaWRQYXRocywgcGFyZW50SWQ6IHBhdGhzW3BhdGhzLmxlbmd0aCAtIDFdIH0pO1xuICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAge3QoJ215TmRsYS5uZXdGb2xkZXInKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgPC9BZGRGb2xkZXJXcmFwcGVyPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRyZWVTdHJ1Y3R1cmU7XG4iXX0= */"));
49
+
50
+ var AddFolderWrapper = _styled("div", {
51
+ target: "e1dg1gdn1",
52
+ label: "AddFolderWrapper"
53
+ })("display:flex;margin-top:", spacing.xsmall, ";" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyZWVTdHJ1Y3R1cmUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTJCbUMiLCJmaWxlIjoiVHJlZVN0cnVjdHVyZS50c3giLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMi1wcmVzZW50LCBORExBLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTHYzIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICovXG5cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnQG5kbGEvdXRpbCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ0BuZGxhL2J1dHRvbic7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICdAbmRsYS90b29sdGlwJztcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBzcGFjaW5nLCBmb250cyB9IGZyb20gJ0BuZGxhL2NvcmUnO1xuaW1wb3J0IFRyZWVTdHJ1Y3R1cmVTdHlsZWRXcmFwcGVyIGZyb20gJy4vVHJlZVN0cnVjdHVyZVdyYXBwZXInO1xuaW1wb3J0IEZvbGRlckl0ZW1zIGZyb20gJy4vRm9sZGVySXRlbXMnO1xuaW1wb3J0IHsgZ2V0SWRQYXRoc09mRm9sZGVyLCBnZXRQYXRoT2ZGb2xkZXIsIGdldEZvbGRlck5hbWUgfSBmcm9tICcuL2hlbHBlckZ1bmN0aW9ucyc7XG5pbXBvcnQga2V5Ym9hcmROYXZpZ2F0aW9uLCB7IEtFWUJPQVJEX0tFWVNfT0ZfSU5URVJFU1QgfSBmcm9tICcuL2tleWJvYXJkTmF2aWdhdGlvbi9rZXlib2FyZE5hdmlnYXRpb24nO1xuaW1wb3J0IHsgTmV3Rm9sZGVyUHJvcHMsIFRyZWVTdHJ1Y3R1cmVQcm9wcyB9IGZyb20gJy4vVHJlZVN0cnVjdHVyZS50eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBNQVhfTEVWRUxfRk9SX0ZPTERFUlMgPSA0O1xuXG5jb25zdCBTdHlsZWRMYWJlbCA9IHN0eWxlZC5sYWJlbGBcbiAgZm9udC13ZWlnaHQ6ICR7Zm9udHMud2VpZ2h0LnNlbWlib2xkfTtcbmA7XG5cbmNvbnN0IEFkZEZvbGRlcldyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBtYXJnaW4tdG9wOiAke3NwYWNpbmcueHNtYWxsfTtcbmA7XG5cbmNvbnN0IFRyZWVTdHJ1Y3R1cmUgPSAoe1xuICBkYXRhLFxuICBsYWJlbCxcbiAgZWRpdGFibGUsXG4gIGxvYWRpbmcsXG4gIG9uTmV3Rm9sZGVyLFxuICBvcGVuT25Gb2xkZXJDbGljayxcbiAgZnJhbWVkLFxuICBmb2xkZXJJZE1hcmtlZEJ5RGVmYXVsdCxcbiAgZGVmYXVsdE9wZW5Gb2xkZXJzLFxufTogVHJlZVN0cnVjdHVyZVByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW25ld0ZvbGRlciwgc2V0TmV3Rm9sZGVyXSA9IHVzZVN0YXRlPE5ld0ZvbGRlclByb3BzIHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBbb3BlbkZvbGRlcnMsIHNldE9wZW5Gb2xkZXJzXSA9IHVzZVN0YXRlPFNldDxzdHJpbmc+PihuZXcgU2V0KGRlZmF1bHRPcGVuRm9sZGVycyB8fCBbXSkpO1xuICBjb25zdCBbZm9jdXNlZEZvbGRlcklkLCBzZXRGb2N1c2VkRm9sZGVySWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBbbWFya2VkRm9sZGVySWQsIHNldE1hcmtlZEZvbGRlcklkXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oZm9sZGVySWRNYXJrZWRCeURlZmF1bHQgfHwgZGF0YVswXS5pZCk7XG4gIGNvbnN0IHRyZWVzdHJ1Y3R1cmVSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCB3cmFwcGVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3Qgcm9vdExldmVsSWQgPSB1c2VNZW1vKCgpID0+IHV1aWQoKSwgW10pOyAvLyBUT0RPOiB1c2UgdXNlSWQgaG9vayB3aGVuIHdlIHVwZGF0ZSB0byBSZWFjdCAxOFxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0T3BlbkZvbGRlcnMoKHByZXYpID0+IHtcbiAgICAgIGRlZmF1bHRPcGVuRm9sZGVycz8uZm9yRWFjaCgoaWQpID0+IHByZXYuYWRkKGlkKSk7XG4gICAgICByZXR1cm4gbmV3IFNldChwcmV2KTtcbiAgICB9KTtcbiAgfSwgW2RlZmF1bHRPcGVuRm9sZGVyc10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFsb2FkaW5nKSB7XG4gICAgICBzZXROZXdGb2xkZXIodW5kZWZpbmVkKTtcbiAgICB9XG4gIH0sIFtsb2FkaW5nXSk7XG5cbiAgY29uc3Qgb25Ub2dnbGVPcGVuID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICBzZXRPcGVuRm9sZGVycygocHJldikgPT4ge1xuICAgICAgaWYgKHByZXYuaGFzKGlkKSkge1xuICAgICAgICBwcmV2LmRlbGV0ZShpZCk7XG4gICAgICAgIC8vIERpZCB3ZSBqdXN0IGNsb3NlZCBhIGZvbGRlciB3aXRoIGEgbWFya2VkIGZvbGRlciBpbnNpZGUgaXQ/XG4gICAgICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIG1hcmsgdGhlIGZvbGRlciB3ZSBqdXN0IGNsb3NlZC5cbiAgICAgICAgaWYgKG1hcmtlZEZvbGRlcklkKSB7XG4gICAgICAgICAgY29uc3QgY2xvc2luZ0ZvbGRlclBhdGggPSBnZXRQYXRoT2ZGb2xkZXIoZGF0YSwgaWQpO1xuICAgICAgICAgIGNvbnN0IG1hcmtlZEZvbGRlclBhdGggPSBnZXRQYXRoT2ZGb2xkZXIoZGF0YSwgbWFya2VkRm9sZGVySWQpO1xuICAgICAgICAgIGNvbnN0IG1hcmtlZEZvbGRlcklzU3ViUGF0aCA9IGNsb3NpbmdGb2xkZXJQYXRoLmV2ZXJ5KFxuICAgICAgICAgICAgKGZvbGRlcklkLCBfaW5kZXgpID0+IG1hcmtlZEZvbGRlclBhdGhbX2luZGV4XSA9PT0gZm9sZGVySWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobWFya2VkRm9sZGVySXNTdWJQYXRoKSB7XG4gICAgICAgICAgICBzZXRNYXJrZWRGb2xkZXJJZChjbG9zaW5nRm9sZGVyUGF0aFtjbG9zaW5nRm9sZGVyUGF0aC5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2LmFkZChpZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFNldChwcmV2KTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvbkNyZWF0ZU5ld0ZvbGRlciA9IChwcm9wczogeyBpZFBhdGhzOiBudW1iZXJbXTsgcGFyZW50SWQ/OiBzdHJpbmcgfSkgPT4ge1xuICAgIHNldE5ld0ZvbGRlcihwcm9wcyk7XG4gIH07XG5cbiAgY29uc3Qgb25TYXZlTmV3Rm9sZGVyID0gYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAobmV3Rm9sZGVyKSB7XG4gICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSBhIG5ldyBmb2xkZXIgd2l0aCB0aGUgbmFtZSBvZiB2YWx1ZS5cbiAgICAgIC8vIEl0cyBsb2NhdGlvbiBpbiBzdHJ1Y3R1cmUgaXMgYmFzZWQgb24gbmV3Rm9sZGVyIG9iamVjdFxuICAgICAgY29uc3QgbmV3Rm9sZGVySWQgPSBhd2FpdCBvbk5ld0ZvbGRlcih7IC4uLm5ld0ZvbGRlciwgdmFsdWUgfSk7XG4gICAgICBpZiAobmV3Rm9sZGVySWQpIHtcbiAgICAgICAgc2V0TWFya2VkRm9sZGVySWQobmV3Rm9sZGVySWQpO1xuICAgICAgICBzZXRGb2N1c2VkRm9sZGVySWQobmV3Rm9sZGVySWQpO1xuICAgICAgICAvLyBPcGVuIGN1cnJlbnQgZm9sZGVyIGluIGNhc2UgaXQgd2FzIGNsb3NlZC4uXG4gICAgICAgIHNldE9wZW5Gb2xkZXJzKChwcmV2KSA9PiB7XG4gICAgICAgICAgaWYgKG5ld0ZvbGRlci5wYXJlbnRJZCkge1xuICAgICAgICAgICAgcHJldi5hZGQobmV3Rm9sZGVyLnBhcmVudElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTZXQocHJldik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvbkNhbmNlbE5ld0ZvbGRlciA9ICgpID0+IHtcbiAgICBzZXROZXdGb2xkZXIodW5kZWZpbmVkKTtcbiAgfTtcblxuICBjb25zdCBvbk1hcmtGb2xkZXIgPSAoaWQ6IHN0cmluZykgPT4ge1xuICAgIHNldE1hcmtlZEZvbGRlcklkKGlkKTtcbiAgICBzZXRGb2N1c2VkRm9sZGVySWQoaWQpO1xuICB9O1xuXG4gIGNvbnN0IGRpc2FibGVBZGRGb2xkZXJCdXR0b24gPVxuICAgIG1hcmtlZEZvbGRlcklkID09PSB1bmRlZmluZWQgfHwgZ2V0UGF0aE9mRm9sZGVyKGRhdGEsIG1hcmtlZEZvbGRlcklkKS5sZW5ndGggPj0gTUFYX0xFVkVMX0ZPUl9GT0xERVJTO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgcmVmPXt0cmVlc3RydWN0dXJlUmVmfVxuICAgICAgb25LZXlEb3duPXsoZSkgPT4ge1xuICAgICAgICBpZiAod3JhcHBlclJlZi5jdXJyZW50Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSAmJiBLRVlCT0FSRF9LRVlTX09GX0lOVEVSRVNULmluY2x1ZGVzKGUua2V5KSkge1xuICAgICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbih7XG4gICAgICAgICAgICBlLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHNldEZvY3VzZWRGb2xkZXJJZCxcbiAgICAgICAgICAgIGZvY3VzZWRGb2xkZXJJZCxcbiAgICAgICAgICAgIG9uVG9nZ2xlT3BlbixcbiAgICAgICAgICAgIG9wZW5Gb2xkZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9fT5cbiAgICAgIDxTdHlsZWRMYWJlbCBodG1sRm9yPXtyb290TGV2ZWxJZH0+e2xhYmVsfTwvU3R5bGVkTGFiZWw+XG4gICAgICA8VHJlZVN0cnVjdHVyZVN0eWxlZFdyYXBwZXIgcmVmPXt3cmFwcGVyUmVmfSBpZD17cm9vdExldmVsSWR9IGFyaWEtbGFiZWw9XCJNZW51IHRyZWVcIiByb2xlPVwidHJlZVwiIGZyYW1lZD17ZnJhbWVkfT5cbiAgICAgICAgPEZvbGRlckl0ZW1zXG4gICAgICAgICAgaWRQYXRocz17W119XG4gICAgICAgICAgZGF0YT17ZGF0YX1cbiAgICAgICAgICBlZGl0YWJsZT17ZWRpdGFibGV9XG4gICAgICAgICAgb25Ub2dnbGVPcGVuPXtvblRvZ2dsZU9wZW59XG4gICAgICAgICAgbmV3Rm9sZGVyPXtuZXdGb2xkZXJ9XG4gICAgICAgICAgb25DcmVhdGVOZXdGb2xkZXI9e29uQ3JlYXRlTmV3Rm9sZGVyfVxuICAgICAgICAgIG9uQ2FuY2VsTmV3Rm9sZGVyPXtvbkNhbmNlbE5ld0ZvbGRlcn1cbiAgICAgICAgICBvblNhdmVOZXdGb2xkZXI9e29uU2F2ZU5ld0ZvbGRlcn1cbiAgICAgICAgICBvcGVuRm9sZGVycz17b3BlbkZvbGRlcnN9XG4gICAgICAgICAgbWFya2VkRm9sZGVySWQ9e21hcmtlZEZvbGRlcklkfVxuICAgICAgICAgIG9uTWFya0ZvbGRlcj17b25NYXJrRm9sZGVyfVxuICAgICAgICAgIG9wZW5PbkZvbGRlckNsaWNrPXtvcGVuT25Gb2xkZXJDbGlja31cbiAgICAgICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgICAgIGZvY3VzZWRGb2xkZXJJZD17Zm9jdXNlZEZvbGRlcklkfVxuICAgICAgICAgIHNldEZvY3VzZWRGb2xkZXJJZD17c2V0Rm9jdXNlZEZvbGRlcklkfVxuICAgICAgICAgIGZpcnN0TGV2ZWxcbiAgICAgICAgLz5cbiAgICAgIDwvVHJlZVN0cnVjdHVyZVN0eWxlZFdyYXBwZXI+XG4gICAgICB7ZWRpdGFibGUgJiYgKFxuICAgICAgICA8QWRkRm9sZGVyV3JhcHBlcj5cbiAgICAgICAgICA8VG9vbHRpcFxuICAgICAgICAgICAgdG9vbHRpcD17dCgnbXlOZGxhLm5ld0ZvbGRlclVuZGVyJywge1xuICAgICAgICAgICAgICBmb2xkZXJOYW1lOiBnZXRGb2xkZXJOYW1lKGRhdGEsIG1hcmtlZEZvbGRlcklkKSxcbiAgICAgICAgICAgIH0pfT5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgbGlnaHRcbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVBZGRGb2xkZXJCdXR0b259XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRocyA9IGdldFBhdGhPZkZvbGRlcihkYXRhLCBtYXJrZWRGb2xkZXJJZCB8fCAnJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRQYXRocyA9IGdldElkUGF0aHNPZkZvbGRlcihkYXRhLCBtYXJrZWRGb2xkZXJJZCB8fCAnJyk7XG4gICAgICAgICAgICAgICAgc2V0TmV3Rm9sZGVyKHsgaWRQYXRocywgcGFyZW50SWQ6IHBhdGhzW3BhdGhzLmxlbmd0aCAtIDFdIH0pO1xuICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAge3QoJ215TmRsYS5uZXdGb2xkZXInKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgPC9BZGRGb2xkZXJXcmFwcGVyPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRyZWVTdHJ1Y3R1cmU7XG4iXX0= */"));
54
+
55
+ var TreeStructure = function TreeStructure(_ref) {
56
+ var data = _ref.data,
57
+ label = _ref.label,
58
+ editable = _ref.editable,
59
+ loading = _ref.loading,
60
+ onNewFolder = _ref.onNewFolder,
61
+ openOnFolderClick = _ref.openOnFolderClick,
62
+ framed = _ref.framed,
63
+ folderIdMarkedByDefault = _ref.folderIdMarkedByDefault,
64
+ defaultOpenFolders = _ref.defaultOpenFolders;
65
+
66
+ var _useTranslation = useTranslation(),
67
+ t = _useTranslation.t;
68
+
69
+ var _useState = useState(),
70
+ _useState2 = _slicedToArray(_useState, 2),
71
+ newFolder = _useState2[0],
72
+ setNewFolder = _useState2[1];
73
+
74
+ var _useState3 = useState(new Set(defaultOpenFolders || [])),
75
+ _useState4 = _slicedToArray(_useState3, 2),
76
+ openFolders = _useState4[0],
77
+ setOpenFolders = _useState4[1];
78
+
79
+ var _useState5 = useState(),
80
+ _useState6 = _slicedToArray(_useState5, 2),
81
+ focusedFolderId = _useState6[0],
82
+ setFocusedFolderId = _useState6[1];
83
+
84
+ var _useState7 = useState(folderIdMarkedByDefault || data[0].id),
85
+ _useState8 = _slicedToArray(_useState7, 2),
86
+ markedFolderId = _useState8[0],
87
+ setMarkedFolderId = _useState8[1];
88
+
89
+ var treestructureRef = useRef(null);
90
+ var wrapperRef = useRef(null);
91
+ var rootLevelId = useMemo(function () {
92
+ return uuid();
93
+ }, []); // TODO: use useId hook when we update to React 18
94
+
95
+ useEffect(function () {
96
+ setOpenFolders(function (prev) {
97
+ defaultOpenFolders === null || defaultOpenFolders === void 0 ? void 0 : defaultOpenFolders.forEach(function (id) {
98
+ return prev.add(id);
99
+ });
100
+ return new Set(prev);
101
+ });
102
+ }, [defaultOpenFolders]);
103
+ useEffect(function () {
104
+ if (!loading) {
105
+ setNewFolder(undefined);
106
+ }
107
+ }, [loading]);
108
+
109
+ var onToggleOpen = function onToggleOpen(id) {
110
+ setOpenFolders(function (prev) {
111
+ if (prev.has(id)) {
112
+ prev["delete"](id); // Did we just closed a folder with a marked folder inside it?
113
+ // If so, we need to mark the folder we just closed.
114
+
115
+ if (markedFolderId) {
116
+ var closingFolderPath = getPathOfFolder(data, id);
117
+ var markedFolderPath = getPathOfFolder(data, markedFolderId);
118
+ var markedFolderIsSubPath = closingFolderPath.every(function (folderId, _index) {
119
+ return markedFolderPath[_index] === folderId;
120
+ });
121
+
122
+ if (markedFolderIsSubPath) {
123
+ setMarkedFolderId(closingFolderPath[closingFolderPath.length - 1]);
124
+ }
125
+ }
126
+ } else {
127
+ prev.add(id);
128
+ }
129
+
130
+ return new Set(prev);
131
+ });
132
+ };
133
+
134
+ var onCreateNewFolder = function onCreateNewFolder(props) {
135
+ setNewFolder(props);
136
+ };
137
+
138
+ var onSaveNewFolder = /*#__PURE__*/function () {
139
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(value) {
140
+ var newFolderId;
141
+ return regeneratorRuntime.wrap(function _callee$(_context) {
142
+ while (1) {
143
+ switch (_context.prev = _context.next) {
144
+ case 0:
145
+ if (!newFolder) {
146
+ _context.next = 5;
147
+ break;
148
+ }
149
+
150
+ _context.next = 3;
151
+ return onNewFolder(_objectSpread(_objectSpread({}, newFolder), {}, {
152
+ value: value
153
+ }));
154
+
155
+ case 3:
156
+ newFolderId = _context.sent;
157
+
158
+ if (newFolderId) {
159
+ setMarkedFolderId(newFolderId);
160
+ setFocusedFolderId(newFolderId); // Open current folder in case it was closed..
161
+
162
+ setOpenFolders(function (prev) {
163
+ if (newFolder.parentId) {
164
+ prev.add(newFolder.parentId);
165
+ }
166
+
167
+ return new Set(prev);
168
+ });
169
+ }
170
+
171
+ case 5:
172
+ case "end":
173
+ return _context.stop();
174
+ }
175
+ }
176
+ }, _callee);
177
+ }));
178
+
179
+ return function onSaveNewFolder(_x) {
180
+ return _ref2.apply(this, arguments);
181
+ };
182
+ }();
183
+
184
+ var onCancelNewFolder = function onCancelNewFolder() {
185
+ setNewFolder(undefined);
186
+ };
187
+
188
+ var onMarkFolder = function onMarkFolder(id) {
189
+ setMarkedFolderId(id);
190
+ setFocusedFolderId(id);
191
+ };
192
+
193
+ var disableAddFolderButton = markedFolderId === undefined || getPathOfFolder(data, markedFolderId).length >= MAX_LEVEL_FOR_FOLDERS;
194
+ return ___EmotionJSX("div", {
195
+ ref: treestructureRef,
196
+ onKeyDown: function onKeyDown(e) {
197
+ var _wrapperRef$current;
198
+
199
+ if (((_wrapperRef$current = wrapperRef.current) === null || _wrapperRef$current === void 0 ? void 0 : _wrapperRef$current.contains(document.activeElement)) && KEYBOARD_KEYS_OF_INTEREST.includes(e.key)) {
200
+ keyboardNavigation({
201
+ e: e,
202
+ data: data,
203
+ setFocusedFolderId: setFocusedFolderId,
204
+ focusedFolderId: focusedFolderId,
205
+ onToggleOpen: onToggleOpen,
206
+ openFolders: openFolders
207
+ });
208
+ }
209
+ }
210
+ }, ___EmotionJSX(StyledLabel, {
211
+ htmlFor: rootLevelId
212
+ }, label), ___EmotionJSX(TreeStructureStyledWrapper, {
213
+ ref: wrapperRef,
214
+ id: rootLevelId,
215
+ "aria-label": "Menu tree",
216
+ role: "tree",
217
+ framed: framed
218
+ }, ___EmotionJSX(FolderItems, {
219
+ idPaths: [],
220
+ data: data,
221
+ editable: editable,
222
+ onToggleOpen: onToggleOpen,
223
+ newFolder: newFolder,
224
+ onCreateNewFolder: onCreateNewFolder,
225
+ onCancelNewFolder: onCancelNewFolder,
226
+ onSaveNewFolder: onSaveNewFolder,
227
+ openFolders: openFolders,
228
+ markedFolderId: markedFolderId,
229
+ onMarkFolder: onMarkFolder,
230
+ openOnFolderClick: openOnFolderClick,
231
+ loading: loading,
232
+ focusedFolderId: focusedFolderId,
233
+ setFocusedFolderId: setFocusedFolderId,
234
+ firstLevel: true
235
+ })), editable && ___EmotionJSX(AddFolderWrapper, null, ___EmotionJSX(Tooltip, {
236
+ tooltip: t('myNdla.newFolderUnder', {
237
+ folderName: getFolderName(data, markedFolderId)
238
+ })
239
+ }, ___EmotionJSX(Button, {
240
+ size: "small",
241
+ light: true,
242
+ disabled: disableAddFolderButton,
243
+ onClick: function onClick() {
244
+ var paths = getPathOfFolder(data, markedFolderId || '');
245
+ var idPaths = getIdPathsOfFolder(data, markedFolderId || '');
246
+ setNewFolder({
247
+ idPaths: idPaths,
248
+ parentId: paths[paths.length - 1]
249
+ });
250
+ }
251
+ }, t('myNdla.newFolder')))));
252
+ };
253
+
254
+ export default TreeStructure;
File without changes
@@ -0,0 +1,13 @@
1
+ import _styled from "@emotion/styled-base";
2
+ import { css } from '@emotion/core';
3
+ import { colors, misc, spacing } from '@ndla/core';
4
+
5
+ var TreeStructureWrapper = _styled("div", {
6
+ target: "ez53f4u0",
7
+ label: "TreeStructureWrapper"
8
+ })("padding:", spacing.xsmall, ";", function (_ref) {
9
+ var framed = _ref.framed;
10
+ return framed ? /*#__PURE__*/css("border:1px solid ", colors.brand.greyLighter, ";border-radius:", misc.borderRadius, ";max-height:400px;overflow-y:scroll;scroll-behavior:smooth;padding:", spacing.small, ";;label:TreeStructureWrapper;" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyZWVTdHJ1Y3R1cmVXcmFwcGVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFnQlciLCJmaWxlIjoiVHJlZVN0cnVjdHVyZVdyYXBwZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItcHJlc2VudCwgTkRMQS5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MyBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuXG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBjc3MgfSBmcm9tICdAZW1vdGlvbi9jb3JlJztcbmltcG9ydCB7IGNvbG9ycywgbWlzYywgc3BhY2luZyB9IGZyb20gJ0BuZGxhL2NvcmUnO1xuXG5jb25zdCBUcmVlU3RydWN0dXJlV3JhcHBlciA9IHN0eWxlZC5kaXY8eyBmcmFtZWQ/OiBib29sZWFuIH0+YFxuICBwYWRkaW5nOiAke3NwYWNpbmcueHNtYWxsfTtcbiAgJHsoeyBmcmFtZWQgfSkgPT5cbiAgICBmcmFtZWRcbiAgICAgID8gY3NzYFxuICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y29sb3JzLmJyYW5kLmdyZXlMaWdodGVyfTtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAke21pc2MuYm9yZGVyUmFkaXVzfTtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7XG4gICAgICAgICAgcGFkZGluZzogJHtzcGFjaW5nLnNtYWxsfTtcbiAgICAgICAgYFxuICAgICAgOiBjc3NgXG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IC0ke3NwYWNpbmcubWVkaXVtfTtcbiAgICAgICAgYH1cbiAgdHJhbnNpdGlvbjogJHttaXNjLnRyYW5zaXRpb24uZGVmYXVsdH07XG4gICY6Zm9jdXMtd2l0aGluIHtcbiAgICBib3JkZXItY29sb3I6ICR7Y29sb3JzLmJyYW5kLnByaW1hcnl9O1xuICB9XG5gO1xuXG5leHBvcnQgZGVmYXVsdCBUcmVlU3RydWN0dXJlV3JhcHBlcjtcbiJdfQ== */")) : /*#__PURE__*/css("margin-left:-", spacing.medium, ";;label:TreeStructureWrapper;" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyZWVTdHJ1Y3R1cmVXcmFwcGVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF3QlciLCJmaWxlIjoiVHJlZVN0cnVjdHVyZVdyYXBwZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItcHJlc2VudCwgTkRMQS5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MyBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuXG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBjc3MgfSBmcm9tICdAZW1vdGlvbi9jb3JlJztcbmltcG9ydCB7IGNvbG9ycywgbWlzYywgc3BhY2luZyB9IGZyb20gJ0BuZGxhL2NvcmUnO1xuXG5jb25zdCBUcmVlU3RydWN0dXJlV3JhcHBlciA9IHN0eWxlZC5kaXY8eyBmcmFtZWQ/OiBib29sZWFuIH0+YFxuICBwYWRkaW5nOiAke3NwYWNpbmcueHNtYWxsfTtcbiAgJHsoeyBmcmFtZWQgfSkgPT5cbiAgICBmcmFtZWRcbiAgICAgID8gY3NzYFxuICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y29sb3JzLmJyYW5kLmdyZXlMaWdodGVyfTtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAke21pc2MuYm9yZGVyUmFkaXVzfTtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7XG4gICAgICAgICAgcGFkZGluZzogJHtzcGFjaW5nLnNtYWxsfTtcbiAgICAgICAgYFxuICAgICAgOiBjc3NgXG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IC0ke3NwYWNpbmcubWVkaXVtfTtcbiAgICAgICAgYH1cbiAgdHJhbnNpdGlvbjogJHttaXNjLnRyYW5zaXRpb24uZGVmYXVsdH07XG4gICY6Zm9jdXMtd2l0aGluIHtcbiAgICBib3JkZXItY29sb3I6ICR7Y29sb3JzLmJyYW5kLnByaW1hcnl9O1xuICB9XG5gO1xuXG5leHBvcnQgZGVmYXVsdCBUcmVlU3RydWN0dXJlV3JhcHBlcjtcbiJdfQ== */"));
11
+ }, " transition:", misc.transition["default"], ";&:focus-within{border-color:", colors.brand.primary, ";}" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyZWVTdHJ1Y3R1cmVXcmFwcGVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZNkQiLCJmaWxlIjoiVHJlZVN0cnVjdHVyZVdyYXBwZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItcHJlc2VudCwgTkRMQS5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MyBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuXG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBjc3MgfSBmcm9tICdAZW1vdGlvbi9jb3JlJztcbmltcG9ydCB7IGNvbG9ycywgbWlzYywgc3BhY2luZyB9IGZyb20gJ0BuZGxhL2NvcmUnO1xuXG5jb25zdCBUcmVlU3RydWN0dXJlV3JhcHBlciA9IHN0eWxlZC5kaXY8eyBmcmFtZWQ/OiBib29sZWFuIH0+YFxuICBwYWRkaW5nOiAke3NwYWNpbmcueHNtYWxsfTtcbiAgJHsoeyBmcmFtZWQgfSkgPT5cbiAgICBmcmFtZWRcbiAgICAgID8gY3NzYFxuICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y29sb3JzLmJyYW5kLmdyZXlMaWdodGVyfTtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAke21pc2MuYm9yZGVyUmFkaXVzfTtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7XG4gICAgICAgICAgcGFkZGluZzogJHtzcGFjaW5nLnNtYWxsfTtcbiAgICAgICAgYFxuICAgICAgOiBjc3NgXG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IC0ke3NwYWNpbmcubWVkaXVtfTtcbiAgICAgICAgYH1cbiAgdHJhbnNpdGlvbjogJHttaXNjLnRyYW5zaXRpb24uZGVmYXVsdH07XG4gICY6Zm9jdXMtd2l0aGluIHtcbiAgICBib3JkZXItY29sb3I6ICR7Y29sb3JzLmJyYW5kLnByaW1hcnl9O1xuICB9XG5gO1xuXG5leHBvcnQgZGVmYXVsdCBUcmVlU3RydWN0dXJlV3JhcHBlcjtcbiJdfQ== */"));
12
+
13
+ export default TreeStructureWrapper;
@@ -0,0 +1,92 @@
1
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
2
+
3
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+
5
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
6
+
7
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
8
+
9
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
10
+
11
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
12
+
13
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
14
+
15
+ var getPathOfFolder = function getPathOfFolder(data, findId) {
16
+ var paths = function paths(dataChildren, path) {
17
+ var _iterator = _createForOfIteratorHelper(dataChildren),
18
+ _step;
19
+
20
+ try {
21
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
22
+ var _step$value = _step.value,
23
+ id = _step$value.id,
24
+ dataChildrenSub = _step$value.data;
25
+
26
+ if (id === findId) {
27
+ return [].concat(_toConsumableArray(path), [id]);
28
+ } else if (dataChildrenSub === null || dataChildrenSub === void 0 ? void 0 : dataChildrenSub.length) {
29
+ return paths(dataChildrenSub, [].concat(_toConsumableArray(path), [id]));
30
+ }
31
+ }
32
+ } catch (err) {
33
+ _iterator.e(err);
34
+ } finally {
35
+ _iterator.f();
36
+ }
37
+
38
+ return [];
39
+ };
40
+
41
+ return paths(data, []);
42
+ };
43
+
44
+ var getIdPathsOfFolder = function getIdPathsOfFolder(data, findId) {
45
+ var currentPath = [];
46
+
47
+ var paths = function paths(dataChildren, path) {
48
+ dataChildren.forEach(function (_ref, _index) {
49
+ var id = _ref.id,
50
+ dataChildrenSub = _ref.data;
51
+
52
+ if (id === findId) {
53
+ currentPath = [].concat(_toConsumableArray(path), [_index]);
54
+ } else if (dataChildrenSub === null || dataChildrenSub === void 0 ? void 0 : dataChildrenSub.length) {
55
+ paths(dataChildrenSub, [].concat(_toConsumableArray(path), [_index]));
56
+ }
57
+ });
58
+ };
59
+
60
+ paths(data, []);
61
+ return currentPath;
62
+ };
63
+
64
+ var getFolderName = function getFolderName(data, findId) {
65
+ if (!findId) {
66
+ return undefined;
67
+ }
68
+
69
+ var folderName;
70
+
71
+ var paths = function paths(dataChildren) {
72
+ dataChildren.some(function (_ref2, _index) {
73
+ var id = _ref2.id,
74
+ name = _ref2.name,
75
+ dataChildrenSub = _ref2.data;
76
+
77
+ if (id === findId) {
78
+ folderName = name;
79
+ return true;
80
+ } else if (dataChildrenSub === null || dataChildrenSub === void 0 ? void 0 : dataChildrenSub.length) {
81
+ return paths(dataChildrenSub);
82
+ }
83
+
84
+ return false;
85
+ });
86
+ };
87
+
88
+ paths(data);
89
+ return folderName;
90
+ };
91
+
92
+ export { getPathOfFolder, getIdPathsOfFolder, getFolderName };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Copyright (c) 2022-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+ import TreeStructure from './TreeStructure';
9
+ export { TreeStructure };
@@ -0,0 +1,182 @@
1
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
2
+
3
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+
5
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
6
+
7
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
8
+
9
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
10
+
11
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
12
+
13
+ /**
14
+ * Copyright (c) 2022-present, NDLA.
15
+ *
16
+ * This source code is licensed under the GPLv3 license found in the
17
+ * LICENSE file in the root directory of this source tree.
18
+ *
19
+ */
20
+ import { MAX_LEVEL_FOR_FOLDERS } from '../TreeStructure';
21
+ export var KEYBOARD_KEYS_OF_INTEREST = ['ArrowDown', 'ArrowUp', 'ArrowRight', 'ArrowLeft', ' ']; // Traverse upwards, incase parent is last element of its parent..
22
+
23
+ var traverseUpwards = function traverseUpwards(inital, setFocusedFolderId, paths, index) {
24
+ var findParent = inital;
25
+ var parentNextIds = [];
26
+ paths.forEach(function (pathIndex) {
27
+ var nextParent = findParent ? findParent[pathIndex + 1] : undefined;
28
+ parentNextIds.push((nextParent === null || nextParent === void 0 ? void 0 : nextParent.id) || false);
29
+ findParent = findParent[pathIndex].data || [];
30
+ });
31
+
32
+ if (!parentNextIds.length) {
33
+ var _findParent;
34
+
35
+ parentNextIds.push(((_findParent = findParent[index + 1]) === null || _findParent === void 0 ? void 0 : _findParent.id) || false);
36
+ } // We use a reversed version of parentNextIds, filtered out falses, to find the next element
37
+ // No newId? We are at the end of the tree so we wont update.
38
+
39
+
40
+ var newId = parentNextIds.reverse().filter(function (id) {
41
+ return id;
42
+ })[0];
43
+
44
+ if (newId) {
45
+ setFocusedFolderId(newId);
46
+ }
47
+ };
48
+
49
+ var keyboardNavigation = function keyboardNavigation(_ref) {
50
+ var _document$activeEleme, _elementWithKeyFocus$3;
51
+
52
+ var e = _ref.e,
53
+ data = _ref.data,
54
+ onToggleOpen = _ref.onToggleOpen,
55
+ setFocusedFolderId = _ref.setFocusedFolderId,
56
+ id = _ref.focusedFolderId,
57
+ openFolders = _ref.openFolders;
58
+
59
+ if (e.key === ' ' && ((_document$activeEleme = document.activeElement) === null || _document$activeEleme === void 0 ? void 0 : _document$activeEleme.nodeName) === 'INPUT') {
60
+ return;
61
+ } // We are navigating in the tree.
62
+ // We need to find the next folder in the tree
63
+
64
+
65
+ var elementWithKeyFocus = {
66
+ paths: [],
67
+ index: 0
68
+ };
69
+
70
+ var updatePathToElementWithKeyFocus = function updatePathToElementWithKeyFocus(data, paths, parent, parentId) {
71
+ return data.some(function (_ref2, _index) {
72
+ var childData = _ref2.data,
73
+ dataId = _ref2.id,
74
+ url = _ref2.url;
75
+
76
+ if (dataId === id) {
77
+ elementWithKeyFocus.paths = paths;
78
+ elementWithKeyFocus.index = _index;
79
+ elementWithKeyFocus.isOpen = openFolders.has(dataId) && childData && childData.length > 0;
80
+ elementWithKeyFocus.data = childData;
81
+ elementWithKeyFocus.parent = parent;
82
+ elementWithKeyFocus.parentId = parentId;
83
+ elementWithKeyFocus.url = url;
84
+ return true;
85
+ }
86
+
87
+ return childData ? updatePathToElementWithKeyFocus(childData, [].concat(_toConsumableArray(paths), [_index]), _toConsumableArray(childData), dataId) : false;
88
+ });
89
+ };
90
+
91
+ if (!updatePathToElementWithKeyFocus(data, [], data)) {
92
+ // Couldn't find its location in the tree.
93
+ // This should not happen, reset its value to root.
94
+ setFocusedFolderId(e.key === 'ArrowDown' ? data[0].id : undefined);
95
+ return;
96
+ }
97
+
98
+ e.preventDefault();
99
+ e.stopPropagation();
100
+
101
+ if (e.key === ' ') {
102
+ var simulatedEvent = new MouseEvent('click', {
103
+ bubbles: true,
104
+ cancelable: true,
105
+ view: window
106
+ });
107
+ document.activeElement && document.activeElement.dispatchEvent(simulatedEvent);
108
+ return;
109
+ }
110
+
111
+ if (e.key === 'ArrowRight') {
112
+ var _elementWithKeyFocus$;
113
+
114
+ if (!elementWithKeyFocus.isOpen && ((_elementWithKeyFocus$ = elementWithKeyFocus.data) === null || _elementWithKeyFocus$ === void 0 ? void 0 : _elementWithKeyFocus$.length) && id && elementWithKeyFocus.paths.length < MAX_LEVEL_FOR_FOLDERS - 1) {
115
+ onToggleOpen(id);
116
+ }
117
+
118
+ return;
119
+ }
120
+
121
+ if (e.key === 'ArrowLeft') {
122
+ if (id && elementWithKeyFocus.isOpen) {
123
+ onToggleOpen(id);
124
+ }
125
+
126
+ return;
127
+ }
128
+
129
+ if (!id && e.key === 'ArrowDown') {
130
+ setFocusedFolderId(data[0].id);
131
+ return;
132
+ }
133
+
134
+ if (!id) {
135
+ return;
136
+ } // Move up
137
+
138
+
139
+ if (e.key === 'ArrowUp') {
140
+ if (elementWithKeyFocus.index > 0) {
141
+ // Move upwards to the parent folder
142
+ setFocusedFolderId(elementWithKeyFocus.parent ? elementWithKeyFocus.parent[elementWithKeyFocus.index - 1].id : undefined);
143
+ } else if (elementWithKeyFocus.paths.length > 0) {
144
+ elementWithKeyFocus.paths.pop();
145
+ var findParent = data;
146
+ elementWithKeyFocus.paths.forEach(function (index) {
147
+ findParent = findParent[index].data;
148
+ });
149
+ var parentsCurrentIndex = findParent.findIndex(function (_ref3) {
150
+ var id = _ref3.id;
151
+ return id === elementWithKeyFocus.parentId;
152
+ });
153
+ setFocusedFolderId(findParent[parentsCurrentIndex].id);
154
+ }
155
+
156
+ return;
157
+ }
158
+
159
+ if (elementWithKeyFocus.isOpen) {
160
+ var _elementWithKeyFocus$2;
161
+
162
+ if ((_elementWithKeyFocus$2 = elementWithKeyFocus.data) === null || _elementWithKeyFocus$2 === void 0 ? void 0 : _elementWithKeyFocus$2.length) {
163
+ setFocusedFolderId(elementWithKeyFocus.data[0].id);
164
+ } else {
165
+ // move to next child of parent if any... need new traverse :-/
166
+ traverseUpwards(data, setFocusedFolderId, elementWithKeyFocus.paths, elementWithKeyFocus.index);
167
+ }
168
+
169
+ return;
170
+ }
171
+
172
+ if (elementWithKeyFocus.parent && elementWithKeyFocus.index < ((_elementWithKeyFocus$3 = elementWithKeyFocus.parent) === null || _elementWithKeyFocus$3 === void 0 ? void 0 : _elementWithKeyFocus$3.length) - 1) {
173
+ // Move downwards to the next child
174
+ setFocusedFolderId(elementWithKeyFocus.parent[elementWithKeyFocus.index + 1].id);
175
+ return;
176
+ }
177
+
178
+ traverseUpwards(data, setFocusedFolderId, elementWithKeyFocus.paths, elementWithKeyFocus.index);
179
+ return;
180
+ };
181
+
182
+ export default keyboardNavigation;
package/es/all.css CHANGED
@@ -1,3 +1,75 @@
1
+ /* Used to detect in JavaScript if apps have loaded styles or not. */
2
+ :root {
3
+ --reach-menu-button: 1;
4
+ }
5
+
6
+ [data-reach-menu] {
7
+ position: relative;
8
+ }
9
+
10
+ [data-reach-menu-popover] {
11
+ display: block;
12
+ position: absolute;
13
+ }
14
+
15
+ [data-reach-menu-popover][hidden] {
16
+ display: none;
17
+ }
18
+
19
+ [data-reach-menu-list],
20
+ [data-reach-menu-items] {
21
+ display: block;
22
+ white-space: nowrap;
23
+ border: solid 1px hsla(0, 0%, 0%, 0.25);
24
+ background: hsla(0, 100%, 100%, 0.99);
25
+ outline: none;
26
+ padding: 1rem 0;
27
+ font-size: 85%;
28
+ }
29
+
30
+ [data-reach-menu-item] {
31
+ display: block;
32
+ user-select: none;
33
+ }
34
+
35
+ /*
36
+ The dom structure of a MenuLink is reach-menu-item > a,
37
+ so to target all items we can use `data-reach-menu-item`
38
+ */
39
+ [data-reach-menu-item] {
40
+ /*
41
+ These are styled in one rule instead of something like a[data-reach-menu-item]
42
+ and li[data-reach-menu-item] so that apps don't have to fight specificity and
43
+ can style both li and a menu items with one rule,
44
+ ie: `[data-selected] { background: red; }`.
45
+ Otherwise they'd have to define two styles, one for a and one for li.
46
+ */
47
+
48
+ /* reach-menu-item */
49
+ cursor: pointer;
50
+
51
+ /* a */
52
+ display: block;
53
+ color: inherit;
54
+ font: inherit;
55
+ text-decoration: initial;
56
+
57
+ /* both */
58
+ padding: 5px 20px;
59
+ }
60
+
61
+ /* pseudo pseudo selector */
62
+ [data-reach-menu-item][data-selected] {
63
+ background: hsl(211, 81%, 36%);
64
+ color: white;
65
+ outline: none;
66
+ }
67
+
68
+ [data-reach-menu-item][aria-disabled] {
69
+ opacity: 0.5;
70
+ cursor: not-allowed;
71
+ }
72
+
1
73
  :root {
2
74
  --reach-tooltip: 1;
3
75
  }