UNPKG

@zenweb/form

Version:

Zenweb Form module

182 lines (181 loc) 4.64 kB
import dayjs from 'dayjs'; import { Field, simple } from '../field.js'; /** * 日期类型 - 默认返回全部日期+时间,可以使用 startOf 控制输出 */ export class Datetime extends Field { _of; /** * 设置保留的精度 */ of(unitOfTime) { this._of = unitOfTime; return this; } extra() { return { of: this._of, }; } _clean(data) { if (!data) { if (this._required) { this.fail('form.required'); } return; } const m = dayjs(data); if (!m.isValid()) { this.fail('form.datetime.format-error', { data }); } return m; } clean(data) { const m = this._clean(data); if (m) { if (this._of) { return m.startOf(this._of).toDate(); } return m.toDate(); } return m; } } /** * 日期类型 - 只保留 年月日 */ export class _Date extends Datetime { _of = 'day'; option = { type: 'Date', }; } export class DateRange extends Field { _of; _start; _end; _format = 'YYYY-MM-DD'; /** * 设置输出格式,在使用 `string` 类型有效 * - 默认: `YYYY-MM-DD` */ format(fmt) { this._format = fmt; return this; } /** * 设置保留精度 * - 默认: `day` */ of(unitOfTime) { this._of = unitOfTime; return this; } /** * 设置开始日期,如果不设置则不限制 */ start(date) { this._start = date; return this; } /** * 设置结束日期,如果不设置则不限制 */ end(date) { this._end = date; return this; } extra() { return { of: this._of, start: this._start, end: this._end, }; } _clean(data) { if (!data) { if (this._required) { this.fail('form.required'); } return; } let m = dayjs(data); if (!m.isValid()) { this.fail('form.datetime.format-error', { data }); } return m; } clean(data) { let _start; if (this._start) { _start = dayjs(this._start); if (this._of) { _start = _start.startOf(this._of); } } let _end; if (this._end) { _end = dayjs(this._end); if (this._of) { _end = _end.endOf(this._of); } } let dataS = this._clean(data && data[0]); if (dataS) { if (this._of) { dataS = dataS.startOf(this._of); } if (_start && dataS.isBefore(_start)) { this.fail('form.daterange.start.before', { start: _start.format(this._format) }); } if (_end && dataS.isAfter(_end)) { this.fail('form.daterange.start.after', { end: _end.format(this._format) }); } } let dataE = this._clean(data && data[1]); if (dataE) { if (this._of) { dataE = dataE.endOf(this._of); } if (_start && dataE.isBefore(_start)) { this.fail('form.daterange.end.before', { start: _start.format(this._format) }); } if (_end && dataE.isAfter(_end)) { this.fail('form.daterange.end.after', { end: _end.format(this._format) }); } if (dataS && dataE.isBefore(dataS)) { this.fail('form.daterange.end.lt-start'); } } if (dataS || dataE) { if (this._valueType.includes('string')) { return [dataS?.format(this._format), dataE?.format(this._format)]; } return [dataS?.toDate(), dataE?.toDate()]; } } } export class Time extends Field { _format = 'HH:mm:ss'; format(fmt) { this._format = fmt; return this; } clean(data) { if (!data) { if (this._required) { this.fail('form.required'); } return; } let m = dayjs(data, this._format); if (!m.isValid()) { this.fail('form.datetime.format-error', { data }); } return m.format(this._format); } } export const datetime = simple(Datetime); export const date = simple(_Date); export const dateRange = simple(DateRange); export const time = simple(Time);