From 0b5ce422591167b81a2b6b99e21af72bb27f7a4e Mon Sep 17 00:00:00 2001
From: Dreamer <154239735@qq.com>
Date: Wed, 3 Nov 2021 00:04:37 +0800
Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=8D=95?=
=?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95=E5=B9=B6=E4=BF=AE=E6=94=B9=E5=B7=B2?=
=?UTF-8?q?=E7=9F=A5bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../__tests__/__snapshots__/card.spec.ts.snap | 39 ++++
.../time-picker/__tests__/time-picker.spec.ts | 200 +++++++++++++++++-
packages/devui-vue/devui/time-picker/index.ts | 2 +-
.../src/composables/use-time-picker.ts | 59 ++++--
.../devui/time-picker/src/time-picker.tsx | 6 +-
.../docs/components/time-picker/index.md | 46 +++-
6 files changed, 319 insertions(+), 33 deletions(-)
create mode 100644 packages/devui-vue/devui/card/__tests__/__snapshots__/card.spec.ts.snap
diff --git a/packages/devui-vue/devui/card/__tests__/__snapshots__/card.spec.ts.snap b/packages/devui-vue/devui/card/__tests__/__snapshots__/card.spec.ts.snap
new file mode 100644
index 00000000..76e8d750
--- /dev/null
+++ b/packages/devui-vue/devui/card/__tests__/__snapshots__/card.spec.ts.snap
@@ -0,0 +1,39 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`card should render correctly 1`] = `
+
+`;
diff --git a/packages/devui-vue/devui/time-picker/__tests__/time-picker.spec.ts b/packages/devui-vue/devui/time-picker/__tests__/time-picker.spec.ts
index 26f60722..865b5c9d 100644
--- a/packages/devui-vue/devui/time-picker/__tests__/time-picker.spec.ts
+++ b/packages/devui-vue/devui/time-picker/__tests__/time-picker.spec.ts
@@ -1,8 +1,204 @@
import { mount } from '@vue/test-utils';
-import { TimePicker } from '../index';
+import DTimePicker from '../src/time-picker';
+import { nextTick, ref } from 'vue';
describe('time-picker test', () => {
it('time-picker init render', async () => {
- // todo
+
+ const wrapper = mount({
+ components: { DTimePicker },
+ template: ``,
+
+ setup() {
+ return
+ }
+ });
+
+ const container = wrapper.find('.devui-time-picker');
+ const timeUl = wrapper.findAll('.time-ul')
+ await nextTick()
+ expect(timeUl[0].element.childElementCount).toBe(24)
+ expect(timeUl[1].element.childElementCount).toBe(60)
+ expect(timeUl[2].element.childElementCount).toBe(60)
+ expect(container.classes()).toContain('devui-time-picker')
+ })
+
+ it('time-picker default open work', async () => {
+
+ const wrapper = mount({
+ components: { DTimePicker },
+ template: ``,
+ setup() {
+
+ const vModelValue = ref('12:30:40')
+ const autoOpen = ref(true)
+
+ return {
+ vModelValue,
+ autoOpen
+ }
+ }
+ });
+
+ const timeInput = wrapper.find('.time-input')
+ const tiemPopup = wrapper.find('.devui-time-popup')
+
+ await nextTick()
+ expect(timeInput.element.value).toBe('12:30:40')
+ expect(tiemPopup.classes()).toContain('devui-show-time-popup')
+ expect(tiemPopup.attributes('style')).toMatch('width: 300px');
+
+ });
+
+ it('time-picker disabled work', async () => {
+ const wrapper = mount(DTimePicker, {
+ props: {
+ disabled: true,
+ },
+ });
+
+ expect(wrapper.find('.devui-time-picker').classes()).toContain('picker-disabled')
+ expect(wrapper.find('.time-input').element.disabled).toBe(true)
+ })
+
+ it('time-picker min-time work', async () => {
+ const wrapper = mount({
+ components: { DTimePicker },
+ template: ``,
+ setup() {
+ const vModelValue = ref('01:03:00')
+ return {
+ vModelValue
+ }
+ }
+ })
+
+ const timeInput = wrapper.find('.time-input')
+ await nextTick()
+ // 如果 v-mode 的时间超出 限制范围,将返回最小时间值
+ expect(timeInput.element.value).toBe('01:04:30')
+ })
+
+ it('time-picker max-time work', async () => {
+ const wrapper = mount({
+ components: { DTimePicker },
+ template: ``,
+ setup() {
+ const vModelValue = ref('23:30:00')
+ return {
+ vModelValue
+ }
+ }
+ })
+
+ const timeInput = wrapper.find('.time-input')
+ await nextTick()
+ expect(timeInput.element.value).toBe('22:46:20')
+ })
+
+ it('time-picker format mm:HH:ss work', async () => {
+ const wrapper = mount({
+ components: { DTimePicker },
+ template: ``,
+ setup() {
+ const vModelValue = ref('23:30:00')
+ return {
+ vModelValue
+ }
+ }
+ })
+
+ const timeInput = wrapper.find('.time-input')
+ await nextTick()
+ expect(timeInput.element.value).toBe('30:23:00')
+ })
+
+ it('time-picker format mm:ss work', async () => {
+ const wrapper = mount({
+ components: { DTimePicker },
+ template: ``,
+ setup() {
+ const vModelValue = ref('23:30:00')
+ return {
+ vModelValue
+ }
+ }
+ })
+
+ const timeInput = wrapper.find('.time-input')
+ await nextTick()
+ expect(timeInput.element.value).toBe('30:00')
+ })
+
+ it('time-picker format hh:mm work', async () => {
+ const wrapper = mount({
+ components: { DTimePicker },
+ template: ``,
+ setup() {
+ const vModelValue = ref('23:30:00')
+ return {
+ vModelValue
+ }
+ }
+ })
+
+ const timeInput = wrapper.find('.time-input')
+ await nextTick()
+ expect(timeInput.element.value).toBe('23:30')
+ })
+
+ it('time-picker slot customViewTemplate work', async () => {
+
+ const slotDemo = ref()
+
+ const chooseTime = () => {
+ const timeObj = {
+ time: '21',
+ type: 'mm'
+ }
+ slotDemo.value.chooseTime(timeObj)
+ }
+ // 插槽内方法 -- 选择当前时间
+ const chooseNowFun = () => {
+ const date = new Date()
+ const hour = date.getHours() > 9 ? date.getHours() : '0' + date.getHours()
+ const minute = date.getMinutes() > 9 ? date.getMinutes() : '0' + date.getMinutes()
+ const second = date.getSeconds() > 9 ? date.getSeconds() : '0' + date.getSeconds()
+ const timeObj = {
+ time: hour + ':' + minute + ':' + second
+ }
+ slotDemo.value.chooseTime(timeObj)
+
+ return timeObj.time
+ }
+
+ const wrapper = mount({
+ components: { DTimePicker },
+ template: `
+
+
+
+
choose now
+
choose 23:00
+
+
+ `,
+ setup() {
+ return {
+ chooseNowFun,
+ chooseTime,
+ slotDemo
+ }
+ }
+ })
+
+ const timeInput = wrapper.find('.time-input')
+ const slotBottomNow = wrapper.find('.slot-bottom-now')
+ const slotBottomOne = wrapper.find('.slot-bottom-one')
+ await slotBottomNow.trigger('click')
+ expect(timeInput.element.value).toBe(chooseNowFun())
+
+ await slotBottomOne.trigger('click')
+ expect(timeInput.element.value).toMatch(/21/)
})
})
diff --git a/packages/devui-vue/devui/time-picker/index.ts b/packages/devui-vue/devui/time-picker/index.ts
index 75357625..e61fb3e2 100644
--- a/packages/devui-vue/devui/time-picker/index.ts
+++ b/packages/devui-vue/devui/time-picker/index.ts
@@ -10,7 +10,7 @@ export { TimePicker }
export default {
title: 'TimePicker 时间选择器',
category: '数据录入',
- status: '80%', // TODO: 组件若开发完成则填入"已完成",并删除该注释
+ status: '已完成', // TODO: 组件若开发完成则填入"已完成",并删除该注释
install(app: App): void {
app.use(TimePicker as any)
}
diff --git a/packages/devui-vue/devui/time-picker/src/composables/use-time-picker.ts b/packages/devui-vue/devui/time-picker/src/composables/use-time-picker.ts
index f80fdedb..9b2f58b9 100644
--- a/packages/devui-vue/devui/time-picker/src/composables/use-time-picker.ts
+++ b/packages/devui-vue/devui/time-picker/src/composables/use-time-picker.ts
@@ -3,7 +3,7 @@ import { TimeObj } from '../types'
import { getPositionFun } from '../utils'
export default function useTimePicker(
- hh:Ref,mm:Ref,ss:Ref,minTime:string,format:string,
+ hh:Ref,mm:Ref,ss:Ref,minTime:string,maxTime:string,format:string,
autoOpen:boolean,disabled:boolean,value:string
):any{
const isActive = ref(false)
@@ -37,19 +37,42 @@ export default function useTimePicker(
const mouseInIputFun = ()=>{
if(firsthandActiveTime.value == '00:00:00'){
+ const vModelValueArr = vModeValue.value.split(':')
+ const minTimeValueArr = minTime.split(':')
+
vModeValue.value == ''
? vModeValue.value = '00:00:00'
: ''
-
- vModeValue.value > minTime
- ? firsthandActiveTime.value = vModeValue.value
- : firsthandActiveTime.value = minTime
+
+ if( vModeValue.value > minTime ){
+ firsthandActiveTime.value = vModeValue.value
+ setInputValue(vModelValueArr[0],vModelValueArr[1],vModelValueArr[2])
+ }else{
+ firsthandActiveTime.value = minTime
+ setInputValue(minTimeValueArr[0],minTimeValueArr[1],minTimeValueArr[2])
+ }
}
- setInputValue()
+
isActive.value = true
showPopup.value = true
}
+ /**
+ * 判断v-model 绑定的时间是否超出 最大值 最小值 范围
+ * 如果带有格式化 , 将执行格式化
+ * */
+ const vModelIsBeyond = ()=>{
+ if(vModeValue.value != '' && vModeValue.value < minTime){
+ vModeValue.value = minTime
+ }else if( vModeValue.value != '' && vModeValue.value > maxTime ){
+ vModeValue.value = maxTime
+ }
+
+ const vModelValueArr = vModeValue.value.split(':')
+ vModeValue.value && setInputValue(vModelValueArr[0],vModelValueArr[1],vModelValueArr[2])
+ }
+
+
const getTimeValue = (e:MouseEvent)=>{
e.stopPropagation()
if(showPopup.value){
@@ -57,19 +80,19 @@ export default function useTimePicker(
mm.value = timePopupDom.value.changTimeData().activeMinute.value
ss.value = timePopupDom.value.changTimeData().activeSecond.value
firsthandActiveTime.value = `${hh.value}:${mm.value}:${ss.value}`
- setInputValue()
+ setInputValue(hh.value,mm.value,ss.value)
}
}
- const setInputValue = ()=> {
+ const setInputValue = (hh:string,mm:string,ss:string)=> {
if(format == 'hh:mm:ss'){
- vModeValue.value = `${hh.value}:${mm.value}:${ss.value}`
+ vModeValue.value = `${hh}:${mm}:${ss}`
}else if(format == 'mm:hh:ss'){
- vModeValue.value = `${mm.value}:${hh.value}:${ss.value}`
+ vModeValue.value = `${mm}:${hh}:${ss}`
}else if(format == 'hh:mm'){
- vModeValue.value = `${hh.value}:${mm.value}`
+ vModeValue.value = `${hh}:${mm}`
}else if(format == 'mm:ss'){
- vModeValue.value = `${mm.value}:${ss.value}`
+ vModeValue.value = `${mm}:${ss}`
}
}
@@ -88,7 +111,7 @@ export default function useTimePicker(
ss.value = '00'
}
firsthandActiveTime.value = `${hh.value}:${mm.value}:${ss.value}`
- setInputValue()
+ setInputValue(hh.value,mm.value,ss.value)
}
const isOutOpen =()=>{
@@ -100,7 +123,9 @@ export default function useTimePicker(
ss.value = timeArr[2]
firsthandActiveTime.value = vModeValue.value
- setInputValue()
+
+ setInputValue(hh.value,mm.value,ss.value)
+
isActive.value = true
showPopup.value = autoOpen
}
@@ -117,14 +142,14 @@ export default function useTimePicker(
ss.value = slotTime.time
}
firsthandActiveTime.value = `${hh.value}:${mm.value}:${ss.value}`
- setInputValue()
+ setInputValue(hh.value,mm.value,ss.value)
} else {
const timeArr = slotTime.time.split(':')
hh.value = timeArr[0]
mm.value = timeArr[1]
ss.value = timeArr[2]
firsthandActiveTime.value = `${hh.value}:${mm.value}:${ss.value}`
- setInputValue()
+ setInputValue(hh.value,mm.value,ss.value)
}
}
@@ -140,10 +165,10 @@ export default function useTimePicker(
firsthandActiveTime,
vModeValue,
getPopupPosition,
- setInputValue,
getTimeValue,
clickVerifyFun,
isOutOpen,
+ vModelIsBeyond,
clearAll,
chooseTime
}
diff --git a/packages/devui-vue/devui/time-picker/src/time-picker.tsx b/packages/devui-vue/devui/time-picker/src/time-picker.tsx
index 857ca20e..15be03e0 100644
--- a/packages/devui-vue/devui/time-picker/src/time-picker.tsx
+++ b/packages/devui-vue/devui/time-picker/src/time-picker.tsx
@@ -30,11 +30,12 @@ export default defineComponent({
getTimeValue,
clickVerifyFun,
isOutOpen,
+ vModelIsBeyond,
clearAll,
timePopupDom,
vModeValue,
getPopupPosition
- } = useTimePicker(activeHour,activeMinute,activeSecond,props.minTime,format,props.autoOpen,props.disabled,props.modelValue)
+ } = useTimePicker(activeHour,activeMinute,activeSecond,props.minTime,props.maxTime,format,props.autoOpen,props.disabled,props.modelValue)
const selectedTimeChage = (e:MouseEvent) => {
@@ -46,6 +47,7 @@ export default defineComponent({
onMounted(() => {
getPopupPosition()
isOutOpen()
+ vModelIsBeyond()
document.addEventListener('click', clickVerifyFun)
document.addEventListener('click',getTimeValue)
document.addEventListener('scroll',getPopupPosition)
@@ -60,7 +62,7 @@ export default defineComponent({
watch(vModeValue,(newValue:string)=>{
ctx.emit('update:modelValue',vModeValue.value)
- if(newValue != props.minTime){
+ if(newValue != props.minTime && newValue != '00:00'){
showClearIcon.value = true
}else{
showClearIcon.value = false
diff --git a/packages/devui-vue/docs/components/time-picker/index.md b/packages/devui-vue/docs/components/time-picker/index.md
index dc3f1f37..858f7c11 100644
--- a/packages/devui-vue/docs/components/time-picker/index.md
+++ b/packages/devui-vue/docs/components/time-picker/index.md
@@ -48,18 +48,31 @@
minTime
-
+
maxTime
-
+
maxTime && minTime
-
+
+
+
```
:::
@@ -73,17 +86,33 @@
mm:HH:ss
-
+
hh:mm
-
+
MM:ss
-
+
+
```
:::
@@ -111,11 +140,6 @@ export default defineComponent({
setup(props,ctx){
let slotDemo = ref(null)
- // 返回选中的时间
- const selectedTimeChage =(timeValue)=>{
- console.log(timeValue)
- }
-
const chooseTime = ()=>{
let timeObj ={
time:'23',
--
Gitee
From fce10b43f316d2950c5a8599600e54da91f4d2d2 Mon Sep 17 00:00:00 2001
From: Dreamer <154239735@qq.com>
Date: Sun, 7 Nov 2021 02:26:57 +0000
Subject: [PATCH 2/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20pack?=
=?UTF-8?q?ages/devui-vue/devui/card/=5F=5Ftests=5F=5F/=5F=5Fsnapshots=5F?=
=?UTF-8?q?=5F/card.spec.ts.snap?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../__tests__/__snapshots__/card.spec.ts.snap | 39 -------------------
1 file changed, 39 deletions(-)
delete mode 100644 packages/devui-vue/devui/card/__tests__/__snapshots__/card.spec.ts.snap
diff --git a/packages/devui-vue/devui/card/__tests__/__snapshots__/card.spec.ts.snap b/packages/devui-vue/devui/card/__tests__/__snapshots__/card.spec.ts.snap
deleted file mode 100644
index 76e8d750..00000000
--- a/packages/devui-vue/devui/card/__tests__/__snapshots__/card.spec.ts.snap
+++ /dev/null
@@ -1,39 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`card should render correctly 1`] = `
-
-`;
--
Gitee
From 17433315f6567846fd1e33eb042007755c4d89e1 Mon Sep 17 00:00:00 2001
From: Dreamer <154239735@qq.com>
Date: Sun, 7 Nov 2021 02:36:49 +0000
Subject: [PATCH 3/3] update packages/devui-vue/devui/time-picker/index.ts.
---
packages/devui-vue/devui/time-picker/index.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/devui-vue/devui/time-picker/index.ts b/packages/devui-vue/devui/time-picker/index.ts
index e61fb3e2..85c682ab 100644
--- a/packages/devui-vue/devui/time-picker/index.ts
+++ b/packages/devui-vue/devui/time-picker/index.ts
@@ -10,7 +10,7 @@ export { TimePicker }
export default {
title: 'TimePicker 时间选择器',
category: '数据录入',
- status: '已完成', // TODO: 组件若开发完成则填入"已完成",并删除该注释
+ status: '90%', // TODO: 组件若开发完成则填入"已完成",并删除该注释
install(app: App): void {
app.use(TimePicker as any)
}
--
Gitee