aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorHsieh Chin Fan <pham@topo.tw>2024-09-30 19:08:10 +0800
committerHsieh Chin Fan <pham@topo.tw>2024-10-01 11:35:11 +0800
commitd58215ba1770923c2d1b7e7fb5be845e44dc79f2 (patch)
tree048018b89361e371151e6f05867f7c901cb620ea
parentf4fe9ff6c1ce2811fe9aa0272333b4732a6ebcdc (diff)
feat: patch 27feb13, use custom HTMLElement
-rw-r--r--src/MenuItem.mjs73
1 files changed, 34 insertions, 39 deletions
diff --git a/src/MenuItem.mjs b/src/MenuItem.mjs
index 74138ec..98f3bae 100644
--- a/src/MenuItem.mjs
+++ b/src/MenuItem.mjs
@@ -1,53 +1,40 @@
1import { createGeoLink } from './dumbymap'; 1import { createGeoLink } from './dumbymap';
2import { scrollToBlock } from './dumbyUtils'; 2import { scrollToBlock } from './dumbyUtils';
3import { default as PlainModal } from 'plain-modal';
3 4
4class Item { 5class Item extends HTMLDivElement {
5 constructor({ text, innerHTML, onclick }) { 6 constructor({ text, innerHTML, onclick }) {
6 this.text = text; 7 super();
7 this.innerHTML = innerHTML; 8 this.innerHTML = innerHTML ?? text;
8 this.onclick = onclick; 9 this.onclick = onclick;
9 } 10 this.classList.add('menu-item');
10
11 get element() {
12 const element = document.createElement('div');
13 element.innerHTML = this.innerHTML ? this.innerHTML : this.text;
14 element.classList.add('menu-item');
15 element.onclick = this.onclick;
16 return element;
17 } 11 }
18} 12}
13window.customElements.define('menu-item', Item, { extends: 'div' });
19 14
20class Folder { 15class Folder extends HTMLDivElement {
21 constructor({ text, innerHTML, items }) { 16 constructor({ text, innerHTML, items }) {
22 this.text = text; 17 super();
23 this.innerHTML = innerHTML; 18 this.innerHTML = innerHTML ?? text;
19 this.classList.add('folder', 'menu-item');
24 this.items = items; 20 this.items = items;
25 this.utils; 21 this.onmouseover = () => {
26 } 22 if (this.querySelector('.sub-menu')) return;
27
28 get element() {
29 const element = document.createElement('div');
30 element.classList.add(this.className);
31 element.className = 'menu-item folder';
32 element.innerHTML = this.innerHTML;
33 element.style.cssText = 'position: relative; overflow: visible;';
34 element.onmouseover = () => {
35 if (element.querySelector('.sub-menu')) return;
36 // Prepare submenu 23 // Prepare submenu
37 this.submenu = document.createElement('div'); 24 const submenu = document.createElement('div');
38 this.submenu.className = 'sub-menu'; 25 submenu.className = 'sub-menu';
39 this.submenu.style.cssText = `position: absolute; left: 105%; top: 0px;`; 26 submenu.style.cssText = `position: absolute; left: 105%; top: 0px;`;
40 this.items.forEach(item => this.submenu.appendChild(item)); 27 this.items.forEach(item => submenu.appendChild(item));
41 28
42 // hover effect 29 // hover effect
43 element.parentElement 30 this.parentElement
44 .querySelectorAll('.sub-menu') 31 .querySelectorAll('.sub-menu')
45 .forEach(sub => sub.remove()); 32 .forEach(sub => sub.remove());
46 element.appendChild(this.submenu); 33 this.appendChild(submenu);
47 }; 34 };
48 return element;
49 } 35 }
50} 36}
37window.customElements.define('menu-folder', Folder, { extends: 'div' });
51 38
52export const pickMapItem = dumbymap => 39export const pickMapItem = dumbymap =>
53 new Folder({ 40 new Folder({
@@ -60,9 +47,9 @@ export const pickMapItem = dumbymap =>
60 map.classList.add('focus'); 47 map.classList.add('focus');
61 map.scrollIntoView({ behavior: 'smooth' }); 48 map.scrollIntoView({ behavior: 'smooth' });
62 }, 49 },
63 }).element, 50 }),
64 ), 51 ),
65 }).element; 52 });
66 53
67export const pickBlockItem = dumbymap => 54export const pickBlockItem = dumbymap =>
68 new Folder({ 55 new Folder({
@@ -79,9 +66,9 @@ export const pickBlockItem = dumbymap =>
79 block.classList.add('focus'); 66 block.classList.add('focus');
80 scrollToBlock(block); 67 scrollToBlock(block);
81 }, 68 },
82 }).element, 69 }),
83 ), 70 ),
84 }).element; 71 });
85 72
86export const pickLayoutItem = dumbymap => 73export const pickLayoutItem = dumbymap =>
87 new Folder({ 74 new Folder({
@@ -93,17 +80,17 @@ export const pickLayoutItem = dumbymap =>
93 dumbymap.container 80 dumbymap.container
94 .closest('.playground') 81 .closest('.playground')
95 .setAttribute('data-mode', 'editing'), 82 .setAttribute('data-mode', 'editing'),
96 }).element, 83 }),
97 ...dumbymap.layouts.map( 84 ...dumbymap.layouts.map(
98 layout => 85 layout =>
99 new Item({ 86 new Item({
100 text: layout.name, 87 text: layout.name,
101 onclick: () => 88 onclick: () =>
102 dumbymap.container.setAttribute('data-layout', layout.name), 89 dumbymap.container.setAttribute('data-layout', layout.name),
103 }).element, 90 }),
104 ), 91 ),
105 ], 92 ],
106 }).element; 93 });
107 94
108export class GeoLink { 95export class GeoLink {
109 constructor({ range }) { 96 constructor({ range }) {
@@ -173,3 +160,11 @@ export class Suggestion {
173 return option; 160 return option;
174 } 161 }
175} 162}
163
164export const modal = new Item({
165 text: 'Render Results',
166 onclick: () => {
167 const modal = new PlainModal();
168 modal.open();
169 },
170});