|
@@ -1,5 +1,7 @@
|
|
|
<script lang="ts" setup>
|
|
|
-import { computed, reactive } from 'vue';
|
|
|
+import type { TippyProps } from '@vben/common-ui';
|
|
|
+
|
|
|
+import { reactive } from 'vue';
|
|
|
|
|
|
import { Page, Tippy } from '@vben/common-ui';
|
|
|
|
|
@@ -7,84 +9,175 @@ import { Button, Card, Flex } from 'ant-design-vue';
|
|
|
|
|
|
import { useVbenForm } from '#/adapter/form';
|
|
|
|
|
|
-const props = reactive({
|
|
|
+const tippyProps = reactive<TippyProps>({
|
|
|
animation: 'shift-away',
|
|
|
arrow: true,
|
|
|
content: '这是一个提示',
|
|
|
- delay: 200,
|
|
|
+ delay: [200, 200],
|
|
|
duration: 200,
|
|
|
- followCursor: '',
|
|
|
- hideOnClick: '',
|
|
|
+ followCursor: false,
|
|
|
+ hideOnClick: false,
|
|
|
+ inertia: true,
|
|
|
maxWidth: 'none',
|
|
|
placement: 'top',
|
|
|
theme: 'dark',
|
|
|
+ trigger: 'mouseenter focusin',
|
|
|
});
|
|
|
|
|
|
-const tippyProps = computed(() => {
|
|
|
- return {
|
|
|
- ...props,
|
|
|
- followCursor: ['', 'true'].includes(props.followCursor)
|
|
|
- ? !!props.followCursor
|
|
|
- : props.followCursor,
|
|
|
- hideOnClick: ['', 'true'].includes(props.hideOnClick)
|
|
|
- ? !!props.hideOnClick
|
|
|
- : props.hideOnClick,
|
|
|
- };
|
|
|
-});
|
|
|
+function parseBoolean(value: string) {
|
|
|
+ switch (value) {
|
|
|
+ case 'false': {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ case 'true': {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ default: {
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
const [Form] = useVbenForm({
|
|
|
handleValuesChange(values) {
|
|
|
- Object.assign(props, { ...values });
|
|
|
+ Object.assign(tippyProps, {
|
|
|
+ ...values,
|
|
|
+ delay: [values.delay1, values.delay2],
|
|
|
+ followCursor: parseBoolean(values.followCursor),
|
|
|
+ hideOnClick: parseBoolean(values.hideOnClick),
|
|
|
+ trigger: values.trigger.join(' '),
|
|
|
+ });
|
|
|
},
|
|
|
schema: [
|
|
|
+ {
|
|
|
+ component: 'RadioGroup',
|
|
|
+ componentProps: {
|
|
|
+ buttonStyle: 'solid',
|
|
|
+ class: 'w-full',
|
|
|
+ options: [
|
|
|
+ { label: '自动', value: 'auto' },
|
|
|
+ { label: '暗色', value: 'dark' },
|
|
|
+ { label: '亮色', value: 'light' },
|
|
|
+ ],
|
|
|
+ optionType: 'button',
|
|
|
+ },
|
|
|
+ defaultValue: tippyProps.theme,
|
|
|
+ fieldName: 'theme',
|
|
|
+ label: '主题',
|
|
|
+ },
|
|
|
{
|
|
|
component: 'Select',
|
|
|
componentProps: {
|
|
|
class: 'w-full',
|
|
|
options: [
|
|
|
- { label: 'shift-away', value: 'shift-away' },
|
|
|
- { label: 'scale', value: 'scale' },
|
|
|
- { label: 'scale-extreme', value: 'scale-extreme' },
|
|
|
- { label: 'scale-subtle', value: 'scale-subtle' },
|
|
|
- { label: 'perspective', value: 'perspective' },
|
|
|
- { label: 'fade', value: 'fade' },
|
|
|
+ { label: '向上滑入', value: 'shift-away' },
|
|
|
+ { label: '向下滑入', value: 'shift-toward' },
|
|
|
+ { label: '缩放', value: 'scale' },
|
|
|
+ { label: '透视', value: 'perspective' },
|
|
|
+ { label: '淡入', value: 'fade' },
|
|
|
],
|
|
|
},
|
|
|
- defaultValue: props.animation,
|
|
|
+ defaultValue: tippyProps.animation,
|
|
|
fieldName: 'animation',
|
|
|
- label: '动画',
|
|
|
+ label: '动画类型',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ component: 'RadioGroup',
|
|
|
+ componentProps: {
|
|
|
+ buttonStyle: 'solid',
|
|
|
+ options: [
|
|
|
+ { label: '是', value: true },
|
|
|
+ { label: '否', value: false },
|
|
|
+ ],
|
|
|
+ optionType: 'button',
|
|
|
+ },
|
|
|
+ defaultValue: tippyProps.inertia,
|
|
|
+ fieldName: 'inertia',
|
|
|
+ label: '动画惯性',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ component: 'Select',
|
|
|
+ componentProps: {
|
|
|
+ class: 'w-full',
|
|
|
+ options: [
|
|
|
+ { label: '顶部', value: 'top' },
|
|
|
+ { label: '顶左', value: 'top-start' },
|
|
|
+ { label: '顶右', value: 'top-end' },
|
|
|
+ { label: '底部', value: 'bottom' },
|
|
|
+ { label: '底左', value: 'bottom-start' },
|
|
|
+ { label: '底右', value: 'bottom-end' },
|
|
|
+ { label: '左侧', value: 'left' },
|
|
|
+ { label: '左上', value: 'left-start' },
|
|
|
+ { label: '左下', value: 'left-end' },
|
|
|
+ { label: '右侧', value: 'right' },
|
|
|
+ { label: '右上', value: 'right-start' },
|
|
|
+ { label: '右下', value: 'right-end' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ defaultValue: tippyProps.placement,
|
|
|
+ fieldName: 'placement',
|
|
|
+ label: '位置',
|
|
|
},
|
|
|
{
|
|
|
component: 'InputNumber',
|
|
|
- defaultValue: props.duration,
|
|
|
+ componentProps: {
|
|
|
+ addonAfter: '毫秒',
|
|
|
+ },
|
|
|
+ defaultValue: tippyProps.duration,
|
|
|
fieldName: 'duration',
|
|
|
label: '动画时长',
|
|
|
},
|
|
|
+ {
|
|
|
+ component: 'InputNumber',
|
|
|
+ componentProps: {
|
|
|
+ addonAfter: '毫秒',
|
|
|
+ },
|
|
|
+ defaultValue: 100,
|
|
|
+ fieldName: 'delay1',
|
|
|
+ label: '显示延时',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ component: 'InputNumber',
|
|
|
+ componentProps: {
|
|
|
+ addonAfter: '毫秒',
|
|
|
+ },
|
|
|
+ defaultValue: 100,
|
|
|
+ fieldName: 'delay2',
|
|
|
+ label: '隐藏延时',
|
|
|
+ },
|
|
|
{
|
|
|
component: 'Input',
|
|
|
- defaultValue: props.content,
|
|
|
+ defaultValue: tippyProps.content,
|
|
|
fieldName: 'content',
|
|
|
label: '内容',
|
|
|
},
|
|
|
{
|
|
|
- component: 'Switch',
|
|
|
- defaultValue: props.arrow,
|
|
|
+ component: 'RadioGroup',
|
|
|
+ componentProps: {
|
|
|
+ buttonStyle: 'solid',
|
|
|
+ options: [
|
|
|
+ { label: '是', value: true },
|
|
|
+ { label: '否', value: false },
|
|
|
+ ],
|
|
|
+ optionType: 'button',
|
|
|
+ },
|
|
|
+ defaultValue: tippyProps.arrow,
|
|
|
fieldName: 'arrow',
|
|
|
- label: '箭头',
|
|
|
+ label: '指示箭头',
|
|
|
},
|
|
|
{
|
|
|
component: 'Select',
|
|
|
componentProps: {
|
|
|
class: 'w-full',
|
|
|
options: [
|
|
|
- { label: '不跟随', value: '' },
|
|
|
+ { label: '不跟随', value: 'false' },
|
|
|
{ label: '完全跟随', value: 'true' },
|
|
|
{ label: '仅横向', value: 'horizontal' },
|
|
|
{ label: '仅纵向', value: 'vertical' },
|
|
|
{ label: '仅初始', value: 'initial' },
|
|
|
],
|
|
|
},
|
|
|
- defaultValue: props.followCursor,
|
|
|
+ defaultValue: tippyProps.followCursor?.toString(),
|
|
|
fieldName: 'followCursor',
|
|
|
label: '跟随指针',
|
|
|
},
|
|
@@ -92,69 +185,53 @@ const [Form] = useVbenForm({
|
|
|
component: 'Select',
|
|
|
componentProps: {
|
|
|
class: 'w-full',
|
|
|
+ mode: 'multiple',
|
|
|
options: [
|
|
|
- { label: '否', value: '' },
|
|
|
- { label: '是', value: 'true' },
|
|
|
- { label: '仅内部点击', value: 'toggle' },
|
|
|
+ { label: '鼠标移入', value: 'mouseenter' },
|
|
|
+ { label: '被点击', value: 'click' },
|
|
|
+ { label: '获得焦点', value: 'focusin' },
|
|
|
+ { label: '无触发,仅手动', value: 'manual' },
|
|
|
],
|
|
|
},
|
|
|
- defaultValue: props.hideOnClick,
|
|
|
- fieldName: 'hideOnClick',
|
|
|
- label: '点击后隐藏',
|
|
|
- },
|
|
|
- {
|
|
|
- component: 'InputNumber',
|
|
|
- defaultValue: 100,
|
|
|
- fieldName: 'delay',
|
|
|
- label: '延时',
|
|
|
+ defaultValue: tippyProps.trigger?.split(' '),
|
|
|
+ fieldName: 'trigger',
|
|
|
+ label: '触发方式',
|
|
|
},
|
|
|
-
|
|
|
{
|
|
|
- component: 'RadioGroup',
|
|
|
+ component: 'Select',
|
|
|
componentProps: {
|
|
|
+ class: 'w-full',
|
|
|
options: [
|
|
|
- { label: 'auto', value: 'auto' },
|
|
|
- { label: 'dark', value: 'dark' },
|
|
|
- { label: 'light', value: 'light' },
|
|
|
+ { label: '否', value: 'false' },
|
|
|
+ { label: '是', value: 'true' },
|
|
|
+ { label: '仅内部', value: 'toggle' },
|
|
|
],
|
|
|
},
|
|
|
- defaultValue: props.theme,
|
|
|
- fieldName: 'theme',
|
|
|
- label: '主题',
|
|
|
+ defaultValue: tippyProps.hideOnClick?.toString(),
|
|
|
+ dependencies: {
|
|
|
+ componentProps(_, formAction) {
|
|
|
+ return {
|
|
|
+ disabled: !formAction.values.trigger.includes('click'),
|
|
|
+ };
|
|
|
+ },
|
|
|
+ triggerFields: ['trigger'],
|
|
|
+ },
|
|
|
+ fieldName: 'hideOnClick',
|
|
|
+ help: '只有在触发方式为`click`时才有效',
|
|
|
+ label: '点击后隐藏',
|
|
|
},
|
|
|
{
|
|
|
component: 'Input',
|
|
|
componentProps: {
|
|
|
+ allowClear: true,
|
|
|
placeholder: 'none、200px',
|
|
|
},
|
|
|
- defaultValue: props.maxWidth,
|
|
|
+ defaultValue: tippyProps.maxWidth,
|
|
|
fieldName: 'maxWidth',
|
|
|
label: '最大宽度',
|
|
|
},
|
|
|
- {
|
|
|
- component: 'Select',
|
|
|
- componentProps: {
|
|
|
- class: 'w-full',
|
|
|
- options: [
|
|
|
- { label: '顶部', value: 'top' },
|
|
|
- { label: '顶左', value: 'top-start' },
|
|
|
- { label: '顶右', value: 'top-end' },
|
|
|
- { label: '底部', value: 'bottom' },
|
|
|
- { label: '底左', value: 'bottom-start' },
|
|
|
- { label: '底右', value: 'bottom-end' },
|
|
|
- { label: '左侧', value: 'left' },
|
|
|
- { label: '左上', value: 'left-start' },
|
|
|
- { label: '左下', value: 'left-end' },
|
|
|
- { label: '右侧', value: 'right' },
|
|
|
- { label: '右上', value: 'right-start' },
|
|
|
- { label: '右下', value: 'right-end' },
|
|
|
- ],
|
|
|
- },
|
|
|
- defaultValue: 'top',
|
|
|
- fieldName: 'placement',
|
|
|
- label: '位置',
|
|
|
- },
|
|
|
],
|
|
|
+ showDefaultActions: false,
|
|
|
wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',
|
|
|
});
|
|
|
|