@humandialog/forms.svelte 0.4.18 → 0.4.20
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/checkbox.svelte +2 -2
- package/components/icon.svelte +2 -0
- package/components/inputbox.ltop.svelte +33 -7
- package/components/inputbox.ltop.svelte.d.ts +7 -1
- package/components/list/List.d.ts +4 -0
- package/components/list/List.js +4 -0
- package/components/list/internal/list.element.svelte +41 -13
- package/components/list/internal/list.inserter.svelte +2 -6
- package/components/list/internal/list.inserter.svelte.d.ts +3 -1
- package/components/list/list.summary.svelte +4 -0
- package/components/list/list.summary.svelte.d.ts +2 -0
- package/components/list/list.svelte +15 -2
- package/components/list/list.title.svelte +4 -0
- package/components/list/list.title.svelte.d.ts +2 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/modal.svelte +100 -0
- package/modal.svelte.d.ts +35 -0
- package/package.json +3 -2
|
@@ -42,13 +42,13 @@ function on_changed() {
|
|
|
42
42
|
}
|
|
43
43
|
</script>
|
|
44
44
|
|
|
45
|
-
<div class="ml-
|
|
45
|
+
<div class="ml-1 h-6 text-sm font-medium {cs} {color_style} {additional_class} flex items-center">
|
|
46
46
|
<input type="checkbox"
|
|
47
47
|
bind:checked={value}
|
|
48
48
|
on:change={on_changed}
|
|
49
49
|
{disabled}
|
|
50
50
|
class="w-4 h-4 bg-gray-100 border-gray-300 dark:ring-offset-gray-800 focus:ring-2 mr-2 dark:bg-gray-700 dark:border-gray-600 rounded text-blue-600 focus:ring-blue-500 dark:focus:ring-blue-600"/>
|
|
51
|
-
<span class="
|
|
51
|
+
<span class="ml-1">
|
|
52
52
|
<slot/>
|
|
53
53
|
</span>
|
|
54
54
|
|
package/components/icon.svelte
CHANGED
|
@@ -10,6 +10,7 @@ export let size = 5;
|
|
|
10
10
|
export let bg = "";
|
|
11
11
|
export let circle = false;
|
|
12
12
|
let additional_class = $$restProps.class ?? "";
|
|
13
|
+
let id = $$restProps.id ?? "";
|
|
13
14
|
let _bg;
|
|
14
15
|
let txt = "";
|
|
15
16
|
let symbol_html = "";
|
|
@@ -63,6 +64,7 @@ $: {
|
|
|
63
64
|
style:height={icon_size}
|
|
64
65
|
style:background-color={_bg}
|
|
65
66
|
style:border-radius={ circle ? '50%' : ''}
|
|
67
|
+
{id}
|
|
66
68
|
on:blur
|
|
67
69
|
on:click
|
|
68
70
|
on:focus
|
|
@@ -13,13 +13,26 @@
|
|
|
13
13
|
export let context = ""
|
|
14
14
|
export let itype="text"
|
|
15
15
|
export let typename = '';
|
|
16
|
+
export let invalid = false;
|
|
16
17
|
|
|
17
18
|
export let val = ''
|
|
18
19
|
|
|
19
|
-
export
|
|
20
|
+
export let placeholder = 'pl'
|
|
20
21
|
|
|
21
22
|
export let s = 'sm'
|
|
22
23
|
export let c = ''
|
|
24
|
+
export let validate_cb = undefined;
|
|
25
|
+
export function validate()
|
|
26
|
+
{
|
|
27
|
+
if(!validate_cb)
|
|
28
|
+
{
|
|
29
|
+
invalid = false;
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
invalid = !validate_cb(val);
|
|
34
|
+
return !invalid;
|
|
35
|
+
}
|
|
23
36
|
|
|
24
37
|
|
|
25
38
|
let item = null
|
|
@@ -41,6 +54,7 @@
|
|
|
41
54
|
let ctx = context ? context : getContext('ctx');
|
|
42
55
|
|
|
43
56
|
let last_tick = -1
|
|
57
|
+
let border_style = "border-gray-300 dark:border-gray-600"
|
|
44
58
|
|
|
45
59
|
$:{
|
|
46
60
|
if($data_tick_store > last_tick)
|
|
@@ -60,12 +74,13 @@
|
|
|
60
74
|
|
|
61
75
|
if(label == '')
|
|
62
76
|
label = a
|
|
77
|
+
|
|
78
|
+
|
|
63
79
|
}
|
|
64
80
|
|
|
65
|
-
|
|
66
|
-
|
|
67
81
|
function value_changed()
|
|
68
82
|
{
|
|
83
|
+
validate();
|
|
69
84
|
if(item != null)
|
|
70
85
|
{
|
|
71
86
|
item[a] = val
|
|
@@ -81,22 +96,33 @@
|
|
|
81
96
|
push_changes();
|
|
82
97
|
|
|
83
98
|
}
|
|
99
|
+
|
|
100
|
+
function check_validity()
|
|
101
|
+
{
|
|
102
|
+
if(invalid)
|
|
103
|
+
validate();
|
|
104
|
+
}
|
|
84
105
|
|
|
85
106
|
|
|
86
107
|
</script>
|
|
87
108
|
|
|
88
109
|
{#if itype == 'text'}
|
|
110
|
+
{@const border_style = invalid ? "border-red-300 dark:border-red-600" : "border-gray-300 dark:border-gray-600" }
|
|
89
111
|
<div class={cs}>
|
|
90
112
|
<label for="name" class="block {label_mb} text-xs font-small text-gray-900 dark:text-white">{label}</label>
|
|
91
113
|
|
|
92
114
|
<input type=text name="name" id="name"
|
|
93
115
|
bind:value={val}
|
|
94
116
|
on:change={()=> (value_changed())}
|
|
95
|
-
on:blur={() => { accept_change();
|
|
117
|
+
on:blur={() => { accept_change();} }
|
|
118
|
+
on:keydown={(e)=>{check_validity();}}
|
|
96
119
|
|
|
97
|
-
class="bg-gray-50
|
|
98
|
-
|
|
99
|
-
|
|
120
|
+
class=" bg-gray-50 dark:bg-gray-700
|
|
121
|
+
border {border_style} rounded-lg
|
|
122
|
+
focus:ring-primary-600 focus:border-primary-600 dark:focus:ring-primary-500 dark:focus:border-primary-500
|
|
123
|
+
text-gray-900 dark:text-white text-sm
|
|
124
|
+
block w-full {input_pb} {input_pt} px-2.5
|
|
125
|
+
dark:placeholder-gray-400"
|
|
100
126
|
|
|
101
127
|
placeholder={placeholder}>
|
|
102
128
|
</div>
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
/** @typedef {typeof __propDef.slots} InputboxSlots */
|
|
4
4
|
export default class Inputbox extends SvelteComponentTyped<{
|
|
5
5
|
[x: string]: any;
|
|
6
|
+
invalid?: boolean | undefined;
|
|
6
7
|
label?: string | undefined;
|
|
7
8
|
context?: string | undefined;
|
|
8
9
|
self?: null | undefined;
|
|
@@ -13,10 +14,12 @@ export default class Inputbox extends SvelteComponentTyped<{
|
|
|
13
14
|
placeholder?: string | undefined;
|
|
14
15
|
itype?: string | undefined;
|
|
15
16
|
val?: string | undefined;
|
|
17
|
+
validate_cb?: any;
|
|
18
|
+
validate?: (() => boolean) | undefined;
|
|
16
19
|
}, {
|
|
17
20
|
[evt: string]: CustomEvent<any>;
|
|
18
21
|
}, {}> {
|
|
19
|
-
get
|
|
22
|
+
get validate(): () => boolean;
|
|
20
23
|
}
|
|
21
24
|
export type InputboxProps = typeof __propDef.props;
|
|
22
25
|
export type InputboxEvents = typeof __propDef.events;
|
|
@@ -25,6 +28,7 @@ import { SvelteComponentTyped } from "svelte";
|
|
|
25
28
|
declare const __propDef: {
|
|
26
29
|
props: {
|
|
27
30
|
[x: string]: any;
|
|
31
|
+
invalid?: boolean | undefined;
|
|
28
32
|
label?: string | undefined;
|
|
29
33
|
context?: string | undefined;
|
|
30
34
|
self?: null | undefined;
|
|
@@ -35,6 +39,8 @@ declare const __propDef: {
|
|
|
35
39
|
placeholder?: string | undefined;
|
|
36
40
|
itype?: string | undefined;
|
|
37
41
|
val?: string | undefined;
|
|
42
|
+
validate_cb?: any;
|
|
43
|
+
validate?: (() => boolean) | undefined;
|
|
38
44
|
};
|
|
39
45
|
events: {
|
|
40
46
|
[evt: string]: CustomEvent<any>;
|
|
@@ -20,8 +20,12 @@ export declare class rList_property_combo extends rList_property {
|
|
|
20
20
|
export declare class rList_definition {
|
|
21
21
|
title: string;
|
|
22
22
|
title_editable: boolean;
|
|
23
|
+
on_title_changed: Function | undefined;
|
|
24
|
+
title_readonly: boolean;
|
|
23
25
|
summary: string;
|
|
24
26
|
summary_editable: boolean;
|
|
27
|
+
on_summary_changed: Function | undefined;
|
|
28
|
+
summary_readonly: boolean;
|
|
25
29
|
can_insert: boolean;
|
|
26
30
|
oninsert: Function | undefined;
|
|
27
31
|
properties: rList_property[];
|
package/components/list/List.js
CHANGED
|
@@ -26,8 +26,12 @@ export class rList_property_combo extends rList_property {
|
|
|
26
26
|
export class rList_definition {
|
|
27
27
|
title = '';
|
|
28
28
|
title_editable = false;
|
|
29
|
+
on_title_changed = undefined;
|
|
30
|
+
title_readonly = false;
|
|
29
31
|
summary = '';
|
|
30
32
|
summary_editable = false;
|
|
33
|
+
on_summary_changed = undefined;
|
|
34
|
+
summary_readonly = false;
|
|
31
35
|
can_insert = false;
|
|
32
36
|
oninsert = undefined;
|
|
33
37
|
properties = [];
|
|
@@ -38,6 +38,14 @@ if (!typename) {
|
|
|
38
38
|
typename = s[0];
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
+
let item_key = "";
|
|
42
|
+
let keys = Object.keys(item);
|
|
43
|
+
if (keys.includes("Id"))
|
|
44
|
+
item_key = "Id";
|
|
45
|
+
else if (keys.includes("$ref"))
|
|
46
|
+
item_key = "$ref";
|
|
47
|
+
else if (keys.length > 0)
|
|
48
|
+
item_key = keys[0];
|
|
41
49
|
if (!title)
|
|
42
50
|
title = definition.title;
|
|
43
51
|
if (!summary)
|
|
@@ -49,14 +57,22 @@ function selected(...args) {
|
|
|
49
57
|
return is_selected(item);
|
|
50
58
|
}
|
|
51
59
|
async function change_name(text) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
60
|
+
if (definition.on_title_changed) {
|
|
61
|
+
definition.on_title_changed(item, text, title);
|
|
62
|
+
} else {
|
|
63
|
+
item[title] = text;
|
|
64
|
+
inform_modification(item, title, typename);
|
|
65
|
+
push_changes();
|
|
66
|
+
}
|
|
55
67
|
}
|
|
56
68
|
async function change_summary(text) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
69
|
+
if (definition.on_summary_changed) {
|
|
70
|
+
definition.on_summary_changed(item, text, summary);
|
|
71
|
+
} else {
|
|
72
|
+
item[summary] = text;
|
|
73
|
+
inform_modification(item, summary, typename);
|
|
74
|
+
push_changes();
|
|
75
|
+
}
|
|
60
76
|
}
|
|
61
77
|
function edit(e) {
|
|
62
78
|
if (!is_row_active)
|
|
@@ -129,7 +145,9 @@ function on_combo_changed(key, name, prop) {
|
|
|
129
145
|
}
|
|
130
146
|
}
|
|
131
147
|
export function edit_property(field) {
|
|
132
|
-
if (field ==
|
|
148
|
+
if (field == title)
|
|
149
|
+
force_editing("Title");
|
|
150
|
+
else if (field == summary)
|
|
133
151
|
force_editing("Summary");
|
|
134
152
|
else {
|
|
135
153
|
let prop_idx = definition.properties.findIndex((p) => p.name == field);
|
|
@@ -147,7 +165,7 @@ export function edit_property(field) {
|
|
|
147
165
|
}
|
|
148
166
|
}
|
|
149
167
|
async function force_editing(field) {
|
|
150
|
-
let element_id = `__hd_list_ctrl_${item
|
|
168
|
+
let element_id = `__hd_list_ctrl_${item[item_key]}_${field}`;
|
|
151
169
|
let element_node = document.getElementById(element_id);
|
|
152
170
|
if (!element_node) {
|
|
153
171
|
placeholder = field;
|
|
@@ -204,11 +222,17 @@ async function edit_date(field, prop_idx) {
|
|
|
204
222
|
<div class="ml-3 w-full py-1" use:selectable={item} on:click={(e) => {activate_row(e, item)}} role="row" tabindex="0">
|
|
205
223
|
<div class="flex flex-row">
|
|
206
224
|
<p class="font-bold whitespace-nowrap overflow-clip flex-none w-1/2 sm:w-1/3">
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
on:click={edit}>
|
|
225
|
+
{#if definition.title_readonly}
|
|
226
|
+
<span id="__hd_list_ctrl_{item[item_key]}_Title" role="gridcell" tabindex="0">
|
|
210
227
|
{item[title]}
|
|
211
228
|
</span>
|
|
229
|
+
{:else}
|
|
230
|
+
<span id="__hd_list_ctrl_{item[item_key]}_Title" role="gridcell" tabindex="0"
|
|
231
|
+
use:editable={(text) => {change_name(text)}}
|
|
232
|
+
on:click={edit}>
|
|
233
|
+
{item[title]}
|
|
234
|
+
</span>
|
|
235
|
+
{/if}
|
|
212
236
|
</p>
|
|
213
237
|
|
|
214
238
|
<!--div class="flex flex-row justify-between text-xs flex-none w-1/2 sm:w-2/3"-->
|
|
@@ -248,9 +272,13 @@ async function edit_date(field, prop_idx) {
|
|
|
248
272
|
</div>
|
|
249
273
|
|
|
250
274
|
{#if summary && (item[summary] || placeholder=='Summary')}
|
|
251
|
-
{@const element_id = `__hd_list_ctrl_${item
|
|
275
|
+
{@const element_id = `__hd_list_ctrl_${item[item_key]}_Summary`}
|
|
252
276
|
<p class="text-xs text-slate-400" style="min-height: 1rem;">
|
|
253
|
-
{#if
|
|
277
|
+
{#if definition.summary_readonly}
|
|
278
|
+
<span id={element_id} role="gridcell" tabindex="0">
|
|
279
|
+
{item[summary]}
|
|
280
|
+
</span>
|
|
281
|
+
{:else if item[summary]}
|
|
254
282
|
<span id={element_id} role="gridcell" tabindex="0"
|
|
255
283
|
use:editable={(text) => {change_summary(text)}}
|
|
256
284
|
on:click={edit}>
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
<script>import { start_editing } from "../../../utils";
|
|
2
|
-
import Icon from "../../icon.svelte";
|
|
3
|
-
import { FaRegCircle } from "svelte-icons/fa";
|
|
1
|
+
<script>import { editable, start_editing } from "../../../utils";
|
|
4
2
|
export let oninsert;
|
|
5
3
|
export function run(onclose) {
|
|
6
4
|
start_editing(insertion_paragraph, onclose);
|
|
@@ -9,9 +7,7 @@ let insertion_paragraph;
|
|
|
9
7
|
</script>
|
|
10
8
|
|
|
11
9
|
<section class="flex flex-row my-0 w-full text-sm text-slate-700 dark:text-slate-400 cursor-default rounded-md border-2 border-transparent bg-gray-200 dark:bg-gray-700">
|
|
12
|
-
<
|
|
13
|
-
component={FaRegCircle}
|
|
14
|
-
class="cursor-pointer mt-1.5 ml-2 "/>
|
|
10
|
+
<slot name='left'/>
|
|
15
11
|
|
|
16
12
|
<p class="ml-3 py-1 font-bold whitespace-nowrap overflow-clip flex-none w-1/2 sm:w-1/3"
|
|
17
13
|
bind:this={insertion_paragraph}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
<script>import { getContext } from "svelte";
|
|
2
2
|
export let a;
|
|
3
3
|
export let editable = false;
|
|
4
|
+
export let on_change = void 0;
|
|
5
|
+
export let readonly = false;
|
|
4
6
|
let definition = getContext("rList-definition");
|
|
5
7
|
definition.summary = a;
|
|
6
8
|
definition.summary_editable = editable;
|
|
9
|
+
definition.on_summary_changed = on_change;
|
|
10
|
+
definition.summary_readonly = readonly;
|
|
7
11
|
</script>
|
|
@@ -25,6 +25,7 @@ const END_OF_LIST = {};
|
|
|
25
25
|
let rows = [];
|
|
26
26
|
let activate_after_dom_update = null;
|
|
27
27
|
let inserter;
|
|
28
|
+
let item_key = "";
|
|
28
29
|
clear_active_item("props");
|
|
29
30
|
let last_tick = -1;
|
|
30
31
|
$:
|
|
@@ -38,6 +39,18 @@ function setup(...args) {
|
|
|
38
39
|
items = item[a];
|
|
39
40
|
else
|
|
40
41
|
items = [];
|
|
42
|
+
if (items.length > 0) {
|
|
43
|
+
let first_element = items[0];
|
|
44
|
+
let keys = Object.keys(first_element);
|
|
45
|
+
if (keys.includes("Id"))
|
|
46
|
+
item_key = "Id";
|
|
47
|
+
else if (keys.includes("$ref"))
|
|
48
|
+
item_key = "$ref";
|
|
49
|
+
else if (keys.length > 0)
|
|
50
|
+
item_key = keys[0];
|
|
51
|
+
else
|
|
52
|
+
item_key = "";
|
|
53
|
+
}
|
|
41
54
|
if (!typename)
|
|
42
55
|
typename = $context_types_store[ctx];
|
|
43
56
|
}
|
|
@@ -121,8 +134,8 @@ export function edit(element, property_name) {
|
|
|
121
134
|
{/if}
|
|
122
135
|
|
|
123
136
|
|
|
124
|
-
{#if items && items.length > 0 }
|
|
125
|
-
{#each items as element, i (element
|
|
137
|
+
{#if items && items.length > 0 && !!item_key }
|
|
138
|
+
{#each items as element, i (element[item_key])}
|
|
126
139
|
|
|
127
140
|
<List_element item={element}
|
|
128
141
|
{toolbar_operations}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
<script>import { getContext } from "svelte";
|
|
2
2
|
export let a;
|
|
3
3
|
export let editable = false;
|
|
4
|
+
export let on_change = void 0;
|
|
5
|
+
export let readonly = false;
|
|
4
6
|
let definition = getContext("rList-definition");
|
|
5
7
|
definition.title = a;
|
|
6
8
|
definition.title_editable = editable;
|
|
9
|
+
definition.on_title_changed = on_change;
|
|
10
|
+
definition.title_readonly = readonly;
|
|
7
11
|
</script>
|
package/index.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ export { default as ListSummary } from './components/list/list.summary.svelte';
|
|
|
34
34
|
export { default as ListInserter } from './components/list/list.inserter.svelte';
|
|
35
35
|
export { default as ListDateProperty } from './components/list/list.date.svelte';
|
|
36
36
|
export { default as ListComboProperty } from './components/list/list.combo.svelte';
|
|
37
|
+
export { default as Modal } from './modal.svelte';
|
|
37
38
|
export { select_item, activate_item, clear_active_item, is_active, is_selected, get_active, editable, start_editing, selectable, handle_select } from './utils';
|
|
38
39
|
export { data_tick_store, has_selected_item, has_data_item } from "./stores";
|
|
39
40
|
export { context_toolbar_operations, page_toolbar_operations, context_items_store, context_types_store } from './stores';
|
package/index.js
CHANGED
|
@@ -40,6 +40,7 @@ export { default as ListSummary } from './components/list/list.summary.svelte';
|
|
|
40
40
|
export { default as ListInserter } from './components/list/list.inserter.svelte';
|
|
41
41
|
export { default as ListDateProperty } from './components/list/list.date.svelte';
|
|
42
42
|
export { default as ListComboProperty } from './components/list/list.combo.svelte';
|
|
43
|
+
export { default as Modal } from './modal.svelte';
|
|
43
44
|
export { select_item, activate_item, clear_active_item, is_active, is_selected, get_active, editable, start_editing, selectable, handle_select } from './utils';
|
|
44
45
|
export { data_tick_store, has_selected_item, has_data_item } from "./stores";
|
|
45
46
|
export { context_toolbar_operations, page_toolbar_operations, context_items_store, context_types_store } from './stores'; // tmp
|
package/modal.svelte
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
<script>import Icon from "./components/icon.svelte";
|
|
2
|
+
export let title = "";
|
|
3
|
+
export let open = false;
|
|
4
|
+
export let content = "";
|
|
5
|
+
export let icon = void 0;
|
|
6
|
+
export const OK = 0;
|
|
7
|
+
export const OKCancel = 1;
|
|
8
|
+
export const Custom = 2;
|
|
9
|
+
export let mode = OKCancel;
|
|
10
|
+
export let ok_caption = "OK";
|
|
11
|
+
export let cancel_caption = "Cancel";
|
|
12
|
+
export let on_ok_callback = void 0;
|
|
13
|
+
export let on_cancel_callback = void 0;
|
|
14
|
+
export function show(on_close_callback = void 0) {
|
|
15
|
+
open = true;
|
|
16
|
+
close_callback = on_close_callback;
|
|
17
|
+
}
|
|
18
|
+
let close_callback = void 0;
|
|
19
|
+
function on_ok(event) {
|
|
20
|
+
if (on_ok_callback)
|
|
21
|
+
on_ok_callback();
|
|
22
|
+
if (close_callback)
|
|
23
|
+
close_callback("OK");
|
|
24
|
+
}
|
|
25
|
+
function on_cancel(event) {
|
|
26
|
+
open = false;
|
|
27
|
+
if (on_cancel_callback)
|
|
28
|
+
on_cancel_callback();
|
|
29
|
+
if (close_callback)
|
|
30
|
+
close_callback("Cancel");
|
|
31
|
+
}
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
{#if open}
|
|
35
|
+
<div class="relative z-10" aria-labelledby="modal-title" role="dialog" aria-modal="true">
|
|
36
|
+
<!--
|
|
37
|
+
Background backdrop, show/hide based on modal state.
|
|
38
|
+
|
|
39
|
+
Entering: "ease-out duration-300"
|
|
40
|
+
From: "opacity-0"
|
|
41
|
+
To: "opacity-100"
|
|
42
|
+
Leaving: "ease-in duration-200"
|
|
43
|
+
From: "opacity-100"
|
|
44
|
+
To: "opacity-0"
|
|
45
|
+
-->
|
|
46
|
+
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"></div>
|
|
47
|
+
|
|
48
|
+
<div class="fixed inset-0 z-10 w-screen overflow-y-auto">
|
|
49
|
+
<div class="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
|
|
50
|
+
<!--
|
|
51
|
+
Modal panel, show/hide based on modal state.
|
|
52
|
+
|
|
53
|
+
Entering: "ease-out duration-300"
|
|
54
|
+
From: "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
|
|
55
|
+
To: "opacity-100 translate-y-0 sm:scale-100"
|
|
56
|
+
Leaving: "ease-in duration-200"
|
|
57
|
+
From: "opacity-100 translate-y-0 sm:scale-100"
|
|
58
|
+
To: "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
|
|
59
|
+
-->
|
|
60
|
+
<div class="relative transform overflow-hidden rounded-lg bg-white text-left shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-lg">
|
|
61
|
+
<div class="bg-white px-4 pb-4 pt-5 sm:p-6 sm:pb-4">
|
|
62
|
+
<div class="sm:flex sm:items-start">
|
|
63
|
+
<div class="mx-auto flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10">
|
|
64
|
+
{#if icon}
|
|
65
|
+
<Icon component={icon} size={6} class="text-gray-700"/>
|
|
66
|
+
{/if}
|
|
67
|
+
</div>
|
|
68
|
+
<div class="grow mt-3 text-center sm:ml-4 sm:mt-0 sm:text-left">
|
|
69
|
+
<h3 class="text-base font-semibold leading-6 text-gray-900" id="modal-title">{title}</h3>
|
|
70
|
+
<div class="mt-2">
|
|
71
|
+
{#if content}
|
|
72
|
+
<p class="text-sm text-gray-500">{content}</p>
|
|
73
|
+
{:else}
|
|
74
|
+
<slot/>
|
|
75
|
+
{/if}
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="bg-gray-50 px-4 py-3 sm:flex sm:flex-row-reverse sm:px-6">
|
|
81
|
+
{#if mode == OK}
|
|
82
|
+
<button type="button" class="inline-flex w-full justify-center rounded-md bg-blue-700 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-blue-800 sm:ml-3 sm:w-auto"
|
|
83
|
+
on:click={on_ok}>
|
|
84
|
+
{ok_caption}</button>
|
|
85
|
+
{:else if mode == OKCancel}
|
|
86
|
+
<button type="button" class="inline-flex w-full justify-center rounded-md bg-blue-700 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-blue-800 sm:ml-3 sm:w-auto"
|
|
87
|
+
on:click={on_ok}>
|
|
88
|
+
{ok_caption}</button>
|
|
89
|
+
<button type="button" class="mt-3 inline-flex w-full justify-center rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50 sm:mt-0 sm:w-auto"
|
|
90
|
+
on:click={on_cancel}>
|
|
91
|
+
{cancel_caption}</button>
|
|
92
|
+
{:else if mode == Custom}
|
|
93
|
+
<slot name="footer"/>
|
|
94
|
+
{/if}
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
{/if}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
title?: string | undefined;
|
|
5
|
+
open?: boolean | undefined;
|
|
6
|
+
content?: string | undefined;
|
|
7
|
+
icon?: undefined;
|
|
8
|
+
OK?: 0 | undefined;
|
|
9
|
+
OKCancel?: 1 | undefined;
|
|
10
|
+
Custom?: 2 | undefined;
|
|
11
|
+
mode?: number | undefined;
|
|
12
|
+
ok_caption?: string | undefined;
|
|
13
|
+
cancel_caption?: string | undefined;
|
|
14
|
+
on_ok_callback?: Function | undefined;
|
|
15
|
+
on_cancel_callback?: Function | undefined;
|
|
16
|
+
show?: ((on_close_callback?: Function | undefined) => void) | undefined;
|
|
17
|
+
};
|
|
18
|
+
events: {
|
|
19
|
+
[evt: string]: CustomEvent<any>;
|
|
20
|
+
};
|
|
21
|
+
slots: {
|
|
22
|
+
default: {};
|
|
23
|
+
footer: {};
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export type ModalProps = typeof __propDef.props;
|
|
27
|
+
export type ModalEvents = typeof __propDef.events;
|
|
28
|
+
export type ModalSlots = typeof __propDef.slots;
|
|
29
|
+
export default class Modal extends SvelteComponentTyped<ModalProps, ModalEvents, ModalSlots> {
|
|
30
|
+
get OK(): 0;
|
|
31
|
+
get OKCancel(): 1;
|
|
32
|
+
get Custom(): 2;
|
|
33
|
+
get show(): (on_close_callback?: Function | undefined) => void;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@humandialog/forms.svelte",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.20",
|
|
4
4
|
"description": "Basic Svelte UI components for Object Reef applications",
|
|
5
5
|
"devDependencies": {
|
|
6
6
|
"@playwright/test": "^1.28.1",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
},
|
|
27
27
|
"type": "module",
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@humandialog/auth.svelte": "^1.
|
|
29
|
+
"@humandialog/auth.svelte": "^1.2.0",
|
|
30
30
|
"flowbite-svelte": "^0.29.13",
|
|
31
31
|
"svelte-icons": "^2.1.0",
|
|
32
32
|
"svelte-spa-router": "^3.3.0"
|
|
@@ -102,6 +102,7 @@
|
|
|
102
102
|
".": "./index.js",
|
|
103
103
|
"./internal/configurable.content.svelte": "./internal/configurable.content.svelte",
|
|
104
104
|
"./internal/loading.svelte": "./internal/loading.svelte",
|
|
105
|
+
"./modal.svelte": "./modal.svelte",
|
|
105
106
|
"./operations.svelte": "./operations.svelte",
|
|
106
107
|
"./page.row.svelte": "./page.row.svelte",
|
|
107
108
|
"./page.svelte": "./page.svelte",
|