@dosgato/dialog 0.0.26 → 0.0.28

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.
@@ -0,0 +1,67 @@
1
+ <script>import { passActions } from '@txstate-mws/svelte-components';
2
+ import { nullableSerialize, nullableDeserialize, FORM_CONTEXT, FormStore } from '@txstate-mws/svelte-forms';
3
+ import CodeFlask from 'codeflask';
4
+ import { getContext, onMount } from 'svelte';
5
+ import { getDescribedBy, FieldStandard } from './';
6
+ let className = '';
7
+ export { className as class };
8
+ export let id = undefined;
9
+ export let path;
10
+ export let label = '';
11
+ export let notNull = false;
12
+ export let defaultValue = notNull ? '' : undefined;
13
+ export let rows = undefined;
14
+ export let conditional = undefined;
15
+ export let required = false;
16
+ export let use = [];
17
+ export let inputelement = undefined;
18
+ export let helptext = undefined;
19
+ export let language;
20
+ const store = getContext(FORM_CONTEXT);
21
+ const value = store.getField(path);
22
+ let editorelement;
23
+ let flask;
24
+ let codeValue = '';
25
+ onMount(() => {
26
+ flask = new CodeFlask(editorelement, { language, lineNumbers: true, areaId: id });
27
+ flask.onUpdate(code => { codeValue = code; });
28
+ inputelement = editorelement.querySelector(`#${id}`);
29
+ if (className)
30
+ inputelement.classList.add(...className.split(' '));
31
+ inputelement.addEventListener('change', onChange);
32
+ updateValidState(invalid, messagesid);
33
+ });
34
+ $: flask?.updateCode($value ?? '');
35
+ let invalid;
36
+ let messagesid;
37
+ let helptextid;
38
+ let onChange;
39
+ function setSlotProps(helptextidIn, onChangeIn) {
40
+ helptextid = helptextidIn;
41
+ onChange = onChangeIn;
42
+ }
43
+ function updateValidState(invalidIn, messagesIdIn) {
44
+ invalid = !!invalidIn;
45
+ messagesid = messagesIdIn;
46
+ inputelement?.setAttribute('aria-invalid', String(!!invalid));
47
+ const descby = getDescribedBy([messagesid, helptextid]);
48
+ if (descby)
49
+ inputelement?.setAttribute('aria-describedby', getDescribedBy([messagesid, helptextid]));
50
+ else
51
+ inputelement?.removeAttribute('aria-describedby');
52
+ }
53
+ </script>
54
+
55
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} serialize={!notNull && nullableSerialize} deserialize={!notNull && nullableDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid>
56
+ {@const _ = setSlotProps(helptextid, onChange)}
57
+ {@const __ = updateValidState(invalid, messagesid)}
58
+ <div bind:this={editorelement} style:height="{rows * 1.333}em" class:valid class:invalid on:paste on:focusout={onBlur} use:passActions={use}></div>
59
+ </FieldStandard>
60
+
61
+ <style>
62
+ div {
63
+ overflow: hidden;
64
+ resize: vertical;
65
+ }
66
+
67
+ </style>
@@ -0,0 +1,31 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import { type HTMLActionEntry } from '@txstate-mws/svelte-components';
3
+ declare const __propDef: {
4
+ props: {
5
+ class?: string;
6
+ id?: string | undefined;
7
+ path: string;
8
+ label?: string;
9
+ notNull?: boolean;
10
+ defaultValue?: any;
11
+ rows?: number | undefined;
12
+ conditional?: boolean | undefined;
13
+ required?: boolean;
14
+ use?: HTMLActionEntry[];
15
+ inputelement?: HTMLTextAreaElement;
16
+ helptext?: string | undefined;
17
+ language: 'js' | 'css' | 'html';
18
+ };
19
+ events: {
20
+ paste: ClipboardEvent;
21
+ } & {
22
+ [evt: string]: CustomEvent<any>;
23
+ };
24
+ slots: {};
25
+ };
26
+ export type FieldCodeEditorProps = typeof __propDef.props;
27
+ export type FieldCodeEditorEvents = typeof __propDef.events;
28
+ export type FieldCodeEditorSlots = typeof __propDef.slots;
29
+ export default class FieldCodeEditor extends SvelteComponentTyped<FieldCodeEditorProps, FieldCodeEditorEvents, FieldCodeEditorSlots> {
30
+ }
31
+ export {};
package/FieldRadio.svelte CHANGED
@@ -1,6 +1,5 @@
1
- <script>import { randomid } from 'txstate-utils';
2
- import FieldStandard from './FieldStandard.svelte';
3
- import Radio from './Radio.svelte';
1
+ <script>import { Field } from '@txstate-mws/svelte-forms';
2
+ import Switcher from './Switcher.svelte';
4
3
  let className = '';
5
4
  export { className as class };
6
5
  export let id = undefined;
@@ -16,44 +15,11 @@ export let helptext = undefined;
16
15
  export let number = false;
17
16
  export let date = false;
18
17
  export let datetime = false;
18
+ export let boolean = false;
19
19
  export let serialize = undefined;
20
20
  export let deserialize = undefined;
21
- const groupid = randomid();
22
- const width = '100%';
23
21
  </script>
24
22
 
25
- <FieldStandard bind:id descid={groupid} {label} {path} {required} {defaultValue} {conditional} {helptext} {notNull} {number} {date} {datetime} {serialize} {deserialize} let:value let:valid let:invalid let:onBlur let:onChange let:helptextid let:serialize>
26
- <div class="dialog-radio {className}" class:horizontal role="radiogroup" aria-labelledby={groupid} class:invalid>
27
- {#each choices as choice, idx}
28
- {@const radioid = `${path}.${idx}`}
29
- {@const serializedValue = serialize(choice.value)}
30
- <label for={radioid} style:width>
31
- <Radio id={radioid} name={path} value={serializedValue} selected={value === serializedValue} disabled={choice.disabled} {onChange} {onBlur} {helptextid}/>
32
- <span>{choice.label || serializedValue}</span>
33
- </label>
34
- {/each}
35
- </div>
36
- </FieldStandard>
37
-
38
- <style>
39
- .dialog-radio {
40
- padding: 0.2em 0;
41
- }
42
- label {
43
- margin-bottom: 0.7em;
44
- display: flex;
45
- align-items: center;
46
- justify-content: flex-start;
47
- }
48
- label:last-child {
49
- margin-bottom: 0;
50
- }
51
- span {
52
- margin-left: 0.45em;
53
- max-width: calc(100% - 1.6em);
54
- }
55
- label :global(input[type="checkbox"]) {
56
- transform: none;
57
- }
58
-
59
- </style>
23
+ <Field {path} {defaultValue} {conditional} {notNull} {number} {date} {datetime} {boolean} {serialize} {deserialize} let:value let:valid let:invalid let:onBlur let:onChange let:messages let:serialize>
24
+ <Switcher bind:id class={className} name={path} {horizontal} {label} iptValue={value} {valid} {invalid} {required} {helptext} {messages} on:change={onChange} {onBlur} choices={choices.map(c => ({ ...c, value: serialize(c.value) }))} />
25
+ </Field>
@@ -19,6 +19,7 @@ declare const __propDef: {
19
19
  number?: boolean;
20
20
  date?: boolean;
21
21
  datetime?: boolean;
22
+ boolean?: boolean;
22
23
  serialize?: (value: any) => string;
23
24
  deserialize?: (value: string) => any;
24
25
  };
@@ -17,11 +17,12 @@ export let helptext = undefined;
17
17
  export let number = false;
18
18
  export let date = false;
19
19
  export let datetime = false;
20
+ export let boolean = false;
20
21
  export let serialize = undefined;
21
22
  export let deserialize = undefined;
22
23
  </script>
23
24
 
24
- <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} {notNull} {number} {date} {datetime} {serialize} {deserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid let:serialize>
25
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} {notNull} {number} {date} {datetime} {boolean} {serialize} {deserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid let:serialize>
25
26
  <select bind:this={inputelement} {id} name={path} {disabled} class="dialog-input dialog-select {className}" on:change={onChange} on:blur={onBlur} class:valid class:invalid aria-describedby={getDescribedBy([messagesid, helptextid])}>
26
27
  {#if !notNull}<option value="" selected={!value}>{placeholder}</option>{/if}
27
28
  {#each choices as choice (choice.value)}
@@ -21,6 +21,7 @@ declare const __propDef: {
21
21
  number?: boolean;
22
22
  date?: boolean;
23
23
  datetime?: boolean;
24
+ boolean?: boolean;
24
25
  serialize?: (value: any) => string;
25
26
  deserialize?: (value: string) => any;
26
27
  };
@@ -10,6 +10,7 @@ export let notNull = false;
10
10
  export let number = false;
11
11
  export let date = false;
12
12
  export let datetime = false;
13
+ export let boolean = false;
13
14
  export let serialize = undefined;
14
15
  export let deserialize = undefined;
15
16
  export let conditional = undefined;
@@ -17,7 +18,7 @@ export let required = false;
17
18
  export let helptext = undefined;
18
19
  </script>
19
20
 
20
- <Field {path} {defaultValue} {conditional} {notNull} {number} {date} {datetime} {serialize} {deserialize} let:path let:value let:onBlur let:onChange let:setVal let:messages let:valid let:invalid let:serialize let:deserialize>
21
+ <Field {path} {defaultValue} {conditional} {notNull} {number} {date} {datetime} {boolean} {serialize} {deserialize} let:path let:value let:onBlur let:onChange let:setVal let:messages let:valid let:invalid let:serialize let:deserialize>
21
22
  <Container {id} {label} {messages} {descid} {required} {helptext} let:messagesid let:helptextid>
22
23
  <slot {id} {path} {value} {onBlur} {onChange} {setVal} {valid} {invalid} {messagesid} {helptextid} {serialize} {deserialize} />
23
24
  </Container>
@@ -10,6 +10,7 @@ declare const __propDef: {
10
10
  number?: boolean;
11
11
  date?: boolean;
12
12
  datetime?: boolean;
13
+ boolean?: boolean;
13
14
  serialize?: (value: any) => string;
14
15
  deserialize?: (value: string) => any;
15
16
  conditional?: boolean | undefined;
@@ -0,0 +1,67 @@
1
+ <script>import { eq } from '@txstate-mws/svelte-components';
2
+ import { Store } from '@txstate-mws/svelte-store';
3
+ import { createEventDispatcher } from 'svelte';
4
+ import { randomid } from 'txstate-utils';
5
+ import Container from './Container.svelte';
6
+ import Radio from './Radio.svelte';
7
+ let className = '';
8
+ export { className as class };
9
+ export let id = randomid();
10
+ export let name = randomid();
11
+ export let choices;
12
+ export let horizontal = false;
13
+ export let label;
14
+ export let required = false;
15
+ export let helptext = undefined;
16
+ export let messages = [];
17
+ export let iptValue = choices[0].value;
18
+ export let valid = false;
19
+ export let invalid = false;
20
+ export let onBlur = undefined;
21
+ const dispatch = createEventDispatcher();
22
+ const store = new Store({ width: 1000 });
23
+ const groupid = randomid();
24
+ function onChange(e) {
25
+ iptValue = this.value;
26
+ dispatch('change', iptValue);
27
+ }
28
+ $: columns = Math.floor($store.width / 250);
29
+ $: width = (horizontal ? 100 / Math.min(choices.length, choices.length === 4 && columns === 3 ? 2 : columns) : 100) + '%';
30
+ </script>
31
+ <Container {id} {label} {messages} descid={groupid} {required} {helptext} let:helptextid>
32
+ <div class="dialog-radio {className}" use:eq={{ store }} class:horizontal role="radiogroup" aria-labelledby={groupid} class:valid class:invalid>
33
+ {#each choices as choice, idx}
34
+ {@const radioid = `${groupid}.${idx}`}
35
+ <label for={radioid} style:width>
36
+ <Radio id={radioid} {name} value={choice.value} selected={iptValue === choice.value} disabled={choice.disabled} {onChange} {onBlur} {helptextid}/>
37
+ <span>{choice.label || choice.value}</span>
38
+ </label>
39
+ {/each}
40
+ </div>
41
+ </Container>
42
+
43
+ <style>
44
+ .dialog-radio {
45
+ padding: 0.2em 0;
46
+ }
47
+ label {
48
+ margin-bottom: 0.7em;
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: flex-start;
52
+ cursor: pointer;
53
+ width: 25%;
54
+ }
55
+ .dialog-radio:not(.horizontal) label:last-child {
56
+ margin-bottom: 0;
57
+ }
58
+ span {
59
+ margin-left: 0.45em;
60
+ max-width: calc(100% - 1.6em);
61
+ }
62
+ .horizontal {
63
+ display: flex;
64
+ flex-wrap: wrap;
65
+ }
66
+
67
+ </style>
@@ -0,0 +1,35 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { Feedback } from '@txstate-mws/svelte-forms';
3
+ declare const __propDef: {
4
+ props: {
5
+ class?: string;
6
+ id?: string | undefined;
7
+ name?: string;
8
+ choices: {
9
+ label?: string;
10
+ value: string;
11
+ disabled?: boolean;
12
+ }[];
13
+ horizontal?: boolean;
14
+ label: string;
15
+ required?: boolean;
16
+ helptext?: string | undefined;
17
+ messages?: Feedback[];
18
+ iptValue?: string;
19
+ valid?: boolean;
20
+ invalid?: boolean;
21
+ onBlur?: (() => void | Promise<void>);
22
+ };
23
+ events: {
24
+ change: CustomEvent<any>;
25
+ } & {
26
+ [evt: string]: CustomEvent<any>;
27
+ };
28
+ slots: {};
29
+ };
30
+ export type SwitcherProps = typeof __propDef.props;
31
+ export type SwitcherEvents = typeof __propDef.events;
32
+ export type SwitcherSlots = typeof __propDef.slots;
33
+ export default class Switcher extends SvelteComponentTyped<SwitcherProps, SwitcherEvents, SwitcherSlots> {
34
+ }
35
+ export {};
package/Tabs.svelte CHANGED
@@ -8,19 +8,21 @@ import { TabStore, TAB_CONTEXT } from './TabStore';
8
8
  export let tabs;
9
9
  export let active = undefined;
10
10
  export let store = new TabStore(tabs, active);
11
+ export let disableDialogControl = false;
11
12
  $: store.update(v => ({ ...v, tabs }));
12
13
  const activeStore = new Store({});
13
14
  const tabelements = [];
14
15
  let activeelement;
15
16
  setContext(TAB_CONTEXT, { store, onClick, onKeyDown, tabelements });
16
- const dialogContext = getContext(DIALOG_TABS_CONTEXT) ?? { change: () => { } };
17
+ const dialogContext = (disableDialogControl ? undefined : getContext(DIALOG_TABS_CONTEXT)) ?? { change: () => { } };
17
18
  dialogContext.onNext = () => { store.right(); };
18
19
  dialogContext.onPrev = () => { store.left(); };
19
20
  $: dialogContext.prevTitle = $store.prevTitle;
20
21
  $: dialogContext.nextTitle = $store.nextTitle;
21
22
  $: dialogContext.hasRequired = $store.requireNext;
22
23
  $: dialogContext.change($store);
23
- setContext(DIALOG_TABS_CONTEXT, { change: () => { } }); // reset context so that any sub-tabs do NOT control the Dialog component
24
+ if (!disableDialogControl)
25
+ setContext(DIALOG_TABS_CONTEXT, { change: () => { } }); // reset context so that any sub-tabs do NOT control the Dialog component
24
26
  const currentTitle = store.currentTitle();
25
27
  const currentIdx = store.currentIdx();
26
28
  const accordion = store.accordion();
package/Tabs.svelte.d.ts CHANGED
@@ -5,6 +5,7 @@ declare const __propDef: {
5
5
  tabs: TabDef[];
6
6
  active?: string | undefined;
7
7
  store?: TabStore;
8
+ disableDialogControl?: boolean;
8
9
  };
9
10
  events: {
10
11
  [evt: string]: CustomEvent<any>;
package/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export { default as FieldAutocomplete } from './FieldAutocomplete.svelte';
7
7
  export { default as FieldCheckbox } from './FieldCheckbox.svelte';
8
8
  export { default as FieldChoices } from './FieldChoices.svelte';
9
9
  export { default as FieldChooserLink } from './FieldChooserLink.svelte';
10
+ export { default as FieldCodeEditor } from './FieldCodeEditor.svelte';
10
11
  export { default as FieldDate } from './FieldDate.svelte';
11
12
  export { default as FieldDateTime } from './FieldDateTime.svelte';
12
13
  export { default as FieldDualListbox } from './FieldDualListbox.svelte';
@@ -27,10 +28,11 @@ export { default as Icon } from './Icon.svelte';
27
28
  export { default as InlineMessage } from './InlineMessage.svelte';
28
29
  export { default as InlineMessages } from './InlineMessages.svelte';
29
30
  export { default as Input } from './Input.svelte';
31
+ export { default as Listbox } from './Listbox.svelte';
30
32
  export { default as Radio } from './Radio.svelte';
33
+ export { default as Switcher } from './Switcher.svelte';
31
34
  export { default as Tab } from './Tab.svelte';
32
35
  export { default as Tabs } from './Tabs.svelte';
33
- export { default as Listbox } from './Listbox.svelte';
34
36
  export * from './chooser/index.js';
35
37
  export * from './fileIcons.js';
36
38
  export * from './TabStore.js';
package/index.js CHANGED
@@ -7,6 +7,7 @@ export { default as FieldAutocomplete } from './FieldAutocomplete.svelte';
7
7
  export { default as FieldCheckbox } from './FieldCheckbox.svelte';
8
8
  export { default as FieldChoices } from './FieldChoices.svelte';
9
9
  export { default as FieldChooserLink } from './FieldChooserLink.svelte';
10
+ export { default as FieldCodeEditor } from './FieldCodeEditor.svelte';
10
11
  export { default as FieldDate } from './FieldDate.svelte';
11
12
  export { default as FieldDateTime } from './FieldDateTime.svelte';
12
13
  export { default as FieldDualListbox } from './FieldDualListbox.svelte';
@@ -27,10 +28,11 @@ export { default as Icon } from './Icon.svelte';
27
28
  export { default as InlineMessage } from './InlineMessage.svelte';
28
29
  export { default as InlineMessages } from './InlineMessages.svelte';
29
30
  export { default as Input } from './Input.svelte';
31
+ export { default as Listbox } from './Listbox.svelte';
30
32
  export { default as Radio } from './Radio.svelte';
33
+ export { default as Switcher } from './Switcher.svelte';
31
34
  export { default as Tab } from './Tab.svelte';
32
35
  export { default as Tabs } from './Tabs.svelte';
33
- export { default as Listbox } from './Listbox.svelte';
34
36
  export * from './chooser/index.js';
35
37
  export * from './fileIcons.js';
36
38
  export * from './TabStore.js';
package/package.json CHANGED
@@ -1,19 +1,21 @@
1
1
  {
2
2
  "name": "@dosgato/dialog",
3
3
  "description": "A component library for building forms that edit a JSON document.",
4
- "version": "0.0.26",
4
+ "version": "0.0.28",
5
5
  "dependencies": {
6
6
  "@txstate-mws/svelte-components": "^1.3.5",
7
- "@txstate-mws/svelte-forms": "^1.2.0",
7
+ "@txstate-mws/svelte-forms": "^1.2.1",
8
8
  "@iconify/svelte": "^3.0.0",
9
9
  "@iconify-icons/mdi": "^1.2.22",
10
10
  "@iconify-icons/ph": "^1.2.2",
11
+ "codeflask": "^1.4.1",
11
12
  "txstate-utils": "^1.8.0"
12
13
  },
13
14
  "devDependencies": {
14
15
  "@sveltejs/adapter-auto": "next",
15
16
  "@sveltejs/kit": "next",
16
17
  "@sveltejs/package": "^1.0.0-next.5",
18
+ "@types/codeflask": "^1.4.3",
17
19
  "eslint-config-standard-with-typescript": "^23.0.0",
18
20
  "eslint-plugin-svelte3": "^4.0.0",
19
21
  "svelte-check": "^2.2.6",
@@ -37,6 +39,7 @@
37
39
  "./FieldCheckbox.svelte": "./FieldCheckbox.svelte",
38
40
  "./FieldChoices.svelte": "./FieldChoices.svelte",
39
41
  "./FieldChooserLink.svelte": "./FieldChooserLink.svelte",
42
+ "./FieldCodeEditor.svelte": "./FieldCodeEditor.svelte",
40
43
  "./FieldDate.svelte": "./FieldDate.svelte",
41
44
  "./FieldDateTime.svelte": "./FieldDateTime.svelte",
42
45
  "./FieldDualListbox.svelte": "./FieldDualListbox.svelte",
@@ -59,6 +62,7 @@
59
62
  "./Input.svelte": "./Input.svelte",
60
63
  "./Listbox.svelte": "./Listbox.svelte",
61
64
  "./Radio.svelte": "./Radio.svelte",
65
+ "./Switcher.svelte": "./Switcher.svelte",
62
66
  "./Tab.svelte": "./Tab.svelte",
63
67
  "./TabStore": "./TabStore.js",
64
68
  "./Tabs.svelte": "./Tabs.svelte",