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.
- package/metadata/raptor.json +21 -0
- package/package.json +3 -2
- package/src/lightning/baseCombobox/baseCombobox.js +20 -14
- package/src/lightning/buttonIcon/buttonIcon.js +19 -16
- package/src/lightning/combobox/combobox.js +17 -16
- package/src/lightning/primitiveInputCheckbox/form-element.slds.css +281 -0
- package/src/lightning/primitiveInputCheckbox/input-checkbox.slds.css +395 -0
- package/src/lightning/primitiveInputCheckbox/primitiveInputCheckbox.css +3 -0
- package/src/lightning/primitiveInputCheckbox/primitiveInputCheckbox.html +48 -0
- package/src/lightning/primitiveInputCheckbox/primitiveInputCheckbox.js +139 -0
- package/src/lightning/primitiveInputCheckboxButton/form-element.slds.css +281 -0
- package/src/lightning/primitiveInputCheckboxButton/input-checkbox-button.slds.css +126 -0
- package/src/lightning/primitiveInputCheckboxButton/primitiveInputCheckboxButton.css +6 -0
- package/src/lightning/primitiveInputCheckboxButton/primitiveInputCheckboxButton.html +24 -0
- package/src/lightning/primitiveInputCheckboxButton/primitiveInputCheckboxButton.js +176 -0
- package/src/lightning/primitiveInputColor/form-element.slds.css +281 -0
- package/src/lightning/primitiveInputColor/input-color.slds.css +35 -0
- package/src/lightning/primitiveInputColor/input-text.slds.css +398 -0
- package/src/lightning/primitiveInputColor/primitiveInputColor.css +4 -0
- package/src/lightning/primitiveInputColor/primitiveInputColor.html +50 -0
- package/src/lightning/primitiveInputColor/primitiveInputColor.js +184 -0
- package/src/lightning/primitiveInputFile/button.slds.css +527 -0
- package/src/lightning/primitiveInputFile/form-element.slds.css +281 -0
- package/src/lightning/primitiveInputFile/input-file.slds.css +62 -0
- package/src/lightning/primitiveInputFile/primitiveInputFile.css +5 -0
- package/src/lightning/primitiveInputFile/primitiveInputFile.html +45 -0
- package/src/lightning/primitiveInputFile/primitiveInputFile.js +111 -0
- package/src/lightning/primitiveInputRadio/primitiveInputRadio.html +24 -0
- package/src/lightning/primitiveInputRadio/primitiveInputRadio.js +103 -0
- package/src/lightning/primitiveInputSimple/form-element.slds.css +281 -0
- package/src/lightning/primitiveInputSimple/input-text.slds.css +398 -0
- package/src/lightning/primitiveInputSimple/normalize.js +6 -0
- package/src/lightning/primitiveInputSimple/primitiveInputSimple.css +9 -0
- package/src/lightning/primitiveInputSimple/primitiveInputSimple.html +65 -0
- package/src/lightning/primitiveInputSimple/primitiveInputSimple.js +585 -0
- package/src/lightning/primitiveInputSimple/selection.js +131 -0
- package/src/lightning/primitiveInputToggle/form-element.slds.css +281 -0
- package/src/lightning/primitiveInputToggle/input-toggle.slds.css +170 -0
- package/src/lightning/primitiveInputToggle/primitiveInputToggle.css +3 -0
- package/src/lightning/primitiveInputToggle/primitiveInputToggle.html +34 -0
- package/src/lightning/primitiveInputToggle/primitiveInputToggle.js +164 -0
- package/src/lightning/tab/tab.css +2 -0
- package/src/lightning/tab/tab.js +22 -14
- package/src/lightning/tab/tab.slds.css +47 -0
- package/src/lightning/tabset/tabset.css +10 -0
- package/src/lightning/tabset/tabset.js +28 -10
- package/src/lightning/button/__wdio__/utam/utam.html +0 -3
- package/src/lightning/button/__wdio__/utam/utam.js +0 -3
- package/src/lightning/button/__wdio__/utam/utam.spec.js +0 -20
- package/src/lightning/datatable/__wdio__/utam/utam.html +0 -32
- package/src/lightning/datatable/__wdio__/utam/utam.js +0 -91
- 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
|
+
}
|
package/src/lightning/tab/tab.js
CHANGED
|
@@ -1,28 +1,36 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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')
|
|
246
|
-
|
|
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
|
-
|
|
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,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
|
-
}
|