diff --git a/core/core-backend/src/main/java/io/dataease/commons/utils/CoreTreeUtils.java b/core/core-backend/src/main/java/io/dataease/commons/utils/CoreTreeUtils.java new file mode 100644 index 0000000000..0b964cc9cc --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/commons/utils/CoreTreeUtils.java @@ -0,0 +1,35 @@ +package io.dataease.commons.utils; + +import io.dataease.constant.SortConstants; +import io.dataease.visualization.dto.VisualizationNodeBO; +import org.apache.commons.lang3.StringUtils; + +import java.text.Collator; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author : WangJiaHao + * @date : 2024/3/18 10:53 + */ +public class CoreTreeUtils { + + public static List customSortBO(List list, String sortType) { + Collator collator = Collator.getInstance(Locale.CHINA); + if (StringUtils.equalsIgnoreCase(SortConstants.NAME_DESC, sortType)) { + Set poSet = new TreeSet<>(Comparator.comparing(VisualizationNodeBO::getName, collator)); + poSet.addAll(list); + return poSet.stream().collect(Collectors.toList()); + } else if (StringUtils.equalsIgnoreCase(SortConstants.NAME_ASC, sortType)) { + Set poSet = new TreeSet<>(Comparator.comparing(VisualizationNodeBO::getName, collator).reversed()); + poSet.addAll(list); + return poSet.stream().collect(Collectors.toList()); + } else if (StringUtils.equalsIgnoreCase(SortConstants.TIME_ASC, sortType)) { + Collections.reverse(list); + return list; + } else { + // 默认时间倒序 + return list; + } + } +} diff --git a/core/core-frontend/src/assets/svg/dv-more-com.svg b/core/core-frontend/src/assets/svg/dv-more-com.svg new file mode 100644 index 0000000000..d6c29ab958 --- /dev/null +++ b/core/core-frontend/src/assets/svg/dv-more-com.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core/core-frontend/src/assets/svg/dv-more-time-clock.svg b/core/core-frontend/src/assets/svg/dv-more-time-clock.svg new file mode 100644 index 0000000000..bf7ddcb0e2 --- /dev/null +++ b/core/core-frontend/src/assets/svg/dv-more-time-clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core/core-frontend/src/components/data-visualization/DvToolbar.vue b/core/core-frontend/src/components/data-visualization/DvToolbar.vue index 180e0575c2..45cb048977 100644 --- a/core/core-frontend/src/components/data-visualization/DvToolbar.vue +++ b/core/core-frontend/src/components/data-visualization/DvToolbar.vue @@ -15,6 +15,7 @@ import CommonGroup from '@/custom-component/component-group/CommonGroup.vue' import DeResourceGroupOpt from '@/views/common/DeResourceGroupOpt.vue' import { canvasSave } from '@/utils/canvasUtils' import { changeSizeWithScale } from '@/utils/changeComponentsSizeWithScale' +import MoreComGroup from '@/custom-component/component-group/MoreComGroup.vue' let nameEdit = ref(false) let inputName = ref('') let nameInput = ref(null) @@ -201,6 +202,9 @@ eventBus.on('clearCanvas', clearCanvas) + + + diff --git a/core/core-frontend/src/custom-component/common/CommonAttr.vue b/core/core-frontend/src/custom-component/common/CommonAttr.vue index 2e7d5cbfdf..b13295ff64 100644 --- a/core/core-frontend/src/custom-component/common/CommonAttr.vue +++ b/core/core-frontend/src/custom-component/common/CommonAttr.vue @@ -134,7 +134,7 @@ const stopEvent = e => { :background-border-select-width="backgroundBorderSelectWidth" /> - + { - diff --git a/core/core-frontend/src/custom-component/component-group/MoreComGroup.vue b/core/core-frontend/src/custom-component/component-group/MoreComGroup.vue new file mode 100644 index 0000000000..e69b69294c --- /dev/null +++ b/core/core-frontend/src/custom-component/component-group/MoreComGroup.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/core/core-frontend/src/custom-component/component-list.ts b/core/core-frontend/src/custom-component/component-list.ts index b1bcfb414e..bbe7523519 100644 --- a/core/core-frontend/src/custom-component/component-list.ts +++ b/core/core-frontend/src/custom-component/component-list.ts @@ -119,6 +119,36 @@ const list = [ }, matrixStyle: {} }, + { + component: 'DeTimeClock', + name: '时间组件', + label: '时间组件', + icon: 'dv-more-time-clock', + innerType: 'DeTimeClock', + editing: false, + canvasActive: false, + x: 1, + y: 1, + sizeX: 18, + sizeY: 6, + propValue: {}, + style: { + width: 300, + height: 100, + fontSize: 22, + fontWeight: 400, + textAlign: 'center', + color: '#000000' + }, + formatInfo: { + openMode: '0', + showWeek: false, + showDate: true, + dateFormat: 'yyyy-MM-dd', + timeFormat: 'hh:mm:ss' + }, + matrixStyle: {} + }, { component: 'Picture', name: '图片', diff --git a/core/core-frontend/src/custom-component/de-date/TimeComplex.vue b/core/core-frontend/src/custom-component/de-date/TimeComplex.vue deleted file mode 100644 index 80d869e4d9..0000000000 --- a/core/core-frontend/src/custom-component/de-date/TimeComplex.vue +++ /dev/null @@ -1,257 +0,0 @@ - - - - - diff --git a/core/core-frontend/src/custom-component/de-date/Attr.vue b/core/core-frontend/src/custom-component/de-time-clock/Attr.vue similarity index 91% rename from core/core-frontend/src/custom-component/de-date/Attr.vue rename to core/core-frontend/src/custom-component/de-time-clock/Attr.vue index 8311d12ffc..381ece7bb6 100644 --- a/core/core-frontend/src/custom-component/de-date/Attr.vue +++ b/core/core-frontend/src/custom-component/de-time-clock/Attr.vue @@ -10,6 +10,7 @@ import { beforeUploadCheck, uploadFileResult } from '@/api/staticResource' import { imgUrlTrans } from '@/utils/imgUtils' import eventBus from '@/utils/eventBus' import ImgViewDialog from '@/custom-component/ImgViewDialog.vue' +import TimeClockFormat from '@/custom-component/de-time-clock/TimeClockFormat.vue' withDefaults( defineProps<{ @@ -101,6 +102,17 @@ onBeforeUnmount(() => { :background-color-picker-width="197" :background-border-select-width="197" > + + + diff --git a/core/core-frontend/src/custom-component/de-date/Component.vue b/core/core-frontend/src/custom-component/de-time-clock/Component.vue similarity index 58% rename from core/core-frontend/src/custom-component/de-date/Component.vue rename to core/core-frontend/src/custom-component/de-time-clock/Component.vue index 0de42fd471..734fb6803d 100644 --- a/core/core-frontend/src/custom-component/de-date/Component.vue +++ b/core/core-frontend/src/custom-component/de-time-clock/Component.vue @@ -1,29 +1,12 @@ + + + + diff --git a/core/core-frontend/src/custom-component/de-time-clock/TimeClockFormat.vue b/core/core-frontend/src/custom-component/de-time-clock/TimeClockFormat.vue new file mode 100644 index 0000000000..21ffaf5cc4 --- /dev/null +++ b/core/core-frontend/src/custom-component/de-time-clock/TimeClockFormat.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/core/core-frontend/src/custom-component/de-date/TimeDefault.vue b/core/core-frontend/src/custom-component/de-time-clock/TimeDefault.vue similarity index 77% rename from core/core-frontend/src/custom-component/de-date/TimeDefault.vue rename to core/core-frontend/src/custom-component/de-time-clock/TimeDefault.vue index eeb29e1cf9..4179d6b5db 100644 --- a/core/core-frontend/src/custom-component/de-date/TimeDefault.vue +++ b/core/core-frontend/src/custom-component/de-time-clock/TimeDefault.vue @@ -1,9 +1,6 @@ @@ -22,13 +19,6 @@ const state = reactive({ nowWeek: '', timer: null }) -const timeMargin = computed(() => { - return element.value.style.time_margin -}) - -const containerHeight = computed(() => { - return 'calc(100% - ' + element.value.style.time_margin * 2 + 'px)' -}) const currentTime = () => { state.timer = setInterval(formatDate, 500) diff --git a/core/core-frontend/src/custom-component/rich-text/DeRichTextView.vue b/core/core-frontend/src/custom-component/rich-text/DeRichTextView.vue index 37d80a5c41..27e68ab32d 100644 --- a/core/core-frontend/src/custom-component/rich-text/DeRichTextView.vue +++ b/core/core-frontend/src/custom-component/rich-text/DeRichTextView.vue @@ -5,6 +5,7 @@ @keydown.stop @keyup.stop @dblclick="setEdit" + @click="onClick" >
{ snapshotStore.resetStyleChangeTimes() } const onClick = () => { - const node = tinymce.activeEditor.selection.getNode() - resetSelect(node) + if (canEdit.value) { + const node = tinymce.activeEditor.selection.getNode() + resetSelect(node) + } } const resetSelect = (node?) => { const edInner = tinymce.get(tinymceId) diff --git a/core/core-frontend/src/custom-component/rich-text/DeRichTextViewBack.vue b/core/core-frontend/src/custom-component/rich-text/DeRichTextViewBack.vue deleted file mode 100644 index 34e56b8155..0000000000 --- a/core/core-frontend/src/custom-component/rich-text/DeRichTextViewBack.vue +++ /dev/null @@ -1,198 +0,0 @@ - - - - - diff --git a/core/core-frontend/src/custom-component/v-query/Time.vue b/core/core-frontend/src/custom-component/v-query/Time.vue index f3d878196a..bbd70316dc 100644 --- a/core/core-frontend/src/custom-component/v-query/Time.vue +++ b/core/core-frontend/src/custom-component/v-query/Time.vue @@ -388,6 +388,7 @@ const formatDate = computed(() => { v-else v-model="selectValue" :type="config.timeGranularity" + @change="handleValueChange" :prefix-icon="calendar" :style="selectStyle" :placeholder="$t('commons.date.select_date_time')" diff --git a/core/core-frontend/src/models/tree/TreeNode.ts b/core/core-frontend/src/models/tree/TreeNode.ts index 8fcf466f02..d0a829e6a1 100644 --- a/core/core-frontend/src/models/tree/TreeNode.ts +++ b/core/core-frontend/src/models/tree/TreeNode.ts @@ -12,4 +12,5 @@ export interface BusiTreeRequest { busiFlag?: string leaf?: boolean weight?: number + sortType: string } diff --git a/core/core-frontend/src/pages/panel/main.ts b/core/core-frontend/src/pages/panel/main.ts index 9ee646d83a..12e82edd70 100644 --- a/core/core-frontend/src/pages/panel/main.ts +++ b/core/core-frontend/src/pages/panel/main.ts @@ -37,7 +37,9 @@ const getPrefix = (): string => { } if (url.includes(suffix)) { const { origin, pathname } = new URL(url) - prefix = `${origin}${pathname.slice(0, pathname.length - 1)}` + const splitArr = pathname.split('/') + splitArr.pop() + prefix = `${origin}${splitArr.join('/')}` return true } } diff --git a/core/core-frontend/src/utils/components.ts b/core/core-frontend/src/utils/components.ts index f290ec5b73..cc24b37536 100644 --- a/core/core-frontend/src/utils/components.ts +++ b/core/core-frontend/src/utils/components.ts @@ -21,7 +21,8 @@ import RectShape from '@/custom-component/rect-shape/Component.vue' import RectShapeAttr from '@/custom-component/rect-shape/Attr.vue' import SvgTriangle from '@/custom-component/svgs/svg-triangle/Component.vue' import SvgTriangleAttr from '@/custom-component/svgs/svg-triangle/Attr.vue' - +import DeTimeClock from '@/custom-component/de-time-clock/Component.vue' +import DeTimeClockAttr from '@/custom-component/de-time-clock/Attr.vue' export const componentsMap = { VText: VText, VQuery, @@ -45,7 +46,9 @@ export const componentsMap = { RectShape: RectShape, RectShapeAttr: RectShapeAttr, SvgTriangle: SvgTriangle, - SvgTriangleAttr: SvgTriangleAttr + SvgTriangleAttr: SvgTriangleAttr, + DeTimeClock: DeTimeClock, + DeTimeClockAttr: DeTimeClockAttr } export default function findComponent(key) { diff --git a/core/core-frontend/src/utils/treeSortUtils.ts b/core/core-frontend/src/utils/treeSortUtils.ts new file mode 100644 index 0000000000..8e605dba8d --- /dev/null +++ b/core/core-frontend/src/utils/treeSortUtils.ts @@ -0,0 +1,23 @@ +import { BusiTreeNode } from '@/models/tree/TreeNode' +import _ from 'lodash' + +export default function treeSort(tree: BusiTreeNode[], sortType: string, historySortType: string) { + const result = _.cloneDeep(tree) + sortPer(result, sortType, historySortType) + _.forEach(result, node => { + if (node.children && node.children.length > 0) { + sortPer(node.children, sortType, historySortType) + } + }) + return result +} + +export const sortPer = (subTree: BusiTreeNode[], sortType: string, historySortType: string) => { + if (sortType === 'name_desc') { + subTree.sort((a, b) => b.name.localeCompare(a.name, 'zh-Hans-CN', { sensitivity: 'accent' })) + } else if (sortType === 'name_asc') { + subTree.sort((a, b) => a.name.localeCompare(b.name, 'zh-Hans-CN', { sensitivity: 'accent' })) + } else if (sortType !== historySortType) { + return subTree.reverse() + } +} diff --git a/core/core-frontend/src/views/common/DeResourceTree.vue b/core/core-frontend/src/views/common/DeResourceTree.vue index b3b523db23..67f717261a 100644 --- a/core/core-frontend/src/views/common/DeResourceTree.vue +++ b/core/core-frontend/src/views/common/DeResourceTree.vue @@ -20,6 +20,7 @@ import DeResourceCreateOptV2 from '@/views/common/DeResourceCreateOptV2.vue' import { useCache } from '@/hooks/web/useCache' import { findParentIdByChildIdRecursive } from '@/utils/canvasUtils' import { XpackComponent } from '@/components/plugin' +import treeSort from '@/utils/treeSortUtils' const { wsCache } = useCache() const dvMainStore = dvMainStoreWithOut() @@ -57,6 +58,7 @@ const resourceGroupOpt = ref() const resourceCreateOpt = ref() const returnMounted = ref(false) const state = reactive({ + curSortType: 'time_desc', resourceTree: [] as BusiTreeNode[], folderMenuList: [ { @@ -76,6 +78,24 @@ const state = reactive({ divided: true } ], + sortType: [ + { + label: '按时间升序', + value: 'time_asc' + }, + { + label: '按时间降序', + value: 'time_desc' + }, + { + label: '按名称升序', + value: 'name_asc' + }, + { + label: '按名称降序', + value: 'time_asc' + } + ], templateCreatePid: 0 }) @@ -370,6 +390,11 @@ const getDefaultExpandedKeys = () => { } } +const sortTypeChange = sortType => { + state.resourceTree = treeSort(state.resourceTree, sortType, state.curSortType) + state.curSortType = sortType +} + watch(filterText, val => { resourceListTree.value.filter(val) }) @@ -454,6 +479,43 @@ defineExpose({ + + + +