lightning-base-components 1.18.3-alpha → 1.18.5-alpha

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.
Files changed (52) hide show
  1. package/metadata/raptor.json +21 -0
  2. package/package.json +3 -2
  3. package/src/lightning/baseCombobox/baseCombobox.js +20 -14
  4. package/src/lightning/buttonIcon/buttonIcon.js +19 -16
  5. package/src/lightning/combobox/combobox.js +17 -16
  6. package/src/lightning/primitiveInputCheckbox/form-element.slds.css +281 -0
  7. package/src/lightning/primitiveInputCheckbox/input-checkbox.slds.css +395 -0
  8. package/src/lightning/primitiveInputCheckbox/primitiveInputCheckbox.css +3 -0
  9. package/src/lightning/primitiveInputCheckbox/primitiveInputCheckbox.html +48 -0
  10. package/src/lightning/primitiveInputCheckbox/primitiveInputCheckbox.js +139 -0
  11. package/src/lightning/primitiveInputCheckboxButton/form-element.slds.css +281 -0
  12. package/src/lightning/primitiveInputCheckboxButton/input-checkbox-button.slds.css +126 -0
  13. package/src/lightning/primitiveInputCheckboxButton/primitiveInputCheckboxButton.css +6 -0
  14. package/src/lightning/primitiveInputCheckboxButton/primitiveInputCheckboxButton.html +24 -0
  15. package/src/lightning/primitiveInputCheckboxButton/primitiveInputCheckboxButton.js +176 -0
  16. package/src/lightning/primitiveInputColor/form-element.slds.css +281 -0
  17. package/src/lightning/primitiveInputColor/input-color.slds.css +35 -0
  18. package/src/lightning/primitiveInputColor/input-text.slds.css +398 -0
  19. package/src/lightning/primitiveInputColor/primitiveInputColor.css +4 -0
  20. package/src/lightning/primitiveInputColor/primitiveInputColor.html +50 -0
  21. package/src/lightning/primitiveInputColor/primitiveInputColor.js +184 -0
  22. package/src/lightning/primitiveInputFile/button.slds.css +527 -0
  23. package/src/lightning/primitiveInputFile/form-element.slds.css +281 -0
  24. package/src/lightning/primitiveInputFile/input-file.slds.css +62 -0
  25. package/src/lightning/primitiveInputFile/primitiveInputFile.css +5 -0
  26. package/src/lightning/primitiveInputFile/primitiveInputFile.html +45 -0
  27. package/src/lightning/primitiveInputFile/primitiveInputFile.js +111 -0
  28. package/src/lightning/primitiveInputRadio/primitiveInputRadio.html +24 -0
  29. package/src/lightning/primitiveInputRadio/primitiveInputRadio.js +103 -0
  30. package/src/lightning/primitiveInputSimple/form-element.slds.css +281 -0
  31. package/src/lightning/primitiveInputSimple/input-text.slds.css +398 -0
  32. package/src/lightning/primitiveInputSimple/normalize.js +6 -0
  33. package/src/lightning/primitiveInputSimple/primitiveInputSimple.css +9 -0
  34. package/src/lightning/primitiveInputSimple/primitiveInputSimple.html +65 -0
  35. package/src/lightning/primitiveInputSimple/primitiveInputSimple.js +585 -0
  36. package/src/lightning/primitiveInputSimple/selection.js +131 -0
  37. package/src/lightning/primitiveInputToggle/form-element.slds.css +281 -0
  38. package/src/lightning/primitiveInputToggle/input-toggle.slds.css +170 -0
  39. package/src/lightning/primitiveInputToggle/primitiveInputToggle.css +3 -0
  40. package/src/lightning/primitiveInputToggle/primitiveInputToggle.html +34 -0
  41. package/src/lightning/primitiveInputToggle/primitiveInputToggle.js +164 -0
  42. package/src/lightning/tab/tab.css +2 -0
  43. package/src/lightning/tab/tab.js +22 -14
  44. package/src/lightning/tab/tab.slds.css +47 -0
  45. package/src/lightning/tabset/tabset.css +10 -0
  46. package/src/lightning/tabset/tabset.js +28 -10
  47. package/src/lightning/button/__wdio__/utam/utam.html +0 -3
  48. package/src/lightning/button/__wdio__/utam/utam.js +0 -3
  49. package/src/lightning/button/__wdio__/utam/utam.spec.js +0 -20
  50. package/src/lightning/datatable/__wdio__/utam/utam.html +0 -32
  51. package/src/lightning/datatable/__wdio__/utam/utam.js +0 -91
  52. package/src/lightning/datatable/__wdio__/utam/utam.spec.js +0 -214
@@ -0,0 +1,164 @@
1
+ import { api } from 'lwc';
2
+ import LightningShadowBaseClass from 'lightning/shadowBaseClassPrivate';
3
+ import {
4
+ isNativeComponent,
5
+ normalizeAriaAttribute,
6
+ reflectAttribute,
7
+ } from 'lightning/utilsPrivate';
8
+ import { VARIANT } from 'lightning/inputUtils';
9
+ import labelRequired from '@salesforce/label/LightningControl.required';
10
+
11
+ const i18n = {
12
+ required: labelRequired,
13
+ };
14
+
15
+ export default class LightningPrimitiveInputToggle extends LightningShadowBaseClass {
16
+ _checked;
17
+ _value = '';
18
+ _ariaLabel;
19
+ _cachedInputElement;
20
+ _helpMessage = '';
21
+ _messageToggleActive;
22
+ _messageToggleInactive;
23
+
24
+ initialRender = false;
25
+
26
+ @api accessKey;
27
+ @api disabled;
28
+ @api label;
29
+ @api variant;
30
+ @api name;
31
+ @api readOnly;
32
+ @api required;
33
+ @api ariaInvalid;
34
+
35
+ /**
36
+ * Text shown for the active state of a toggle. The default is "Active".
37
+ * @type {string}
38
+ */
39
+ @api messageToggleActive;
40
+
41
+ /**
42
+ * Text shown for the inactive state of a toggle. The default is "Inactive".
43
+ * @type {string}
44
+ */
45
+ @api messageToggleInactive;
46
+
47
+ @api
48
+ get value() {
49
+ return this._value;
50
+ }
51
+ set value(newValue) {
52
+ // value can only be a string
53
+ this._value =
54
+ typeof newValue === 'number' || typeof newValue === 'string'
55
+ ? String(newValue)
56
+ : '';
57
+ }
58
+
59
+ @api
60
+ get checked() {
61
+ if (this.initialRender) {
62
+ return this.inputElement.checked;
63
+ }
64
+ return this._checked;
65
+ }
66
+ set checked(value) {
67
+ value = Boolean(value);
68
+ this._checked = value;
69
+ if (this.initialRender) {
70
+ this.inputElement.checked = this._checked;
71
+ }
72
+ }
73
+
74
+ @api
75
+ get ariaDescribedByElements() {
76
+ return [
77
+ this.template.querySelector('[data-help-message]'),
78
+ this.template.querySelector('data-toggle-description'),
79
+ ];
80
+ }
81
+
82
+ @api
83
+ get isNativeShadow() {
84
+ return this._isNativeShadow;
85
+ }
86
+
87
+ @api
88
+ get ariaLabel() {
89
+ return this._ariaLabel;
90
+ }
91
+ set ariaLabel(value) {
92
+ this._ariaLabel = normalizeAriaAttribute(value);
93
+ }
94
+
95
+ @api
96
+ get inputElement() {
97
+ // cache the input in order to reduce dom queries
98
+ if (!this._cachedInputElement) {
99
+ let inputElement = this.template.querySelector('input');
100
+ this._cachedInputElement = inputElement;
101
+ }
102
+ return this._cachedInputElement;
103
+ }
104
+
105
+ @api
106
+ get helpMessage() {
107
+ return this._helpMessage;
108
+ }
109
+ set helpMessage(message) {
110
+ this._helpMessage = message;
111
+ reflectAttribute(this, 'invalid', Boolean(message));
112
+ }
113
+
114
+ get computedLabelClass() {
115
+ return this.variant === VARIANT.LABEL_HIDDEN
116
+ ? 'slds-form-element__label slds-assistive-text'
117
+ : 'slds-form-element__label';
118
+ }
119
+
120
+ get i18n() {
121
+ return i18n;
122
+ }
123
+
124
+ handleBlur() {
125
+ this.dispatchEvent(new CustomEvent('blur'));
126
+ }
127
+
128
+ handleFocus() {
129
+ this.dispatchEvent(new CustomEvent('focus'));
130
+ }
131
+
132
+ handleChange(event) {
133
+ this._checked = event.target.checked;
134
+ const changeEvent = new CustomEvent('change', {
135
+ detail: {
136
+ checked: event.target.checked,
137
+ },
138
+ });
139
+ this.dispatchEvent(changeEvent);
140
+ }
141
+
142
+ handleClick() {
143
+ if (this.template.activeElement === null) {
144
+ this.template.querySelector("[type='checkbox']").focus();
145
+ }
146
+ }
147
+
148
+ connectedCallback() {
149
+ super.connectedCallback();
150
+ this._isNativeShadow = isNativeComponent(this);
151
+ }
152
+
153
+ renderedCallback() {
154
+ if (!this.initialRender) {
155
+ this.inputElement.checked = this.checked;
156
+ this.inputElement.value = this._value;
157
+ this.initialRender = true;
158
+ }
159
+ }
160
+
161
+ disconnectedCallback() {
162
+ this._cachedInputElement = undefined;
163
+ }
164
+ }
@@ -0,0 +1,2 @@
1
+ @import 'lightning/sldsCommon';
2
+ @import './tab.slds.css';
@@ -1,28 +1,36 @@
1
- import { LightningElement, api, track } from 'lwc';
1
+ import { api, track } from 'lwc';
2
2
  import { normalizeBoolean } from 'lightning/utilsPrivate';
3
-
3
+ import LightningShadowBaseClass from 'lightning/shadowBaseClassPrivate';
4
4
  /**
5
5
  * A single tab in a tabset component.
6
6
  * @slot default Placeholder for your content in lightning-tab.
7
7
  */
8
- export default class LightningTab extends LightningElement {
8
+ export default class LightningTab extends LightningShadowBaseClass {
9
9
  @track _loadContent = false;
10
+ _registered = false;
10
11
 
11
12
  connectedCallback() {
13
+ super.connectedCallback();
12
14
  this._connected = true;
15
+ }
13
16
 
14
- this.dispatchEvent(
15
- new CustomEvent('privatetabregister', {
16
- cancelable: true,
17
- bubbles: true,
18
- composed: true,
19
- detail: {
20
- setDeRegistrationCallback: (deRegistrationCallback) => {
21
- this._deRegistrationCallback = deRegistrationCallback;
17
+ renderedCallback() {
18
+ if (!this._registered) {
19
+ this._registered = true;
20
+ this.dispatchEvent(
21
+ new CustomEvent('privatetabregister', {
22
+ cancelable: true,
23
+ bubbles: true,
24
+ composed: true,
25
+ detail: {
26
+ setDeRegistrationCallback: (deRegistrationCallback) => {
27
+ this._deRegistrationCallback =
28
+ deRegistrationCallback;
29
+ },
22
30
  },
23
- },
24
- })
25
- );
31
+ })
32
+ );
33
+ }
26
34
  }
27
35
 
28
36
  /**
@@ -0,0 +1,47 @@
1
+
2
+ @supports (--styling-hooks: '') {
3
+ /* Reassignments for parity with SLDS blueprint
4
+ https://www.lightningdesignsystem.com/components/tabs/#Styling-Hooks-Overview */
5
+
6
+
7
+ :host([data-render-mode="shadow"].slds-tabs_default__content) {
8
+ --slds-c-tabs-panel-spacing-block-start: var(--slds-c-tab-panel-spacing-block-start);
9
+ --slds-c-tabs-panel-spacing-block-end: var(--slds-c-tab-panel-spacing-block-end);
10
+ --slds-c-tabs-panel-spacing-inline-end: var(--slds-c-tab-panel-spacing-inline-end);
11
+ --slds-c-tabs-panel-spacing-inline-start: var(--slds-c-tab-panel-spacing-inline-start);
12
+
13
+ position: relative;
14
+ padding-block-start: var(--slds-c-tab-panel-spacing-block-start, var(--sds-g-spacing-3, 0.75rem));
15
+ padding-inline-end: var(--slds-c-tab-panel-spacing-inline-end, 0);
16
+ padding-block-end: var(--slds-c-tab-panel-spacing-block-end, var(--sds-g-spacing-3, 0.75rem));
17
+ padding-inline-start: var(--slds-c-tab-panel-spacing-inline-start, 0);
18
+ }
19
+
20
+ :host([data-render-mode="shadow"].slds-tabs_scoped__content) {
21
+ background-color: var(--slds-g-color-neutral-base-100, var(--sds-g-color-neutral-base-100, #ffffff));
22
+ border: var(--sds-g-sizing-border-1, 1px) solid var(--slds-g-color-border-base-4, var(--sds-g-color-neutral-base-80, #c9c9c9));
23
+ border-block-start: 0;
24
+ border-start-start-radius: 0;
25
+ border-start-end-radius: 0;
26
+ border-end-end-radius: var(--sds-g-spacing-1, 0.25rem);
27
+ border-end-start-radius: var(--sds-g-spacing-1, 0.25rem);
28
+ padding: var(--sds-g-spacing-4, 1rem);
29
+ }
30
+
31
+ :host([data-render-mode="shadow"].slds-vertical-tabs__content) {
32
+ flex: 1;
33
+ padding: var(--sds-g-spacing-4, 1rem);
34
+ background: var(--slds-g-color-neutral-base-100, var(--sds-g-color-neutral-base-100, #ffffff));
35
+ }
36
+
37
+ /* TODO W-12674349: Replace with Visibility Utility Classes when available */
38
+ :host([data-render-mode="shadow"].slds-show) {
39
+ display: block;
40
+ }
41
+
42
+ /* TODO W-12674349: Replace with Visibility Utility Classes when available */
43
+ :host([data-render-mode="shadow"].slds-hide) {
44
+ display: none !important
45
+ }
46
+
47
+ }
@@ -0,0 +1,10 @@
1
+ /* TODO W-12129682: styles are commented out for the future migration of `tabset`
2
+ to Native Shadow
3
+
4
+ :host([data-render-mode="shadow"]) .slds-vertical-tabs {
5
+ display: flex;
6
+ overflow: hidden;
7
+ border: 1px solid var(--slds-g-color-border-base-1, #e5e5e5);
8
+ border-radius: 0.25rem;]
9
+ }
10
+ */
@@ -23,6 +23,8 @@ export default class LightningTabset extends LightningElement {
23
23
 
24
24
  @track _tabHeaders = [];
25
25
 
26
+ _rerender = false;
27
+
26
28
  connectedCallback() {
27
29
  this._tabByValue = {};
28
30
  this._connected = true;
@@ -36,6 +38,19 @@ export default class LightningTabset extends LightningElement {
36
38
  );
37
39
  }
38
40
 
41
+ // must wait for this entire `tab-set` component to be rendered in order to
42
+ // successfully querySelect `tab-bar` from it, in methods such as _updateTabBarHeaders
43
+ // or _selectTab.
44
+ // using _rerender to trigger renderedCallback and execute these methods in here
45
+ // instead of the handleTabRegister method, where `tab-bar` is not querySelectable.
46
+ renderedCallback() {
47
+ if (this._rerender) {
48
+ this._rerender = false;
49
+ this._updateTabBarHeaders(this._tabHeaders);
50
+ this._selectTab(this._activeTabValue);
51
+ }
52
+ }
53
+
39
54
  disconnectedCallback() {
40
55
  this._connected = false;
41
56
  }
@@ -84,7 +99,8 @@ export default class LightningTabset extends LightningElement {
84
99
 
85
100
  handleTabRegister(event) {
86
101
  event.stopPropagation();
87
-
102
+ // setting this to true, will trigger _updateTabBarHeaders and _selectTab in renderedCallback
103
+ this._rerender = true;
88
104
  const tab = event.target;
89
105
 
90
106
  tab.role = 'tabpanel';
@@ -149,6 +165,11 @@ export default class LightningTabset extends LightningElement {
149
165
  endIconAlternativeText: tab.endIconAlternativeText,
150
166
  showErrorIndicator: tab.showErrorIndicator,
151
167
  });
168
+
169
+ // need to leave this _updateTabBarHeaders here so that `tab-bar` can be updated
170
+ // in the case of a "conditional tab". the _updateTabBarHeaders in the renderedCallback
171
+ // has no knowledge of the new tab being added.
172
+ // this call works here in the "conditional tab" case, as `tab-set` is already rendered.
152
173
  this._updateTabBarHeaders(this._tabHeaders);
153
174
 
154
175
  this._tabByValue[tabValue] = tab;
@@ -157,10 +178,6 @@ export default class LightningTabset extends LightningElement {
157
178
  if (!this._activeTabValue) {
158
179
  this._activeTabValue = tab.value;
159
180
  }
160
-
161
- if (this._activeTabValue === tab.value) {
162
- this._selectTab(tabValue);
163
- }
164
181
  }
165
182
 
166
183
  _selectTab(value) {
@@ -242,16 +259,17 @@ export default class LightningTabset extends LightningElement {
242
259
  * @param {Array} headers
243
260
  */
244
261
  _updateTabBarHeaders(headers) {
245
- this.template.querySelector('lightning-tab-bar').tabHeaders =
246
- headers.slice();
262
+ if (this.template.querySelector('lightning-tab-bar')) {
263
+ this.template.querySelector('lightning-tab-bar').tabHeaders =
264
+ headers.slice();
265
+ }
247
266
  }
248
267
 
249
268
  _selectTabHeaderByTabValue(value) {
250
- if (!this._connected) {
269
+ const tabBar = this.template.querySelector('lightning-tab-bar');
270
+ if (!this._connected || !tabBar) {
251
271
  return;
252
272
  }
253
-
254
- const tabBar = this.template.querySelector('lightning-tab-bar');
255
273
  tabBar.selectTabByValue(value);
256
274
  }
257
275
 
@@ -1,3 +0,0 @@
1
- <template>
2
- <lightning-button label="Click me" variant="brand"></lightning-button>
3
- </template>
@@ -1,3 +0,0 @@
1
- import { LightningElement } from 'lwc';
2
-
3
- export default class ButtonUtam extends LightningElement {}
@@ -1,20 +0,0 @@
1
- const Button = require('pageobjects/button');
2
-
3
- describe('button utam test', () => {
4
- let root;
5
-
6
- beforeEach(async () => {
7
- await browser.url('/button/utam');
8
- root = await $('button-utam');
9
- await root.waitForDisplayed();
10
- });
11
-
12
- it('should get the button name', async () => {
13
- const button = await utam.load(Button, {
14
- element: await root.shadow$('lightning-button'),
15
- });
16
-
17
- const label = await button.getButtonName();
18
- expect(label).toBe('Click me');
19
- });
20
- });
@@ -1,32 +0,0 @@
1
- <template>
2
- <div style="height:160px">
3
- <lightning-datatable
4
- data-render-mode="default"
5
- key-field="id"
6
- columns={columns}
7
- data={data}
8
- default-sort-direction={defaultSortDirection}
9
- sorted-direction={sortDirection}
10
- sorted-by={sortedBy}
11
- onsort={onHandleSort}
12
- is-loading={loading}>
13
- </lightning-datatable>
14
- </div>
15
- <div style="height:160px">
16
- <lightning-datatable
17
- data-render-mode="role-based"
18
- key-field="id"
19
- columns={columns}
20
- data={data}
21
- default-sort-direction={defaultSortDirection}
22
- sorted-direction={sortDirection}
23
- sorted-by={sortedBy}
24
- onsort={onHandleSort}
25
- is-loading={loading}
26
- render-mode="role-based">
27
- </lightning-datatable>
28
- </div>
29
-
30
- <lightning-button label="Enable Loading State" onclick={handleLoadingClick}></lightning-button>
31
- <lightning-button label="Add More Rows" onclick={handleMoreRowsClick}></lightning-button>
32
- </template>
@@ -1,91 +0,0 @@
1
- import { LightningElement } from 'lwc';
2
-
3
- const data = [
4
- { id: 1, name: 'Billy Simmons', age: 40, email: 'billy@salesforce.com' },
5
- { id: 2, name: 'Kelsey Denesik', age: 35, email: 'kelsey@salesforce.com' },
6
- { id: 3, name: 'Kyle Ruecker', age: 50, email: 'kyle@salesforce.com' },
7
- {
8
- id: 4,
9
- name: 'Krystina Kerluke',
10
- age: 37,
11
- email: 'krystina@salesforce.com',
12
- },
13
- ];
14
-
15
- const actions = [
16
- { label: 'Show details', name: 'show_details' },
17
- { label: 'Delete', name: 'delete' },
18
- ];
19
-
20
- const columns = [
21
- { label: 'Name', fieldName: 'name' },
22
- {
23
- label: 'Age',
24
- fieldName: 'age',
25
- type: 'number',
26
- sortable: true,
27
- cellAttributes: { alignment: 'left' },
28
- },
29
- {
30
- label: 'Email',
31
- fieldName: 'email',
32
- type: 'email',
33
- hideDefaultActions: true,
34
- },
35
- {
36
- type: 'action',
37
- typeAttributes: { rowActions: actions, menuAlignment: 'right' },
38
- },
39
- ];
40
-
41
- export default class DemoApp extends LightningElement {
42
- data = data;
43
- columns = columns;
44
- defaultSortDirection = 'asc';
45
- sortDirection = 'asc';
46
- sortedBy;
47
- loading = false;
48
-
49
- // Used to sort the 'Age' column
50
- sortBy(field, reverse, primer) {
51
- const key = primer
52
- ? function (x) {
53
- return primer(x[field]);
54
- }
55
- : function (x) {
56
- return x[field];
57
- };
58
-
59
- return function (a, b) {
60
- a = key(a);
61
- b = key(b);
62
- return reverse * ((a > b) - (b > a));
63
- };
64
- }
65
-
66
- onHandleSort(event) {
67
- const { fieldName: sortedBy, sortDirection } = event.detail;
68
- const cloneData = [...this.data];
69
-
70
- cloneData.sort(this.sortBy(sortedBy, sortDirection === 'asc' ? 1 : -1));
71
- this.data = cloneData;
72
- this.sortDirection = sortDirection;
73
- this.sortedBy = sortedBy;
74
- }
75
-
76
- handleLoadingClick() {
77
- this.loading = !this.loading;
78
- }
79
-
80
- handleMoreRowsClick() {
81
- const control = [
82
- {
83
- id: 20,
84
- name: 'Jacqueline Palmer',
85
- age: 60,
86
- email: 'jacqueline@salesforce.com',
87
- },
88
- ];
89
- this.data = this.data.concat(this.data).concat(control);
90
- }
91
- }