@marianmeres/stuic 1.85.0 → 1.87.0
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.
|
@@ -84,7 +84,6 @@ export let classesByVariant = {};
|
|
|
84
84
|
$:
|
|
85
85
|
dialog = $acp[0];
|
|
86
86
|
let _dialogEl;
|
|
87
|
-
let _formEl;
|
|
88
87
|
let value = null;
|
|
89
88
|
let isPending = false;
|
|
90
89
|
$:
|
|
@@ -105,6 +104,7 @@ const onKeyDown = (e) => {
|
|
|
105
104
|
return;
|
|
106
105
|
if (e.key === "Escape") {
|
|
107
106
|
e.stopPropagation();
|
|
107
|
+
e.stopImmediatePropagation();
|
|
108
108
|
if (!isPending)
|
|
109
109
|
return acp.escape();
|
|
110
110
|
}
|
|
@@ -158,185 +158,186 @@ $:
|
|
|
158
158
|
tabindex="-1"
|
|
159
159
|
>
|
|
160
160
|
{#if dialog}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
<div
|
|
191
|
-
class={_iconClass}
|
|
192
|
-
data-acp-type={dialog?.type}
|
|
193
|
-
data-acp-variant={dialog?.variant}
|
|
194
|
-
data-acp-is-pending={isPending}
|
|
195
|
-
>
|
|
196
|
-
{@html iconFn()}
|
|
197
|
-
</div>
|
|
198
|
-
{/if}
|
|
199
|
-
<div class={_contentBlockClass}>
|
|
200
|
-
<h1
|
|
201
|
-
class={_titleClass}
|
|
202
|
-
data-acp-type={dialog?.type}
|
|
203
|
-
data-acp-variant={dialog?.variant}
|
|
204
|
-
data-acp-is-pending={isPending}
|
|
205
|
-
>
|
|
206
|
-
<Thc thc={dialog.title} {forceAsHtml} />
|
|
207
|
-
</h1>
|
|
208
|
-
{#if dialog.content}
|
|
161
|
+
{#key dialog.id}
|
|
162
|
+
<!-- svelte-ignore a11y-autofocus -->
|
|
163
|
+
<form
|
|
164
|
+
method="dialog"
|
|
165
|
+
use:focusTrap={{ autoFocusFirst: false }}
|
|
166
|
+
tabindex="-1"
|
|
167
|
+
autofocus={dialog.type !== PROMPT}
|
|
168
|
+
data-acp-type={dialog?.type}
|
|
169
|
+
data-acp-variant={dialog?.variant}
|
|
170
|
+
data-acp-is-pending={isPending}
|
|
171
|
+
class={_dialogClass}
|
|
172
|
+
on:submit|preventDefault={async () => {
|
|
173
|
+
// clog('on:submit', value);
|
|
174
|
+
isPending = true;
|
|
175
|
+
await Promise.resolve(dialog.onOk(dialog.type === PROMPT ? value : true));
|
|
176
|
+
isPending = false;
|
|
177
|
+
value = null;
|
|
178
|
+
}}
|
|
179
|
+
on:reset|preventDefault={async () => {
|
|
180
|
+
// clog('on:reset', value);
|
|
181
|
+
isPending = true;
|
|
182
|
+
await Promise.resolve(dialog.onCancel(false));
|
|
183
|
+
isPending = false;
|
|
184
|
+
value = null;
|
|
185
|
+
}}
|
|
186
|
+
>
|
|
187
|
+
<!-- this sm:flex is not configurable -->
|
|
188
|
+
<div class="sm:flex sm:items-start">
|
|
189
|
+
{#if _isFn(iconFn)}
|
|
209
190
|
<div
|
|
210
|
-
class={
|
|
191
|
+
class={_iconClass}
|
|
211
192
|
data-acp-type={dialog?.type}
|
|
212
193
|
data-acp-variant={dialog?.variant}
|
|
213
194
|
data-acp-is-pending={isPending}
|
|
214
195
|
>
|
|
215
|
-
|
|
196
|
+
{@html iconFn()}
|
|
216
197
|
</div>
|
|
217
198
|
{/if}
|
|
218
|
-
{
|
|
219
|
-
<
|
|
220
|
-
class={
|
|
199
|
+
<div class={_contentBlockClass}>
|
|
200
|
+
<h1
|
|
201
|
+
class={_titleClass}
|
|
221
202
|
data-acp-type={dialog?.type}
|
|
222
203
|
data-acp-variant={dialog?.variant}
|
|
223
204
|
data-acp-is-pending={isPending}
|
|
224
205
|
>
|
|
225
|
-
{
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
206
|
+
<Thc thc={dialog.title} {forceAsHtml} />
|
|
207
|
+
</h1>
|
|
208
|
+
{#if dialog.content}
|
|
209
|
+
<div
|
|
210
|
+
class={_contentClass}
|
|
211
|
+
data-acp-type={dialog?.type}
|
|
212
|
+
data-acp-variant={dialog?.variant}
|
|
213
|
+
data-acp-is-pending={isPending}
|
|
214
|
+
>
|
|
215
|
+
<Thc thc={dialog.content} {forceAsHtml} />
|
|
216
|
+
</div>
|
|
217
|
+
{/if}
|
|
218
|
+
{#if dialog.type === PROMPT}
|
|
219
|
+
<div
|
|
220
|
+
class={_inputBoxClass}
|
|
221
|
+
data-acp-type={dialog?.type}
|
|
222
|
+
data-acp-variant={dialog?.variant}
|
|
223
|
+
data-acp-is-pending={isPending}
|
|
224
|
+
>
|
|
225
|
+
{#if dialog?.promptFieldProps?.options?.length}
|
|
226
|
+
<FieldSelect
|
|
227
|
+
class={_inputFieldClass}
|
|
228
|
+
bind:value
|
|
229
|
+
data-acp-type={dialog?.type}
|
|
230
|
+
data-acp-variant={dialog?.variant}
|
|
231
|
+
data-acp-is-pending={isPending}
|
|
232
|
+
autofocus
|
|
233
|
+
size="sm"
|
|
234
|
+
validate
|
|
235
|
+
{...dialog.promptFieldProps}
|
|
236
|
+
/>
|
|
237
|
+
{:else}
|
|
238
|
+
<Field
|
|
239
|
+
class={_inputFieldClass}
|
|
240
|
+
bind:value
|
|
241
|
+
data-acp-type={dialog?.type}
|
|
242
|
+
data-acp-variant={dialog?.variant}
|
|
243
|
+
data-acp-is-pending={isPending}
|
|
244
|
+
autofocus
|
|
245
|
+
size="sm"
|
|
246
|
+
validate
|
|
247
|
+
{...dialog?.promptFieldProps || {}}
|
|
248
|
+
/>
|
|
249
|
+
{/if}
|
|
250
|
+
</div>
|
|
251
|
+
{/if}
|
|
252
|
+
</div>
|
|
252
253
|
</div>
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
class={_menuLiClass}
|
|
263
|
-
data-acp-dialog-type={dialog?.type}
|
|
264
|
-
data-acp-variant={dialog?.variant}
|
|
265
|
-
data-acp-is-pending={isPending}
|
|
266
|
-
>
|
|
267
|
-
<Button
|
|
268
|
-
class={_buttonClass}
|
|
269
|
-
type="reset"
|
|
270
|
-
data-acp-button-type="cancel"
|
|
254
|
+
<menu
|
|
255
|
+
class={_menuClass}
|
|
256
|
+
data-acp-type={dialog?.type}
|
|
257
|
+
data-acp-variant={dialog?.variant}
|
|
258
|
+
data-acp-is-pending={isPending}
|
|
259
|
+
>
|
|
260
|
+
{#if dialog.type !== ALERT}
|
|
261
|
+
<li
|
|
262
|
+
class={_menuLiClass}
|
|
271
263
|
data-acp-dialog-type={dialog?.type}
|
|
272
264
|
data-acp-variant={dialog?.variant}
|
|
273
265
|
data-acp-is-pending={isPending}
|
|
274
|
-
disabled={isPending}
|
|
275
266
|
>
|
|
276
|
-
<
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
267
|
+
<Button
|
|
268
|
+
class={_buttonClass}
|
|
269
|
+
type="reset"
|
|
270
|
+
data-acp-button-type="cancel"
|
|
271
|
+
data-acp-dialog-type={dialog?.type}
|
|
272
|
+
data-acp-variant={dialog?.variant}
|
|
273
|
+
data-acp-is-pending={isPending}
|
|
274
|
+
disabled={isPending}
|
|
275
|
+
>
|
|
276
|
+
<Thc thc={dialog.labelCancel} {forceAsHtml} />
|
|
277
|
+
</Button>
|
|
278
|
+
</li>
|
|
279
|
+
{/if}
|
|
280
|
+
{#if dialog.labelCustom && _isFn(dialog.onCustom)}
|
|
281
|
+
<li
|
|
282
|
+
class={_menuLiClass}
|
|
283
|
+
data-acp-dialog-type={dialog?.type}
|
|
284
|
+
data-acp-variant={dialog?.variant}
|
|
285
|
+
data-acp-is-pending={isPending}
|
|
286
|
+
>
|
|
287
|
+
<Button
|
|
288
|
+
class={_buttonClass}
|
|
289
|
+
on:click={async (e) => {
|
|
290
|
+
e.preventDefault();
|
|
291
|
+
isPending = true;
|
|
292
|
+
await Promise.resolve(dialog.onCustom(value));
|
|
293
|
+
isPending = false;
|
|
294
|
+
value = null;
|
|
295
|
+
}}
|
|
296
|
+
type="button"
|
|
297
|
+
data-acp-button-type="custom"
|
|
298
|
+
data-acp-dialog-type={dialog?.type}
|
|
299
|
+
data-acp-variant={dialog?.variant}
|
|
300
|
+
data-acp-is-pending={isPending}
|
|
301
|
+
disabled={isPending}
|
|
302
|
+
>
|
|
303
|
+
<Thc thc={dialog.labelCustom} {forceAsHtml} />
|
|
304
|
+
</Button>
|
|
305
|
+
</li>
|
|
306
|
+
{/if}
|
|
281
307
|
<li
|
|
282
308
|
class={_menuLiClass}
|
|
283
|
-
data-acp-
|
|
309
|
+
data-acp-type={dialog?.type}
|
|
284
310
|
data-acp-variant={dialog?.variant}
|
|
285
311
|
data-acp-is-pending={isPending}
|
|
286
312
|
>
|
|
287
313
|
<Button
|
|
288
314
|
class={_buttonClass}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
await Promise.resolve(dialog.onCustom(value));
|
|
293
|
-
isPending = false;
|
|
294
|
-
value = null;
|
|
295
|
-
}}
|
|
296
|
-
type="button"
|
|
297
|
-
data-acp-button-type="custom"
|
|
315
|
+
type="submit"
|
|
316
|
+
value="OK"
|
|
317
|
+
data-acp-button-type="ok"
|
|
298
318
|
data-acp-dialog-type={dialog?.type}
|
|
299
319
|
data-acp-variant={dialog?.variant}
|
|
300
320
|
data-acp-is-pending={isPending}
|
|
301
321
|
disabled={isPending}
|
|
322
|
+
variant="primary"
|
|
302
323
|
>
|
|
303
|
-
<Thc thc={dialog.
|
|
324
|
+
<Thc thc={dialog.labelOk} {forceAsHtml} />
|
|
304
325
|
</Button>
|
|
305
326
|
</li>
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
data-acp-is-pending={isPending}
|
|
312
|
-
>
|
|
313
|
-
<Button
|
|
314
|
-
class={_buttonClass}
|
|
315
|
-
type="submit"
|
|
316
|
-
value="OK"
|
|
317
|
-
data-acp-button-type="ok"
|
|
318
|
-
data-acp-dialog-type={dialog?.type}
|
|
327
|
+
</menu>
|
|
328
|
+
{#if isPending}
|
|
329
|
+
<div
|
|
330
|
+
class={_spinnerBoxClass}
|
|
331
|
+
data-acp-type={dialog?.type}
|
|
319
332
|
data-acp-variant={dialog?.variant}
|
|
320
|
-
data-acp-is-pending={isPending}
|
|
321
|
-
disabled={isPending}
|
|
322
|
-
variant="primary"
|
|
323
333
|
>
|
|
324
|
-
<
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
</menu>
|
|
328
|
-
{#if isPending}
|
|
329
|
-
<div
|
|
330
|
-
class={_spinnerBoxClass}
|
|
331
|
-
data-acp-type={dialog?.type}
|
|
332
|
-
data-acp-variant={dialog?.variant}
|
|
333
|
-
>
|
|
334
|
-
<div class="rotating-cw">
|
|
335
|
-
{@html acpDefaultIcons.spinner()}
|
|
334
|
+
<div class="rotating-cw">
|
|
335
|
+
{@html acpDefaultIcons.spinner()}
|
|
336
|
+
</div>
|
|
336
337
|
</div>
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
338
|
+
{/if}
|
|
339
|
+
</form>
|
|
340
|
+
{/key}
|
|
340
341
|
{/if}
|
|
341
342
|
|
|
342
343
|
{#if notifications}
|
|
@@ -47,6 +47,7 @@ export declare const createAlertConfirmPromptStore: (defaults?: Partial<AlertCon
|
|
|
47
47
|
reset: (stack?: AlertConfirmPromptOptions[]) => void;
|
|
48
48
|
escape: () => void;
|
|
49
49
|
close: () => void;
|
|
50
|
+
setHeadValue: (value: string) => void;
|
|
50
51
|
alert: (o?: Partial<AlertConfirmPromptOptions> | string) => void;
|
|
51
52
|
confirm: (onOk: FnOnOK, o?: Partial<AlertConfirmPromptOptions>) => void;
|
|
52
53
|
prompt: (onOk: FnOnOK, o?: Partial<AlertConfirmPromptOptions>) => void;
|
|
@@ -39,6 +39,7 @@ export const createAlertConfirmPromptStore = (defaults) => {
|
|
|
39
39
|
if (!['info', 'success', 'warn', 'error'].includes(o?.variant)) {
|
|
40
40
|
o.variant = 'info';
|
|
41
41
|
}
|
|
42
|
+
o._id = Math.random().toString(36).slice(2);
|
|
42
43
|
//
|
|
43
44
|
_stack.update((old) => [...old, o]);
|
|
44
45
|
};
|
|
@@ -52,6 +53,15 @@ export const createAlertConfirmPromptStore = (defaults) => {
|
|
|
52
53
|
_stack.get()[0].onEscape();
|
|
53
54
|
shift();
|
|
54
55
|
};
|
|
56
|
+
// will update value of the current (at index 0) element. Relevant for prompts, when validation
|
|
57
|
+
// is needed
|
|
58
|
+
const setHeadValue = (value) => {
|
|
59
|
+
const head = _stack.get()[0];
|
|
60
|
+
if (head) {
|
|
61
|
+
head.value = value;
|
|
62
|
+
_stack.update((old) => [head, ...old.slice(1)]);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
55
65
|
return {
|
|
56
66
|
subscribe: _stack.subscribe,
|
|
57
67
|
get: _stack.get,
|
|
@@ -61,6 +71,8 @@ export const createAlertConfirmPromptStore = (defaults) => {
|
|
|
61
71
|
escape,
|
|
62
72
|
// human alias
|
|
63
73
|
close: shift,
|
|
74
|
+
//
|
|
75
|
+
setHeadValue,
|
|
64
76
|
// sugar below
|
|
65
77
|
//
|
|
66
78
|
alert: (o) => {
|