@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
- <!-- svelte-ignore a11y-autofocus -->
162
- <form
163
- method="dialog"
164
- use:focusTrap={{ autoFocusFirst: false }}
165
- tabindex="-1"
166
- autofocus={dialog.type !== PROMPT}
167
- data-acp-type={dialog?.type}
168
- data-acp-variant={dialog?.variant}
169
- data-acp-is-pending={isPending}
170
- class={_dialogClass}
171
- bind:this={_formEl}
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)}
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={_contentClass}
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
- <Thc thc={dialog.content} {forceAsHtml} />
196
+ {@html iconFn()}
216
197
  </div>
217
198
  {/if}
218
- {#if dialog.type === PROMPT}
219
- <div
220
- class={_inputBoxClass}
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
- {#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}
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
- </div>
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}
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
- <Thc thc={dialog.labelCancel} {forceAsHtml} />
277
- </Button>
278
- </li>
279
- {/if}
280
- {#if dialog.labelCustom && _isFn(dialog.onCustom)}
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-dialog-type={dialog?.type}
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
- 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"
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.labelCustom} {forceAsHtml} />
324
+ <Thc thc={dialog.labelOk} {forceAsHtml} />
304
325
  </Button>
305
326
  </li>
306
- {/if}
307
- <li
308
- class={_menuLiClass}
309
- data-acp-type={dialog?.type}
310
- data-acp-variant={dialog?.variant}
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
- <Thc thc={dialog.labelOk} {forceAsHtml} />
325
- </Button>
326
- </li>
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
- </div>
338
- {/if}
339
- </form>
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) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marianmeres/stuic",
3
- "version": "1.85.0",
3
+ "version": "1.87.0",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build && npm run package && node ./scripts/date.js",