@antify/ui-module 1.3.0 → 1.4.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/module.json +1 -1
- package/dist/runtime/components/AntTooltip.vue +69 -63
- package/dist/runtime/components/__stories/AntTooltip.stories.d.ts +5 -0
- package/dist/runtime/components/__stories/AntTooltip.stories.mjs +33 -11
- package/dist/runtime/components/buttons/AntActionButton.vue +35 -13
- package/dist/runtime/components/buttons/AntButton.vue +3 -3
- package/dist/runtime/components/buttons/AntCreateButton.vue +20 -8
- package/dist/runtime/components/buttons/AntDeleteButton.vue +20 -8
- package/dist/runtime/components/buttons/AntSaveAndNewButton.vue +21 -8
- package/dist/runtime/components/buttons/AntSaveButton.vue +20 -8
- package/dist/runtime/components/buttons/__stories/AntActionButton.stories.d.ts +1 -0
- package/dist/runtime/components/buttons/__stories/AntActionButton.stories.mjs +22 -0
- package/dist/runtime/components/buttons/__stories/AntCreateButton.stories.d.ts +1 -0
- package/dist/runtime/components/buttons/__stories/AntCreateButton.stories.mjs +9 -0
- package/dist/runtime/components/buttons/__stories/AntDeleteButton.stories.d.ts +1 -0
- package/dist/runtime/components/buttons/__stories/AntDeleteButton.stories.mjs +9 -0
- package/dist/runtime/components/buttons/__stories/AntSaveAndNewButton.stories.d.ts +1 -0
- package/dist/runtime/components/buttons/__stories/AntSaveAndNewButton.stories.mjs +9 -0
- package/dist/runtime/components/buttons/__stories/AntSaveButton.stories.d.ts +1 -0
- package/dist/runtime/components/buttons/__stories/AntSaveButton.stories.mjs +9 -0
- package/dist/runtime/components/crud/AntCrudDetailActions.vue +10 -3
- package/dist/runtime/components/crud/AntCrudDetailNav.vue +21 -15
- package/dist/runtime/components/crud/AntCrudTableFilter.vue +35 -33
- package/dist/runtime/utils.d.ts +6 -0
- package/dist/runtime/utils.mjs +21 -0
- package/package.json +1 -1
- package/src/runtime/components/AntTooltip.vue +69 -63
- package/src/runtime/components/buttons/AntActionButton.vue +35 -13
- package/src/runtime/components/buttons/AntButton.vue +3 -3
- package/src/runtime/components/buttons/AntCreateButton.vue +20 -8
- package/src/runtime/components/buttons/AntDeleteButton.vue +20 -8
- package/src/runtime/components/buttons/AntSaveAndNewButton.vue +21 -8
- package/src/runtime/components/buttons/AntSaveButton.vue +20 -8
- package/src/runtime/components/crud/AntCrudDetailActions.vue +10 -3
- package/src/runtime/components/crud/AntCrudDetailNav.vue +21 -15
- package/src/runtime/components/crud/AntCrudTableFilter.vue +35 -33
package/dist/module.json
CHANGED
|
@@ -3,78 +3,80 @@ import {computed, onMounted, ref} from 'vue';
|
|
|
3
3
|
import {handleEnumValidation} from '../handler';
|
|
4
4
|
import {InputColorType, Position} from '../enums';
|
|
5
5
|
import {classesToObjectSyntax} from '../utils';
|
|
6
|
+
import {hasSlotContent} from '../utils';
|
|
6
7
|
|
|
7
8
|
const props = withDefaults(defineProps<{
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
position?: Position
|
|
10
|
+
tooltipClasses?: string | Record<string, boolean>
|
|
11
|
+
colorType?: InputColorType
|
|
12
|
+
expanded?: boolean
|
|
12
13
|
}>(), {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
position: Position.left,
|
|
15
|
+
tooltipClasses: '',
|
|
16
|
+
colorType: InputColorType.base,
|
|
17
|
+
expanded: false
|
|
16
18
|
});
|
|
17
19
|
const visible = ref(false);
|
|
18
20
|
const _tooltipClasses = computed(() => ({
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
'absolute w-max inline-flex': true,
|
|
22
|
+
// Position
|
|
23
|
+
'bottom-full pb-3.5': props.position === Position.top,
|
|
24
|
+
'top-full pt-3.5': props.position === Position.bottom,
|
|
25
|
+
'right-full pr-3.5': props.position === Position.left,
|
|
26
|
+
'left-full pl-3.5': props.position === Position.right,
|
|
27
|
+
...classesToObjectSyntax(props.tooltipClasses)
|
|
26
28
|
}));
|
|
27
29
|
const classes = computed(() => ({
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
'z-10 absolute flex': true,
|
|
31
|
+
'top-0 left-0 right-0 -m-[2px] justify-center': props.position === Position.bottom,
|
|
32
|
+
'bottom-0 left-0 right-0 -m-[2px] justify-center': props.position === Position.top,
|
|
33
|
+
'top-0 left-0 bottom-0 -ml-[2.2px] items-center': props.position === Position.right,
|
|
34
|
+
'top-0 right-0 bottom-0 -mr-[2.2px] items-center': props.position === Position.left,
|
|
33
35
|
}));
|
|
34
36
|
const itemContainerClasses = computed(() => ({
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
'relative flex items-center': true,
|
|
38
|
+
'justify-center': props.position === Position.bottom,
|
|
39
|
+
'justify-center rotate-180': props.position === Position.top,
|
|
40
|
+
'justify-center -rotate-90': props.position === Position.right,
|
|
41
|
+
'justify-center rotate-90': props.position === Position.left,
|
|
40
42
|
}));
|
|
41
43
|
const contentClasses = computed(() => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
const variants: Record<InputColorType, string> = {
|
|
45
|
+
[InputColorType.base]: 'text-neutral-50-font bg-neutral-50 border-neutral-300',
|
|
46
|
+
[InputColorType.danger]: 'text-danger-500-font bg-danger-500 border-danger-500',
|
|
47
|
+
[InputColorType.info]: 'text-info-500-font bg-info-500 border-info-500',
|
|
48
|
+
[InputColorType.success]: 'text-success-500-font bg-success-500 border-success-500',
|
|
49
|
+
[InputColorType.warning]: 'text-warning-500-font bg-warning-500 border-warning-500',
|
|
50
|
+
};
|
|
49
51
|
|
|
50
|
-
|
|
52
|
+
return {[variants[props.colorType]]: true};
|
|
51
53
|
});
|
|
52
54
|
const svgPathClasses = computed(() => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
const variants: Record<InputColorType, string> = {
|
|
56
|
+
[InputColorType.base]: 'fill-neutral-50 stroke-neutral-50',
|
|
57
|
+
[InputColorType.danger]: 'fill-danger-500 stroke-danger-500',
|
|
58
|
+
[InputColorType.info]: 'fill-info-500 stroke-info-500',
|
|
59
|
+
[InputColorType.success]: 'fill-success-500 stroke-success-500',
|
|
60
|
+
[InputColorType.warning]: 'fill-warning-500 stroke-warning-500',
|
|
61
|
+
};
|
|
60
62
|
|
|
61
|
-
|
|
63
|
+
return {[variants[props.colorType]]: true};
|
|
62
64
|
});
|
|
63
65
|
const arrowSvgPathClasses = computed(() => {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
66
|
+
const variants: Record<InputColorType, string> = {
|
|
67
|
+
[InputColorType.base]: 'stroke-neutral-300',
|
|
68
|
+
[InputColorType.danger]: 'stroke-danger-500',
|
|
69
|
+
[InputColorType.info]: 'stroke-info-500',
|
|
70
|
+
[InputColorType.success]: 'stroke-success-500',
|
|
71
|
+
[InputColorType.warning]: 'stroke-warning-500',
|
|
72
|
+
};
|
|
71
73
|
|
|
72
|
-
|
|
74
|
+
return {[variants[props.colorType]]: true};
|
|
73
75
|
});
|
|
74
76
|
|
|
75
77
|
onMounted(() => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
+
handleEnumValidation(props.position, Position, 'Position')
|
|
79
|
+
handleEnumValidation(props.colorType, InputColorType, 'colorType')
|
|
78
80
|
});
|
|
79
81
|
|
|
80
82
|
/**
|
|
@@ -84,33 +86,37 @@ onMounted(() => {
|
|
|
84
86
|
const delayVisible = ref(visible.value);
|
|
85
87
|
|
|
86
88
|
function onMouseOver() {
|
|
87
|
-
|
|
89
|
+
delayVisible.value = true;
|
|
88
90
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
setTimeout(() => {
|
|
92
|
+
if (delayVisible.value) {
|
|
93
|
+
visible.value = true
|
|
94
|
+
}
|
|
95
|
+
}, 300)
|
|
94
96
|
}
|
|
95
97
|
|
|
96
98
|
function onMouseLeave() {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
delayVisible.value = false
|
|
100
|
+
visible.value = false
|
|
99
101
|
}
|
|
100
102
|
</script>
|
|
101
103
|
|
|
102
104
|
<template>
|
|
103
105
|
<div
|
|
104
|
-
class="relative
|
|
106
|
+
class="relative justify-center items-center"
|
|
107
|
+
:class="{'flex w-full': props.expanded, 'inline-flex': !props.expanded}"
|
|
105
108
|
data-e2e="tooltip"
|
|
106
109
|
@mouseover="onMouseOver"
|
|
107
110
|
@mouseleave="onMouseLeave"
|
|
108
111
|
>
|
|
109
|
-
<slot/>
|
|
112
|
+
<slot />
|
|
110
113
|
|
|
111
|
-
<div
|
|
114
|
+
<div
|
|
115
|
+
v-if="visible && hasSlotContent($slots.content)"
|
|
116
|
+
:class="_tooltipClasses"
|
|
117
|
+
>
|
|
112
118
|
<div
|
|
113
|
-
class="shadow-lg text-sm relative
|
|
119
|
+
class="shadow-lg text-sm relative"
|
|
114
120
|
>
|
|
115
121
|
<div
|
|
116
122
|
:class="classes"
|
|
@@ -157,7 +163,7 @@ function onMouseLeave() {
|
|
|
157
163
|
class="p-2.5 rounded-md border"
|
|
158
164
|
:class="contentClasses"
|
|
159
165
|
>
|
|
160
|
-
<slot name="content"/>
|
|
166
|
+
<slot name="content" />
|
|
161
167
|
</div>
|
|
162
168
|
</div>
|
|
163
169
|
</div>
|
|
@@ -4,3 +4,8 @@ declare const meta: Meta<typeof AntTooltip>;
|
|
|
4
4
|
export default meta;
|
|
5
5
|
type Story = StoryObj<typeof AntTooltip>;
|
|
6
6
|
export declare const Docs: Story;
|
|
7
|
+
/**
|
|
8
|
+
* Make sure, no tooltip get shown if no content is provided.
|
|
9
|
+
*/
|
|
10
|
+
export declare const WithoutContent: Story;
|
|
11
|
+
export declare const Expanded: Story;
|
|
@@ -25,19 +25,41 @@ export const Docs = {
|
|
|
25
25
|
return { args };
|
|
26
26
|
},
|
|
27
27
|
template: `
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
</div>
|
|
38
|
-
`
|
|
28
|
+
<div class="p-32 flex justify-center items-center">
|
|
29
|
+
<AntTooltip v-bind="args">
|
|
30
|
+
<template #content>Lorem ipsum dolor sit amet <br/> foo</template>
|
|
31
|
+
<template #default>
|
|
32
|
+
<AntButton readonly filled expanded>Hover me</AntButton>
|
|
33
|
+
</template>
|
|
34
|
+
</AntTooltip>
|
|
35
|
+
</div>
|
|
36
|
+
`
|
|
39
37
|
}),
|
|
40
38
|
args: {
|
|
41
39
|
position: Position.top
|
|
42
40
|
}
|
|
43
41
|
};
|
|
42
|
+
export const WithoutContent = {
|
|
43
|
+
render: (args) => ({
|
|
44
|
+
components: { AntTooltip, AntButton },
|
|
45
|
+
setup() {
|
|
46
|
+
return { args };
|
|
47
|
+
},
|
|
48
|
+
template: `
|
|
49
|
+
<div class="p-32 flex justify-center items-center">
|
|
50
|
+
<AntTooltip v-bind="args">
|
|
51
|
+
<AntButton readonly filled expanded>Hover me</AntButton>
|
|
52
|
+
|
|
53
|
+
<template #content></template>
|
|
54
|
+
</AntTooltip>
|
|
55
|
+
</div>
|
|
56
|
+
`
|
|
57
|
+
}),
|
|
58
|
+
args: {}
|
|
59
|
+
};
|
|
60
|
+
export const Expanded = {
|
|
61
|
+
render: Docs.render,
|
|
62
|
+
args: {
|
|
63
|
+
expanded: true
|
|
64
|
+
}
|
|
65
|
+
};
|
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import {Grouped} from '../../enums/Grouped.enum';
|
|
7
7
|
import {Size} from '../../enums/Size.enum';
|
|
8
|
-
import {ColorType} from '../../enums/ColorType.enum';
|
|
8
|
+
import {ColorType, InputColorType} from '../../enums/ColorType.enum';
|
|
9
|
+
import {Position} from '../../enums/Position.enum';
|
|
9
10
|
import AntButton from './AntButton.vue';
|
|
11
|
+
import AntTooltip from '../AntTooltip.vue';
|
|
10
12
|
|
|
11
13
|
defineEmits(['click', 'blur']);
|
|
12
14
|
withDefaults(
|
|
@@ -17,25 +19,45 @@ withDefaults(
|
|
|
17
19
|
colorType?: ColorType;
|
|
18
20
|
skeleton?: boolean;
|
|
19
21
|
expanded?: boolean;
|
|
22
|
+
filled?: boolean;
|
|
23
|
+
hasPermission?: boolean;
|
|
24
|
+
invalidPermissionTooltipPosition?: Position;
|
|
20
25
|
}>(), {
|
|
21
26
|
colorType: ColorType.primary,
|
|
27
|
+
hasPermission: true,
|
|
28
|
+
filled: true
|
|
22
29
|
}
|
|
23
30
|
)
|
|
24
31
|
</script>
|
|
25
32
|
|
|
26
33
|
<template>
|
|
27
|
-
<
|
|
28
|
-
:size="size"
|
|
29
|
-
:disabled="disabled"
|
|
30
|
-
:grouped="grouped"
|
|
31
|
-
:skeleton="skeleton"
|
|
34
|
+
<AntTooltip
|
|
32
35
|
:expanded="expanded"
|
|
33
|
-
:
|
|
34
|
-
|
|
35
|
-
data-e2e="action-button"
|
|
36
|
-
@click="$emit('click')"
|
|
37
|
-
@blur="$emit('blur')"
|
|
36
|
+
:position="invalidPermissionTooltipPosition"
|
|
37
|
+
:color-type="InputColorType.info"
|
|
38
38
|
>
|
|
39
|
-
<slot
|
|
40
|
-
|
|
39
|
+
<slot name="button">
|
|
40
|
+
<AntButton
|
|
41
|
+
:size="size"
|
|
42
|
+
:disabled="disabled || !hasPermission"
|
|
43
|
+
:grouped="grouped"
|
|
44
|
+
:skeleton="skeleton"
|
|
45
|
+
:expanded="expanded"
|
|
46
|
+
:color-type="colorType"
|
|
47
|
+
:filled="filled"
|
|
48
|
+
data-e2e="action-button"
|
|
49
|
+
@click="$emit('click')"
|
|
50
|
+
@blur="$emit('blur')"
|
|
51
|
+
>
|
|
52
|
+
<slot />
|
|
53
|
+
</AntButton>
|
|
54
|
+
</slot>
|
|
55
|
+
|
|
56
|
+
<template
|
|
57
|
+
v-if="!hasPermission && !skeleton"
|
|
58
|
+
#content
|
|
59
|
+
>
|
|
60
|
+
<slot name="invalidPermissionTooltipContent" />
|
|
61
|
+
</template>
|
|
62
|
+
</AntTooltip>
|
|
41
63
|
</template>
|
|
@@ -102,7 +102,7 @@ const classes = computed(() => {
|
|
|
102
102
|
return {
|
|
103
103
|
'transition-all inline-flex items-center justify-center relative font-medium': true,
|
|
104
104
|
'focus:z-10': true,
|
|
105
|
-
'active:shadow-[inset_0_4px_4px_rgba(0,0,0,0.25)]': !
|
|
105
|
+
'active:shadow-[inset_0_4px_4px_rgba(0,0,0,0.25)]': !hasAction.value,
|
|
106
106
|
'py-1.5 px-2.5 text-xs gap-1': props.size === Size.sm,
|
|
107
107
|
'py-2.5 px-3.5 text-sm gap-2.5': props.size === Size.md,
|
|
108
108
|
'disabled:opacity-50 disabled:cursor-not-allowed': true,
|
|
@@ -115,9 +115,9 @@ const classes = computed(() => {
|
|
|
115
115
|
...groupedClassList.value,
|
|
116
116
|
[variants[props.colorType]]: true,
|
|
117
117
|
[notFilledVariants[props.colorType]]: !props.filled,
|
|
118
|
-
[notFilledHoverVariants[props.colorType]]: !props.filled && !
|
|
118
|
+
[notFilledHoverVariants[props.colorType]]: !props.filled && !hasAction.value,
|
|
119
119
|
[filledVariants[props.colorType]]: props.filled,
|
|
120
|
-
[filledHoverVariants[props.colorType]]: props.filled && !
|
|
120
|
+
[filledHoverVariants[props.colorType]]: props.filled && !hasAction.value,
|
|
121
121
|
};
|
|
122
122
|
});
|
|
123
123
|
const iconColor = computed(() => {
|
|
@@ -2,15 +2,20 @@
|
|
|
2
2
|
import {Grouped} from '../../enums/Grouped.enum';
|
|
3
3
|
import {Size} from '../../enums/Size.enum';
|
|
4
4
|
import AntActionButton from './AntActionButton.vue';
|
|
5
|
+
import {Position} from '../../enums';
|
|
5
6
|
|
|
6
7
|
defineEmits(['click', 'blur']);
|
|
7
|
-
defineProps<{
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
withDefaults(defineProps<{
|
|
9
|
+
size?: Size;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
grouped?: Grouped;
|
|
12
|
+
skeleton?: boolean;
|
|
13
|
+
expanded?: boolean;
|
|
14
|
+
canCreate?: boolean;
|
|
15
|
+
invalidPermissionTooltipPosition?: Position;
|
|
16
|
+
}>(), {
|
|
17
|
+
canCreate: true
|
|
18
|
+
});
|
|
14
19
|
</script>
|
|
15
20
|
|
|
16
21
|
<template>
|
|
@@ -20,10 +25,17 @@ defineProps<{
|
|
|
20
25
|
:grouped="grouped"
|
|
21
26
|
:skeleton="skeleton"
|
|
22
27
|
:expanded="expanded"
|
|
28
|
+
:has-permission="canCreate"
|
|
29
|
+
:invalid-permission-tooltip-position="invalidPermissionTooltipPosition"
|
|
23
30
|
data-e2e="create-button"
|
|
24
31
|
@click="$emit('click')"
|
|
25
32
|
@blur="$emit('blur')"
|
|
26
33
|
>
|
|
27
|
-
Create
|
|
34
|
+
<template #default>Create</template>
|
|
35
|
+
|
|
36
|
+
<template #invalidPermissionTooltipContent>
|
|
37
|
+
You have no permission to create new entries.<br>
|
|
38
|
+
Please contact your administrator.
|
|
39
|
+
</template>
|
|
28
40
|
</AntActionButton>
|
|
29
41
|
</template>
|
|
@@ -3,15 +3,20 @@ import {Grouped} from '../../enums/Grouped.enum';
|
|
|
3
3
|
import {Size} from '../../enums/Size.enum';
|
|
4
4
|
import {ColorType} from '../../enums/ColorType.enum';
|
|
5
5
|
import AntActionButton from './AntActionButton.vue';
|
|
6
|
+
import {Position} from '../../enums';
|
|
6
7
|
|
|
7
8
|
defineEmits(['click', 'blur']);
|
|
8
|
-
defineProps<{
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
withDefaults(defineProps<{
|
|
10
|
+
size?: Size;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
grouped?: Grouped;
|
|
13
|
+
skeleton?: boolean;
|
|
14
|
+
expanded?: boolean;
|
|
15
|
+
canDelete?: boolean;
|
|
16
|
+
invalidPermissionTooltipPosition?: Position;
|
|
17
|
+
}>(), {
|
|
18
|
+
canDelete: true
|
|
19
|
+
})
|
|
15
20
|
</script>
|
|
16
21
|
|
|
17
22
|
<template>
|
|
@@ -22,10 +27,17 @@ defineProps<{
|
|
|
22
27
|
:skeleton="skeleton"
|
|
23
28
|
:expanded="expanded"
|
|
24
29
|
:color-type="ColorType.danger"
|
|
30
|
+
:has-permission="canDelete"
|
|
31
|
+
:invalid-permission-tooltip-position="invalidPermissionTooltipPosition"
|
|
25
32
|
data-e2e="delete-button"
|
|
26
33
|
@click="$emit('click')"
|
|
27
34
|
@blur="$emit('blur')"
|
|
28
35
|
>
|
|
29
|
-
Delete
|
|
36
|
+
<template #default>Delete</template>
|
|
37
|
+
|
|
38
|
+
<template #invalidPermissionTooltipContent>
|
|
39
|
+
You have no permission to delete this entry.<br>
|
|
40
|
+
Please contact your administrator.
|
|
41
|
+
</template>
|
|
30
42
|
</AntActionButton>
|
|
31
43
|
</template>
|
|
@@ -2,15 +2,20 @@
|
|
|
2
2
|
import {Grouped} from '../../enums/Grouped.enum';
|
|
3
3
|
import {Size} from '../../enums/Size.enum';
|
|
4
4
|
import AntActionButton from './AntActionButton.vue';
|
|
5
|
+
import {Position} from '../../enums';
|
|
5
6
|
|
|
6
7
|
defineEmits(['click', 'blur']);
|
|
7
|
-
defineProps<{
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
withDefaults(defineProps<{
|
|
9
|
+
size?: Size;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
grouped?: Grouped;
|
|
12
|
+
skeleton?: boolean;
|
|
13
|
+
expanded?: boolean;
|
|
14
|
+
canSave?: boolean;
|
|
15
|
+
invalidPermissionTooltipPosition?: Position;
|
|
16
|
+
}>(), {
|
|
17
|
+
canSave: true
|
|
18
|
+
});
|
|
14
19
|
</script>
|
|
15
20
|
|
|
16
21
|
<template>
|
|
@@ -20,10 +25,18 @@ defineProps<{
|
|
|
20
25
|
:grouped="grouped"
|
|
21
26
|
:skeleton="skeleton"
|
|
22
27
|
:expanded="expanded"
|
|
28
|
+
:filled="false"
|
|
29
|
+
:has-permission="canSave"
|
|
30
|
+
:invalid-permission-tooltip-position="invalidPermissionTooltipPosition"
|
|
23
31
|
data-e2e="save-and-new-button"
|
|
24
32
|
@click="$emit('click')"
|
|
25
33
|
@blur="$emit('blur')"
|
|
26
34
|
>
|
|
27
|
-
Save and new
|
|
35
|
+
<template #default>Save and new</template>
|
|
36
|
+
|
|
37
|
+
<template #invalidPermissionTooltipContent>
|
|
38
|
+
You have no permission to save this entry.<br>
|
|
39
|
+
Please contact your administrator.
|
|
40
|
+
</template>
|
|
28
41
|
</AntActionButton>
|
|
29
42
|
</template>
|
|
@@ -3,15 +3,20 @@ import {Grouped} from '../../enums/Grouped.enum';
|
|
|
3
3
|
import {Size} from '../../enums/Size.enum';
|
|
4
4
|
import {ColorType} from '../../enums/ColorType.enum';
|
|
5
5
|
import AntActionButton from './AntActionButton.vue';
|
|
6
|
+
import {Position} from '../../enums';
|
|
6
7
|
|
|
7
8
|
defineEmits(['click', 'blur']);
|
|
8
|
-
defineProps<{
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
withDefaults(defineProps<{
|
|
10
|
+
size?: Size;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
grouped?: Grouped;
|
|
13
|
+
skeleton?: boolean;
|
|
14
|
+
expanded?: boolean;
|
|
15
|
+
canSave?: boolean;
|
|
16
|
+
invalidPermissionTooltipPosition?: Position;
|
|
17
|
+
}>(), {
|
|
18
|
+
canSave: true
|
|
19
|
+
});
|
|
15
20
|
</script>
|
|
16
21
|
|
|
17
22
|
<template>
|
|
@@ -23,9 +28,16 @@ defineProps<{
|
|
|
23
28
|
:expanded="expanded"
|
|
24
29
|
:color-type="ColorType.primary"
|
|
25
30
|
data-e2e="save-button"
|
|
31
|
+
:has-permission="canSave"
|
|
32
|
+
:invalid-permission-tooltip-position="invalidPermissionTooltipPosition"
|
|
26
33
|
@click="$emit('click')"
|
|
27
34
|
@blur="$emit('blur')"
|
|
28
35
|
>
|
|
29
|
-
Save
|
|
36
|
+
<template #default>Save</template>
|
|
37
|
+
|
|
38
|
+
<template #invalidPermissionTooltipContent>
|
|
39
|
+
You have no permission to save this entry.<br>
|
|
40
|
+
Please contact your administrator.
|
|
41
|
+
</template>
|
|
30
42
|
</AntActionButton>
|
|
31
43
|
</template>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import AntActionButton from "../AntActionButton.vue";
|
|
2
2
|
import { Size } from "../../../enums/Size.enum.mjs";
|
|
3
3
|
import { Grouped as _Grouped } from "../../../enums/Grouped.enum.mjs";
|
|
4
|
+
import { Position } from "../../../enums/index.mjs";
|
|
4
5
|
const meta = {
|
|
5
6
|
title: "Components/Buttons/Action Button",
|
|
6
7
|
component: AntActionButton,
|
|
@@ -13,6 +14,10 @@ const meta = {
|
|
|
13
14
|
grouped: {
|
|
14
15
|
control: { type: "select" },
|
|
15
16
|
options: Object.values(_Grouped)
|
|
17
|
+
},
|
|
18
|
+
invalidPermissionTooltipPosition: {
|
|
19
|
+
control: { type: "select" },
|
|
20
|
+
options: Object.values(Position)
|
|
16
21
|
}
|
|
17
22
|
}
|
|
18
23
|
};
|
|
@@ -55,3 +60,20 @@ export const Expanded = {
|
|
|
55
60
|
expanded: true
|
|
56
61
|
}
|
|
57
62
|
};
|
|
63
|
+
export const WithPermissionTooltip = {
|
|
64
|
+
render: (args) => ({
|
|
65
|
+
components: { AntActionButton },
|
|
66
|
+
setup() {
|
|
67
|
+
return { args };
|
|
68
|
+
},
|
|
69
|
+
template: `<AntActionButton v-bind="args">
|
|
70
|
+
Action Button
|
|
71
|
+
|
|
72
|
+
<template #invalidPermissionTooltipContent>You have no permission to do this</template>
|
|
73
|
+
</AntActionButton>`
|
|
74
|
+
}),
|
|
75
|
+
args: {
|
|
76
|
+
hasPermission: false,
|
|
77
|
+
invalidPermissionTooltipPosition: Position.right
|
|
78
|
+
}
|
|
79
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import AntCreateButton from "../AntCreateButton.vue";
|
|
2
2
|
import { Size } from "../../../enums/Size.enum.mjs";
|
|
3
3
|
import { Grouped as _Grouped } from "../../../enums/Grouped.enum.mjs";
|
|
4
|
+
import { Position } from "../../../enums/index.mjs";
|
|
4
5
|
const meta = {
|
|
5
6
|
title: "Components/Buttons/Create Button",
|
|
6
7
|
component: AntCreateButton,
|
|
@@ -55,3 +56,11 @@ export const Expanded = {
|
|
|
55
56
|
expanded: true
|
|
56
57
|
}
|
|
57
58
|
};
|
|
59
|
+
export const InvalidPermission = {
|
|
60
|
+
render: Docs.render,
|
|
61
|
+
args: {
|
|
62
|
+
...Docs.args,
|
|
63
|
+
canCreate: false,
|
|
64
|
+
invalidPermissionTooltipPosition: Position.right
|
|
65
|
+
}
|
|
66
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import AntDeleteButton from "../AntDeleteButton.vue";
|
|
2
2
|
import { Size } from "../../../enums/Size.enum.mjs";
|
|
3
3
|
import { Grouped as _Grouped } from "../../../enums/Grouped.enum.mjs";
|
|
4
|
+
import { Position } from "../../../enums/index.mjs";
|
|
4
5
|
const meta = {
|
|
5
6
|
title: "Components/Buttons/Delete Button",
|
|
6
7
|
component: AntDeleteButton,
|
|
@@ -55,3 +56,11 @@ export const Expanded = {
|
|
|
55
56
|
expanded: true
|
|
56
57
|
}
|
|
57
58
|
};
|
|
59
|
+
export const InvalidPermission = {
|
|
60
|
+
render: Docs.render,
|
|
61
|
+
args: {
|
|
62
|
+
...Docs.args,
|
|
63
|
+
canDelete: false,
|
|
64
|
+
invalidPermissionTooltipPosition: Position.right
|
|
65
|
+
}
|
|
66
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import AntSaveAndNewButton from "../AntSaveAndNewButton.vue";
|
|
2
2
|
import { Size } from "../../../enums/Size.enum.mjs";
|
|
3
3
|
import { Grouped as _Grouped } from "../../../enums/Grouped.enum.mjs";
|
|
4
|
+
import { Position } from "../../../enums/index.mjs";
|
|
4
5
|
const meta = {
|
|
5
6
|
title: "Components/Buttons/Save And New Button",
|
|
6
7
|
component: AntSaveAndNewButton,
|
|
@@ -55,3 +56,11 @@ export const Expanded = {
|
|
|
55
56
|
expanded: true
|
|
56
57
|
}
|
|
57
58
|
};
|
|
59
|
+
export const InvalidPermission = {
|
|
60
|
+
render: Docs.render,
|
|
61
|
+
args: {
|
|
62
|
+
...Docs.args,
|
|
63
|
+
canSave: false,
|
|
64
|
+
invalidPermissionTooltipPosition: Position.right
|
|
65
|
+
}
|
|
66
|
+
};
|