@refinitiv-ui/elements 7.0.0 → 7.0.2
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 +195 -449
- package/LICENSE +2 -2
- package/README.md +12 -10
- package/cli.mjs +5 -3
- package/lib/accordion/index.d.ts +1 -1
- package/lib/accordion/index.js +4 -7
- package/lib/appstate-bar/index.d.ts +2 -2
- package/lib/appstate-bar/index.js +10 -4
- package/lib/autosuggest/index.d.ts +7 -7
- package/lib/autosuggest/index.js +80 -80
- package/lib/autosuggest/themes/solar/charcoal/index.js +1 -1
- package/lib/autosuggest/themes/solar/pearl/index.js +1 -1
- package/lib/button/index.js +7 -10
- package/lib/button-bar/index.d.ts +1 -1
- package/lib/button-bar/index.js +12 -12
- package/lib/calendar/index.d.ts +39 -39
- package/lib/calendar/index.js +156 -123
- package/lib/calendar/utils.js +1 -1
- package/lib/canvas/index.d.ts +1 -1
- package/lib/canvas/index.js +2 -4
- package/lib/card/helpers/types.d.ts +2 -2
- package/lib/card/index.d.ts +5 -5
- package/lib/card/index.js +34 -28
- package/lib/chart/elements/chart.d.ts +4 -4
- package/lib/chart/elements/chart.js +39 -33
- package/lib/chart/plugins/doughnut-center-label.d.ts +3 -3
- package/lib/chart/plugins/doughnut-center-label.js +13 -9
- package/lib/checkbox/index.d.ts +1 -1
- package/lib/checkbox/index.js +12 -13
- package/lib/clock/index.d.ts +55 -55
- package/lib/clock/index.js +84 -95
- package/lib/clock/themes/halo/dark/index.js +1 -1
- package/lib/clock/themes/halo/light/index.js +1 -1
- package/lib/clock/themes/solar/charcoal/index.js +1 -1
- package/lib/clock/themes/solar/pearl/index.js +1 -1
- package/lib/collapse/index.d.ts +1 -1
- package/lib/collapse/index.js +27 -18
- package/lib/collapse/themes/halo/dark/index.js +1 -1
- package/lib/collapse/themes/halo/light/index.js +1 -1
- package/lib/color-dialog/elements/color-palettes.d.ts +1 -1
- package/lib/color-dialog/elements/color-palettes.js +5 -6
- package/lib/color-dialog/elements/grayscale-palettes.d.ts +1 -1
- package/lib/color-dialog/elements/grayscale-palettes.js +9 -9
- package/lib/color-dialog/elements/palettes.js +5 -4
- package/lib/color-dialog/helpers/value-model.js +7 -9
- package/lib/color-dialog/index.d.ts +6 -6
- package/lib/color-dialog/index.js +53 -37
- package/lib/color-picker/index.d.ts +2 -2
- package/lib/color-picker/index.js +40 -34
- package/lib/combo-box/helpers/filter.d.ts +2 -2
- package/lib/combo-box/helpers/types.d.ts +1 -1
- package/lib/combo-box/index.d.ts +9 -9
- package/lib/combo-box/index.js +61 -55
- package/lib/configuration/elements/configuration.js +2 -2
- package/lib/counter/index.d.ts +4 -4
- package/lib/counter/index.js +9 -7
- package/lib/datetime-field/index.d.ts +4 -5
- package/lib/datetime-field/index.js +32 -23
- package/lib/datetime-field/utils.js +11 -1
- package/lib/datetime-picker/index.d.ts +75 -75
- package/lib/datetime-picker/index.js +150 -131
- package/lib/datetime-picker/locales.js +5 -5
- package/lib/datetime-picker/utils.js +9 -9
- package/lib/dialog/draggable-element.js +1 -2
- package/lib/dialog/index.d.ts +5 -5
- package/lib/dialog/index.js +51 -47
- package/lib/email-field/index.d.ts +1 -1
- package/lib/email-field/index.js +6 -6
- package/lib/events.d.ts +1 -1
- package/lib/flag/index.d.ts +1 -1
- package/lib/flag/index.js +6 -5
- package/lib/flag/utils/FlagLoader.js +1 -1
- package/lib/header/index.d.ts +1 -1
- package/lib/header/index.js +2 -2
- package/lib/header/themes/halo/dark/index.js +1 -1
- package/lib/header/themes/halo/light/index.js +1 -1
- package/lib/header/themes/solar/charcoal/index.js +1 -1
- package/lib/header/themes/solar/pearl/index.js +1 -1
- package/lib/heatmap/helpers/color.d.ts +1 -1
- package/lib/heatmap/helpers/color.js +11 -5
- package/lib/heatmap/helpers/track.js +3 -3
- package/lib/heatmap/index.d.ts +9 -9
- package/lib/heatmap/index.js +51 -42
- package/lib/icon/index.d.ts +2 -2
- package/lib/icon/index.js +8 -10
- package/lib/interactive-chart/helpers/types.d.ts +3 -3
- package/lib/interactive-chart/index.d.ts +29 -29
- package/lib/interactive-chart/index.js +69 -55
- package/lib/item/helpers/types.d.ts +1 -1
- package/lib/item/index.d.ts +3 -3
- package/lib/item/index.js +24 -20
- package/lib/jsx.d.ts +6 -4
- package/lib/label/index.d.ts +1 -1
- package/lib/label/index.js +10 -7
- package/lib/layout/index.d.ts +7 -7
- package/lib/layout/index.js +7 -7
- package/lib/led-gauge/index.d.ts +1 -1
- package/lib/led-gauge/index.js +10 -10
- package/lib/list/elements/list.d.ts +3 -3
- package/lib/list/elements/list.js +10 -12
- package/lib/list/helpers/renderer.js +2 -2
- package/lib/list/helpers/types.d.ts +1 -1
- package/lib/list/index.d.ts +1 -1
- package/lib/list/renderer.d.ts +7 -7
- package/lib/loader/index.js +7 -8
- package/lib/multi-input/index.d.ts +6 -6
- package/lib/multi-input/index.js +39 -45
- package/lib/notification/elements/notification-tray.d.ts +2 -2
- package/lib/notification/elements/notification-tray.js +3 -3
- package/lib/notification/elements/notification.d.ts +2 -2
- package/lib/notification/elements/notification.js +14 -13
- package/lib/notification/helpers/status.js +1 -1
- package/lib/notification/themes/halo/dark/index.js +1 -1
- package/lib/notification/themes/halo/light/index.js +1 -1
- package/lib/notification/themes/solar/charcoal/index.js +1 -1
- package/lib/notification/themes/solar/pearl/index.js +1 -1
- package/lib/number-field/index.d.ts +5 -6
- package/lib/number-field/index.js +37 -47
- package/lib/overlay/elements/overlay-viewport.d.ts +1 -1
- package/lib/overlay/elements/overlay.d.ts +2 -2
- package/lib/overlay/elements/overlay.js +152 -96
- package/lib/overlay/helpers/types.d.ts +1 -1
- package/lib/overlay/managers/backdrop-manager.d.ts +1 -1
- package/lib/overlay/managers/backdrop-manager.js +2 -2
- package/lib/overlay/managers/close-manager.js +2 -1
- package/lib/overlay/managers/focus-manager.js +23 -13
- package/lib/overlay/managers/interaction-lock-manager.d.ts +4 -4
- package/lib/overlay/managers/interaction-lock-manager.js +33 -25
- package/lib/overlay/managers/viewport-manager.d.ts +2 -2
- package/lib/overlay/managers/viewport-manager.js +3 -2
- package/lib/overlay/managers/zindex-manager.js +4 -2
- package/lib/overlay-menu/helpers/types.d.ts +2 -2
- package/lib/overlay-menu/index.d.ts +1 -1
- package/lib/overlay-menu/index.js +44 -33
- package/lib/overlay-menu/managers/menu-manager.d.ts +10 -10
- package/lib/overlay-menu/managers/menu-manager.js +14 -13
- package/lib/pagination/index.d.ts +4 -4
- package/lib/pagination/index.js +39 -14
- package/lib/panel/index.js +1 -1
- package/lib/password-field/index.d.ts +2 -2
- package/lib/password-field/index.js +3 -3
- package/lib/pill/index.d.ts +1 -1
- package/lib/pill/index.js +22 -19
- package/lib/progress-bar/index.d.ts +1 -1
- package/lib/progress-bar/index.js +38 -37
- package/lib/radio-button/index.d.ts +2 -2
- package/lib/radio-button/index.js +17 -12
- package/lib/radio-button/radio-button-registry.js +8 -5
- package/lib/rating/index.d.ts +1 -1
- package/lib/rating/index.js +2 -5
- package/lib/rating/utils.d.ts +6 -6
- package/lib/rating/utils.js +6 -6
- package/lib/search-field/index.d.ts +2 -2
- package/lib/search-field/index.js +4 -4
- package/lib/select/index.d.ts +34 -34
- package/lib/select/index.js +68 -81
- package/lib/sidebar-layout/index.d.ts +2 -2
- package/lib/sidebar-layout/index.js +7 -9
- package/lib/slider/index.d.ts +2 -2
- package/lib/slider/index.js +57 -45
- package/lib/slider/utils.d.ts +10 -10
- package/lib/slider/utils.js +10 -10
- package/lib/sparkline/index.d.ts +1 -1
- package/lib/sparkline/index.js +7 -8
- package/lib/swing-gauge/helpers.js +2 -2
- package/lib/swing-gauge/index.d.ts +19 -19
- package/lib/swing-gauge/index.js +91 -81
- package/lib/tab/index.d.ts +1 -1
- package/lib/tab/index.js +16 -27
- package/lib/tab/themes/halo/dark/index.js +1 -1
- package/lib/tab/themes/halo/light/index.js +1 -1
- package/lib/tab/themes/solar/charcoal/index.js +1 -1
- package/lib/tab/themes/solar/pearl/index.js +1 -1
- package/lib/tab-bar/helpers/animate.js +1 -1
- package/lib/tab-bar/index.d.ts +1 -1
- package/lib/tab-bar/index.js +34 -18
- package/lib/tab-bar/themes/halo/dark/index.js +1 -1
- package/lib/tab-bar/themes/halo/light/index.js +1 -1
- package/lib/text-field/index.d.ts +1 -1
- package/lib/text-field/index.js +34 -31
- package/lib/time-picker/index.d.ts +6 -6
- package/lib/time-picker/index.js +103 -89
- package/lib/toggle/index.d.ts +1 -1
- package/lib/toggle/index.js +4 -3
- package/lib/toggle/themes/halo/dark/index.js +1 -1
- package/lib/toggle/themes/halo/light/index.js +1 -1
- package/lib/toggle/themes/solar/charcoal/index.js +1 -1
- package/lib/toggle/themes/solar/pearl/index.js +1 -1
- package/lib/tooltip/elements/title-tooltip.js +2 -2
- package/lib/tooltip/index.d.ts +27 -27
- package/lib/tooltip/index.js +42 -38
- package/lib/tooltip/managers/tooltip-manager.d.ts +1 -1
- package/lib/tornado-chart/elements/tornado-chart.d.ts +1 -1
- package/lib/tornado-chart/elements/tornado-chart.js +2 -2
- package/lib/tornado-chart/elements/tornado-item.d.ts +2 -2
- package/lib/tornado-chart/elements/tornado-item.js +12 -10
- package/lib/tree/elements/tree-item.d.ts +3 -3
- package/lib/tree/elements/tree-item.js +21 -19
- package/lib/tree/elements/tree.d.ts +1 -1
- package/lib/tree/elements/tree.js +12 -11
- package/lib/tree/helpers/renderer.js +4 -3
- package/lib/tree/index.d.ts +1 -1
- package/lib/tree/managers/tree-manager.d.ts +1 -1
- package/lib/tree/managers/tree-manager.js +17 -18
- package/lib/tree/themes/solar/charcoal/index.js +1 -1
- package/lib/tree/themes/solar/pearl/index.js +1 -1
- package/lib/tree-select/index.d.ts +9 -9
- package/lib/tree-select/index.js +91 -82
- package/lib/tree-select/themes/halo/dark/index.js +1 -1
- package/lib/tree-select/themes/halo/light/index.js +1 -1
- package/lib/tree-select/themes/solar/charcoal/index.js +1 -1
- package/lib/tree-select/themes/solar/pearl/index.js +1 -1
- package/lib/version.js +1 -1
- package/package.json +17 -17
- package/tsconfig.tsbuildinfo +1 -1
package/lib/select/index.js
CHANGED
|
@@ -1,31 +1,25 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { ControlElement,
|
|
2
|
+
import { ControlElement, FocusedPropertyKey, css, html } from '@refinitiv-ui/core';
|
|
3
3
|
import { customElement } from '@refinitiv-ui/core/decorators/custom-element.js';
|
|
4
4
|
import { property } from '@refinitiv-ui/core/decorators/property.js';
|
|
5
|
-
import { styleMap } from '@refinitiv-ui/core/directives/style-map.js';
|
|
6
5
|
import { createRef, ref } from '@refinitiv-ui/core/directives/ref.js';
|
|
7
|
-
import {
|
|
8
|
-
import '
|
|
9
|
-
import '../item/index.js';
|
|
10
|
-
import '../icon/index.js';
|
|
11
|
-
import { Item } from '../item/index.js';
|
|
6
|
+
import { styleMap } from '@refinitiv-ui/core/directives/style-map.js';
|
|
7
|
+
import { AnimationTaskRunner, TimeoutTaskRunner } from '@refinitiv-ui/utils/async.js';
|
|
12
8
|
import { CollectionComposer } from '@refinitiv-ui/utils/collection.js';
|
|
13
|
-
import { TimeoutTaskRunner, AnimationTaskRunner } from '@refinitiv-ui/utils/async.js';
|
|
14
9
|
import { isElementOverflown } from '@refinitiv-ui/utils/element.js';
|
|
10
|
+
import '../icon/index.js';
|
|
11
|
+
import '../item/index.js';
|
|
12
|
+
import { Item } from '../item/index.js';
|
|
13
|
+
import '../overlay/index.js';
|
|
15
14
|
import { registerOverflowTooltip } from '../tooltip/index.js';
|
|
15
|
+
import { VERSION } from '../version.js';
|
|
16
16
|
// Observer config for items
|
|
17
17
|
const observerOptions = {
|
|
18
18
|
subtree: true,
|
|
19
19
|
childList: true,
|
|
20
20
|
attributes: true,
|
|
21
21
|
characterData: true,
|
|
22
|
-
attributeFilter: [
|
|
23
|
-
'label',
|
|
24
|
-
'value',
|
|
25
|
-
'selected',
|
|
26
|
-
'disabled',
|
|
27
|
-
'readonly'
|
|
28
|
-
]
|
|
22
|
+
attributeFilter: ['label', 'value', 'selected', 'disabled', 'readonly']
|
|
29
23
|
};
|
|
30
24
|
// the same event listener options should be used with both addEventListener() & removeEventListener()
|
|
31
25
|
// https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener#matching_event_listeners_for_removal
|
|
@@ -67,20 +61,20 @@ let Select = class Select extends ControlElement {
|
|
|
67
61
|
this.keySearchThrottler = new TimeoutTaskRunner(KEY_SEARCH_DEBOUNCER);
|
|
68
62
|
this.resizeThrottler = new AnimationTaskRunner();
|
|
69
63
|
/**
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
* Placeholder to display when no value is set
|
|
65
|
+
*/
|
|
72
66
|
this.placeholder = '';
|
|
73
67
|
/**
|
|
74
|
-
|
|
75
|
-
|
|
68
|
+
* Toggles the opened state of the list
|
|
69
|
+
*/
|
|
76
70
|
this.opened = false;
|
|
77
71
|
/**
|
|
78
|
-
|
|
79
|
-
|
|
72
|
+
* Set state to error
|
|
73
|
+
*/
|
|
80
74
|
this.error = false;
|
|
81
75
|
/**
|
|
82
|
-
|
|
83
|
-
|
|
76
|
+
* Set state to warning
|
|
77
|
+
*/
|
|
84
78
|
this.warning = false;
|
|
85
79
|
/**
|
|
86
80
|
* This variable is here to ensure that the value and data are in sync when data is set after the value.
|
|
@@ -104,8 +98,7 @@ let Select = class Select extends ControlElement {
|
|
|
104
98
|
* @returns {void}
|
|
105
99
|
*/
|
|
106
100
|
this.handleMutations = (mutations) => {
|
|
107
|
-
const hasLightDomMutations = mutations
|
|
108
|
-
.some(m => m.target.getRootNode() !== this.shadowRoot);
|
|
101
|
+
const hasLightDomMutations = mutations.some((m) => m.target.getRootNode() !== this.shadowRoot);
|
|
109
102
|
if (hasLightDomMutations) {
|
|
110
103
|
this.requestUpdate();
|
|
111
104
|
}
|
|
@@ -142,19 +135,19 @@ let Select = class Select extends ControlElement {
|
|
|
142
135
|
display: inline-block;
|
|
143
136
|
}
|
|
144
137
|
|
|
145
|
-
[part=label],
|
|
146
|
-
[part=placeholder] {
|
|
138
|
+
[part='label'],
|
|
139
|
+
[part='placeholder'] {
|
|
147
140
|
white-space: nowrap;
|
|
148
141
|
overflow: hidden;
|
|
149
142
|
text-overflow: ellipsis;
|
|
150
143
|
}
|
|
151
|
-
[part=icon] {
|
|
144
|
+
[part='icon'] {
|
|
152
145
|
flex: none;
|
|
153
146
|
}
|
|
154
|
-
:host [part=list] {
|
|
147
|
+
:host [part='list'] {
|
|
155
148
|
overflow-y: auto;
|
|
156
149
|
}
|
|
157
|
-
:host [part=
|
|
150
|
+
:host [part='list'] ::slotted(:not(ef-item)) {
|
|
158
151
|
display: none;
|
|
159
152
|
}
|
|
160
153
|
#box {
|
|
@@ -196,42 +189,42 @@ let Select = class Select extends ControlElement {
|
|
|
196
189
|
`;
|
|
197
190
|
}
|
|
198
191
|
/**
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
192
|
+
* Current text content of the selected value
|
|
193
|
+
* @readonly
|
|
194
|
+
*/
|
|
202
195
|
get label() {
|
|
203
196
|
return this.labels[0];
|
|
204
197
|
}
|
|
205
198
|
/**
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
199
|
+
* Current text content of the selected values
|
|
200
|
+
* @ignore
|
|
201
|
+
* @readonly
|
|
202
|
+
*/
|
|
210
203
|
get labels() {
|
|
211
204
|
if (this.hasDataItems()) {
|
|
212
|
-
return this.selectedDataItems.map(item => this.composer.getItemPropertyValue(item, 'label'));
|
|
205
|
+
return this.selectedDataItems.map((item) => this.composer.getItemPropertyValue(item, 'label'));
|
|
213
206
|
}
|
|
214
|
-
return this.selectedSlotItems.map(item => this.getItemLabel(item));
|
|
207
|
+
return this.selectedSlotItems.map((item) => this.getItemLabel(item));
|
|
215
208
|
}
|
|
216
209
|
/**
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
210
|
+
* Switch to multiple select input
|
|
211
|
+
* @ignore
|
|
212
|
+
* @param multiple True if element needs to support multi selection
|
|
213
|
+
*/
|
|
221
214
|
set multiple(multiple) {
|
|
222
215
|
// TODO: not implemented
|
|
223
216
|
}
|
|
224
217
|
/**
|
|
225
|
-
|
|
226
|
-
|
|
218
|
+
* @ignore
|
|
219
|
+
*/
|
|
227
220
|
get multiple() {
|
|
228
221
|
return false;
|
|
229
222
|
}
|
|
230
223
|
/**
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
224
|
+
* Construct the menu from data object. Cannot be used with slotted content
|
|
225
|
+
* @type {SelectData | null}
|
|
226
|
+
* @default null
|
|
227
|
+
*/
|
|
235
228
|
get data() {
|
|
236
229
|
return this._data;
|
|
237
230
|
}
|
|
@@ -255,10 +248,10 @@ let Select = class Select extends ControlElement {
|
|
|
255
248
|
this.requestUpdate('data', oldValue);
|
|
256
249
|
}
|
|
257
250
|
/**
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
251
|
+
* Value of the element
|
|
252
|
+
* @param value Element value
|
|
253
|
+
* @default -
|
|
254
|
+
*/
|
|
262
255
|
set value(value) {
|
|
263
256
|
value = this.castValue(value);
|
|
264
257
|
this.cachedValue = value;
|
|
@@ -282,9 +275,9 @@ let Select = class Select extends ControlElement {
|
|
|
282
275
|
*/
|
|
283
276
|
get values() {
|
|
284
277
|
if (this.hasDataItems()) {
|
|
285
|
-
return this.selectedDataItems.map(item => this.composer.getItemPropertyValue(item, 'value'));
|
|
278
|
+
return this.selectedDataItems.map((item) => this.composer.getItemPropertyValue(item, 'value'));
|
|
286
279
|
}
|
|
287
|
-
return this.selectedSlotItems.map(item => this.getItemValue(item));
|
|
280
|
+
return this.selectedSlotItems.map((item) => this.getItemValue(item));
|
|
288
281
|
}
|
|
289
282
|
/**
|
|
290
283
|
* Called when connected to DOM
|
|
@@ -301,7 +294,8 @@ let Select = class Select extends ControlElement {
|
|
|
301
294
|
* @returns {void}
|
|
302
295
|
*/
|
|
303
296
|
update(changedProperties) {
|
|
304
|
-
this.cachedValue =
|
|
297
|
+
this.cachedValue =
|
|
298
|
+
''; /* reset cached value as it is only valid when value and data are set the same time */
|
|
305
299
|
const focusedChanged = changedProperties.has(FocusedPropertyKey);
|
|
306
300
|
// the opened logic is bound to focus state
|
|
307
301
|
if (focusedChanged) {
|
|
@@ -333,7 +327,7 @@ let Select = class Select extends ControlElement {
|
|
|
333
327
|
firstUpdated(changedProperties) {
|
|
334
328
|
super.firstUpdated(changedProperties);
|
|
335
329
|
this.addEventListener('keydown', this.onKeyDown); /* keydown when select is closed */
|
|
336
|
-
registerOverflowTooltip(this, () => this.labelText, () => this.labelRef.value ? isElementOverflown(this.labelRef.value) : false);
|
|
330
|
+
registerOverflowTooltip(this, () => this.labelText, () => (this.labelRef.value ? isElementOverflown(this.labelRef.value) : false));
|
|
337
331
|
}
|
|
338
332
|
/**
|
|
339
333
|
* Called when element finished updating
|
|
@@ -403,7 +397,8 @@ let Select = class Select extends ControlElement {
|
|
|
403
397
|
// this code might happen only when opened has been set during initialisation
|
|
404
398
|
// or when display is set to none
|
|
405
399
|
this.resizeThrottler.schedule(() => {
|
|
406
|
-
if (this.offsetWidth) {
|
|
400
|
+
if (this.offsetWidth) {
|
|
401
|
+
/* must be here to avoid infinitive loop */
|
|
407
402
|
this.restrictPopupWidth();
|
|
408
403
|
this.requestUpdate();
|
|
409
404
|
}
|
|
@@ -594,10 +589,7 @@ let Select = class Select extends ControlElement {
|
|
|
594
589
|
*/
|
|
595
590
|
isValidFilterKey(event) {
|
|
596
591
|
// all printable keys have length of 1. This is better than regexp as we cover all non latin characters
|
|
597
|
-
return event.key.length === 1
|
|
598
|
-
&& !event.ctrlKey
|
|
599
|
-
&& !event.altKey
|
|
600
|
-
&& !event.metaKey;
|
|
592
|
+
return event.key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey;
|
|
601
593
|
}
|
|
602
594
|
/**
|
|
603
595
|
* Focus and highlight element according to specified direction
|
|
@@ -669,7 +661,7 @@ let Select = class Select extends ControlElement {
|
|
|
669
661
|
let selectableElements = this.getSelectableElements();
|
|
670
662
|
const highlightedIdx = this.highlightedItem ? selectableElements.indexOf(this.highlightedItem) : -1;
|
|
671
663
|
selectableElements = selectableElements.concat(selectableElements.splice(0, highlightedIdx));
|
|
672
|
-
const focusElement = selectableElements.find(item => {
|
|
664
|
+
const focusElement = selectableElements.find((item) => {
|
|
673
665
|
const label = this.getItemLabel(item).toLowerCase();
|
|
674
666
|
return label.startsWith(this.keySearchTerm) && item !== this.highlightedItem;
|
|
675
667
|
});
|
|
@@ -732,7 +724,7 @@ let Select = class Select extends ControlElement {
|
|
|
732
724
|
* @returns A list of selected elements
|
|
733
725
|
*/
|
|
734
726
|
getSelectedElements() {
|
|
735
|
-
return this.getSelectableElements().filter(item => item.selected);
|
|
727
|
+
return this.getSelectableElements().filter((item) => item.selected);
|
|
736
728
|
}
|
|
737
729
|
/**
|
|
738
730
|
* Clears the current selected items
|
|
@@ -743,7 +735,7 @@ let Select = class Select extends ControlElement {
|
|
|
743
735
|
this.selectedDataItems.forEach((item) => this.composer.setItemPropertyValue(item, 'selected', false));
|
|
744
736
|
}
|
|
745
737
|
else {
|
|
746
|
-
this.selectedSlotItems.forEach(item => {
|
|
738
|
+
this.selectedSlotItems.forEach((item) => {
|
|
747
739
|
item.selected = false;
|
|
748
740
|
});
|
|
749
741
|
}
|
|
@@ -855,11 +847,7 @@ let Select = class Select extends ControlElement {
|
|
|
855
847
|
case 'divider':
|
|
856
848
|
return html `<ef-item role="presentation" part="item" type="divider"></ef-item>`;
|
|
857
849
|
case 'header':
|
|
858
|
-
return html `<ef-item
|
|
859
|
-
role="presentation"
|
|
860
|
-
part="item"
|
|
861
|
-
type="header"
|
|
862
|
-
.label=${item.label}></ef-item>`;
|
|
850
|
+
return html `<ef-item role="presentation" part="item" type="header" .label=${item.label}></ef-item>`;
|
|
863
851
|
// no default
|
|
864
852
|
}
|
|
865
853
|
return html `<ef-item
|
|
@@ -904,11 +892,11 @@ let Select = class Select extends ControlElement {
|
|
|
904
892
|
* Get data iterator template
|
|
905
893
|
*/
|
|
906
894
|
get dataContent() {
|
|
907
|
-
return html `${this.composer.queryItems(() => true).map(item => this.toItem(item))}`;
|
|
895
|
+
return html `${this.composer.queryItems(() => true).map((item) => this.toItem(item))}`;
|
|
908
896
|
}
|
|
909
897
|
/**
|
|
910
|
-
|
|
911
|
-
|
|
898
|
+
* Edit template when select is not readonly or disabled
|
|
899
|
+
*/
|
|
912
900
|
get popupTemplate() {
|
|
913
901
|
if (this.lazyRendered) {
|
|
914
902
|
return html `<ef-overlay
|
|
@@ -929,7 +917,9 @@ let Select = class Select extends ControlElement {
|
|
|
929
917
|
@opened-changed="${this.onPopupOpenedChanged}"
|
|
930
918
|
@opened="${this.onPopupOpened}"
|
|
931
919
|
@refit=${this.onPopupRefit}
|
|
932
|
-
@closed="${this.onPopupClosed}"
|
|
920
|
+
@closed="${this.onPopupClosed}"
|
|
921
|
+
>${this.hasDataItems() ? this.dataContent : this.slottedContent}</ef-overlay
|
|
922
|
+
>`;
|
|
933
923
|
}
|
|
934
924
|
else {
|
|
935
925
|
// This code is required because IE11 polyfill need items to be within a slot
|
|
@@ -943,14 +933,11 @@ let Select = class Select extends ControlElement {
|
|
|
943
933
|
* @return Render template
|
|
944
934
|
*/
|
|
945
935
|
render() {
|
|
946
|
-
return html `
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
${this.placeholderHidden() ? this.labelTemplate : this.placeholderTemplate}
|
|
936
|
+
return html ` <div id="box">
|
|
937
|
+
<div id="text">${this.placeholderHidden() ? this.labelTemplate : this.placeholderTemplate}</div>
|
|
938
|
+
<ef-icon icon="down" part="icon"></ef-icon>
|
|
950
939
|
</div>
|
|
951
|
-
|
|
952
|
-
</div>
|
|
953
|
-
${this.editTemplate}`;
|
|
940
|
+
${this.editTemplate}`;
|
|
954
941
|
}
|
|
955
942
|
};
|
|
956
943
|
__decorate([
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { JSXInterface } from '../jsx';
|
|
2
|
-
import { BasicElement,
|
|
3
|
-
import type { Layout } from '../layout';
|
|
2
|
+
import { BasicElement, CSSResultGroup, PropertyValues, TemplateResult } from '@refinitiv-ui/core';
|
|
4
3
|
import '../layout/index.js';
|
|
4
|
+
import type { Layout } from '../layout';
|
|
5
5
|
/**
|
|
6
6
|
* Provides an app layout with sidebar.
|
|
7
7
|
* There are 4 sections that can be slotted a component in.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { BasicElement,
|
|
2
|
+
import { BasicElement, css, html, nothing } from '@refinitiv-ui/core';
|
|
3
3
|
import { customElement } from '@refinitiv-ui/core/decorators/custom-element.js';
|
|
4
4
|
import { property } from '@refinitiv-ui/core/decorators/property.js';
|
|
5
5
|
import { query } from '@refinitiv-ui/core/decorators/query.js';
|
|
6
|
-
import { VERSION } from '../version.js';
|
|
7
6
|
import '../layout/index.js';
|
|
7
|
+
import { VERSION } from '../version.js';
|
|
8
8
|
/**
|
|
9
9
|
* Provides an app layout with sidebar.
|
|
10
10
|
* There are 4 sections that can be slotted a component in.
|
|
@@ -45,7 +45,7 @@ let SidebarLayout = class SidebarLayout extends BasicElement {
|
|
|
45
45
|
display: block;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
[part=container] {
|
|
48
|
+
[part='container'] {
|
|
49
49
|
height: 100%;
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -58,16 +58,16 @@ let SidebarLayout = class SidebarLayout extends BasicElement {
|
|
|
58
58
|
height: 100%;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
[part=sidebar] {
|
|
61
|
+
[part='sidebar'] {
|
|
62
62
|
width: var(--sidebar-width);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
:host([collapsed]:not([sidebar-position])) [part=sidebar],
|
|
66
|
-
:host([collapsed][sidebar-position=left]) [part=sidebar] {
|
|
65
|
+
:host([collapsed]:not([sidebar-position])) [part='sidebar'],
|
|
66
|
+
:host([collapsed][sidebar-position='left']) [part='sidebar'] {
|
|
67
67
|
margin-left: calc(var(--sidebar-width) * -1);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
:host([collapsed][sidebar-position=right]) [part=sidebar] {
|
|
70
|
+
:host([collapsed][sidebar-position='right']) [part='sidebar'] {
|
|
71
71
|
margin-right: calc(var(--sidebar-width) * -1);
|
|
72
72
|
}
|
|
73
73
|
`;
|
|
@@ -80,7 +80,6 @@ let SidebarLayout = class SidebarLayout extends BasicElement {
|
|
|
80
80
|
render() {
|
|
81
81
|
return html `
|
|
82
82
|
<ef-layout flex nowrap part="container">
|
|
83
|
-
|
|
84
83
|
<ef-layout flex container part="sidebar" size="${this.sidebarWidth || nothing}">
|
|
85
84
|
<ef-layout size="auto">
|
|
86
85
|
<slot name="sidebar-header"></slot>
|
|
@@ -98,7 +97,6 @@ let SidebarLayout = class SidebarLayout extends BasicElement {
|
|
|
98
97
|
<slot name="main-content"></slot>
|
|
99
98
|
</ef-layout>
|
|
100
99
|
</ef-layout>
|
|
101
|
-
|
|
102
100
|
</ef-layout>
|
|
103
101
|
`;
|
|
104
102
|
}
|
package/lib/slider/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { JSXInterface } from '../jsx';
|
|
2
|
-
import {
|
|
3
|
-
import { TranslateDirective } from '@refinitiv-ui/translate';
|
|
2
|
+
import { CSSResultGroup, ControlElement, PropertyValues, TemplateResult } from '@refinitiv-ui/core';
|
|
4
3
|
import '@refinitiv-ui/phrasebook/locale/en/slider.js';
|
|
4
|
+
import { TranslateDirective } from '@refinitiv-ui/translate';
|
|
5
5
|
import '../number-field/index.js';
|
|
6
6
|
/**
|
|
7
7
|
* Allows users to make selections from a range of values
|
package/lib/slider/index.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import {
|
|
2
|
+
import { ControlElement, WarningNotice, css, html, nothing } from '@refinitiv-ui/core';
|
|
3
3
|
import { customElement } from '@refinitiv-ui/core/decorators/custom-element.js';
|
|
4
4
|
import { property } from '@refinitiv-ui/core/decorators/property.js';
|
|
5
5
|
import { query } from '@refinitiv-ui/core/decorators/query.js';
|
|
6
6
|
import { state } from '@refinitiv-ui/core/decorators/state.js';
|
|
7
7
|
import { createRef, ref } from '@refinitiv-ui/core/directives/ref.js';
|
|
8
8
|
import { styleMap } from '@refinitiv-ui/core/directives/style-map.js';
|
|
9
|
-
import { translate } from '@refinitiv-ui/translate';
|
|
10
9
|
import '@refinitiv-ui/phrasebook/locale/en/slider.js';
|
|
11
|
-
import {
|
|
10
|
+
import { translate } from '@refinitiv-ui/translate';
|
|
12
11
|
import '../number-field/index.js';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
12
|
+
import { VERSION } from '../version.js';
|
|
13
|
+
import { Direction, SliderDataName } from './constants.js';
|
|
14
|
+
import { clamp, countDecimalPlace, isDecimalNumber, preventDefault } from './utils.js';
|
|
15
15
|
/**
|
|
16
16
|
* Allows users to make selections from a range of values
|
|
17
17
|
*
|
|
@@ -45,67 +45,67 @@ let Slider = class Slider extends ControlElement {
|
|
|
45
45
|
:host {
|
|
46
46
|
display: flex;
|
|
47
47
|
}
|
|
48
|
-
[part=slider-wrapper] {
|
|
48
|
+
[part='slider-wrapper'] {
|
|
49
49
|
position: relative;
|
|
50
50
|
width: 100%;
|
|
51
51
|
}
|
|
52
|
-
[part=slider] {
|
|
52
|
+
[part='slider'] {
|
|
53
53
|
width: 100%;
|
|
54
54
|
height: 100%;
|
|
55
55
|
display: inline-block;
|
|
56
56
|
}
|
|
57
|
-
:host(:not([disabled]):focus){
|
|
58
|
-
outline:none;
|
|
57
|
+
:host(:not([disabled]):focus) {
|
|
58
|
+
outline: none;
|
|
59
59
|
}
|
|
60
|
-
:host([show-steps]) [part=track-wrapper]::after {
|
|
61
|
-
display:block;
|
|
60
|
+
:host([show-steps]) [part='track-wrapper']::after {
|
|
61
|
+
display: block;
|
|
62
62
|
position: absolute;
|
|
63
|
-
content:
|
|
63
|
+
content: '';
|
|
64
64
|
right: 0;
|
|
65
65
|
}
|
|
66
|
-
[part=track-wrapper]{
|
|
67
|
-
content:
|
|
66
|
+
[part='track-wrapper'] {
|
|
67
|
+
content: '';
|
|
68
68
|
position: absolute;
|
|
69
69
|
width: 100%;
|
|
70
70
|
top: 50%;
|
|
71
71
|
left: 0;
|
|
72
72
|
pointer-events: none;
|
|
73
73
|
}
|
|
74
|
-
[part=thumb-container]{
|
|
74
|
+
[part='thumb-container'] {
|
|
75
75
|
outline: none;
|
|
76
76
|
position: absolute;
|
|
77
77
|
top: 0;
|
|
78
78
|
width: 100%;
|
|
79
79
|
z-index: 3;
|
|
80
80
|
}
|
|
81
|
-
[part=thumb]{
|
|
81
|
+
[part='thumb'] {
|
|
82
82
|
position: absolute;
|
|
83
83
|
margin: 0 auto;
|
|
84
84
|
}
|
|
85
|
-
[part=pin]{
|
|
85
|
+
[part='pin'] {
|
|
86
86
|
display: flex;
|
|
87
87
|
position: absolute;
|
|
88
88
|
align-items: center;
|
|
89
89
|
justify-content: center;
|
|
90
90
|
z-index: 1;
|
|
91
91
|
}
|
|
92
|
-
:host([show-steps]) [part=step-container]{
|
|
92
|
+
:host([show-steps]) [part='step-container'] {
|
|
93
93
|
position: absolute;
|
|
94
94
|
left: 0;
|
|
95
95
|
width: 100%;
|
|
96
96
|
}
|
|
97
|
-
:host([show-steps]) [part=step]{
|
|
97
|
+
:host([show-steps]) [part='step'] {
|
|
98
98
|
width: 100%;
|
|
99
99
|
position: absolute;
|
|
100
100
|
left: 0;
|
|
101
101
|
}
|
|
102
|
-
[part=track-fill]{
|
|
102
|
+
[part='track-fill'] {
|
|
103
103
|
z-index: 2;
|
|
104
|
-
content:
|
|
104
|
+
content: '';
|
|
105
105
|
position: absolute;
|
|
106
106
|
left: 0;
|
|
107
107
|
}
|
|
108
|
-
:host([show-steps][step=
|
|
108
|
+
:host([show-steps][step='0']) [part='track-wrapper']::after {
|
|
109
109
|
width: 0;
|
|
110
110
|
}
|
|
111
111
|
`;
|
|
@@ -299,19 +299,19 @@ let Slider = class Slider extends ControlElement {
|
|
|
299
299
|
this.changedThumb = null;
|
|
300
300
|
/**
|
|
301
301
|
* @ignore
|
|
302
|
-
|
|
302
|
+
*/
|
|
303
303
|
this.onDrag = this.onDrag.bind(this);
|
|
304
304
|
/**
|
|
305
305
|
* @ignore
|
|
306
|
-
|
|
306
|
+
*/
|
|
307
307
|
this.onDragStart = this.onDragStart.bind(this);
|
|
308
308
|
/**
|
|
309
309
|
* @ignore
|
|
310
|
-
|
|
310
|
+
*/
|
|
311
311
|
this.onDragEnd = this.onDragEnd.bind(this);
|
|
312
312
|
/**
|
|
313
313
|
* @ignore
|
|
314
|
-
|
|
314
|
+
*/
|
|
315
315
|
this.onKeyDown = this.onKeyDown.bind(this);
|
|
316
316
|
}
|
|
317
317
|
/**
|
|
@@ -332,8 +332,8 @@ let Slider = class Slider extends ControlElement {
|
|
|
332
332
|
*/
|
|
333
333
|
willUpdate(changedProperties) {
|
|
334
334
|
super.willUpdate(changedProperties);
|
|
335
|
-
if ((changedProperties.has('disabled') && changedProperties.get('disabled') !== undefined)
|
|
336
|
-
|
|
335
|
+
if ((changedProperties.has('disabled') && changedProperties.get('disabled') !== undefined) ||
|
|
336
|
+
(changedProperties.has('readonly') && changedProperties.get('readonly') !== undefined)) {
|
|
337
337
|
this.prepareSliderTrack();
|
|
338
338
|
}
|
|
339
339
|
changedProperties.forEach((_, changedProperty) => {
|
|
@@ -398,21 +398,21 @@ let Slider = class Slider extends ControlElement {
|
|
|
398
398
|
message = 'value should be more than min.';
|
|
399
399
|
}
|
|
400
400
|
else if (propName === 'from' && this.range) {
|
|
401
|
-
isValid =
|
|
401
|
+
isValid = this.fromNumber >= this.minNumber && this.fromNumber <= this.toNumber;
|
|
402
402
|
message = 'value should be more than min and less than to.';
|
|
403
403
|
}
|
|
404
404
|
else if (propName === 'to' && this.range) {
|
|
405
|
-
isValid =
|
|
405
|
+
isValid = this.toNumber <= this.maxNumber && this.toNumber >= this.fromNumber;
|
|
406
406
|
message = 'value should be less than max and more than from.';
|
|
407
407
|
}
|
|
408
408
|
else if (propName === 'step') {
|
|
409
|
-
isValid =
|
|
409
|
+
isValid = this.maxNumber - this.minNumber >= this.stepNumber;
|
|
410
410
|
message = 'value should be between min and max.';
|
|
411
411
|
}
|
|
412
412
|
else if (propName === 'minRange' && this.minRangeNumber > 0) {
|
|
413
413
|
const distanceFromTo = Math.abs(this.toNumber - this.fromNumber);
|
|
414
414
|
const distanceMinMax = Math.abs(this.maxNumber - this.minNumber);
|
|
415
|
-
isValid =
|
|
415
|
+
isValid = distanceMinMax >= this.minRangeNumber && distanceFromTo >= this.minRangeNumber;
|
|
416
416
|
message = 'value should be less than distance from and to, min and max.';
|
|
417
417
|
}
|
|
418
418
|
if (!isValid) {
|
|
@@ -439,8 +439,8 @@ let Slider = class Slider extends ControlElement {
|
|
|
439
439
|
}
|
|
440
440
|
}
|
|
441
441
|
else {
|
|
442
|
-
this.from = clamp(
|
|
443
|
-
this.to = clamp(
|
|
442
|
+
this.from = clamp(this.fromNumber || this.minNumber, this.minNumber, this.toNumber);
|
|
443
|
+
this.to = clamp(this.toNumber || this.maxNumber, this.fromNumber, this.maxNumber);
|
|
444
444
|
}
|
|
445
445
|
}
|
|
446
446
|
else {
|
|
@@ -677,7 +677,7 @@ let Slider = class Slider extends ControlElement {
|
|
|
677
677
|
shouldUpdate = this.isValueInBoundary(Number(value), '');
|
|
678
678
|
}
|
|
679
679
|
if (shouldUpdate) {
|
|
680
|
-
|
|
680
|
+
this[name] = value;
|
|
681
681
|
this.notifyPropertyChange(name, value);
|
|
682
682
|
}
|
|
683
683
|
else {
|
|
@@ -709,7 +709,7 @@ let Slider = class Slider extends ControlElement {
|
|
|
709
709
|
this.classList.add('grabbable');
|
|
710
710
|
if (this.range) {
|
|
711
711
|
const mousePosition = this.getMousePosition(event);
|
|
712
|
-
const relativeMousePosition = (
|
|
712
|
+
const relativeMousePosition = (this.maxNumber - this.minNumber) * mousePosition + this.minNumber;
|
|
713
713
|
const distanceFrom = Math.abs(relativeMousePosition - this.fromNumber);
|
|
714
714
|
const distanceTo = Math.abs(relativeMousePosition - this.toNumber);
|
|
715
715
|
if (distanceFrom < distanceTo) {
|
|
@@ -744,7 +744,9 @@ let Slider = class Slider extends ControlElement {
|
|
|
744
744
|
return 1;
|
|
745
745
|
}
|
|
746
746
|
// check drag desktop or mobile
|
|
747
|
-
const pageX = event.changedTouches
|
|
747
|
+
const pageX = event.changedTouches
|
|
748
|
+
? event.changedTouches[0].pageX
|
|
749
|
+
: event.pageX;
|
|
748
750
|
const positionSize = pageX - sliderRect.left;
|
|
749
751
|
if (positionSize <= sliderRect.width) {
|
|
750
752
|
return Math.min(Math.max((pageX - sliderRect.left) / sliderRect.width, 0), 1);
|
|
@@ -822,7 +824,7 @@ let Slider = class Slider extends ControlElement {
|
|
|
822
824
|
getNearestPossibleValue(thumbPosition) {
|
|
823
825
|
const stepSize = this.calculatePosition(this.minNumber + this.stepRange, 1);
|
|
824
826
|
const nearestValue = Math.round(thumbPosition / stepSize) * stepSize;
|
|
825
|
-
if (thumbPosition <= nearestValue +
|
|
827
|
+
if (thumbPosition <= nearestValue + stepSize / 2) {
|
|
826
828
|
if (nearestValue <= 1) {
|
|
827
829
|
return nearestValue;
|
|
828
830
|
}
|
|
@@ -950,11 +952,11 @@ let Slider = class Slider extends ControlElement {
|
|
|
950
952
|
// Check if value is in range
|
|
951
953
|
if (this.range) {
|
|
952
954
|
if (valueFor === SliderDataName.to) {
|
|
953
|
-
if (value <
|
|
955
|
+
if (value < this.fromNumber + this.minRangeNumber || value > this.maxNumber) {
|
|
954
956
|
return false;
|
|
955
957
|
}
|
|
956
958
|
}
|
|
957
|
-
else if (value < this.minNumber || value >
|
|
959
|
+
else if (value < this.minNumber || value > this.toNumber - this.minRangeNumber) {
|
|
958
960
|
return false;
|
|
959
961
|
}
|
|
960
962
|
}
|
|
@@ -1079,11 +1081,17 @@ let Slider = class Slider extends ControlElement {
|
|
|
1079
1081
|
*/
|
|
1080
1082
|
renderTrack(range) {
|
|
1081
1083
|
const stepContainerSize = this.calculatePosition(this.minNumber + this.stepNumber);
|
|
1082
|
-
const translateX =
|
|
1083
|
-
const stepsStyle = {
|
|
1084
|
+
const translateX = stepContainerSize / 2;
|
|
1085
|
+
const stepsStyle = {
|
|
1086
|
+
transform: `translateX(${translateX}%)`,
|
|
1087
|
+
backgroundSize: `${stepContainerSize}% 100%`
|
|
1088
|
+
};
|
|
1084
1089
|
const stepContainerStyle = { transform: `translateX(-${translateX}%)` };
|
|
1085
1090
|
const trackFillStyle = range
|
|
1086
|
-
? {
|
|
1091
|
+
? {
|
|
1092
|
+
width: `${this.calculatePosition(this.toNumber) - this.calculatePosition(this.fromNumber)}%`,
|
|
1093
|
+
left: `${this.calculatePosition(this.fromNumber)}%`
|
|
1094
|
+
}
|
|
1087
1095
|
: { width: `${this.calculatePosition(Number(this.value))}%` };
|
|
1088
1096
|
return html `
|
|
1089
1097
|
<div part="track-wrapper" ${ref(this.trackRef)}>
|
|
@@ -1193,11 +1201,15 @@ let Slider = class Slider extends ControlElement {
|
|
|
1193
1201
|
<div part="slider-wrapper">
|
|
1194
1202
|
<div part="slider" ${ref(this.sliderRef)}>
|
|
1195
1203
|
${this.renderTrack(this.range)}
|
|
1196
|
-
${this.range
|
|
1204
|
+
${this.range
|
|
1205
|
+
? this.renderThumb(this.fromNumber, this.toNumber)
|
|
1206
|
+
: this.renderThumb(this.valueNumber)}
|
|
1197
1207
|
</div>
|
|
1198
1208
|
</div>
|
|
1199
1209
|
${this.range && this.isShowInputField ? this.renderNumberField(this.to, SliderDataName.to) : null}
|
|
1200
|
-
${!this.range && this.isShowInputField
|
|
1210
|
+
${!this.range && this.isShowInputField
|
|
1211
|
+
? this.renderNumberField(this.value, SliderDataName.value)
|
|
1212
|
+
: null}
|
|
1201
1213
|
`;
|
|
1202
1214
|
}
|
|
1203
1215
|
};
|