@hypericon/mico 0.3.24 → 0.4.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 (274) hide show
  1. package/README.md +2 -0
  2. package/dist/esm/components/accordion/index.d.ts +0 -0
  3. package/dist/esm/components/accordion/index.js +1 -0
  4. package/dist/esm/components/data-grid/index.d.ts +0 -0
  5. package/dist/esm/components/data-grid/index.js +1 -0
  6. package/dist/esm/components/data-table/index.d.ts +0 -0
  7. package/dist/esm/components/data-table/index.js +1 -0
  8. package/dist/esm/components/dialog/Dialog.d.ts +1 -0
  9. package/dist/esm/components/dialog/Dialog.js +10 -0
  10. package/dist/esm/components/dialog/dialog-manager.d.ts +45 -0
  11. package/dist/esm/components/dialog/dialog-manager.js +163 -0
  12. package/dist/esm/components/dialog/index.d.ts +1 -0
  13. package/dist/esm/components/dialog/index.js +2 -0
  14. package/dist/esm/components/drag-handler/DragHandler.d.ts +40 -0
  15. package/dist/esm/components/drag-handler/DragHandler.js +104 -0
  16. package/dist/esm/components/drag-handler/index.d.ts +1 -0
  17. package/dist/esm/components/drag-handler/index.js +1 -0
  18. package/dist/esm/components/drawer/index.d.ts +0 -0
  19. package/dist/esm/components/drawer/index.js +1 -0
  20. package/dist/esm/components/drop-target/DropTarget.d.ts +24 -0
  21. package/dist/esm/components/drop-target/DropTarget.js +56 -0
  22. package/dist/esm/components/drop-target/drop-target.state.d.ts +9 -0
  23. package/dist/esm/components/drop-target/drop-target.state.js +73 -0
  24. package/dist/esm/components/drop-target/index.d.ts +1 -0
  25. package/dist/esm/components/drop-target/index.js +1 -0
  26. package/dist/esm/components/form/Form.d.ts +2 -0
  27. package/dist/esm/components/form/Form.js +9 -0
  28. package/dist/esm/components/form/index.d.ts +1 -0
  29. package/dist/esm/components/form/index.js +1 -0
  30. package/dist/esm/components/icon/Icon.d.ts +21 -0
  31. package/dist/esm/components/icon/Icon.js +22 -0
  32. package/dist/esm/components/icon/icons.d.ts +3 -0
  33. package/dist/esm/components/icon/icons.js +1 -0
  34. package/dist/esm/components/icon/index.d.ts +2 -0
  35. package/dist/esm/components/icon/index.js +2 -0
  36. package/dist/esm/components/index.d.ts +12 -0
  37. package/dist/esm/components/index.js +20 -0
  38. package/dist/esm/components/markdown/Markdown.d.ts +34 -0
  39. package/dist/esm/components/markdown/Markdown.js +55 -0
  40. package/dist/esm/components/markdown/index.d.ts +1 -0
  41. package/dist/esm/components/markdown/index.js +1 -0
  42. package/dist/esm/components/markdown-editor/MarkdownEditor.d.ts +21 -0
  43. package/dist/esm/components/markdown-editor/MarkdownEditor.js +181 -0
  44. package/dist/esm/components/markdown-editor/index.d.ts +1 -0
  45. package/dist/esm/components/markdown-editor/index.js +1 -0
  46. package/dist/esm/components/markdown-editor/markdown-editor.state.d.ts +31 -0
  47. package/dist/esm/components/markdown-editor/markdown-editor.state.js +255 -0
  48. package/dist/esm/components/menu/Menu.d.ts +14 -0
  49. package/dist/esm/components/menu/Menu.js +81 -0
  50. package/dist/esm/components/menu/MenuButton.d.ts +16 -0
  51. package/dist/esm/components/menu/MenuButton.js +75 -0
  52. package/dist/esm/components/menu/MenuSeparator.d.ts +2 -0
  53. package/dist/esm/components/menu/MenuSeparator.js +11 -0
  54. package/dist/esm/components/menu/index.d.ts +6 -0
  55. package/dist/esm/components/menu/index.js +6 -0
  56. package/dist/esm/components/menu/menu-constants.d.ts +4 -0
  57. package/dist/esm/components/menu/menu-constants.js +4 -0
  58. package/dist/esm/components/menu/menu-manager.d.ts +22 -0
  59. package/dist/esm/components/menu/menu-manager.js +72 -0
  60. package/dist/esm/components/menu/menu-settings.d.ts +9 -0
  61. package/dist/esm/components/menu/menu-settings.js +9 -0
  62. package/dist/esm/components/modal/index.d.ts +0 -0
  63. package/dist/esm/components/modal/index.js +1 -0
  64. package/dist/esm/components/pagination/Pagination.d.ts +40 -0
  65. package/dist/esm/components/pagination/Pagination.js +66 -0
  66. package/dist/esm/components/pagination/index.d.ts +2 -0
  67. package/dist/esm/components/pagination/index.js +2 -0
  68. package/dist/esm/components/pagination/pagination-settings.d.ts +17 -0
  69. package/dist/esm/components/pagination/pagination-settings.js +16 -0
  70. package/dist/esm/components/panel-tree/PanelTree.d.ts +26 -0
  71. package/dist/esm/components/panel-tree/PanelTree.js +174 -0
  72. package/dist/esm/components/panel-tree/index.d.ts +0 -0
  73. package/dist/esm/components/panel-tree/index.js +1 -0
  74. package/dist/esm/components/panel-tree/panel-tree-constants.d.ts +3 -0
  75. package/dist/esm/components/panel-tree/panel-tree-constants.js +3 -0
  76. package/dist/esm/components/panel-tree/panel-tree-store.d.ts +23 -0
  77. package/dist/esm/components/panel-tree/panel-tree-store.js +59 -0
  78. package/dist/esm/components/panel-tree/panel-tree-utils.d.ts +17 -0
  79. package/dist/esm/components/panel-tree/panel-tree-utils.js +55 -0
  80. package/dist/esm/components/popover/index.d.ts +0 -0
  81. package/dist/esm/components/popover/index.js +1 -0
  82. package/dist/esm/components/reorderable-list/RedorderableList.d.ts +55 -0
  83. package/dist/esm/components/reorderable-list/RedorderableList.js +202 -0
  84. package/dist/esm/components/reorderable-list/index.d.ts +0 -0
  85. package/dist/esm/components/reorderable-list/index.js +1 -0
  86. package/dist/esm/components/select/Select.d.ts +44 -0
  87. package/dist/esm/components/select/Select.js +108 -0
  88. package/dist/esm/components/select/SelectOptionsPanel.d.ts +21 -0
  89. package/dist/esm/components/select/SelectOptionsPanel.js +168 -0
  90. package/dist/esm/components/select/constants.d.ts +2 -0
  91. package/dist/esm/components/select/constants.js +2 -0
  92. package/dist/esm/components/select/index.d.ts +2 -0
  93. package/dist/esm/components/select/index.js +3 -0
  94. package/dist/esm/components/select/select-options-manager.d.ts +39 -0
  95. package/dist/esm/components/select/select-options-manager.js +63 -0
  96. package/dist/esm/components/tab-panel/TabPanel.d.ts +23 -0
  97. package/dist/esm/components/tab-panel/TabPanel.js +88 -0
  98. package/dist/esm/components/tab-panel/index.d.ts +3 -0
  99. package/dist/esm/components/tab-panel/index.js +3 -0
  100. package/dist/esm/components/tab-panel/tab-panel-default-settings.d.ts +17 -0
  101. package/dist/esm/components/tab-panel/tab-panel-default-settings.js +17 -0
  102. package/dist/esm/components/tab-panel/tab-panel-settings.d.ts +28 -0
  103. package/dist/esm/components/tab-panel/tab-panel-settings.js +11 -0
  104. package/dist/esm/components/table/Table.d.ts +64 -0
  105. package/dist/esm/components/table/Table.js +68 -0
  106. package/dist/esm/components/table/index.d.ts +1 -0
  107. package/dist/esm/components/table/index.js +1 -0
  108. package/dist/esm/components/toast/index.d.ts +1 -0
  109. package/dist/esm/components/toast/index.js +1 -0
  110. package/dist/esm/components/toast/toast.d.ts +15 -0
  111. package/dist/esm/components/toast/toast.js +31 -0
  112. package/dist/esm/components/tooltip/index.d.ts +3 -0
  113. package/dist/esm/components/tooltip/index.js +3 -0
  114. package/dist/esm/components/tooltip/tooltip-defaults.d.ts +23 -0
  115. package/dist/esm/components/tooltip/tooltip-defaults.js +22 -0
  116. package/dist/esm/components/tooltip/tooltip-function.d.ts +35 -0
  117. package/dist/esm/components/tooltip/tooltip-function.js +200 -0
  118. package/dist/esm/components/tooltip/tooltip-interfaces.d.ts +11 -0
  119. package/dist/esm/components/tooltip/tooltip-interfaces.js +1 -0
  120. package/dist/esm/components/tree/Tree.d.ts +110 -0
  121. package/dist/esm/components/tree/Tree.js +222 -0
  122. package/dist/esm/components/tree/index.d.ts +3 -0
  123. package/dist/esm/components/tree/index.js +3 -0
  124. package/dist/esm/components/tree/tree-node.interface.d.ts +9 -0
  125. package/dist/esm/components/tree/tree-node.interface.js +1 -0
  126. package/dist/esm/components/tree/tree-utils.d.ts +11 -0
  127. package/dist/esm/components/tree/tree-utils.js +18 -0
  128. package/dist/esm/index.d.ts +2 -0
  129. package/dist/esm/index.js +2 -0
  130. package/dist/esm/utils/date-time.d.ts +3 -0
  131. package/dist/esm/utils/date-time.js +22 -0
  132. package/dist/esm/utils/dom.d.ts +16 -0
  133. package/dist/esm/utils/dom.js +28 -0
  134. package/dist/esm/utils/events.d.ts +1 -0
  135. package/dist/esm/utils/events.js +25 -0
  136. package/dist/esm/utils/index.d.ts +3 -0
  137. package/dist/esm/utils/index.js +3 -0
  138. package/package.json +7 -3
  139. /package/dist/{components → cjs/components}/accordion/index.d.ts +0 -0
  140. /package/dist/{components → cjs/components}/accordion/index.js +0 -0
  141. /package/dist/{components → cjs/components}/data-grid/index.d.ts +0 -0
  142. /package/dist/{components → cjs/components}/data-grid/index.js +0 -0
  143. /package/dist/{components → cjs/components}/data-table/index.d.ts +0 -0
  144. /package/dist/{components → cjs/components}/data-table/index.js +0 -0
  145. /package/dist/{components → cjs/components}/dialog/Dialog.d.ts +0 -0
  146. /package/dist/{components → cjs/components}/dialog/Dialog.js +0 -0
  147. /package/dist/{components → cjs/components}/dialog/dialog-manager.d.ts +0 -0
  148. /package/dist/{components → cjs/components}/dialog/dialog-manager.js +0 -0
  149. /package/dist/{components → cjs/components}/dialog/index.d.ts +0 -0
  150. /package/dist/{components → cjs/components}/dialog/index.js +0 -0
  151. /package/dist/{components → cjs/components}/drag-handler/DragHandler.d.ts +0 -0
  152. /package/dist/{components → cjs/components}/drag-handler/DragHandler.js +0 -0
  153. /package/dist/{components → cjs/components}/drag-handler/index.d.ts +0 -0
  154. /package/dist/{components → cjs/components}/drag-handler/index.js +0 -0
  155. /package/dist/{components → cjs/components}/drawer/index.d.ts +0 -0
  156. /package/dist/{components → cjs/components}/drawer/index.js +0 -0
  157. /package/dist/{components → cjs/components}/drop-target/DropTarget.d.ts +0 -0
  158. /package/dist/{components → cjs/components}/drop-target/DropTarget.js +0 -0
  159. /package/dist/{components → cjs/components}/drop-target/drop-target.state.d.ts +0 -0
  160. /package/dist/{components → cjs/components}/drop-target/drop-target.state.js +0 -0
  161. /package/dist/{components → cjs/components}/drop-target/index.d.ts +0 -0
  162. /package/dist/{components → cjs/components}/drop-target/index.js +0 -0
  163. /package/dist/{components → cjs/components}/form/Form.d.ts +0 -0
  164. /package/dist/{components → cjs/components}/form/Form.js +0 -0
  165. /package/dist/{components → cjs/components}/form/index.d.ts +0 -0
  166. /package/dist/{components → cjs/components}/form/index.js +0 -0
  167. /package/dist/{components → cjs/components}/icon/Icon.d.ts +0 -0
  168. /package/dist/{components → cjs/components}/icon/Icon.js +0 -0
  169. /package/dist/{components → cjs/components}/icon/icons.d.ts +0 -0
  170. /package/dist/{components → cjs/components}/icon/icons.js +0 -0
  171. /package/dist/{components → cjs/components}/icon/index.d.ts +0 -0
  172. /package/dist/{components → cjs/components}/icon/index.js +0 -0
  173. /package/dist/{components → cjs/components}/index.d.ts +0 -0
  174. /package/dist/{components → cjs/components}/index.js +0 -0
  175. /package/dist/{components → cjs/components}/markdown/Markdown.d.ts +0 -0
  176. /package/dist/{components → cjs/components}/markdown/Markdown.js +0 -0
  177. /package/dist/{components → cjs/components}/markdown/index.d.ts +0 -0
  178. /package/dist/{components → cjs/components}/markdown/index.js +0 -0
  179. /package/dist/{components → cjs/components}/markdown-editor/MarkdownEditor.d.ts +0 -0
  180. /package/dist/{components → cjs/components}/markdown-editor/MarkdownEditor.js +0 -0
  181. /package/dist/{components → cjs/components}/markdown-editor/index.d.ts +0 -0
  182. /package/dist/{components → cjs/components}/markdown-editor/index.js +0 -0
  183. /package/dist/{components → cjs/components}/markdown-editor/markdown-editor.state.d.ts +0 -0
  184. /package/dist/{components → cjs/components}/markdown-editor/markdown-editor.state.js +0 -0
  185. /package/dist/{components → cjs/components}/menu/Menu.d.ts +0 -0
  186. /package/dist/{components → cjs/components}/menu/Menu.js +0 -0
  187. /package/dist/{components → cjs/components}/menu/MenuButton.d.ts +0 -0
  188. /package/dist/{components → cjs/components}/menu/MenuButton.js +0 -0
  189. /package/dist/{components → cjs/components}/menu/MenuSeparator.d.ts +0 -0
  190. /package/dist/{components → cjs/components}/menu/MenuSeparator.js +0 -0
  191. /package/dist/{components → cjs/components}/menu/index.d.ts +0 -0
  192. /package/dist/{components → cjs/components}/menu/index.js +0 -0
  193. /package/dist/{components → cjs/components}/menu/menu-constants.d.ts +0 -0
  194. /package/dist/{components → cjs/components}/menu/menu-constants.js +0 -0
  195. /package/dist/{components → cjs/components}/menu/menu-manager.d.ts +0 -0
  196. /package/dist/{components → cjs/components}/menu/menu-manager.js +0 -0
  197. /package/dist/{components → cjs/components}/menu/menu-settings.d.ts +0 -0
  198. /package/dist/{components → cjs/components}/menu/menu-settings.js +0 -0
  199. /package/dist/{components → cjs/components}/modal/index.d.ts +0 -0
  200. /package/dist/{components → cjs/components}/modal/index.js +0 -0
  201. /package/dist/{components → cjs/components}/pagination/Pagination.d.ts +0 -0
  202. /package/dist/{components → cjs/components}/pagination/Pagination.js +0 -0
  203. /package/dist/{components → cjs/components}/pagination/index.d.ts +0 -0
  204. /package/dist/{components → cjs/components}/pagination/index.js +0 -0
  205. /package/dist/{components → cjs/components}/pagination/pagination-settings.d.ts +0 -0
  206. /package/dist/{components → cjs/components}/pagination/pagination-settings.js +0 -0
  207. /package/dist/{components → cjs/components}/panel-tree/PanelTree.d.ts +0 -0
  208. /package/dist/{components → cjs/components}/panel-tree/PanelTree.js +0 -0
  209. /package/dist/{components → cjs/components}/panel-tree/index.d.ts +0 -0
  210. /package/dist/{components → cjs/components}/panel-tree/index.js +0 -0
  211. /package/dist/{components → cjs/components}/panel-tree/panel-tree-constants.d.ts +0 -0
  212. /package/dist/{components → cjs/components}/panel-tree/panel-tree-constants.js +0 -0
  213. /package/dist/{components → cjs/components}/panel-tree/panel-tree-store.d.ts +0 -0
  214. /package/dist/{components → cjs/components}/panel-tree/panel-tree-store.js +0 -0
  215. /package/dist/{components → cjs/components}/panel-tree/panel-tree-utils.d.ts +0 -0
  216. /package/dist/{components → cjs/components}/panel-tree/panel-tree-utils.js +0 -0
  217. /package/dist/{components → cjs/components}/popover/index.d.ts +0 -0
  218. /package/dist/{components → cjs/components}/popover/index.js +0 -0
  219. /package/dist/{components → cjs/components}/reorderable-list/RedorderableList.d.ts +0 -0
  220. /package/dist/{components → cjs/components}/reorderable-list/RedorderableList.js +0 -0
  221. /package/dist/{components → cjs/components}/reorderable-list/index.d.ts +0 -0
  222. /package/dist/{components → cjs/components}/reorderable-list/index.js +0 -0
  223. /package/dist/{components → cjs/components}/select/Select.d.ts +0 -0
  224. /package/dist/{components → cjs/components}/select/Select.js +0 -0
  225. /package/dist/{components → cjs/components}/select/SelectOptionsPanel.d.ts +0 -0
  226. /package/dist/{components → cjs/components}/select/SelectOptionsPanel.js +0 -0
  227. /package/dist/{components → cjs/components}/select/constants.d.ts +0 -0
  228. /package/dist/{components → cjs/components}/select/constants.js +0 -0
  229. /package/dist/{components → cjs/components}/select/index.d.ts +0 -0
  230. /package/dist/{components → cjs/components}/select/index.js +0 -0
  231. /package/dist/{components → cjs/components}/select/select-options-manager.d.ts +0 -0
  232. /package/dist/{components → cjs/components}/select/select-options-manager.js +0 -0
  233. /package/dist/{components → cjs/components}/tab-panel/TabPanel.d.ts +0 -0
  234. /package/dist/{components → cjs/components}/tab-panel/TabPanel.js +0 -0
  235. /package/dist/{components → cjs/components}/tab-panel/index.d.ts +0 -0
  236. /package/dist/{components → cjs/components}/tab-panel/index.js +0 -0
  237. /package/dist/{components → cjs/components}/tab-panel/tab-panel-default-settings.d.ts +0 -0
  238. /package/dist/{components → cjs/components}/tab-panel/tab-panel-default-settings.js +0 -0
  239. /package/dist/{components → cjs/components}/tab-panel/tab-panel-settings.d.ts +0 -0
  240. /package/dist/{components → cjs/components}/tab-panel/tab-panel-settings.js +0 -0
  241. /package/dist/{components → cjs/components}/table/Table.d.ts +0 -0
  242. /package/dist/{components → cjs/components}/table/Table.js +0 -0
  243. /package/dist/{components → cjs/components}/table/index.d.ts +0 -0
  244. /package/dist/{components → cjs/components}/table/index.js +0 -0
  245. /package/dist/{components → cjs/components}/toast/index.d.ts +0 -0
  246. /package/dist/{components → cjs/components}/toast/index.js +0 -0
  247. /package/dist/{components → cjs/components}/toast/toast.d.ts +0 -0
  248. /package/dist/{components → cjs/components}/toast/toast.js +0 -0
  249. /package/dist/{components → cjs/components}/tooltip/index.d.ts +0 -0
  250. /package/dist/{components → cjs/components}/tooltip/index.js +0 -0
  251. /package/dist/{components → cjs/components}/tooltip/tooltip-defaults.d.ts +0 -0
  252. /package/dist/{components → cjs/components}/tooltip/tooltip-defaults.js +0 -0
  253. /package/dist/{components → cjs/components}/tooltip/tooltip-function.d.ts +0 -0
  254. /package/dist/{components → cjs/components}/tooltip/tooltip-function.js +0 -0
  255. /package/dist/{components → cjs/components}/tooltip/tooltip-interfaces.d.ts +0 -0
  256. /package/dist/{components → cjs/components}/tooltip/tooltip-interfaces.js +0 -0
  257. /package/dist/{components → cjs/components}/tree/Tree.d.ts +0 -0
  258. /package/dist/{components → cjs/components}/tree/Tree.js +0 -0
  259. /package/dist/{components → cjs/components}/tree/index.d.ts +0 -0
  260. /package/dist/{components → cjs/components}/tree/index.js +0 -0
  261. /package/dist/{components → cjs/components}/tree/tree-node.interface.d.ts +0 -0
  262. /package/dist/{components → cjs/components}/tree/tree-node.interface.js +0 -0
  263. /package/dist/{components → cjs/components}/tree/tree-utils.d.ts +0 -0
  264. /package/dist/{components → cjs/components}/tree/tree-utils.js +0 -0
  265. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  266. /package/dist/{index.js → cjs/index.js} +0 -0
  267. /package/dist/{utils → cjs/utils}/date-time.d.ts +0 -0
  268. /package/dist/{utils → cjs/utils}/date-time.js +0 -0
  269. /package/dist/{utils → cjs/utils}/dom.d.ts +0 -0
  270. /package/dist/{utils → cjs/utils}/dom.js +0 -0
  271. /package/dist/{utils → cjs/utils}/events.d.ts +0 -0
  272. /package/dist/{utils → cjs/utils}/events.js +0 -0
  273. /package/dist/{utils → cjs/utils}/index.d.ts +0 -0
  274. /package/dist/{utils → cjs/utils}/index.js +0 -0
@@ -0,0 +1,202 @@
1
+ import m from "mithril";
2
+ import { coordsWithinElement } from "../../utils";
3
+ /**
4
+ * A reorderable list of items. Expects a list of reorderable list items in children.
5
+ *
6
+ * ! The divs containing the content of the items must be passed as a 1-D list to
7
+ * the reorderable list's children. E.g.:
8
+ *
9
+ * ```ts
10
+ * m(ReorderableList, {...}, ["one", "two"]),
11
+ * ```
12
+ *
13
+ * Or (note the list spread):
14
+ *
15
+ * ```ts
16
+ * m(ReorderableList, {...}, [
17
+ * ...someList.map(item => m("", {...}, [...])),
18
+ * ]),
19
+ * ```
20
+ *
21
+ * The divs defining the content of the items are displayed in a flex row, and are encouraged
22
+ * to flex themselves to fill the row.
23
+ *
24
+ * Example of applying a reordering:
25
+ *
26
+ * ```ts
27
+ * const dragged = this.items.splice(fromIndex, 1)[0];
28
+ * this.items.splice(toIndex, 0, dragged);
29
+ * ```
30
+ */
31
+ export const ReorderableList = {
32
+ oninit({ attrs }) {
33
+ this.draggingIndex = undefined;
34
+ this.draggedOverIndex = undefined;
35
+ this.draggedOverTop = undefined;
36
+ // this.beginDrag = (ev: MouseEvent, index: number) => {
37
+ // this.draggingIndex = index;
38
+ // };
39
+ // this.dragOver = (ev: MouseEvent, index: number) => {
40
+ // if (this.draggingIndex === undefined) return;
41
+ // this.draggedOverIndex = index;
42
+ // };
43
+ // this.endDrag = (ev: MouseEvent) => {
44
+ // const bothIndicesDefined = (this.draggingIndex !== undefined && this.draggedOverIndex !== undefined);
45
+ // const indicesDifferent = (this.draggingIndex !== this.draggedOverIndex);
46
+ // if (bothIndicesDefined && indicesDifferent) {
47
+ // attrs.reorder?.(this.draggingIndex!, this.draggedOverIndex!);
48
+ // }
49
+ // this.draggingIndex = undefined;
50
+ // this.draggedOverIndex = undefined;
51
+ // };
52
+ },
53
+ view({ attrs, children }) {
54
+ const childArr = children instanceof Array ? children : [children];
55
+ const disableReordering = attrs.disableReordering === true;
56
+ const beginDrag = (ev, index) => {
57
+ var _a;
58
+ if (disableReordering)
59
+ return;
60
+ this.draggingIndex = index;
61
+ (_a = attrs.reorderStart) === null || _a === void 0 ? void 0 : _a.call(attrs, ev);
62
+ };
63
+ const dragOver = (ev, index, isAbove) => {
64
+ if (disableReordering)
65
+ return;
66
+ if (this.draggingIndex === undefined)
67
+ return;
68
+ this.draggedOverIndex = index;
69
+ this.draggedOverTop = isAbove;
70
+ };
71
+ const endDrag = (ev) => {
72
+ var _a, _b;
73
+ if (disableReordering)
74
+ return;
75
+ const bothIndicesDefined = (this.draggingIndex !== undefined && this.draggedOverIndex !== undefined);
76
+ const indicesDifferent = (this.draggingIndex !== this.draggedOverIndex);
77
+ if (bothIndicesDefined && indicesDifferent) {
78
+ let from = this.draggingIndex;
79
+ let to = this.draggedOverIndex;
80
+ if (from < to && this.draggedOverTop === true) {
81
+ to--;
82
+ }
83
+ else if (to < from && this.draggedOverTop === false) {
84
+ to++;
85
+ }
86
+ (_a = attrs.reorder) === null || _a === void 0 ? void 0 : _a.call(attrs, from, to);
87
+ }
88
+ if (this.draggingIndex !== undefined) {
89
+ (_b = attrs.reorderEnd) === null || _b === void 0 ? void 0 : _b.call(attrs, ev);
90
+ }
91
+ this.draggingIndex = undefined;
92
+ this.draggedOverIndex = undefined;
93
+ this.draggedOverTop = undefined;
94
+ };
95
+ return m("", {
96
+ id: attrs.id,
97
+ class: `${attrs.class || ""} no-select`,
98
+ style: `${attrs.style || ""}`,
99
+ onmouseup: (ev) => endDrag(ev),
100
+ onmouseleave: (ev) => endDrag(ev),
101
+ ontouchmove: (ev) => {
102
+ var _a, _b;
103
+ if (disableReordering)
104
+ return;
105
+ // This div, which contains the reorderable rows
106
+ const rowContainerEl = ev.currentTarget;
107
+ const touchX = (_a = ev.touches.item(0)) === null || _a === void 0 ? void 0 : _a.clientX;
108
+ const touchY = (_b = ev.touches.item(0)) === null || _b === void 0 ? void 0 : _b.clientY;
109
+ if (!touchX || !touchY)
110
+ return;
111
+ let overIndex = undefined;
112
+ let isAbove = undefined;
113
+ for (let i = 0; i < rowContainerEl.children.length; i++) {
114
+ const childEl = rowContainerEl.children[i];
115
+ const childElBounds = childEl.getBoundingClientRect();
116
+ if (coordsWithinElement(touchX, touchY, childEl)) {
117
+ overIndex = i;
118
+ const boundsTopToTouch = touchY - childElBounds.top;
119
+ isAbove = boundsTopToTouch < (childElBounds.height - boundsTopToTouch);
120
+ }
121
+ }
122
+ // console.log(`touch move, in ${rowContainerEl}, coords: ${touchX}, ${touchY}, over child index: ${overIndex}`);
123
+ if (overIndex !== undefined && isAbove !== undefined) {
124
+ dragOver(ev, overIndex, isAbove);
125
+ }
126
+ },
127
+ ontouchend: (ev) => {
128
+ endDrag(ev);
129
+ },
130
+ ontouchcancel: (ev) => {
131
+ endDrag(ev);
132
+ },
133
+ }, [
134
+ (childArr.length === 0) ? attrs.emptyMessage || m("p", "No items to display") : [],
135
+ childArr.map((item, childIndex) => {
136
+ return m(ReorderableListItem, {
137
+ itemIndex: childIndex,
138
+ draggedOverIndex: this.draggedOverIndex,
139
+ draggedOverTop: this.draggedOverTop,
140
+ key: item.hasOwnProperty("key") ? item.key : undefined,
141
+ class: attrs.itemClass,
142
+ disableReordering,
143
+ hideNumbers: attrs.hideNumbers,
144
+ mouseOverFn: (ev) => {
145
+ const targetRect = ev.currentTarget.getBoundingClientRect();
146
+ const rectTopToEvent = ev.clientY - targetRect.top;
147
+ const isAbove = rectTopToEvent < (targetRect.height - rectTopToEvent);
148
+ // console.log(`mouse over, index ${childIndex}, target: ${ev.target}`);
149
+ dragOver(ev, childIndex, isAbove);
150
+ },
151
+ mouseDownFn: (ev) => beginDrag(ev, childIndex),
152
+ touchStartFn: (ev) => {
153
+ // console.log(`touch start, index ${childIndex}, target: ${ev.target}`);
154
+ ev.preventDefault();
155
+ beginDrag(ev, childIndex);
156
+ },
157
+ }, [
158
+ item,
159
+ ]);
160
+ }),
161
+ ]);
162
+ }
163
+ };
164
+ /**
165
+ * An item in the reorderable list.
166
+ *
167
+ * Contains a reordering handle with the row index, then the main content of the item.
168
+ */
169
+ const ReorderableListItem = {
170
+ view({ attrs, children }) {
171
+ var _a;
172
+ const { disableReordering, hideNumbers } = attrs;
173
+ const dragBorderClass = (attrs.draggedOverIndex !== attrs.itemIndex)
174
+ ? ""
175
+ : attrs.draggedOverTop
176
+ ? "border-t-2 border-primary"
177
+ : "border-b-2 border-primary";
178
+ return m(".flex.flex-row.items-stretch.space-x-2", {
179
+ key: attrs.key,
180
+ class: `${(_a = attrs.class) !== null && _a !== void 0 ? _a : ""} ${dragBorderClass}`,
181
+ style: ``,
182
+ onmousemove: (ev) => attrs.mouseOverFn(ev),
183
+ }, [
184
+ // Draggable index row header
185
+ m(".flex.items-center.space-x-2", {
186
+ style: `width: ${hideNumbers ? "30px" : "50px"};`,
187
+ class: `${disableReordering ? "text-hint" : "cursor-move"}`,
188
+ onmousedown: (ev) => attrs.mouseDownFn(ev),
189
+ ontouchstart: (ev) => attrs.touchStartFn(ev),
190
+ }, [
191
+ m(`i.fas.fa-grip-vertical`, {
192
+ class: `${disableReordering ? "text-hint" : "text-grey-700 dark:text-grey-300"} ${hideNumbers ? "pl-2" : ""}`,
193
+ }),
194
+ hideNumbers
195
+ ? []
196
+ : m("", attrs.itemIndex + 1),
197
+ ]),
198
+ // The content in the reorderable item
199
+ children,
200
+ ]);
201
+ }
202
+ };
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,44 @@
1
+ import m from "mithril";
2
+ type SelectOption = m.Vnode<{
3
+ /** The "value" of the option */
4
+ value: string;
5
+ /** Optionally disable selection of the option */
6
+ disabled?: boolean;
7
+ /** The displayed value as text, to enable the user to select the value by label with the keyboard */
8
+ text?: string;
9
+ }, any>;
10
+ /**
11
+ * A dropdown select box that takes Mithril Vnodes as options
12
+ */
13
+ export declare const Select: m.Component<{
14
+ /**
15
+ * The list of vnodes to display as options. Attrs:
16
+ * - `value` (required)
17
+ * - `disabled` (optional)
18
+ * - `text` (optional)
19
+ */
20
+ options: SelectOption[];
21
+ /** The selected value to highlight */
22
+ value: string;
23
+ /** Function called with the option value when an option is selected */
24
+ oninput?: (value: string) => any;
25
+ onfocus?: (ev: FocusEvent) => any;
26
+ onblur?: (ev: FocusEvent) => any;
27
+ /** Space-separated CSS classes to apply to the component */
28
+ class?: string;
29
+ /** CSS styles to apply to the component */
30
+ style?: string;
31
+ placeholder?: string | m.Vnode<any, any>;
32
+ disabled?: boolean;
33
+ multiple?: boolean;
34
+ size?: number;
35
+ /** Optionally specify an ID in the parent, otherwise one is created internally */
36
+ id?: string;
37
+ }, {
38
+ id: string;
39
+ /** The last position of the select within the viewport */
40
+ lastViewportRect: DOMRect;
41
+ /** The current value of the disabled attr */
42
+ disabled: boolean | undefined;
43
+ }>;
44
+ export {};
@@ -0,0 +1,108 @@
1
+ import m from "mithril";
2
+ import { SelectOptionsManager } from "./select-options-manager";
3
+ const optsPanelMgr = new SelectOptionsManager();
4
+ /**
5
+ * A dropdown select box that takes Mithril Vnodes as options
6
+ */
7
+ export const Select = {
8
+ oninit({ attrs }) {
9
+ this.id = attrs.id || `select-${Math.random().toString().replace(".", "")}`;
10
+ this.lastViewportRect = new DOMRect();
11
+ this.disabled = this.disabled;
12
+ },
13
+ onupdate({ dom }) {
14
+ var _a;
15
+ // Store the last known position of the component within the viewport
16
+ // to determine if the options should open upwards or downwards
17
+ const rect = dom.getBoundingClientRect();
18
+ rect.y += (((_a = dom.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.pageYOffset) || 0);
19
+ // const top = dom.getBoundingClientRect().top + (dom.ownerDocument.defaultView?.pageYOffset || 0);
20
+ this.lastViewportRect = rect;
21
+ optsPanelMgr.move(this.id, this.lastViewportRect);
22
+ },
23
+ view({ attrs }) {
24
+ var _a;
25
+ this.disabled = attrs.disabled;
26
+ const select = (value) => {
27
+ var _a;
28
+ if (this.disabled)
29
+ return;
30
+ (_a = attrs.oninput) === null || _a === void 0 ? void 0 : _a.call(attrs, value);
31
+ // this.isOpen = false;
32
+ // attrs.onclose?.();
33
+ optsPanelMgr.dismiss();
34
+ };
35
+ const open = (options, value) => {
36
+ if (this.disabled)
37
+ return;
38
+ optsPanelMgr.open({
39
+ id: this.id,
40
+ options: options,
41
+ selectRect: this.lastViewportRect,
42
+ selectedIndex: options.findIndex(o => o.attrs.value === (value || attrs.value)),
43
+ select: (value) => {
44
+ select(value);
45
+ },
46
+ onDismiss: () => {
47
+ var _a;
48
+ (_a = document.getElementById(this.id)) === null || _a === void 0 ? void 0 : _a.focus();
49
+ },
50
+ });
51
+ };
52
+ const dismiss = () => {
53
+ // this.isOpen = false;
54
+ optsPanelMgr.dismiss();
55
+ // attrs.onclose?.();
56
+ };
57
+ // The main "select box" div
58
+ return m(".input.no-select", {
59
+ id: this.id,
60
+ tabindex: 0,
61
+ style: `height: 2rem; ${attrs.style || ""} padding-top: 0; padding-bottom: 0; position: relative;`,
62
+ class: `${attrs.class || ""} flex items-center ${attrs.disabled ? "disabled" : ""} ${attrs.disabled ? "cursor-auto" : "cursor-pointer"}`,
63
+ onclick: (ev) => {
64
+ // ev.stopPropagation();
65
+ if (!optsPanelMgr.isOpen(this.id))
66
+ open(attrs.options, attrs.value);
67
+ // ? this.dismiss()
68
+ // :
69
+ },
70
+ onkeydown: (ev) => {
71
+ if (ev.code === "Enter") {
72
+ open(attrs.options, attrs.value);
73
+ }
74
+ },
75
+ onfocus: (ev) => { var _a; return (_a = attrs.onfocus) === null || _a === void 0 ? void 0 : _a.call(attrs, ev); },
76
+ onblur: (ev) => {
77
+ var _a;
78
+ if (!optsPanelMgr.isOpen(this.id)) {
79
+ (_a = attrs.onblur) === null || _a === void 0 ? void 0 : _a.call(attrs, ev);
80
+ }
81
+ }
82
+ }, [
83
+ // The selected option within the select box div
84
+ m(".flex-1.overflow-x-hidden", {}, [
85
+ m(".overflow-x-hidden", {
86
+ key: attrs.value,
87
+ }, [
88
+ (_a = attrs.options.find(o => o.attrs.value === attrs.value)) !== null && _a !== void 0 ? _a : ((attrs.placeholder && typeof attrs.placeholder === "string")
89
+ ? m("span.hint", attrs.placeholder)
90
+ : attrs.placeholder),
91
+ ]),
92
+ ]),
93
+ // Open/close down/up arrow in the input box
94
+ m(".ml-1", {
95
+ class: this.disabled ? "text-gray-500" : "",
96
+ }, [
97
+ // optsPanelSvc.isOpen(this.id)
98
+ // ? m(".h-full.flex.items-center", { key: "up" }, m("i.fas.fa-caret-up"))
99
+ // : m(".h-full.flex.items-center", { key: "down" }, m("i.fas.fa-caret-down")),
100
+ m(".h-full.flex.items-center", [
101
+ optsPanelMgr.isOpen(this.id)
102
+ ? m(`i.fas.fa-caret-up`)
103
+ : m(`i.fas.fa-caret-down`),
104
+ ]),
105
+ ]),
106
+ ]);
107
+ },
108
+ };
@@ -0,0 +1,21 @@
1
+ /// <reference types="node" />
2
+ import m from "mithril";
3
+ import { Subscription } from "rxjs";
4
+ export declare const SelectOptionsPanel: m.Component<{}, {
5
+ subs: Subscription;
6
+ isOpen: boolean;
7
+ /** If the options panel should open upwards */
8
+ isReversed: boolean;
9
+ /** If the select input is narrow and near the right viewport edge, anchor the options panel on the right edge */
10
+ isAnchoredRight: boolean;
11
+ highlightedIndex: number;
12
+ ensureVisible: (index: number, up: boolean) => void;
13
+ /** A current string "searched for" when the user types characters when the panel is open */
14
+ textSearch: string;
15
+ /** A timer used to clear the text search */
16
+ keyIdleTimer: NodeJS.Timeout | undefined;
17
+ /** On pressing a letter key, update the text search and possibly select a new option */
18
+ handleTextSearch: (ev: KeyboardEvent) => void;
19
+ /** Clear the text search string and idle timer */
20
+ clearTextSearch: () => void;
21
+ }>;
@@ -0,0 +1,168 @@
1
+ import m from "mithril";
2
+ import { Subscription } from "rxjs";
3
+ import { MAX_OPTION_PANEL_HEIGHT, OPTION_APPROX_HEIGHT } from "./constants";
4
+ import { SelectOptionsManager } from "./select-options-manager";
5
+ // const logger = getLogger("SelectOptionsPanel");
6
+ const DEBUG = false;
7
+ const optsPanelMgr = new SelectOptionsManager();
8
+ const MIN_OPTIONS_PANEL_WIDTH = 200;
9
+ const OPTIONS_PANEL_ID = "select-options-panel";
10
+ const TEXT_IDLE_TIMEOUT = 1000;
11
+ export const SelectOptionsPanel = {
12
+ oninit() {
13
+ this.subs = new Subscription();
14
+ this.isOpen = false;
15
+ this.isReversed = false;
16
+ this.isAnchoredRight = false;
17
+ this.highlightedIndex = 0;
18
+ // this.highlightIndex = (index) => {
19
+ // this.highlightedIndex = index;
20
+ // this.ensureVisible(index, false);
21
+ // };
22
+ this.ensureVisible = (index, up) => {
23
+ const panel = document.getElementById(OPTIONS_PANEL_ID);
24
+ const container = panel === null || panel === void 0 ? void 0 : panel.children.item(0);
25
+ const optionElems = container === null || container === void 0 ? void 0 : container.children;
26
+ const highlightedElem = optionElems === null || optionElems === void 0 ? void 0 : optionElems.item(index);
27
+ if (up) {
28
+ if (panel.getBoundingClientRect().top > highlightedElem.getBoundingClientRect().top) {
29
+ highlightedElem === null || highlightedElem === void 0 ? void 0 : highlightedElem.scrollIntoView(true);
30
+ }
31
+ }
32
+ else {
33
+ if (panel.getBoundingClientRect().bottom < highlightedElem.getBoundingClientRect().bottom) {
34
+ highlightedElem === null || highlightedElem === void 0 ? void 0 : highlightedElem.scrollIntoView(false);
35
+ }
36
+ }
37
+ // const highlightedRect = highlightedElem?.getBoundingClientRect();
38
+ // if (highlightedRect) {
39
+ // logger.debug("ensure visible rect:", highlightedRect);
40
+ // panel?.scr
41
+ // }
42
+ };
43
+ this.subs.add(optsPanelMgr.panel$.subscribe(panelDef => {
44
+ if (panelDef) {
45
+ // If the available space is less than the approximate size of the options panel, open upwards instead
46
+ this.isReversed = (window.innerHeight - panelDef.selectRect.bottom) < Math.min((panelDef.options.length * OPTION_APPROX_HEIGHT), MAX_OPTION_PANEL_HEIGHT);
47
+ // TODO: calculate is anchored right
48
+ if (!this.isOpen) {
49
+ DEBUG && console.log("opening select options panel");
50
+ const index = panelDef.selectedIndex;
51
+ this.highlightedIndex = (index !== undefined && index !== -1) ? index : 0;
52
+ this.isOpen = true;
53
+ setTimeout(() => {
54
+ this.ensureVisible(this.highlightedIndex, false);
55
+ }, 100);
56
+ }
57
+ }
58
+ else {
59
+ this.isOpen = false;
60
+ }
61
+ m.redraw();
62
+ }));
63
+ this.textSearch = "";
64
+ this.handleTextSearch = (ev) => {
65
+ if (optsPanelMgr.panel === undefined)
66
+ return;
67
+ const key = ev.key.toLowerCase();
68
+ this.textSearch += key;
69
+ // If the idle timeout elapses, clear the current text search
70
+ if (this.keyIdleTimer) {
71
+ clearTimeout(this.keyIdleTimer);
72
+ }
73
+ this.keyIdleTimer = setTimeout(() => {
74
+ this.clearTextSearch();
75
+ }, TEXT_IDLE_TIMEOUT);
76
+ // Find the index of the option whose text search string starts with the current search term
77
+ const index = optsPanelMgr.panel.options.findIndex(o => {
78
+ return o.attrs.text && o.attrs.text.toLowerCase().startsWith(this.textSearch);
79
+ });
80
+ if (index >= 0 && index <= optsPanelMgr.panel.options.length - 1) {
81
+ const up = this.highlightedIndex > index;
82
+ this.highlightedIndex = index;
83
+ this.ensureVisible(this.highlightedIndex, up);
84
+ }
85
+ };
86
+ this.clearTextSearch = () => {
87
+ if (this.keyIdleTimer) {
88
+ clearTimeout(this.keyIdleTimer);
89
+ }
90
+ this.keyIdleTimer = undefined;
91
+ this.textSearch = "";
92
+ };
93
+ },
94
+ onremove() {
95
+ this.subs.unsubscribe();
96
+ },
97
+ onupdate() {
98
+ var _a;
99
+ (_a = document.getElementById(OPTIONS_PANEL_ID)) === null || _a === void 0 ? void 0 : _a.focus();
100
+ },
101
+ view() {
102
+ if (optsPanelMgr.panel === undefined || !this.isOpen)
103
+ return;
104
+ const panel = optsPanelMgr.panel;
105
+ const rect = panel.selectRect;
106
+ const width = Math.max(rect.width, MIN_OPTIONS_PANEL_WIDTH);
107
+ DEBUG && console.log("Drawing select options panel for select rect:", rect);
108
+ return m(".bg-white.text-dark.dark:bg-black.dark:text-white.shadow-lg.border.border-grey-500", {
109
+ id: OPTIONS_PANEL_ID,
110
+ tabindex: -1,
111
+ style: `position: fixed; left: ${rect.left}px; width: ${width}px; ${this.isReversed ? `bottom: ${document.documentElement.clientHeight - rect.top}px;` : `top: ${rect.bottom}px;`}
112
+ min-width: ${MIN_OPTIONS_PANEL_WIDTH}px; max-height: ${MAX_OPTION_PANEL_HEIGHT}px; overflow-y: auto; z-index: 100; outline: none;`,
113
+ onkeydown: (ev) => {
114
+ if (ev.code === "ArrowUp") {
115
+ this.highlightedIndex = Math.max(this.highlightedIndex - 1, 0);
116
+ this.clearTextSearch();
117
+ this.ensureVisible(this.highlightedIndex, true);
118
+ ev.preventDefault(); // Navigating items in the list scrolls the page
119
+ }
120
+ else if (ev.code === "ArrowDown") {
121
+ this.highlightedIndex = Math.min(this.highlightedIndex + 1, panel.options.length - 1);
122
+ this.clearTextSearch();
123
+ this.ensureVisible(this.highlightedIndex, false);
124
+ ev.preventDefault(); // Navigating items in the list scrolls the page
125
+ }
126
+ else if (ev.code === "Enter") {
127
+ optsPanelMgr.selectIndex(this.highlightedIndex);
128
+ }
129
+ else if (ev.code === "Escape") {
130
+ optsPanelMgr.dismiss();
131
+ ev.stopPropagation();
132
+ }
133
+ else if (/^[a-z]$/i.test(ev.key)) { // a-z
134
+ this.handleTextSearch(ev);
135
+ }
136
+ },
137
+ onfocusout: (ev) => {
138
+ optsPanelMgr.dismiss();
139
+ },
140
+ }, [
141
+ // The container of the option buttons, may be larger than the displayed panel
142
+ m("", {
143
+ style: ``,
144
+ class: `flex flex-col items-stretch`,
145
+ }, [
146
+ ...optsPanelMgr.panel.options.map((optionVnode, optionIndex) => {
147
+ const value = optionVnode.attrs.value;
148
+ const disabled = optionVnode.attrs.disabled === true;
149
+ // An option value button
150
+ return m(`button`, {
151
+ key: value,
152
+ disabled,
153
+ class: `px-2 py-1 flex items-start ${this.highlightedIndex === optionIndex ? "bg-gray-200 dark:bg-black-light" : ""}`,
154
+ onclick: (ev) => {
155
+ ev.stopPropagation();
156
+ if (disabled)
157
+ return;
158
+ // this.select(value);
159
+ optsPanelMgr.selectIndex(optionIndex);
160
+ },
161
+ onmousedown: (ev) => ev.preventDefault(),
162
+ onmouseover: (ev) => this.highlightedIndex = optionIndex,
163
+ }, optionVnode);
164
+ }),
165
+ ]),
166
+ ]);
167
+ }
168
+ };
@@ -0,0 +1,2 @@
1
+ export declare const MAX_OPTION_PANEL_HEIGHT: 320;
2
+ export declare const OPTION_APPROX_HEIGHT: 30;
@@ -0,0 +1,2 @@
1
+ export const MAX_OPTION_PANEL_HEIGHT = 320;
2
+ export const OPTION_APPROX_HEIGHT = 30;
@@ -0,0 +1,2 @@
1
+ export * from "./Select";
2
+ export * from "./SelectOptionsPanel";
@@ -0,0 +1,3 @@
1
+ export * from "./Select";
2
+ export * from "./SelectOptionsPanel";
3
+ // export * from "./select-options-panel-manager";
@@ -0,0 +1,39 @@
1
+ import m from "mithril";
2
+ export type SelectOptionsPanelDef = {
3
+ /** */
4
+ id: string;
5
+ /** The bounding client rect of the select input element within the viewport */
6
+ selectRect: DOMRect;
7
+ /** The list of vnodes to display as options */
8
+ options: m.Vnode<{
9
+ /** The "value" of the option */
10
+ value: string;
11
+ /** Optionally disable selection of the option */
12
+ disabled?: boolean;
13
+ /** The displayed value as text, to enable the user to select the value by label with the keyboard */
14
+ text?: string;
15
+ }, any>[];
16
+ /** */
17
+ selectedIndex: number;
18
+ /** Function to notify the select input of the slected value in the options panel */
19
+ select: (value: string) => void;
20
+ /** Function called after the options panel has been dismissed */
21
+ onDismiss?: () => void;
22
+ };
23
+ /**
24
+ * Manager providing the link between custom select box input components
25
+ * and the layout-level select options panel
26
+ */
27
+ export declare class SelectOptionsManager {
28
+ private _panel;
29
+ panel$: import("rxjs").Observable<SelectOptionsPanelDef | undefined>;
30
+ get panel(): SelectOptionsPanelDef | undefined;
31
+ private lastPanel;
32
+ constructor();
33
+ open(optionsPanel: SelectOptionsPanelDef): void;
34
+ move(id: string, selectRect: DOMRect): void;
35
+ isOpen(selectId: string): boolean;
36
+ selectIndex(index: number): void;
37
+ selectValue(value: any): void;
38
+ dismiss(): void;
39
+ }
@@ -0,0 +1,63 @@
1
+ import { BehaviorSubject } from "rxjs";
2
+ const REOPEN_TIMEOUT = 100;
3
+ /**
4
+ * Manager providing the link between custom select box input components
5
+ * and the layout-level select options panel
6
+ */
7
+ export class SelectOptionsManager {
8
+ get panel() { return this._panel.value; }
9
+ constructor() {
10
+ this._panel = new BehaviorSubject(undefined);
11
+ this.panel$ = this._panel.asObservable();
12
+ this.lastPanel = {
13
+ id: "",
14
+ timestamp: 0,
15
+ };
16
+ }
17
+ open(optionsPanel) {
18
+ // Don't reopen the same panel within the reopen timeout
19
+ if (this.lastPanel.id === optionsPanel.id) {
20
+ if (this.lastPanel.timestamp + REOPEN_TIMEOUT > Date.now())
21
+ return;
22
+ }
23
+ this._panel.next(optionsPanel);
24
+ }
25
+ move(id, selectRect) {
26
+ var _a;
27
+ if (id && this.panel && id === ((_a = this.panel) === null || _a === void 0 ? void 0 : _a.id)) {
28
+ const panel = this.panel;
29
+ if (panel.selectRect.top !== selectRect.top || panel.selectRect.left !== selectRect.left) {
30
+ panel.selectRect = selectRect;
31
+ this._panel.next(panel);
32
+ }
33
+ }
34
+ }
35
+ isOpen(selectId) {
36
+ var _a;
37
+ return ((_a = this.panel) === null || _a === void 0 ? void 0 : _a.id) === selectId;
38
+ }
39
+ selectIndex(index) {
40
+ if (this.panel) {
41
+ if (this.panel.options[index].attrs.disabled) {
42
+ // Noop
43
+ }
44
+ else {
45
+ this.panel.select(this.panel.options[index].attrs.value);
46
+ }
47
+ this.dismiss();
48
+ }
49
+ }
50
+ selectValue(value) {
51
+ if (this.panel) {
52
+ this.panel.select(value);
53
+ this.dismiss();
54
+ }
55
+ }
56
+ dismiss() {
57
+ var _a, _b, _c, _d;
58
+ (_b = (_a = this.panel) === null || _a === void 0 ? void 0 : _a.onDismiss) === null || _b === void 0 ? void 0 : _b.call(_a);
59
+ this.lastPanel.id = (_d = (_c = this.panel) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : "";
60
+ this.lastPanel.timestamp = Date.now();
61
+ this._panel.next(undefined);
62
+ }
63
+ }