@humandialog/forms.svelte 0.4.44 → 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 +94 -62
- 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 +165 -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 +134 -0
- package/components/list/internal/list.element.props.svelte.d.ts +21 -0
- package/components/list/internal/list.element.summary.svelte +40 -0
- package/components/list/internal/list.element.summary.svelte.d.ts +24 -0
- package/components/list/internal/list.element.svelte +100 -173
- 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 +3 -3
- 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 +175 -37
- 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 +25 -16
- 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 +14 -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 +201 -51
- 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,43 +62,44 @@ 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
|
-
let background_class = is_compact && !icon ? "
|
|
68
|
+
let background_class = is_compact && !icon ? "" : "";
|
|
63
69
|
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)
|
|
@@ -176,22 +182,22 @@ export function show(event, hide_callback) {
|
|
|
176
182
|
dropdown_position += " transform: translate(0, -100%);";
|
|
177
183
|
}
|
|
178
184
|
is_dropdown_open = true;
|
|
179
|
-
if (
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
|
186
199
|
});
|
|
187
|
-
|
|
188
|
-
childList: true,
|
|
189
|
-
attributes: true,
|
|
190
|
-
characterData: true,
|
|
191
|
-
subtree: true
|
|
192
|
-
});
|
|
193
|
-
filtered_source = definition.source.map((e) => e);
|
|
194
|
-
highlighted_option = filtered_source.length > 0 ? filtered_source[0] : null;
|
|
200
|
+
}
|
|
195
201
|
}
|
|
196
202
|
export function hide() {
|
|
197
203
|
if (mutation_observer)
|
|
@@ -242,26 +248,29 @@ function get_combo_text() {
|
|
|
242
248
|
if (found)
|
|
243
249
|
return found.Name ?? found.Key;
|
|
244
250
|
else
|
|
245
|
-
return
|
|
251
|
+
return placeholder;
|
|
246
252
|
} else
|
|
247
253
|
return textbox.innerHTML;
|
|
248
254
|
}
|
|
249
255
|
async function on_choose(itm) {
|
|
250
256
|
hide();
|
|
251
|
-
if (
|
|
252
|
-
|
|
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);
|
|
253
262
|
tick_request_internal = tick_request_internal + 1;
|
|
254
263
|
} else {
|
|
255
|
-
if (
|
|
256
|
-
if (
|
|
264
|
+
if (isAssociation) {
|
|
265
|
+
if (choiceCallback) {
|
|
257
266
|
let body = {
|
|
258
267
|
choice: itm.Key
|
|
259
268
|
};
|
|
260
269
|
let path;
|
|
261
270
|
if (item.$ref)
|
|
262
|
-
path = `${item.$ref}/${
|
|
271
|
+
path = `${item.$ref}/${choiceCallback}`;
|
|
263
272
|
else
|
|
264
|
-
path = `${typename}/${item.Id}/${
|
|
273
|
+
path = `${typename}/${item.Id}/${choiceCallback}`;
|
|
265
274
|
let fields = calc_path_fields_param();
|
|
266
275
|
if (fields)
|
|
267
276
|
path += fields;
|
|
@@ -293,12 +302,12 @@ async function on_choose(itm) {
|
|
|
293
302
|
}
|
|
294
303
|
}
|
|
295
304
|
} else {
|
|
296
|
-
if (
|
|
305
|
+
if (choiceCallback) {
|
|
297
306
|
let path;
|
|
298
307
|
if (item.$ref)
|
|
299
|
-
path = `/${item.$ref}/${
|
|
308
|
+
path = `/${item.$ref}/${choiceCallback}`;
|
|
300
309
|
else
|
|
301
|
-
path = `/${typename}/${item.Id}/${
|
|
310
|
+
path = `/${typename}/${item.Id}/${choiceCallback}`;
|
|
302
311
|
let fields = calc_path_fields_param();
|
|
303
312
|
if (fields)
|
|
304
313
|
path += fields;
|
|
@@ -312,8 +321,9 @@ async function on_choose(itm) {
|
|
|
312
321
|
item[a] = itm.Key ?? itm.Name;
|
|
313
322
|
tick_request_internal = tick_request_internal + 1;
|
|
314
323
|
if (item && a && typename) {
|
|
315
|
-
|
|
316
|
-
|
|
324
|
+
informModification(item, a, typename);
|
|
325
|
+
if (pushChangesImmediately)
|
|
326
|
+
pushChanges();
|
|
317
327
|
}
|
|
318
328
|
}
|
|
319
329
|
}
|
|
@@ -369,13 +379,23 @@ function on_input_change() {
|
|
|
369
379
|
filtered_source = get_filtered_source();
|
|
370
380
|
highlighted_option = filtered_source.length > 0 ? filtered_source[0] : null;
|
|
371
381
|
}
|
|
382
|
+
let new_item_option;
|
|
372
383
|
function get_filtered_source() {
|
|
373
|
-
if (!textbox)
|
|
384
|
+
if (!textbox || !filtered)
|
|
374
385
|
return definition.source;
|
|
375
386
|
else if (textbox.innerHTML) {
|
|
376
|
-
|
|
387
|
+
let result = definition.source.filter((e) => {
|
|
377
388
|
return e.Name && e.Name.toLowerCase().includes(textbox.innerHTML.toLowerCase()) || e.Key && e.Key.toString().toLowerCase().includes(textbox.innerHTML.toLowerCase());
|
|
378
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;
|
|
379
399
|
} else
|
|
380
400
|
return definition.source;
|
|
381
401
|
}
|
|
@@ -478,6 +498,8 @@ function source_fetched(source) {
|
|
|
478
498
|
}
|
|
479
499
|
definition.source.push(el);
|
|
480
500
|
});
|
|
501
|
+
filtered_source = definition.source.map((e) => e);
|
|
502
|
+
highlighted_option = filtered_source.length > 0 ? filtered_source[0] : null;
|
|
481
503
|
}
|
|
482
504
|
function setup_view(...args) {
|
|
483
505
|
if (tick_request_internal <= last_tick_internal)
|
|
@@ -505,7 +527,7 @@ function on_focus_out(e) {
|
|
|
505
527
|
on:focusout={on_focus_out}
|
|
506
528
|
bind:this={root_element}>
|
|
507
529
|
{#if !is_compact}
|
|
508
|
-
<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>
|
|
509
531
|
{/if}
|
|
510
532
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
511
533
|
<div bind:this={combo}
|
|
@@ -527,23 +549,26 @@ function on_focus_out(e) {
|
|
|
527
549
|
|
|
528
550
|
|
|
529
551
|
<p bind:this={textbox}
|
|
530
|
-
class="dark:text-
|
|
552
|
+
class="dark:text-stone-300 {line_h} truncate pl-0 pr-2.5 {background_class} min-w-[2.5rem]"
|
|
531
553
|
class:ml-2={icon}
|
|
532
|
-
class:text-
|
|
533
|
-
class:text-
|
|
554
|
+
class:text-stone-400={ (!is_dropdown_open) && (!sel_item)}
|
|
555
|
+
class:text-stone-700={ is_dropdown_open || sel_item }
|
|
534
556
|
class:w-10={!combo_text}
|
|
535
|
-
contenteditable={is_dropdown_open}
|
|
536
|
-
on:keydown={on_keydown}
|
|
557
|
+
contenteditable={is_dropdown_open && filtered}
|
|
558
|
+
on:keydown={on_keydown}
|
|
559
|
+
tabindex="0">
|
|
537
560
|
{combo_text}</p>
|
|
538
561
|
</div>
|
|
539
562
|
|
|
540
|
-
{#if can_be_activated
|
|
541
|
-
<
|
|
563
|
+
{#if can_be_activated }
|
|
564
|
+
<div class="w-3 h-3 no-print flex-none text-stone-700 dark:text-stone-300 {chevron_mt}">
|
|
565
|
+
<FaChevronDown/>
|
|
566
|
+
</div>
|
|
542
567
|
{/if}
|
|
543
568
|
</div>
|
|
544
569
|
|
|
545
570
|
<div hidden={!is_dropdown_open}
|
|
546
|
-
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"
|
|
547
572
|
style={dropdown_position}
|
|
548
573
|
use:dropdown_action>
|
|
549
574
|
<ul class="py-1">
|
|
@@ -554,9 +579,9 @@ function on_focus_out(e) {
|
|
|
554
579
|
{#each _filtered_source as item (item.Key)}
|
|
555
580
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
556
581
|
<li class="rounded p-2 flex flex-row items-center {font_size}"
|
|
557
|
-
class:bg-
|
|
558
|
-
class:dark:bg-
|
|
559
|
-
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}
|
|
560
585
|
on:mousemove={() => on_mouse_move(item)}
|
|
561
586
|
on:click|preventDefault|stopPropagation={async () => await on_choose(item)}
|
|
562
587
|
tabindex="-1">
|
|
@@ -596,4 +621,11 @@ function on_focus_out(e) {
|
|
|
596
621
|
outline: 0px solid transparent;
|
|
597
622
|
}
|
|
598
623
|
|
|
624
|
+
@media print
|
|
625
|
+
{
|
|
626
|
+
.no-print, .no-print *{
|
|
627
|
+
display: none !important;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
599
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 {};
|