feat:date picker and editor debug

pr675
黄云飞 4 years ago
parent 81d3b4ccee
commit 460c9bcbaa

@ -214,6 +214,11 @@
margin-left: 10px; margin-left: 10px;
} }
.date-menu button:hover {
color: #5175F4;
border-color: #5175F4;
}
.date-menu button.date-menu__time { .date-menu button.date-menu__time {
border: 1px solid transparent; border: 1px solid transparent;
position: absolute; position: absolute;

@ -15,18 +15,40 @@ export class DateParticle {
this.draw = draw this.draw = draw
this.range = draw.getRange() this.range = draw.getRange()
this.datePicker = new DatePicker({ this.datePicker = new DatePicker({
mountDom: draw.getContainer() mountDom: draw.getContainer(),
onSubmit: this._setValue.bind(this)
}) })
} }
public getDateElementList(): IElement[] { private _setValue(date: string) {
if (!date) return
const range = this.getDateElementRange()
if (!range) return
const [leftIndex, rightIndex] = range
const elementList = this.draw.getElementList()
const startElement = elementList[leftIndex + 1]
// 删除旧时间
elementList.splice(leftIndex + 1, rightIndex - leftIndex)
this.range.setRange(leftIndex, leftIndex)
// 插入新时间
this.draw.insertElementList([{
type: ElementType.DATE,
value: '',
dateFormat: startElement.dateFormat,
valueList: [{
value: date
}]
}])
}
public getDateElementRange(): [number, number] | null {
let leftIndex = -1 let leftIndex = -1
let rightIndex = -1 let rightIndex = -1
const { startIndex, endIndex } = this.range.getRange() const { startIndex, endIndex } = this.range.getRange()
if (!~startIndex && !~endIndex) return [] if (!~startIndex && !~endIndex) return null
const elementList = this.draw.getElementList() const elementList = this.draw.getElementList()
const startElement = elementList[startIndex] const startElement = elementList[startIndex]
if (startElement.type !== ElementType.DATE) return [] if (startElement.type !== ElementType.DATE) return null
// 向左查找 // 向左查找
let preIndex = startIndex let preIndex = startIndex
while (preIndex > 0) { while (preIndex > 0) {
@ -51,8 +73,8 @@ export class DateParticle {
if (nextIndex === elementList.length) { if (nextIndex === elementList.length) {
rightIndex = nextIndex - 1 rightIndex = nextIndex - 1
} }
if (!~leftIndex || !~rightIndex) return [] if (!~leftIndex || !~rightIndex) return null
return elementList.slice(leftIndex + 1, rightIndex + 1) return [leftIndex, rightIndex]
} }
public clearDatePicker() { public clearDatePicker() {
@ -63,7 +85,11 @@ export class DateParticle {
const height = this.draw.getHeight() const height = this.draw.getHeight()
const pageGap = this.draw.getPageGap() const pageGap = this.draw.getPageGap()
const startTop = this.draw.getPageNo() * (height + pageGap) const startTop = this.draw.getPageNo() * (height + pageGap)
const value = this.getDateElementList().map(el => el.value).join('') const elementList = this.draw.getElementList()
const range = this.getDateElementRange()
const value = range
? elementList.slice(range[0] + 1, range[1] + 1).map(el => el.value).join('')
: ''
this.datePicker.render({ this.datePicker.render({
value, value,
element, element,

@ -1,7 +1,8 @@
import { IElement, IElementPosition } from '../../../../interface/Element' import { IElement, IElementPosition } from '../../../../interface/Element'
export interface IDatePickerOption { export interface IDatePickerOption {
mountDom?: HTMLElement mountDom?: HTMLElement;
onSubmit?: (date: string) => any;
} }
interface IDatePickerDom { interface IDatePickerDom {
@ -32,7 +33,7 @@ interface IRenderOption {
value: string; value: string;
element: IElement; element: IElement;
position: IElementPosition; position: IElementPosition;
startTop: number; startTop?: number;
} }
export class DatePicker { export class DatePicker {
@ -196,9 +197,11 @@ export class DatePicker {
} }
this.dom.menu.now.onclick = () => { this.dom.menu.now.onclick = () => {
this._now() this._now()
this._submit()
} }
this.dom.menu.submit.onclick = () => { this.dom.menu.submit.onclick = () => {
this.dispose() this.dispose()
this._submit()
} }
this.dom.time.hour.onclick = (evt) => { this.dom.time.hour.onclick = (evt) => {
if (!this.pickDate) return if (!this.pickDate) return
@ -239,7 +242,7 @@ export class DatePicker {
} = this.renderOptions } = this.renderOptions
// 位置 // 位置
this.dom.container.style.left = `${left}px` this.dom.container.style.left = `${left}px`
this.dom.container.style.top = `${top + startTop + lineHeight}px` this.dom.container.style.top = `${top + (startTop || 0) + lineHeight}px`
} }
public isInvalidDate(value: Date): boolean { public isInvalidDate(value: Date): boolean {
@ -308,10 +311,11 @@ export class DatePicker {
dayDom.classList.add('select') dayDom.classList.add('select')
} }
dayDom.innerText = `${i}` dayDom.innerText = `${i}`
dayDom.onclick = () => { dayDom.onclick = (evt) => {
const newMonth = month - 1 const newMonth = month - 1
this.now = new Date(year, newMonth, i) this.now = new Date(year, newMonth, i)
this._setDatePick(year, newMonth, i) this._setDatePick(year, newMonth, i)
evt.stopPropagation()
} }
this.dom.day.append(dayDom) this.dom.day.append(dayDom)
} }
@ -405,6 +409,39 @@ export class DatePicker {
} }
} }
private _submit() {
if (this.options.onSubmit && this.pickDate) {
const format = this.renderOptions?.element.dateFormat
const pickDateString = this.formatDate(this.pickDate, format)
this.options.onSubmit(pickDateString)
}
}
public formatDate(date: Date, format = 'yyyy-MM-dd hh:mm:ss'): string {
let dateString = format
const dateOption = {
'y+': date.getFullYear().toString(),
'M+': (date.getMonth() + 1).toString(),
'd+': date.getDate().toString(),
'h+': date.getHours().toString(),
'm+': date.getMinutes().toString(),
's+': date.getSeconds().toString()
}
for (const k in dateOption) {
const reg = new RegExp('(' + k + ')').exec(format)
const key = <keyof typeof dateOption>k
if (reg) {
dateString = dateString.replace(
reg[1],
reg[1].length === 1
? (dateOption[key])
: (dateOption[key].padStart(reg[1].length, '0'))
)
}
}
return dateString
}
public render(option: IRenderOption) { public render(option: IRenderOption) {
this.renderOptions = option this.renderOptions = option
this._setValue() this._setValue()
@ -417,7 +454,6 @@ export class DatePicker {
public dispose() { public dispose() {
this._toggleVisible(false) this._toggleVisible(false)
return this.pickDate
} }
} }
Loading…
Cancel
Save