From 4ee1c8b078d6f10ed004c40bec4c01b7dc12384c Mon Sep 17 00:00:00 2001 From: bastarder Date: Fri, 24 Jul 2020 15:34:03 +0800 Subject: [PATCH] feat: add tag component --- packages/element-plus/index.ts | 4 +- packages/tag/__tests__/tag.spec.ts | 85 ++++++++++++++++++++++++++++ packages/tag/doc/basic.vue | 48 ++++++++++++++++ packages/tag/doc/index.stories.ts | 5 ++ packages/tag/index.ts | 5 ++ packages/tag/package.json | 13 +++++ packages/tag/src/index.vue | 89 ++++++++++++++++++++++++++++++ src/App.vue | 3 +- src/component.ts | 4 +- src/router.ts | 5 ++ 10 files changed, 258 insertions(+), 3 deletions(-) create mode 100644 packages/tag/__tests__/tag.spec.ts create mode 100644 packages/tag/doc/basic.vue create mode 100644 packages/tag/doc/index.stories.ts create mode 100644 packages/tag/index.ts create mode 100644 packages/tag/package.json create mode 100644 packages/tag/src/index.vue diff --git a/packages/element-plus/index.ts b/packages/element-plus/index.ts index 2cd9fb24ec..7784395ea6 100644 --- a/packages/element-plus/index.ts +++ b/packages/element-plus/index.ts @@ -1,12 +1,14 @@ import type { App } from 'vue' import ElButton from '@element-plus/button' import ElBadge from '@element-plus/badge' +import ElTag from '@element-plus/tag' export { - ElButton, ElBadge, + ElButton, ElBadge, ElTag } export default function install(app: App) { ElButton(app) ElBadge(app) + ElTag(app) } diff --git a/packages/tag/__tests__/tag.spec.ts b/packages/tag/__tests__/tag.spec.ts new file mode 100644 index 0000000000..1bf64b4220 --- /dev/null +++ b/packages/tag/__tests__/tag.spec.ts @@ -0,0 +1,85 @@ +import {mount} from '@vue/test-utils' +import Tag from '../src/index.vue' + +const AXIOM = 'Rem is the best girl' + +describe('Tag.vue', () => { + test('render text & class', () => { + const instance = mount(Tag, { + slots: { + default: AXIOM + }, + }) + expect(instance.text()).toEqual(AXIOM) + + const vm = instance.vm; + + expect(vm.$el.classList.contains('el-tag')).toEqual(true); + expect(vm.$el.classList.contains('el-tag__close')).toEqual(false); + expect(vm.$el.classList.contains('is-hit')).toEqual(false); + expect(vm.$el.classList.contains('md-fade-center')).toEqual(false); + }) + + test('type', () => { + const instance = mount(Tag, { + props: { + type: 'primary' + }, + }) + const vm = instance.vm; + expect(vm.$el.classList.contains('el-tag--primary')).toEqual(true); + }) + + test('hit', () => { + const instance = mount(Tag, { + props: { + hit: true + }, + }) + const vm = instance.vm; + expect(vm.$el.classList.contains('is-hit')).toEqual(true); + }) + + test('closeable', () => { + const instance = mount(Tag, { + props: { + closable: true, + }, + }) + const closeBtn = instance.find('.el-tag .el-tag__close'); + expect(closeBtn.exists()).toBe(true); + }) + + test('closeTransition', () => { + const instance = mount(Tag, { + props: { + closeTransition: true, + }, + }) + const vm = instance.vm; + expect(vm.$el.classList.contains('md-fade-center')).toEqual(false); + }) + + test('color', () => { + const instance = mount(Tag, { + props: { + color: 'rgb(0, 0, 0)', + }, + }) + const vm = instance.vm; + expect(vm.$el.style.backgroundColor).toEqual('rgb(0, 0, 0)'); + }) + + test('theme', () => { + const instance = mount(Tag, { + props: { + effect: 'dark', + }, + }) + const vm = instance.vm; + const el = vm.$el; + expect(el.className.indexOf('el-tag--dark') > -1).toEqual(true); + expect(el.className.indexOf('el-tag--light') > -1).toEqual(false); + expect(el.className.indexOf('el-tag--plain') > -1).toEqual(false); + }) +}) \ No newline at end of file diff --git a/packages/tag/doc/basic.vue b/packages/tag/doc/basic.vue new file mode 100644 index 0000000000..b5007afe0c --- /dev/null +++ b/packages/tag/doc/basic.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/packages/tag/doc/index.stories.ts b/packages/tag/doc/index.stories.ts new file mode 100644 index 0000000000..3e4419ce50 --- /dev/null +++ b/packages/tag/doc/index.stories.ts @@ -0,0 +1,5 @@ +export { default as BasicUsage} from './basic.vue' + +export default { + title: 'Tag', +} \ No newline at end of file diff --git a/packages/tag/index.ts b/packages/tag/index.ts new file mode 100644 index 0000000000..a59dcab4c4 --- /dev/null +++ b/packages/tag/index.ts @@ -0,0 +1,5 @@ +import { App } from 'vue' +import Tag from './src/index.vue' +export default (app: App) => { + app.component(Tag.name, Tag) +} diff --git a/packages/tag/package.json b/packages/tag/package.json new file mode 100644 index 0000000000..41c6d67dd6 --- /dev/null +++ b/packages/tag/package.json @@ -0,0 +1,13 @@ +{ + "name": "@element-plus/tag", + "version": "0.0.0", + "main": "dist/index.js", + "license": "MIT", + "dependencies": { + "vue": "^3.0.0-rc.1" + }, + "devDependencies": { + "@vue/test-utils": "^2.0.0-beta.0" + } + } + \ No newline at end of file diff --git a/packages/tag/src/index.vue b/packages/tag/src/index.vue new file mode 100644 index 0000000000..250480a0b3 --- /dev/null +++ b/packages/tag/src/index.vue @@ -0,0 +1,89 @@ + + + diff --git a/src/App.vue b/src/App.vue index c7157bba29..cdeaebc629 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,7 +3,8 @@ diff --git a/src/component.ts b/src/component.ts index c5db9594b7..2b619307b4 100644 --- a/src/component.ts +++ b/src/component.ts @@ -1,4 +1,6 @@ import ButtonInstall from '@element-plus/button/index' +import TagInstall from '@element-plus/tag/index' export const installAll = (app) => { - ButtonInstall(app) + ButtonInstall(app); + TagInstall(app); } diff --git a/src/router.ts b/src/router.ts index 1814f513d0..8c81c6e96f 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,10 +1,15 @@ import { RouteRecordRaw, createRouter, createWebHistory } from "vue-router"; import Button from "@element-plus/button/doc/index.vue"; +import Tag from "@element-plus/tag/doc/index.vue"; const routes: Array = [ { path: "/button", component: Button + }, + { + path: "/tag", + component: Tag } ];