From 8d29e5c8c6df278800865596f285c17029150963 Mon Sep 17 00:00:00 2001 From: songweite Date: Fri, 3 Jul 2020 10:35:59 +0800 Subject: [PATCH] refactor(Sku): use datetime-picker --- src/sku/components/SkuDateTimeFiled.js | 90 ++++++++++++++++++++++++++ src/sku/components/SkuMessages.js | 21 +++++- src/sku/index.less | 7 ++ src/sku/lang.ts | 16 ++--- src/sku/test/index.spec.js | 12 ++++ src/sku/utils/time-helper.js | 30 +++++++++ 6 files changed, 166 insertions(+), 10 deletions(-) create mode 100644 src/sku/components/SkuDateTimeFiled.js create mode 100644 src/sku/utils/time-helper.js diff --git a/src/sku/components/SkuDateTimeFiled.js b/src/sku/components/SkuDateTimeFiled.js new file mode 100644 index 000000000..c105b7edd --- /dev/null +++ b/src/sku/components/SkuDateTimeFiled.js @@ -0,0 +1,90 @@ +// Utils +import { createNamespace } from '../../utils'; +import { string2Date, date2String } from '../utils/time-helper'; + +// Components +import Popup from '../../popup'; +import DateTimePicker from '../../datetime-picker'; +import Field from '../../field'; + +const [createComponent, bem, t] = createNamespace('sku-datetime-filed'); + +export default createComponent({ + props: { + value: String, + label: String, + required: Boolean, + placeholder: String, + type: { + type: String, + default: 'date', + }, + }, + + data() { + return { + showDatePicker: false, + currentDate: this.type === 'time' ? '' : new Date(), + }; + }, + + watch: { + value(val) { + switch (this.type) { + case 'time': + this.currentDate = val; + break; + case 'date': + case 'datetime': + this.currentDate = string2Date(val) || new Date(); + break; + } + }, + }, + + methods: { + onClick() { + this.showDatePicker = true; + }, + onConfirm(val) { + let data = val; + if (this.type !== 'time') { + data = date2String(val, this.type); + } + this.$emit('input', data); + this.showDatePicker = false; + }, + onCancel() { + this.showDatePicker = false; + }, + }, + + render() { + return ( + + + + + + ); + }, +}); diff --git a/src/sku/components/SkuMessages.js b/src/sku/components/SkuMessages.js index 854e046a3..d24293e0f 100644 --- a/src/sku/components/SkuMessages.js +++ b/src/sku/components/SkuMessages.js @@ -7,6 +7,7 @@ import { isNumeric } from '../../utils/validate/number'; import Cell from '../../cell'; import Field from '../../field'; import SkuImgUploader from './SkuImgUploader'; +import SkuDateTimeFiled from './SkuDateTimeFiled'; const [createComponent, bem, t] = createNamespace('sku-messages'); @@ -48,7 +49,7 @@ export default createComponent({ if (message.type === 'id_no') { return 'text'; } - return message.datetime > 0 ? 'datetime-local' : message.type; + return message.datetime > 0 ? 'datetime' : message.type; }, getMessages() { @@ -125,7 +126,6 @@ export default createComponent({ +
{t('imageLabel')}
); } + // 时间和日期使用的vant选择器 + const isDateOrTime = ['date', 'time'].indexOf(message.type) > -1; + if (isDateOrTime) { + return ( + + ); + } + return ( { wrapper.find('.van-button--danger').trigger('click'); expect(wrapper.emitted('buy-clicked').length).toEqual(1); }); + +test('string2Date', () => { + expect(date2String(string2Date(''))).toEqual(''); + expect(date2String(string2Date('2020-07-01'))).toEqual('2020-07-01'); + expect(date2String(string2Date('2020-07-01 22:44'), 'datetime')).toEqual( + '2020-07-01 22:44' + ); + expect(date2String(string2Date('2020-12-31 23:59'), 'datetime')).toEqual( + '2020-12-31 23:59' + ); +}); diff --git a/src/sku/utils/time-helper.js b/src/sku/utils/time-helper.js new file mode 100644 index 000000000..0dc1d0fee --- /dev/null +++ b/src/sku/utils/time-helper.js @@ -0,0 +1,30 @@ +function length2(int) { + return int > 9 ? `${int}` : `0${int}`; +} + +// 字符串转 Date +// 只处理 YYYY-MM-DD 或者 YYYY-MM-DD HH:MM 格式 +export function string2Date(timeString) { + if (!timeString) { + return null; + } + return new Date(timeString.replace(/-/g, '/')); +} + +// Date 转字符串 +// type: date or datetime +export function date2String(date, type = 'date') { + if (!date) { + return ''; + } + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + let timeString = `${year}-${length2(month)}-${length2(day)}`; + if (type === 'datetime') { + const hours = date.getHours(); + const minute = date.getMinutes(); + timeString += ` ${length2(hours)}:${length2(minute)}`; + } + return timeString; +}