diff --git a/frontend/src/components/widget/DeWidget/DeDate.vue b/frontend/src/components/widget/DeWidget/DeDate.vue index fc8adad0d5..39176372d6 100644 --- a/frontend/src/components/widget/DeWidget/DeDate.vue +++ b/frontend/src/components/widget/DeWidget/DeDate.vue @@ -72,7 +72,8 @@ export default { this.setCondition() }, 'defaultValueStr': function(value, old) { - if (this.element.serviceName === 'timeDateWidget' && this.element.options.attrs.default.isDynamic) { + if ((this.element.serviceName === 'timeDateWidget' || this.element.serviceName === 'timeDateRangeWidget') && + this.element.options.attrs.default.isDynamic) { // 如果设置了动态时间 不做任何操作 return } @@ -82,7 +83,7 @@ export default { }, 'defaultoptions': function(val, old) { // console.log('default chaneg') - if (this.element.serviceName !== 'timeDateWidget') { + if (this.element.serviceName !== 'timeDateWidget' || this.element.serviceName === 'timeDateRangeWidget') { if (!this.element.options.attrs.default.isDynamic) { this.values = this.fillValueDerfault() this.dateChange(this.values) @@ -96,7 +97,8 @@ export default { } }, created() { - if (this.element.serviceName === 'timeDateWidget' && this.element.options.attrs.default && this.element.options + if ((this.element.serviceName === 'timeDateWidget' || this.element.serviceName === 'timeDateRangeWidget') && this + .element.options.attrs.default && this.element.options .attrs.default.isDynamic) { if (this.element.options.attrs.default) { const widget = ApplicationContext.getService(this.element.serviceName) @@ -177,10 +179,16 @@ export default { fillValueDerfault() { const defaultV = this.element.options.value === null ? '' : this.element.options.value.toString() if (this.element.options.attrs.type === 'daterange') { - if (defaultV === null || typeof defaultV === 'undefined' || defaultV === '' || defaultV === '[object Object]') { return [] } + if (defaultV === null || typeof defaultV === 'undefined' || defaultV === '' || defaultV === + '[object Object]') { + return [] + } return defaultV.split(',').map(item => parseFloat(item)) } else { - if (defaultV === null || typeof defaultV === 'undefined' || defaultV === '' || defaultV === '[object Object]') { return null } + if (defaultV === null || typeof defaultV === 'undefined' || defaultV === '' || defaultV === + '[object Object]') { + return null + } return parseFloat(defaultV.split(',')[0]) } } diff --git a/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js index 71888b44ee..34edf26be4 100644 --- a/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js @@ -1,4 +1,6 @@ -import { WidgetService } from '../service/WidgetService' +import { + WidgetService +} from '../service/WidgetService' const leftPanel = { icon: 'iconfont icon-riqi', @@ -15,7 +17,17 @@ const dialogPanel = { endPlaceholder: 'dedaterange.to_placeholder', viewIds: [], fieldId: '', - dragItems: [] + dragItems: [], + default: { + isDynamic: false, + dkey: 0, + sDynamicPrefix: 1, + sDynamicInfill: 'day', + sDynamicSuffix: 'before', + eDynamicPrefix: 1, + eDynamicInfill: 'day', + eDynamicSuffix: 'after' + } }, value: '' }, @@ -40,7 +52,9 @@ const drawPanel = { class TimeDateRangeServiceImpl extends WidgetService { constructor(options = {}) { - Object.assign(options, { name: 'timeDateRangeWidget' }) + Object.assign(options, { + name: 'timeDateRangeWidget' + }) super(options) this.filterDialog = true this.showSwitch = false @@ -66,6 +80,150 @@ class TimeDateRangeServiceImpl extends WidgetService { return field['deType'] === 1 }) } + getStartDayOfWeek() { + var now = new Date() // 当前日期 + var nowDayOfWeek = now.getDay() + var nowDay = now.getDate() // 当前日 + var nowMonth = now.getMonth() // 当前月 + var day = nowDayOfWeek || 7 + return new Date(now.getFullYear(), nowMonth, nowDay + 1 - day) + } + getEndDayOfWeek() { + var now = new Date() // 当前日期 + var nowDayOfWeek = now.getDay() + var nowDay = now.getDate() // 当前日 + var nowMonth = now.getMonth() // 当前月 + var day = nowDayOfWeek || 7 + return new Date(now.getFullYear(), nowMonth, nowDay + 7 - day) + } + getStartDayOfMonth() { + var now = new Date() + var nowMonth = now.getMonth() // 当前月 + var monthStartDate = new Date(now.getFullYear(), nowMonth, 1) + return monthStartDate + } + getEndDayOfMonth() { + var now = new Date() + var nowMonth = now.getMonth() // 当前月 + var monthEndDate = new Date(now.getFullYear(), nowMonth, this.getMonthDays()) + return monthEndDate + } + getStartQuarter() { + var now = new Date() + var nowMonth = now.getMonth() + const startMonth = Math.floor((nowMonth / 3)) * 3 + return new Date(now.getFullYear(), startMonth, 1) + } + getEndQuarter() { + var now = new Date() + var nowMonth = now.getMonth() + const endMonth = Math.floor((nowMonth / 3)) * 3 + (nowMonth % 3) + const days = (endMonth === 5 || endMonth === 8) ? 30 : 31 + return new Date(now.getFullYear(), endMonth, days) + } + getStartYear() { + var now = new Date() + return new Date(now.getFullYear(), 0, 1) + } + getEndYear() { + var now = new Date() + return new Date(now.getFullYear(), 11, 31) + } + /** + * 获得本月天数 + * + * @returns + */ + getMonthDays() { + var now = new Date() + var nowMonth = now.getMonth() // 当前月 + var monthStartDate = new Date(now.getFullYear(), nowMonth, 1) + var monthEndDate = new Date(now.getFullYear(), nowMonth + 1, 1) + var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24) + return days + } + customTime(dynamicPrefix, dynamicInfill, dynamicSuffix) { + if (dynamicInfill === 'day') { + const oneday = 24 * 3600 * 1000 + const step = oneday * dynamicPrefix + return dynamicSuffix === 'before' ? (Date.now() - step) : (Date.now() + step) + } + if (dynamicInfill === 'week') { + const oneday = 24 * 3600 * 1000 + const step = oneday * dynamicPrefix * 7 + return dynamicSuffix === 'before' ? (Date.now() - step) : (Date.now() + step) + } + if (dynamicInfill === 'month') { + const now = new Date() + const nowMonth = now.getMonth() + const nowYear = now.getFullYear() + const nowDate = now.getDate() + + const tarYear = nowYear + if (dynamicSuffix === 'before') { + const deffMonth = nowMonth - dynamicPrefix + let diffYear = deffMonth / 12 + if (deffMonth < 0) { + diffYear -= 1 + } + return new Date(tarYear + diffYear, nowMonth - dynamicPrefix % 12, nowDate).getTime() + } else { + const deffMonth = nowMonth + dynamicPrefix + const diffYear = deffMonth / 12 + return new Date(tarYear + diffYear, deffMonth % 12, nowDate).getTime() + } + } + if (dynamicInfill === 'year') { + const now = new Date() + const nowMonth = now.getMonth() + const nowYear = now.getFullYear() + const nowDate = now.getDate() + + return new Date(dynamicSuffix === 'before' ? (nowYear - dynamicPrefix) : (nowYear + dynamicPrefix), nowMonth, nowDate).getTime() + } + } + 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.dkey === 0) { + // 本周 + return [this.getStartDayOfWeek().getTime(), this.getEndDayOfWeek().getTime()] + } + + if (element.options.attrs.default.dkey === 1) { + return [this.getStartDayOfMonth().getTime(), this.getEndDayOfMonth().getTime()] + } + + if (element.options.attrs.default.dkey === 2) { + return [this.getStartQuarter().getTime(), this.getEndQuarter().getTime()] + } + if (element.options.attrs.default.dkey === 3) { + return [this.getStartYear().getTime(), this.getEndYear().getTime()] + } + + if (element.options.attrs.default.dkey === 4) { + const sDynamicPrefix = parseInt(element.options.attrs.default.sDynamicPrefix) + const sDynamicInfill = element.options.attrs.default.sDynamicInfill + const sDynamicSuffix = element.options.attrs.default.sDynamicSuffix + + const eDynamicPrefix = parseInt(element.options.attrs.default.eDynamicPrefix) + const eDynamicInfill = element.options.attrs.default.eDynamicInfill + const eDynamicSuffix = element.options.attrs.default.eDynamicSuffix + const startTime = this.customTime(sDynamicPrefix, sDynamicInfill, sDynamicSuffix) + const endTime = this.customTime(eDynamicPrefix, eDynamicInfill, eDynamicSuffix) + return [startTime, endTime] + } + } + validDynamicValue(element) { + if (!element.options.attrs.default.isDynamic) return true + if (element.options.attrs.default.dkey !== 4) return true + try { + const arr = this.dynamicDateFormNow(element) + return arr[0] < arr[1] + } catch (error) { + return false + } + } } const timeDateRangeServiceImpl = new TimeDateRangeServiceImpl() export default timeDateRangeServiceImpl diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 962fc39f23..eeda3951bd 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1723,5 +1723,28 @@ export default { complex_repeat: 'Complex repeat', pixel_tip: 'Please code custom pixel(such as 2560 * 1600) or select' + }, + dynamic_time: { + set_default: 'Set Default', + fix: 'Fixed Time', + dynamic: 'Dynamic Time', + relative: 'Relative Current', + today: 'Today', + yesterday: 'Yesterday', + firstOfMonth: 'Month Beginning', + custom: 'Custom', + date: 'date', + week: 'week', + month: 'Month', + year: 'Year', + before: 'Before', + after: 'After', + preview: 'Preview', + set: 'Set', + + cweek: 'This Week', + cmonth: 'This Month', + cquarter: 'This Quarter', + cyear: 'This Year' } } diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index fcf72b0913..0254c55d0c 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -1735,5 +1735,28 @@ export default { complex_repeat: '複雜重複', pixel_tip: '可直接輸入分辨率(例如:2560 * 1600)或者選擇' + }, + dynamic_time: { + set_default: '設置默認值', + fix: '固定時間', + dynamic: '動態時間', + relative: '相對當前', + today: '今天', + yesterday: '昨天', + firstOfMonth: '月初', + custom: '自定義', + date: '日', + week: '周', + month: '月', + year: '年', + before: '前', + after: '後', + preview: '預覽', + set: '設置', + + cweek: '本周', + cmonth: '本月', + cquarter: '本季', + cyear: '本年' } } diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 383bb91178..c4f38acd2e 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1745,5 +1745,28 @@ export default { complex_repeat: '复杂重复', pixel_tip: '可直接输入自定义分辨率(例如:2560 * 1600)或选择' + }, + dynamic_time: { + set_default: '设置默认值', + fix: '固定时间', + dynamic: '动态时间', + relative: '相对当前', + today: '今天', + yesterday: '昨天', + firstOfMonth: '月初', + custom: '自定义', + date: '日', + week: '周', + month: '月', + year: '年', + before: '前', + after: '后', + preview: '预览', + set: '设置', + + cweek: '本周', + cmonth: '本月', + cquarter: '本季', + cyear: '本年' } } diff --git a/frontend/src/styles/index.scss b/frontend/src/styles/index.scss index e8209f8d57..e0da947fbb 100644 --- a/frontend/src/styles/index.scss +++ b/frontend/src/styles/index.scss @@ -94,7 +94,7 @@ div:focus { .de-filter-dialog { min-width: 500px !important; - width: 50% !important; + width: 55% !important; .el-dialog__header { // background-color: #f4f4f5; diff --git a/frontend/src/views/panel/filter/defaultValue/DeDateDefault.vue b/frontend/src/views/panel/filter/defaultValue/DeDateDefault.vue index 4c3765a331..f6ce1acaa3 100644 --- a/frontend/src/views/panel/filter/defaultValue/DeDateDefault.vue +++ b/frontend/src/views/panel/filter/defaultValue/DeDateDefault.vue @@ -2,20 +2,20 @@