diff --git a/packages/devui-vue/devui/read-tip/__tests__/read-tip-template.spec.ts b/packages/devui-vue/devui/read-tip/__tests__/read-tip-template.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aaab9d604efaab4eb1e8d4bc6f9759a68318dc8f
--- /dev/null
+++ b/packages/devui-vue/devui/read-tip/__tests__/read-tip-template.spec.ts
@@ -0,0 +1,160 @@
+import { mount } from '@vue/test-utils';
+import { ReadTip, } from '../index';
+import { nextTick } from 'vue'
+import TipsTemplate from '../src/read-tip-template';
+
+
+describe('read-tip test', () => {
+
+ beforeEach(() => {
+ // create teleport target
+ const el = document.createElement('div')
+ el.id = 'readtip-target'
+ document.body.appendChild(el)
+ })
+
+ afterEach(() => {
+ // clean up
+ document.body.outerHTML = ''
+ })
+ it('read-tip init render', async () => {
+ // 基础用法
+
+ const defaultTemplateProps = {
+ position: 'top',
+ appendToBody: false,
+ selector: '#readtip-target',
+ title: 'Name: Jack',
+ content: 'This is Jack\'s profile',
+ }
+ const wrapper = mount(TipsTemplate, {
+ props: {
+ defaultTemplateProps
+ }
+ })
+
+ expect(document.querySelector(defaultTemplateProps.selector).innerHTML).toContain(defaultTemplateProps.title)
+
+ expect(document.querySelector(defaultTemplateProps.selector).innerHTML).toContain(defaultTemplateProps.content)
+
+
+ })
+
+ const position = ['top', 'left', 'right', 'bottom']
+
+ position.forEach(pos => {
+ it(`read-tip position ${pos}`, async () => {
+ // 基础用法
+
+ const defaultTemplateProps = {
+ position: pos,
+ appendToBody: false,
+ selector: '#readtip-target',
+ title: 'Name: Jack',
+ content: 'This is Jack\'s profile',
+ }
+ const wrapper = mount(TipsTemplate, {
+ props: {
+ defaultTemplateProps
+ }
+ })
+
+ expect(document.querySelector(defaultTemplateProps.selector).innerHTML).toContain('read-tip-container ' + defaultTemplateProps.position)
+
+ })
+ })
+
+ it('read-tip appendToBody = true', async () => {
+ // 基础用法
+
+ const defaultTemplateProps = {
+ position: 'top',
+ appendToBody: true,
+ selector: '#readtip-target',
+ title: 'Name: Jack',
+ content: 'This is Jack\'s profile',
+ }
+ const wrapper = mount(TipsTemplate, {
+ props: {
+ defaultTemplateProps
+ }
+ })
+
+ expect(document.querySelector(defaultTemplateProps.selector).innerHTML).toBe('')
+
+ expect(document.querySelector(defaultTemplateProps.selector).innerHTML).not.toContain(defaultTemplateProps.title)
+
+ expect(document.querySelector(defaultTemplateProps.selector).innerHTML).not.toContain(defaultTemplateProps.content)
+
+
+ })
+
+ it('read-tip contentTemplate', async () => {
+ // 基础用法
+
+ const defaultTemplateProps = {
+ position: 'top',
+ appendToBody: false,
+ selector: '#readtip-target',
+ contentTemplate: true
+ }
+ const wrapper = mount(TipsTemplate, {
+ props: {
+ defaultTemplateProps
+ },
+ slots: {
+ default: `
I am test
`
+ }
+ })
+
+ expect(document.querySelector(defaultTemplateProps.selector).innerHTML).toContain(' I am test
')
+
+
+ })
+
+ it('read-tip dataFn', async () => {
+ // 基础用法
+
+ const defaultTemplateProps = {
+ appendToBody: false,
+ selector: '#readtip-target',
+ dataFn: getDataFromDB,
+ key: 'GetData'
+ }
+ function getDataFromDB({ element, rule }) {
+ return { content: element.innerHTML, title: rule.key }
+ }
+ const wrapper = mount(TipsTemplate, {
+ props: {
+ defaultTemplateProps
+ },
+
+ })
+
+ expect(document.querySelector(defaultTemplateProps.selector).innerHTML).toContain('GetData')
+ })
+
+ it('read-tip overlayClassName', async () => {
+ // 基础用法
+ const defaultTemplateProps = {
+ appendToBody: false,
+ selector: '#readtip-target',
+ dataFn: getDataFromDB,
+ key: 'GetData',
+ overlayClassName: 'red'
+ }
+ function getDataFromDB({ element, rule }) {
+ return { content: element.innerHTML, title: rule.key }
+ }
+ const wrapper = mount(TipsTemplate, {
+ props: {
+ defaultTemplateProps
+ },
+
+ })
+
+ expect(document.querySelector(defaultTemplateProps.selector).innerHTML).toContain(defaultTemplateProps.overlayClassName)
+ })
+})
+
+
diff --git a/packages/devui-vue/devui/read-tip/__tests__/read-tip.spec.ts b/packages/devui-vue/devui/read-tip/__tests__/read-tip.spec.ts
index fae43c0e63a45a3f7dca07b4e5b4a02c22c6f84c..3b5e72e14d1c72908d542bc5257a92cc7c6bb8e6 100644
--- a/packages/devui-vue/devui/read-tip/__tests__/read-tip.spec.ts
+++ b/packages/devui-vue/devui/read-tip/__tests__/read-tip.spec.ts
@@ -1,8 +1,96 @@
import { mount } from '@vue/test-utils';
-import { ReadTip, ReadTipDirective } from '../index';
+import { ReadTip, } from '../index';
+import { nextTick } from 'vue'
+import Template from '../src/read-tip-template';
describe('read-tip test', () => {
+ beforeEach(() => {
+ // create teleport target
+ const el = document.createElement('div')
+ el.className = 'readtip-target'
+ document.body.appendChild(el)
+ })
+
+ afterEach(() => {
+ // clean up
+ document.body.outerHTML = ''
+ })
it('read-tip init render', async () => {
- // todo
+ // 基础用法
+ const readTipOptions = {
+ trigger: 'hover',
+ rules: {
+ trigger: 'click',
+ position: 'top',
+ appendToBody: false,
+ selector: '.readtip-target',
+ title: 'Name: Jack',
+ content: 'This is Jack\'s profile',
+ },
+ };
+ const wrapper = mount(ReadTip, {
+ props: {
+ readTipOptions
+ },
+ slots: {
+ default: `@Jack`
+ }
+ })
+
+ expect(wrapper.find('.readtip-target').classes()).toContain('readtip-target')
+
+ // dom元素被点击 template会进行展示
+ await wrapper.find('.readtip-target').trigger('click')
+ await nextTick()
+
+ let template = wrapper.findComponent(Template)
+
+ expect(template.exists()).toBe(true)
+ expect(wrapper.findAll('[data-test="todo"]')).toHaveLength(1)
+
+ // body元素被点击 template会消失
+ await document.body.click()
+ await nextTick()
+
+ template = wrapper.findComponent(Template)
+ expect(template.exists()).toBe(false)
+ expect(wrapper.findAll('[data-test="todo"]')).toHaveLength(1)
+ })
+
+ it('read-tip more show tip', async () => {
+ // 基础用法
+ const readTipOptions = {
+ trigger: 'hover',
+ rules: {
+ trigger: 'hover',
+ selector: '.readtip-target',
+ title: 'Name: Jack',
+ content: 'This is Jack\'s profile',
+ },
+ };
+ const wrapper = mount(ReadTip, {
+ props: {
+ readTipOptions
+ },
+ slots: {
+ default: `
+ @Jack
+ @Mary
+ `
+ }
+ })
+
+
+ // dom元素被移入 template会进行展示
+ await wrapper.find('.readtip-target').trigger('mouseover')
+
+ expect(wrapper.findAll('[data-test="todo"]')).toHaveLength(2)
+
+ // dom元素被移出 template会消失
+ await wrapper.find('.readtip-target').trigger('mouseout')
+ await nextTick()
+
+ expect(wrapper.findAll('[data-test="todo"]')).toHaveLength(2)
+
})
})
diff --git a/packages/devui-vue/devui/read-tip/index.ts b/packages/devui-vue/devui/read-tip/index.ts
index 877133f1a1784c41865e0a5ad339907190daa475..4ccae88c9e3e2ca7e7087dda6a48be9147312326 100644
--- a/packages/devui-vue/devui/read-tip/index.ts
+++ b/packages/devui-vue/devui/read-tip/index.ts
@@ -10,7 +10,7 @@ export { ReadTip, }
export default {
title: 'ReadTip 阅读提示',
category: '反馈',
- status: '50%', // TODO: 组件若开发完成则填入"已完成",并删除该注释
+ status: '已完成',
install(app: App): void {
app.use(ReadTip as any)
}
diff --git a/packages/devui-vue/devui/read-tip/src/read-tip-template.tsx b/packages/devui-vue/devui/read-tip/src/read-tip-template.tsx
index 10aa734e11b40c4fe63774d7ba26eadc84640930..ab725c8acbe0195eaab1793704ae4c684ebb7134 100644
--- a/packages/devui-vue/devui/read-tip/src/read-tip-template.tsx
+++ b/packages/devui-vue/devui/read-tip/src/read-tip-template.tsx
@@ -20,7 +20,8 @@ export default defineComponent({
const temp = ref(null);
onMounted(() => {
const domBounding = document.querySelector(query).getBoundingClientRect();
- const distance = 10;
+
+ const distance = 10;
let positionTop = 0;
let positionLeft = 0;
const targetDom = document.querySelector('.read-tip-container').getBoundingClientRect();
diff --git a/packages/devui-vue/devui/read-tip/src/read-tip.tsx b/packages/devui-vue/devui/read-tip/src/read-tip.tsx
index cc9ad63f87a30aaa9d97b4837c32130401dc047f..0ba6cce678e274ac1ce3ddc67a3139d3dbd71a85 100644
--- a/packages/devui-vue/devui/read-tip/src/read-tip.tsx
+++ b/packages/devui-vue/devui/read-tip/src/read-tip.tsx
@@ -19,7 +19,6 @@ export default defineComponent({
appendToBody: true,
rules: { selector: null },
};
- const tempTop = ref(0)
// 合并基础配置
const options = { ...defaultOptions, ...props.readTipOptions }
const defaultSlot = ref(null)
@@ -148,7 +147,7 @@ export default defineComponent({
{(refRules).map(rule => (
{rule.status && (
{
diff --git a/packages/devui-vue/docs/components/read-tip/index.md b/packages/devui-vue/docs/components/read-tip/index.md
index 19fe559bbae8aa1c908fd8e1b0cc7162dd4045ef..7742abd8a8b516baec60d12e0dc2f738b0713332 100644
--- a/packages/devui-vue/docs/components/read-tip/index.md
+++ b/packages/devui-vue/docs/components/read-tip/index.md
@@ -22,7 +22,6 @@