mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-24 20:24:05 -08:00
refactor(editor): Convert Tooltip to composition api (#10701)
This commit is contained in:
parent
56ebeed880
commit
6ecf84ffe8
|
@ -17,9 +17,3 @@ const Template: StoryFn = (args, { argTypes }) => ({
|
||||||
});
|
});
|
||||||
|
|
||||||
export const Note = Template.bind({});
|
export const Note = Template.bind({});
|
||||||
|
|
||||||
export const Tooltip = Template.bind({});
|
|
||||||
Tooltip.args = {
|
|
||||||
type: 'tooltip',
|
|
||||||
tooltipPlacement: 'right',
|
|
||||||
};
|
|
||||||
|
|
|
@ -2,14 +2,11 @@
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import type { Placement } from 'element-plus';
|
import type { Placement } from 'element-plus';
|
||||||
import N8nIcon from '../N8nIcon';
|
import N8nIcon from '../N8nIcon';
|
||||||
import N8nTooltip from '../N8nTooltip';
|
|
||||||
|
|
||||||
const THEME = ['info', 'info-light', 'warning', 'danger', 'success'] as const;
|
const THEME = ['info', 'info-light', 'warning', 'danger', 'success'] as const;
|
||||||
const TYPE = ['note', 'tooltip'] as const;
|
|
||||||
|
|
||||||
interface InfoTipProps {
|
interface InfoTipProps {
|
||||||
theme?: (typeof THEME)[number];
|
theme?: (typeof THEME)[number];
|
||||||
type?: (typeof TYPE)[number];
|
|
||||||
bold?: boolean;
|
bold?: boolean;
|
||||||
tooltipPlacement?: Placement;
|
tooltipPlacement?: Placement;
|
||||||
}
|
}
|
||||||
|
@ -17,7 +14,6 @@ interface InfoTipProps {
|
||||||
defineOptions({ name: 'N8nInfoTip' });
|
defineOptions({ name: 'N8nInfoTip' });
|
||||||
const props = withDefaults(defineProps<InfoTipProps>(), {
|
const props = withDefaults(defineProps<InfoTipProps>(), {
|
||||||
theme: 'info',
|
theme: 'info',
|
||||||
type: 'note',
|
|
||||||
bold: true,
|
bold: true,
|
||||||
tooltipPlacement: 'top',
|
tooltipPlacement: 'top',
|
||||||
});
|
});
|
||||||
|
@ -62,28 +58,13 @@ const iconData = computed((): { icon: string; color: string } => {
|
||||||
<div
|
<div
|
||||||
:class="{
|
:class="{
|
||||||
'n8n-info-tip': true,
|
'n8n-info-tip': true,
|
||||||
|
[$style.note]: true,
|
||||||
[$style.infoTip]: true,
|
[$style.infoTip]: true,
|
||||||
[$style[theme]]: true,
|
[$style[theme]]: true,
|
||||||
[$style[type]]: true,
|
|
||||||
[$style.bold]: bold,
|
[$style.bold]: bold,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<N8nTooltip
|
<span :class="$style.iconText">
|
||||||
v-if="type === 'tooltip'"
|
|
||||||
:placement="tooltipPlacement"
|
|
||||||
:popper-class="$style.tooltipPopper"
|
|
||||||
:disabled="type !== 'tooltip'"
|
|
||||||
>
|
|
||||||
<span :class="$style.iconText" :style="{ color: iconData.color }">
|
|
||||||
<N8nIcon :icon="iconData.icon" />
|
|
||||||
</span>
|
|
||||||
<template #content>
|
|
||||||
<span>
|
|
||||||
<slot />
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
</N8nTooltip>
|
|
||||||
<span v-else :class="$style.iconText">
|
|
||||||
<N8nIcon :icon="iconData.icon" />
|
<N8nIcon :icon="iconData.icon" />
|
||||||
<span>
|
<span>
|
||||||
<slot />
|
<slot />
|
||||||
|
@ -121,11 +102,6 @@ const iconData = computed((): { icon: string; color: string } => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tooltipPopper {
|
|
||||||
composes: base;
|
|
||||||
display: inline-flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.iconText {
|
.iconText {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
|
|
|
@ -16,17 +16,4 @@ describe('N8nInfoTip', () => {
|
||||||
});
|
});
|
||||||
expect(wrapper.html()).toMatchSnapshot();
|
expect(wrapper.html()).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render correctly as tooltip', () => {
|
|
||||||
const wrapper = render(N8nInfoTip, {
|
|
||||||
slots,
|
|
||||||
props: {
|
|
||||||
type: 'tooltip',
|
|
||||||
},
|
|
||||||
global: {
|
|
||||||
stubs,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
expect(wrapper.html()).toMatchSnapshot();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,9 +1,3 @@
|
||||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||||
|
|
||||||
exports[`N8nInfoTip > should render correctly as note 1`] = `"<div class="n8n-info-tip infoTip info note bold"><span class="iconText"><span class="n8n-text compact size-medium regular n8n-icon n8n-icon"><!----></span><span>Need help doing something?<a href="/docs" target="_blank">Open docs</a></span></span></div>"`;
|
exports[`N8nInfoTip > should render correctly as note 1`] = `"<div class="n8n-info-tip note infoTip info bold"><span class="iconText"><span class="n8n-text compact size-medium regular n8n-icon n8n-icon"><!----></span><span>Need help doing something?<a href="/docs" target="_blank">Open docs</a></span></span></div>"`;
|
||||||
|
|
||||||
exports[`N8nInfoTip > should render correctly as tooltip 1`] = `
|
|
||||||
"<div class="n8n-info-tip infoTip info tooltip bold">
|
|
||||||
<n8n-tooltip-stub popperclass="tooltipPopper" role="tooltip" showafter="0" hideafter="200" autoclose="0" boundariespadding="0" gpuacceleration="true" offset="12" placement="top" popperoptions="[object Object]" strategy="absolute" effect="dark" enterable="true" pure="false" focusonshow="false" trapping="false" stoppoppermouseevent="true" virtualtriggering="false" content="" rawcontent="false" persistent="false" teleported="true" disabled="false" open="false" trigger="hover" triggerkeys="Enter,Space" arrowoffset="5" showarrow="true" justifybuttons="flex-end" buttons="" class=""></n8n-tooltip-stub>
|
|
||||||
</div>"
|
|
||||||
`;
|
|
||||||
|
|
|
@ -1,62 +1,56 @@
|
||||||
<script lang="ts">
|
<script setup lang="ts">
|
||||||
import type { PropType } from 'vue';
|
import type { PropType } from 'vue';
|
||||||
import { defineComponent } from 'vue';
|
|
||||||
import { ElTooltip } from 'element-plus';
|
import { ElTooltip } from 'element-plus';
|
||||||
import type { IN8nButton } from 'n8n-design-system/types';
|
import type { IN8nButton } from 'n8n-design-system/types';
|
||||||
import N8nButton from '../N8nButton';
|
import N8nButton from '../N8nButton';
|
||||||
|
|
||||||
export default defineComponent({
|
export type Justify =
|
||||||
name: 'N8nTooltip',
|
| 'flex-start'
|
||||||
components: {
|
| 'flex-end'
|
||||||
ElTooltip,
|
| 'start'
|
||||||
N8nButton,
|
| 'end'
|
||||||
|
| 'left'
|
||||||
|
| 'right'
|
||||||
|
| 'center'
|
||||||
|
| 'space-between'
|
||||||
|
| 'space-around'
|
||||||
|
| 'space-evenly';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
...ElTooltip.props,
|
||||||
|
content: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
},
|
},
|
||||||
|
justifyButtons: {
|
||||||
|
type: String as PropType<Justify>,
|
||||||
|
default: 'flex-end',
|
||||||
|
},
|
||||||
|
buttons: {
|
||||||
|
type: Array as PropType<IN8nButton[]>,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
inheritAttrs: false,
|
inheritAttrs: false,
|
||||||
props: {
|
|
||||||
...ElTooltip.props,
|
|
||||||
content: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
},
|
|
||||||
justifyButtons: {
|
|
||||||
type: String,
|
|
||||||
default: 'flex-end',
|
|
||||||
validator: (value: string): boolean =>
|
|
||||||
[
|
|
||||||
'flex-start',
|
|
||||||
'flex-end',
|
|
||||||
'start',
|
|
||||||
'end',
|
|
||||||
'left',
|
|
||||||
'right',
|
|
||||||
'center',
|
|
||||||
'space-between',
|
|
||||||
'space-around',
|
|
||||||
'space-evenly',
|
|
||||||
].includes(value),
|
|
||||||
},
|
|
||||||
buttons: {
|
|
||||||
type: Array as PropType<IN8nButton[]>,
|
|
||||||
default: () => [],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<ElTooltip v-bind="{ ...$props, ...$attrs }" :popper-class="$props.popperClass ?? 'n8n-tooltip'">
|
<ElTooltip v-bind="{ ...props, ...$attrs }" :popper-class="props.popperClass ?? 'n8n-tooltip'">
|
||||||
<slot />
|
<slot />
|
||||||
<template #content>
|
<template #content>
|
||||||
<slot name="content">
|
<slot name="content">
|
||||||
<div v-html="content"></div>
|
<div v-html="props.content"></div>
|
||||||
</slot>
|
</slot>
|
||||||
<div
|
<div
|
||||||
v-if="buttons.length"
|
v-if="props.buttons.length"
|
||||||
:class="$style.buttons"
|
:class="$style.buttons"
|
||||||
:style="{ justifyContent: justifyButtons }"
|
:style="{ justifyContent: props.justifyButtons }"
|
||||||
>
|
>
|
||||||
<N8nButton
|
<N8nButton
|
||||||
v-for="button in buttons"
|
v-for="button in props.buttons"
|
||||||
:key="button.attrs.label"
|
:key="button.attrs.label"
|
||||||
v-bind="{ ...button.attrs, ...button.listeners }"
|
v-bind="{ ...button.attrs, ...button.listeners }"
|
||||||
/>
|
/>
|
||||||
|
|
Loading…
Reference in a new issue