@antify/ui 2.0.0 → 2.1.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/dist/components/AntTooltip.vue +3 -1
- package/dist/components/__stories/AntTooltip.stories.d.ts +1 -0
- package/dist/components/__stories/AntTooltip.stories.js +8 -1
- package/dist/components/__stories/AntTooltip.stories.mjs +7 -0
- package/dist/components/crud/AntCrudTableFilter.vue +18 -20
- package/dist/components/inputs/Elements/AntSelectMenu.vue +25 -26
- package/dist/components/inputs/__stories/AntSelect.stories.d.ts +1 -0
- package/dist/components/inputs/__stories/AntSelect.stories.js +14 -2
- package/dist/components/inputs/__stories/AntSelect.stories.mjs +12 -1
- package/dist/components/table/AntTable.vue +4 -2
- package/dist/components/table/__stories/AntTable.stories.js +37 -1
- package/dist/components/table/__stories/AntTable.stories.mjs +31 -1
- package/package.json +1 -1
|
@@ -9,10 +9,12 @@ const props = withDefaults(defineProps<{
|
|
|
9
9
|
state?: InputState,
|
|
10
10
|
delay?: number,
|
|
11
11
|
tooltipClasses?: string | Record<string, boolean>
|
|
12
|
+
disabled?: boolean;
|
|
12
13
|
}>(), {
|
|
13
14
|
state: InputState.base,
|
|
14
15
|
delay: 600,
|
|
15
16
|
tooltipClasses: '',
|
|
17
|
+
disabled: false,
|
|
16
18
|
});
|
|
17
19
|
|
|
18
20
|
const floatOpen = ref<boolean>(false)
|
|
@@ -157,7 +159,7 @@ function onClick() {
|
|
|
157
159
|
|
|
158
160
|
<teleport to="body">
|
|
159
161
|
<div
|
|
160
|
-
v-if="floatOpen && hasSlotContent($slots.content)"
|
|
162
|
+
v-if="floatOpen && hasSlotContent($slots.content) && !disabled"
|
|
161
163
|
:class="_tooltipClasses"
|
|
162
164
|
ref="floating"
|
|
163
165
|
:style="{
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
|
|
6
|
+
exports.disabled = exports.default = exports.Docs = void 0;
|
|
7
7
|
var _AntTooltip = _interopRequireDefault(require("../AntTooltip.vue"));
|
|
8
8
|
var _enums = require("../../enums");
|
|
9
9
|
var _AntButton = _interopRequireDefault(require("../buttons/AntButton.vue"));
|
|
@@ -102,4 +102,11 @@ const Docs = exports.Docs = {
|
|
|
102
102
|
});
|
|
103
103
|
},
|
|
104
104
|
args: {}
|
|
105
|
+
};
|
|
106
|
+
const disabled = exports.disabled = {
|
|
107
|
+
render: Docs.render,
|
|
108
|
+
args: {
|
|
109
|
+
...Docs.args,
|
|
110
|
+
disabled: true
|
|
111
|
+
}
|
|
105
112
|
};
|
|
@@ -81,27 +81,25 @@ watch(() => props.fullWidth, (val) => {
|
|
|
81
81
|
v-model:show-dropdown="showDropdown"
|
|
82
82
|
:position="Position.left"
|
|
83
83
|
>
|
|
84
|
-
<
|
|
85
|
-
<
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
/>
|
|
84
|
+
<div class="flex">
|
|
85
|
+
<AntButton
|
|
86
|
+
:state="hasFilter ? State.info : State.base"
|
|
87
|
+
:grouped="hasFilter ? Grouped.left : Grouped.none"
|
|
88
|
+
:skeleton="skeleton"
|
|
89
|
+
:icon-left="faFilter"
|
|
90
|
+
@click="() => showDropdown = !showDropdown"
|
|
91
|
+
/>
|
|
93
92
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
</template>
|
|
93
|
+
<AntButton
|
|
94
|
+
v-if="hasFilter"
|
|
95
|
+
:state="State.info"
|
|
96
|
+
:grouped="Grouped.right"
|
|
97
|
+
:skeleton="skeleton"
|
|
98
|
+
:icon-left="faMultiply"
|
|
99
|
+
filled
|
|
100
|
+
@click="$emit('removeFilter')"
|
|
101
|
+
/>
|
|
102
|
+
</div>
|
|
105
103
|
|
|
106
104
|
<template #content>
|
|
107
105
|
<slot name="dropdownContent"/>
|
|
@@ -12,7 +12,6 @@ import type {SelectOption} from '../__types';
|
|
|
12
12
|
import {useElementSize, useVModel, onClickOutside} from '@vueuse/core';
|
|
13
13
|
import type {Validator} from '@antify/validate';
|
|
14
14
|
import {autoUpdate, flip, offset, useFloating} from "@floating-ui/vue";
|
|
15
|
-
import {vOnClickOutside} from '@vueuse/components';
|
|
16
15
|
|
|
17
16
|
const emit = defineEmits(['update:open', 'update:modelValue', 'update:focused', 'selectElement']);
|
|
18
17
|
const props = withDefaults(defineProps<{
|
|
@@ -35,7 +34,7 @@ const props = withDefaults(defineProps<{
|
|
|
35
34
|
closeOnSelectItem: true,
|
|
36
35
|
});
|
|
37
36
|
const reference = ref<HTMLElement | null | undefined>(props.inputRef)
|
|
38
|
-
const
|
|
37
|
+
const elementSize = useElementSize(reference);
|
|
39
38
|
const floating = ref<HTMLElement | null>(null)
|
|
40
39
|
const {floatingStyles, middlewareData, placement} = useFloating(reference, floating, {
|
|
41
40
|
placement: 'bottom',
|
|
@@ -69,7 +68,7 @@ const dropdownClasses = computed(() => {
|
|
|
69
68
|
};
|
|
70
69
|
|
|
71
70
|
return {
|
|
72
|
-
'w-full border flex flex-col gap-px outline-none -mt-px overflow-
|
|
71
|
+
'w-full border flex flex-col gap-px outline-none -mt-px overflow-y-auto shadow-md z-[90] max-h-[250px]': true,
|
|
73
72
|
'rounded-md': true,
|
|
74
73
|
[variants[props.state]]: true,
|
|
75
74
|
};
|
|
@@ -84,7 +83,7 @@ const dropDownItemClasses = computed(() => {
|
|
|
84
83
|
};
|
|
85
84
|
|
|
86
85
|
return {
|
|
87
|
-
'select-none text-ellipsis overflow-hidden whitespace-nowrap': true,
|
|
86
|
+
'select-none text-ellipsis overflow-hidden whitespace-nowrap min-h-fit': true,
|
|
88
87
|
[variants[props.state]]: true,
|
|
89
88
|
// Size
|
|
90
89
|
'p-1 text-xs': props.size === Size.xs2,
|
|
@@ -203,31 +202,31 @@ watch(_modelValue, (val) => {
|
|
|
203
202
|
<slot/>
|
|
204
203
|
|
|
205
204
|
<teleport to="body">
|
|
206
|
-
<div
|
|
207
|
-
v-if="isOpen"
|
|
208
|
-
:class="dropdownClasses"
|
|
209
|
-
ref="floating"
|
|
210
|
-
:style="{width: `${width.width.value}px!important`, ...floatingStyles}"
|
|
211
|
-
>
|
|
212
205
|
<div
|
|
213
|
-
v-
|
|
214
|
-
:
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
@mouseover="() => focusedDropDownItem = option.value"
|
|
206
|
+
v-if="isOpen"
|
|
207
|
+
:class="dropdownClasses"
|
|
208
|
+
ref="floating"
|
|
209
|
+
:style="{width: `${elementSize.width.value}px!important`, ...floatingStyles}"
|
|
218
210
|
>
|
|
219
|
-
|
|
211
|
+
<div
|
|
212
|
+
v-for="(option, index) in options"
|
|
213
|
+
:key="`option-${index}`"
|
|
214
|
+
:class="{...dropDownItemClasses, ...getActiveDropDownItemClasses(option)}"
|
|
215
|
+
@mousedown="(e) => onClickDropDownItem(e, option.value)"
|
|
216
|
+
@mouseover="() => focusedDropDownItem = option.value"
|
|
217
|
+
>
|
|
218
|
+
{{ option.label }}
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
<div
|
|
222
|
+
v-if="options.length === 0"
|
|
223
|
+
:class="{...dropDownItemClasses}"
|
|
224
|
+
>
|
|
225
|
+
<slot name="empty">
|
|
226
|
+
No options available
|
|
227
|
+
</slot>
|
|
228
|
+
</div>
|
|
220
229
|
</div>
|
|
221
|
-
|
|
222
|
-
<div
|
|
223
|
-
v-if="options.length === 0"
|
|
224
|
-
:class="{...dropDownItemClasses}"
|
|
225
|
-
>
|
|
226
|
-
<slot name="empty">
|
|
227
|
-
No options available
|
|
228
|
-
</slot>
|
|
229
|
-
</div>
|
|
230
|
-
</div>
|
|
231
230
|
</teleport>
|
|
232
231
|
</div>
|
|
233
232
|
</template>
|
|
@@ -4,6 +4,7 @@ declare const meta: Meta<typeof AntSelect>;
|
|
|
4
4
|
export default meta;
|
|
5
5
|
type Story = StoryObj<typeof AntSelect>;
|
|
6
6
|
export declare const Docs: Story;
|
|
7
|
+
export declare const manyOptions: Story;
|
|
7
8
|
export declare const nullable: Story;
|
|
8
9
|
export declare const skeleton: Story;
|
|
9
10
|
export declare const disabled: Story;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.withPlaceholder = exports.summary = exports.skeleton = exports.nullable = exports.ellipsisText = exports.disabled = exports.default = exports.Docs = void 0;
|
|
6
|
+
exports.withPlaceholder = exports.summary = exports.skeleton = exports.nullable = exports.manyOptions = exports.ellipsisText = exports.disabled = exports.default = exports.Docs = void 0;
|
|
7
7
|
var _Size = require("../../../enums/Size.enum");
|
|
8
8
|
var _AntSelect = _interopRequireDefault(require("../AntSelect.vue"));
|
|
9
9
|
var _AntSelectMenu = _interopRequireDefault(require("../Elements/AntSelectMenu.vue"));
|
|
@@ -75,6 +75,10 @@ const options = [{
|
|
|
75
75
|
label: "Option 4",
|
|
76
76
|
value: "4"
|
|
77
77
|
}];
|
|
78
|
+
const manySelectOptions = [...Array(24).keys()].map(key => ({
|
|
79
|
+
label: `Option ${Number(key) + 1}`,
|
|
80
|
+
value: Number(key) + 1
|
|
81
|
+
}));
|
|
78
82
|
const Docs = exports.Docs = {
|
|
79
83
|
render: args => ({
|
|
80
84
|
components: {
|
|
@@ -115,6 +119,13 @@ const Docs = exports.Docs = {
|
|
|
115
119
|
description: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod"
|
|
116
120
|
}
|
|
117
121
|
};
|
|
122
|
+
const manyOptions = exports.manyOptions = {
|
|
123
|
+
render: Docs.render,
|
|
124
|
+
args: {
|
|
125
|
+
...Docs.args,
|
|
126
|
+
options: manySelectOptions
|
|
127
|
+
}
|
|
128
|
+
};
|
|
118
129
|
const nullable = exports.nullable = {
|
|
119
130
|
render: Docs.render,
|
|
120
131
|
args: {
|
|
@@ -185,7 +196,8 @@ const summary = exports.summary = {
|
|
|
185
196
|
},
|
|
186
197
|
setup() {
|
|
187
198
|
return {
|
|
188
|
-
args
|
|
199
|
+
args,
|
|
200
|
+
manySelectOptions
|
|
189
201
|
};
|
|
190
202
|
},
|
|
191
203
|
template: `
|
|
@@ -53,6 +53,10 @@ const options = [
|
|
|
53
53
|
value: "4"
|
|
54
54
|
}
|
|
55
55
|
];
|
|
56
|
+
const manySelectOptions = [...Array(24).keys()].map((key) => ({
|
|
57
|
+
label: `Option ${Number(key) + 1}`,
|
|
58
|
+
value: Number(key) + 1
|
|
59
|
+
}));
|
|
56
60
|
export const Docs = {
|
|
57
61
|
render: (args) => ({
|
|
58
62
|
components: { AntSelect, AntDropdown },
|
|
@@ -86,6 +90,13 @@ export const Docs = {
|
|
|
86
90
|
description: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod"
|
|
87
91
|
}
|
|
88
92
|
};
|
|
93
|
+
export const manyOptions = {
|
|
94
|
+
render: Docs.render,
|
|
95
|
+
args: {
|
|
96
|
+
...Docs.args,
|
|
97
|
+
options: manySelectOptions
|
|
98
|
+
}
|
|
99
|
+
};
|
|
89
100
|
export const nullable = {
|
|
90
101
|
render: Docs.render,
|
|
91
102
|
args: {
|
|
@@ -151,7 +162,7 @@ export const summary = {
|
|
|
151
162
|
render: (args) => ({
|
|
152
163
|
components: { AntSelect },
|
|
153
164
|
setup() {
|
|
154
|
-
return { args };
|
|
165
|
+
return { args, manySelectOptions };
|
|
155
166
|
},
|
|
156
167
|
template: `
|
|
157
168
|
<div class="p-4 flex flex-col gap-2.5">
|
|
@@ -29,13 +29,15 @@ const props = withDefaults(
|
|
|
29
29
|
showLightVersion?: boolean;
|
|
30
30
|
size?: AntTableSize;
|
|
31
31
|
headerColor?: string;
|
|
32
|
+
emptyStateText?: string;
|
|
32
33
|
}>(), {
|
|
33
34
|
rowKey: 'id',
|
|
34
35
|
loading: false,
|
|
35
36
|
selectableRows: false,
|
|
36
37
|
showLightVersion: false,
|
|
37
38
|
size: AntTableSize.md,
|
|
38
|
-
headerColor: 'bg-base-200'
|
|
39
|
+
headerColor: 'bg-base-200',
|
|
40
|
+
emptyStateText: 'We couldn\'t find any entry',
|
|
39
41
|
});
|
|
40
42
|
|
|
41
43
|
const selected: Ref<Record<string, unknown> | undefined> = useVModel(props, 'selectedRow', emits);
|
|
@@ -188,7 +190,7 @@ function rowClick(elem: Record<string, unknown>): void {
|
|
|
188
190
|
>
|
|
189
191
|
<slot name="emptyState">
|
|
190
192
|
<div class="flex items-center flex-col">
|
|
191
|
-
<span class="font-semibold">
|
|
193
|
+
<span class="font-semibold">{{ emptyStateText }}</span>
|
|
192
194
|
</div>
|
|
193
195
|
</slot>
|
|
194
196
|
</td>
|
|
@@ -205,7 +205,43 @@ const Docs = exports.Docs = {
|
|
|
205
205
|
}
|
|
206
206
|
};
|
|
207
207
|
const Empty = exports.Empty = {
|
|
208
|
-
render:
|
|
208
|
+
render: args => ({
|
|
209
|
+
components: {
|
|
210
|
+
AntTable: _AntTable.default,
|
|
211
|
+
AntSwitch: _AntSwitch.default
|
|
212
|
+
},
|
|
213
|
+
setup() {
|
|
214
|
+
const selected = (0, _vue.ref)();
|
|
215
|
+
return {
|
|
216
|
+
args,
|
|
217
|
+
selected
|
|
218
|
+
};
|
|
219
|
+
},
|
|
220
|
+
template: `
|
|
221
|
+
<div class="flex flex-col gap-2">
|
|
222
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
223
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
224
|
+
<template #cellContent="{element: entry, header}">
|
|
225
|
+
<div v-if="header.identifier === 'employeed'">
|
|
226
|
+
<AntSwitch v-model="entry.employeed"/>
|
|
227
|
+
</div>
|
|
228
|
+
</template>
|
|
229
|
+
</AntTable>
|
|
230
|
+
</div>
|
|
231
|
+
|
|
232
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
233
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" empty-state-text="Custom Empty State Text">
|
|
234
|
+
<template #cellContent="{element: entry, header}">
|
|
235
|
+
<div v-if="header.identifier === 'employeed'">
|
|
236
|
+
<AntSwitch v-model="entry.employeed"/>
|
|
237
|
+
</div>
|
|
238
|
+
</template>
|
|
239
|
+
</AntTable>
|
|
240
|
+
</div>
|
|
241
|
+
</div>
|
|
242
|
+
</div>
|
|
243
|
+
`
|
|
244
|
+
}),
|
|
209
245
|
args: {
|
|
210
246
|
headers: [{
|
|
211
247
|
title: "Name",
|
|
@@ -154,7 +154,37 @@ export const Docs = {
|
|
|
154
154
|
}
|
|
155
155
|
};
|
|
156
156
|
export const Empty = {
|
|
157
|
-
render:
|
|
157
|
+
render: (args) => ({
|
|
158
|
+
components: { AntTable, AntSwitch },
|
|
159
|
+
setup() {
|
|
160
|
+
const selected = ref();
|
|
161
|
+
return { args, selected };
|
|
162
|
+
},
|
|
163
|
+
template: `
|
|
164
|
+
<div class="flex flex-col gap-2">
|
|
165
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
166
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
|
|
167
|
+
<template #cellContent="{element: entry, header}">
|
|
168
|
+
<div v-if="header.identifier === 'employeed'">
|
|
169
|
+
<AntSwitch v-model="entry.employeed"/>
|
|
170
|
+
</div>
|
|
171
|
+
</template>
|
|
172
|
+
</AntTable>
|
|
173
|
+
</div>
|
|
174
|
+
|
|
175
|
+
<div class="h-96 border border-dashed border-base-300">
|
|
176
|
+
<AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val" empty-state-text="Custom Empty State Text">
|
|
177
|
+
<template #cellContent="{element: entry, header}">
|
|
178
|
+
<div v-if="header.identifier === 'employeed'">
|
|
179
|
+
<AntSwitch v-model="entry.employeed"/>
|
|
180
|
+
</div>
|
|
181
|
+
</template>
|
|
182
|
+
</AntTable>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
`
|
|
187
|
+
}),
|
|
158
188
|
args: {
|
|
159
189
|
headers: [
|
|
160
190
|
{
|