@humandialog/forms.svelte 0.4.45 → 0.5.1
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/components/Fab.svelte +60 -48
- package/components/Floating_container.svelte +5 -4
- package/components/Floating_container.svelte.d.ts +2 -2
- package/components/Grid.menu.svelte +13 -9
- package/components/Grid.menu.svelte.d.ts +2 -2
- package/components/button.svelte +4 -4
- package/components/checkbox.svelte +12 -10
- package/components/checkbox.svelte.d.ts +1 -0
- package/components/combo/combo.d.ts +1 -1
- package/components/combo/combo.js +1 -1
- package/components/combo/combo.source.svelte +2 -2
- package/components/combo/combo.source.svelte.d.ts +1 -1
- package/components/combo/combo.svelte +92 -61
- package/components/combo/combo.svelte.d.ts +7 -4
- package/components/contextmenu.svelte +20 -19
- package/components/contextmenu.svelte.d.ts +5 -5
- package/components/date.svelte +40 -25
- package/components/date.svelte.d.ts +3 -2
- package/components/delayed.spinner.svelte +2 -2
- package/components/document/internal/palette.row.svelte +3 -3
- package/components/document/internal/palette.svelte +2 -2
- package/components/document/internal/palette.svelte.d.ts +1 -1
- package/components/document/rich.edit.svelte +307 -35
- package/components/document/rich.edit.svelte.d.ts +9 -0
- package/components/edit.field.svelte +17 -15
- package/components/edit.field.svelte.d.ts +2 -1
- package/components/file.loader.svelte +6 -6
- package/components/file.loader.svelte.d.ts +10 -10
- package/components/icon.svelte +2 -2
- package/components/icon.svelte.d.ts +3 -3
- package/components/input.text.svelte +3 -3
- package/components/inputbox.ltop.svelte +19 -17
- package/components/inputbox.ltop.svelte.d.ts +4 -2
- package/components/kanban/Kanban.d.ts +23 -0
- package/components/kanban/Kanban.js +23 -0
- package/components/kanban/internal/kanban.card.svelte +158 -0
- package/components/kanban/internal/kanban.card.svelte.d.ts +35 -0
- package/components/kanban/internal/kanban.column.svelte +181 -0
- package/components/kanban/internal/kanban.column.svelte.d.ts +51 -0
- package/components/kanban/internal/kanban.inserter.svelte +24 -0
- package/components/kanban/internal/kanban.inserter.svelte.d.ts +18 -0
- package/components/kanban/internal/kanban.move.menu.svelte +146 -0
- package/components/kanban/internal/kanban.move.menu.svelte.d.ts +19 -0
- package/components/kanban/kanban.callbacks.svelte +15 -0
- package/components/kanban/kanban.callbacks.svelte.d.ts +21 -0
- package/components/kanban/kanban.column.svelte +20 -0
- package/components/kanban/kanban.column.svelte.d.ts +21 -0
- package/components/kanban/kanban.summary.svelte +5 -0
- package/components/kanban/kanban.summary.svelte.d.ts +16 -0
- package/components/kanban/kanban.svelte +156 -0
- package/components/kanban/kanban.svelte.d.ts +43 -0
- package/components/kanban/kanban.title.svelte +8 -0
- package/components/kanban/kanban.title.svelte.d.ts +17 -0
- package/components/list/List.d.ts +4 -2
- package/components/list/List.js +4 -2
- package/components/list/internal/list.element.props.svelte +7 -8
- package/components/list/internal/list.element.props.svelte.d.ts +2 -2
- package/components/list/internal/list.element.summary.svelte +4 -4
- package/components/list/internal/list.element.summary.svelte.d.ts +1 -1
- package/components/list/internal/list.element.svelte +61 -49
- package/components/list/internal/list.element.svelte.d.ts +4 -4
- package/components/list/internal/list.inserter.svelte +9 -6
- package/components/list/internal/list.inserter.svelte.d.ts +1 -1
- package/components/list/list.combo.svelte +2 -2
- package/components/list/list.combo.svelte.d.ts +1 -1
- package/components/list/list.date.svelte +2 -2
- package/components/list/list.date.svelte.d.ts +1 -1
- package/components/list/list.inserter.svelte +1 -1
- package/components/list/list.summary.svelte +2 -2
- package/components/list/list.summary.svelte.d.ts +1 -1
- package/components/list/list.svelte +173 -35
- package/components/list/list.svelte.d.ts +27 -10
- package/components/list/list.title.svelte +6 -2
- package/components/list/list.title.svelte.d.ts +3 -1
- package/components/menu.d.ts +4 -4
- package/components/menu.js +15 -13
- package/components/radio.svelte +12 -10
- package/components/radio.svelte.d.ts +1 -0
- package/components/sidebar/sidebar.group.svelte +1 -13
- package/components/sidebar/sidebar.group.svelte.d.ts +0 -4
- package/components/sidebar/sidebar.item.svelte +13 -13
- package/components/sidebar/sidebar.list.svelte +68 -0
- package/components/sidebar/sidebar.list.svelte.d.ts +33 -0
- package/components/sidebar/sidebar.svelte +1 -1
- package/components/simple.table.svelte +15 -15
- package/components/simple.table.svelte.d.ts +2 -2
- package/components/table/_template.table.svelte +17 -17
- package/components/table/_template.table.svelte.d.ts +2 -2
- package/components/table/table.svelte +31 -31
- package/components/table/table.svelte.d.ts +8 -8
- package/components/textarea.ltop.svelte +4 -4
- package/components/tile.title.svelte +6 -6
- package/desk.svelte +13 -13
- package/form.box.svelte +2 -2
- package/horizontal.toolbar.svelte +24 -15
- package/horizontal.toolbar.svelte.d.ts +2 -2
- package/index.d.ts +14 -5
- package/index.js +14 -5
- package/modal.svelte +17 -17
- package/modal.svelte.d.ts +4 -4
- package/operations.svelte +42 -27
- package/package.json +12 -1
- package/page.svelte +115 -124
- package/page.svelte.d.ts +4 -4
- package/stores.d.ts +9 -7
- package/stores.js +17 -9
- package/tenant.members.svelte +44 -44
- package/tenant.members.svelte.d.ts +10 -10
- package/tile.svelte +3 -3
- package/tiles.vertical.row.svelte +1 -1
- package/updates.d.ts +3 -3
- package/updates.js +35 -3
- package/utils.d.ts +22 -13
- package/utils.js +198 -50
- package/vertical.toolbar.svelte +22 -13
- package/vertical.toolbar.svelte.d.ts +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
<script>import { data_tick_store,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
<script>import { data_tick_store, contextItemsStore, contextTypesStore } from "../../stores.js";
|
|
2
|
+
import { informModification, pushChanges } from "../../updates.js";
|
|
3
|
+
import { parseWidthDirective, shouldBeComapact } from "../../utils.js";
|
|
4
4
|
import { afterUpdate, getContext, onMount, setContext } from "svelte";
|
|
5
5
|
import { rCombo_definition, rCombo_item, cached_sources } from "./combo";
|
|
6
6
|
import FaChevronDown from "svelte-icons/fa/FaChevronDown.svelte";
|
|
@@ -9,20 +9,23 @@ import { reef } from "@humandialog/auth.svelte/dist/index.js";
|
|
|
9
9
|
export let label = "";
|
|
10
10
|
export let self = null;
|
|
11
11
|
export let a = "";
|
|
12
|
-
export let
|
|
12
|
+
export let isAssociation = false;
|
|
13
13
|
export let context = "";
|
|
14
14
|
export let typename = "";
|
|
15
|
-
export let
|
|
16
|
-
export let
|
|
15
|
+
export let choiceCallback = "";
|
|
16
|
+
export let onSelect = void 0;
|
|
17
17
|
export let definition = null;
|
|
18
18
|
export let changed = void 0;
|
|
19
|
+
export let onNewItemCreated = void 0;
|
|
19
20
|
export let icon = false;
|
|
20
|
-
export let placeholder = "
|
|
21
|
+
export let placeholder = "";
|
|
21
22
|
export let s = "sm";
|
|
22
23
|
export let c = "";
|
|
23
24
|
export let compact = false;
|
|
24
|
-
export let
|
|
25
|
+
export let inContext = "sel";
|
|
25
26
|
export let cached = false;
|
|
27
|
+
export let filtered = false;
|
|
28
|
+
export let pushChangesImmediately = true;
|
|
26
29
|
let is_compact = getContext("rIs-table-component") || compact;
|
|
27
30
|
if (!definition) {
|
|
28
31
|
definition = new rCombo_definition();
|
|
@@ -41,8 +44,9 @@ let root_element;
|
|
|
41
44
|
let label_mb = "mb-1";
|
|
42
45
|
let input_pt = "pt-0.5";
|
|
43
46
|
let input_pb = "pb-1";
|
|
44
|
-
let font_size = "text-sm";
|
|
47
|
+
let font_size = "text-lg sm:text-sm";
|
|
45
48
|
let line_h = "h-5";
|
|
49
|
+
let chevron_mt = "mt-2 sm:mt-0";
|
|
46
50
|
switch (s) {
|
|
47
51
|
case "md":
|
|
48
52
|
label_mb = "mb-2";
|
|
@@ -50,6 +54,7 @@ switch (s) {
|
|
|
50
54
|
input_pb = "pb-2.5";
|
|
51
55
|
font_size = "text-lg sm:text-sm";
|
|
52
56
|
line_h = "h-7 sm:h-5";
|
|
57
|
+
chevron_mt = "mt-2 sm:mt-1";
|
|
53
58
|
break;
|
|
54
59
|
case "xs":
|
|
55
60
|
label_mb = "mb-0.5";
|
|
@@ -57,6 +62,7 @@ switch (s) {
|
|
|
57
62
|
input_pb = "pb-0.5";
|
|
58
63
|
font_size = "text-base sm:text-xs";
|
|
59
64
|
line_h = "h-6 sm:h-4";
|
|
65
|
+
chevron_mt = "";
|
|
60
66
|
break;
|
|
61
67
|
}
|
|
62
68
|
let background_class = is_compact && !icon ? "" : "";
|
|
@@ -64,36 +70,36 @@ let appearance_class;
|
|
|
64
70
|
if (is_compact)
|
|
65
71
|
appearance_class = `${font_size}`;
|
|
66
72
|
else
|
|
67
|
-
appearance_class = ` bg-
|
|
68
|
-
focus:ring-primary-600 focus:border-primary-600 block w-full ${input_pb} ${input_pt} px-2.5 dark:bg-
|
|
69
|
-
dark:border-
|
|
70
|
-
let cs = c ?
|
|
73
|
+
appearance_class = ` bg-stone-50 border border-stone-300 text-stone-900 ${font_size} rounded-lg
|
|
74
|
+
focus:ring-primary-600 focus:border-primary-600 block w-full ${input_pb} ${input_pt} px-2.5 dark:bg-stone-700
|
|
75
|
+
dark:border-stone-600 dark:placeholder-stone-400 dark:text-white dark:focus:ring-primary-500 dark:focus:border-primary-500`;
|
|
76
|
+
let cs = c ? parseWidthDirective(c) : "col-span-1";
|
|
71
77
|
let ctx = context ? context : getContext("ctx");
|
|
72
78
|
let can_be_activated = true;
|
|
73
79
|
let last_tick = -1;
|
|
74
80
|
$:
|
|
75
|
-
setup($data_tick_store, $
|
|
81
|
+
setup($data_tick_store, $contextItemsStore);
|
|
76
82
|
function setup(...args) {
|
|
77
83
|
last_tick = $data_tick_store;
|
|
78
|
-
item = self ?? $
|
|
84
|
+
item = self ?? $contextItemsStore[ctx];
|
|
79
85
|
if (!typename)
|
|
80
|
-
typename = $
|
|
86
|
+
typename = $contextTypesStore[ctx];
|
|
81
87
|
if (!label)
|
|
82
88
|
label = a;
|
|
83
89
|
tick_request_internal = tick_request_internal + 1;
|
|
84
90
|
if (is_compact) {
|
|
85
91
|
can_be_activated = false;
|
|
86
|
-
let contexts =
|
|
92
|
+
let contexts = inContext.split(" ");
|
|
87
93
|
contexts.forEach((ctx2) => {
|
|
88
|
-
if ($
|
|
94
|
+
if ($contextItemsStore[ctx2] == item)
|
|
89
95
|
can_be_activated = true;
|
|
90
96
|
});
|
|
91
97
|
} else
|
|
92
98
|
can_be_activated = true;
|
|
93
99
|
}
|
|
94
100
|
onMount(() => {
|
|
95
|
-
if (definition.
|
|
96
|
-
definition.
|
|
101
|
+
if (definition.onCollect)
|
|
102
|
+
definition.onCollect().then((source) => source_fetched(source));
|
|
97
103
|
else if (definition.collection_expr)
|
|
98
104
|
fetch_source_from_association().then((source) => source_fetched(source));
|
|
99
105
|
else if (definition.collection_path)
|
|
@@ -175,24 +181,23 @@ export function show(event, hide_callback) {
|
|
|
175
181
|
if (show_above)
|
|
176
182
|
dropdown_position += " transform: translate(0, -100%);";
|
|
177
183
|
}
|
|
178
|
-
console.log("combo show pos", dropdown_position, "rect", rect, "client_rect", client_rect, "combo", combo);
|
|
179
184
|
is_dropdown_open = true;
|
|
180
|
-
if (
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
185
|
+
if (filtered) {
|
|
186
|
+
if (!textbox)
|
|
187
|
+
return;
|
|
188
|
+
textbox.innerHTML = "";
|
|
189
|
+
tick_request_internal = tick_request_internal + 1;
|
|
190
|
+
if (!mutation_observer)
|
|
191
|
+
mutation_observer = new MutationObserver(() => {
|
|
192
|
+
on_input_change();
|
|
193
|
+
});
|
|
194
|
+
mutation_observer.observe(textbox, {
|
|
195
|
+
childList: true,
|
|
196
|
+
attributes: true,
|
|
197
|
+
characterData: true,
|
|
198
|
+
subtree: true
|
|
187
199
|
});
|
|
188
|
-
|
|
189
|
-
childList: true,
|
|
190
|
-
attributes: true,
|
|
191
|
-
characterData: true,
|
|
192
|
-
subtree: true
|
|
193
|
-
});
|
|
194
|
-
filtered_source = definition.source.map((e) => e);
|
|
195
|
-
highlighted_option = filtered_source.length > 0 ? filtered_source[0] : null;
|
|
200
|
+
}
|
|
196
201
|
}
|
|
197
202
|
export function hide() {
|
|
198
203
|
if (mutation_observer)
|
|
@@ -243,26 +248,29 @@ function get_combo_text() {
|
|
|
243
248
|
if (found)
|
|
244
249
|
return found.Name ?? found.Key;
|
|
245
250
|
else
|
|
246
|
-
return
|
|
251
|
+
return placeholder;
|
|
247
252
|
} else
|
|
248
253
|
return textbox.innerHTML;
|
|
249
254
|
}
|
|
250
255
|
async function on_choose(itm) {
|
|
251
256
|
hide();
|
|
252
|
-
if (
|
|
253
|
-
|
|
257
|
+
if (onSelect) {
|
|
258
|
+
if (itm == new_item_option)
|
|
259
|
+
await onNewItemCreated(itm.Key, itm.Name);
|
|
260
|
+
else
|
|
261
|
+
await onSelect(item, itm.Key, itm.Name);
|
|
254
262
|
tick_request_internal = tick_request_internal + 1;
|
|
255
263
|
} else {
|
|
256
|
-
if (
|
|
257
|
-
if (
|
|
264
|
+
if (isAssociation) {
|
|
265
|
+
if (choiceCallback) {
|
|
258
266
|
let body = {
|
|
259
267
|
choice: itm.Key
|
|
260
268
|
};
|
|
261
269
|
let path;
|
|
262
270
|
if (item.$ref)
|
|
263
|
-
path = `${item.$ref}/${
|
|
271
|
+
path = `${item.$ref}/${choiceCallback}`;
|
|
264
272
|
else
|
|
265
|
-
path = `${typename}/${item.Id}/${
|
|
273
|
+
path = `${typename}/${item.Id}/${choiceCallback}`;
|
|
266
274
|
let fields = calc_path_fields_param();
|
|
267
275
|
if (fields)
|
|
268
276
|
path += fields;
|
|
@@ -294,12 +302,12 @@ async function on_choose(itm) {
|
|
|
294
302
|
}
|
|
295
303
|
}
|
|
296
304
|
} else {
|
|
297
|
-
if (
|
|
305
|
+
if (choiceCallback) {
|
|
298
306
|
let path;
|
|
299
307
|
if (item.$ref)
|
|
300
|
-
path = `/${item.$ref}/${
|
|
308
|
+
path = `/${item.$ref}/${choiceCallback}`;
|
|
301
309
|
else
|
|
302
|
-
path = `/${typename}/${item.Id}/${
|
|
310
|
+
path = `/${typename}/${item.Id}/${choiceCallback}`;
|
|
303
311
|
let fields = calc_path_fields_param();
|
|
304
312
|
if (fields)
|
|
305
313
|
path += fields;
|
|
@@ -313,8 +321,9 @@ async function on_choose(itm) {
|
|
|
313
321
|
item[a] = itm.Key ?? itm.Name;
|
|
314
322
|
tick_request_internal = tick_request_internal + 1;
|
|
315
323
|
if (item && a && typename) {
|
|
316
|
-
|
|
317
|
-
|
|
324
|
+
informModification(item, a, typename);
|
|
325
|
+
if (pushChangesImmediately)
|
|
326
|
+
pushChanges();
|
|
318
327
|
}
|
|
319
328
|
}
|
|
320
329
|
}
|
|
@@ -370,13 +379,23 @@ function on_input_change() {
|
|
|
370
379
|
filtered_source = get_filtered_source();
|
|
371
380
|
highlighted_option = filtered_source.length > 0 ? filtered_source[0] : null;
|
|
372
381
|
}
|
|
382
|
+
let new_item_option;
|
|
373
383
|
function get_filtered_source() {
|
|
374
|
-
if (!textbox)
|
|
384
|
+
if (!textbox || !filtered)
|
|
375
385
|
return definition.source;
|
|
376
386
|
else if (textbox.innerHTML) {
|
|
377
|
-
|
|
387
|
+
let result = definition.source.filter((e) => {
|
|
378
388
|
return e.Name && e.Name.toLowerCase().includes(textbox.innerHTML.toLowerCase()) || e.Key && e.Key.toString().toLowerCase().includes(textbox.innerHTML.toLowerCase());
|
|
379
389
|
});
|
|
390
|
+
if (onNewItemCreated) {
|
|
391
|
+
if (!new_item_option)
|
|
392
|
+
new_item_option = new rCombo_item();
|
|
393
|
+
let new_name = textbox.innerHTML;
|
|
394
|
+
new_item_option.Key = new_name;
|
|
395
|
+
new_item_option.Name = `Create '${new_name}'`;
|
|
396
|
+
result = [new_item_option, ...result];
|
|
397
|
+
}
|
|
398
|
+
return result;
|
|
380
399
|
} else
|
|
381
400
|
return definition.source;
|
|
382
401
|
}
|
|
@@ -479,6 +498,8 @@ function source_fetched(source) {
|
|
|
479
498
|
}
|
|
480
499
|
definition.source.push(el);
|
|
481
500
|
});
|
|
501
|
+
filtered_source = definition.source.map((e) => e);
|
|
502
|
+
highlighted_option = filtered_source.length > 0 ? filtered_source[0] : null;
|
|
482
503
|
}
|
|
483
504
|
function setup_view(...args) {
|
|
484
505
|
if (tick_request_internal <= last_tick_internal)
|
|
@@ -506,7 +527,7 @@ function on_focus_out(e) {
|
|
|
506
527
|
on:focusout={on_focus_out}
|
|
507
528
|
bind:this={root_element}>
|
|
508
529
|
{#if !is_compact}
|
|
509
|
-
<label for="name" class="block {label_mb} text-xs font-small text-
|
|
530
|
+
<label for="name" class="block {label_mb} text-xs font-small text-stone-900 dark:text-white">{label}</label>
|
|
510
531
|
{/if}
|
|
511
532
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
512
533
|
<div bind:this={combo}
|
|
@@ -528,23 +549,26 @@ function on_focus_out(e) {
|
|
|
528
549
|
|
|
529
550
|
|
|
530
551
|
<p bind:this={textbox}
|
|
531
|
-
class="dark:text-
|
|
552
|
+
class="dark:text-stone-300 {line_h} truncate pl-0 pr-2.5 {background_class} min-w-[2.5rem]"
|
|
532
553
|
class:ml-2={icon}
|
|
533
|
-
class:text-
|
|
534
|
-
class:text-
|
|
554
|
+
class:text-stone-400={ (!is_dropdown_open) && (!sel_item)}
|
|
555
|
+
class:text-stone-700={ is_dropdown_open || sel_item }
|
|
535
556
|
class:w-10={!combo_text}
|
|
536
|
-
contenteditable={is_dropdown_open}
|
|
537
|
-
on:keydown={on_keydown}
|
|
557
|
+
contenteditable={is_dropdown_open && filtered}
|
|
558
|
+
on:keydown={on_keydown}
|
|
559
|
+
tabindex="0">
|
|
538
560
|
{combo_text}</p>
|
|
539
561
|
</div>
|
|
540
562
|
|
|
541
563
|
{#if can_be_activated }
|
|
542
|
-
<
|
|
564
|
+
<div class="w-3 h-3 no-print flex-none text-stone-700 dark:text-stone-300 {chevron_mt}">
|
|
565
|
+
<FaChevronDown/>
|
|
566
|
+
</div>
|
|
543
567
|
{/if}
|
|
544
568
|
</div>
|
|
545
569
|
|
|
546
570
|
<div hidden={!is_dropdown_open}
|
|
547
|
-
class="{cs} bg-white dark:bg-
|
|
571
|
+
class="{cs} bg-white dark:bg-stone-800 text-stone-500 dark:text-stone-400 rounded-lg border border-stone-200 dark:border-stone-700 shadow-md overflow-y-auto cursor-pointer z-30"
|
|
548
572
|
style={dropdown_position}
|
|
549
573
|
use:dropdown_action>
|
|
550
574
|
<ul class="py-1">
|
|
@@ -555,9 +579,9 @@ function on_focus_out(e) {
|
|
|
555
579
|
{#each _filtered_source as item (item.Key)}
|
|
556
580
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
557
581
|
<li class="rounded p-2 flex flex-row items-center {font_size}"
|
|
558
|
-
class:bg-
|
|
559
|
-
class:dark:bg-
|
|
560
|
-
class:dark:hover:bg-
|
|
582
|
+
class:bg-stone-100={highlighted_option == item}
|
|
583
|
+
class:dark:bg-stone-700={highlighted_option == item}
|
|
584
|
+
class:dark:hover:bg-stone-700={highlighted_option == item}
|
|
561
585
|
on:mousemove={() => on_mouse_move(item)}
|
|
562
586
|
on:click|preventDefault|stopPropagation={async () => await on_choose(item)}
|
|
563
587
|
tabindex="-1">
|
|
@@ -597,4 +621,11 @@ function on_focus_out(e) {
|
|
|
597
621
|
outline: 0px solid transparent;
|
|
598
622
|
}
|
|
599
623
|
|
|
624
|
+
@media print
|
|
625
|
+
{
|
|
626
|
+
.no-print, .no-print *{
|
|
627
|
+
display: none !important;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
600
631
|
</style>
|
|
@@ -5,20 +5,23 @@ declare const __propDef: {
|
|
|
5
5
|
label?: string | undefined;
|
|
6
6
|
self?: null | undefined;
|
|
7
7
|
a?: string | undefined;
|
|
8
|
-
|
|
8
|
+
isAssociation?: boolean | undefined;
|
|
9
9
|
context?: string | undefined;
|
|
10
10
|
typename?: string | undefined;
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
choiceCallback?: string | undefined;
|
|
12
|
+
onSelect?: undefined;
|
|
13
13
|
definition?: rCombo_definition | null | undefined;
|
|
14
14
|
changed?: undefined;
|
|
15
|
+
onNewItemCreated?: undefined;
|
|
15
16
|
icon?: boolean | undefined;
|
|
16
17
|
placeholder?: string | undefined;
|
|
17
18
|
s?: string | undefined;
|
|
18
19
|
c?: string | undefined;
|
|
19
20
|
compact?: boolean | undefined;
|
|
20
|
-
|
|
21
|
+
inContext?: string | undefined;
|
|
21
22
|
cached?: boolean | undefined;
|
|
23
|
+
filtered?: boolean | undefined;
|
|
24
|
+
pushChangesImmediately?: boolean | undefined;
|
|
22
25
|
show?: ((event: any, hide_callback: any) => void) | undefined;
|
|
23
26
|
hide?: (() => void) | undefined;
|
|
24
27
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script>import { afterUpdate, tick } from "svelte";
|
|
2
2
|
import Icon from "./icon.svelte";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
export let
|
|
3
|
+
import { contextItemsStore } from "../stores";
|
|
4
|
+
import { isDeviceSmallerThan } from "../utils";
|
|
5
|
+
import { hideWholeContextMenu } from "./menu";
|
|
6
|
+
export let widthPx = 400;
|
|
7
7
|
export let menu_items_id_prefix = "__hd_svelte_menuitem_";
|
|
8
8
|
export let owner_menu_item = void 0;
|
|
9
9
|
let x = 0;
|
|
@@ -22,7 +22,8 @@ afterUpdate(() => {
|
|
|
22
22
|
let rect = menu_root.getBoundingClientRect();
|
|
23
23
|
if (rect.height == 0)
|
|
24
24
|
return;
|
|
25
|
-
|
|
25
|
+
const m = 15;
|
|
26
|
+
let container_rect = new DOMRect(m, 0, window.innerWidth - 2 * m, window.innerHeight);
|
|
26
27
|
if (rect.right > container_rect.right)
|
|
27
28
|
x = container_rect.right - rect.width;
|
|
28
29
|
if (rect.bottom > container_rect.bottom)
|
|
@@ -56,7 +57,7 @@ export async function show(around, _operations) {
|
|
|
56
57
|
if (menu_items.length)
|
|
57
58
|
focus_menu_item(focused_index);
|
|
58
59
|
}
|
|
59
|
-
export function
|
|
60
|
+
export function isVisible() {
|
|
60
61
|
return visible;
|
|
61
62
|
}
|
|
62
63
|
export function hide() {
|
|
@@ -64,7 +65,7 @@ export function hide() {
|
|
|
64
65
|
window.removeEventListener("click", on_before_window_click, true);
|
|
65
66
|
menu_root.removeEventListener("click", on_before_container_click, true);
|
|
66
67
|
}
|
|
67
|
-
export function
|
|
68
|
+
export function getRenderedRect() {
|
|
68
69
|
if (menu_root)
|
|
69
70
|
return menu_root.getBoundingClientRect();
|
|
70
71
|
else
|
|
@@ -87,7 +88,7 @@ function on_keydown(e, operation, index) {
|
|
|
87
88
|
switch (e.key) {
|
|
88
89
|
case "Esc":
|
|
89
90
|
case "Escape":
|
|
90
|
-
|
|
91
|
+
hideWholeContextMenu();
|
|
91
92
|
break;
|
|
92
93
|
case "ArrowDown":
|
|
93
94
|
navigate_down();
|
|
@@ -126,7 +127,7 @@ function navigate_down() {
|
|
|
126
127
|
}
|
|
127
128
|
}
|
|
128
129
|
function on_change_focus(e) {
|
|
129
|
-
if (!
|
|
130
|
+
if (!isDeviceSmallerThan("sm")) {
|
|
130
131
|
if (e.relatedTarget && e.relatedTarget.id.startsWith(menu_items_id_prefix))
|
|
131
132
|
return;
|
|
132
133
|
else
|
|
@@ -141,14 +142,14 @@ function execute_action(operation, index) {
|
|
|
141
142
|
focus_menu_item(index);
|
|
142
143
|
return;
|
|
143
144
|
}
|
|
144
|
-
|
|
145
|
+
hideWholeContextMenu();
|
|
145
146
|
if (!operation)
|
|
146
147
|
return;
|
|
147
148
|
if (!operation.action)
|
|
148
149
|
return;
|
|
149
150
|
let context_item = null;
|
|
150
|
-
if ($
|
|
151
|
-
context_item = $
|
|
151
|
+
if ($contextItemsStore.focused)
|
|
152
|
+
context_item = $contextItemsStore[$contextItemsStore.focused];
|
|
152
153
|
operation.action(context_item);
|
|
153
154
|
}
|
|
154
155
|
function focus_menu_item(index) {
|
|
@@ -162,7 +163,7 @@ function focus_menu_item(index) {
|
|
|
162
163
|
let _x = rect.right;
|
|
163
164
|
let _y = rect.top;
|
|
164
165
|
let submenu_width = min_width_px;
|
|
165
|
-
let rendered_rect = submenus[focused_index].
|
|
166
|
+
let rendered_rect = submenus[focused_index].getRenderedRect();
|
|
166
167
|
if (rendered_rect && rendered_rect.width > 0)
|
|
167
168
|
submenu_width = rendered_rect.width;
|
|
168
169
|
if (_x + submenu_width > container_rect.right) {
|
|
@@ -188,7 +189,7 @@ function hide_submenu() {
|
|
|
188
189
|
</script>
|
|
189
190
|
|
|
190
191
|
<div id="__hd_svelte_contextmenu"
|
|
191
|
-
class=" bg-white dark:bg-
|
|
192
|
+
class=" bg-white dark:bg-stone-700 text-stone-600 dark:text-stone-400 rounded-lg border border-stone-200 dark:border-stone-900 shadow-md
|
|
192
193
|
z-30 fixed min-w-[{min_width_px}px] w-max"
|
|
193
194
|
style={`left:${x}px; top:${y}px; display:${display}`}
|
|
194
195
|
bind:this={menu_root}>
|
|
@@ -196,14 +197,14 @@ function hide_submenu() {
|
|
|
196
197
|
{#each operations as operation, index}
|
|
197
198
|
{@const is_separator = operation.separator}
|
|
198
199
|
{#if is_separator}
|
|
199
|
-
<hr class="my-1 mx-0 border-1 dark:border-
|
|
200
|
+
<hr class="my-1 mx-0 border-1 dark:border-stone-900">
|
|
200
201
|
{:else}
|
|
201
|
-
{@const mobile =
|
|
202
|
+
{@const mobile = isDeviceSmallerThan("sm")}
|
|
202
203
|
{@const icon_placeholder_without_desc = mobile ? 12 : 10}
|
|
203
204
|
{@const icon_placeholder_with_desc = mobile ? 14 : 12}
|
|
204
205
|
{@const icon_placeholder_size = operation.description ? icon_placeholder_with_desc : icon_placeholder_without_desc}
|
|
205
206
|
{@const menu_item_id = menu_items_id_prefix + index}
|
|
206
|
-
{@const active = focused_index == index ? 'bg-
|
|
207
|
+
{@const active = focused_index == index ? 'bg-stone-200 dark:bg-stone-600' : ''}
|
|
207
208
|
{@const has_submenu = operation.menu !== undefined && operation.menu.length > 0}
|
|
208
209
|
|
|
209
210
|
<button class="font-medium m-0 p-2 text-lg sm:text-sm w-full text-left flex flex-row cursor-context-menu {active} focus:outline-none"
|
|
@@ -224,12 +225,12 @@ function hide_submenu() {
|
|
|
224
225
|
<p>{operation.caption}</p>
|
|
225
226
|
{#if operation.description}
|
|
226
227
|
{@const shortcut_width_px = operation.shortcut ? 80 : 0}
|
|
227
|
-
<p class="text-sm font-normal text-
|
|
228
|
+
<p class="text-sm font-normal text-stone-900 dark:text-stone-500 truncate inline-block"
|
|
228
229
|
style:max-width={`calc(${width_px-shortcut_width_px} - 3rem)`} >{operation.description}</p>
|
|
229
230
|
{/if}
|
|
230
231
|
</div>
|
|
231
232
|
{#if has_submenu}
|
|
232
|
-
<p class="ms-auto pr-1 text-sm font-mono text-
|
|
233
|
+
<p class="ms-auto pr-1 text-sm font-mono text-stone-500">→</p>
|
|
233
234
|
<svelte:self bind:this={submenus[index]} menu_items_id_prefix={`${menu_item_id}_`} owner_menu_item={menu_items[index]}/>
|
|
234
235
|
{/if}
|
|
235
236
|
</button>
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
2
|
declare const __propDef: {
|
|
3
3
|
props: {
|
|
4
|
-
|
|
4
|
+
widthPx?: number | undefined;
|
|
5
5
|
menu_items_id_prefix?: string | undefined;
|
|
6
6
|
owner_menu_item?: HTMLElement | undefined;
|
|
7
7
|
show?: ((around: DOMRect | DOMPoint, _operations: any) => Promise<void>) | undefined;
|
|
8
|
-
|
|
8
|
+
isVisible?: (() => boolean) | undefined;
|
|
9
9
|
hide?: (() => void) | undefined;
|
|
10
|
-
|
|
10
|
+
getRenderedRect?: (() => DOMRect | undefined) | undefined;
|
|
11
11
|
};
|
|
12
12
|
events: {
|
|
13
13
|
[evt: string]: CustomEvent<any>;
|
|
@@ -19,8 +19,8 @@ export type ContextmenuEvents = typeof __propDef.events;
|
|
|
19
19
|
export type ContextmenuSlots = typeof __propDef.slots;
|
|
20
20
|
export default class Contextmenu extends SvelteComponentTyped<ContextmenuProps, ContextmenuEvents, ContextmenuSlots> {
|
|
21
21
|
get show(): (around: DOMRect | DOMPoint, _operations: any) => Promise<void>;
|
|
22
|
-
get
|
|
22
|
+
get isVisible(): () => boolean;
|
|
23
23
|
get hide(): () => void;
|
|
24
|
-
get
|
|
24
|
+
get getRenderedRect(): () => DOMRect | undefined;
|
|
25
25
|
}
|
|
26
26
|
export {};
|