From 36c32c8d65dcaa2308e9b114c37c956ff10fe14b Mon Sep 17 00:00:00 2001 From: jeremyjone Date: Tue, 18 Apr 2023 19:56:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8add=20slider=20move?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo/demo.vue | 4 +- package.json | 2 +- src/components/common/GanttHeader.vue | 6 +-- src/components/root/index.vue | 3 +- src/components/slider/index.vue | 70 +++++++++++++++++++++++++-- src/composables/useData.ts | 18 +------ src/composables/useGanttHeader.ts | 25 ++++++++++ src/constants/vars.ts | 3 +- src/models/data/row.ts | 19 ++++---- src/models/param/date.ts | 11 ++++- src/typings/date.d.ts | 9 +++- 11 files changed, 128 insertions(+), 42 deletions(-) create mode 100644 src/composables/useGanttHeader.ts diff --git a/demo/demo.vue b/demo/demo.vue index 6de1e7f..a870a36 100644 --- a/demo/demo.vue +++ b/demo/demo.vue @@ -71,8 +71,8 @@ function onAdd() { ganttData.push({ id: ++id, name: 't' + id, - startDate: new Date(2020, 0, 1), - endDate: new Date(2020, 0, 5) + startDate: new Date(2020, 0, id), + endDate: new Date(2020, 0, id + 5) }); } diff --git a/package.json b/package.json index affc53d..3298d48 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ }, "dependencies": { "@types/lodash": "^4.14.192", - "@vueuse/core": "^9.13.0", + "@vueuse/core": "^10.0.0", "dayjs": "^1.11.7", "lodash": "^4.17.21", "vue": "^3.2.47" diff --git a/src/components/common/GanttHeader.vue b/src/components/common/GanttHeader.vue index 5ecd278..cea69ac 100644 --- a/src/components/common/GanttHeader.vue +++ b/src/components/common/GanttHeader.vue @@ -2,7 +2,7 @@ @@ -24,12 +24,12 @@ diff --git a/src/composables/useData.ts b/src/composables/useData.ts index 48ca816..2b36dd4 100644 --- a/src/composables/useData.ts +++ b/src/composables/useData.ts @@ -1,24 +1,11 @@ import type RowItem from '@/models/data/row'; import { useStore } from '@/store'; import { computed, watch, type Ref } from 'vue'; -import useGanttWidth from './useGanttWidth'; -import useTableWidth from './useTableWidth'; +import useGanttHeader from './useGanttHeader'; export default () => { const store = useStore(); - const { ganttColumnWidth } = useGanttWidth(); - const { tableWidth } = useTableWidth(); - - // 设置甘特日期头 - function setGanttHeaders() { - store.ganttHeader.setDate( - // 使用 window 的宽度减去 table 的宽度,就是最小需要的列数,再加一个阈值即可 - (window.innerWidth - tableWidth.value) / ganttColumnWidth.value + 5, - store.$data.start, - store.$data.end, - store.$styleBox.unit - ); - } + const { setGanttHeaders } = useGanttHeader(); function initData(data: Ref) { store.$data.init(data.value); @@ -48,7 +35,6 @@ export default () => { $data: store.$data, initData, dateList: computed(() => store.ganttHeader.headers), - setGanttHeaders, toRowData }; }; diff --git a/src/composables/useGanttHeader.ts b/src/composables/useGanttHeader.ts new file mode 100644 index 0000000..c52bdcc --- /dev/null +++ b/src/composables/useGanttHeader.ts @@ -0,0 +1,25 @@ +import { useStore } from '@/store'; +import useGanttWidth from './useGanttWidth'; +import useTableWidth from './useTableWidth'; + +export default () => { + const store = useStore(); + const { ganttColumnWidth } = useGanttWidth(); + const { tableWidth } = useTableWidth(); + + // 设置甘特日期头 + function setGanttHeaders() { + store.ganttHeader.setDate( + // 使用 window 的宽度减去 table 的宽度,就是最小需要的列数,再加一个阈值即可 + (window.innerWidth - tableWidth.value) / ganttColumnWidth.value + 5, + store.$data.start, + store.$data.end, + store.$styleBox.unit + ); + } + + return { + setGanttHeaders, + ganttHeader: store.ganttHeader + }; +}; diff --git a/src/constants/vars.ts b/src/constants/vars.ts index 1cc1dff..1665f1b 100644 --- a/src/constants/vars.ts +++ b/src/constants/vars.ts @@ -41,8 +41,7 @@ export const Variables = { week: 'year', day: 'month', hour: 'day', - minute: 'hour', - second: 'minute' + minute: 'hour' } } }; diff --git a/src/models/data/row.ts b/src/models/data/row.ts index c2f360d..8833518 100644 --- a/src/models/data/row.ts +++ b/src/models/data/row.ts @@ -2,7 +2,7 @@ * @Author: JeremyJone * @Date: 2021-09-09 15:50:52 * @LastEditors: JeremyJone - * @LastEditTime: 2023-04-18 10:35:13 + * @LastEditTime: 2023-04-18 19:30:08 * @Description: 一条数据类 */ @@ -175,11 +175,11 @@ export default class RowItem { // 首先判断起始日期不能大于结束日期 if ( - date.compareTo(this.end.getOffset(Variables.time.millisecondOf.day)) === + date.compareTo(this.end.getOffset(Variables.time.millisecondOf[unit])) === 'r' ) - this.data[this.options.endLabel] = date.getOffset( - Variables.time.millisecondOf.day + this.__data[this.options.endLabel] = date.getOffset( + Variables.time.millisecondOf[unit] ).date; // if (!linkage) return; @@ -207,16 +207,17 @@ export default class RowItem { linkage = false, modifyArr: RowItem[] = [] ) { - this.data[this.options.endLabel] = date.date; + this.__data[this.options.endLabel] = date.date; // 首先判断起始日期不能大于结束日期 if ( - date.compareTo(this.start.getOffset(Variables.time.millisecondOf.day)) === - 'l' + date.compareTo( + this.start.getOffset(Variables.time.millisecondOf[unit]) + ) === 'l' ) - this.data[this.options.startLabel] = date.getOffset( - Variables.time.millisecondOf.day + this.__data[this.options.startLabel] = date.getOffset( + Variables.time.millisecondOf[unit] ).date; // if (!linkage) return; diff --git a/src/models/param/date.ts b/src/models/param/date.ts index 472412f..f610291 100644 --- a/src/models/param/date.ts +++ b/src/models/param/date.ts @@ -51,8 +51,8 @@ export class XDate { /** * 获取两个时间的间隔时间戳 */ - intervalTo(date: XDate) { - return this.date.getTime() - date.date.getTime(); + intervalTo(date?: XDate) { + return this.date.getTime() - (date?.date.getTime() ?? 0); } /** @@ -107,4 +107,11 @@ export class XDate { toString(format: string = 'YYYY-MM-DD') { return day(this.date).format(format); } + + /** + * 返回一个全新的日期对象 + */ + clone() { + return new XDate(this.date); + } } diff --git a/src/typings/date.d.ts b/src/typings/date.d.ts index 4c013fc..58d70fe 100644 --- a/src/typings/date.d.ts +++ b/src/typings/date.d.ts @@ -1,3 +1,8 @@ -declare type HeaderDateUnit = 'week' | 'day' | 'hour' | 'minute' | 'second'; +declare type HeaderDateUnit = 'week' | 'day' | 'hour' | 'minute'; -declare type DateUnit = 'year' | 'month' | HeaderDateUnit | 'millisecond'; +declare type DateUnit = + | 'year' + | 'month' + | HeaderDateUnit + | 'millisecond' + | 'second';