@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.
- package/README.md +2 -0
- package/dist/esm/components/accordion/index.d.ts +0 -0
- package/dist/esm/components/accordion/index.js +1 -0
- package/dist/esm/components/data-grid/index.d.ts +0 -0
- package/dist/esm/components/data-grid/index.js +1 -0
- package/dist/esm/components/data-table/index.d.ts +0 -0
- package/dist/esm/components/data-table/index.js +1 -0
- package/dist/esm/components/dialog/Dialog.d.ts +1 -0
- package/dist/esm/components/dialog/Dialog.js +10 -0
- package/dist/esm/components/dialog/dialog-manager.d.ts +45 -0
- package/dist/esm/components/dialog/dialog-manager.js +163 -0
- package/dist/esm/components/dialog/index.d.ts +1 -0
- package/dist/esm/components/dialog/index.js +2 -0
- package/dist/esm/components/drag-handler/DragHandler.d.ts +40 -0
- package/dist/esm/components/drag-handler/DragHandler.js +104 -0
- package/dist/esm/components/drag-handler/index.d.ts +1 -0
- package/dist/esm/components/drag-handler/index.js +1 -0
- package/dist/esm/components/drawer/index.d.ts +0 -0
- package/dist/esm/components/drawer/index.js +1 -0
- package/dist/esm/components/drop-target/DropTarget.d.ts +24 -0
- package/dist/esm/components/drop-target/DropTarget.js +56 -0
- package/dist/esm/components/drop-target/drop-target.state.d.ts +9 -0
- package/dist/esm/components/drop-target/drop-target.state.js +73 -0
- package/dist/esm/components/drop-target/index.d.ts +1 -0
- package/dist/esm/components/drop-target/index.js +1 -0
- package/dist/esm/components/form/Form.d.ts +2 -0
- package/dist/esm/components/form/Form.js +9 -0
- package/dist/esm/components/form/index.d.ts +1 -0
- package/dist/esm/components/form/index.js +1 -0
- package/dist/esm/components/icon/Icon.d.ts +21 -0
- package/dist/esm/components/icon/Icon.js +22 -0
- package/dist/esm/components/icon/icons.d.ts +3 -0
- package/dist/esm/components/icon/icons.js +1 -0
- package/dist/esm/components/icon/index.d.ts +2 -0
- package/dist/esm/components/icon/index.js +2 -0
- package/dist/esm/components/index.d.ts +12 -0
- package/dist/esm/components/index.js +20 -0
- package/dist/esm/components/markdown/Markdown.d.ts +34 -0
- package/dist/esm/components/markdown/Markdown.js +55 -0
- package/dist/esm/components/markdown/index.d.ts +1 -0
- package/dist/esm/components/markdown/index.js +1 -0
- package/dist/esm/components/markdown-editor/MarkdownEditor.d.ts +21 -0
- package/dist/esm/components/markdown-editor/MarkdownEditor.js +181 -0
- package/dist/esm/components/markdown-editor/index.d.ts +1 -0
- package/dist/esm/components/markdown-editor/index.js +1 -0
- package/dist/esm/components/markdown-editor/markdown-editor.state.d.ts +31 -0
- package/dist/esm/components/markdown-editor/markdown-editor.state.js +255 -0
- package/dist/esm/components/menu/Menu.d.ts +14 -0
- package/dist/esm/components/menu/Menu.js +81 -0
- package/dist/esm/components/menu/MenuButton.d.ts +16 -0
- package/dist/esm/components/menu/MenuButton.js +75 -0
- package/dist/esm/components/menu/MenuSeparator.d.ts +2 -0
- package/dist/esm/components/menu/MenuSeparator.js +11 -0
- package/dist/esm/components/menu/index.d.ts +6 -0
- package/dist/esm/components/menu/index.js +6 -0
- package/dist/esm/components/menu/menu-constants.d.ts +4 -0
- package/dist/esm/components/menu/menu-constants.js +4 -0
- package/dist/esm/components/menu/menu-manager.d.ts +22 -0
- package/dist/esm/components/menu/menu-manager.js +72 -0
- package/dist/esm/components/menu/menu-settings.d.ts +9 -0
- package/dist/esm/components/menu/menu-settings.js +9 -0
- package/dist/esm/components/modal/index.d.ts +0 -0
- package/dist/esm/components/modal/index.js +1 -0
- package/dist/esm/components/pagination/Pagination.d.ts +40 -0
- package/dist/esm/components/pagination/Pagination.js +66 -0
- package/dist/esm/components/pagination/index.d.ts +2 -0
- package/dist/esm/components/pagination/index.js +2 -0
- package/dist/esm/components/pagination/pagination-settings.d.ts +17 -0
- package/dist/esm/components/pagination/pagination-settings.js +16 -0
- package/dist/esm/components/panel-tree/PanelTree.d.ts +26 -0
- package/dist/esm/components/panel-tree/PanelTree.js +174 -0
- package/dist/esm/components/panel-tree/index.d.ts +0 -0
- package/dist/esm/components/panel-tree/index.js +1 -0
- package/dist/esm/components/panel-tree/panel-tree-constants.d.ts +3 -0
- package/dist/esm/components/panel-tree/panel-tree-constants.js +3 -0
- package/dist/esm/components/panel-tree/panel-tree-store.d.ts +23 -0
- package/dist/esm/components/panel-tree/panel-tree-store.js +59 -0
- package/dist/esm/components/panel-tree/panel-tree-utils.d.ts +17 -0
- package/dist/esm/components/panel-tree/panel-tree-utils.js +55 -0
- package/dist/esm/components/popover/index.d.ts +0 -0
- package/dist/esm/components/popover/index.js +1 -0
- package/dist/esm/components/reorderable-list/RedorderableList.d.ts +55 -0
- package/dist/esm/components/reorderable-list/RedorderableList.js +202 -0
- package/dist/esm/components/reorderable-list/index.d.ts +0 -0
- package/dist/esm/components/reorderable-list/index.js +1 -0
- package/dist/esm/components/select/Select.d.ts +44 -0
- package/dist/esm/components/select/Select.js +108 -0
- package/dist/esm/components/select/SelectOptionsPanel.d.ts +21 -0
- package/dist/esm/components/select/SelectOptionsPanel.js +168 -0
- package/dist/esm/components/select/constants.d.ts +2 -0
- package/dist/esm/components/select/constants.js +2 -0
- package/dist/esm/components/select/index.d.ts +2 -0
- package/dist/esm/components/select/index.js +3 -0
- package/dist/esm/components/select/select-options-manager.d.ts +39 -0
- package/dist/esm/components/select/select-options-manager.js +63 -0
- package/dist/esm/components/tab-panel/TabPanel.d.ts +23 -0
- package/dist/esm/components/tab-panel/TabPanel.js +88 -0
- package/dist/esm/components/tab-panel/index.d.ts +3 -0
- package/dist/esm/components/tab-panel/index.js +3 -0
- package/dist/esm/components/tab-panel/tab-panel-default-settings.d.ts +17 -0
- package/dist/esm/components/tab-panel/tab-panel-default-settings.js +17 -0
- package/dist/esm/components/tab-panel/tab-panel-settings.d.ts +28 -0
- package/dist/esm/components/tab-panel/tab-panel-settings.js +11 -0
- package/dist/esm/components/table/Table.d.ts +64 -0
- package/dist/esm/components/table/Table.js +68 -0
- package/dist/esm/components/table/index.d.ts +1 -0
- package/dist/esm/components/table/index.js +1 -0
- package/dist/esm/components/toast/index.d.ts +1 -0
- package/dist/esm/components/toast/index.js +1 -0
- package/dist/esm/components/toast/toast.d.ts +15 -0
- package/dist/esm/components/toast/toast.js +31 -0
- package/dist/esm/components/tooltip/index.d.ts +3 -0
- package/dist/esm/components/tooltip/index.js +3 -0
- package/dist/esm/components/tooltip/tooltip-defaults.d.ts +23 -0
- package/dist/esm/components/tooltip/tooltip-defaults.js +22 -0
- package/dist/esm/components/tooltip/tooltip-function.d.ts +35 -0
- package/dist/esm/components/tooltip/tooltip-function.js +200 -0
- package/dist/esm/components/tooltip/tooltip-interfaces.d.ts +11 -0
- package/dist/esm/components/tooltip/tooltip-interfaces.js +1 -0
- package/dist/esm/components/tree/Tree.d.ts +110 -0
- package/dist/esm/components/tree/Tree.js +222 -0
- package/dist/esm/components/tree/index.d.ts +3 -0
- package/dist/esm/components/tree/index.js +3 -0
- package/dist/esm/components/tree/tree-node.interface.d.ts +9 -0
- package/dist/esm/components/tree/tree-node.interface.js +1 -0
- package/dist/esm/components/tree/tree-utils.d.ts +11 -0
- package/dist/esm/components/tree/tree-utils.js +18 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/utils/date-time.d.ts +3 -0
- package/dist/esm/utils/date-time.js +22 -0
- package/dist/esm/utils/dom.d.ts +16 -0
- package/dist/esm/utils/dom.js +28 -0
- package/dist/esm/utils/events.d.ts +1 -0
- package/dist/esm/utils/events.js +25 -0
- package/dist/esm/utils/index.d.ts +3 -0
- package/dist/esm/utils/index.js +3 -0
- package/package.json +7 -3
- /package/dist/{components → cjs/components}/accordion/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/accordion/index.js +0 -0
- /package/dist/{components → cjs/components}/data-grid/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/data-grid/index.js +0 -0
- /package/dist/{components → cjs/components}/data-table/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/data-table/index.js +0 -0
- /package/dist/{components → cjs/components}/dialog/Dialog.d.ts +0 -0
- /package/dist/{components → cjs/components}/dialog/Dialog.js +0 -0
- /package/dist/{components → cjs/components}/dialog/dialog-manager.d.ts +0 -0
- /package/dist/{components → cjs/components}/dialog/dialog-manager.js +0 -0
- /package/dist/{components → cjs/components}/dialog/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/dialog/index.js +0 -0
- /package/dist/{components → cjs/components}/drag-handler/DragHandler.d.ts +0 -0
- /package/dist/{components → cjs/components}/drag-handler/DragHandler.js +0 -0
- /package/dist/{components → cjs/components}/drag-handler/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/drag-handler/index.js +0 -0
- /package/dist/{components → cjs/components}/drawer/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/drawer/index.js +0 -0
- /package/dist/{components → cjs/components}/drop-target/DropTarget.d.ts +0 -0
- /package/dist/{components → cjs/components}/drop-target/DropTarget.js +0 -0
- /package/dist/{components → cjs/components}/drop-target/drop-target.state.d.ts +0 -0
- /package/dist/{components → cjs/components}/drop-target/drop-target.state.js +0 -0
- /package/dist/{components → cjs/components}/drop-target/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/drop-target/index.js +0 -0
- /package/dist/{components → cjs/components}/form/Form.d.ts +0 -0
- /package/dist/{components → cjs/components}/form/Form.js +0 -0
- /package/dist/{components → cjs/components}/form/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/form/index.js +0 -0
- /package/dist/{components → cjs/components}/icon/Icon.d.ts +0 -0
- /package/dist/{components → cjs/components}/icon/Icon.js +0 -0
- /package/dist/{components → cjs/components}/icon/icons.d.ts +0 -0
- /package/dist/{components → cjs/components}/icon/icons.js +0 -0
- /package/dist/{components → cjs/components}/icon/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/icon/index.js +0 -0
- /package/dist/{components → cjs/components}/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/index.js +0 -0
- /package/dist/{components → cjs/components}/markdown/Markdown.d.ts +0 -0
- /package/dist/{components → cjs/components}/markdown/Markdown.js +0 -0
- /package/dist/{components → cjs/components}/markdown/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/markdown/index.js +0 -0
- /package/dist/{components → cjs/components}/markdown-editor/MarkdownEditor.d.ts +0 -0
- /package/dist/{components → cjs/components}/markdown-editor/MarkdownEditor.js +0 -0
- /package/dist/{components → cjs/components}/markdown-editor/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/markdown-editor/index.js +0 -0
- /package/dist/{components → cjs/components}/markdown-editor/markdown-editor.state.d.ts +0 -0
- /package/dist/{components → cjs/components}/markdown-editor/markdown-editor.state.js +0 -0
- /package/dist/{components → cjs/components}/menu/Menu.d.ts +0 -0
- /package/dist/{components → cjs/components}/menu/Menu.js +0 -0
- /package/dist/{components → cjs/components}/menu/MenuButton.d.ts +0 -0
- /package/dist/{components → cjs/components}/menu/MenuButton.js +0 -0
- /package/dist/{components → cjs/components}/menu/MenuSeparator.d.ts +0 -0
- /package/dist/{components → cjs/components}/menu/MenuSeparator.js +0 -0
- /package/dist/{components → cjs/components}/menu/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/menu/index.js +0 -0
- /package/dist/{components → cjs/components}/menu/menu-constants.d.ts +0 -0
- /package/dist/{components → cjs/components}/menu/menu-constants.js +0 -0
- /package/dist/{components → cjs/components}/menu/menu-manager.d.ts +0 -0
- /package/dist/{components → cjs/components}/menu/menu-manager.js +0 -0
- /package/dist/{components → cjs/components}/menu/menu-settings.d.ts +0 -0
- /package/dist/{components → cjs/components}/menu/menu-settings.js +0 -0
- /package/dist/{components → cjs/components}/modal/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/modal/index.js +0 -0
- /package/dist/{components → cjs/components}/pagination/Pagination.d.ts +0 -0
- /package/dist/{components → cjs/components}/pagination/Pagination.js +0 -0
- /package/dist/{components → cjs/components}/pagination/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/pagination/index.js +0 -0
- /package/dist/{components → cjs/components}/pagination/pagination-settings.d.ts +0 -0
- /package/dist/{components → cjs/components}/pagination/pagination-settings.js +0 -0
- /package/dist/{components → cjs/components}/panel-tree/PanelTree.d.ts +0 -0
- /package/dist/{components → cjs/components}/panel-tree/PanelTree.js +0 -0
- /package/dist/{components → cjs/components}/panel-tree/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/panel-tree/index.js +0 -0
- /package/dist/{components → cjs/components}/panel-tree/panel-tree-constants.d.ts +0 -0
- /package/dist/{components → cjs/components}/panel-tree/panel-tree-constants.js +0 -0
- /package/dist/{components → cjs/components}/panel-tree/panel-tree-store.d.ts +0 -0
- /package/dist/{components → cjs/components}/panel-tree/panel-tree-store.js +0 -0
- /package/dist/{components → cjs/components}/panel-tree/panel-tree-utils.d.ts +0 -0
- /package/dist/{components → cjs/components}/panel-tree/panel-tree-utils.js +0 -0
- /package/dist/{components → cjs/components}/popover/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/popover/index.js +0 -0
- /package/dist/{components → cjs/components}/reorderable-list/RedorderableList.d.ts +0 -0
- /package/dist/{components → cjs/components}/reorderable-list/RedorderableList.js +0 -0
- /package/dist/{components → cjs/components}/reorderable-list/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/reorderable-list/index.js +0 -0
- /package/dist/{components → cjs/components}/select/Select.d.ts +0 -0
- /package/dist/{components → cjs/components}/select/Select.js +0 -0
- /package/dist/{components → cjs/components}/select/SelectOptionsPanel.d.ts +0 -0
- /package/dist/{components → cjs/components}/select/SelectOptionsPanel.js +0 -0
- /package/dist/{components → cjs/components}/select/constants.d.ts +0 -0
- /package/dist/{components → cjs/components}/select/constants.js +0 -0
- /package/dist/{components → cjs/components}/select/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/select/index.js +0 -0
- /package/dist/{components → cjs/components}/select/select-options-manager.d.ts +0 -0
- /package/dist/{components → cjs/components}/select/select-options-manager.js +0 -0
- /package/dist/{components → cjs/components}/tab-panel/TabPanel.d.ts +0 -0
- /package/dist/{components → cjs/components}/tab-panel/TabPanel.js +0 -0
- /package/dist/{components → cjs/components}/tab-panel/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/tab-panel/index.js +0 -0
- /package/dist/{components → cjs/components}/tab-panel/tab-panel-default-settings.d.ts +0 -0
- /package/dist/{components → cjs/components}/tab-panel/tab-panel-default-settings.js +0 -0
- /package/dist/{components → cjs/components}/tab-panel/tab-panel-settings.d.ts +0 -0
- /package/dist/{components → cjs/components}/tab-panel/tab-panel-settings.js +0 -0
- /package/dist/{components → cjs/components}/table/Table.d.ts +0 -0
- /package/dist/{components → cjs/components}/table/Table.js +0 -0
- /package/dist/{components → cjs/components}/table/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/table/index.js +0 -0
- /package/dist/{components → cjs/components}/toast/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/toast/index.js +0 -0
- /package/dist/{components → cjs/components}/toast/toast.d.ts +0 -0
- /package/dist/{components → cjs/components}/toast/toast.js +0 -0
- /package/dist/{components → cjs/components}/tooltip/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/tooltip/index.js +0 -0
- /package/dist/{components → cjs/components}/tooltip/tooltip-defaults.d.ts +0 -0
- /package/dist/{components → cjs/components}/tooltip/tooltip-defaults.js +0 -0
- /package/dist/{components → cjs/components}/tooltip/tooltip-function.d.ts +0 -0
- /package/dist/{components → cjs/components}/tooltip/tooltip-function.js +0 -0
- /package/dist/{components → cjs/components}/tooltip/tooltip-interfaces.d.ts +0 -0
- /package/dist/{components → cjs/components}/tooltip/tooltip-interfaces.js +0 -0
- /package/dist/{components → cjs/components}/tree/Tree.d.ts +0 -0
- /package/dist/{components → cjs/components}/tree/Tree.js +0 -0
- /package/dist/{components → cjs/components}/tree/index.d.ts +0 -0
- /package/dist/{components → cjs/components}/tree/index.js +0 -0
- /package/dist/{components → cjs/components}/tree/tree-node.interface.d.ts +0 -0
- /package/dist/{components → cjs/components}/tree/tree-node.interface.js +0 -0
- /package/dist/{components → cjs/components}/tree/tree-utils.d.ts +0 -0
- /package/dist/{components → cjs/components}/tree/tree-utils.js +0 -0
- /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
- /package/dist/{index.js → cjs/index.js} +0 -0
- /package/dist/{utils → cjs/utils}/date-time.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/date-time.js +0 -0
- /package/dist/{utils → cjs/utils}/dom.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/dom.js +0 -0
- /package/dist/{utils → cjs/utils}/events.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/events.js +0 -0
- /package/dist/{utils → cjs/utils}/index.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/index.js +0 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { TOOLTIP_DEFAULTS } from "./tooltip-defaults";
|
|
2
|
+
/**
|
|
3
|
+
* Display a tooltip using the given mouse event.
|
|
4
|
+
* Call this function from an element's "mouseenter" event.
|
|
5
|
+
*
|
|
6
|
+
* e.g.:
|
|
7
|
+
* ```
|
|
8
|
+
* onmouseenter: (ev: MouseEvent) => tooltip(ev, "Howdy!"),
|
|
9
|
+
* ```
|
|
10
|
+
* @param ev
|
|
11
|
+
* @param tooltip Nothing is displayed if the tooltip text is empty
|
|
12
|
+
* @param opts
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
export function tooltip(ev, tooltip, opts) {
|
|
16
|
+
var _a;
|
|
17
|
+
if (TOOLTIP_DEFAULTS.IS_ENABLED === false)
|
|
18
|
+
return;
|
|
19
|
+
// If there is no tooltip, don't bother
|
|
20
|
+
if (!tooltip)
|
|
21
|
+
return;
|
|
22
|
+
const target = ev.currentTarget;
|
|
23
|
+
const eventTarget = ev.target;
|
|
24
|
+
TOOLTIP_DEFAULTS.ENABLE_DEBUG && console.log(`target is ${target === null || target === void 0 ? void 0 : target.tagName}`);
|
|
25
|
+
TOOLTIP_DEFAULTS.ENABLE_DEBUG && console.log(`event target is ${eventTarget === null || eventTarget === void 0 ? void 0 : eventTarget.tagName}`);
|
|
26
|
+
if (!target) {
|
|
27
|
+
TOOLTIP_DEFAULTS.ENABLE_DEBUG && console.log("No target; returning from tooltip()");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// if (target?.classList.contains(TOOLTIP_CLASS) || eventTarget?.classList.contains(TOOLTIP_CLASS)) {
|
|
31
|
+
// return logger.debug("Target is tooltip div; returning from tooltip()");
|
|
32
|
+
// }
|
|
33
|
+
// This helps avoid re-adding tooltips when mousing over the tooltip itself
|
|
34
|
+
let hasTooltip = false;
|
|
35
|
+
target.childNodes.forEach((child, key, parent) => {
|
|
36
|
+
var _a;
|
|
37
|
+
if ((_a = child === null || child === void 0 ? void 0 : child.classList) === null || _a === void 0 ? void 0 : _a.contains(TOOLTIP_DEFAULTS.TOOLTIP_CLASS)) {
|
|
38
|
+
hasTooltip = true;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
if (hasTooltip) {
|
|
42
|
+
TOOLTIP_DEFAULTS.ENABLE_DEBUG && console.log("Target already has tooltip; returning from tooltip()");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const mousePos = { x: ev.x, y: ev.y };
|
|
46
|
+
const latestPosFn = (ev) => {
|
|
47
|
+
mousePos.x = ev.x;
|
|
48
|
+
mousePos.y = ev.y;
|
|
49
|
+
};
|
|
50
|
+
target.addEventListener("mousemove", latestPosFn);
|
|
51
|
+
const timeout = setTimeout(() => {
|
|
52
|
+
displayTooltip({ ev, target, tooltip, opts, mousePos });
|
|
53
|
+
}, (_a = opts === null || opts === void 0 ? void 0 : opts.delay) !== null && _a !== void 0 ? _a : TOOLTIP_DEFAULTS.DEFAULT_DELAY);
|
|
54
|
+
const clearFn = (ev) => {
|
|
55
|
+
TOOLTIP_DEFAULTS.ENABLE_DEBUG && console.log("Clearing tooltip timeout");
|
|
56
|
+
clearTimeout(timeout);
|
|
57
|
+
target.removeEventListener("mouseleave", clearFn);
|
|
58
|
+
target.removeEventListener("mousemove", latestPosFn);
|
|
59
|
+
};
|
|
60
|
+
target.addEventListener("mouseleave", clearFn);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Return an object that can be spread into an element's attrs to add a tooltip using the mouseenter event
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* m("button", {
|
|
68
|
+
* ...tooltipSpread("Click the button"),
|
|
69
|
+
* }, "Click me"),
|
|
70
|
+
* // is equivalent to:
|
|
71
|
+
* m("button", {
|
|
72
|
+
* onmousenter: (ev: Mousevent) => tooltip(ev, "Click the button"),
|
|
73
|
+
* }, "Click me"),
|
|
74
|
+
* ```
|
|
75
|
+
* @param value
|
|
76
|
+
* @param opts
|
|
77
|
+
* @returns
|
|
78
|
+
*/
|
|
79
|
+
export function tooltipSpread(value, opts) {
|
|
80
|
+
return {
|
|
81
|
+
onmouseenter: (ev) => tooltip(ev, value, opts),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* TODO: consider adding arrows to top/bottom/left/right positioned tooltips
|
|
86
|
+
* e.g.: https://getbootstrap.com/docs/3.4/javascript/#tooltips
|
|
87
|
+
*/
|
|
88
|
+
function displayTooltip(settings) {
|
|
89
|
+
var _a, _b, _c;
|
|
90
|
+
const { ev, target, tooltip, opts, mousePos } = settings;
|
|
91
|
+
const cursorOffsetX = 5;
|
|
92
|
+
const cursorOffsetY = 20;
|
|
93
|
+
const pos = (_a = opts === null || opts === void 0 ? void 0 : opts.pos) !== null && _a !== void 0 ? _a : TOOLTIP_DEFAULTS.DEFAULT_POS;
|
|
94
|
+
let targetRect = target.getBoundingClientRect();
|
|
95
|
+
// targetRect = new DOMRect(targetRect.x, targetRect.y, targetRect.width, targetRect.height);
|
|
96
|
+
let targetCenter = {
|
|
97
|
+
x: targetRect.left + (targetRect.width / 2),
|
|
98
|
+
y: targetRect.top + (targetRect.height / 2),
|
|
99
|
+
};
|
|
100
|
+
const maxWidth = (opts === null || opts === void 0 ? void 0 : opts.jumbo) === true ? TOOLTIP_DEFAULTS.MAX_WIDTH_JUMBO_PX : TOOLTIP_DEFAULTS.MAX_WIDTH_PX;
|
|
101
|
+
const maxHeight = (opts === null || opts === void 0 ? void 0 : opts.jumbo) === true ? TOOLTIP_DEFAULTS.MAX_HEIGHT_JUMBO_PX : TOOLTIP_DEFAULTS.MAX_HEIGHT_PX;
|
|
102
|
+
const attachToBody = (_c = (_b = settings.opts) === null || _b === void 0 ? void 0 : _b.attachToBody) !== null && _c !== void 0 ? _c : TOOLTIP_DEFAULTS.ATTACH_TO_BODY;
|
|
103
|
+
TOOLTIP_DEFAULTS.ENABLE_DEBUG && console.log(`display tooltip "${tooltip}" on element ${target.tagName}`);
|
|
104
|
+
const tooltipEl = document.createElement("div");
|
|
105
|
+
tooltipEl.innerText = tooltip;
|
|
106
|
+
// tooltipEl.classList.value = "px-2 py-1 text-xs text-dark font-normal rounded border border-primary bg-white fade-in-100 no-select";
|
|
107
|
+
tooltipEl.classList.add("mico-tooltip-fade-in");
|
|
108
|
+
tooltipEl.classList.add(TOOLTIP_DEFAULTS.TOOLTIP_CLASS);
|
|
109
|
+
tooltipEl.style.position = "fixed";
|
|
110
|
+
tooltipEl.style.maxWidth = `${maxWidth}px`;
|
|
111
|
+
tooltipEl.style.maxHeight = `${maxHeight}px`;
|
|
112
|
+
tooltipEl.style.zIndex = "1000";
|
|
113
|
+
tooltipEl.style.whiteSpace = "normal";
|
|
114
|
+
tooltipEl.style.opacity = "1";
|
|
115
|
+
tooltipEl.style.textAlign = "left";
|
|
116
|
+
tooltipEl.style.overflow = "hidden";
|
|
117
|
+
tooltipEl.setAttribute("role", "tooltip");
|
|
118
|
+
// // Add the tooltip before positioning it to read its dimensions
|
|
119
|
+
// console.log(`tooltipEl width: ${tooltipEl.clientWidth}`);
|
|
120
|
+
// console.log(`tooltipEl height: ${tooltipEl.clientHeight}`);
|
|
121
|
+
if (attachToBody === true) {
|
|
122
|
+
document.body.append(tooltipEl);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
target.append(tooltipEl);
|
|
126
|
+
}
|
|
127
|
+
// console.log(`tooltipEl width: ${tooltipEl.clientWidth}`);
|
|
128
|
+
// console.log(`tooltipEl height: ${tooltipEl.clientHeight}`);
|
|
129
|
+
if (pos === "cursor" || pos === "follow") {
|
|
130
|
+
tooltipEl.style.top = `${mousePos.y + cursorOffsetY}px`;
|
|
131
|
+
if (mousePos.x < window.innerWidth - maxWidth) {
|
|
132
|
+
tooltipEl.style.left = `${mousePos.x + cursorOffsetX}px`;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
tooltipEl.style.right = `${document.documentElement.clientWidth - mousePos.x - cursorOffsetX}px`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else if (pos === "top") {
|
|
139
|
+
tooltipEl.style.bottom = `${window.innerHeight - targetRect.top}px`; // - window.scrollY
|
|
140
|
+
tooltipEl.style.left = `${targetCenter.x - tooltipEl.clientWidth / 2}px`;
|
|
141
|
+
}
|
|
142
|
+
else if (pos === "bottom") {
|
|
143
|
+
tooltipEl.style.top = `${targetRect.bottom}px`; // + window.scrollY
|
|
144
|
+
tooltipEl.style.left = `${targetCenter.x - tooltipEl.clientWidth / 2}px`;
|
|
145
|
+
}
|
|
146
|
+
else if (pos === "left") {
|
|
147
|
+
tooltipEl.style.right = `${document.documentElement.clientWidth - targetRect.left}px`;
|
|
148
|
+
tooltipEl.style.top = `${targetCenter.y - tooltipEl.clientHeight / 2}px`;
|
|
149
|
+
}
|
|
150
|
+
else if (pos === "right") {
|
|
151
|
+
tooltipEl.style.left = `${targetRect.right}px`;
|
|
152
|
+
tooltipEl.style.top = `${targetCenter.y - tooltipEl.clientHeight / 2}px`;
|
|
153
|
+
}
|
|
154
|
+
if (pos === "follow") {
|
|
155
|
+
const followFn = (ev) => {
|
|
156
|
+
tooltipEl.style.top = `${ev.y + cursorOffsetY}px`; // + window.scrollY
|
|
157
|
+
if (mousePos.x < window.innerWidth - maxWidth) {
|
|
158
|
+
tooltipEl.style.left = `${ev.x + cursorOffsetX}px`;
|
|
159
|
+
tooltipEl.style.right = "";
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
tooltipEl.style.right = `${document.documentElement.clientWidth - ev.x - cursorOffsetX}px`;
|
|
163
|
+
tooltipEl.style.left = "";
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
const cleanupFn = () => {
|
|
167
|
+
target.removeEventListener("mousemove", followFn);
|
|
168
|
+
target.removeEventListener("mouseleave", cleanupFn);
|
|
169
|
+
};
|
|
170
|
+
target.addEventListener("mousemove", followFn);
|
|
171
|
+
target.addEventListener("mouseleave", cleanupFn);
|
|
172
|
+
}
|
|
173
|
+
TOOLTIP_DEFAULTS.ENABLE_DEBUG && console.log(`displaying tooltip at: ${tooltipEl.style.left}, ${tooltipEl.style.top}`);
|
|
174
|
+
const removeFn = () => {
|
|
175
|
+
TOOLTIP_DEFAULTS.ENABLE_DEBUG && console.log(`Removing tooltip ${tooltip} from el ${target.tagName}`);
|
|
176
|
+
tooltipEl.onanimationend = (ev) => {
|
|
177
|
+
TOOLTIP_DEFAULTS.ENABLE_DEBUG && console.log(ev.animationName);
|
|
178
|
+
if (attachToBody === true) {
|
|
179
|
+
document.body.removeChild(tooltipEl);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
target.removeChild(tooltipEl);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
tooltipEl.classList.replace("mico-tooltip-fade-in", "mico-tooltip-fade-out");
|
|
186
|
+
target.removeEventListener("mouseleave", removeFn);
|
|
187
|
+
tooltipEl.removeEventListener("mouseenter", removeFn);
|
|
188
|
+
};
|
|
189
|
+
target.addEventListener("mouseleave", removeFn);
|
|
190
|
+
tooltipEl.addEventListener("mouseenter", removeFn);
|
|
191
|
+
if (attachToBody === true) {
|
|
192
|
+
const bodyListener = (ev) => {
|
|
193
|
+
if (ev.target && !target.contains(ev.target)) {
|
|
194
|
+
removeFn();
|
|
195
|
+
document.body.removeEventListener("mousemove", bodyListener);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
document.body.addEventListener("mousemove", bodyListener);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface TooltipOptions {
|
|
2
|
+
/** Specify the position of the tooltip */
|
|
3
|
+
pos: TooltipPosition;
|
|
4
|
+
/** Override the default delay in milliseconds */
|
|
5
|
+
delay: number;
|
|
6
|
+
/** Increase the maximum width and height of the tooltip */
|
|
7
|
+
jumbo: boolean;
|
|
8
|
+
/** The tooltip should be attached to the document instead of the moused-over element */
|
|
9
|
+
attachToBody: boolean;
|
|
10
|
+
}
|
|
11
|
+
export type TooltipPosition = "cursor" | "top" | "bottom" | "left" | "right" | "follow";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import m from "mithril";
|
|
2
|
+
import { TreeNode } from "./tree-node.interface";
|
|
3
|
+
/**
|
|
4
|
+
* An untyped tree component (see `createTree<T>()`)
|
|
5
|
+
*/
|
|
6
|
+
export declare const Tree: m.Component<{
|
|
7
|
+
/** The root list of nodes to display in the tree (circular references will crash) */
|
|
8
|
+
nodes: TreeNode<any>[];
|
|
9
|
+
/** Enable drag and drop reordering */
|
|
10
|
+
enableReordering?: boolean | undefined;
|
|
11
|
+
/** Enable expanding/collapsing of nodes with children */
|
|
12
|
+
enableToggling?: boolean | undefined;
|
|
13
|
+
/** Enable debug logging of certain events */
|
|
14
|
+
enableLogging?: boolean | undefined;
|
|
15
|
+
/** Function called when a node with children is toggled */
|
|
16
|
+
ontoggle?: ((toggle: {
|
|
17
|
+
node: TreeNode<any>;
|
|
18
|
+
expanded: boolean;
|
|
19
|
+
recursive: boolean;
|
|
20
|
+
}) => void) | undefined;
|
|
21
|
+
/** Function called when a node label is clicked */
|
|
22
|
+
onclick?: ((click: {
|
|
23
|
+
ev: MouseEvent;
|
|
24
|
+
node: TreeNode<any>;
|
|
25
|
+
}) => void) | undefined;
|
|
26
|
+
/** Function called when a node has been dragged to a new position in the tree */
|
|
27
|
+
onreorder?: ((reorder: {
|
|
28
|
+
moved: any;
|
|
29
|
+
target: any;
|
|
30
|
+
above: boolean;
|
|
31
|
+
}) => void) | undefined;
|
|
32
|
+
/** Optional message to display in defined but empty children lists */
|
|
33
|
+
emptyChildrenMessage?: string | undefined;
|
|
34
|
+
/** Optionally override the default icon for a collapsed node */
|
|
35
|
+
collapsedIcon?: m.Vnode<any, any> | undefined;
|
|
36
|
+
/** Optionally override the default icon for an expanded node */
|
|
37
|
+
expandedIcon?: m.Vnode<any, any> | undefined;
|
|
38
|
+
/** Optionally override the default toggle icon for a node that cannot toggle */
|
|
39
|
+
noToggleIcon?: m.Vnode<any, any> | undefined;
|
|
40
|
+
/** Optionally enable toggling of expansion nodes by clicking their labels */
|
|
41
|
+
toggleExpansionWithLabel?: boolean | undefined;
|
|
42
|
+
/** Optionally override the default nesting width */
|
|
43
|
+
nestingWidth?: string | undefined;
|
|
44
|
+
/** Optionally override the default toggle button width */
|
|
45
|
+
toggleButtonWidth?: string | undefined;
|
|
46
|
+
/** Optional CSS classes to apply to the root div */
|
|
47
|
+
class?: string | undefined;
|
|
48
|
+
/** Optional CSS styles to apply to the root div */
|
|
49
|
+
style?: string | undefined;
|
|
50
|
+
}, {
|
|
51
|
+
isReordering: boolean;
|
|
52
|
+
thisEl: Element;
|
|
53
|
+
targetRect: DOMRect | undefined;
|
|
54
|
+
targettingTop: boolean;
|
|
55
|
+
}>;
|
|
56
|
+
/**
|
|
57
|
+
* Build a component to display nested nodes in a tree.
|
|
58
|
+
*
|
|
59
|
+
* Nodes with children are collapsable, and nodes can be arbitrarily reordered.
|
|
60
|
+
*/
|
|
61
|
+
export declare function createTree<TNodeData extends object = {}>(): m.Component<{
|
|
62
|
+
/** The root list of nodes to display in the tree (circular references will crash) */
|
|
63
|
+
nodes: TreeNode<TNodeData>[];
|
|
64
|
+
/** Enable drag and drop reordering */
|
|
65
|
+
enableReordering?: boolean | undefined;
|
|
66
|
+
/** Enable expanding/collapsing of nodes with children */
|
|
67
|
+
enableToggling?: boolean | undefined;
|
|
68
|
+
/** Enable debug logging of certain events */
|
|
69
|
+
enableLogging?: boolean | undefined;
|
|
70
|
+
/** Function called when a node with children is toggled */
|
|
71
|
+
ontoggle?: ((toggle: {
|
|
72
|
+
node: TreeNode<TNodeData>;
|
|
73
|
+
expanded: boolean;
|
|
74
|
+
recursive: boolean;
|
|
75
|
+
}) => void) | undefined;
|
|
76
|
+
/** Function called when a node label is clicked */
|
|
77
|
+
onclick?: ((click: {
|
|
78
|
+
ev: MouseEvent;
|
|
79
|
+
node: TreeNode<TNodeData>;
|
|
80
|
+
}) => void) | undefined;
|
|
81
|
+
/** Function called when a node has been dragged to a new position in the tree */
|
|
82
|
+
onreorder?: ((reorder: {
|
|
83
|
+
moved: TNodeData;
|
|
84
|
+
target: TNodeData;
|
|
85
|
+
above: boolean;
|
|
86
|
+
}) => void) | undefined;
|
|
87
|
+
/** Optional message to display in defined but empty children lists */
|
|
88
|
+
emptyChildrenMessage?: string | undefined;
|
|
89
|
+
/** Optionally override the default icon for a collapsed node */
|
|
90
|
+
collapsedIcon?: m.Vnode<any, any> | undefined;
|
|
91
|
+
/** Optionally override the default icon for an expanded node */
|
|
92
|
+
expandedIcon?: m.Vnode<any, any> | undefined;
|
|
93
|
+
/** Optionally override the default toggle icon for a node that cannot toggle */
|
|
94
|
+
noToggleIcon?: m.Vnode<any, any> | undefined;
|
|
95
|
+
/** Optionally enable toggling of expansion nodes by clicking their labels */
|
|
96
|
+
toggleExpansionWithLabel?: boolean | undefined;
|
|
97
|
+
/** Optionally override the default nesting width */
|
|
98
|
+
nestingWidth?: string | undefined;
|
|
99
|
+
/** Optionally override the default toggle button width */
|
|
100
|
+
toggleButtonWidth?: string | undefined;
|
|
101
|
+
/** Optional CSS classes to apply to the root div */
|
|
102
|
+
class?: string | undefined;
|
|
103
|
+
/** Optional CSS styles to apply to the root div */
|
|
104
|
+
style?: string | undefined;
|
|
105
|
+
}, {
|
|
106
|
+
isReordering: boolean;
|
|
107
|
+
thisEl: Element;
|
|
108
|
+
targetRect: DOMRect | undefined;
|
|
109
|
+
targettingTop: boolean;
|
|
110
|
+
}>;
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { compareObjects } from "@hypericon/utils";
|
|
2
|
+
import m from "mithril";
|
|
3
|
+
import { Icon } from "../icon";
|
|
4
|
+
const DATA_TRANSFER_TYPE = "application/tree-data";
|
|
5
|
+
const DEFAULT_NESTING_WIDTH = "1.5rem";
|
|
6
|
+
const DEFAULT_TOGGLE_WIDTH = "1.5rem";
|
|
7
|
+
/**
|
|
8
|
+
* An untyped tree component (see `createTree<T>()`)
|
|
9
|
+
*/
|
|
10
|
+
export const Tree = createTree();
|
|
11
|
+
/**
|
|
12
|
+
* Build a component to display nested nodes in a tree.
|
|
13
|
+
*
|
|
14
|
+
* Nodes with children are collapsable, and nodes can be arbitrarily reordered.
|
|
15
|
+
*/
|
|
16
|
+
export function createTree() {
|
|
17
|
+
// /** Reference to the TreeItem currently being dragged */
|
|
18
|
+
// let draggedTreeItem: TreeItem<T> | undefined = undefined;
|
|
19
|
+
const Tree = {
|
|
20
|
+
oninit() {
|
|
21
|
+
this.isReordering = false;
|
|
22
|
+
},
|
|
23
|
+
oncreate({ dom }) {
|
|
24
|
+
this.thisEl = dom;
|
|
25
|
+
},
|
|
26
|
+
view({ attrs }) {
|
|
27
|
+
var _a, _b;
|
|
28
|
+
const nodes = attrs.nodes;
|
|
29
|
+
return m(".mico-tree", {
|
|
30
|
+
style: `${(_a = attrs.style) !== null && _a !== void 0 ? _a : ""} position: relative;`,
|
|
31
|
+
class: `${(_b = attrs.class) !== null && _b !== void 0 ? _b : ""}`
|
|
32
|
+
}, [
|
|
33
|
+
m("ul", nodes.map((node, i) => {
|
|
34
|
+
return m(TreeNode, {
|
|
35
|
+
// key: i, // item.key,
|
|
36
|
+
node,
|
|
37
|
+
enableReordering: attrs.enableReordering,
|
|
38
|
+
enableToggling: attrs.enableToggling,
|
|
39
|
+
enableLogging: attrs.enableLogging,
|
|
40
|
+
ontoggle: attrs.ontoggle,
|
|
41
|
+
onclick: attrs.onclick,
|
|
42
|
+
onreorder: attrs.onreorder,
|
|
43
|
+
emptyChildrenMessage: attrs.emptyChildrenMessage,
|
|
44
|
+
collapsedIcon: attrs.collapsedIcon,
|
|
45
|
+
expandedIcon: attrs.expandedIcon,
|
|
46
|
+
noToggleIcon: attrs.noToggleIcon,
|
|
47
|
+
toggleExpansionWithLabel: attrs.toggleExpansionWithLabel,
|
|
48
|
+
nestingWidth: attrs.nestingWidth || DEFAULT_NESTING_WIDTH,
|
|
49
|
+
toggleButtonWidth: attrs.toggleButtonWidth || DEFAULT_TOGGLE_WIDTH,
|
|
50
|
+
});
|
|
51
|
+
})),
|
|
52
|
+
]);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const TreeNode = {
|
|
56
|
+
oninit({ attrs }) {
|
|
57
|
+
const { enableReordering } = attrs;
|
|
58
|
+
this.isReorderingOver = false;
|
|
59
|
+
this.handleClick = (ev, node) => {
|
|
60
|
+
var _a;
|
|
61
|
+
(_a = attrs.onclick) === null || _a === void 0 ? void 0 : _a.call(attrs, { ev, node });
|
|
62
|
+
};
|
|
63
|
+
this.handleDragStart = (ev, node) => {
|
|
64
|
+
if (!enableReordering)
|
|
65
|
+
return;
|
|
66
|
+
if (!ev.dataTransfer)
|
|
67
|
+
return;
|
|
68
|
+
if (node.draggable === false)
|
|
69
|
+
return;
|
|
70
|
+
attrs.enableLogging && console.log(`start dragging`, node.data);
|
|
71
|
+
ev.dataTransfer.setData(DATA_TRANSFER_TYPE, JSON.stringify(node.data));
|
|
72
|
+
ev.dataTransfer.effectAllowed = "move";
|
|
73
|
+
// attrs.reorderstart?.();
|
|
74
|
+
};
|
|
75
|
+
this.handleDragOver = (ev, node) => {
|
|
76
|
+
ev.preventDefault();
|
|
77
|
+
if (!enableReordering)
|
|
78
|
+
return;
|
|
79
|
+
// attrs.enableLogging && console.log(`on dragover`, ev.dataTransfer?.getData(DATA_TRANSFER_TYPE), "over", item.data);
|
|
80
|
+
// ev.target;
|
|
81
|
+
// ev.x;
|
|
82
|
+
const overDiv = ev.currentTarget;
|
|
83
|
+
const targetRect = overDiv.getBoundingClientRect();
|
|
84
|
+
const topToMouse = ev.clientY - targetRect.top;
|
|
85
|
+
const isAbove = topToMouse < (targetRect.height - topToMouse);
|
|
86
|
+
this.isTargettingAbove = isAbove;
|
|
87
|
+
this.isReorderingOver = true;
|
|
88
|
+
// attrs.reorderover?.(overDiv, ev.clientY);
|
|
89
|
+
};
|
|
90
|
+
this.handleDrag = (ev, node) => {
|
|
91
|
+
// attrs.enableLogging && console.log(`on drag`, item.data);
|
|
92
|
+
};
|
|
93
|
+
this.handleDragLeave = (ev, node) => {
|
|
94
|
+
this.isReorderingOver = false;
|
|
95
|
+
};
|
|
96
|
+
this.handleDrop = (ev, node) => {
|
|
97
|
+
var _a;
|
|
98
|
+
ev.preventDefault();
|
|
99
|
+
if (!enableReordering)
|
|
100
|
+
return;
|
|
101
|
+
if (ev.dataTransfer) {
|
|
102
|
+
ev.dataTransfer.dropEffect = "move";
|
|
103
|
+
const movedNodeData = JSON.parse(ev.dataTransfer.getData(DATA_TRANSFER_TYPE));
|
|
104
|
+
attrs.enableLogging && console.log(`on drop`, movedNodeData, "on", node.data);
|
|
105
|
+
// attrs.reorderfinish?.();
|
|
106
|
+
const droppedOnSelf = compareObjects(movedNodeData, node.data);
|
|
107
|
+
if (!droppedOnSelf) {
|
|
108
|
+
(_a = attrs.onreorder) === null || _a === void 0 ? void 0 : _a.call(attrs, { moved: movedNodeData, target: node.data, above: this.isTargettingAbove });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
this.isReorderingOver = false;
|
|
112
|
+
};
|
|
113
|
+
this.handleDragEnd = (ev, node) => {
|
|
114
|
+
var _a;
|
|
115
|
+
attrs.enableLogging && console.log(`drag end, dropEffect:`, (_a = ev.dataTransfer) === null || _a === void 0 ? void 0 : _a.dropEffect);
|
|
116
|
+
// "move" on success, "none" on failure/cancellation
|
|
117
|
+
// attrs.reorderfinish?.();
|
|
118
|
+
this.isReorderingOver = false;
|
|
119
|
+
};
|
|
120
|
+
},
|
|
121
|
+
view({ attrs }) {
|
|
122
|
+
const { node, enableToggling, enableReordering, emptyChildrenMessage } = attrs;
|
|
123
|
+
const canHaveChildren = node.children !== undefined;
|
|
124
|
+
const hasChildren = node.children !== undefined && (node.children.length > 0);
|
|
125
|
+
const expanded = canHaveChildren && node.expanded;
|
|
126
|
+
const collapsed = canHaveChildren && !node.expanded;
|
|
127
|
+
const targettingDragClass = this.isReorderingOver ? (this.isTargettingAbove ? "mico-tree-reorder-above" : "mico-tree-reorder-below") : "";
|
|
128
|
+
return m("li.mico-tree-node", {
|
|
129
|
+
// key: item.key,
|
|
130
|
+
}, [
|
|
131
|
+
// The items's label (either a string or Vnode) and expand/collapse control (if there are children)
|
|
132
|
+
m("", {
|
|
133
|
+
style: `display: flex; align-items: stretch; max-width: 100%; overflow-x: hidden; ${(attrs.toggleExpansionWithLabel && enableToggling) ? `cursor: pointer;` : ``}`,
|
|
134
|
+
}, [
|
|
135
|
+
expanded ? m("button.mico-tree-toggle", {
|
|
136
|
+
style: `width: ${attrs.toggleButtonWidth}; flex: none;`,
|
|
137
|
+
// class: enableToggling ? `hover:text-primary` : `text-view-icon`,
|
|
138
|
+
disabled: !enableToggling,
|
|
139
|
+
onclick: (ev) => {
|
|
140
|
+
var _a;
|
|
141
|
+
if (!enableToggling)
|
|
142
|
+
return;
|
|
143
|
+
node.expanded = false;
|
|
144
|
+
(_a = attrs.ontoggle) === null || _a === void 0 ? void 0 : _a.call(attrs, { node, expanded: false, recursive: ev.altKey });
|
|
145
|
+
},
|
|
146
|
+
}, attrs.expandedIcon || m(Icon, { fas: "chevron-down" })) : undefined,
|
|
147
|
+
collapsed ? m("button.mico-tree-toggle", {
|
|
148
|
+
style: `width: ${attrs.toggleButtonWidth}; flex: none;`,
|
|
149
|
+
// class: enableToggling ? `hover:text-primary` : `text-view-icon`,
|
|
150
|
+
disabled: !enableToggling,
|
|
151
|
+
onclick: (ev) => {
|
|
152
|
+
var _a;
|
|
153
|
+
if (!enableToggling)
|
|
154
|
+
return;
|
|
155
|
+
node.expanded = true;
|
|
156
|
+
(_a = attrs.ontoggle) === null || _a === void 0 ? void 0 : _a.call(attrs, { node, expanded: true, recursive: ev.altKey });
|
|
157
|
+
},
|
|
158
|
+
}, attrs.collapsedIcon || m(Icon, { fas: "chevron-right" })) : undefined,
|
|
159
|
+
(!canHaveChildren) ? m(".mico-tree-toggle", {
|
|
160
|
+
style: `width: ${attrs.toggleButtonWidth}; flex: none;`,
|
|
161
|
+
}, attrs.noToggleIcon || m(Icon, { fas: "caret-right" })) : [],
|
|
162
|
+
m(".mico-tree-label", {
|
|
163
|
+
class: `${targettingDragClass}`,
|
|
164
|
+
style: "position: relative; flex: 1 1 0%; overflow-x: hidden;",
|
|
165
|
+
draggable: enableReordering && (node.draggable !== false),
|
|
166
|
+
onclick: (ev) => {
|
|
167
|
+
var _a;
|
|
168
|
+
this.handleClick(ev, node);
|
|
169
|
+
// If labels should toggle expansion, toggle expansion
|
|
170
|
+
if (attrs.toggleExpansionWithLabel && enableToggling) {
|
|
171
|
+
node.expanded = !expanded;
|
|
172
|
+
(_a = attrs.ontoggle) === null || _a === void 0 ? void 0 : _a.call(attrs, { node, expanded: !expanded, recursive: ev.altKey });
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
ondragstart: (ev) => this.handleDragStart(ev, node),
|
|
176
|
+
ondrag: (ev) => this.handleDrag(ev, node),
|
|
177
|
+
ondragover: (ev) => this.handleDragOver(ev, node),
|
|
178
|
+
ondragleave: (ev) => this.handleDragLeave(ev, node),
|
|
179
|
+
ondrop: (ev) => this.handleDrop(ev, node),
|
|
180
|
+
ondragend: (ev) => this.handleDragEnd(ev, node),
|
|
181
|
+
}, [
|
|
182
|
+
(typeof node.label === "string")
|
|
183
|
+
? m("span", node.label)
|
|
184
|
+
: node.label,
|
|
185
|
+
]),
|
|
186
|
+
]),
|
|
187
|
+
// Any nested children within the item
|
|
188
|
+
(expanded) ? m("ul", {
|
|
189
|
+
style: `margin-left: ${attrs.nestingWidth};`,
|
|
190
|
+
}, [
|
|
191
|
+
...(node.children || []).map((child, i) => {
|
|
192
|
+
return m(TreeNode, {
|
|
193
|
+
// key: child.key,
|
|
194
|
+
node: child,
|
|
195
|
+
enableToggling: attrs.enableToggling,
|
|
196
|
+
enableReordering: attrs.enableReordering,
|
|
197
|
+
ontoggle: attrs.ontoggle,
|
|
198
|
+
onclick: attrs.onclick,
|
|
199
|
+
onreorder: attrs.onreorder,
|
|
200
|
+
// reorderstart: attrs.reorderstart,
|
|
201
|
+
// reorderover: attrs.reorderover,
|
|
202
|
+
// reorderfinish: attrs.reorderfinish,
|
|
203
|
+
emptyChildrenMessage: attrs.emptyChildrenMessage,
|
|
204
|
+
collapsedIcon: attrs.collapsedIcon,
|
|
205
|
+
expandedIcon: attrs.expandedIcon,
|
|
206
|
+
noToggleIcon: attrs.noToggleIcon,
|
|
207
|
+
toggleExpansionWithLabel: attrs.toggleExpansionWithLabel,
|
|
208
|
+
nestingWidth: attrs.nestingWidth,
|
|
209
|
+
toggleButtonWidth: attrs.toggleButtonWidth,
|
|
210
|
+
});
|
|
211
|
+
}),
|
|
212
|
+
]) : [],
|
|
213
|
+
(canHaveChildren && !hasChildren && expanded && emptyChildrenMessage !== undefined) ? [
|
|
214
|
+
m("span.mico-tree-empty-children", {
|
|
215
|
+
style: `margin-left: ${attrs.toggleButtonWidth};`,
|
|
216
|
+
}, emptyChildrenMessage)
|
|
217
|
+
] : [],
|
|
218
|
+
]);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
return Tree;
|
|
222
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import m from "mithril";
|
|
2
|
+
export interface TreeNode<T extends object = {}> {
|
|
3
|
+
label: string | m.Vnode<any>;
|
|
4
|
+
expanded: boolean;
|
|
5
|
+
/** Optionally disable dragging where it would otherwise be enabled */
|
|
6
|
+
draggable?: boolean;
|
|
7
|
+
children?: TreeNode<T>[];
|
|
8
|
+
data: T;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TreeNode } from "./tree-node.interface";
|
|
2
|
+
/**
|
|
3
|
+
* Recursively find the list of all descendants of the given node.
|
|
4
|
+
*
|
|
5
|
+
* The given node itself is not included in the list of descendants.
|
|
6
|
+
*
|
|
7
|
+
* Performs a depth-first traversal.
|
|
8
|
+
* @param node
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
export declare function allTreeDescendants<T extends object = {}>(node: TreeNode<T>): T[];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursively find the list of all descendants of the given node.
|
|
3
|
+
*
|
|
4
|
+
* The given node itself is not included in the list of descendants.
|
|
5
|
+
*
|
|
6
|
+
* Performs a depth-first traversal.
|
|
7
|
+
* @param node
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
export function allTreeDescendants(node) {
|
|
11
|
+
var _a;
|
|
12
|
+
const descendants = [];
|
|
13
|
+
for (const child of (_a = node.children) !== null && _a !== void 0 ? _a : []) {
|
|
14
|
+
descendants.push(child.data);
|
|
15
|
+
descendants.push(...allTreeDescendants(child));
|
|
16
|
+
}
|
|
17
|
+
return descendants;
|
|
18
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type DateToHtmlResult<T extends Date | undefined | null> = T extends Date ? string : T extends undefined ? undefined : T extends null ? null : never;
|
|
2
|
+
export declare function dateToHtml<T extends Date | undefined | null>(d: T): DateToHtmlResult<T>;
|
|
3
|
+
export declare function dateToHtmlUTC<T extends Date | undefined | null>(d: T): DateToHtmlResult<T>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function dateToHtml(d) {
|
|
2
|
+
if (d === undefined)
|
|
3
|
+
return undefined;
|
|
4
|
+
if (d === null)
|
|
5
|
+
return null;
|
|
6
|
+
return [
|
|
7
|
+
String(d.getFullYear()),
|
|
8
|
+
String(d.getMonth() + 1).padStart(2, "0"),
|
|
9
|
+
String(d.getDate()).padStart(2, "0"),
|
|
10
|
+
].join("-");
|
|
11
|
+
}
|
|
12
|
+
export function dateToHtmlUTC(d) {
|
|
13
|
+
if (d === undefined)
|
|
14
|
+
return undefined;
|
|
15
|
+
if (d === null)
|
|
16
|
+
return null;
|
|
17
|
+
return [
|
|
18
|
+
String(d.getUTCFullYear()),
|
|
19
|
+
String(d.getUTCMonth() + 1).padStart(2, "0"),
|
|
20
|
+
String(d.getUTCDate()).padStart(2, "0"),
|
|
21
|
+
].join("-");
|
|
22
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param x
|
|
4
|
+
* @param y
|
|
5
|
+
* @param element
|
|
6
|
+
* @param strict
|
|
7
|
+
* @returns
|
|
8
|
+
*/
|
|
9
|
+
export declare function coordsWithinElement(x: number, y: number, element: Element, strict?: boolean): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Find whether a mouse event is within a given DOM element using clientX/Y and the bounding client rect
|
|
12
|
+
* @param ev
|
|
13
|
+
* @param element
|
|
14
|
+
* @returns
|
|
15
|
+
*/
|
|
16
|
+
export declare function mouseWithinElement(ev: MouseEvent, element: Element): boolean;
|