@soleil-se/config-svelte 1.22.0 → 1.23.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.
package/CHANGELOG.md CHANGED
@@ -1,28 +1,35 @@
1
- # Changelog
1
+ ---
2
+ title: Changelog
3
+ ---
2
4
 
3
5
  All notable changes to this project will be documented in this file.
4
6
 
5
7
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
8
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
9
 
10
+ ## [1.23.0] - 2024-03-07
11
+
12
+ - List item templating in `CustomList` with [CustomListItemTemplate](/packages/soleil/svelte-config/components/customlist/#list-item-template).
13
+ - Trigger manual update of `CustomList` with [triggerUpdate](/packages/soleil/svelte-config/components/customlist/#dynamic-content) function.
14
+
8
15
  ## [1.22.0] - 2024-02-13
9
16
 
10
17
  - More lenient `@sitevision/api` peer dependency range.
11
- - Try to use `window.sv.getValues()` if available since `window._getValues()` is deprecated.
18
+ - Try to use `window.sv.getValues()` first since `window._getValues()` is deprecated.
12
19
 
13
20
  ## [1.21.0] - 2023-10-13
14
21
 
15
- - Add `legendVisuallyHidden` prop for [RadioGroup](./components/RadioGroup) and [CheckboxGroup](./components/CheckboxGroup).
16
- - Add `class` prop for [Panel](./components/Panel).
17
- - Add `removable` prop for [CustomSelector](./components/CustomSelector).
22
+ - Add `legendVisuallyHidden` prop for [RadioGroup](/packages/soleil/svelte-config/components/radiogroup) and [CheckboxGroup](/packages/soleil/svelte-config/components/checkboxgroup).
23
+ - Add `class` prop for [Panel](/packages/soleil/svelte-config/components/panel).
24
+ - Add `removable` prop for [CustomSelector](/packages/soleil/svelte-config/components/customselector).
18
25
 
19
26
  ## [1.20.1] - 2023-09-25
20
27
 
21
- - Fix element containting title in [Modal](./components/Modal).
28
+ - Fix element containting title in [Modal](/packages/soleil/svelte-config/components/modal).
22
29
 
23
30
  ## [1.20.0] - 2023-09-25
24
31
 
25
- - Add footer slot in [Modal](./components/Modal).
32
+ - Add footer slot in [Modal](/packages/soleil/svelte-config/components/modal).
26
33
 
27
34
  ## [1.19.0] - 2023-05-17
28
35
 
@@ -38,19 +45,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
38
45
 
39
46
  ## [1.18.0] - 2023-01-20
40
47
 
41
- - Option templating in [CustomSelector](./components/CustomSelector).
48
+ - Option templating in [CustomSelector](/packages/soleil/svelte-config/components/customselector).
42
49
  - Add global Select2 styling.
43
50
  - Modal now closes open Select2 dropdowns.
44
51
 
45
52
  ## [1.17.0] - 2022-12-01
46
53
 
47
- - New component: [RepositoryNodeSelector](./components/RepositoryNodeSelector).
48
- - New utility API: [getAppContext](./#getappcontext).
49
- - New server API: [createAppContext](./#context)
54
+ - New component: [RepositoryNodeSelector](/packages/soleil/svelte-config/components/repositorynodeselector).
55
+ - New utility API: [getAppContext](/packages/soleil/svelte-config#getappcontext).
56
+ - New server API: [createAppContext](/packages/soleil/svelte-config#context)
50
57
 
51
58
  ## [1.16.2] - 2022-11-24
52
59
 
53
- - [ListSelector](./components/ListSelector) now works properly in [CustomList](./components/CustomList).
60
+ - [ListSelector](/packages/soleil/svelte-config/components/listselector) now works properly in [CustomList](/packages/soleil/svelte-config/components/customlist).
54
61
 
55
62
  ## [1.16.1] - 2022-11-18
56
63
 
@@ -58,17 +65,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
58
65
 
59
66
  ## [1.16.0] - 2022-11-09
60
67
 
61
- - Add singular and plural suffix support for [NumberSpinner](./components/NumberSpinner)
68
+ - Add singular and plural suffix support for [NumberSpinner](/packages/soleil/svelte-config/components/numberspinner)
62
69
 
63
70
  ## [1.15.0] - 2022-09-15
64
71
 
65
- - Required was not re-evaluated properly in [InputField](./components/InputField), [NodeSelector](./components/NodeSelector) and [TagSelector](./components/TagSelector).
72
+ - Required was not re-evaluated properly in [InputField](/packages/soleil/svelte-config/components/inputfield), [NodeSelector](/packages/soleil/svelte-config/components/nodeselector) and [TagSelector](/packages/soleil/svelte-config/components/tagselector).
66
73
  - Add `show` prop for all components to toggle visibility without re-rendering.
67
74
 
68
75
  ## [1.14.0] - 2022-07-07
69
76
 
70
- - Add default slot for [ImageSelector](./components/ImageSelector).
71
- - Margin fix for [RadioGroup](./components/RadioGroup).
77
+ - Add default slot for [ImageSelector](/packages/soleil/svelte-config/components/imageselector).
78
+ - Margin fix for [RadioGroup](/packages/soleil/svelte-config/components/radiogroup).
72
79
 
73
80
  ## [1.13.0] - 2022-06-23
74
81
 
@@ -80,22 +87,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
80
87
 
81
88
  ## [1.12.0] - 2022-05-23
82
89
 
83
- - New component: [Modal](./components/Modal).
84
- - New component: [CustomList](./components/CustomList).
90
+ - New component: [Modal](/packages/soleil/svelte-config/components/modal).
91
+ - New component: [CustomList](/packages/soleil/svelte-config/components/customlist).
85
92
 
86
93
  ## [1.10.1] - 2022-03-08
87
94
 
88
- - Cast saved value to Number in [NumberSpinner](./components/NumberSpinner).
89
- - Fix reactivity for `suffix` prop in [NumberSpinner](./components/NumberSpinner).
95
+ - Cast saved value to Number in [NumberSpinner](/packages/soleil/svelte-config/components/numberspinner).
96
+ - Fix reactivity for `suffix` prop in [NumberSpinner](/packages/soleil/svelte-config/components/numberspinner).
90
97
 
91
98
  ## [1.10.0] - 2022-03-07
92
99
 
93
- - Added `multiple` prop for [CustomSelector](./components/CustomSelector).
94
- - First value is always selected in [RadioGroup](./components/RadioGroup) if nothing is selected.
100
+ - Added `multiple` prop for [CustomSelector](/packages/soleil/svelte-config/components/customselector).
101
+ - First value is always selected in [RadioGroup](/packages/soleil/svelte-config/components/radiogroup) if nothing is selected.
95
102
 
96
103
  ## [1.9.0] - 2021-12-06
97
104
 
98
- - Added [CustomSelector](./components/CustomSelector)
105
+ - Added [CustomSelector](/packages/soleil/svelte-config/components/customselector)
99
106
 
100
107
  ## [1.8.4] - 2021-12-03
101
108
 
@@ -1,6 +1,5 @@
1
1
  <script>
2
2
  import { createEventDispatcher, onMount, tick } from 'svelte';
3
-
4
3
  import { generateId, addGeneratedIds } from '../../utils';
5
4
  import { resizer } from '../../actions';
6
5
  import i18n from './i18n';
@@ -11,7 +10,7 @@
11
10
  import EditModal from './internal/EditModal.svelte';
12
11
  import AddModal from './internal/AddModal.svelte';
13
12
 
14
- const values = window.CONFIG_VALUES || {};
13
+ const configValues = window.CONFIG_VALUES || {};
15
14
  const dispatch = createEventDispatcher();
16
15
 
17
16
  export let label;
@@ -22,7 +21,7 @@
22
21
  export let icon;
23
22
 
24
23
  export let value = [];
25
- value = name ? values[name] ?? value : value;
24
+ value = name ? configValues[name] ?? value : value;
26
25
 
27
26
  addGeneratedIds(value);
28
27
 
@@ -45,7 +44,10 @@
45
44
  await tick();
46
45
  items = value.map((id) => ({
47
46
  id,
48
- name: document.querySelector(`#modal_${id} input`)?.value || id,
47
+ name:
48
+ document.querySelector(`#modal_${id} .custom-list-item-template`)?.innerHTML ||
49
+ document.querySelector(`#modal_${id} input:not([type=radio],[type=checkbox])`)?.value ||
50
+ id,
49
51
  }));
50
52
  }
51
53
 
@@ -93,6 +95,10 @@
93
95
  onChange();
94
96
  }
95
97
 
98
+ function triggerUpdate() {
99
+ updateItems();
100
+ }
101
+
96
102
  onMount(updateItems);
97
103
  </script>
98
104
 
@@ -106,11 +112,11 @@
106
112
 
107
113
  {#each modals as id, index (id)}
108
114
  <EditModal {id} open={editId === id} on:save={onEditSave} on:close={onEditClose}>
109
- <slot {id} {index} />
115
+ <slot {id} {index} {triggerUpdate} />
110
116
  </EditModal>
111
117
  {/each}
112
118
  <AddModal {name} open={addModalOpen} on:save={onAddSave} on:close={onAddClose} let:id>
113
- <slot {id} index={items.length} />
119
+ <slot {id} index={items.length} {triggerUpdate} />
114
120
  </AddModal>
115
121
 
116
122
  <div class="form-group" class:hidden={!show}>
@@ -121,13 +127,15 @@
121
127
  <div class="list-component__list-wrapper ui-resizable">
122
128
  <Sortable {dragDisabled} {items} on:finalize={onFinalize} let:item>
123
129
  <SortableItem
124
- {...item}
130
+ id={item.id}
125
131
  {disabled}
126
132
  {icon}
127
133
  on:edit={onEdit}
128
134
  on:remove={onRemove}
129
135
  on:click={tempDisableDrag}
130
- />
136
+ >
137
+ {@html item.name}
138
+ </SortableItem>
131
139
  </Sortable>
132
140
  <div class="ui-resizable-handle ui-resizable-s" use:resizer />
133
141
  </div>
@@ -0,0 +1,3 @@
1
+ <div style:display="none" class="custom-list-item-template">
2
+ <slot />
3
+ </div>
@@ -1,11 +1,11 @@
1
- # CustomList
1
+ ---
2
+ title: CustomList
3
+ ---
2
4
 
3
5
  A sortable list component for adding multiple grouped configuration components in modals.
4
6
 
5
- ![CustomList](../../images/CustomList.png)
6
- ![CustomListModal](../../images/CustomListModal.png)
7
-
8
- [[toc]]
7
+ ![CustomList](../images/CustomList.png)
8
+ ![CustomListModal](../images/CustomListModal.png)
9
9
 
10
10
  ## Props
11
11
 
@@ -36,17 +36,19 @@ This id needs to be prefixed to the `name` attribute.
36
36
  import { Panel, CustomList, InputField, NodeSelector } from '@soleil-se/svelte-config';
37
37
  </script>
38
38
 
39
- <Panel heading="Inställningar">
39
+ <Panel>
40
40
  <CustomList name="customList" label="Custom list" let:id>
41
41
  <InputField name="{id}_name" label="Name" />
42
- <NodeSelector name="{id}_page" label="Page" type="page-selector" />
42
+ <NodeSelector name="{id}_page" label="Page" />
43
43
  </CustomList>
44
44
  </Panel>
45
45
  ```
46
46
 
47
47
  ### Advanced
48
48
 
49
- Component is currently **not** supported in advanced configs.
49
+ This component is currently **not** supported in advanced configs out of the box.
50
+ If you need to use it in an advanced config you can manually handle the state to normalize
51
+ and flatten it for saving to the server.
50
52
 
51
53
  ## AppData
52
54
 
@@ -74,10 +76,100 @@ No list of icons is available, but you can inspect an icon in the edit interface
74
76
  import { Panel, CustomList, InputField, NodeSelector } from '@soleil-se/svelte-config';
75
77
  </script>
76
78
 
77
- <Panel heading="Inställningar">
79
+ <Panel>
78
80
  <CustomList name="customList" label="Custom list" icon="sitevision-icons file" let:id>
79
81
  <InputField name="{id}_name" label="Name" />
80
- <NodeSelector name="{id}_page" label="Page" type="page-selector" />
82
+ <NodeSelector name="{id}_page" label="Page" />
83
+ </CustomList>
84
+ </Panel>
85
+ ```
86
+
87
+ ## List item template
88
+
89
+ Sometimes you want full control over the list items, if some other value than the first input field
90
+ wants to be displayed or a completely custom template.
91
+ For this to work it's easiest to handle the modal content in a separate component.
92
+
93
+ ```svelte
94
+ // App.svelte
95
+ <script>
96
+ import { Panel, CustomList } from '@soleil-se/svelte-config';
97
+ import Settings from './Settings.svelte';
98
+ </script>
99
+
100
+ <Panel>
101
+ <CustomList name="customList" label="Custom list" let:id>
102
+ <Settings {id} />
103
+ </CustomList>
104
+ </Panel>
105
+ ```
106
+
107
+ ```svelte
108
+ // Settings.svelte
109
+ <script>
110
+ import { InputField, NodeSelector, CustomListItemTemplate } from '@soleil-se/svelte-config';
111
+
112
+ export let id;
113
+ let name;
114
+ </script>
115
+
116
+ <CustomListItemTemplate>
117
+ Page: {name}
118
+ </CustomListItemTemplate>
119
+ <InputField name="{id}_name" label="Name" bind:value={name} />
120
+ <NodeSelector name="{id}_page" label="Page" type="page-selector" />
121
+ ```
122
+
123
+ ### Dynamic content
124
+
125
+ A more advanced example with dynamically fetched content, a manual update of the list item is needed
126
+ on mount since the list doesn't know when all data is available.
127
+
128
+ ```svelte
129
+ // App.svelte
130
+ <script>
131
+ import { Panel, CustomList } from '@soleil-se/svelte-config';
132
+ import Settings from './Settings.svelte';
133
+ </script>
134
+
135
+ <Panel>
136
+ <CustomList name="customList" label="Custom list" let:id let:triggerUpdate>
137
+ <Settings {id} {triggerUpdate} />
81
138
  </CustomList>
82
139
  </Panel>
83
140
  ```
141
+
142
+ ```svelte
143
+ // Settings.svelte
144
+ <script>
145
+ import { NodeSelector, CustomListItemTemplate } from '@soleil-se/svelte-config';
146
+ import { onMount } from 'svelte';
147
+
148
+ export let id;
149
+ export let triggerUpdate;
150
+
151
+ let pageId;
152
+ let name;
153
+ let url;
154
+
155
+ async function fetchPageDetails() {
156
+ if (!pageId) return;
157
+ const res = await fetch(`/rest-api/1/0/${pageId}/properties`)
158
+ .then((res) => res.json());
159
+
160
+ name = res.displayName;
161
+ url = res.URL;
162
+ }
163
+
164
+ onMount(() => {
165
+ await fetchPageDetails();
166
+ triggerUpdate();
167
+ });
168
+
169
+ </script>
170
+
171
+ <CustomListItemTemplate>
172
+ {name} ({url})
173
+ </CustomListItemTemplate>
174
+ <NodeSelector name="{id}_page" label="Page" on:change={fetchPageDetails} bind:value={pageId} />
175
+ ```
@@ -1 +1,2 @@
1
1
  export { default } from './Component.svelte';
2
+ export { default as CustomListItemTemplate } from './CustomListItemTemplate.svelte';
@@ -13,7 +13,9 @@
13
13
 
14
14
  const dispatch = createEventDispatcher();
15
15
 
16
- $: if (open) id = generateId(name || 'item');
16
+ $: if (open) {
17
+ id = generateId(name || 'item');
18
+ }
17
19
 
18
20
  const onClose = () => {
19
21
  dispatch('close');
@@ -29,7 +31,7 @@
29
31
  };
30
32
  </script>
31
33
 
32
- <Modal title={i18n('add')} on:save={onSave} on:close={onClose} {open} bind:element>
34
+ <Modal {open} title={i18n('add')} on:save={onSave} on:close={onClose} bind:element>
33
35
  {#if id}
34
36
  <slot {id} />
35
37
  {/if}
@@ -1,7 +1,7 @@
1
1
  <script>
2
2
  import i18n from '../i18n';
3
3
  import Modal from '../../Modal';
4
-
4
+
5
5
  export let id;
6
6
  export let open = false;
7
7
 
@@ -13,7 +13,7 @@
13
13
  };
14
14
  </script>
15
15
 
16
- <div id="modal_{id}">
16
+ <div id="modal_{id}" style:display="contents">
17
17
  <Modal title="{i18n('edit')} {name}" bind:open bind:element on:open={onOpen} on:save on:close>
18
18
  <slot />
19
19
  </Modal>
@@ -25,6 +25,9 @@
25
25
  </script>
26
26
 
27
27
  <ul
28
+ class="list-component__list"
29
+ on:consider={onConsider}
30
+ on:finalize={onFinalize}
28
31
  use:dndzone={{
29
32
  items,
30
33
  flipDurationMs: 100,
@@ -34,12 +37,9 @@
34
37
  autoAriaDisabled: true,
35
38
  dragDisabled,
36
39
  }}
37
- on:consider={onConsider}
38
- on:finalize={onFinalize}
39
- class="list-component__list"
40
40
  >
41
41
  {#each items as item (item.id)}
42
- <li aria-label={item.name} animate:flip={{ duration: 100 }} tabindex="-1">
42
+ <li aria-label={item.name} tabindex="-1" animate:flip={{ duration: 100 }}>
43
43
  <slot {item} />
44
44
  </li>
45
45
  {/each}
@@ -2,7 +2,6 @@
2
2
  import { createEventDispatcher } from 'svelte';
3
3
 
4
4
  export let id;
5
- export let name;
6
5
  export let disabled;
7
6
  export let icon;
8
7
 
@@ -23,7 +22,9 @@
23
22
  {#if icon}
24
23
  <i class="sv-list-icon {icon}" aria-hidden="true" />
25
24
  {/if}
26
- <span class="item-name">{name}</span>
25
+ <span class="item-name">
26
+ <slot />
27
+ </span>
27
28
  <div class="list-component__item-actions">
28
29
  <button {disabled} on:click={editItem}>
29
30
  <i class="glyphicons edit" aria-hidden="true" />
@@ -56,9 +57,9 @@
56
57
  .list-component__item-actions {
57
58
  button {
58
59
  padding: 0;
60
+ appearance: none;
59
61
  background: none;
60
62
  border: none;
61
- appearance: none;
62
63
  }
63
64
 
64
65
  :global(li:focus-within) & i {
package/index.js CHANGED
@@ -14,7 +14,7 @@ export { default as ImageSelector } from './components/ImageSelector';
14
14
  export { default as TagSelector } from './components/TagSelector';
15
15
  export { default as CustomSelector } from './components/CustomSelector';
16
16
  export { default as Modal } from './components/Modal';
17
- export { default as CustomList } from './components/CustomList';
17
+ export { default as CustomList, CustomListItemTemplate } from './components/CustomList';
18
18
  export { default as RepositoryNodeSelector } from './components/RepositoryNodeSelector';
19
19
 
20
20
  export { default as createConfigApp } from './createConfigApp';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soleil-se/config-svelte",
3
- "version": "1.22.0",
3
+ "version": "1.23.0",
4
4
  "main": "./index.js",
5
5
  "module": "./index.js",
6
6
  "svelte": "./index.js",