From d2eddd3645e2065219ce7cefa426d8de062556ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E4=BC=9F=E6=9D=B0?= <674416404@qq.com> Date: Tue, 27 Aug 2024 18:01:23 +0800 Subject: [PATCH] feat: add getPickerCols --- js/time-picker/const.ts | 2 +- js/time-picker/utils.ts | 37 ++++++++++++++ test/unit/time-picker/utils.test.js | 78 +++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 test/unit/time-picker/utils.test.js diff --git a/js/time-picker/const.ts b/js/time-picker/const.ts index 744681438a..fd8363ccd6 100644 --- a/js/time-picker/const.ts +++ b/js/time-picker/const.ts @@ -17,7 +17,7 @@ export enum EPickerCols { } // RegExp -export const TIME_FORMAT = /(a\s+|A\s+)?(h+|H+)?:?(m+)?:?(s+)?:?(S+)?(\s+a|\s+A)?/; +export const TIME_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g; // 上下午前置 export const PRE_MERIDIEM_FORMAT = /^(a|A)\s+?[h]{1,2}(:[m]{1,2}(:[s]{1,2})?)?$/; // 上下午后置 diff --git a/js/time-picker/utils.ts b/js/time-picker/utils.ts index 5c0b756729..03d7a1ce04 100644 --- a/js/time-picker/utils.ts +++ b/js/time-picker/utils.ts @@ -1,6 +1,7 @@ import dayjs from 'dayjs'; import advancedFormat from 'dayjs/plugin/advancedFormat'; import customParseFormat from 'dayjs/plugin/customParseFormat'; +import { EPickerCols, TIME_FORMAT } from './const'; dayjs.extend(advancedFormat); dayjs.extend(customParseFormat); @@ -26,3 +27,39 @@ export function closestLookup( (a, b) => Math.abs(calcVal + 1 - a) - Math.abs(calcVal + 1 - b) )[0]; } + +export function getPickerCols(format:string) { + const renderCol: EPickerCols[] = []; + const { + meridiem, hour, minute, second, milliSecond, + } = EPickerCols; + const match = format.match(TIME_FORMAT); + match.forEach((m) => { + switch (m) { + case 'H': + case 'HH': + case 'h': + case 'hh': + renderCol.push(hour); + break; + case 'a': + case 'A': + renderCol.push(meridiem); + break; + case 'm': + case 'mm': + renderCol.push(minute); + break; + case 's': + case 'ss': + renderCol.push(second); + break; + case 'SSS': + renderCol.push(milliSecond); + break; + default: + break; + } + }); + return renderCol; +} diff --git a/test/unit/time-picker/utils.test.js b/test/unit/time-picker/utils.test.js new file mode 100644 index 0000000000..2e50e6ba1a --- /dev/null +++ b/test/unit/time-picker/utils.test.js @@ -0,0 +1,78 @@ +import { getPickerCols } from '../../../js/time-picker/utils'; + +describe('utils', () => { + describe(' getPickerCols', () => { + it('h', () => { + const res = getPickerCols('h'); + expect(res.length).toBe(1); + expect(res[0]).toBe('hour'); + }); + + it('m', () => { + const res = getPickerCols('m'); + expect(res.length).toBe(1); + expect(res[0]).toBe('minute'); + }); + + it('s', () => { + const res = getPickerCols('s'); + expect(res.length).toBe(1); + expect(res[0]).toBe('second'); + }); + + it('S', () => { + const res = getPickerCols('s'); + expect(res.length).toBe(1); + expect(res[0]).toBe('second'); + }); + + it('hh', () => { + const res = getPickerCols('hh'); + expect(res.length).toBe(1); + expect(res[0]).toBe('hour'); + }); + + it('HH', () => { + const res = getPickerCols('HH'); + expect(res.length).toBe(1); + expect(res[0]).toBe('hour'); + }); + it('hh:mm', () => { + const res = getPickerCols('hh:mm'); + expect(res.length).toBe(2); + expect(res[0]).toBe('hour'); + expect(res[1]).toBe('minute'); + }); + + it('HH:mm', () => { + const res = getPickerCols('HH:mm'); + expect(res.length).toBe(2); + expect(res[0]).toBe('hour'); + expect(res[1]).toBe('minute'); + }); + + it('HH时mm分', () => { + const res = getPickerCols('HH时mm分'); + expect(res.length).toBe(2); + expect(res[0]).toBe('hour'); + expect(res[1]).toBe('minute'); + }); + + it('hh:mm', () => { + const res = getPickerCols('hh:mm:ss'); + expect(res.length).toBe(3); + expect(res[0]).toBe('hour'); + expect(res[1]).toBe('minute'); + expect(res[2]).toBe('second'); + }); + + it('HH时mm分ss秒SSS毫秒', () => { + const res = getPickerCols('HH时mm分ss秒SSS毫秒'); + expect(res.length).toBe(4); + expect(res[0]).toBe('hour'); + expect(res[1]).toBe('minute'); + expect(res[2]).toBe('second'); + expect(res[3]).toBe('millisecond'); + }); + }); +});