Merge branch 'dev' of github.com:dataease/dataease into dev

This commit is contained in:
taojinlong 2021-12-27 21:33:56 +08:00
commit 29dd75617e
16 changed files with 595 additions and 56 deletions

View File

@ -98,9 +98,6 @@
#{item} #{item}
</foreach> </foreach>
</if> </if>
<if test='record.modelType != null and record.modelType == "dataset"'>
or (v_auth_model.`model_inner_type` = 'group' and v_auth_model.model_type = 'dataset')
</if>
ORDER BY v_auth_model.node_type desc, CONVERT(v_auth_model.label using gbk) asc ORDER BY v_auth_model.node_type desc, CONVERT(v_auth_model.label using gbk) asc
</select> </select>

View File

@ -456,12 +456,12 @@ public class DataSetTableService {
RowPermissionService rowPermissionService = SpringContextUtil.getBean(RowPermissionService.class); RowPermissionService rowPermissionService = SpringContextUtil.getBean(RowPermissionService.class);
CurrentUserDto user = AuthUtils.getUser(); CurrentUserDto user = AuthUtils.getUser();
userId = user != null ? user.getUserId() : userId; userId = user != null ? user.getUserId() : userId;
List<Long> roleIds ; List<Long> roleIds;
Long deptId ; Long deptId;
if(user != null){ if (user != null) {
deptId = user.getDeptId(); deptId = user.getDeptId();
roleIds = user.getRoles().stream().map(CurrentRoleDto::getId).collect(Collectors.toList()); roleIds = user.getRoles().stream().map(CurrentRoleDto::getId).collect(Collectors.toList());
}else { } else {
deptId = authUserService.getUserById(userId).getDeptId(); deptId = authUserService.getUserById(userId).getDeptId();
roleIds = authUserService.roles(userId).stream().map(r -> Long.valueOf(r)).collect(Collectors.toList()); roleIds = authUserService.roles(userId).stream().map(r -> Long.valueOf(r)).collect(Collectors.toList());
} }
@ -491,20 +491,24 @@ public class DataSetTableService {
public List<ChartFieldCustomFilterDTO> getCustomFilters(List<DatasetTableField> fields, DatasetTable datasetTable, Long user) { public List<ChartFieldCustomFilterDTO> getCustomFilters(List<DatasetTableField> fields, DatasetTable datasetTable, Long user) {
List<ChartFieldCustomFilterDTO> customFilter = new ArrayList<>(); List<ChartFieldCustomFilterDTO> customFilter = new ArrayList<>();
for (DatasetRowPermissions datasetRowPermissions : rowPermissions(datasetTable.getId(), user)){ for (DatasetRowPermissions datasetRowPermissions : rowPermissions(datasetTable.getId(), user)) {
ChartFieldCustomFilterDTO dto = new ChartFieldCustomFilterDTO(); ChartFieldCustomFilterDTO dto = new ChartFieldCustomFilterDTO();
DatasetTableField field = getFieldById(fields, datasetRowPermissions.getDatasetFieldId()); DatasetTableField field = getFieldById(fields, datasetRowPermissions.getDatasetFieldId());
if(field == null){continue;} if (field == null) {
continue;
}
dto.setField(field); dto.setField(field);
dto.setId(field.getId()); dto.setId(field.getId());
dto.setFilterType(datasetRowPermissions.getFilterType()); dto.setFilterType(datasetRowPermissions.getFilterType());
if(datasetRowPermissions.getFilterType().equalsIgnoreCase("logic")){ if (datasetRowPermissions.getFilterType().equalsIgnoreCase("logic")) {
List<ChartCustomFilterItemDTO> lists = JSONObject.parseArray(datasetRowPermissions.getFilter(), ChartCustomFilterItemDTO.class); List<ChartCustomFilterItemDTO> lists = JSONObject.parseArray(datasetRowPermissions.getFilter(), ChartCustomFilterItemDTO.class);
lists.forEach(chartCustomFilterDTO -> { chartCustomFilterDTO.setFieldId(field.getId()); }); lists.forEach(chartCustomFilterDTO -> {
chartCustomFilterDTO.setFieldId(field.getId());
});
dto.setFilter(lists); dto.setFilter(lists);
dto.setLogic(datasetRowPermissions.getLogic()); dto.setLogic(datasetRowPermissions.getLogic());
customFilter.add(dto); customFilter.add(dto);
}else { } else {
dto.setEnumCheckField(Arrays.asList(datasetRowPermissions.getEnumCheckField().split(",").clone())); dto.setEnumCheckField(Arrays.asList(datasetRowPermissions.getEnumCheckField().split(",").clone()));
customFilter.add(dto); customFilter.add(dto);
} }
@ -1308,9 +1312,9 @@ public class DataSetTableService {
DatasetTableField parentField = dataSetTableFieldsService.get(unionItemDTO.getParentField().getId()); DatasetTableField parentField = dataSetTableFieldsService.get(unionItemDTO.getParentField().getId());
DatasetTableField currentField = dataSetTableFieldsService.get(unionItemDTO.getCurrentField().getId()); DatasetTableField currentField = dataSetTableFieldsService.get(unionItemDTO.getCurrentField().getId());
join.append(String.format(keyword, parentTableName)).append(".").append(parentField.getOriginName()) join.append(String.format(keyword, parentTableName)).append(".").append(String.format(keyword, parentField.getOriginName()))
.append(" = ") .append(" = ")
.append(String.format(keyword, currentTableName)).append(".").append(currentField.getOriginName()); .append(String.format(keyword, currentTableName)).append(".").append(String.format(keyword, currentField.getOriginName()));
if (i < unionParamDTO.getUnionFields().size() - 1) { if (i < unionParamDTO.getUnionFields().size() - 1) {
join.append(" AND "); join.append(" AND ");
} }

View File

@ -15,6 +15,7 @@
:out-style="config.style" :out-style="config.style"
:element="config" :element="config"
:in-screen="inScreen" :in-screen="inScreen"
:edit-mode="'preview'"
:h="config.style.height" :h="config.style.height"
/> />
<component <component

View File

@ -1,4 +1,7 @@
import { BASE_MOBILE_STYLE, HYPERLINKS } from '@/components/canvas/custom-component/component-list' import {
BASE_MOBILE_STYLE,
HYPERLINKS
} from '@/components/canvas/custom-component/component-list'
export function deepCopy(target) { export function deepCopy(target) {
if (typeof target === 'object') { if (typeof target === 'object') {
@ -61,7 +64,7 @@ export function mobile2MainCanvas(mainSource, mobileSource) {
export function panelInit(componentDatas) { export function panelInit(componentDatas) {
componentDatas.forEach(item => { componentDatas.forEach(item => {
if (item.component && item.component === 'de-date') { if (item.component && item.component === 'de-date') {
if (item.options.attrs && !item.options.attrs.default) { if (item.serviceName === 'timeDateWidget' && item.options.attrs && !item.options.attrs.default) {
item.options.attrs.default = { item.options.attrs.default = {
isDynamic: false, isDynamic: false,
dkey: 0, dkey: 0,
@ -70,6 +73,18 @@ export function panelInit(componentDatas) {
dynamicSuffix: 'before' dynamicSuffix: 'before'
} }
} }
if (item.serviceName === 'timeDateRangeWidget' && item.options.attrs && !item.options.attrs.default) {
item.options.attrs.default = {
isDynamic: false,
dkey: 0,
sDynamicPrefix: 1,
sDynamicInfill: 'day',
sDynamicSuffix: 'before',
eDynamicPrefix: 1,
eDynamicInfill: 'day',
eDynamicSuffix: 'after'
}
}
} }
if (item.filters && item.filters.length > 0) { if (item.filters && item.filters.length > 0) {
item.filters = [] item.filters = []

View File

@ -44,6 +44,7 @@
<script> <script>
import elementResizeDetectorMaker from 'element-resize-detector' import elementResizeDetectorMaker from 'element-resize-detector'
import { mapState } from 'vuex'
export default { export default {
name: 'DeOutWidget', name: 'DeOutWidget',
props: { props: {
@ -63,6 +64,11 @@ export default {
h: { h: {
type: Number, type: Number,
default: 50 default: 50
},
editMode: {
type: String,
require: false,
default: 'edit'
} }
}, },
data() { data() {
@ -70,26 +76,30 @@ export default {
inputMaxSize: 46, inputMaxSize: 46,
inputLargeSize: 42, inputLargeSize: 42,
inputSmallSize: 38, inputSmallSize: 38,
inputMiniSize: 34, inputMiniSize: 32,
options: null, options: null,
showNumber: false, showNumber: false,
mainClass: '' mainClass: '',
mainHeight: 75,
duHeight: 46
} }
}, },
computed: { computed: {
sizeInfo() { sizeInfo() {
let size let size
if (this.h > this.inputMaxSize) { if (this.duHeight > this.inputMaxSize) {
return size } else if (this.duHeight > this.inputLargeSize) {
} else if (this.h > this.inputLargeSize) {
size = 'medium' size = 'medium'
} else if (this.h > this.inputSmallSize) { } else if (this.duHeight > this.inputSmallSize) {
size = 'small' size = 'small'
} else { } else {
size = 'mini' size = 'mini'
} }
return size return size
} },
...mapState([
'curCanvasScale'
])
}, },
mounted() { mounted() {
this.watchSize() this.watchSize()
@ -102,12 +112,16 @@ export default {
watchSize() { watchSize() {
const erd = elementResizeDetectorMaker() const erd = elementResizeDetectorMaker()
erd.listenTo(this.$refs.myContainer, ele => { erd.listenTo(this.$refs.myContainer, ele => {
const deContentContainer = this.$refs.deContentContainer
const height = ele.offsetHeight
this.mainHeight = height
if (!this.element.options.attrs.title) { if (!this.element.options.attrs.title) {
this.duHeight = this.mainHeight
deContentContainer.style.marginLeft = '0px'
return return
} }
const height = ele.offsetHeight
const titleWidth = this.$refs.deTitle.offsetWidth const titleWidth = this.$refs.deTitle.offsetWidth
const deContentContainer = this.$refs.deContentContainer this.duHeight = height - titleWidth
this.$nextTick(() => { this.$nextTick(() => {
let min = this.element.style.fontSize * 2 + 50 let min = this.element.style.fontSize * 2 + 50
if (this.element.component === 'de-number-range') { if (this.element.component === 'de-number-range') {

View File

@ -72,7 +72,8 @@ export default {
this.setCondition() this.setCondition()
}, },
'defaultValueStr': function(value, old) { '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 return
} }
@ -82,7 +83,7 @@ export default {
}, },
'defaultoptions': function(val, old) { 'defaultoptions': function(val, old) {
// console.log('default chaneg') // 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) { if (!this.element.options.attrs.default.isDynamic) {
this.values = this.fillValueDerfault() this.values = this.fillValueDerfault()
this.dateChange(this.values) this.dateChange(this.values)
@ -96,7 +97,8 @@ export default {
} }
}, },
created() { 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) { .attrs.default.isDynamic) {
if (this.element.options.attrs.default) { if (this.element.options.attrs.default) {
const widget = ApplicationContext.getService(this.element.serviceName) const widget = ApplicationContext.getService(this.element.serviceName)
@ -177,10 +179,16 @@ export default {
fillValueDerfault() { fillValueDerfault() {
const defaultV = this.element.options.value === null ? '' : this.element.options.value.toString() const defaultV = this.element.options.value === null ? '' : this.element.options.value.toString()
if (this.element.options.attrs.type === 'daterange') { 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)) return defaultV.split(',').map(item => parseFloat(item))
} else { } 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]) return parseFloat(defaultV.split(',')[0])
} }
} }

View File

@ -1,4 +1,6 @@
import { WidgetService } from '../service/WidgetService' import {
WidgetService
} from '../service/WidgetService'
const leftPanel = { const leftPanel = {
icon: 'iconfont icon-riqi', icon: 'iconfont icon-riqi',
@ -15,7 +17,17 @@ const dialogPanel = {
endPlaceholder: 'dedaterange.to_placeholder', endPlaceholder: 'dedaterange.to_placeholder',
viewIds: [], viewIds: [],
fieldId: '', fieldId: '',
dragItems: [] dragItems: [],
default: {
isDynamic: false,
dkey: 0,
sDynamicPrefix: 1,
sDynamicInfill: 'day',
sDynamicSuffix: 'before',
eDynamicPrefix: 1,
eDynamicInfill: 'day',
eDynamicSuffix: 'after'
}
}, },
value: '' value: ''
}, },
@ -40,7 +52,9 @@ const drawPanel = {
class TimeDateRangeServiceImpl extends WidgetService { class TimeDateRangeServiceImpl extends WidgetService {
constructor(options = {}) { constructor(options = {}) {
Object.assign(options, { name: 'timeDateRangeWidget' }) Object.assign(options, {
name: 'timeDateRangeWidget'
})
super(options) super(options)
this.filterDialog = true this.filterDialog = true
this.showSwitch = false this.showSwitch = false
@ -66,6 +80,150 @@ class TimeDateRangeServiceImpl extends WidgetService {
return field['deType'] === 1 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() const timeDateRangeServiceImpl = new TimeDateRangeServiceImpl()
export default timeDateRangeServiceImpl export default timeDateRangeServiceImpl

View File

@ -1729,5 +1729,28 @@ export default {
complex_repeat: 'Complex repeat', complex_repeat: 'Complex repeat',
pixel_tip: 'Please code custom pixel(such as 2560 * 1600) or select' 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'
} }
} }

View File

@ -1741,5 +1741,28 @@ export default {
complex_repeat: '複雜重複', complex_repeat: '複雜重複',
pixel_tip: '可直接輸入分辨率(例如:2560 * 1600)或者選擇' 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: '本年'
} }
} }

View File

@ -1751,5 +1751,28 @@ export default {
complex_repeat: '复杂重复', complex_repeat: '复杂重复',
pixel_tip: '可直接输入自定义分辨率(例如:2560 * 1600)或选择' 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: '本年'
} }
} }

View File

@ -94,7 +94,7 @@ div:focus {
.de-filter-dialog { .de-filter-dialog {
min-width: 500px !important; min-width: 500px !important;
width: 50% !important; width: 55% !important;
.el-dialog__header { .el-dialog__header {
// background-color: #f4f4f5; // background-color: #f4f4f5;

View File

@ -2,20 +2,20 @@
<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">
<el-form-item label="设定默认值"> <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">
<el-radio :label="false">固定时间</el-radio> <el-radio :label="false">{{ $t('dynamic_time.fix') }}</el-radio>
<el-radio :label="true">动态时间</el-radio> <el-radio :label="true">{{ $t('dynamic_time.dynamic') }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item v-if="element.options.attrs.default.isDynamic" label="相对当前时间"> <el-form-item v-if="element.options.attrs.default.isDynamic" :label="$t('dynamic_time.relative')">
<el-select v-model="element.options.attrs.default.dkey" placeholder="" class="relative-time" @change="dkeyChange"> <el-select v-model="element.options.attrs.default.dkey" placeholder="" class="relative-time" @change="dkeyChange">
<el-option label="今天" :value="0" /> <el-option :label="$t('dynamic_time.today')" :value="0" />
<el-option label="昨天" :value="1" /> <el-option :label="$t('dynamic_time.yesterday')" :value="1" />
<el-option label="本月首日" :value="2" /> <el-option :label="$t('dynamic_time.firstOfMonth')" :value="2" />
<el-option label="自定义" :value="3" /> <el-option :label="$t('dynamic_time.custom')" :value="3" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -28,24 +28,24 @@
<el-form-item v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === 3" label="" class="no-label-item"> <el-form-item v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === 3" label="" class="no-label-item">
<el-select v-model="element.options.attrs.default.dynamicInfill" size="mini" placeholder="" @change="dynamicInfillChange"> <el-select v-model="element.options.attrs.default.dynamicInfill" size="mini" placeholder="" @change="dynamicInfillChange">
<el-option label="天" value="day" /> <el-option :label="$t('dynamic_time.date')" value="day" />
<el-option label="周" value="week" /> <el-option :label="$t('dynamic_time.week')" value="week" />
<el-option label="月" value="month" /> <el-option :label="$t('dynamic_time.month')" value="month" />
<el-option label="年" value="year" /> <el-option :label="$t('dynamic_time.year')" value="year" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === 3" label="" class="no-label-item"> <el-form-item v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === 3" label="" class="no-label-item">
<el-select v-model="element.options.attrs.default.dynamicSuffix" size="mini" placeholder="" @change="dynamicSuffixChange"> <el-select v-model="element.options.attrs.default.dynamicSuffix" size="mini" placeholder="" @change="dynamicSuffixChange">
<el-option label="前" value="before" /> <el-option :label="$t('dynamic_time.before')" value="before" />
<el-option label="后" value="after" /> <el-option :label="$t('dynamic_time.after')" value="after" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</div> </div>
<el-form-item v-if="element.options.attrs.default.isDynamic" label="预览"> <el-form-item v-if="element.options.attrs.default.isDynamic" :label="$t('dynamic_time.preview')">
<el-date-picker <el-date-picker
v-model="dval" v-model="dval"
type="date" type="date"
@ -55,7 +55,7 @@
/> />
</el-form-item> </el-form-item>
<el-form-item v-else label="设置"> <el-form-item v-else :label="$t('dynamic_time.set')">
<component <component
:is="element.component" :is="element.component"
:id="'component' + element.id" :id="'component' + element.id"

View File

@ -0,0 +1,243 @@
<template>
<div v-if="element">
<el-form ref="form" :model="element.options.attrs.default" label-width="100px">
<el-form-item :label="$t('dynamic_time.set_default')">
<el-radio-group v-model="element.options.attrs.default.isDynamic" @change="dynamicChange">
<el-radio :label="false">{{ $t('dynamic_time.fix') }}</el-radio>
<el-radio :label="true">{{ $t('dynamic_time.dynamic') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="element.options.attrs.default.isDynamic" :label="$t('dynamic_time.relative')">
<el-select
v-model="element.options.attrs.default.dkey"
placeholder=""
class="relative-time"
@change="dkeyChange"
>
<el-option :label="$t('dynamic_time.cweek')" :value="0" />
<el-option :label="$t('dynamic_time.cmonth')" :value="1" />
<el-option :label="$t('dynamic_time.cquarter')" :value="2" />
<el-option :label="$t('dynamic_time.cyear')" :value="3" />
<el-option :label="$t('dynamic_time.custom')" :value="4" />
</el-select>
</el-form-item>
<div class="inline-first">
<el-form-item
v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === 4"
:label="$t('dataset.start_time')"
>
<el-input
v-model="element.options.attrs.default.sDynamicPrefix"
type="number"
size="mini"
:min="1"
:max="10"
@input="sDynamicPrefixChange"
/>
</el-form-item>
<el-form-item
v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === 4"
label=""
class="no-label-item"
>
<el-select
v-model="element.options.attrs.default.sDynamicInfill"
size="mini"
placeholder=""
@change="dynamicInfillChange"
>
<el-option :label="$t('dynamic_time.date')" value="day" />
<el-option :label="$t('dynamic_time.week')" value="week" />
<el-option :label="$t('dynamic_time.month')" value="month" />
<el-option :label="$t('dynamic_time.year')" value="year" />
</el-select>
</el-form-item>
<el-form-item
v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === 4"
label=""
class="no-label-item"
>
<el-select
v-model="element.options.attrs.default.sDynamicSuffix"
size="mini"
placeholder=""
@change="dynamicSuffixChange"
>
<el-option :label="$t('dynamic_time.before')" value="before" />
<el-option :label="$t('dynamic_time.after')" value="after" />
</el-select>
</el-form-item>
</div>
<div class="inline-first">
<el-form-item
v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === 4"
:label="$t('dataset.end_time')"
>
<el-input
v-model="element.options.attrs.default.eDynamicPrefix"
type="number"
size="mini"
:min="1"
:max="10"
@input="eDynamicPrefixChange"
/>
</el-form-item>
<el-form-item
v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === 4"
label=""
class="no-label-item"
>
<el-select
v-model="element.options.attrs.default.eDynamicInfill"
size="mini"
placeholder=""
@change="dynamicInfillChange"
>
<el-option :label="$t('dynamic_time.date')" value="day" />
<el-option :label="$t('dynamic_time.week')" value="week" />
<el-option :label="$t('dynamic_time.month')" value="month" />
<el-option :label="$t('dynamic_time.year')" value="year" />
</el-select>
</el-form-item>
<el-form-item
v-if="element.options.attrs.default.isDynamic && element.options.attrs.default.dkey === 4"
label=""
class="no-label-item"
>
<el-select
v-model="element.options.attrs.default.eDynamicSuffix"
size="mini"
placeholder=""
@change="dynamicSuffixChange"
>
<el-option :label="$t('dynamic_time.before')" value="before" />
<el-option :label="$t('dynamic_time.after')" value="after" />
</el-select>
</el-form-item>
</div>
<el-form-item v-if="element.options.attrs.default.isDynamic" :label="$t('dynamic_time.preview')">
<el-date-picker
v-model="dval"
:type="element.options.attrs.type"
disabled
class="relative-time"
placeholder=""
/>
</el-form-item>
<el-form-item v-else :label="$t('dynamic_time.set')">
<component
:is="element.component"
:id="'component' + element.id"
:style="element.style"
:element="element"
class="relative-time"
:in-draw="false"
/>
</el-form-item>
</el-form>
</div>
</template>
<script>
import {
ApplicationContext
} from '@/utils/ApplicationContext'
import bus from '@/utils/bus'
export default {
name: 'DeDateRangeDefault',
props: {
element: {
type: Object,
default: null
}
},
data() {
return {
dval: null
}
},
created() {
this.setDval()
},
methods: {
dynamicChange(value) {
this.setDval()
},
dkeyChange(value) {
this.setDval()
},
sDynamicPrefixChange(value) {
if (value < 1) {
value = 1
this.element.options.attrs.default.sDynamicPrefix = 1
}
this.setDval()
},
eDynamicPrefixChange(value) {
if (value < 1) {
value = 1
this.element.options.attrs.default.eDynamicPrefix = 1
}
this.setDval()
},
dynamicInfillChange(value) {
this.setDval()
},
dynamicSuffixChange(value) {
this.setDval()
},
setDval() {
const widget = ApplicationContext.getService(this.element.serviceName)
const time = widget.dynamicDateFormNow(this.element)
this.dval = time
bus.$emit('valid-values-change', (!time || time.length === 0 || time[1] > time[0]))
}
}
}
</script>
<style lang="scss" scoped>
.inline-first,
.inline {
display: flex;
>>>.el-input--mini {
min-width: 70px;
}
}
.inline-first {
.el-form-item {
margin-bottom: 5px !important;
}
}
.relative-time {
width: 100%;
}
</style>

View File

@ -178,7 +178,7 @@ import draggable from 'vuedraggable'
import FilterHead from './filterMain/FilterHead' import FilterHead from './filterMain/FilterHead'
import FilterControl from './filterMain/FilterControl' import FilterControl from './filterMain/FilterControl'
import FilterFoot from './filterMain/FilterFoot' import FilterFoot from './filterMain/FilterFoot'
import bus from '@/utils/bus'
import { import {
mapState mapState
} from 'vuex' } from 'vuex'
@ -319,6 +319,11 @@ export default {
this.initWithField() this.initWithField()
this.loadViews() this.loadViews()
}, },
mounted() {
bus.$on('valid-values-change', valid => {
this.validateFilterValue(valid)
})
},
methods: { methods: {
initWithField() { initWithField() {
@ -550,12 +555,23 @@ export default {
}, },
enableSureButton() { enableSureButton() {
const enable = this.currentElement.options.attrs.dragItems && this.currentElement.options.attrs.dragItems.length > 0 let valid = true
this.$emit('sure-button-status', enable) const enable = this.currentElement.options.attrs.dragItems && this.currentElement.options.attrs.dragItems
.length > 0
if (this.widget.validDynamicValue) {
valid = this.widget.validDynamicValue(this.currentElement)
}
this.$emit('sure-button-status', enable && valid)
}, },
getElementInfo() { getElementInfo() {
return this.currentElement return this.currentElement
},
validateFilterValue(valid) {
const enable = this.currentElement.options.attrs.dragItems && this.currentElement.options.attrs.dragItems
.length > 0
this.$emit('sure-button-status', enable && valid)
} }
} }

View File

@ -67,6 +67,8 @@
</template> </template>
<script> <script>
import {mapState} from "vuex";
export default { export default {
name: 'FilterControl', name: 'FilterControl',
props: { props: {
@ -116,7 +118,7 @@ export default {
showTitleChange(value) { showTitleChange(value) {
if (!value) { if (!value) {
this.attrs.title = '' this.attrs.title = ''
// this.componentInfo.style.backgroundColor = '' this.element.style.backgroundColor = ''
} }
this.fillAttrs2Filter() this.fillAttrs2Filter()
}, },

View File

@ -2,7 +2,10 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<div class="filter-content"> <div class="filter-content">
<el-card v-if="element.serviceName && element.serviceName !== 'timeDateWidget'" class="box-card"> <el-card
v-if="element.serviceName && element.serviceName !== 'timeDateWidget' && element.serviceName !== 'timeDateRangeWidget'"
class="box-card"
>
<div style="margin-bottom: 10px;"> <div style="margin-bottom: 10px;">
<span>默认值设置</span> <span>默认值设置</span>
</div> </div>
@ -23,6 +26,13 @@
<de-date-default v-if="element.serviceName && element.serviceName === 'timeDateWidget'" :element="element" /> <de-date-default v-if="element.serviceName && element.serviceName === 'timeDateWidget'" :element="element" />
</el-card> </el-card>
<el-card v-if="element.serviceName && element.serviceName === 'timeDateRangeWidget'" class="box-card">
<de-date-range-default
v-if="element.serviceName && element.serviceName === 'timeDateRangeWidget'"
:element="element"
/>
</el-card>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
@ -31,10 +41,12 @@
<script> <script>
import DeDateDefault from '@/views/panel/filter/defaultValue/DeDateDefault' import DeDateDefault from '@/views/panel/filter/defaultValue/DeDateDefault'
import DeDateRangeDefault from '@/views/panel/filter/defaultValue/DeDateRangeDefault'
export default { export default {
name: 'FilterFoot', name: 'FilterFoot',
components: { components: {
DeDateDefault DeDateDefault,
DeDateRangeDefault
}, },
props: { props: {