@antify/ui 2.1.0 → 2.2.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.
- package/README.md +13 -0
- package/dist/components/AntDropdown.vue +1 -1
- package/dist/components/AntModal.vue +1 -1
- package/dist/components/AntToaster.vue +1 -1
- package/dist/components/buttons/AntButton.vue +0 -1
- package/dist/components/inputs/AntCheckbox.vue +1 -0
- package/dist/components/inputs/AntCheckboxGroup.vue +1 -0
- package/dist/components/inputs/AntNumberInput.vue +40 -12
- package/dist/components/inputs/AntRangeSlider.vue +1 -1
- package/dist/components/inputs/AntSelect.vue +2 -1
- package/dist/components/inputs/AntSwitch.vue +1 -0
- package/dist/components/inputs/AntTextarea.vue +1 -1
- package/dist/components/inputs/Elements/AntBaseInput.vue +2 -1
- package/dist/components/inputs/__stories/AntNumberInput.stories.js +21 -1
- package/dist/components/inputs/__stories/AntNumberInput.stories.mjs +15 -1
- package/dist/components/inputs/__stories/AntSelect.stories.js +22 -1
- package/dist/components/inputs/__stories/AntSelect.stories.mjs +22 -1
- package/dist/components/table/AntCollapsibleTableRowContent.vue +25 -0
- package/dist/components/table/AntTable.vue +125 -47
- package/dist/components/table/AntTd.vue +0 -4
- package/dist/components/table/__stories/AntTable.stories.d.ts +3 -0
- package/dist/components/table/__stories/AntTable.stories.js +238 -16
- package/dist/components/table/__stories/AntTable.stories.mjs +195 -15
- package/dist/components/table/__types/AntCollapsibleTable.types.d.ts +4 -0
- package/dist/components/table/__types/AntCollapsibleTable.types.js +11 -0
- package/dist/components/table/__types/AntCollapsibleTable.types.mjs +5 -0
- package/dist/tailwind.config.d.ts +2 -1
- package/package.json +5 -3
|
@@ -3,14 +3,22 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
module.exports = exports.Skeleton = exports.Loading = exports.Empty = exports.Docs = void 0;
|
|
6
|
+
module.exports = exports.Skeleton = exports.MultipleCollapseStrategy = exports.Loading = exports.Empty = exports.Docs = exports.DefaultCollapseOpen = exports.Collapsible = void 0;
|
|
7
7
|
var _AntTable = _interopRequireDefault(require("../AntTable.vue"));
|
|
8
|
+
var _AntButton = _interopRequireDefault(require("../../buttons/AntButton.vue"));
|
|
9
|
+
var _AntSelect = _interopRequireDefault(require("../../inputs/AntSelect.vue"));
|
|
10
|
+
var _AntCheckboxGroup = _interopRequireDefault(require("../../inputs/AntCheckboxGroup.vue"));
|
|
8
11
|
var _TableHeader = require("../__types/TableHeader.types");
|
|
9
12
|
var _vue = require("vue");
|
|
10
13
|
var _faker = require("@faker-js/faker");
|
|
11
14
|
var _AntSwitch = _interopRequireDefault(require("../../inputs/AntSwitch.vue"));
|
|
15
|
+
var _test = require("@storybook/test");
|
|
12
16
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
17
|
const meta = {
|
|
18
|
+
components: {
|
|
19
|
+
AntSelect: _AntSelect.default,
|
|
20
|
+
AntCheckboxGroup: _AntCheckboxGroup.default
|
|
21
|
+
},
|
|
14
22
|
title: "Components/Table",
|
|
15
23
|
component: _AntTable.default,
|
|
16
24
|
parameters: {
|
|
@@ -137,7 +145,7 @@ const meta = {
|
|
|
137
145
|
};
|
|
138
146
|
module.exports = meta;
|
|
139
147
|
const testData = (0, _vue.ref)([]);
|
|
140
|
-
|
|
148
|
+
function getRandomEntry() {
|
|
141
149
|
const randomName = _faker.faker.person.firstName() + " " + _faker.faker.person.lastName();
|
|
142
150
|
const randomNumber = _faker.faker.number.int({
|
|
143
151
|
min: 18,
|
|
@@ -145,38 +153,96 @@ for (let i = 0; i < 100; i++) {
|
|
|
145
153
|
});
|
|
146
154
|
const randomEmail = _faker.faker.internet.email();
|
|
147
155
|
const randomBoolean = _faker.faker.datatype.boolean();
|
|
148
|
-
|
|
156
|
+
const randomPermissions = _faker.faker.helpers.arrayElements(["read", "write"], {
|
|
157
|
+
min: 0,
|
|
158
|
+
max: 2
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
149
161
|
name: randomName,
|
|
150
162
|
age: randomNumber,
|
|
151
163
|
email: randomEmail,
|
|
152
|
-
employed: randomBoolean
|
|
153
|
-
|
|
164
|
+
employed: randomBoolean,
|
|
165
|
+
permissions: randomPermissions
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
for (let i = 0; i < 100; i++) {
|
|
169
|
+
testData.value.push(getRandomEntry());
|
|
154
170
|
}
|
|
155
171
|
const Docs = exports.Docs = {
|
|
156
172
|
render: args => ({
|
|
157
173
|
components: {
|
|
158
174
|
AntTable: _AntTable.default,
|
|
159
|
-
AntSwitch: _AntSwitch.default
|
|
175
|
+
AntSwitch: _AntSwitch.default,
|
|
176
|
+
AntCheckboxGroup: _AntCheckboxGroup.default
|
|
160
177
|
},
|
|
161
178
|
setup() {
|
|
162
179
|
const selected = (0, _vue.ref)();
|
|
180
|
+
const checkboxes = [{
|
|
181
|
+
label: "Read",
|
|
182
|
+
value: "read"
|
|
183
|
+
}, {
|
|
184
|
+
label: "Write",
|
|
185
|
+
value: "write"
|
|
186
|
+
}];
|
|
163
187
|
return {
|
|
164
188
|
args,
|
|
165
|
-
selected
|
|
189
|
+
selected,
|
|
190
|
+
checkboxes
|
|
166
191
|
};
|
|
167
192
|
},
|
|
168
193
|
template: `
|
|
169
194
|
<div class="h-96 border border-dashed border-base-300">
|
|
170
195
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
171
196
|
<template #cellContent="{element: entry, header}">
|
|
172
|
-
<div v-if="header.identifier === '
|
|
173
|
-
<AntSwitch v-model="entry.
|
|
197
|
+
<div v-if="header.identifier === 'employed'">
|
|
198
|
+
<AntSwitch v-model="entry.employed"/>
|
|
199
|
+
</div>
|
|
200
|
+
|
|
201
|
+
<div v-if="header.identifier === 'permissions'">
|
|
202
|
+
<AntCheckboxGroup v-model="entry.permissions" :checkboxes="checkboxes" direction="row"/>
|
|
174
203
|
</div>
|
|
175
204
|
</template>
|
|
176
205
|
</AntTable>
|
|
177
206
|
</div>
|
|
178
207
|
`
|
|
179
208
|
}),
|
|
209
|
+
play: async ({
|
|
210
|
+
step
|
|
211
|
+
}) => {
|
|
212
|
+
const firstRow = document.querySelectorAll('[data-e2e="table-row"]')[0];
|
|
213
|
+
const employedCell = firstRow.querySelector('[data-e2e="table-cell-employed"]');
|
|
214
|
+
const employedSwitch = employedCell?.querySelector('[data-e2e="switch"]')?.querySelector("button");
|
|
215
|
+
const permissionsCell = firstRow.querySelector('[data-e2e="table-cell-permissions"]');
|
|
216
|
+
const permissionCheckboxWithLabel = permissionsCell?.querySelector('[data-e2e="checkbox"]');
|
|
217
|
+
const permissionCheckbox = permissionCheckboxWithLabel?.querySelector('[type="checkbox"]');
|
|
218
|
+
const permissionLabel = permissionCheckboxWithLabel?.querySelector("label");
|
|
219
|
+
await step("Click on a table cell and expect the row to be selected", async () => {
|
|
220
|
+
await _test.userEvent.click(employedCell);
|
|
221
|
+
await (0, _test.waitFor)(() => (0, _test.expect)(firstRow).toHaveClass("bg-primary-200"), {
|
|
222
|
+
timeout: 600
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
await step("Click on employed switch and expect the value to toggle", async () => {
|
|
226
|
+
const initialAriaChecked = JSON.parse(employedSwitch?.getAttribute("aria-checked"));
|
|
227
|
+
await _test.userEvent.click(employedSwitch);
|
|
228
|
+
await (0, _test.waitFor)(() => {
|
|
229
|
+
const toggledAriaChecked = JSON.parse(employedSwitch?.getAttribute("aria-checked"));
|
|
230
|
+
(0, _test.expect)(toggledAriaChecked).toBe(!initialAriaChecked);
|
|
231
|
+
}, {
|
|
232
|
+
timeout: 600
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
await step("Click on one of the permissions and expect the value to toggle", async () => {
|
|
236
|
+
const initialAriaChecked = JSON.parse(permissionCheckbox?.getAttribute("aria-checked"));
|
|
237
|
+
await _test.userEvent.click(permissionLabel);
|
|
238
|
+
await (0, _test.waitFor)(() => {
|
|
239
|
+
const toggledAriaChecked = JSON.parse(permissionCheckbox?.getAttribute("aria-checked"));
|
|
240
|
+
(0, _test.expect)(toggledAriaChecked).toBe(!initialAriaChecked);
|
|
241
|
+
}, {
|
|
242
|
+
timeout: 600
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
},
|
|
180
246
|
args: {
|
|
181
247
|
headers: [{
|
|
182
248
|
title: "Name",
|
|
@@ -196,8 +262,13 @@ const Docs = exports.Docs = {
|
|
|
196
262
|
rowClassList: "",
|
|
197
263
|
type: _TableHeader.AntTableRowTypes.text
|
|
198
264
|
}, {
|
|
199
|
-
title: "
|
|
200
|
-
identifier: "
|
|
265
|
+
title: "Employed",
|
|
266
|
+
identifier: "employed",
|
|
267
|
+
rowClassList: "",
|
|
268
|
+
type: _TableHeader.AntTableRowTypes.slot
|
|
269
|
+
}, {
|
|
270
|
+
title: "Permissions",
|
|
271
|
+
identifier: "permissions",
|
|
201
272
|
rowClassList: "",
|
|
202
273
|
type: _TableHeader.AntTableRowTypes.slot
|
|
203
274
|
}],
|
|
@@ -222,8 +293,8 @@ const Empty = exports.Empty = {
|
|
|
222
293
|
<div class="h-96 border border-dashed border-base-300">
|
|
223
294
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
224
295
|
<template #cellContent="{element: entry, header}">
|
|
225
|
-
<div v-if="header.identifier === '
|
|
226
|
-
<AntSwitch v-model="entry.
|
|
296
|
+
<div v-if="header.identifier === 'employed'">
|
|
297
|
+
<AntSwitch v-model="entry.employed"/>
|
|
227
298
|
</div>
|
|
228
299
|
</template>
|
|
229
300
|
</AntTable>
|
|
@@ -232,14 +303,13 @@ const Empty = exports.Empty = {
|
|
|
232
303
|
<div class="h-96 border border-dashed border-base-300">
|
|
233
304
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" empty-state-text="Custom Empty State Text">
|
|
234
305
|
<template #cellContent="{element: entry, header}">
|
|
235
|
-
<div v-if="header.identifier === '
|
|
236
|
-
<AntSwitch v-model="entry.
|
|
306
|
+
<div v-if="header.identifier === 'employed'">
|
|
307
|
+
<AntSwitch v-model="entry.employed"/>
|
|
237
308
|
</div>
|
|
238
309
|
</template>
|
|
239
310
|
</AntTable>
|
|
240
311
|
</div>
|
|
241
312
|
</div>
|
|
242
|
-
</div>
|
|
243
313
|
`
|
|
244
314
|
}),
|
|
245
315
|
args: {
|
|
@@ -334,4 +404,156 @@ const Loading = exports.Loading = {
|
|
|
334
404
|
}],
|
|
335
405
|
data: testData.value
|
|
336
406
|
}
|
|
407
|
+
};
|
|
408
|
+
const Collapsible = exports.Collapsible = {
|
|
409
|
+
render: args => ({
|
|
410
|
+
components: {
|
|
411
|
+
AntTable: _AntTable.default,
|
|
412
|
+
AntSwitch: _AntSwitch.default,
|
|
413
|
+
AntCheckboxGroup: _AntCheckboxGroup.default
|
|
414
|
+
},
|
|
415
|
+
setup() {
|
|
416
|
+
const selected = (0, _vue.ref)();
|
|
417
|
+
const checkboxes = [{
|
|
418
|
+
label: "Read",
|
|
419
|
+
value: "read"
|
|
420
|
+
}, {
|
|
421
|
+
label: "Write",
|
|
422
|
+
value: "write"
|
|
423
|
+
}];
|
|
424
|
+
return {
|
|
425
|
+
args,
|
|
426
|
+
selected,
|
|
427
|
+
checkboxes
|
|
428
|
+
};
|
|
429
|
+
},
|
|
430
|
+
template: `
|
|
431
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
432
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
433
|
+
<template #cellContent="{element: entry, header}">
|
|
434
|
+
<div v-if="header.identifier === 'employed'">
|
|
435
|
+
<AntSwitch v-model="entry.employed"/>
|
|
436
|
+
</div>
|
|
437
|
+
|
|
438
|
+
<div v-if="header.identifier === 'permissions'">
|
|
439
|
+
<AntCheckboxGroup v-model="entry.permissions" :checkboxes="checkboxes" direction="row"/>
|
|
440
|
+
</div>
|
|
441
|
+
</template>
|
|
442
|
+
|
|
443
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
444
|
+
<div class="p-4">
|
|
445
|
+
<pre>
|
|
446
|
+
{{element}}
|
|
447
|
+
</pre>
|
|
448
|
+
</div>
|
|
449
|
+
</template>
|
|
450
|
+
</AntTable>
|
|
451
|
+
</div>
|
|
452
|
+
`
|
|
453
|
+
}),
|
|
454
|
+
args: Docs.args
|
|
455
|
+
};
|
|
456
|
+
const MultipleCollapseStrategy = exports.MultipleCollapseStrategy = {
|
|
457
|
+
render: args => ({
|
|
458
|
+
components: {
|
|
459
|
+
AntTable: _AntTable.default,
|
|
460
|
+
AntSwitch: _AntSwitch.default,
|
|
461
|
+
AntCheckboxGroup: _AntCheckboxGroup.default
|
|
462
|
+
},
|
|
463
|
+
setup() {
|
|
464
|
+
const selected = (0, _vue.ref)();
|
|
465
|
+
const checkboxes = [{
|
|
466
|
+
label: "Read",
|
|
467
|
+
value: "read"
|
|
468
|
+
}, {
|
|
469
|
+
label: "Write",
|
|
470
|
+
value: "write"
|
|
471
|
+
}];
|
|
472
|
+
return {
|
|
473
|
+
args,
|
|
474
|
+
selected,
|
|
475
|
+
checkboxes
|
|
476
|
+
};
|
|
477
|
+
},
|
|
478
|
+
template: `
|
|
479
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
480
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" collapse-strategy="multiple">
|
|
481
|
+
<template #cellContent="{element: entry, header}">
|
|
482
|
+
<div v-if="header.identifier === 'employed'">
|
|
483
|
+
<AntSwitch v-model="entry.employed"/>
|
|
484
|
+
</div>
|
|
485
|
+
|
|
486
|
+
<div v-if="header.identifier === 'permissions'">
|
|
487
|
+
<AntCheckboxGroup v-model="entry.permissions" :checkboxes="checkboxes" direction="row"/>
|
|
488
|
+
</div>
|
|
489
|
+
</template>
|
|
490
|
+
|
|
491
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
492
|
+
<div class="p-4">
|
|
493
|
+
<pre>
|
|
494
|
+
{{JSON.stringify(element, null, 2)}}
|
|
495
|
+
</pre>
|
|
496
|
+
</div>
|
|
497
|
+
</template>
|
|
498
|
+
</AntTable>
|
|
499
|
+
</div>
|
|
500
|
+
`
|
|
501
|
+
}),
|
|
502
|
+
args: Docs.args
|
|
503
|
+
};
|
|
504
|
+
const DefaultCollapseOpen = exports.DefaultCollapseOpen = {
|
|
505
|
+
render: args => ({
|
|
506
|
+
components: {
|
|
507
|
+
AntTable: _AntTable.default,
|
|
508
|
+
AntSwitch: _AntSwitch.default,
|
|
509
|
+
AntCheckboxGroup: _AntCheckboxGroup.default,
|
|
510
|
+
AntButton: _AntButton.default
|
|
511
|
+
},
|
|
512
|
+
setup() {
|
|
513
|
+
const selected = (0, _vue.ref)();
|
|
514
|
+
const data = (0, _vue.ref)(args.data.splice(0, 5));
|
|
515
|
+
const checkboxes = [{
|
|
516
|
+
label: "Read",
|
|
517
|
+
value: "read"
|
|
518
|
+
}, {
|
|
519
|
+
label: "Write",
|
|
520
|
+
value: "write"
|
|
521
|
+
}];
|
|
522
|
+
function addRandomEntry() {
|
|
523
|
+
data.value = [...data.value, getRandomEntry()];
|
|
524
|
+
}
|
|
525
|
+
return {
|
|
526
|
+
args,
|
|
527
|
+
data,
|
|
528
|
+
selected,
|
|
529
|
+
checkboxes,
|
|
530
|
+
addRandomEntry
|
|
531
|
+
};
|
|
532
|
+
},
|
|
533
|
+
template: `
|
|
534
|
+
<div class="h-96 border border-dashed border-base-300 flex flex-col gap-2">
|
|
535
|
+
<AntButton state="primary" @click="addRandomEntry" filled>Add Random Entry</AntButton>
|
|
536
|
+
<AntTable v-bind="args" :data="data" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" :rows-collapsed="false" collapse-strategy="multiple">
|
|
537
|
+
<template #cellContent="{element: entry, header}">
|
|
538
|
+
<div v-if="header.identifier === 'employed'">
|
|
539
|
+
<AntSwitch v-model="entry.employed"/>
|
|
540
|
+
</div>
|
|
541
|
+
|
|
542
|
+
<div v-if="header.identifier === 'permissions'">
|
|
543
|
+
<AntCheckboxGroup v-model="entry.permissions" :checkboxes="checkboxes" direction="row"/>
|
|
544
|
+
</div>
|
|
545
|
+
</template>
|
|
546
|
+
|
|
547
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
548
|
+
<div class="p-4">
|
|
549
|
+
<pre>
|
|
550
|
+
{{JSON.stringify(element, null, 2)}}
|
|
551
|
+
</pre>
|
|
552
|
+
</div>
|
|
553
|
+
</template>
|
|
554
|
+
</AntTable>
|
|
555
|
+
</div>
|
|
556
|
+
`
|
|
557
|
+
}),
|
|
558
|
+
args: Docs.args
|
|
337
559
|
};
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import AntTable from "../AntTable.vue";
|
|
2
|
+
import AntButton from "../../buttons/AntButton.vue";
|
|
3
|
+
import AntSelect from "../../inputs/AntSelect.vue";
|
|
4
|
+
import AntCheckboxGroup from "../../inputs/AntCheckboxGroup.vue";
|
|
2
5
|
import { AntTableAlign, AntTableRowTypes, AntTableSize } from "../__types/TableHeader.types.mjs";
|
|
3
6
|
import { ref } from "vue";
|
|
4
7
|
import { faker } from "@faker-js/faker";
|
|
5
8
|
import AntSwitch from "../../inputs/AntSwitch.vue";
|
|
9
|
+
import { expect, userEvent, waitFor } from "@storybook/test";
|
|
6
10
|
const meta = {
|
|
11
|
+
components: { AntSelect, AntCheckboxGroup },
|
|
7
12
|
title: "Components/Table",
|
|
8
13
|
component: AntTable,
|
|
9
14
|
parameters: { controls: { sort: "requiredFirst" } },
|
|
@@ -90,37 +95,82 @@ const meta = {
|
|
|
90
95
|
};
|
|
91
96
|
export default meta;
|
|
92
97
|
const testData = ref([]);
|
|
93
|
-
|
|
98
|
+
function getRandomEntry() {
|
|
94
99
|
const randomName = faker.person.firstName() + " " + faker.person.lastName();
|
|
95
100
|
const randomNumber = faker.number.int({ min: 18, max: 60 });
|
|
96
101
|
const randomEmail = faker.internet.email();
|
|
97
102
|
const randomBoolean = faker.datatype.boolean();
|
|
98
|
-
|
|
103
|
+
const randomPermissions = faker.helpers.arrayElements(["read", "write"], { min: 0, max: 2 });
|
|
104
|
+
return {
|
|
99
105
|
name: randomName,
|
|
100
106
|
age: randomNumber,
|
|
101
107
|
email: randomEmail,
|
|
102
|
-
employed: randomBoolean
|
|
103
|
-
|
|
108
|
+
employed: randomBoolean,
|
|
109
|
+
permissions: randomPermissions
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
for (let i = 0; i < 100; i++) {
|
|
113
|
+
testData.value.push(getRandomEntry());
|
|
104
114
|
}
|
|
105
115
|
export const Docs = {
|
|
106
116
|
render: (args) => ({
|
|
107
|
-
components: { AntTable, AntSwitch },
|
|
117
|
+
components: { AntTable, AntSwitch, AntCheckboxGroup },
|
|
108
118
|
setup() {
|
|
109
119
|
const selected = ref();
|
|
110
|
-
|
|
120
|
+
const checkboxes = [{
|
|
121
|
+
label: "Read",
|
|
122
|
+
value: "read"
|
|
123
|
+
}, {
|
|
124
|
+
label: "Write",
|
|
125
|
+
value: "write"
|
|
126
|
+
}];
|
|
127
|
+
return { args, selected, checkboxes };
|
|
111
128
|
},
|
|
112
129
|
template: `
|
|
113
130
|
<div class="h-96 border border-dashed border-base-300">
|
|
114
131
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
115
132
|
<template #cellContent="{element: entry, header}">
|
|
116
|
-
<div v-if="header.identifier === '
|
|
117
|
-
<AntSwitch v-model="entry.
|
|
133
|
+
<div v-if="header.identifier === 'employed'">
|
|
134
|
+
<AntSwitch v-model="entry.employed"/>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<div v-if="header.identifier === 'permissions'">
|
|
138
|
+
<AntCheckboxGroup v-model="entry.permissions" :checkboxes="checkboxes" direction="row"/>
|
|
118
139
|
</div>
|
|
119
140
|
</template>
|
|
120
141
|
</AntTable>
|
|
121
142
|
</div>
|
|
122
143
|
`
|
|
123
144
|
}),
|
|
145
|
+
play: async ({ step }) => {
|
|
146
|
+
const firstRow = document.querySelectorAll('[data-e2e="table-row"]')[0];
|
|
147
|
+
const employedCell = firstRow.querySelector('[data-e2e="table-cell-employed"]');
|
|
148
|
+
const employedSwitch = employedCell?.querySelector('[data-e2e="switch"]')?.querySelector("button");
|
|
149
|
+
const permissionsCell = firstRow.querySelector('[data-e2e="table-cell-permissions"]');
|
|
150
|
+
const permissionCheckboxWithLabel = permissionsCell?.querySelector('[data-e2e="checkbox"]');
|
|
151
|
+
const permissionCheckbox = permissionCheckboxWithLabel?.querySelector('[type="checkbox"]');
|
|
152
|
+
const permissionLabel = permissionCheckboxWithLabel?.querySelector("label");
|
|
153
|
+
await step("Click on a table cell and expect the row to be selected", async () => {
|
|
154
|
+
await userEvent.click(employedCell);
|
|
155
|
+
await waitFor(() => expect(firstRow).toHaveClass("bg-primary-200"), { timeout: 600 });
|
|
156
|
+
});
|
|
157
|
+
await step("Click on employed switch and expect the value to toggle", async () => {
|
|
158
|
+
const initialAriaChecked = JSON.parse(employedSwitch?.getAttribute("aria-checked"));
|
|
159
|
+
await userEvent.click(employedSwitch);
|
|
160
|
+
await waitFor(() => {
|
|
161
|
+
const toggledAriaChecked = JSON.parse(employedSwitch?.getAttribute("aria-checked"));
|
|
162
|
+
expect(toggledAriaChecked).toBe(!initialAriaChecked);
|
|
163
|
+
}, { timeout: 600 });
|
|
164
|
+
});
|
|
165
|
+
await step("Click on one of the permissions and expect the value to toggle", async () => {
|
|
166
|
+
const initialAriaChecked = JSON.parse(permissionCheckbox?.getAttribute("aria-checked"));
|
|
167
|
+
await userEvent.click(permissionLabel);
|
|
168
|
+
await waitFor(() => {
|
|
169
|
+
const toggledAriaChecked = JSON.parse(permissionCheckbox?.getAttribute("aria-checked"));
|
|
170
|
+
expect(toggledAriaChecked).toBe(!initialAriaChecked);
|
|
171
|
+
}, { timeout: 600 });
|
|
172
|
+
});
|
|
173
|
+
},
|
|
124
174
|
args: {
|
|
125
175
|
headers: [
|
|
126
176
|
{
|
|
@@ -144,8 +194,14 @@ export const Docs = {
|
|
|
144
194
|
type: AntTableRowTypes.text
|
|
145
195
|
},
|
|
146
196
|
{
|
|
147
|
-
title: "
|
|
148
|
-
identifier: "
|
|
197
|
+
title: "Employed",
|
|
198
|
+
identifier: "employed",
|
|
199
|
+
rowClassList: "",
|
|
200
|
+
type: AntTableRowTypes.slot
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
title: "Permissions",
|
|
204
|
+
identifier: "permissions",
|
|
149
205
|
rowClassList: "",
|
|
150
206
|
type: AntTableRowTypes.slot
|
|
151
207
|
}
|
|
@@ -165,8 +221,8 @@ export const Empty = {
|
|
|
165
221
|
<div class="h-96 border border-dashed border-base-300">
|
|
166
222
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
167
223
|
<template #cellContent="{element: entry, header}">
|
|
168
|
-
<div v-if="header.identifier === '
|
|
169
|
-
<AntSwitch v-model="entry.
|
|
224
|
+
<div v-if="header.identifier === 'employed'">
|
|
225
|
+
<AntSwitch v-model="entry.employed"/>
|
|
170
226
|
</div>
|
|
171
227
|
</template>
|
|
172
228
|
</AntTable>
|
|
@@ -175,14 +231,13 @@ export const Empty = {
|
|
|
175
231
|
<div class="h-96 border border-dashed border-base-300">
|
|
176
232
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" empty-state-text="Custom Empty State Text">
|
|
177
233
|
<template #cellContent="{element: entry, header}">
|
|
178
|
-
<div v-if="header.identifier === '
|
|
179
|
-
<AntSwitch v-model="entry.
|
|
234
|
+
<div v-if="header.identifier === 'employed'">
|
|
235
|
+
<AntSwitch v-model="entry.employed"/>
|
|
180
236
|
</div>
|
|
181
237
|
</template>
|
|
182
238
|
</AntTable>
|
|
183
239
|
</div>
|
|
184
240
|
</div>
|
|
185
|
-
</div>
|
|
186
241
|
`
|
|
187
242
|
}),
|
|
188
243
|
args: {
|
|
@@ -293,3 +348,128 @@ export const Loading = {
|
|
|
293
348
|
data: testData.value
|
|
294
349
|
}
|
|
295
350
|
};
|
|
351
|
+
export const Collapsible = {
|
|
352
|
+
render: (args) => ({
|
|
353
|
+
components: { AntTable, AntSwitch, AntCheckboxGroup },
|
|
354
|
+
setup() {
|
|
355
|
+
const selected = ref();
|
|
356
|
+
const checkboxes = [{
|
|
357
|
+
label: "Read",
|
|
358
|
+
value: "read"
|
|
359
|
+
}, {
|
|
360
|
+
label: "Write",
|
|
361
|
+
value: "write"
|
|
362
|
+
}];
|
|
363
|
+
return { args, selected, checkboxes };
|
|
364
|
+
},
|
|
365
|
+
template: `
|
|
366
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
367
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
368
|
+
<template #cellContent="{element: entry, header}">
|
|
369
|
+
<div v-if="header.identifier === 'employed'">
|
|
370
|
+
<AntSwitch v-model="entry.employed"/>
|
|
371
|
+
</div>
|
|
372
|
+
|
|
373
|
+
<div v-if="header.identifier === 'permissions'">
|
|
374
|
+
<AntCheckboxGroup v-model="entry.permissions" :checkboxes="checkboxes" direction="row"/>
|
|
375
|
+
</div>
|
|
376
|
+
</template>
|
|
377
|
+
|
|
378
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
379
|
+
<div class="p-4">
|
|
380
|
+
<pre>
|
|
381
|
+
{{element}}
|
|
382
|
+
</pre>
|
|
383
|
+
</div>
|
|
384
|
+
</template>
|
|
385
|
+
</AntTable>
|
|
386
|
+
</div>
|
|
387
|
+
`
|
|
388
|
+
}),
|
|
389
|
+
args: Docs.args
|
|
390
|
+
};
|
|
391
|
+
export const MultipleCollapseStrategy = {
|
|
392
|
+
render: (args) => ({
|
|
393
|
+
components: { AntTable, AntSwitch, AntCheckboxGroup },
|
|
394
|
+
setup() {
|
|
395
|
+
const selected = ref();
|
|
396
|
+
const checkboxes = [{
|
|
397
|
+
label: "Read",
|
|
398
|
+
value: "read"
|
|
399
|
+
}, {
|
|
400
|
+
label: "Write",
|
|
401
|
+
value: "write"
|
|
402
|
+
}];
|
|
403
|
+
return { args, selected, checkboxes };
|
|
404
|
+
},
|
|
405
|
+
template: `
|
|
406
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
407
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" collapse-strategy="multiple">
|
|
408
|
+
<template #cellContent="{element: entry, header}">
|
|
409
|
+
<div v-if="header.identifier === 'employed'">
|
|
410
|
+
<AntSwitch v-model="entry.employed"/>
|
|
411
|
+
</div>
|
|
412
|
+
|
|
413
|
+
<div v-if="header.identifier === 'permissions'">
|
|
414
|
+
<AntCheckboxGroup v-model="entry.permissions" :checkboxes="checkboxes" direction="row"/>
|
|
415
|
+
</div>
|
|
416
|
+
</template>
|
|
417
|
+
|
|
418
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
419
|
+
<div class="p-4">
|
|
420
|
+
<pre>
|
|
421
|
+
{{JSON.stringify(element, null, 2)}}
|
|
422
|
+
</pre>
|
|
423
|
+
</div>
|
|
424
|
+
</template>
|
|
425
|
+
</AntTable>
|
|
426
|
+
</div>
|
|
427
|
+
`
|
|
428
|
+
}),
|
|
429
|
+
args: Docs.args
|
|
430
|
+
};
|
|
431
|
+
export const DefaultCollapseOpen = {
|
|
432
|
+
render: (args) => ({
|
|
433
|
+
components: { AntTable, AntSwitch, AntCheckboxGroup, AntButton },
|
|
434
|
+
setup() {
|
|
435
|
+
const selected = ref();
|
|
436
|
+
const data = ref(args.data.splice(0, 5));
|
|
437
|
+
const checkboxes = [{
|
|
438
|
+
label: "Read",
|
|
439
|
+
value: "read"
|
|
440
|
+
}, {
|
|
441
|
+
label: "Write",
|
|
442
|
+
value: "write"
|
|
443
|
+
}];
|
|
444
|
+
function addRandomEntry() {
|
|
445
|
+
data.value = [...data.value, getRandomEntry()];
|
|
446
|
+
}
|
|
447
|
+
return { args, data, selected, checkboxes, addRandomEntry };
|
|
448
|
+
},
|
|
449
|
+
template: `
|
|
450
|
+
<div class="h-96 border border-dashed border-base-300 flex flex-col gap-2">
|
|
451
|
+
<AntButton state="primary" @click="addRandomEntry" filled>Add Random Entry</AntButton>
|
|
452
|
+
<AntTable v-bind="args" :data="data" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" :rows-collapsed="false" collapse-strategy="multiple">
|
|
453
|
+
<template #cellContent="{element: entry, header}">
|
|
454
|
+
<div v-if="header.identifier === 'employed'">
|
|
455
|
+
<AntSwitch v-model="entry.employed"/>
|
|
456
|
+
</div>
|
|
457
|
+
|
|
458
|
+
<div v-if="header.identifier === 'permissions'">
|
|
459
|
+
<AntCheckboxGroup v-model="entry.permissions" :checkboxes="checkboxes" direction="row"/>
|
|
460
|
+
</div>
|
|
461
|
+
</template>
|
|
462
|
+
|
|
463
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
464
|
+
<div class="p-4">
|
|
465
|
+
<pre>
|
|
466
|
+
{{JSON.stringify(element, null, 2)}}
|
|
467
|
+
</pre>
|
|
468
|
+
</div>
|
|
469
|
+
</template>
|
|
470
|
+
</AntTable>
|
|
471
|
+
</div>
|
|
472
|
+
`
|
|
473
|
+
}),
|
|
474
|
+
args: Docs.args
|
|
475
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CollapseStrategy = void 0;
|
|
7
|
+
var CollapseStrategy = exports.CollapseStrategy = /* @__PURE__ */(CollapseStrategy2 => {
|
|
8
|
+
CollapseStrategy2["single"] = "single";
|
|
9
|
+
CollapseStrategy2["multiple"] = "multiple";
|
|
10
|
+
return CollapseStrategy2;
|
|
11
|
+
})(CollapseStrategy || {});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antify/ui",
|
|
3
|
-
"version": "2.1
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -58,7 +58,8 @@
|
|
|
58
58
|
"@vuepic/vue-datepicker": "^6.1.0",
|
|
59
59
|
"@vueuse/components": "^10.7.2",
|
|
60
60
|
"@vueuse/core": "^10.7.2",
|
|
61
|
-
"@vueuse/router": "^10.7.2"
|
|
61
|
+
"@vueuse/router": "^10.7.2",
|
|
62
|
+
"big.js": "^6.2.2"
|
|
62
63
|
},
|
|
63
64
|
"devDependencies": {
|
|
64
65
|
"@antify/validate": "^1.14.0",
|
|
@@ -73,6 +74,7 @@
|
|
|
73
74
|
"@storybook/vue3": "^8.2.9",
|
|
74
75
|
"@storybook/vue3-vite": "^8.2.9",
|
|
75
76
|
"@tsconfig/node20": "^20.1.4",
|
|
77
|
+
"@types/big.js": "^6.2.2",
|
|
76
78
|
"@types/jsdom": "^21.1.7",
|
|
77
79
|
"@types/node": "^20.14.5",
|
|
78
80
|
"@vitejs/plugin-vue": "^5.0.5",
|
|
@@ -84,7 +86,7 @@
|
|
|
84
86
|
"standard-version": "^9.5.0",
|
|
85
87
|
"storybook": "^8.2.9",
|
|
86
88
|
"storybook-vue3-router": "^5.0.0",
|
|
87
|
-
"typescript": "~5.
|
|
89
|
+
"typescript": "~5.5.0",
|
|
88
90
|
"unbuild": "^2.0.0",
|
|
89
91
|
"vite": "^5.3.1",
|
|
90
92
|
"vitest": "^1.6.0",
|