@antify/ui 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/AntNumberInput.vue +40 -12
- package/dist/components/inputs/AntRangeSlider.vue +1 -1
- package/dist/components/inputs/AntSelect.vue +2 -1
- 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 +108 -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 +114 -10
- package/dist/components/table/__stories/AntTable.stories.mjs +95 -9
- 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/components/table/__types/index.d.ts +1 -0
- package/dist/components/table/__types/index.js +11 -0
- package/dist/components/table/__types/index.mjs +1 -0
- package/dist/tailwind.config.d.ts +2 -1
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -8,6 +8,19 @@ The antify ui is a vue component library for applications based on tailwindcss.
|
|
|
8
8
|
pnpm i && pnpm dev
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
## Component Hierarchy
|
|
12
|
+
Certain components, such as modals and toasts, need to be displayed on top of other elements to remain visible at all times. As a result, they require a higher z-index. The following hierarchy defines the rendering order for components with this property.
|
|
13
|
+
|
|
14
|
+
| Component | z-index |
|
|
15
|
+
|-------------|---------|
|
|
16
|
+
| AntDropdown | 50 |
|
|
17
|
+
| AntModal | 80 |
|
|
18
|
+
| AntPopover | 90 |
|
|
19
|
+
| AntToaster | 100 |
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
11
24
|
## Useful links:
|
|
12
25
|
|
|
13
26
|
- Chromatic docu: https://www.chromatic.com/docs/
|
|
@@ -47,7 +47,7 @@ function closeModal() {
|
|
|
47
47
|
<Transition name="fade">
|
|
48
48
|
<div
|
|
49
49
|
v-if="openBackground"
|
|
50
|
-
class="absolute inset-0 flex items-center justify-center z-
|
|
50
|
+
class="absolute inset-0 flex items-center justify-center z-[80] cursor-pointer overflow-hidden"
|
|
51
51
|
:class="{'bg-black/50 backdrop-blur-sm': !fullscreen}"
|
|
52
52
|
@click.self="closeModal"
|
|
53
53
|
>
|
|
@@ -108,7 +108,6 @@ const classes = computed(() => {
|
|
|
108
108
|
|
|
109
109
|
return {
|
|
110
110
|
'transition-all inline-flex items-center justify-center relative font-medium': true,
|
|
111
|
-
'focus:z-10': true,
|
|
112
111
|
'active:shadow-[inset_0_4px_4px_rgba(0,0,0,0.25)]': !hasInputState.value,
|
|
113
112
|
'p-1 text-xs gap-1': props.size === Size.xs2,
|
|
114
113
|
'p-1.5 text-xs gap-1.5': props.size === Size.xs,
|
|
@@ -10,11 +10,17 @@ import {handleEnumValidation} from '../../handler';
|
|
|
10
10
|
import {useVModel} from '@vueuse/core';
|
|
11
11
|
import {Grouped} from '../../enums/Grouped.enum';
|
|
12
12
|
import {BaseInputType} from './Elements/__types';
|
|
13
|
+
import Big from 'big.js';
|
|
14
|
+
Big.RM = Big.roundHalfEven;
|
|
13
15
|
|
|
14
16
|
defineOptions({inheritAttrs: false});
|
|
15
17
|
|
|
18
|
+
/**
|
|
19
|
+
* We use a string as the modelValue to ensure that numbers are correctly padded with a trailing 0 instead of cut off (e.g. 0.10 would be converted to 0.1).
|
|
20
|
+
* Additionally, the initial value (if none is given) gets set to "0" with the same amount of decimals as used in the steps.
|
|
21
|
+
*/
|
|
16
22
|
const props = withDefaults(defineProps<{
|
|
17
|
-
modelValue:
|
|
23
|
+
modelValue: string | null;
|
|
18
24
|
label?: string;
|
|
19
25
|
placeholder?: string;
|
|
20
26
|
description?: string;
|
|
@@ -42,6 +48,7 @@ const props = withDefaults(defineProps<{
|
|
|
42
48
|
});
|
|
43
49
|
const emit = defineEmits(['update:modelValue', 'validate']);
|
|
44
50
|
const _modelValue = useVModel(props, 'modelValue', emit);
|
|
51
|
+
|
|
45
52
|
const isPrevButtonDisabled = computed(() => {
|
|
46
53
|
if (props.disabled) {
|
|
47
54
|
return true;
|
|
@@ -51,7 +58,7 @@ const isPrevButtonDisabled = computed(() => {
|
|
|
51
58
|
return false;
|
|
52
59
|
}
|
|
53
60
|
|
|
54
|
-
return props.min !== undefined ? _modelValue.value <= props.min : false;
|
|
61
|
+
return props.min !== undefined ? Number(_modelValue.value) <= props.min : false;
|
|
55
62
|
});
|
|
56
63
|
const isNextButtonDisabled = computed(() => {
|
|
57
64
|
if (props.disabled) {
|
|
@@ -62,7 +69,7 @@ const isNextButtonDisabled = computed(() => {
|
|
|
62
69
|
return false;
|
|
63
70
|
}
|
|
64
71
|
|
|
65
|
-
return props.max !== undefined ? _modelValue.value >= props.max : false;
|
|
72
|
+
return props.max !== undefined ? Number(_modelValue.value) >= props.max : false;
|
|
66
73
|
});
|
|
67
74
|
|
|
68
75
|
onMounted(() => {
|
|
@@ -70,23 +77,44 @@ onMounted(() => {
|
|
|
70
77
|
handleEnumValidation(props.state, InputState, 'state');
|
|
71
78
|
});
|
|
72
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Returns the amount of decimal places of the given value.
|
|
82
|
+
* @param value Number to get decimal places from.
|
|
83
|
+
*/
|
|
84
|
+
function getDecimalPlaces(value: number | string) {
|
|
85
|
+
const strValue = String(value);
|
|
86
|
+
const decimalIndex = strValue.indexOf('.');
|
|
87
|
+
|
|
88
|
+
if (decimalIndex === -1) return 0;
|
|
89
|
+
|
|
90
|
+
return strValue.length - decimalIndex - 1;
|
|
91
|
+
}
|
|
92
|
+
|
|
73
93
|
function subtract() {
|
|
94
|
+
const modelDecimalPlaces = getDecimalPlaces(_modelValue.value || 0);
|
|
95
|
+
const stepDecimalPlaces = getDecimalPlaces(props.steps);
|
|
96
|
+
const decimalPlaces = Math.max(modelDecimalPlaces, stepDecimalPlaces);
|
|
97
|
+
|
|
74
98
|
if (_modelValue.value === null) {
|
|
75
|
-
_modelValue.value = props.max || 0;
|
|
76
|
-
} else if (props.max !== undefined && _modelValue.value - props.steps > props.max) {
|
|
77
|
-
_modelValue.value = props.max;
|
|
99
|
+
_modelValue.value = String(props.max || new Big(0).toFixed(decimalPlaces));
|
|
100
|
+
} else if (props.max !== undefined && Number(_modelValue.value) - props.steps > props.max) {
|
|
101
|
+
_modelValue.value = String(props.max);
|
|
78
102
|
} else {
|
|
79
|
-
_modelValue.value
|
|
103
|
+
_modelValue.value = new Big(_modelValue.value).sub(props.steps).toFixed(decimalPlaces);
|
|
80
104
|
}
|
|
81
105
|
}
|
|
82
106
|
|
|
83
107
|
function add() {
|
|
108
|
+
const modelDecimalPlaces = getDecimalPlaces(_modelValue.value || 0);
|
|
109
|
+
const stepDecimalPlaces = getDecimalPlaces(props.steps);
|
|
110
|
+
const decimalPlaces = Math.max(modelDecimalPlaces, stepDecimalPlaces);
|
|
111
|
+
|
|
84
112
|
if (_modelValue.value === null) {
|
|
85
|
-
return _modelValue.value = props.min || 0;
|
|
86
|
-
} else if (props.min !== undefined && _modelValue.value + props.steps < props.min) {
|
|
87
|
-
return _modelValue.value = props.min;
|
|
113
|
+
return _modelValue.value = String(props.min || new Big(0).toFixed(decimalPlaces));
|
|
114
|
+
} else if (props.min !== undefined && Number(_modelValue.value) + props.steps < props.min) {
|
|
115
|
+
return _modelValue.value = String(props.min);
|
|
88
116
|
} else {
|
|
89
|
-
_modelValue.value
|
|
117
|
+
_modelValue.value = new Big(_modelValue.value).add(props.steps).toFixed(decimalPlaces);
|
|
90
118
|
}
|
|
91
119
|
}
|
|
92
120
|
|
|
@@ -103,7 +131,7 @@ function onButtonBlur() {
|
|
|
103
131
|
:description="description"
|
|
104
132
|
:state="state"
|
|
105
133
|
:limiter-max-value="limiter && max !== undefined ? max : undefined"
|
|
106
|
-
:limiter-value="limiter && _modelValue !== undefined && _modelValue !== null ? _modelValue : undefined"
|
|
134
|
+
:limiter-value="limiter && _modelValue !== undefined && _modelValue !== null ? Number(_modelValue) : undefined"
|
|
107
135
|
:messages="messages"
|
|
108
136
|
>
|
|
109
137
|
<div
|
|
@@ -38,7 +38,7 @@ const inputClasses = computed(() => {
|
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
return {
|
|
41
|
-
'ant-range-slider transition-colors relative border-none w-full
|
|
41
|
+
'ant-range-slider transition-colors relative border-none w-full h-2 bg-base-300 rounded-md outline-none': true,
|
|
42
42
|
'disabled:opacity-50 disabled:cursor-not-allowed': props.disabled,
|
|
43
43
|
'invisible': props.skeleton,
|
|
44
44
|
[variants[props.state]]: true
|
|
@@ -79,7 +79,7 @@ const inputClasses = computed(() => {
|
|
|
79
79
|
};
|
|
80
80
|
|
|
81
81
|
return {
|
|
82
|
-
'flex items-center transition-colors border-none outline relative
|
|
82
|
+
'flex items-center transition-colors border-none outline relative': true,
|
|
83
83
|
'outline-offset-[-1px] outline-1 focus:outline-offset-[-1px] focus:outline-1': true,
|
|
84
84
|
[variants[props.state]]: true,
|
|
85
85
|
// Skeleton
|
|
@@ -315,6 +315,7 @@ function onClickRemoveButton() {
|
|
|
315
315
|
:grouped="[Grouped.left, Grouped.center].some(item => item === grouped) ? Grouped.center : Grouped.right"
|
|
316
316
|
:size="size"
|
|
317
317
|
:skeleton="skeleton"
|
|
318
|
+
:disabled="disabled"
|
|
318
319
|
@click="onClickRemoveButton"
|
|
319
320
|
/>
|
|
320
321
|
</div>
|
|
@@ -70,7 +70,7 @@ const inputClasses = computed(() => {
|
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
return {
|
|
73
|
-
'block transition-colors relative border-none outline w-full
|
|
73
|
+
'block transition-colors relative border-none outline w-full h-full text-black': true,
|
|
74
74
|
'outline-offset-[-1px] outline-1 focus:outline-offset-[-1px] focus:outline-1': true,
|
|
75
75
|
'disabled:opacity-50 disabled:cursor-not-allowed': props.disabled,
|
|
76
76
|
[variants[props.state]]: true,
|
|
@@ -68,7 +68,7 @@ const inputClasses = computed(() => {
|
|
|
68
68
|
};
|
|
69
69
|
|
|
70
70
|
return {
|
|
71
|
-
'block transition-colors relative border-none outline w-full
|
|
71
|
+
'block transition-colors relative border-none outline w-full text-black font-regular': true,
|
|
72
72
|
'outline-offset-[-1px] outline-1 focus:outline-offset-[-1px] focus:outline-1': true,
|
|
73
73
|
'disabled:opacity-50 disabled:cursor-not-allowed': props.disabled,
|
|
74
74
|
'text-right': props.type === BaseInputType.number,
|
|
@@ -228,6 +228,7 @@ function onClickClearIcon() {
|
|
|
228
228
|
:disabled="disabled || skeleton"
|
|
229
229
|
:readonly="readonly"
|
|
230
230
|
:tabindex="hasInputState ? -1 : 0"
|
|
231
|
+
title=""
|
|
231
232
|
v-bind="$attrs"
|
|
232
233
|
@blur="onBlur"
|
|
233
234
|
>
|
|
@@ -81,7 +81,27 @@ const Docs = exports.Docs = {
|
|
|
81
81
|
}
|
|
82
82
|
};
|
|
83
83
|
const WithIndicators = exports.WithIndicators = {
|
|
84
|
-
render:
|
|
84
|
+
render: args => ({
|
|
85
|
+
components: {
|
|
86
|
+
AntNumberInput: _AntNumberInput.default,
|
|
87
|
+
AntFormGroup: _AntFormGroup.default,
|
|
88
|
+
AntFormGroupLabel: _AntFormGroupLabel.default
|
|
89
|
+
},
|
|
90
|
+
setup() {
|
|
91
|
+
return {
|
|
92
|
+
args
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
template: `
|
|
96
|
+
<AntFormGroup>
|
|
97
|
+
<AntFormGroup direction="column">
|
|
98
|
+
<AntNumberInput v-bind="args" v-model="args.modelValue" label="Label"
|
|
99
|
+
description="Lorem ipsum dolor sit amet"/>
|
|
100
|
+
<AntNumberInput v-bind="args" v-model="args.modelValue" label="Label"
|
|
101
|
+
description="Lorem ipsum dolor sit amet" :steps="0.0001"/>
|
|
102
|
+
</AntFormGroup>
|
|
103
|
+
</AntFormGroup>`
|
|
104
|
+
}),
|
|
85
105
|
args: {
|
|
86
106
|
...Docs.args,
|
|
87
107
|
indicators: true
|
|
@@ -48,7 +48,21 @@ export const Docs = {
|
|
|
48
48
|
}
|
|
49
49
|
};
|
|
50
50
|
export const WithIndicators = {
|
|
51
|
-
render:
|
|
51
|
+
render: (args) => ({
|
|
52
|
+
components: { AntNumberInput, AntFormGroup, AntFormGroupLabel },
|
|
53
|
+
setup() {
|
|
54
|
+
return { args };
|
|
55
|
+
},
|
|
56
|
+
template: `
|
|
57
|
+
<AntFormGroup>
|
|
58
|
+
<AntFormGroup direction="column">
|
|
59
|
+
<AntNumberInput v-bind="args" v-model="args.modelValue" label="Label"
|
|
60
|
+
description="Lorem ipsum dolor sit amet"/>
|
|
61
|
+
<AntNumberInput v-bind="args" v-model="args.modelValue" label="Label"
|
|
62
|
+
description="Lorem ipsum dolor sit amet" :steps="0.0001"/>
|
|
63
|
+
</AntFormGroup>
|
|
64
|
+
</AntFormGroup>`
|
|
65
|
+
}),
|
|
52
66
|
args: {
|
|
53
67
|
...Docs.args,
|
|
54
68
|
indicators: true
|
|
@@ -143,9 +143,23 @@ const skeleton = exports.skeleton = {
|
|
|
143
143
|
}
|
|
144
144
|
};
|
|
145
145
|
const disabled = exports.disabled = {
|
|
146
|
-
render:
|
|
146
|
+
render: (args, ctx) => ({
|
|
147
|
+
// @ts-ignore
|
|
148
|
+
components: Docs.render(args, ctx).components,
|
|
149
|
+
// @ts-ignore
|
|
150
|
+
setup: Docs.render(args, ctx).setup,
|
|
151
|
+
template: `
|
|
152
|
+
<div ref="scrollContainer" class="overflow-y-auto h-[100vh] p-2.5 dashed">
|
|
153
|
+
<div class="flex flex-col gap-4 justify-center h-[200vh]">
|
|
154
|
+
<AntSelect v-bind="args" v-model="modelValue"/>
|
|
155
|
+
<AntSelect v-bind="args" v-model="modelValue" nullable/>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
`
|
|
159
|
+
}),
|
|
147
160
|
args: {
|
|
148
161
|
...Docs.args,
|
|
162
|
+
modelValue: "1",
|
|
149
163
|
disabled: true
|
|
150
164
|
}
|
|
151
165
|
};
|
|
@@ -242,6 +256,13 @@ const summary = exports.summary = {
|
|
|
242
256
|
<AntSelect v-bind="args" value="1" size="sm" state="warning" disabled/>
|
|
243
257
|
<AntSelect v-bind="args" value="1" size="sm" state="danger" disabled/>
|
|
244
258
|
</div>
|
|
259
|
+
<div class="flex gap-2.5">
|
|
260
|
+
<AntSelect v-bind="args" :value="1" v-model="modelValue" size="sm" state="base" disabled nullable/>
|
|
261
|
+
<AntSelect v-bind="args" :value="1" v-model="modelValue" size="sm" state="info" disabled nullable/>
|
|
262
|
+
<AntSelect v-bind="args" :value="1" v-model="modelValue" size="sm" state="success" disabled nullable/>
|
|
263
|
+
<AntSelect v-bind="args" :value="1" v-model="modelValue" size="sm" state="warning" disabled nullable/>
|
|
264
|
+
<AntSelect v-bind="args" :value="1" v-model="modelValue" size="sm" state="danger" disabled nullable/>
|
|
265
|
+
</div>
|
|
245
266
|
<div class="flex gap-2.5">
|
|
246
267
|
<AntSelect v-bind="args" :value="null" grouped="none"/>
|
|
247
268
|
<AntSelect v-bind="args" :value="null" grouped="right"/>
|
|
@@ -114,9 +114,23 @@ export const skeleton = {
|
|
|
114
114
|
}
|
|
115
115
|
};
|
|
116
116
|
export const disabled = {
|
|
117
|
-
render:
|
|
117
|
+
render: (args, ctx) => ({
|
|
118
|
+
// @ts-ignore
|
|
119
|
+
components: Docs.render(args, ctx).components,
|
|
120
|
+
// @ts-ignore
|
|
121
|
+
setup: Docs.render(args, ctx).setup,
|
|
122
|
+
template: `
|
|
123
|
+
<div ref="scrollContainer" class="overflow-y-auto h-[100vh] p-2.5 dashed">
|
|
124
|
+
<div class="flex flex-col gap-4 justify-center h-[200vh]">
|
|
125
|
+
<AntSelect v-bind="args" v-model="modelValue"/>
|
|
126
|
+
<AntSelect v-bind="args" v-model="modelValue" nullable/>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
`
|
|
130
|
+
}),
|
|
118
131
|
args: {
|
|
119
132
|
...Docs.args,
|
|
133
|
+
modelValue: "1",
|
|
120
134
|
disabled: true
|
|
121
135
|
}
|
|
122
136
|
};
|
|
@@ -206,6 +220,13 @@ export const summary = {
|
|
|
206
220
|
<AntSelect v-bind="args" value="1" size="sm" state="warning" disabled/>
|
|
207
221
|
<AntSelect v-bind="args" value="1" size="sm" state="danger" disabled/>
|
|
208
222
|
</div>
|
|
223
|
+
<div class="flex gap-2.5">
|
|
224
|
+
<AntSelect v-bind="args" :value="1" v-model="modelValue" size="sm" state="base" disabled nullable/>
|
|
225
|
+
<AntSelect v-bind="args" :value="1" v-model="modelValue" size="sm" state="info" disabled nullable/>
|
|
226
|
+
<AntSelect v-bind="args" :value="1" v-model="modelValue" size="sm" state="success" disabled nullable/>
|
|
227
|
+
<AntSelect v-bind="args" :value="1" v-model="modelValue" size="sm" state="warning" disabled nullable/>
|
|
228
|
+
<AntSelect v-bind="args" :value="1" v-model="modelValue" size="sm" state="danger" disabled nullable/>
|
|
229
|
+
</div>
|
|
209
230
|
<div class="flex gap-2.5">
|
|
210
231
|
<AntSelect v-bind="args" :value="null" grouped="none"/>
|
|
211
232
|
<AntSelect v-bind="args" :value="null" grouped="right"/>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {computed} from "vue";
|
|
3
|
+
|
|
4
|
+
const props = withDefaults(defineProps<{
|
|
5
|
+
isOpen: boolean;
|
|
6
|
+
skeleton?: boolean;
|
|
7
|
+
}>(), {
|
|
8
|
+
skeleton: false,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const rowContentClasses = computed(() => ({
|
|
12
|
+
"grid transition-all duration-300 delay-0 ease-in-out": true,
|
|
13
|
+
"grid-rows-[0fr]": !props.isOpen,
|
|
14
|
+
"grid-rows-[1fr]": props.isOpen,
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<template>
|
|
20
|
+
<div :class="rowContentClasses">
|
|
21
|
+
<div class="overflow-hidden">
|
|
22
|
+
<slot/>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</template>
|
|
@@ -2,11 +2,17 @@
|
|
|
2
2
|
import {AntTableSize, AntTableSortDirection, type TableHeader} from './__types/TableHeader.types';
|
|
3
3
|
import {computed, ref, type Ref, watch} from 'vue';
|
|
4
4
|
import {useVModel} from '@vueuse/core';
|
|
5
|
-
import {State} from '../../enums';
|
|
5
|
+
import {Size, State} from '../../enums';
|
|
6
6
|
import AntTh from './AntTh.vue';
|
|
7
7
|
import AntTd from './AntTd.vue';
|
|
8
8
|
import AntSpinner from '../AntSpinner.vue';
|
|
9
9
|
import AntSkeleton from '../AntSkeleton.vue';
|
|
10
|
+
import {hasSlotContent} from "@/utils";
|
|
11
|
+
import AntCollapsibleTableRowContent from "./AntCollapsibleTableRowContent.vue";
|
|
12
|
+
import {CollapseStrategy} from "@/components/table/__types";
|
|
13
|
+
import {faAngleDown, faAngleUp} from "@fortawesome/free-solid-svg-icons";
|
|
14
|
+
import AntButton from "../buttons/AntButton.vue";
|
|
15
|
+
import AntIcon from "../AntIcon.vue";
|
|
10
16
|
|
|
11
17
|
defineOptions({inheritAttrs: false});
|
|
12
18
|
|
|
@@ -30,6 +36,8 @@ const props = withDefaults(
|
|
|
30
36
|
size?: AntTableSize;
|
|
31
37
|
headerColor?: string;
|
|
32
38
|
emptyStateText?: string;
|
|
39
|
+
collapseStrategy?: CollapseStrategy;
|
|
40
|
+
rowsCollapsed?: boolean;
|
|
33
41
|
}>(), {
|
|
34
42
|
rowKey: 'id',
|
|
35
43
|
loading: false,
|
|
@@ -38,8 +46,12 @@ const props = withDefaults(
|
|
|
38
46
|
size: AntTableSize.md,
|
|
39
47
|
headerColor: 'bg-base-200',
|
|
40
48
|
emptyStateText: 'We couldn\'t find any entry',
|
|
49
|
+
collapseStrategy: CollapseStrategy.single,
|
|
50
|
+
rowsCollapsed: true,
|
|
41
51
|
});
|
|
52
|
+
const slots = defineSlots();
|
|
42
53
|
|
|
54
|
+
const openItems = ref<number[]>([]);
|
|
43
55
|
const selected: Ref<Record<string, unknown> | undefined> = useVModel(props, 'selectedRow', emits);
|
|
44
56
|
const _loading: Ref<boolean> = useVModel(props, 'loading', emits);
|
|
45
57
|
const _showLightVersion = ref(props.showLightVersion);
|
|
@@ -53,6 +65,8 @@ const _headers = computed(() => {
|
|
|
53
65
|
return props.headers;
|
|
54
66
|
});
|
|
55
67
|
|
|
68
|
+
const maxColSpan = computed(() => _headers.value.length + (hasSlotContent(slots['rowFirstCell']) ? 1 : 0) + (hasSlotContent(slots['rowLastCell']) ? 1 : 0))
|
|
69
|
+
|
|
56
70
|
watch(() => props.showLightVersion, (val) => {
|
|
57
71
|
setTimeout(() => _showLightVersion.value = val, val ? 200 : 400);
|
|
58
72
|
});
|
|
@@ -82,11 +96,32 @@ function sortTable(header: TableHeader, newDirection: AntTableSortDirection) {
|
|
|
82
96
|
emits('updateSort', header, newDirection);
|
|
83
97
|
}
|
|
84
98
|
|
|
85
|
-
function rowClick(elem: Record<string, unknown>): void {
|
|
99
|
+
function rowClick(e: MouseEvent, elem: Record<string, unknown>): void {
|
|
100
|
+
e.preventDefault();
|
|
101
|
+
|
|
86
102
|
selected.value = elem;
|
|
87
103
|
|
|
88
104
|
emits('rowClick', elem);
|
|
89
105
|
}
|
|
106
|
+
|
|
107
|
+
function toggleRowContent(index: number) {
|
|
108
|
+
const isOpen = openItems.value.includes(index);
|
|
109
|
+
|
|
110
|
+
if (isOpen) {
|
|
111
|
+
openItems.value = props.collapseStrategy === CollapseStrategy.single && props.rowsCollapsed
|
|
112
|
+
? []
|
|
113
|
+
: openItems.value.filter(item => item !== index);
|
|
114
|
+
} else {
|
|
115
|
+
openItems.value = props.collapseStrategy === CollapseStrategy.single
|
|
116
|
+
? [index]
|
|
117
|
+
: [...openItems.value, index];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Open all row contents by default
|
|
122
|
+
if (!props.rowsCollapsed) {
|
|
123
|
+
props.data.map((_, index) => openItems.value.push(index));
|
|
124
|
+
}
|
|
90
125
|
</script>
|
|
91
126
|
|
|
92
127
|
<template>
|
|
@@ -121,67 +156,93 @@ function rowClick(elem: Record<string, unknown>): void {
|
|
|
121
156
|
</AntTh>
|
|
122
157
|
</template>
|
|
123
158
|
|
|
159
|
+
<template v-if="!!$slots.afterRowContent">
|
|
160
|
+
<td/>
|
|
161
|
+
</template>
|
|
162
|
+
|
|
124
163
|
<slot name="headerLastCell"></slot>
|
|
125
164
|
</tr>
|
|
126
165
|
</thead>
|
|
127
166
|
|
|
128
167
|
<tbody class="bg-white relative">
|
|
129
168
|
<!-- TODO:: Add some kind of virtual list for very large tree data (or required pagination??) -->
|
|
130
|
-
<
|
|
131
|
-
v-for="(elem, rowIndex) in data"
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
169
|
+
<template
|
|
170
|
+
v-for="(elem, rowIndex) in data" :key="`table-row-${elem[rowKey]}-${rowIndex}`"
|
|
171
|
+
>
|
|
172
|
+
<tr
|
|
173
|
+
:id="elem[rowKey] as string"
|
|
174
|
+
:class="{
|
|
135
175
|
'bg-primary-200 text-primary-200-font transition-colors': elem === selected,
|
|
136
176
|
'bg-white text-for-white-bg-font': elem !== selected && rowIndex % 2 === 0,
|
|
137
177
|
'bg-base-100 text-base-100-font': elem !== selected && rowIndex % 2 !== 0,
|
|
138
178
|
'cursor-pointer': selectableRows,
|
|
139
179
|
'hover:bg-base-200': selectableRows && elem !== selected,
|
|
140
180
|
}"
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
181
|
+
>
|
|
182
|
+
<slot
|
|
183
|
+
name="rowFirstCell"
|
|
184
|
+
v-bind="{ elem }"
|
|
185
|
+
/>
|
|
146
186
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
187
|
+
<template v-for="(header, colIndex) in _headers">
|
|
188
|
+
<AntTd
|
|
189
|
+
v-if="!_showLightVersion || (_showLightVersion && header.lightVersion)"
|
|
190
|
+
:key="`table-cell-${header.identifier}-${colIndex}`"
|
|
191
|
+
:header="header"
|
|
192
|
+
:element="elem"
|
|
193
|
+
:align="header.align"
|
|
194
|
+
:size="size"
|
|
195
|
+
@click="(e) => rowClick(e, elem)"
|
|
196
|
+
>
|
|
197
|
+
<template #beforeCellContent="props">
|
|
198
|
+
<slot
|
|
199
|
+
name="beforeCellContent"
|
|
200
|
+
v-bind="{...props, colIndex, rowIndex}"
|
|
201
|
+
/>
|
|
202
|
+
</template>
|
|
163
203
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
204
|
+
<template #cellContent="props">
|
|
205
|
+
<slot
|
|
206
|
+
name="cellContent"
|
|
207
|
+
v-bind="{...props, colIndex, rowIndex}"
|
|
208
|
+
/>
|
|
209
|
+
</template>
|
|
170
210
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
211
|
+
<template #afterCellContent="props">
|
|
212
|
+
<slot
|
|
213
|
+
name="afterCellContent"
|
|
214
|
+
v-bind="{...props, colIndex, rowIndex}"
|
|
215
|
+
/>
|
|
216
|
+
</template>
|
|
217
|
+
</AntTd>
|
|
218
|
+
</template>
|
|
179
219
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
220
|
+
<template v-if="!!$slots.afterRowContent">
|
|
221
|
+
<td class="whitespace-nowrap text-sm font-medium relative px-2 py-0 h-9 text-right"
|
|
222
|
+
@click="(e) => rowClick(e, elem)">
|
|
223
|
+
<AntButton @click="toggleRowContent(rowIndex)" :size="Size.xs2">
|
|
224
|
+
<AntIcon :icon="openItems.includes(rowIndex) ? faAngleUp : faAngleDown"/>
|
|
225
|
+
</AntButton>
|
|
226
|
+
</td>
|
|
227
|
+
</template>
|
|
228
|
+
|
|
229
|
+
<slot
|
|
230
|
+
name="rowLastCell"
|
|
231
|
+
v-bind="{ elem }"
|
|
232
|
+
/>
|
|
233
|
+
</tr>
|
|
234
|
+
|
|
235
|
+
<template v-if="!!$slots.afterRowContent">
|
|
236
|
+
<tr>
|
|
237
|
+
<td :colspan="maxColSpan + 1" class="p-0">
|
|
238
|
+
<AntCollapsibleTableRowContent :is-open="openItems.includes(rowIndex)"
|
|
239
|
+
>
|
|
240
|
+
<slot name="afterRowContent" v-bind="{ element: elem, rowIndex }"/>
|
|
241
|
+
</AntCollapsibleTableRowContent>
|
|
242
|
+
</td>
|
|
243
|
+
</tr>
|
|
244
|
+
</template>
|
|
245
|
+
</template>
|
|
185
246
|
|
|
186
247
|
<tr v-if="data.length <= 0 && !_loading">
|
|
187
248
|
<td
|
|
@@ -7,3 +7,6 @@ export declare const Docs: Story;
|
|
|
7
7
|
export declare const Empty: Story;
|
|
8
8
|
export declare const Skeleton: Story;
|
|
9
9
|
export declare const Loading: Story;
|
|
10
|
+
export declare const Collapsible: Story;
|
|
11
|
+
export declare const MultipleCollapseStrategy: Story;
|
|
12
|
+
export declare const DefaultCollapseOpen: Story;
|
|
@@ -3,7 +3,7 @@
|
|
|
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
8
|
var _TableHeader = require("../__types/TableHeader.types");
|
|
9
9
|
var _vue = require("vue");
|
|
@@ -169,8 +169,8 @@ const Docs = exports.Docs = {
|
|
|
169
169
|
<div class="h-96 border border-dashed border-base-300">
|
|
170
170
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
171
171
|
<template #cellContent="{element: entry, header}">
|
|
172
|
-
<div v-if="header.identifier === '
|
|
173
|
-
<AntSwitch v-model="entry.
|
|
172
|
+
<div v-if="header.identifier === 'employed'">
|
|
173
|
+
<AntSwitch v-model="entry.employed"/>
|
|
174
174
|
</div>
|
|
175
175
|
</template>
|
|
176
176
|
</AntTable>
|
|
@@ -196,8 +196,8 @@ const Docs = exports.Docs = {
|
|
|
196
196
|
rowClassList: "",
|
|
197
197
|
type: _TableHeader.AntTableRowTypes.text
|
|
198
198
|
}, {
|
|
199
|
-
title: "
|
|
200
|
-
identifier: "
|
|
199
|
+
title: "Employed",
|
|
200
|
+
identifier: "employed",
|
|
201
201
|
rowClassList: "",
|
|
202
202
|
type: _TableHeader.AntTableRowTypes.slot
|
|
203
203
|
}],
|
|
@@ -222,8 +222,8 @@ const Empty = exports.Empty = {
|
|
|
222
222
|
<div class="h-96 border border-dashed border-base-300">
|
|
223
223
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
224
224
|
<template #cellContent="{element: entry, header}">
|
|
225
|
-
<div v-if="header.identifier === '
|
|
226
|
-
<AntSwitch v-model="entry.
|
|
225
|
+
<div v-if="header.identifier === 'employed'">
|
|
226
|
+
<AntSwitch v-model="entry.employed"/>
|
|
227
227
|
</div>
|
|
228
228
|
</template>
|
|
229
229
|
</AntTable>
|
|
@@ -232,14 +232,13 @@ const Empty = exports.Empty = {
|
|
|
232
232
|
<div class="h-96 border border-dashed border-base-300">
|
|
233
233
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" empty-state-text="Custom Empty State Text">
|
|
234
234
|
<template #cellContent="{element: entry, header}">
|
|
235
|
-
<div v-if="header.identifier === '
|
|
236
|
-
<AntSwitch v-model="entry.
|
|
235
|
+
<div v-if="header.identifier === 'employed'">
|
|
236
|
+
<AntSwitch v-model="entry.employed"/>
|
|
237
237
|
</div>
|
|
238
238
|
</template>
|
|
239
239
|
</AntTable>
|
|
240
240
|
</div>
|
|
241
241
|
</div>
|
|
242
|
-
</div>
|
|
243
242
|
`
|
|
244
243
|
}),
|
|
245
244
|
args: {
|
|
@@ -334,4 +333,109 @@ const Loading = exports.Loading = {
|
|
|
334
333
|
}],
|
|
335
334
|
data: testData.value
|
|
336
335
|
}
|
|
336
|
+
};
|
|
337
|
+
const Collapsible = exports.Collapsible = {
|
|
338
|
+
render: args => ({
|
|
339
|
+
components: {
|
|
340
|
+
AntTable: _AntTable.default,
|
|
341
|
+
AntSwitch: _AntSwitch.default
|
|
342
|
+
},
|
|
343
|
+
setup() {
|
|
344
|
+
const selected = (0, _vue.ref)();
|
|
345
|
+
return {
|
|
346
|
+
args,
|
|
347
|
+
selected
|
|
348
|
+
};
|
|
349
|
+
},
|
|
350
|
+
template: `
|
|
351
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
352
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
353
|
+
<template #cellContent="{element: entry, header}">
|
|
354
|
+
<div v-if="header.identifier === 'employed'">
|
|
355
|
+
<AntSwitch v-model="entry.employed"/>
|
|
356
|
+
</div>
|
|
357
|
+
</template>
|
|
358
|
+
|
|
359
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
360
|
+
<div class="p-4">
|
|
361
|
+
<pre>
|
|
362
|
+
{{element}}
|
|
363
|
+
</pre>
|
|
364
|
+
</div>
|
|
365
|
+
</template>
|
|
366
|
+
</AntTable>
|
|
367
|
+
</div>
|
|
368
|
+
`
|
|
369
|
+
}),
|
|
370
|
+
args: Docs.args
|
|
371
|
+
};
|
|
372
|
+
const MultipleCollapseStrategy = exports.MultipleCollapseStrategy = {
|
|
373
|
+
render: args => ({
|
|
374
|
+
components: {
|
|
375
|
+
AntTable: _AntTable.default,
|
|
376
|
+
AntSwitch: _AntSwitch.default
|
|
377
|
+
},
|
|
378
|
+
setup() {
|
|
379
|
+
const selected = (0, _vue.ref)();
|
|
380
|
+
return {
|
|
381
|
+
args,
|
|
382
|
+
selected
|
|
383
|
+
};
|
|
384
|
+
},
|
|
385
|
+
template: `
|
|
386
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
387
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" collapse-strategy="multiple">
|
|
388
|
+
<template #cellContent="{element: entry, header}">
|
|
389
|
+
<div v-if="header.identifier === 'employed'">
|
|
390
|
+
<AntSwitch v-model="entry.employed"/>
|
|
391
|
+
</div>
|
|
392
|
+
</template>
|
|
393
|
+
|
|
394
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
395
|
+
<div class="p-4">
|
|
396
|
+
<pre>
|
|
397
|
+
{{JSON.stringify(element, null, 2)}}
|
|
398
|
+
</pre>
|
|
399
|
+
</div>
|
|
400
|
+
</template>
|
|
401
|
+
</AntTable>
|
|
402
|
+
</div>
|
|
403
|
+
`
|
|
404
|
+
}),
|
|
405
|
+
args: Docs.args
|
|
406
|
+
};
|
|
407
|
+
const DefaultCollapseOpen = exports.DefaultCollapseOpen = {
|
|
408
|
+
render: args => ({
|
|
409
|
+
components: {
|
|
410
|
+
AntTable: _AntTable.default,
|
|
411
|
+
AntSwitch: _AntSwitch.default
|
|
412
|
+
},
|
|
413
|
+
setup() {
|
|
414
|
+
const selected = (0, _vue.ref)();
|
|
415
|
+
return {
|
|
416
|
+
args,
|
|
417
|
+
selected
|
|
418
|
+
};
|
|
419
|
+
},
|
|
420
|
+
template: `
|
|
421
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
422
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" :rows-collapsed="false">
|
|
423
|
+
<template #cellContent="{element: entry, header}">
|
|
424
|
+
<div v-if="header.identifier === 'employed'">
|
|
425
|
+
<AntSwitch v-model="entry.employed"/>
|
|
426
|
+
</div>
|
|
427
|
+
</template>
|
|
428
|
+
|
|
429
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
430
|
+
<div class="p-4">
|
|
431
|
+
<pre>
|
|
432
|
+
{{JSON.stringify(element, null, 2)}}
|
|
433
|
+
</pre>
|
|
434
|
+
</div>
|
|
435
|
+
</template>
|
|
436
|
+
</AntTable>
|
|
437
|
+
</div>
|
|
438
|
+
`
|
|
439
|
+
}),
|
|
440
|
+
args: Docs.args
|
|
337
441
|
};
|
|
@@ -113,8 +113,8 @@ export const Docs = {
|
|
|
113
113
|
<div class="h-96 border border-dashed border-base-300">
|
|
114
114
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
115
115
|
<template #cellContent="{element: entry, header}">
|
|
116
|
-
<div v-if="header.identifier === '
|
|
117
|
-
<AntSwitch v-model="entry.
|
|
116
|
+
<div v-if="header.identifier === 'employed'">
|
|
117
|
+
<AntSwitch v-model="entry.employed"/>
|
|
118
118
|
</div>
|
|
119
119
|
</template>
|
|
120
120
|
</AntTable>
|
|
@@ -144,8 +144,8 @@ export const Docs = {
|
|
|
144
144
|
type: AntTableRowTypes.text
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
|
-
title: "
|
|
148
|
-
identifier: "
|
|
147
|
+
title: "Employed",
|
|
148
|
+
identifier: "employed",
|
|
149
149
|
rowClassList: "",
|
|
150
150
|
type: AntTableRowTypes.slot
|
|
151
151
|
}
|
|
@@ -165,8 +165,8 @@ export const Empty = {
|
|
|
165
165
|
<div class="h-96 border border-dashed border-base-300">
|
|
166
166
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
167
167
|
<template #cellContent="{element: entry, header}">
|
|
168
|
-
<div v-if="header.identifier === '
|
|
169
|
-
<AntSwitch v-model="entry.
|
|
168
|
+
<div v-if="header.identifier === 'employed'">
|
|
169
|
+
<AntSwitch v-model="entry.employed"/>
|
|
170
170
|
</div>
|
|
171
171
|
</template>
|
|
172
172
|
</AntTable>
|
|
@@ -175,14 +175,13 @@ export const Empty = {
|
|
|
175
175
|
<div class="h-96 border border-dashed border-base-300">
|
|
176
176
|
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" empty-state-text="Custom Empty State Text">
|
|
177
177
|
<template #cellContent="{element: entry, header}">
|
|
178
|
-
<div v-if="header.identifier === '
|
|
179
|
-
<AntSwitch v-model="entry.
|
|
178
|
+
<div v-if="header.identifier === 'employed'">
|
|
179
|
+
<AntSwitch v-model="entry.employed"/>
|
|
180
180
|
</div>
|
|
181
181
|
</template>
|
|
182
182
|
</AntTable>
|
|
183
183
|
</div>
|
|
184
184
|
</div>
|
|
185
|
-
</div>
|
|
186
185
|
`
|
|
187
186
|
}),
|
|
188
187
|
args: {
|
|
@@ -293,3 +292,90 @@ export const Loading = {
|
|
|
293
292
|
data: testData.value
|
|
294
293
|
}
|
|
295
294
|
};
|
|
295
|
+
export const Collapsible = {
|
|
296
|
+
render: (args) => ({
|
|
297
|
+
components: { AntTable, AntSwitch },
|
|
298
|
+
setup() {
|
|
299
|
+
const selected = ref();
|
|
300
|
+
return { args, selected };
|
|
301
|
+
},
|
|
302
|
+
template: `
|
|
303
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
304
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
305
|
+
<template #cellContent="{element: entry, header}">
|
|
306
|
+
<div v-if="header.identifier === 'employed'">
|
|
307
|
+
<AntSwitch v-model="entry.employed"/>
|
|
308
|
+
</div>
|
|
309
|
+
</template>
|
|
310
|
+
|
|
311
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
312
|
+
<div class="p-4">
|
|
313
|
+
<pre>
|
|
314
|
+
{{element}}
|
|
315
|
+
</pre>
|
|
316
|
+
</div>
|
|
317
|
+
</template>
|
|
318
|
+
</AntTable>
|
|
319
|
+
</div>
|
|
320
|
+
`
|
|
321
|
+
}),
|
|
322
|
+
args: Docs.args
|
|
323
|
+
};
|
|
324
|
+
export const MultipleCollapseStrategy = {
|
|
325
|
+
render: (args) => ({
|
|
326
|
+
components: { AntTable, AntSwitch },
|
|
327
|
+
setup() {
|
|
328
|
+
const selected = ref();
|
|
329
|
+
return { args, selected };
|
|
330
|
+
},
|
|
331
|
+
template: `
|
|
332
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
333
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" collapse-strategy="multiple">
|
|
334
|
+
<template #cellContent="{element: entry, header}">
|
|
335
|
+
<div v-if="header.identifier === 'employed'">
|
|
336
|
+
<AntSwitch v-model="entry.employed"/>
|
|
337
|
+
</div>
|
|
338
|
+
</template>
|
|
339
|
+
|
|
340
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
341
|
+
<div class="p-4">
|
|
342
|
+
<pre>
|
|
343
|
+
{{JSON.stringify(element, null, 2)}}
|
|
344
|
+
</pre>
|
|
345
|
+
</div>
|
|
346
|
+
</template>
|
|
347
|
+
</AntTable>
|
|
348
|
+
</div>
|
|
349
|
+
`
|
|
350
|
+
}),
|
|
351
|
+
args: Docs.args
|
|
352
|
+
};
|
|
353
|
+
export const DefaultCollapseOpen = {
|
|
354
|
+
render: (args) => ({
|
|
355
|
+
components: { AntTable, AntSwitch },
|
|
356
|
+
setup() {
|
|
357
|
+
const selected = ref();
|
|
358
|
+
return { args, selected };
|
|
359
|
+
},
|
|
360
|
+
template: `
|
|
361
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
362
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" :rows-collapsed="false">
|
|
363
|
+
<template #cellContent="{element: entry, header}">
|
|
364
|
+
<div v-if="header.identifier === 'employed'">
|
|
365
|
+
<AntSwitch v-model="entry.employed"/>
|
|
366
|
+
</div>
|
|
367
|
+
</template>
|
|
368
|
+
|
|
369
|
+
<template #afterRowContent="{element, rowIndex}">
|
|
370
|
+
<div class="p-4">
|
|
371
|
+
<pre>
|
|
372
|
+
{{JSON.stringify(element, null, 2)}}
|
|
373
|
+
</pre>
|
|
374
|
+
</div>
|
|
375
|
+
</template>
|
|
376
|
+
</AntTable>
|
|
377
|
+
</div>
|
|
378
|
+
`
|
|
379
|
+
}),
|
|
380
|
+
args: Docs.args
|
|
381
|
+
};
|
|
@@ -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 || {});
|
|
@@ -13,4 +13,15 @@ Object.keys(_TableHeader).forEach(function (key) {
|
|
|
13
13
|
return _TableHeader[key];
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
|
+
});
|
|
17
|
+
var _AntCollapsibleTable = require("./AntCollapsibleTable.types");
|
|
18
|
+
Object.keys(_AntCollapsibleTable).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _AntCollapsibleTable[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _AntCollapsibleTable[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
16
27
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antify/ui",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
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",
|