Merge pull request #2866 from dataease/pr@dev@feat_dynamic_date_range

feat(仪表板-日期过滤器): 日期过滤器快捷选项
This commit is contained in:
fit2cloud-chenyw 2022-08-17 17:10:55 +08:00 committed by GitHub
commit abaa34425b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 170 additions and 29 deletions

View File

@ -14,6 +14,7 @@
:format="labelFormat" :format="labelFormat"
:size="size" :size="size"
:editable="false" :editable="false"
:picker-options="pickerOptions"
@change="dateChange" @change="dateChange"
@focus="toFocus" @focus="toFocus"
@blur="onBlur" @blur="onBlur"
@ -99,6 +100,25 @@ export default {
return result + ' ' + this.element.options.attrs.accuracy return result + ' ' + this.element.options.attrs.accuracy
} }
return null return null
},
pickerOptions() {
const widget = ApplicationContext.getService(this.element.serviceName)
if (this.element.options.attrs.type === 'daterange' && widget.shortcuts) {
const cuts = widget.shortcuts()
const result = cuts.map(cut => {
return {
text: this.$t(cut.text),
onClick: picker => {
const param = cut.callBack()
picker.$emit('pick', param)
}
}
})
return {
shortcuts: result
}
}
return null
} }
}, },

View File

@ -89,64 +89,101 @@ class TimeDateRangeServiceImpl extends WidgetService {
defaultSetting() { defaultSetting() {
return dialogPanel.options.attrs.default return dialogPanel.options.attrs.default
} }
getStartDayOfWeek() { getStartDayOfWeek(step) {
var now = new Date() // 当前日期 var now = new Date() // 当前日期
var nowDayOfWeek = now.getDay() var nowDayOfWeek = now.getDay()
var nowDay = now.getDate() // 当前日 var nowDay = now.getDate() // 当前日
var nowMonth = now.getMonth() // 当前月 var nowMonth = now.getMonth() // 当前月
var day = nowDayOfWeek || 7 var day = nowDayOfWeek || 7
return new Date(now.getFullYear(), nowMonth, nowDay + 1 - day) var resultDay = nowDay + 1 - day
if (step !== null) {
resultDay += (step * 7)
} }
getEndDayOfWeek() { return new Date(now.getFullYear(), nowMonth, resultDay)
}
getEndDayOfWeek(step) {
var now = new Date() // 当前日期 var now = new Date() // 当前日期
var nowDayOfWeek = now.getDay() var nowDayOfWeek = now.getDay()
var nowDay = now.getDate() // 当前日 var nowDay = now.getDate() // 当前日
var nowMonth = now.getMonth() // 当前月 var nowMonth = now.getMonth() // 当前月
var day = nowDayOfWeek || 7 var day = nowDayOfWeek || 7
return new Date(now.getFullYear(), nowMonth, nowDay + 7 - day) var resultDay = nowDay + 7 - day
if (step !== null) {
resultDay += (step * 7)
} }
getStartDayOfMonth() { return new Date(now.getFullYear(), nowMonth, resultDay)
}
getStartDayOfMonth(step) {
var now = new Date() var now = new Date()
var nowMonth = now.getMonth() // 当前月 var nowMonth = now.getMonth() // 当前月
if (step !== null) {
nowMonth += step
}
var monthStartDate = new Date(now.getFullYear(), nowMonth, 1) var monthStartDate = new Date(now.getFullYear(), nowMonth, 1)
return monthStartDate return monthStartDate
} }
getEndDayOfMonth() { getEndDayOfMonth(step) {
var now = new Date() var now = new Date()
var nowMonth = now.getMonth() // 当前月 var nowMonth = now.getMonth() // 当前月
var monthEndDate = new Date(now.getFullYear(), nowMonth, this.getMonthDays()) var days = this.getMonthDays()
if (step !== null) {
nowMonth += step
days = this.getMonthDays(step)
}
var monthEndDate = new Date(now.getFullYear(), nowMonth, days)
return monthEndDate return monthEndDate
} }
getStartQuarter() { getStartQuarter(step) {
var now = new Date() var now = new Date()
var nowMonth = now.getMonth() var nowMonth = now.getMonth()
const startMonth = Math.floor((nowMonth / 3)) * 3 var startMonth = Math.floor((nowMonth / 3)) * 3
if (step !== null) {
startMonth += (step * 3)
}
return new Date(now.getFullYear(), startMonth, 1) return new Date(now.getFullYear(), startMonth, 1)
} }
getEndQuarter() { getEndQuarter(step) {
var now = new Date() var now = new Date()
var nowMonth = now.getMonth() var nowMonth = now.getMonth()
const quar = Math.floor(nowMonth / 3) const quar = Math.floor(nowMonth / 3)
const endMonth = quar * 3 + 2 var endMonth = quar * 3 + 2
if (step !== null) {
endMonth += (step * 3)
}
const days = (endMonth === 5 || endMonth === 8) ? 30 : 31 const days = (endMonth === 5 || endMonth === 8) ? 30 : 31
return new Date(now.getFullYear(), endMonth, days) return new Date(now.getFullYear(), endMonth, days)
} }
getStartYear() { getStartYear(step) {
var now = new Date() var now = new Date()
return new Date(now.getFullYear(), 0, 1) var year = now.getFullYear()
if (step !== null) {
year += step
} }
getEndYear() { return new Date(year, 0, 1)
}
getEndYear(step) {
var now = new Date() var now = new Date()
return new Date(now.getFullYear(), 11, 31) var year = now.getFullYear()
if (step !== null) {
year += step
}
return new Date(year, 11, 31)
} }
/** /**
* 获得本月天数 * 获得本月天数
* *
* @returns * @returns
*/ */
getMonthDays() { getMonthDays(step) {
var now = new Date() var now = new Date()
var nowMonth = now.getMonth() // 当前月 var nowMonth = now.getMonth() // 当前月
if (step !== null) {
nowMonth += step
}
var monthStartDate = new Date(now.getFullYear(), nowMonth, 1) var monthStartDate = new Date(now.getFullYear(), nowMonth, 1)
var monthEndDate = new Date(now.getFullYear(), nowMonth + 1, 1) var monthEndDate = new Date(now.getFullYear(), nowMonth + 1, 1)
var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24) var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24)
@ -188,19 +225,31 @@ class TimeDateRangeServiceImpl extends WidgetService {
if (element.options.attrs.default === null || typeof element.options.attrs.default === 'undefined' || !element.options.attrs.default.isDynamic) return null if (element.options.attrs.default === null || typeof element.options.attrs.default === 'undefined' || !element.options.attrs.default.isDynamic) return null
if (element.options.attrs.default.dkey === 0) { if (element.options.attrs.default.dkey === 0) {
// 本周 return [this.getStartDayOfWeek(0).getTime(), this.getEndDayOfWeek(0).getTime()]
return [this.getStartDayOfWeek().getTime(), this.getEndDayOfWeek().getTime()] }
if (element.options.attrs.default.dkey === 5) { // 上周
return [this.getStartDayOfWeek(-1).getTime(), this.getEndDayOfWeek(-1).getTime()]
} }
if (element.options.attrs.default.dkey === 1) { if (element.options.attrs.default.dkey === 1) {
return [this.getStartDayOfMonth().getTime(), this.getEndDayOfMonth().getTime()] return [this.getStartDayOfMonth(0).getTime(), this.getEndDayOfMonth(0).getTime()]
}
if (element.options.attrs.default.dkey === 6) { // 上月
return [this.getStartDayOfMonth(-1).getTime(), this.getEndDayOfMonth(-1).getTime()]
} }
if (element.options.attrs.default.dkey === 2) { if (element.options.attrs.default.dkey === 2) {
return [this.getStartQuarter().getTime(), this.getEndQuarter().getTime()] return [this.getStartQuarter(0).getTime(), this.getEndQuarter(0).getTime()]
} }
if (element.options.attrs.default.dkey === 7) { // 上季
return [this.getStartQuarter(-1).getTime(), this.getEndQuarter(-1).getTime()]
}
if (element.options.attrs.default.dkey === 3) { if (element.options.attrs.default.dkey === 3) {
return [this.getStartYear().getTime(), this.getEndYear().getTime()] return [this.getStartYear(0).getTime(), this.getEndYear(0).getTime()]
}
if (element.options.attrs.default.dkey === 8) { // 上年
return [this.getStartYear(-1).getTime(), this.getEndYear(-1).getTime()]
} }
if (element.options.attrs.default.dkey === 4) { if (element.options.attrs.default.dkey === 4) {
@ -294,6 +343,31 @@ class TimeDateRangeServiceImpl extends WidgetService {
isTimeWidget() { isTimeWidget() {
return true return true
} }
formatShortValues(values) {
if (!values || values.length === 0) {
return []
}
const labelFormat = 'yyyy-MM-dd'
let start = values[0]
let end = values[values.length - 1]
start = timeSection(start, 'datetime', labelFormat)[0]
end = timeSection(end, 'datetime', labelFormat)[1]
const results = [start, end]
return results
}
shortcuts() {
return [
{ 'text': 'dynamic_time.cweek', 'callBack': () => this.formatShortValues([this.getStartDayOfWeek(0).getTime(), this.getEndDayOfWeek(0).getTime()]) },
{ 'text': 'dynamic_month.current', 'callBack': () => this.formatShortValues([this.getStartDayOfMonth(0).getTime(), this.getEndDayOfMonth(0).getTime()]) },
{ 'text': 'dynamic_time.cquarter', 'callBack': () => this.formatShortValues([this.getStartQuarter(0).getTime(), this.getEndQuarter(0).getTime()]) },
{ 'text': 'dynamic_year.current', 'callBack': () => this.formatShortValues([this.getStartYear(0).getTime(), this.getEndYear(0).getTime()]) },
{ 'text': 'dynamic_time.lweek', 'callBack': () => this.formatShortValues([this.getStartDayOfWeek(-1).getTime(), this.getEndDayOfWeek(-1).getTime()]) },
{ 'text': 'dynamic_month.last', 'callBack': () => this.formatShortValues([this.getStartDayOfMonth(-1).getTime(), this.getEndDayOfMonth(-1).getTime()]) },
{ 'text': 'dynamic_time.lquarter', 'callBack': () => this.formatShortValues([this.getStartQuarter(-1).getTime(), this.getEndQuarter(-1).getTime()]) },
{ 'text': 'dynamic_year.last', 'callBack': () => this.formatShortValues([this.getStartYear(-1).getTime(), this.getEndYear(-1).getTime()]) }
]
}
} }
const timeDateRangeServiceImpl = new TimeDateRangeServiceImpl() const timeDateRangeServiceImpl = new TimeDateRangeServiceImpl()
export default timeDateRangeServiceImpl export default timeDateRangeServiceImpl

View File

@ -29,6 +29,7 @@ const dialogPanel = {
{ value: 0, text: 'dynamic_time.today' }, { value: 0, text: 'dynamic_time.today' },
{ value: 1, text: 'dynamic_time.yesterday' }, { value: 1, text: 'dynamic_time.yesterday' },
{ value: 2, text: 'dynamic_time.firstOfMonth' }, { value: 2, text: 'dynamic_time.firstOfMonth' },
{ value: 4, text: 'dynamic_time.firstOfYear' },
{ value: 3, text: 'dynamic_time.custom' } { value: 3, text: 'dynamic_time.custom' }
], ],
custom: { custom: {
@ -101,6 +102,9 @@ class TimeDateServiceImpl extends WidgetService {
defaultSetting() { defaultSetting() {
return dialogPanel.options.attrs.default return dialogPanel.options.attrs.default
} }
customValue() {
return 3
}
dynamicDateFormNow(element) { dynamicDateFormNow(element) {
if (element.options.attrs.default === null || typeof element.options.attrs.default === 'undefined' || !element.options.attrs.default.isDynamic) return null if (element.options.attrs.default === null || typeof element.options.attrs.default === 'undefined' || !element.options.attrs.default.isDynamic) return null
@ -119,6 +123,11 @@ class TimeDateServiceImpl extends WidgetService {
var nowYear = now.getFullYear() var nowYear = now.getFullYear()
return new Date(nowYear, nowMonth, 1).getTime() return new Date(nowYear, nowMonth, 1).getTime()
} }
if (element.options.attrs.default.dkey === 4) {
const now = new Date()
const nowYear = now.getFullYear()
return new Date(nowYear, 0, 1).getTime()
}
if (element.options.attrs.default.dkey === 3) { if (element.options.attrs.default.dkey === 3) {
const dynamicPrefix = parseInt(element.options.attrs.default.dynamicPrefix) const dynamicPrefix = parseInt(element.options.attrs.default.dynamicPrefix)

View File

@ -27,6 +27,7 @@ const dialogPanel = {
{ value: 0, text: 'dynamic_month.current' }, { value: 0, text: 'dynamic_month.current' },
{ value: 1, text: 'dynamic_month.last' }, { value: 1, text: 'dynamic_month.last' },
{ value: 2, text: 'dynamic_month.firstOfYear' }, { value: 2, text: 'dynamic_month.firstOfYear' },
{ value: 4, text: 'dynamic_month.sameMonthLastYear' },
{ value: 3, text: 'dynamic_time.custom' } { value: 3, text: 'dynamic_time.custom' }
], ],
custom: { custom: {
@ -91,6 +92,9 @@ class TimeMonthServiceImpl extends WidgetService {
defaultSetting() { defaultSetting() {
return dialogPanel.options.attrs.default return dialogPanel.options.attrs.default
} }
customValue() {
return 3
}
dynamicDateFormNow(element) { dynamicDateFormNow(element) {
const now = new Date() const now = new Date()
const nowMonth = now.getMonth() const nowMonth = now.getMonth()
@ -108,6 +112,9 @@ class TimeMonthServiceImpl extends WidgetService {
if (element.options.attrs.default.dkey === 2) { if (element.options.attrs.default.dkey === 2) {
return new Date(nowYear, 0, 1).getTime() return new Date(nowYear, 0, 1).getTime()
} }
if (element.options.attrs.default.dkey === 4) {
return new Date(nowYear - 1, nowMonth, 1).getTime()
}
if (element.options.attrs.default.dkey === 3) { if (element.options.attrs.default.dkey === 3) {
const dynamicPrefix = parseInt(element.options.attrs.default.dynamicPrefix) const dynamicPrefix = parseInt(element.options.attrs.default.dynamicPrefix)

View File

@ -77,6 +77,9 @@ class TimeYearServiceImpl extends WidgetService {
const value = JSON.parse(JSON.stringify(dialogPanel)) const value = JSON.parse(JSON.stringify(dialogPanel))
return value return value
} }
customValue() {
return 2
}
initDrawPanel() { initDrawPanel() {
const value = JSON.parse(JSON.stringify(drawPanel)) const value = JSON.parse(JSON.stringify(drawPanel))

View File

@ -2288,6 +2288,7 @@ export default {
today: 'Today', today: 'Today',
yesterday: 'Yesterday', yesterday: 'Yesterday',
firstOfMonth: 'Month Beginning', firstOfMonth: 'Month Beginning',
firstOfYear: 'Year Beginning',
custom: 'Custom', custom: 'Custom',
date: 'date', date: 'date',
week: 'week', week: 'week',
@ -2299,8 +2300,10 @@ export default {
set: 'Set', set: 'Set',
cweek: 'This Week', cweek: 'This Week',
lweek: 'Last Week',
cmonth: 'This Month', cmonth: 'This Month',
cquarter: 'This Quarter', cquarter: 'This Quarter',
lquarter: 'Last Quarter',
cyear: 'This Year', cyear: 'This Year',
openHomePage: 'Show Home Page' openHomePage: 'Show Home Page'
}, },

View File

@ -2298,6 +2298,7 @@ export default {
today: '今天', today: '今天',
yesterday: '昨天', yesterday: '昨天',
firstOfMonth: '月初', firstOfMonth: '月初',
firstOfYear: '年初',
custom: '自定義', custom: '自定義',
date: '日', date: '日',
week: '周', week: '周',
@ -2309,8 +2310,10 @@ export default {
set: '設置', set: '設置',
cweek: '本周', cweek: '本周',
lweek: '上周',
cmonth: '本月', cmonth: '本月',
cquarter: '本季', cquarter: '本季',
lquarter: '上季',
cyear: '本年' cyear: '本年'
}, },
dynamic_year: { dynamic_year: {

View File

@ -2310,6 +2310,7 @@ export default {
today: '今天', today: '今天',
yesterday: '昨天', yesterday: '昨天',
firstOfMonth: '月初', firstOfMonth: '月初',
firstOfYear: '年初',
custom: '自定义', custom: '自定义',
date: '日', date: '日',
week: '周', week: '周',
@ -2321,8 +2322,10 @@ export default {
set: '设置', set: '设置',
cweek: '本周', cweek: '本周',
lweek: '上周',
cmonth: '本月', cmonth: '本月',
cquarter: '本季', cquarter: '本季',
lquarter: '上季',
cyear: '本年' cyear: '本年'
}, },
dynamic_year: { dynamic_year: {
@ -2336,7 +2339,8 @@ export default {
dynamic: '动态年月', dynamic: '动态年月',
current: '当月', current: '当月',
last: '上月', last: '上月',
firstOfYear: '当年首月' firstOfYear: '当年首月',
sameMonthLastYear: '去年同月'
}, },
wizard: { wizard: {
welcome_title: '欢迎使用DataEase', welcome_title: '欢迎使用DataEase',

View File

@ -994,6 +994,7 @@ div:focus {
} }
.de-form-item { .de-form-item {
.el-form-item__label { .el-form-item__label {
width: 100% !important; width: 100% !important;
@ -1168,3 +1169,6 @@ div:focus {
color: var(--deTextPrimary, #1F2329) !important; color: var(--deTextPrimary, #1F2329) !important;
} }
.date-filter-poper>.el-scrollbar>.el-select-dropdown__wrap {
max-height: 230px !important;
}

View File

@ -1,6 +1,6 @@
<template> <template>
<div v-if="element" class="default-value-div"> <div v-if="element" class="default-value-div">
<el-form ref="form" :model="element.options.attrs.default" label-width="100px"> <el-form ref="form" :model="element.options.attrs.default" label-width="100px" size="mini">
<el-form-item :label="$t('dynamic_time.set_default')"> <el-form-item :label="$t('dynamic_time.set_default')">
<el-radio-group v-model="element.options.attrs.default.isDynamic" @change="dynamicChange"> <el-radio-group v-model="element.options.attrs.default.isDynamic" @change="dynamicChange">
@ -22,6 +22,7 @@
v-model="element.options.attrs.default.dkey" v-model="element.options.attrs.default.dkey"
placeholder="" placeholder=""
class="relative-time" class="relative-time"
popper-class="date-filter-poper"
@change="dkeyChange" @change="dkeyChange"
> >
<el-option <el-option
@ -38,7 +39,7 @@
<div class="inline"> <div class="inline">
<el-form-item <el-form-item
v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === (defaultSetting.relativeOptions.length - 1)" v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === customValue"
label="" label=""
> >
<el-input-number <el-input-number
@ -52,7 +53,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === (defaultSetting.relativeOptions.length - 1)" v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === customValue"
label="" label=""
class="no-label-item" class="no-label-item"
> >
@ -74,7 +75,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === (defaultSetting.relativeOptions.length - 1)" v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === customValue"
label="" label=""
class="no-label-item" class="no-label-item"
> >
@ -147,7 +148,7 @@ export default {
return widget.isTimeWidget && widget.isTimeWidget() return widget.isTimeWidget && widget.isTimeWidget()
}, },
componentType() { componentType() {
let result = 'date' let result = this.element.options.attrs.type
if (this.isTimeWidget && this.element.options.attrs.showTime) { if (this.isTimeWidget && this.element.options.attrs.showTime) {
result = 'datetime' result = 'datetime'
} }
@ -158,7 +159,14 @@ export default {
if (this.isTimeWidget && this.element.options.attrs.showTime && this.element.options.attrs.accuracy) { if (this.isTimeWidget && this.element.options.attrs.showTime && this.element.options.attrs.accuracy) {
return result + ' ' + this.element.options.attrs.accuracy return result + ' ' + this.element.options.attrs.accuracy
} }
return result return null
},
customValue() {
const widget = ApplicationContext.getService(this.element.serviceName)
if (widget.customValue) {
return widget.customValue()
}
return 2
} }
}, },
created() { created() {

View File

@ -1,6 +1,6 @@
<template> <template>
<div v-if="element"> <div v-if="element">
<el-form ref="form" :model="element.options.attrs.default" label-width="100px"> <el-form ref="form" :model="element.options.attrs.default" label-width="100px" size="mini">
<el-form-item :label="$t('dynamic_time.set_default')"> <el-form-item :label="$t('dynamic_time.set_default')">
<el-radio-group v-model="element.options.attrs.default.isDynamic" @change="dynamicChange"> <el-radio-group v-model="element.options.attrs.default.isDynamic" @change="dynamicChange">
@ -15,6 +15,7 @@
v-model="element.options.attrs.default.dkey" v-model="element.options.attrs.default.dkey"
placeholder="" placeholder=""
class="relative-time" class="relative-time"
popper-class="date-filter-poper"
@change="dkeyChange" @change="dkeyChange"
> >
<el-option :label="$t('dynamic_time.cweek')" :value="0" /> <el-option :label="$t('dynamic_time.cweek')" :value="0" />
@ -22,6 +23,11 @@
<el-option :label="$t('dynamic_time.cquarter')" :value="2" /> <el-option :label="$t('dynamic_time.cquarter')" :value="2" />
<el-option :label="$t('dynamic_time.cyear')" :value="3" /> <el-option :label="$t('dynamic_time.cyear')" :value="3" />
<el-option :label="$t('dynamic_time.lweek')" :value="5" />
<el-option :label="$t('dynamic_month.last')" :value="6" />
<el-option :label="$t('dynamic_time.lquarter')" :value="7" />
<el-option :label="$t('dynamic_year.last')" :value="8" />
<el-option :label="$t('dynamic_time.custom')" :value="4" /> <el-option :label="$t('dynamic_time.custom')" :value="4" />
</el-select> </el-select>