@brightspace-ui/core 3.8.1 → 3.9.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.
@@ -204,7 +204,7 @@ The `d2l-filter-dimension-set` component is the main dimension type that will wo
204
204
 
205
205
  ## Dimension Set Value [d2l-filter-dimension-set-value]
206
206
 
207
- This component is built to be used alongside the [d2l-filter-dimension-set](#d2l-filter-dimension-set) component, this will give you a selectable list of filter values.
207
+ This component is built to be used alongside the [d2l-filter-dimension-set](#d2l-filter-dimension-set) component. It will give you a selectable list of filter values.
208
208
 
209
209
  <!-- docs: demo code properties name:d2l-filter-dimension-set-value align:start autoOpen:true autoSize:false size:large -->
210
210
  ```html
@@ -233,11 +233,41 @@ This component is built to be used alongside the [d2l-filter-dimension-set](#d2l
233
233
  | `selected` | Boolean, default: `false` | Whether the value in the filter is selected or not |
234
234
  <!-- docs: end hidden content -->
235
235
 
236
+ ## Dimension Set Value: Preset Date Range [d2l-filter-dimension-set-date-text-value]
237
+
238
+ This component is built to be used alongside the [d2l-filter-dimension-set](#d2l-filter-dimension-set) component. It will give you a selectable filter value based on the `range` defined on the component, which is to be one of a set of pre-defined range options. Selection triggers the `d2l-filter-change` event, with `start-value` and `end-value` (in UTC) being included in the changes for the `selected` item.
239
+
240
+ <!-- docs: demo code properties name:d2l-filter-dimension-set-date-text-value align:start autoOpen:true autoSize:false size:large -->
241
+ ```html
242
+ <script type="module">
243
+ import '@brightspace-ui/core/components/filter/filter.js';
244
+ import '@brightspace-ui/core/components/filter/filter-dimension-set.js';
245
+ import '@brightspace-ui/core/components/filter/filter-dimension-set-date-text-value.js';
246
+ </script>
247
+ <d2l-filter>
248
+ <d2l-filter-dimension-set key="dates" text="Dates">
249
+ <d2l-filter-dimension-set-date-text-value key="lastHour" range="lastHour" selected></d2l-filter-dimension-set-date-text-value>
250
+ <d2l-filter-dimension-set-date-text-value key="48hours" range="48hours" disabled></d2l-filter-dimension-set-date-text-value>
251
+ <d2l-filter-dimension-set-date-text-value key="14days" range="14days"></d2l-filter-dimension-set-date-text-value>
252
+ </d2l-filter-dimension-set>
253
+ </d2l-filter>
254
+ ```
255
+ <!-- docs: start hidden content -->
256
+ ### Properties
257
+
258
+ | Property | Type | Description |
259
+ |---|---|---|
260
+ | `key` | String, required | Unique identifier within a dimension for the value |
261
+ | `range` | String, required | The preset date/time range that the list item represents. Value is to be one of 'today', 'lastHour', '24hours', '48hours', '7days', '14days', '30days', or '6months'. |
262
+ | `disabled` | Boolean, default: `false` | Whether the value in the filter is disabled or not |
263
+ | `selected` | Boolean, default: `false` | Whether the value in the filter is selected or not |
264
+ <!-- docs: end hidden content -->
265
+
236
266
  ## Search and Paging
237
267
 
238
268
  Most filters will not need search or paging features since filter value lists are generally short. For longer lists of filter values when Search is necessary, it can be enabled by setting search-type to `automatic` or `manual`.
239
269
 
240
- `automatic` search runs a basic case-insensitive text comparison on the dimension values that are loaded in the browser, having no awareness of server-side values that are not yet loaded.
270
+ `automatic` search runs a basic case-insensitive text comparison on the dimension values that are loaded in the browser, having no awareness of server-side values that are not yet loaded.
241
271
 
242
272
  `manual` search dispatches a `d2l-filter-dimension-search` event delegating the search to the component's consumer. The event's detail will contain the key of the dimension from where the event was dispatched (`key`), the text value used for the search (`value`) and a callback (`searchCompleteCallback`). This callback gives the consumer control of which keys to display, either by setting `displayAllKeys` to `true` or passing a list of the keys to display as `keysToDisplay` (all other keys will be hidden). The dimension will be in a loading state until the callback is called.
243
273
  ```js
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html lang="en">
2
+ <html lang="en" data-timezone='{"name":"Canada - Toronto", "identifier":"America/Toronto"}'>
3
3
 
4
4
  <head>
5
5
  <link rel="stylesheet" href="../../demo/styles.css" type="text/css">
@@ -10,6 +10,7 @@
10
10
  import '../../filter/filter-dimension-set.js';
11
11
  import '../../filter/filter-dimension-set-empty-state.js';
12
12
  import '../../filter/filter-dimension-set-value.js';
13
+ import '../../filter/filter-dimension-set-date-text-value.js';
13
14
  import './filter-search-demo.js';
14
15
  import './filter-load-more-demo.js';
15
16
  </script>
@@ -127,7 +128,7 @@
127
128
  <d2l-filter-dimension-set-value key="stats" text="Statistics"></d2l-filter-dimension-set-value>
128
129
  <d2l-filter-dimension-set-value key="writerscraft" text="Writer's Craft"></d2l-filter-dimension-set-value>
129
130
  </d2l-filter-dimension-set>
130
-
131
+
131
132
  </d2l-filter>
132
133
  <d2l-filter text="More Filters">
133
134
  <d2l-filter-dimension-set key="course" text="Course" loading select-all></d2l-filter-dimension-set>
@@ -155,6 +156,21 @@
155
156
  <d2l-filter-search-demo></d2l-filter-search-demo>
156
157
  </template>
157
158
  </d2l-demo-snippet>
159
+
160
+ <h2>Date Filter</h2>
161
+ <d2l-demo-snippet>
162
+ <template>
163
+ <d2l-filter id="filter-single">
164
+ <d2l-filter-dimension-set key="dates" text="Dates">
165
+ <d2l-filter-dimension-set-value key="lastweek" text="Last Week"></d2l-filter-dimension-set-value>
166
+ <d2l-filter-dimension-set-date-text-value key="lastHour" range="lastHour" selected></d2l-filter-dimension-set-date-text-value>
167
+ <d2l-filter-dimension-set-date-text-value key="48hours" range="48hours" disabled></d2l-filter-dimension-set-date-text-value>
168
+ <d2l-filter-dimension-set-date-text-value key="14days" range="14days"></d2l-filter-dimension-set-date-text-value>
169
+ <d2l-filter-dimension-set-date-text-value key="6months" range="6months"></d2l-filter-dimension-set-date-text-value>
170
+ </d2l-filter-dimension-set>
171
+ </d2l-filter>
172
+ </template>
173
+ </d2l-demo-snippet>
158
174
  </d2l-demo-page>
159
175
 
160
176
  <script type="module">
@@ -0,0 +1,156 @@
1
+ import { getUTCDateTimeRange } from '../../helpers/dateTime.js';
2
+ import { LitElement } from 'lit';
3
+ import { LocalizeCoreElement } from '../../helpers/localize-core-element.js';
4
+
5
+ /**
6
+ * A component to represent a possible date value that can be selected for a dimension set (the main filter dimension type) for predefined date ranges.
7
+ * A range property is used to define the preset text shown, as well as the start and end date values formatted as UTC strings.
8
+ * This component does not render anything, but instead gathers data needed for the d2l-filter.
9
+ */
10
+ class FilterDimensionSetDateTextValue extends LocalizeCoreElement(LitElement) {
11
+
12
+ static get properties() {
13
+ return {
14
+ /**
15
+ * Whether this value in the filter is disabled or not
16
+ * @type {boolean}
17
+ */
18
+ disabled: { type: Boolean, reflect: true },
19
+ /**
20
+ * @ignore
21
+ */
22
+ endValue: { type: String },
23
+ /**
24
+ * REQUIRED: Unique key to represent this value in the dimension
25
+ * @type {string}
26
+ */
27
+ key: { type: String },
28
+ /**
29
+ * REQUIRED: The preset date/time range that the list item represents
30
+ * @type {'today'|'lastHour'|'24hours'|'48hours'|'7days'|'14days'|'30days'|'6months'}
31
+ */
32
+ range: { type: String },
33
+ /**
34
+ * Whether this value in the filter is selected or not
35
+ * @type {boolean}
36
+ */
37
+ selected: { type: Boolean, reflect: true },
38
+ /**
39
+ * @ignore
40
+ */
41
+ startValue: { type: String },
42
+ /**
43
+ * @ignore
44
+ */
45
+ text: { type: String, reflect: true }
46
+ };
47
+ }
48
+
49
+ constructor() {
50
+ super();
51
+ this.disabled = false;
52
+ this.selected = false;
53
+ this.text = '';
54
+ this._enforceSingleSelection = true;
55
+ this._filterSetValue = true;
56
+ this._noSearchSupport = true;
57
+ }
58
+
59
+ firstUpdated(changedProperties) {
60
+ super.firstUpdated(changedProperties);
61
+
62
+ if (this.selected && this.range) {
63
+ // if the value is initially selected, startValue and endValue should be set in case used by consumer
64
+ const dateTimeRange = getUTCDateTimeRange(this._rangeDetails?.rangeType, this._rangeDetails?.rangeNum);
65
+ this.startValue = dateTimeRange?.startValue;
66
+ this.endValue = dateTimeRange?.endValue;
67
+ }
68
+ }
69
+
70
+ updated(changedProperties) {
71
+ super.updated(changedProperties);
72
+
73
+ const changes = new Map();
74
+ changedProperties.forEach((oldValue, prop) => {
75
+ if (oldValue === undefined && prop !== 'text') return;
76
+
77
+ if (prop === 'disabled' || prop === 'selected' || prop === 'text') {
78
+ changes.set(prop, this[prop]);
79
+ } else if (prop === 'range') {
80
+ changes.set('rangeType', this._rangeDetails?.rangeType);
81
+ changes.set('rangeNum', this._rangeDetails?.rangeNum);
82
+ }
83
+ });
84
+ if (changes.size > 0) {
85
+ /** @ignore */
86
+ this.dispatchEvent(new CustomEvent('d2l-filter-dimension-set-value-data-change', {
87
+ detail: { valueKey: this.key, changes: changes },
88
+ bubbles: true,
89
+ composed: false
90
+ }));
91
+ }
92
+ }
93
+
94
+ willUpdate(changedProperties) {
95
+ super.willUpdate(changedProperties);
96
+
97
+ if (changedProperties.has('range')) this._handleRangeUpdated();
98
+ }
99
+
100
+ getValueDetails() {
101
+ this._handleRangeUpdated();
102
+
103
+ return {
104
+ disabled: this.disabled,
105
+ key: this.key,
106
+ selected: this.selected,
107
+ text: this.text,
108
+ getAdditionalEventDetails: this._getAdditionalEventDetails.bind(this)
109
+ };
110
+ }
111
+
112
+ _getAdditionalEventDetails(selected) {
113
+ if (!selected) return {};
114
+ const dateTimeRange = getUTCDateTimeRange(this._rangeDetails?.rangeType, this._rangeDetails?.rangeNum);
115
+ return { startValue: dateTimeRange.startValue, endValue: dateTimeRange.endValue };
116
+ }
117
+
118
+ _handleRangeUpdated() {
119
+ switch (this.range) {
120
+ case 'today':
121
+ this._rangeDetails = { rangeType: 'days', rangeNum: 0 };
122
+ break;
123
+ case 'lastHour':
124
+ this._rangeDetails = { rangeType: 'hours', rangeNum: -1 };
125
+ break;
126
+ case '24hours':
127
+ this._rangeDetails = { rangeType: 'hours', rangeNum: -24 };
128
+ break;
129
+ case '48hours':
130
+ this._rangeDetails = { rangeType: 'hours', rangeNum: -48 };
131
+ break;
132
+ case '7days':
133
+ this._rangeDetails = { rangeType: 'days', rangeNum: -7 };
134
+ break;
135
+ case '14days':
136
+ this._rangeDetails = { rangeType: 'days', rangeNum: -14 };
137
+ break;
138
+ case '30days':
139
+ this._rangeDetails = { rangeType: 'days', rangeNum: -30 };
140
+ break;
141
+ case '6months':
142
+ this._rangeDetails = { rangeType: 'months', rangeNum: -6 };
143
+ break;
144
+ default:
145
+ console.warn('d2l-filter-dimension-set-date-text-value: Invalid range value');
146
+ this._rangeDetails = {};
147
+ break;
148
+ }
149
+
150
+ if (this._rangeDetails.rangeType === 'hours') this.text = this.localize('components.filter-dimension-set-date-text-value.textHours', { num: Math.abs(this._rangeDetails.rangeNum) });
151
+ else if (this._rangeDetails.rangeType === 'days') this.text = this.localize('components.filter-dimension-set-date-text-value.textDays', { num: Math.abs(this._rangeDetails.rangeNum) });
152
+ else if (this._rangeDetails.rangeType === 'months') this.text = this.localize('components.filter-dimension-set-date-text-value.textMonths', { num: Math.abs(this._rangeDetails.rangeNum) });
153
+ }
154
+ }
155
+
156
+ customElements.define('d2l-filter-dimension-set-date-text-value', FilterDimensionSetDateTextValue);
@@ -41,6 +41,9 @@ class FilterDimensionSetValue extends LitElement {
41
41
  this.disabled = false;
42
42
  this.selected = false;
43
43
  this.text = '';
44
+ this._enforceSingleSelection = false;
45
+ this._filterSetValue = true;
46
+ this._noSearchSupport = false;
44
47
  }
45
48
 
46
49
  get count() {
@@ -78,6 +81,16 @@ class FilterDimensionSetValue extends LitElement {
78
81
  }));
79
82
  }
80
83
  }
84
+
85
+ getValueDetails() {
86
+ return {
87
+ count: this.count,
88
+ disabled: this.disabled,
89
+ key: this.key,
90
+ selected: this.selected,
91
+ text: this.text
92
+ };
93
+ }
81
94
  }
82
95
 
83
96
  customElements.define('d2l-filter-dimension-set-value', FilterDimensionSetValue);
@@ -136,15 +136,16 @@ class FilterDimensionSet extends LitElement {
136
136
 
137
137
  getValues() {
138
138
  const valueNodes = this._getSlottedNodes();
139
+ let noSearchSupport = false;
140
+ let enforceSingleSelection = false;
139
141
  const values = valueNodes.map(value => {
140
- return {
141
- count: value.count,
142
- disabled: value.disabled,
143
- key: value.key,
144
- selected: value.selected,
145
- text: value.text
146
- };
142
+ if (value._noSearchSupport) noSearchSupport = true;
143
+ if (value._enforceSingleSelection) enforceSingleSelection = true;
144
+
145
+ return value.getValueDetails();
147
146
  });
147
+ if (noSearchSupport) this.searchType = 'none';
148
+ if (enforceSingleSelection) this.selectionSingle = true;
148
149
  return values;
149
150
  }
150
151
 
@@ -173,7 +174,10 @@ class FilterDimensionSet extends LitElement {
173
174
  _getSlottedNodes() {
174
175
  if (!this._slot) return [];
175
176
  const nodes = this._slot.assignedNodes({ flatten: true });
176
- return nodes.filter((node) => node.nodeType === Node.ELEMENT_NODE && node.tagName.toLowerCase() === 'd2l-filter-dimension-set-value');
177
+ return nodes.filter((node) => {
178
+ if (node.nodeType !== Node.ELEMENT_NODE) return false;
179
+ return node._filterSetValue;
180
+ });
177
181
  }
178
182
 
179
183
  _handleDimensionSetValueDataChange(e) {
@@ -686,7 +686,7 @@ class Filter extends FocusMixin(LocalizeCoreElement(RtlMixin(LitElement))) {
686
686
  _handleDimensionDataChange(e) {
687
687
  const changes = e.detail.changes;
688
688
  const dimension = this._getDimensionByKey(e.detail.dimensionKey);
689
- const value = e.detail.valueKey && dimension.values.find(value => value.key === e.detail.valueKey);
689
+ const value = e.detail.valueKey && dimension?.values.find(value => value.key === e.detail.valueKey);
690
690
  const toUpdate = e.detail.valueKey ? value : dimension;
691
691
 
692
692
  if (!toUpdate) return;
@@ -869,7 +869,11 @@ class Filter extends FocusMixin(LocalizeCoreElement(RtlMixin(LitElement))) {
869
869
  this._totalAppliedCount--;
870
870
  }
871
871
 
872
- this._dispatchChangeEvent(dimension, { valueKey: valueKey, selected: selected });
872
+ const details = { valueKey: valueKey, selected: selected };
873
+
874
+ if (value.getAdditionalEventDetails) Object.assign(details, value.getAdditionalEventDetails(selected));
875
+
876
+ this._dispatchChangeEvent(dimension, details);
873
877
  }
874
878
 
875
879
  _performDimensionClear(dimension) {
@@ -3802,6 +3802,72 @@
3802
3802
  "name": "d2l-filter-search-demo",
3803
3803
  "path": "./components/filter/demo/filter-search-demo.js"
3804
3804
  },
3805
+ {
3806
+ "name": "d2l-filter-dimension-set-date-text-value",
3807
+ "path": "./components/filter/filter-dimension-set-date-text-value.js",
3808
+ "description": "A component to represent a possible date value that can be selected for a dimension set (the main filter dimension type) for predefined date ranges.\nA range property is used to define the preset text shown, as well as the start and end date values formatted as UTC strings.\nThis component does not render anything, but instead gathers data needed for the d2l-filter.",
3809
+ "attributes": [
3810
+ {
3811
+ "name": "key",
3812
+ "description": "REQUIRED: Unique key to represent this value in the dimension",
3813
+ "type": "string"
3814
+ },
3815
+ {
3816
+ "name": "range",
3817
+ "description": "REQUIRED: The preset date/time range that the list item represents",
3818
+ "type": "'today'|'lastHour'|'24hours'|'48hours'|'7days'|'14days'|'30days'|'6months'"
3819
+ },
3820
+ {
3821
+ "name": "disabled",
3822
+ "description": "Whether this value in the filter is disabled or not",
3823
+ "type": "boolean",
3824
+ "default": "false"
3825
+ },
3826
+ {
3827
+ "name": "selected",
3828
+ "description": "Whether this value in the filter is selected or not",
3829
+ "type": "boolean",
3830
+ "default": "false"
3831
+ }
3832
+ ],
3833
+ "properties": [
3834
+ {
3835
+ "name": "key",
3836
+ "attribute": "key",
3837
+ "description": "REQUIRED: Unique key to represent this value in the dimension",
3838
+ "type": "string"
3839
+ },
3840
+ {
3841
+ "name": "range",
3842
+ "attribute": "range",
3843
+ "description": "REQUIRED: The preset date/time range that the list item represents",
3844
+ "type": "'today'|'lastHour'|'24hours'|'48hours'|'7days'|'14days'|'30days'|'6months'"
3845
+ },
3846
+ {
3847
+ "name": "disabled",
3848
+ "attribute": "disabled",
3849
+ "description": "Whether this value in the filter is disabled or not",
3850
+ "type": "boolean",
3851
+ "default": "false"
3852
+ },
3853
+ {
3854
+ "name": "selected",
3855
+ "attribute": "selected",
3856
+ "description": "Whether this value in the filter is selected or not",
3857
+ "type": "boolean",
3858
+ "default": "false"
3859
+ },
3860
+ {
3861
+ "name": "text",
3862
+ "type": "string",
3863
+ "default": "\"\""
3864
+ },
3865
+ {
3866
+ "name": "documentLocaleSettings",
3867
+ "default": "\"getDocumentLocaleSettings()\""
3868
+ }
3869
+ ]
3870
+ },
3805
3871
  {
3806
3872
  "name": "d2l-filter-dimension-set-empty-state",
3807
3873
  "path": "./components/filter/filter-dimension-set-empty-state.js",
@@ -161,6 +161,53 @@ export function getUTCDateTimeFromLocalDateTime(date, time) {
161
161
  return formatDateTimeInISO(utcDateTime);
162
162
  }
163
163
 
164
+ export function getUTCDateTimeRange(type, diff) {
165
+ if (!type || (!diff && diff !== 0) || (diff === 0 && type !== 'days')) return {};
166
+ if (type !== 'seconds' && type !== 'minutes' && type !== 'hours' && type !== 'days' && type !== 'months' && type !== 'years') return {};
167
+
168
+ if (type === 'days' && diff === 0) {
169
+ // assume "today" (midnight in user's time to 23:59:59 in user's time)
170
+ const today = formatDateInISO(getToday());
171
+ const startValue = getUTCDateTimeFromLocalDateTime(today, '0:0:0');
172
+ const endValue = getUTCDateTimeFromLocalDateTime(today, '23:59:59');
173
+ return { startValue, endValue };
174
+ }
175
+
176
+ /**
177
+ * If diff is positive, range is in the future. Start date is now and end date is in the future.
178
+ * If diff is negative, range is in the past. End date is now and start date is in the past.
179
+ */
180
+
181
+ const rangeDate = new Date();
182
+ const nowUTCString = rangeDate.toISOString();
183
+
184
+ if (type === 'seconds') {
185
+ const newSeconds = rangeDate.getUTCSeconds() + diff;
186
+ rangeDate.setUTCSeconds(newSeconds);
187
+ } else if (type === 'minutes') {
188
+ const newMinutes = rangeDate.getUTCMinutes() + diff;
189
+ rangeDate.setUTCMinutes(newMinutes);
190
+ } else if (type === 'hours') {
191
+ const newHours = rangeDate.getUTCHours() + diff;
192
+ rangeDate.setUTCHours(newHours);
193
+ } else if (type === 'days') {
194
+ const newDate = rangeDate.getUTCDate() + diff;
195
+ rangeDate.setUTCDate(newDate);
196
+ } else if (type === 'months') {
197
+ const newMonth = rangeDate.getUTCMonth() + diff;
198
+ rangeDate.setUTCMonth(newMonth);
199
+ } else if (type === 'years') {
200
+ const newYear = rangeDate.getUTCFullYear() + diff;
201
+ rangeDate.setUTCFullYear(newYear);
202
+ }
203
+
204
+ if (diff > 0) {
205
+ return { startValue: nowUTCString, endValue: rangeDate.toISOString() };
206
+ } else {
207
+ return { startValue: rangeDate.toISOString(), endValue: nowUTCString };
208
+ }
209
+ }
210
+
164
211
  export function isDateInRange(date, min, max) {
165
212
  if (!date) return false;
166
213
  const afterMin = !min || (min && date.getTime() >= min.getTime());
package/helpers/error.js CHANGED
@@ -1,11 +1,13 @@
1
1
  import { getComposedParent } from './dom.js';
2
2
 
3
+ const numParentLevels = 10;
4
+
3
5
  function getComposedPath(elem, opts) {
4
6
 
5
7
  if (!opts?.composedPath) return '';
6
8
 
7
9
  const composedParents = [];
8
- let parent = elem;
10
+ let parent = getComposedParent(elem);
9
11
  while (parent !== null && parent?.tagName?.toLowerCase() !== 'body') {
10
12
  if (parent?.tagName) {
11
13
  composedParents.push(parent.tagName.toLowerCase());
@@ -15,8 +17,8 @@ function getComposedPath(elem, opts) {
15
17
 
16
18
  if (composedParents.length === 0) return '';
17
19
 
18
- composedParents.reverse();
19
- const path = ` Path: "${composedParents.join(' > ')}".`;
20
+ const slicedParents = composedParents.slice(0, numParentLevels);
21
+ const path = ` ${slicedParents.length} parent nodes: "${slicedParents.join(', ')}".`;
20
22
  return path;
21
23
 
22
24
  }
package/lang/ar.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {ما من نتائج بحث} one {{number} نتيجة بحث}‏ other {{number} من نتائج البحث}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. تظهر عوامل التصفية المحددة أولاً.",
27
27
  "components.filter.singleDimensionDescription": "التصفية حسب: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} غير صالحة.",
29
32
  "components.form-element.defaultFieldLabel": "الحقل",
30
33
  "components.form-element.input.email.typeMismatch": "البريد الإلكتروني غير صالح",
package/lang/cy.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {Dim canlyniadau chwilio} one {{number} canlyniad chwilio} other {{number} canlyniadau chwilio}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Mae'r hidlyddion a ddewiswyd yn ymddangos gyntaf.",
27
27
  "components.filter.singleDimensionDescription": "Hidlo yn ôl: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "Mae {label} yn annilys.",
29
32
  "components.form-element.defaultFieldLabel": "Maes",
30
33
  "components.form-element.input.email.typeMismatch": "Nid yw'r e-bost yn ddilys",
package/lang/da.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {Ingen søgeresultater} one {{number} søgeresultat} other {{number} søgeresultater}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Valgte filtre vises først.",
27
27
  "components.filter.singleDimensionDescription": "Filtrer efter: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} er ugyldigt.",
29
32
  "components.form-element.defaultFieldLabel": "Felt",
30
33
  "components.form-element.input.email.typeMismatch": "E-mail er ikke gyldig",
package/lang/de.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {Kein Suchergebnis} one {{number} Suchergebnis} other {{number} Suchergebnisse}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Ausgewählte Filter werden zuerst angezeigt.",
27
27
  "components.filter.singleDimensionDescription": "Filtern nach: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} ist ungültig.",
29
32
  "components.form-element.defaultFieldLabel": "Feld",
30
33
  "components.form-element.input.email.typeMismatch": "Die E-Mail-Adresse ist ungültig",
package/lang/en-gb.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {No search results} one {{number} search result} other {{number} search results}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Selected filters appear first.",
27
27
  "components.filter.singleDimensionDescription": "Filter by: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} is invalid.",
29
32
  "components.form-element.defaultFieldLabel": "Field",
30
33
  "components.form-element.input.email.typeMismatch": "Email is not valid",
package/lang/en.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {No search results} one {{number} search result} other {{number} search results}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Selected filters appear first.",
27
27
  "components.filter.singleDimensionDescription": "Filter by: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} is invalid.",
29
32
  "components.form-element.defaultFieldLabel": "Field",
30
33
  "components.form-element.input.email.typeMismatch": "Email is not valid",
package/lang/es-es.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {No hay resultados de búsqueda} one {{number} resultado de búsqueda} other {{number} resultados de búsqueda}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Los filtros seleccionados aparecen primero.",
27
27
  "components.filter.singleDimensionDescription": "Filtrar por: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} no es válido.",
29
32
  "components.form-element.defaultFieldLabel": "Campo",
30
33
  "components.form-element.input.email.typeMismatch": "El correo electrónico no es válido",
package/lang/es.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {No se encontraron resultados de búsqueda} one {{number} resultado de búsqueda} other {{number} resultados de búsqueda}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Los filtros seleccionados aparecen primero.",
27
27
  "components.filter.singleDimensionDescription": "Filtrar por: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} no es válida.",
29
32
  "components.form-element.defaultFieldLabel": "Campo",
30
33
  "components.form-element.input.email.typeMismatch": "El correo electrónico no es válido",
package/lang/fr-fr.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {Aucun résultat de recherche} one {{number} résultat de recherche} other {{number} résultats de recherche}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Les filtres sélectionnés s’affichent en premier.",
27
27
  "components.filter.singleDimensionDescription": "Filtrer par : {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} n'est pas valide.",
29
32
  "components.form-element.defaultFieldLabel": "Champ",
30
33
  "components.form-element.input.email.typeMismatch": "L'adresse e-mail n'est pas valide.",
package/lang/fr.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {Aucun résultat de recherche} one {{number} résultat de recherche} other {{number} résultats de recherche}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Les filtres sélectionnés s’affichent en premier.",
27
27
  "components.filter.singleDimensionDescription": "Filtrer par : {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} n'est pas valide.",
29
32
  "components.form-element.defaultFieldLabel": "Champ",
30
33
  "components.form-element.input.email.typeMismatch": "L'adresse courriel n'est pas valide",
package/lang/hi.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {कोई खोज परिणाम नहीं} one {{number} खोज परिणाम} other {{number} खोज परिणाम}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. चुने गए फ़िल्टर सबसे पहले दिखाई देते हैं।",
27
27
  "components.filter.singleDimensionDescription": "इसके अनुसार फ़िल्टर करें: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} अमान्य है।",
29
32
  "components.form-element.defaultFieldLabel": "फ़ील्ड",
30
33
  "components.form-element.input.email.typeMismatch": "ईमेल मान्य नहीं है",
package/lang/ja.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {検索結果なし} other {{number} 件の検索結果}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}。選択したフィルタが最初に表示されます。",
27
27
  "components.filter.singleDimensionDescription": "フィルタ条件: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} は無効です。",
29
32
  "components.form-element.defaultFieldLabel": "フィールド",
30
33
  "components.form-element.input.email.typeMismatch": "電子メールが無効です",
package/lang/ko.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {검색 결과 없음} other {{number}개 검색 결과}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. 선택한 필터가 먼저 나타납니다.",
27
27
  "components.filter.singleDimensionDescription": "필터 기준: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label}이(가) 잘못되었습니다.",
29
32
  "components.form-element.defaultFieldLabel": "필드",
30
33
  "components.form-element.input.email.typeMismatch": "이메일이 유효하지 않습니다.",
package/lang/nl.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {Geen zoekresultaten} one {{number} zoekresultaat} other {{number} zoekresultaten}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Geselecteerde filters verschijnen als eerste.",
27
27
  "components.filter.singleDimensionDescription": "Filter op {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} is ongeldig.",
29
32
  "components.form-element.defaultFieldLabel": "Veld",
30
33
  "components.form-element.input.email.typeMismatch": "E-mailadres is ongeldig",
package/lang/pt.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {Sem resultados para a pesquisa} one {{number} resultado para a pesquisa} other {{number} resultados para a pesquisa}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Os filtros selecionados aparecem primeiro.",
27
27
  "components.filter.singleDimensionDescription": "Filtrar por: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} é inválido.",
29
32
  "components.form-element.defaultFieldLabel": "Campo",
30
33
  "components.form-element.input.email.typeMismatch": "E-mail inválido",
package/lang/sv.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {Inga sökresultat} one {{number} sökresultat} other {{number} sökresultat}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Valda filter visas först.",
27
27
  "components.filter.singleDimensionDescription": "Filtrera efter: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} är ogiltig.",
29
32
  "components.form-element.defaultFieldLabel": "Fält",
30
33
  "components.form-element.input.email.typeMismatch": "E-postadressen är ogiltig",
package/lang/tr.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {Arama sonucu yok} one {{number} arama sonucu} other {{number} arama sonucu}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}. Seçilen filtreler önce görünür.",
27
27
  "components.filter.singleDimensionDescription": "Filtreleme ölçütü: {filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, one {Last hour} other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} one {Last {num} days} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} geçersiz.",
29
32
  "components.form-element.defaultFieldLabel": "Alan",
30
33
  "components.form-element.input.email.typeMismatch": "E-posta geçerli değil",
package/lang/zh-cn.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {无搜索结果} other {{number} 个搜索结果}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}。先显示所选筛选器。",
27
27
  "components.filter.singleDimensionDescription": "筛选依据:{filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} 无效。",
29
32
  "components.form-element.defaultFieldLabel": "字段",
30
33
  "components.form-element.input.email.typeMismatch": "电子邮件无效",
package/lang/zh-tw.js CHANGED
@@ -25,6 +25,9 @@ export default {
25
25
  "components.filter.searchResults": "{number, plural, =0 {無搜尋結果} other {{number} 個搜尋結果}}",
26
26
  "components.filter.selectedFirstListLabel": "{headerText}。所選篩選器會先顯示。",
27
27
  "components.filter.singleDimensionDescription": "按此條件篩選:{filterName}",
28
+ "components.filter-dimension-set-date-text-value.textHours": "{num, plural, other {Last {num} hours}}",
29
+ "components.filter-dimension-set-date-text-value.textDays": "{num, plural, =0 {Today} other {Last {num} days}}",
30
+ "components.filter-dimension-set-date-text-value.textMonths": "Last {num} months",
28
31
  "components.form-element.defaultError": "{label} 無效。",
29
32
  "components.form-element.defaultFieldLabel": "欄位",
30
33
  "components.form-element.input.email.typeMismatch": "電子郵件無效",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspace-ui/core",
3
- "version": "3.8.1",
3
+ "version": "3.9.1",
4
4
  "description": "A collection of accessible, free, open-source web components for building Brightspace applications",
5
5
  "type": "module",
6
6
  "repository": "https://github.com/BrightspaceUI/core.git",