@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.
Files changed (28) hide show
  1. package/README.md +13 -0
  2. package/dist/components/AntDropdown.vue +1 -1
  3. package/dist/components/AntModal.vue +1 -1
  4. package/dist/components/AntToaster.vue +1 -1
  5. package/dist/components/buttons/AntButton.vue +0 -1
  6. package/dist/components/inputs/AntCheckbox.vue +1 -0
  7. package/dist/components/inputs/AntCheckboxGroup.vue +1 -0
  8. package/dist/components/inputs/AntNumberInput.vue +40 -12
  9. package/dist/components/inputs/AntRangeSlider.vue +1 -1
  10. package/dist/components/inputs/AntSelect.vue +2 -1
  11. package/dist/components/inputs/AntSwitch.vue +1 -0
  12. package/dist/components/inputs/AntTextarea.vue +1 -1
  13. package/dist/components/inputs/Elements/AntBaseInput.vue +2 -1
  14. package/dist/components/inputs/__stories/AntNumberInput.stories.js +21 -1
  15. package/dist/components/inputs/__stories/AntNumberInput.stories.mjs +15 -1
  16. package/dist/components/inputs/__stories/AntSelect.stories.js +22 -1
  17. package/dist/components/inputs/__stories/AntSelect.stories.mjs +22 -1
  18. package/dist/components/table/AntCollapsibleTableRowContent.vue +25 -0
  19. package/dist/components/table/AntTable.vue +125 -47
  20. package/dist/components/table/AntTd.vue +0 -4
  21. package/dist/components/table/__stories/AntTable.stories.d.ts +3 -0
  22. package/dist/components/table/__stories/AntTable.stories.js +238 -16
  23. package/dist/components/table/__stories/AntTable.stories.mjs +195 -15
  24. package/dist/components/table/__types/AntCollapsibleTable.types.d.ts +4 -0
  25. package/dist/components/table/__types/AntCollapsibleTable.types.js +11 -0
  26. package/dist/components/table/__types/AntCollapsibleTable.types.mjs +5 -0
  27. package/dist/tailwind.config.d.ts +2 -1
  28. 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
- for (let i = 0; i < 100; i++) {
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
- testData.value.push({
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 === 'employeed'">
173
- <AntSwitch v-model="entry.employeed"/>
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: "Employeed",
200
- identifier: "employeed",
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 === 'employeed'">
226
- <AntSwitch v-model="entry.employeed"/>
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 === 'employeed'">
236
- <AntSwitch v-model="entry.employeed"/>
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
- for (let i = 0; i < 100; i++) {
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
- testData.value.push({
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
- return { args, selected };
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 === 'employeed'">
117
- <AntSwitch v-model="entry.employeed"/>
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: "Employeed",
148
- identifier: "employeed",
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 === 'employeed'">
169
- <AntSwitch v-model="entry.employeed"/>
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 === 'employeed'">
179
- <AntSwitch v-model="entry.employeed"/>
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,4 @@
1
+ export declare enum CollapseStrategy {
2
+ single = "single",
3
+ multiple = "multiple"
4
+ }
@@ -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 || {});
@@ -0,0 +1,5 @@
1
+ export var CollapseStrategy = /* @__PURE__ */ ((CollapseStrategy2) => {
2
+ CollapseStrategy2["single"] = "single";
3
+ CollapseStrategy2["multiple"] = "multiple";
4
+ return CollapseStrategy2;
5
+ })(CollapseStrategy || {});
@@ -1,2 +1,3 @@
1
- declare const _default: import("tailwindcss/types/config").Config;
1
+ import { type Config } from 'tailwindcss';
2
+ declare const _default: Config;
2
3
  export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antify/ui",
3
- "version": "2.1.0",
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.4.0",
89
+ "typescript": "~5.5.0",
88
90
  "unbuild": "^2.0.0",
89
91
  "vite": "^5.3.1",
90
92
  "vitest": "^1.6.0",