@humandialog/forms.svelte 0.4.12 → 0.4.14

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/utils.js CHANGED
@@ -1,7 +1,230 @@
1
- import { getContext } from "svelte";
1
+ import { getContext, tick } from "svelte";
2
+ import {get} from 'svelte/store'
3
+ import { context_items_store, context_toolbar_operations } from "./stores";
2
4
 
3
5
  export let icons = {symbols :null}
4
6
 
7
+ export const SCREEN_SIZES = {
8
+ sm: 640, //px @media (min-width: 640px) { ... }
9
+ md: 768, //px @media (min-width: 768px) { ... }
10
+ lg: 1024, //px @media (min-width: 1024px) { ... }
11
+ xl: 1280, //px @media (min-width: 1280px) { ... }
12
+ }
13
+
14
+ export function is_device_smaller_than(br)
15
+ {
16
+ return window.innerWidth < SCREEN_SIZES[br]
17
+ }
18
+
19
+ export function select_item(itm)
20
+ {
21
+ let data_context = get(context_items_store);
22
+ data_context['sel'] = itm;
23
+ data_context.focused = 'sel';
24
+ context_items_store.set( {...data_context} )
25
+ }
26
+
27
+ export function activate_item(context_level, itm, operations=null)
28
+ {
29
+ let data_context = get(context_items_store);
30
+ data_context['sel'] = itm; //null;
31
+ data_context[context_level] = itm;
32
+ data_context.focused = context_level;
33
+ context_items_store.set( {...data_context} )
34
+
35
+ if(operations && Array.isArray(operations))
36
+ context_toolbar_operations.set( [...operations] )
37
+ }
38
+
39
+ export function clear_active_item(context_level)
40
+ {
41
+ let data_context = get(context_items_store);
42
+ data_context[context_level] = null;
43
+ data_context.focused = context_level;
44
+ context_items_store.set( {...data_context} )
45
+
46
+ context_toolbar_operations.set( [] )
47
+ }
48
+
49
+ export function is_selected(itm)
50
+ {
51
+ let data_context = get(context_items_store);
52
+ if(!!data_context && !!data_context['sel'] && data_context['sel'] == itm)
53
+ return true;
54
+ else
55
+ return false;
56
+ }
57
+
58
+
59
+ export function is_active(context_level, itm)
60
+ {
61
+ let data_context = get(context_items_store);
62
+ if(data_context != undefined && data_context[context_level] != undefined && data_context[context_level] == itm)
63
+ return true;
64
+ else
65
+ return false;
66
+ }
67
+
68
+
69
+ export function editable(node, action)
70
+ {
71
+ const org_text = node.textContent;
72
+ const blur_listener = async (e) =>
73
+ {
74
+ await finish_editing(true);
75
+ }
76
+
77
+ const key_listener = async (e) =>
78
+ {
79
+ switch(e.key)
80
+ {
81
+ case 'Esc':
82
+ case 'Escape':
83
+ await finish_editing(true);
84
+ e.stopPropagation();
85
+ e.preventDefault();
86
+ break;
87
+
88
+ case 'Enter':
89
+ await finish_editing(false);
90
+ e.stopPropagation();
91
+ e.preventDefault();
92
+ break;
93
+ }
94
+ }
95
+
96
+ const finish_editing = async (cancel) =>
97
+ {
98
+ node.removeEventListener("blur", blur_listener);
99
+ node.removeEventListener("keydown", key_listener);
100
+ node.contentEditable = "false"
101
+
102
+ let sel = window.getSelection();
103
+ sel.removeAllRanges();
104
+
105
+ if(cancel)
106
+ {
107
+ node.innerHTML = org_text;
108
+ }
109
+ else if(action)
110
+ {
111
+ await action(node.textContent)
112
+ }
113
+
114
+ node.dispatchEvent(new Event("finish"))
115
+ node.removeEventListener("finish", (e) => {});
116
+ }
117
+
118
+ const edit_listener = async (e) =>
119
+ {
120
+ //console.log('Edit event fired:', itm, "node", node)
121
+ node.contentEditable = "true"
122
+ node.addEventListener("blur", blur_listener);
123
+ node.addEventListener("keydown", key_listener);
124
+
125
+ node.focus();
126
+
127
+ await tick();
128
+ let range = document.createRange();
129
+ range.selectNodeContents(node);
130
+ let sel = window.getSelection();
131
+ sel.removeAllRanges();
132
+ sel.addRange(range);
133
+
134
+ }
135
+
136
+ node.addEventListener("edit", edit_listener);
137
+ node.classList.add("editable")
138
+ node.classList.add("focus:outline-none")
139
+ return {
140
+ destroy() {
141
+ node.removeEventListener("edit", edit_listener)
142
+ node.classList.remove("editable")
143
+ node.contentEditable = "false"
144
+ }};
145
+ }
146
+
147
+ export function start_editing(element, finish_callback)
148
+ {
149
+ let editable_node = null;
150
+
151
+ if(element.classList.contains("editable"))
152
+ editable_node = element;
153
+ else
154
+ {
155
+ let editables = element.getElementsByClassName("editable");
156
+ if(editables && editables.length > 0)
157
+ editable_node = editables[0];
158
+ }
159
+
160
+ if(editable_node)
161
+ {
162
+ if(editable_node.contentEditable == "true")
163
+ return;
164
+
165
+ if(finish_callback)
166
+ {
167
+ editable_node.addEventListener("finish", (e) => {finish_callback()})
168
+ }
169
+
170
+ const edit_event = new Event("edit")
171
+ editable_node.dispatchEvent(edit_event)
172
+ }
173
+ }
174
+
175
+ export function selectable(node, itm)
176
+ {
177
+ const select_listener = (e) =>
178
+ {
179
+ select_item(itm);
180
+ }
181
+
182
+ node.setAttribute("selectable", "true")
183
+ node.addEventListener("select", select_listener);
184
+
185
+ return {
186
+ destroy() {
187
+ node.removeEventListener("select", select_listener)
188
+ try{
189
+ node.removeAttribute("selectable")
190
+ }
191
+ catch(err)
192
+ {
193
+ console.error(err, node);
194
+ }
195
+ }};
196
+ }
197
+
198
+ export function handle_select(e)
199
+ {
200
+ let node = e.target;
201
+ if(!node)
202
+ {
203
+ select_item(null);
204
+ return;
205
+ }
206
+
207
+ let selection_node = null;
208
+
209
+ while(!!node)
210
+ {
211
+ if(node.hasAttribute("selectable"))
212
+ {
213
+ selection_node = node;
214
+ break;
215
+ }
216
+
217
+ node = node.parentElement;
218
+ }
219
+
220
+ if(selection_node)
221
+ selection_node.dispatchEvent(new Event("select"))
222
+ else
223
+ select_item(null);
224
+ }
225
+
226
+
227
+
5
228
  export function parse_width_directive(c)
6
229
  {
7
230
  let cs = '';
@@ -76,9 +76,15 @@
76
76
 
77
77
  function show_options(e)
78
78
  {
79
- let rect = e.target.getBoundingClientRect();
80
- let x = rect.right;
81
- let y = rect.top;
79
+
80
+ let owner = e.target;
81
+ while(owner && owner.tagName != 'BUTTON')
82
+ owner = owner.parentElement
83
+
84
+ if(!owner)
85
+ return;
86
+
87
+ let rect = owner.getBoundingClientRect();
82
88
  let options = [];
83
89
 
84
90
  if(show_sign_in_out_icons)
@@ -142,7 +148,8 @@
142
148
  });
143
149
  }
144
150
 
145
- show_menu(x, y, options);
151
+ let pt = new DOMPoint(rect.right, rect.top)
152
+ show_menu(pt, options);
146
153
  }
147
154
 
148
155
  </script>