forked from fanruan/fineui
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
285 lines
11 KiB
285 lines
11 KiB
import { shortcut, Widget, createWidget, toPix, i18nText, createItems, print, isNull, isEmptyObject, isEmptyString, getDate, checkDateVoid, extend } from "@/core"; |
|
import { DynamicDateCombo, DynamicDateHelper } from "../dynamicdate"; |
|
import { TextButton, Tab } from "@/base"; |
|
import { DateCalendarPopup } from "../date/calendar"; |
|
import { DynamicDateTimeCombo } from "./dynamicdatetime.combo"; |
|
|
|
@shortcut() |
|
export class DynamicDateTimePopup extends Widget { |
|
static xtype = "bi.dynamic_date_time_popup" |
|
|
|
constants = { |
|
tabHeight: 40, |
|
buttonHeight: 24, |
|
} |
|
|
|
props = { |
|
baseCls: "bi-dynamic-date-time-popup", |
|
width: 272, |
|
supportDynamic: true, |
|
}; |
|
|
|
static EVENT_CHANGE = "EVENT_CHANGE" |
|
static BUTTON_OK_EVENT_CHANGE = "BUTTON_OK_EVENT_CHANGE" |
|
static BUTTON_lABEL_EVENT_CHANGE = "BUTTON_lABEL_EVENT_CHANGE" |
|
static BUTTON_CLEAR_EVENT_CHANGE = "BUTTON_CLEAR_EVENT_CHANGE" |
|
static EVENT_BEFORE_YEAR_MONTH_POPUPVIEW = "EVENT_BEFORE_YEAR_MONTH_POPUPVIEW" |
|
|
|
_init() { |
|
super._init(...arguments); |
|
const opts = this.options; |
|
this.storeValue = { |
|
type: DynamicDateCombo.Static, |
|
}; |
|
createWidget({ |
|
element: this, |
|
type: "bi.vertical", |
|
items: [{ |
|
el: this._getTabJson(), |
|
}, { |
|
el: { |
|
type: "bi.grid", |
|
items: [ |
|
[{ |
|
type: "bi.text_button", |
|
cls: "bi-high-light bi-split-top", |
|
textHeight: toPix(BI.SIZE_CONSANTS.TOOL_BAR_HEIGHT, 1), |
|
shadow: true, |
|
text: i18nText("BI-Basic_Clear"), |
|
listeners: [{ |
|
eventName: TextButton.EVENT_CHANGE, |
|
action: () => { |
|
this.fireEvent(DynamicDateTimePopup.BUTTON_CLEAR_EVENT_CHANGE); |
|
}, |
|
}], |
|
}, { |
|
type: "bi.text_button", |
|
cls: "bi-split-left bi-split-right bi-high-light bi-split-top", |
|
textHeight: toPix(BI.SIZE_CONSANTS.TOOL_BAR_HEIGHT, 1), |
|
shadow: true, |
|
text: i18nText("BI-Multi_Date_Today"), |
|
disabled: this._checkTodayValid(), |
|
ref: _ref => { |
|
this.todayButton = _ref; |
|
}, |
|
listeners: [{ |
|
eventName: TextButton.EVENT_CHANGE, |
|
action: () => { |
|
this.fireEvent(DynamicDateTimePopup.BUTTON_lABEL_EVENT_CHANGE); |
|
}, |
|
}], |
|
}, { |
|
type: "bi.text_button", |
|
cls: "bi-high-light bi-split-top", |
|
textHeight: toPix(BI.SIZE_CONSANTS.TOOL_BAR_HEIGHT, 1), |
|
shadow: true, |
|
text: i18nText("BI-Basic_OK"), |
|
listeners: [{ |
|
eventName: TextButton.EVENT_CHANGE, |
|
action: () => { |
|
const type = this.dateTab.getSelect(); |
|
if (type === DynamicDateCombo.Dynamic) { |
|
this.dynamicPane.checkValidation(true) && this.fireEvent(DynamicDateTimePopup.BUTTON_OK_EVENT_CHANGE); |
|
} else { |
|
this.fireEvent(DynamicDateTimePopup.BUTTON_OK_EVENT_CHANGE); |
|
} |
|
}, |
|
}], |
|
}] |
|
], |
|
height: BI.SIZE_CONSANTS.TOOL_BAR_HEIGHT, |
|
}, |
|
}], |
|
}); |
|
this.setValue(opts.value); |
|
} |
|
|
|
_getTabJson() { |
|
const o = this.options; |
|
|
|
return { |
|
type: "bi.tab", |
|
logic: { |
|
dynamic: true, |
|
}, |
|
ref: _ref => { |
|
this.dateTab = _ref; |
|
}, |
|
tab: { |
|
type: "bi.linear_segment", |
|
invisible: !o.supportDynamic, |
|
cls: "bi-split-bottom", |
|
height: this.constants.tabHeight, |
|
items: createItems([{ |
|
text: i18nText("BI-Multi_Date_YMD"), |
|
value: DynamicDateCombo.Static, |
|
}, { |
|
text: i18nText("BI-Basic_Dynamic_Title"), |
|
value: DynamicDateCombo.Dynamic, |
|
}], { |
|
textAlign: "center", |
|
}), |
|
}, |
|
cardCreator: v => { |
|
switch (v) { |
|
case DynamicDateCombo.Dynamic: |
|
return { |
|
type: "bi.dynamic_date_card", |
|
cls: "dynamic-date-pane", |
|
listeners: [{ |
|
eventName: "EVENT_CHANGE", |
|
action: () => { |
|
this._setInnerValue(this.year, v); |
|
}, |
|
}], |
|
ref: _ref => { |
|
this.dynamicPane = _ref; |
|
}, |
|
min: this.options.min, |
|
max: this.options.max, |
|
}; |
|
case DynamicDateCombo.Static: |
|
default: |
|
return { |
|
type: "bi.vertical", |
|
items: [{ |
|
type: "bi.date_calendar_popup", |
|
behaviors: o.behaviors, |
|
min: this.options.min, |
|
max: this.options.max, |
|
ref: _ref => { |
|
this.ymd = _ref; |
|
}, |
|
listeners: [{ |
|
eventName: DateCalendarPopup.EVENT_BEFORE_YEAR_MONTH_POPUPVIEW, |
|
action: () => { |
|
this.fireEvent(DynamicDateTimePopup.EVENT_BEFORE_YEAR_MONTH_POPUPVIEW); |
|
}, |
|
}], |
|
}, { |
|
el: { |
|
type: "bi.dynamic_date_time_select", |
|
cls: "bi-split-top", |
|
ref: _ref => { |
|
this.timeSelect = _ref; |
|
}, |
|
height: 40, |
|
}, |
|
}], |
|
}; |
|
} |
|
}, |
|
listeners: [{ |
|
eventName: Tab.EVENT_CHANGE, |
|
action: () => { |
|
const v = this.dateTab.getSelect(); |
|
const date = DynamicDateHelper.getCalculation(this.dynamicPane.getValue()); |
|
switch (v) { |
|
case DynamicDateCombo.Static: |
|
this.ymd.setValue({ |
|
year: date.getFullYear(), |
|
month: date.getMonth() + 1, |
|
day: date.getDate(), |
|
}); |
|
this.timeSelect.setValue(); |
|
this._setInnerValue(); |
|
break; |
|
case DynamicDateCombo.Dynamic: |
|
default: |
|
if (this.storeValue && this.storeValue.type === DynamicDateCombo.Dynamic) { |
|
this.dynamicPane.setValue(this.storeValue.value); |
|
} else { |
|
this.dynamicPane.setValue({ |
|
year: 0, |
|
}); |
|
} |
|
this._setInnerValue(); |
|
break; |
|
} |
|
}, |
|
}], |
|
}; |
|
} |
|
|
|
_setInnerValue() { |
|
if (this.dateTab.getSelect() === DynamicDateCombo.Static) { |
|
this.todayButton.setValue(i18nText("BI-Multi_Date_Today")); |
|
this.todayButton.setEnable(!this._checkTodayValid()); |
|
} else { |
|
let date = DynamicDateHelper.getCalculation(this.dynamicPane.getInputValue()); |
|
date = print(date, "%Y-%X-%d"); |
|
this.todayButton.setValue(date); |
|
this.todayButton.setEnable(false); |
|
} |
|
} |
|
|
|
_checkValueValid(value) { |
|
return isNull(value) || isEmptyObject(value) || isEmptyString(value); |
|
} |
|
|
|
_checkTodayValid() { |
|
const o = this.options; |
|
const today = getDate(); |
|
|
|
return !!checkDateVoid(today.getFullYear(), today.getMonth() + 1, today.getDate(), o.min, o.max)[0]; |
|
} |
|
|
|
setMinDate(minDate) { |
|
if (this.options.min !== minDate) { |
|
this.options.min = minDate; |
|
this.ymd.setMinDate(minDate); |
|
} |
|
} |
|
|
|
setMaxDate(maxDate) { |
|
if (this.options.max !== maxDate) { |
|
this.options.max = maxDate; |
|
this.ymd.setMaxDate(maxDate); |
|
} |
|
} |
|
|
|
setValue(v) { |
|
this.storeValue = v; |
|
v = v || {}; |
|
const type = v.type || DynamicDateCombo.Static; |
|
const value = v.value || v; |
|
this.dateTab.setSelect(type); |
|
switch (type) { |
|
case DynamicDateCombo.Dynamic: |
|
this.dynamicPane.setValue(value); |
|
this._setInnerValue(); |
|
break; |
|
case DynamicDateCombo.Static: |
|
default: |
|
if (this._checkValueValid(value)) { |
|
const date = getDate(); |
|
this.ymd.setValue({ |
|
year: date.getFullYear(), |
|
month: date.getMonth() + 1, |
|
day: date.getDate(), |
|
}); |
|
this.timeSelect.setValue(); |
|
this.todayButton.setValue(i18nText("BI-Multi_Date_Today")); |
|
} else { |
|
this.ymd.setValue(value); |
|
this.timeSelect.setValue({ |
|
hour: value.hour, |
|
minute: value.minute, |
|
second: value.second, |
|
}); |
|
this.todayButton.setValue(i18nText("BI-Multi_Date_Today")); |
|
} |
|
this.todayButton.setEnable(!this._checkTodayValid()); |
|
break; |
|
} |
|
} |
|
|
|
getValue() { |
|
const type = this.dateTab.getSelect(); |
|
|
|
return { |
|
type, |
|
value: type === DynamicDateTimeCombo.Static ? extend(this.ymd.getValue(), this.timeSelect.getValue()) : this.dynamicPane.getValue(), |
|
}; |
|
} |
|
}
|
|
|