@soleil-se/config-svelte 1.1.2 → 1.2.1

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,38 +1,73 @@
1
1
  # Changelog
2
+
2
3
  All notable changes to this project will be documented in this file.
3
4
 
4
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.2.1] - 2021-04-09
9
+
10
+ ### Fixed
11
+
12
+ - Mail and tel values in LinkSelector are prefixed with `mailto:` and `tel:`.
13
+
14
+ ## [1.2.0] - 2021-03-30
15
+
16
+ ### Added
17
+
18
+ - Mail and tel types to LinkSelector.
19
+ - Value in NumberSpinner is now left aligned.
20
+
21
+ ### Fixed
22
+
23
+ - Unable to clear value in LinkSelector.
24
+
6
25
  ## [1.1.2] - 2021-03-11
26
+
7
27
  ### Fixed
28
+
8
29
  - Unable to remove last item in TextList.
9
30
  - TextList is not validated when `required` prop is used
31
+
10
32
  ## [1.1.1] - 2021-02-02
33
+
11
34
  ### Fixed
35
+
12
36
  - Missing docs NumberSpinner.
13
37
 
14
38
  ## [1.1.0] - 2021-01-29
39
+
15
40
  ### Added
41
+
16
42
  - `suffix` prop to NumberSpinner.
17
43
 
18
44
  ## [1.0.4] - 2021-01-15
45
+
19
46
  ### Fixed
47
+
20
48
  - ListSelector inifity loop.
21
49
 
22
50
  ## [1.0.3] - 2021-01-11
51
+
23
52
  ### Fixed
53
+
24
54
  - Remove debug output.
25
55
 
26
56
  ## [1.0.2] - 2021-01-11
57
+
27
58
  ### Fixed
59
+
28
60
  - Array destructuring not working in TextList for IE11.
29
61
  - RadioGroup value not working in IE11.
30
62
  - Added missing polyfills for IE11 in docs and demo.
31
63
 
32
64
  ## [1.0.1] - 2020-12-08
65
+
33
66
  ### Fixed
67
+
34
68
  - Selectable props in NodeSelector, ListSelector and DropdownSelector now also accepts a string.
35
69
  - Margin on CheckboxGroup and RadioGroup controls.
36
70
 
37
71
  ## [1.0.0] - 2020-11-20
72
+
38
73
  - Initial release!
package/actions/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { default as httpPrefix } from './httpPrefix';
1
+ export { prefixHttps, prefixMail, prefixTel } from './inputPrefix';
2
2
  export { default as resizer } from './resizer';
3
3
  export { default as show } from './show';
@@ -0,0 +1,31 @@
1
+ export function prefixHttps(node) {
2
+ const addPrefix = () => {
3
+ const { type, value } = node;
4
+ if (type === 'url' && value && !/^(https?):\/\//i.test(value) && ('http://'.indexOf(value) === -1 && 'https://'.indexOf(value) === -1)) {
5
+ /* eslint-disable-next-line no-param-reassign */
6
+ node.value = `https://${value}`;
7
+ }
8
+ };
9
+ node.addEventListener('input', addPrefix);
10
+ }
11
+
12
+ export function prefixMail(node) {
13
+ const addPrefix = () => {
14
+ const { value } = node;
15
+
16
+ if (value && !/^(mailto?):/i.test(value) && 'mailto:'.indexOf(value) === -1) {
17
+ /* eslint-disable-next-line no-param-reassign */
18
+ node.value = `mailto:${value}`;
19
+ }
20
+ };
21
+ node.addEventListener('input', addPrefix);
22
+ }
23
+
24
+ export function prefixTel(node) {
25
+ const addPrefix = () => {
26
+ const { value } = node;
27
+ /* eslint-disable-next-line no-param-reassign */
28
+ node.value = `tel:${value.replace(/\s/g, '').replace(/[^0-9$\\+]/g, '')}`;
29
+ };
30
+ node.addEventListener('input', addPrefix);
31
+ }
@@ -1,7 +1,7 @@
1
1
  <script>
2
2
  /* eslint-disable no-undef-init */
3
3
  import { createEventDispatcher } from 'svelte';
4
- import { httpPrefix } from '../../actions';
4
+ import { prefixHttps } from '../../actions';
5
5
  import { generateId } from '../../utils';
6
6
 
7
7
  const values = window.CONFIG_VALUES || {};
@@ -18,6 +18,7 @@
18
18
  export let pattern = undefined;
19
19
  export let rows = 3;
20
20
  export let value = '';
21
+ export let action = prefixHttps;
21
22
  value = name ? values[name] ?? value : value;
22
23
 
23
24
  let className = '';
@@ -60,7 +61,7 @@
60
61
  {readonly}
61
62
  {pattern}
62
63
  {value}
63
- use:httpPrefix
64
+ use:action
64
65
  on:input={onInput}
65
66
  />
66
67
  {/if}
@@ -1,14 +1,14 @@
1
1
  <script>
2
2
  import { createEventDispatcher } from 'svelte';
3
- import { show } from '../../actions';
3
+ import { show, prefixMail, prefixTel } from '../../actions';
4
4
 
5
5
  import Panel from '../Panel';
6
6
  import RadioGroup from '../RadioGroup';
7
7
  import NodeSelector from '../NodeSelector';
8
8
  import InputField from '../InputField';
9
9
  import Checkbox from '../Checkbox';
10
+ import getSavedValue from './api/getSavedValue';
10
11
 
11
- const values = window.CONFIG_VALUES || {};
12
12
  const dispatch = createEventDispatcher();
13
13
 
14
14
  export let heading;
@@ -17,20 +17,7 @@
17
17
  export let required = false;
18
18
  export let types = ['internal', 'external', 'file'];
19
19
  export let value;
20
-
21
- if (!value || Object.keys(value).length === 0) {
22
- value = {
23
- type: types[0],
24
- newWindow: false,
25
- value: undefined,
26
- };
27
- }
28
-
29
- if (name) {
30
- value.type = values[`${name}Type`] || value.type;
31
- value.newWindow = values[`${name}NewWindow`] || value.newWindow;
32
- value.value = values[`${name}Value`] || value.value;
33
- }
20
+ value = getSavedValue({ value, name, types });
34
21
 
35
22
  let className = '';
36
23
  export { className as class };
@@ -39,20 +26,26 @@
39
26
  { label: 'Intern', value: 'internal' },
40
27
  { label: 'Extern', value: 'external' },
41
28
  { label: 'Fil', value: 'file' },
29
+ { label: 'E-post', value: 'mail' },
30
+ { label: 'Telefonnummer', value: 'tel' },
42
31
  ].filter((type) => types.includes(type.value));
43
32
 
44
33
  $: isInternal = value.type === 'internal';
45
34
  $: isExternal = value.type === 'external';
46
35
  $: isFile = value.type === 'file';
36
+ $: isMail = value.type === 'mail';
37
+ $: isTel = value.type === 'tel';
47
38
 
48
39
  const selected = {
49
40
  internal: value.type === 'internal' ? value.value : '',
50
41
  external: value.type === 'external' ? value.value : '',
51
42
  file: value.type === 'file' ? value.value : '',
43
+ mail: value.type === 'mail' ? value.value : '',
44
+ tel: value.type === 'tel' ? value.value : '',
52
45
  };
53
46
 
54
47
  const onChange = () => {
55
- value.value = selected[value.type];
48
+ value.value = selected[value.type] || '';
56
49
  dispatch('input', value);
57
50
  dispatch('change', value);
58
51
  };
@@ -104,7 +97,30 @@
104
97
  required={required && isFile}
105
98
  />
106
99
  </div>
100
+
101
+ <div class="sr-label form-group form-group--mail" use:show={isMail}>
102
+ <InputField
103
+ bind:value={selected.mail}
104
+ {disabled}
105
+ label="E-post"
106
+ action={prefixMail}
107
+ on:change={onChange}
108
+ required={required && isMail}
109
+ />
110
+ </div>
111
+ <div class="sr-label form-group form-group--tel" use:show={isTel}>
112
+ <InputField
113
+ bind:value={selected.tel}
114
+ {disabled}
115
+ label="Telefonnummer"
116
+ type="tel"
117
+ action={prefixTel}
118
+ on:change={onChange}
119
+ required={required && isTel}
120
+ />
121
+ </div>
107
122
  <Checkbox
123
+ class="form-group--new-window"
108
124
  bind:value={value.newWindow}
109
125
  name={name ? `${name}NewWindow` : ''}
110
126
  {disabled}
@@ -114,7 +130,7 @@
114
130
  <slot name="bottom" />
115
131
  </Panel>
116
132
 
117
- <style>
133
+ <style lang="scss">
118
134
  .sr-label :global(label),
119
135
  .sr-legend :global(legend) {
120
136
  position: absolute;
@@ -127,7 +143,11 @@
127
143
  clip: rect(0, 0, 0, 0);
128
144
  }
129
145
 
130
- .form-group--external :global(.form-control-feedback) {
131
- top: 0;
146
+ .form-group--external,
147
+ .form-group--mail,
148
+ .form-group--tel {
149
+ :global(.form-control-feedback) {
150
+ top: 0;
151
+ }
132
152
  }
133
153
  </style>
@@ -27,7 +27,7 @@ export let disabled = false;
27
27
  // If control is required.
28
28
  export let required = false;
29
29
  // What types of links to be selectable, must provide at least one.
30
- export let types = ['internal', 'external', 'file'];
30
+ export let types = ['internal', 'external', 'file', 'mail', 'tel'];
31
31
  // Used if bound to value.
32
32
  export let value;
33
33
  ```
@@ -40,7 +40,7 @@ Top and bottom slots before and after link selector.
40
40
  heading="Knapp"
41
41
  disabled={!showLink}
42
42
  >
43
- <div slot="top">
43
+ <svelte:fragment slot="top">
44
44
  <Checkbox
45
45
  name="showLink"
46
46
  bind:value={showLink}
@@ -52,10 +52,10 @@ Top and bottom slots before and after link selector.
52
52
  label="Text"
53
53
  disabled={!showLink}
54
54
  />
55
- </div>
56
- <div slot="bottom">
55
+ </svelte:fragment>
56
+ <svelte:fragment slot="bottom">
57
57
  <p class="help-block">Hjälptext...</p>
58
- </div>
58
+ </svelte:fragment>
59
59
  </LinkSelector>
60
60
  ```
61
61
 
@@ -0,0 +1,19 @@
1
+ const getDefaultValue = (types) => ({
2
+ type: types[0],
3
+ newWindow: false,
4
+ value: '',
5
+ });
6
+
7
+ export default function getSavedValue({ value, name, types }) {
8
+ const values = window.CONFIG_VALUES || {};
9
+
10
+ return {
11
+ ...getDefaultValue(types),
12
+ ...value,
13
+ ...(name ? {
14
+ type: values[`${name}Type`],
15
+ newWindow: values[`${name}NewWindow`],
16
+ value: values[`${name}Value`],
17
+ } : {}),
18
+ };
19
+ }
@@ -72,4 +72,8 @@
72
72
  background-color: #fff;
73
73
  border-left: none;
74
74
  }
75
+
76
+ .form-group input.form-control {
77
+ text-align: left;
78
+ }
75
79
  </style>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soleil-se/config-svelte",
3
- "version": "1.1.2",
3
+ "version": "1.2.1",
4
4
  "main": "./index.js",
5
5
  "module": "./index.js",
6
6
  "svelte": "./index.js",
@@ -1,10 +0,0 @@
1
- export default function httpPrefix(node) {
2
- const addPrefix = () => {
3
- const { type, value } = node;
4
- if (type === 'url' && value && !/^(https?):\/\//i.test(value) && ('http://'.indexOf(value) === -1 && 'https://'.indexOf(value) === -1)) {
5
- /* eslint-disable-next-line no-param-reassign */
6
- node.value = `https://${value}`;
7
- }
8
- };
9
- node.addEventListener('input', addPrefix);
10
- }