@brightspace-ui/core 3.173.1 → 3.174.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/components/demo/demo-flags.js +10 -0
- package/components/demo/demo-page.js +92 -13
- package/components/dropdown/demo/dropdown-menu.html +0 -7
- package/components/dropdown/demo/dropdown-tabs.html +0 -7
- package/components/dropdown/demo/dropdown.html +0 -7
- package/components/filter/demo/filter.html +0 -7
- package/components/inputs/demo/input-date.html +0 -7
- package/components/menu/demo/menu.html +0 -6
- package/components/scroll-wrapper/demo/scroll-wrapper.html +0 -5
- package/components/table/demo/table.html +0 -5
- package/components/tooltip/demo/tooltip.html +1 -6
- package/helpers/README.md +17 -0
- package/helpers/flags.js +31 -2
- package/package.json +1 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { mockFlag } from '../../helpers/flags.js';
|
|
2
|
+
|
|
3
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
4
|
+
|
|
5
|
+
urlParams.forEach((value, key) => {
|
|
6
|
+
if (!key.startsWith('demo-flag-')) return;
|
|
7
|
+
key = key.substring(10);
|
|
8
|
+
if (value?.toLowerCase?.() === 'true') mockFlag(key, true);
|
|
9
|
+
else if (value?.toLowerCase?.() === 'false') mockFlag(key, false);
|
|
10
|
+
});
|
|
@@ -1,11 +1,17 @@
|
|
|
1
|
+
import './demo-flags.js';
|
|
2
|
+
import '../button/button.js';
|
|
1
3
|
import './demo-snippet.js';
|
|
4
|
+
import '../inputs/input-checkbox-group.js';
|
|
5
|
+
import '../inputs/input-checkbox.js';
|
|
2
6
|
import './code-view.js';
|
|
7
|
+
import '../collapsible-panel/collapsible-panel.js';
|
|
8
|
+
import '../collapsible-panel/collapsible-panel-summary-item.js';
|
|
3
9
|
import '../colors/colors.js';
|
|
4
10
|
import '../typography/typography.js';
|
|
5
11
|
import { css, html, LitElement } from 'lit';
|
|
6
12
|
import { getDocumentLocaleSettings, supportedLocalesDetails } from '@brightspace-ui/intl/lib/common.js';
|
|
13
|
+
import { getFlagOverrides, getKnownFlags } from '../../helpers/flags.js';
|
|
7
14
|
import { classMap } from 'lit/directives/class-map.js';
|
|
8
|
-
import { heading2Styles } from '../typography/styles.js';
|
|
9
15
|
import { inputLabelStyles } from '../inputs/input-label-styles.js';
|
|
10
16
|
import { selectStyles } from '../inputs/input-select-styles.js';
|
|
11
17
|
|
|
@@ -32,7 +38,7 @@ class DemoPage extends LitElement {
|
|
|
32
38
|
}
|
|
33
39
|
|
|
34
40
|
static get styles() {
|
|
35
|
-
return [
|
|
41
|
+
return [ inputLabelStyles, selectStyles, css`
|
|
36
42
|
:host {
|
|
37
43
|
background-color: var(--d2l-color-sylvite);
|
|
38
44
|
display: block;
|
|
@@ -49,9 +55,8 @@ class DemoPage extends LitElement {
|
|
|
49
55
|
margin-bottom: 1.5rem;
|
|
50
56
|
max-width: 900px;
|
|
51
57
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
margin: 0;
|
|
58
|
+
d2l-collapsible-panel {
|
|
59
|
+
width: 100%;
|
|
55
60
|
}
|
|
56
61
|
.d2l-input-label {
|
|
57
62
|
margin-bottom: 0;
|
|
@@ -68,20 +73,36 @@ class DemoPage extends LitElement {
|
|
|
68
73
|
.d2l-demo-page-content > ::slotted(d2l-demo-snippet) {
|
|
69
74
|
margin-bottom: 36px;
|
|
70
75
|
}
|
|
76
|
+
|
|
77
|
+
#applyFlagsButton {
|
|
78
|
+
margin-block-start: 1rem;
|
|
79
|
+
}
|
|
71
80
|
`];
|
|
72
81
|
}
|
|
73
82
|
|
|
83
|
+
constructor() {
|
|
84
|
+
super();
|
|
85
|
+
this.#handleFlagsKnownBound = this.#handleFlagsKnown.bind(this);
|
|
86
|
+
}
|
|
87
|
+
|
|
74
88
|
connectedCallback() {
|
|
75
89
|
super.connectedCallback();
|
|
76
90
|
const title = document.createElement('title');
|
|
77
91
|
title.textContent = this.pageTitle;
|
|
78
92
|
document.head.insertBefore(title, document.head.firstChild);
|
|
93
|
+
document.addEventListener('d2l-flags-known', this.#handleFlagsKnownBound);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
disconnectedCallback() {
|
|
97
|
+
super.disconnectedCallback();
|
|
98
|
+
document.removeEventListener('d2l-flags-known', this.#handleFlagsKnownBound);
|
|
79
99
|
}
|
|
80
100
|
|
|
81
101
|
render() {
|
|
82
102
|
const classes = {
|
|
83
103
|
'no-scroll': this._noScroll
|
|
84
104
|
};
|
|
105
|
+
|
|
85
106
|
let selectedLanguageCode = getDocumentLocaleSettings().language;
|
|
86
107
|
if (selectedLanguageCode === 'en') selectedLanguageCode = 'en-us';
|
|
87
108
|
let foundSelected = false;
|
|
@@ -90,21 +111,79 @@ class DemoPage extends LitElement {
|
|
|
90
111
|
foundSelected = foundSelected || selected;
|
|
91
112
|
return html`<option value="${l.code}" ?selected="${selected}">${l.code} - ${l.name}</option>`;
|
|
92
113
|
});
|
|
114
|
+
|
|
115
|
+
const knownFlags = this.#getKnownFlagsSorted();
|
|
116
|
+
const knownFlagCheckboxes = [];
|
|
117
|
+
knownFlags.forEach((knownFlag, key) => {
|
|
118
|
+
knownFlagCheckboxes.push(html`<d2l-input-checkbox label="${key}" data-flag-key="${key}" ?checked="${knownFlag.value}"></d2l-input-checkbox>`);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const flagOverrides = getFlagOverrides();
|
|
122
|
+
const flagOverrideItems = [];
|
|
123
|
+
flagOverrides.forEach((value, key) => {
|
|
124
|
+
const knownFlag = knownFlags.get(key);
|
|
125
|
+
const defaultValue = knownFlag ? knownFlag.defaultValue : 'unknown';
|
|
126
|
+
flagOverrideItems.push(html`<d2l-collapsible-panel-summary-item slot="summary" text="${key} (default: ${defaultValue}; override: ${value})"></d2l-collapsible-panel-summary-item>`);
|
|
127
|
+
});
|
|
128
|
+
|
|
93
129
|
return html`
|
|
94
130
|
<header>
|
|
95
|
-
<
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
131
|
+
<d2l-collapsible-panel panel-title="${this.pageTitle}" heading-level="1" heading-style="3" type="subtle">
|
|
132
|
+
<label class="d2l-input-label" slot="actions">
|
|
133
|
+
Language:
|
|
134
|
+
<select class="d2l-input-select" @change="${this.#handleLanguageChange}">${languageOptions}</select>
|
|
135
|
+
</label>
|
|
136
|
+
${knownFlagCheckboxes.length > 0 ? html`
|
|
137
|
+
<d2l-input-checkbox-group id="flagsCheckboxGroup" label="Flags">
|
|
138
|
+
${knownFlagCheckboxes}
|
|
139
|
+
</d2l-input-checkbox-group>
|
|
140
|
+
<d2l-button id="applyFlagsButton" @click="${this.#handleApplyFlagsClick}">Apply</d2l-button>
|
|
141
|
+
` : 'No known flags'}
|
|
142
|
+
${flagOverrideItems}
|
|
143
|
+
</d2l-collapsible-panel>
|
|
100
144
|
</header>
|
|
101
145
|
<main class="${classMap(classes)}">
|
|
102
|
-
<div class="d2l-demo-page-content" @d2l-demo-snippet-fullscreen-toggle="${this
|
|
146
|
+
<div class="d2l-demo-page-content" @d2l-demo-snippet-fullscreen-toggle="${this.#handleFullscreenToggle}"><slot></slot></div>
|
|
103
147
|
</main>
|
|
104
148
|
`;
|
|
105
149
|
}
|
|
106
150
|
|
|
107
|
-
|
|
151
|
+
#handleFlagsKnownBound;
|
|
152
|
+
|
|
153
|
+
#getKnownFlagsSorted() {
|
|
154
|
+
return new Map([...getKnownFlags().entries()].sort((entry1, entry2) => {
|
|
155
|
+
const key1 = entry1[0].toLowerCase();
|
|
156
|
+
const key2 = entry2[0].toLowerCase();
|
|
157
|
+
if (key1 < key2) return -1;
|
|
158
|
+
else if (key1 > key2) return 1;
|
|
159
|
+
else return 0;
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
#handleApplyFlagsClick() {
|
|
164
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
165
|
+
const elems = [...this.shadowRoot.querySelectorAll('#flagsCheckboxGroup > d2l-input-checkbox')];
|
|
166
|
+
|
|
167
|
+
const knownFlags = getKnownFlags();
|
|
168
|
+
elems.forEach(elem => {
|
|
169
|
+
const key = elem.dataset.flagKey;
|
|
170
|
+
const flag = knownFlags.get(key);
|
|
171
|
+
|
|
172
|
+
if (flag.defaultValue === elem.checked) {
|
|
173
|
+
urlParams.delete(`demo-flag-${key}`);
|
|
174
|
+
} else if (flag.defaultValue !== elem.checked) {
|
|
175
|
+
urlParams.set(`demo-flag-${key}`, elem.checked);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
window.location.search = urlParams.toString();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
#handleFlagsKnown() {
|
|
183
|
+
this.requestUpdate();
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
async #handleFullscreenToggle() {
|
|
108
187
|
if (this._noScroll) {
|
|
109
188
|
this._noScroll = false;
|
|
110
189
|
await this.updateComplete;
|
|
@@ -116,7 +195,7 @@ class DemoPage extends LitElement {
|
|
|
116
195
|
}
|
|
117
196
|
}
|
|
118
197
|
|
|
119
|
-
|
|
198
|
+
#handleLanguageChange(e) {
|
|
120
199
|
const newLanguageCode = e.target[e.target.selectedIndex].value;
|
|
121
200
|
document.documentElement.dir = newLanguageCode === 'ar-sa' ? 'rtl' : 'ltr';
|
|
122
201
|
document.documentElement.lang = newLanguageCode;
|
|
@@ -5,13 +5,6 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
|
|
6
6
|
<meta charset="UTF-8">
|
|
7
7
|
<link rel="stylesheet" href="../../demo/styles.css" type="text/css">
|
|
8
|
-
<script>
|
|
9
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
10
|
-
window.D2L = { LP: { Web: { UI: { Flags: { Flag: (key) => {
|
|
11
|
-
if (key === 'GAUD-7472-dropdown-popover') return (urlParams.get('popover') === 'true');
|
|
12
|
-
return false;
|
|
13
|
-
} } } } } };
|
|
14
|
-
</script>
|
|
15
8
|
<script type="module">
|
|
16
9
|
import '../../demo/demo-page.js';
|
|
17
10
|
import '../../menu/menu.js';
|
|
@@ -5,13 +5,6 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
|
|
6
6
|
<meta charset="UTF-8">
|
|
7
7
|
<link rel="stylesheet" href="../../demo/styles.css" type="text/css">
|
|
8
|
-
<script>
|
|
9
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
10
|
-
window.D2L = { LP: { Web: { UI: { Flags: { Flag: (key) => {
|
|
11
|
-
if (key === 'GAUD-7472-dropdown-popover') return (urlParams.get('popover') === 'true');
|
|
12
|
-
return false;
|
|
13
|
-
} } } } } };
|
|
14
|
-
</script>
|
|
15
8
|
<script type="module">
|
|
16
9
|
import '../../demo/demo-page.js';
|
|
17
10
|
import '../../tabs/tabs.js';
|
|
@@ -4,13 +4,6 @@
|
|
|
4
4
|
<meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
|
|
5
5
|
<meta charset="UTF-8">
|
|
6
6
|
<link rel="stylesheet" href="../../demo/styles.css" type="text/css">
|
|
7
|
-
<script>
|
|
8
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
9
|
-
window.D2L = { LP: { Web: { UI: { Flags: { Flag: (key) => {
|
|
10
|
-
if (key === 'GAUD-7472-dropdown-popover') return (urlParams.get('popover') === 'true');
|
|
11
|
-
return false;
|
|
12
|
-
} } } } } };
|
|
13
|
-
</script>
|
|
14
7
|
<script type="module">
|
|
15
8
|
import '../../demo/demo-page.js';
|
|
16
9
|
import '../../button/button.js';
|
|
@@ -3,13 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
<head>
|
|
5
5
|
<link rel="stylesheet" href="../../demo/styles.css" type="text/css">
|
|
6
|
-
<script>
|
|
7
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
8
|
-
window.D2L = { LP: { Web: { UI: { Flags: { Flag: (key) => {
|
|
9
|
-
if (key === 'GAUD-7472-dropdown-popover') return (urlParams.get('popover') === 'true');
|
|
10
|
-
return false;
|
|
11
|
-
} } } } } };
|
|
12
|
-
</script>
|
|
13
6
|
<script type="module">
|
|
14
7
|
import '../../demo/demo-page.js';
|
|
15
8
|
import '../../button/button.js';
|
|
@@ -4,13 +4,6 @@
|
|
|
4
4
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
5
5
|
<meta charset="UTF-8">
|
|
6
6
|
<link rel="stylesheet" href="../../demo/styles.css" type="text/css">
|
|
7
|
-
<script>
|
|
8
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
9
|
-
window.D2L = { LP: { Web: { UI: { Flags: { Flag: (key) => {
|
|
10
|
-
if (key === 'GAUD-7472-dropdown-popover') return (urlParams.get('popover') === 'true');
|
|
11
|
-
return false;
|
|
12
|
-
} } } } } };
|
|
13
|
-
</script>
|
|
14
7
|
<script type="module">
|
|
15
8
|
import '../../demo/demo-page.js';
|
|
16
9
|
import '../input-date.js';
|
|
@@ -4,12 +4,6 @@
|
|
|
4
4
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
5
5
|
<meta charset="UTF-8">
|
|
6
6
|
<link rel="stylesheet" href="../../demo/styles.css" type="text/css">
|
|
7
|
-
<script type="module">
|
|
8
|
-
import { mockFlag } from '../../../helpers/flags.js';
|
|
9
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
10
|
-
mockFlag('GAUD-8295-menu-item-link-new-window-icon', urlParams.get('link-new-window-icon') === 'true');
|
|
11
|
-
mockFlag('GAUD-8369-menu-item-link-click-changes', urlParams.get('link-click-changes') === 'true');
|
|
12
|
-
</script>
|
|
13
7
|
<script type="module">
|
|
14
8
|
import '../../demo/demo-page.js';
|
|
15
9
|
import './custom-menu-item.js';
|
|
@@ -4,11 +4,6 @@
|
|
|
4
4
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
5
5
|
<meta charset="UTF-8">
|
|
6
6
|
<link rel="stylesheet" href="../../demo/styles.css" type="text/css">
|
|
7
|
-
<script type="module">
|
|
8
|
-
import { mockFlag } from '../../../helpers/flags.js';
|
|
9
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
10
|
-
mockFlag('GAUD-8263-scroll-wrapper-media-print', urlParams.get('media-query-print') === 'true');
|
|
11
|
-
</script>
|
|
12
7
|
<script type="module">
|
|
13
8
|
import '../../demo/demo-page.js';
|
|
14
9
|
import './scroll-wrapper-test.js';
|
|
@@ -4,11 +4,6 @@
|
|
|
4
4
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
5
5
|
<meta charset="UTF-8">
|
|
6
6
|
<link rel="stylesheet" href="../../demo/styles.css" type="text/css">
|
|
7
|
-
<script type="module">
|
|
8
|
-
import { mockFlag } from '../../../helpers/flags.js';
|
|
9
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
10
|
-
mockFlag('GAUD-8263-scroll-wrapper-media-print', urlParams.get('media-query-print') === 'true');
|
|
11
|
-
</script>
|
|
12
7
|
<script type="module">
|
|
13
8
|
import '../../demo/demo-page.js';
|
|
14
9
|
import './table-test.js';
|
|
@@ -6,14 +6,9 @@
|
|
|
6
6
|
<meta charset="UTF-8">
|
|
7
7
|
<link rel="stylesheet" href="../../demo/styles.css" type="text/css">
|
|
8
8
|
<script type="module">
|
|
9
|
-
import
|
|
10
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
11
|
-
mockFlag('GAUD-7355-tooltip-popover', urlParams.get('popover') === 'true');
|
|
12
|
-
</script>
|
|
13
|
-
<script type="module">
|
|
9
|
+
import '../../demo/demo-page.js';
|
|
14
10
|
import '../../button/button.js';
|
|
15
11
|
import '../../colors/colors.js';
|
|
16
|
-
import '../../demo/demo-page.js';
|
|
17
12
|
import '../../icons/icon-custom.js';
|
|
18
13
|
import '../../inputs/input-text.js';
|
|
19
14
|
import '../../link/link.js';
|
package/helpers/README.md
CHANGED
|
@@ -117,6 +117,23 @@ getFirstVisibleAncestor(node)
|
|
|
117
117
|
querySelectorComposed(node, selector)
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
+
## Flags
|
|
121
|
+
|
|
122
|
+
Helper functions to get and mock flag values.
|
|
123
|
+
|
|
124
|
+
```js
|
|
125
|
+
import { ... } from '@brightspace-ui/core/helpers/flags.js';
|
|
126
|
+
|
|
127
|
+
// returns the flag's mocked, configured, or default value
|
|
128
|
+
getFlag(key, defaultValue);
|
|
129
|
+
|
|
130
|
+
// for demos & tests, sets a mocked value for a flag, to be returned by getFlag
|
|
131
|
+
mockFlag(key, value);
|
|
132
|
+
|
|
133
|
+
// for demos & tests, removes the mocked value for a flag, so that getFlag returns the configured or default value
|
|
134
|
+
resetFlag(key);
|
|
135
|
+
```
|
|
136
|
+
|
|
120
137
|
## Focus
|
|
121
138
|
|
|
122
139
|
Focus helper functions to easily select focusable DOM nodes
|
package/helpers/flags.js
CHANGED
|
@@ -1,16 +1,45 @@
|
|
|
1
|
+
const knownFlags = new Map();
|
|
1
2
|
const flagOverrides = new Map();
|
|
2
3
|
|
|
3
4
|
export function getFlag(key, defaultValue) {
|
|
5
|
+
let value;
|
|
4
6
|
if (flagOverrides.has(key)) {
|
|
5
|
-
|
|
7
|
+
value = flagOverrides.get(key);
|
|
8
|
+
} else {
|
|
9
|
+
value = globalThis.D2L?.LP?.Web?.UI?.Flags.Flag(key, defaultValue) ?? defaultValue;
|
|
6
10
|
}
|
|
7
|
-
|
|
11
|
+
addKnownFlag(key, value, defaultValue);
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function getFlagOverrides() {
|
|
16
|
+
return flagOverrides;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function getKnownFlags() {
|
|
20
|
+
return knownFlags;
|
|
8
21
|
}
|
|
9
22
|
|
|
10
23
|
export function mockFlag(key, value) {
|
|
24
|
+
if (knownFlags.has(key)) console.warn(`mockFlag called after getFlag for '${key}'. This is likely to result in unexpected behaviour.`);
|
|
11
25
|
flagOverrides.set(key, value);
|
|
12
26
|
}
|
|
13
27
|
|
|
14
28
|
export function resetFlag(key) {
|
|
15
29
|
flagOverrides.delete(key);
|
|
16
30
|
}
|
|
31
|
+
|
|
32
|
+
let dispatchingKnownFlags = false;
|
|
33
|
+
|
|
34
|
+
function addKnownFlag(key, value, defaultValue) {
|
|
35
|
+
if (!knownFlags.has(key)) knownFlags.set(key, { value, defaultValue });
|
|
36
|
+
|
|
37
|
+
if (dispatchingKnownFlags) return;
|
|
38
|
+
dispatchingKnownFlags = true;
|
|
39
|
+
setTimeout(() => {
|
|
40
|
+
globalThis.document.dispatchEvent(new CustomEvent('d2l-flags-known', {
|
|
41
|
+
detail: { flagOverrides, knownFlags }
|
|
42
|
+
}));
|
|
43
|
+
dispatchingKnownFlags = false;
|
|
44
|
+
});
|
|
45
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brightspace-ui/core",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.174.0",
|
|
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",
|