1
0
mirror of synced 2025-12-10 07:58:13 +08:00

修复周视图显示错误问题

This commit is contained in:
xuliangzhan
2021-12-11 22:23:36 +08:00
parent d4173f35be
commit 7226257007
8 changed files with 92 additions and 36 deletions

View File

@@ -5,7 +5,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, nextTick, ref, Ref } from 'vue' import { defineComponent } from 'vue'
export default defineComponent({ export default defineComponent({
name: 'PreCode', name: 'PreCode',

View File

@@ -28,7 +28,7 @@ interface ItemVO {
export default defineComponent({ export default defineComponent({
setup () { setup () {
const copyEvent = ({ icon }: ItemVO) => { const copyEvent = () => {
VXETable.modal.message({ content: '已复制到剪贴板!', status: 'success' }) VXETable.modal.message({ content: '已复制到剪贴板!', status: 'success' })
} }
return { return {

View File

@@ -40,6 +40,16 @@
<vxe-input v-model="demo1.value409" placeholder="农历节日" type="date" :festival-method="festivalCalendarMethod" transfer></vxe-input> <vxe-input v-model="demo1.value409" placeholder="农历节日" type="date" :festival-method="festivalCalendarMethod" transfer></vxe-input>
</p> </p>
<p>
<vxe-input v-model="demo1.value701" placeholder="周选择" type="week" :start-day="0" clearable></vxe-input>
<vxe-input v-model="demo1.value702" placeholder="周选择" type="week" :start-day="1" clearable></vxe-input>
<vxe-input v-model="demo1.value703" placeholder="周选择" type="week" :start-day="2" clearable></vxe-input>
<vxe-input v-model="demo1.value704" placeholder="周选择" type="week" :start-day="3" clearable></vxe-input>
<vxe-input v-model="demo1.value705" placeholder="周选择" type="week" :start-day="4" clearable></vxe-input>
<vxe-input v-model="demo1.value706" placeholder="周选择" type="week" :start-day="5" clearable></vxe-input>
<vxe-input v-model="demo1.value707" placeholder="周选择" type="week" :start-day="6" clearable></vxe-input>
</p>
<p> <p>
<vxe-input v-model="demo1.value500" placeholder="数值类型" type="number"></vxe-input> <vxe-input v-model="demo1.value500" placeholder="数值类型" type="number"></vxe-input>
<vxe-input v-model="demo1.value501" placeholder="数值间隔 1.4" type="number" step="1.4" clearable></vxe-input> <vxe-input v-model="demo1.value501" placeholder="数值间隔 1.4" type="number" step="1.4" clearable></vxe-input>
@@ -143,7 +153,14 @@ export default defineComponent({
value600: '', value600: '',
value601: '', value601: '',
value602: '', value602: '',
value603: '' value603: '',
value701: '2017-12-18',
value702: '2017-12-18',
value703: '2017-12-18',
value704: '2017-12-18',
value705: '2017-12-18',
value706: '2017-12-18',
value707: '2017-12-18'
}) })
const disabledDateMethod: VxeInputPropTypes.DisabledMethod = (params) => { const disabledDateMethod: VxeInputPropTypes.DisabledMethod = (params) => {

View File

@@ -1,6 +1,6 @@
{ {
"name": "vxe-table", "name": "vxe-table",
"version": "4.1.17-beta.0", "version": "4.1.17-beta.2",
"description": "一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、贼灵活的配置项、扩展接口等...", "description": "一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、贼灵活的配置项、扩展接口等...",
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",
@@ -66,11 +66,11 @@
"vue-router": "^4.0.11", "vue-router": "^4.0.11",
"vuex": "^4.0.2", "vuex": "^4.0.2",
"xe-ajax": "^4.0.5", "xe-ajax": "^4.0.5",
"xe-utils": "^3.4.3" "xe-utils": "^3.5.0"
}, },
"peerDependencies": { "peerDependencies": {
"vue": "^3.2.2", "vue": "^3.2.2",
"xe-utils": "^3.4.2" "xe-utils": "^3.5.0"
}, },
"vetur": { "vetur": {
"tags": "helper/vetur/tags.json", "tags": "helper/vetur/tags.json",

View File

@@ -195,6 +195,14 @@ export default defineComponent({
let inputMethods = {} as InputMethods let inputMethods = {} as InputMethods
const parseDate = (value: VxeInputPropTypes.ModelValue, format: string) => {
const { type } = props
if (type === 'time') {
return toStringTimeDate(value)
}
return XEUtils.toStringDate(value, format)
}
const computeIsDateTimeType = computed(() => { const computeIsDateTimeType = computed(() => {
const { type } = props const { type } = props
return type === 'time' || type === 'datetime' return type === 'time' || type === 'datetime'
@@ -255,17 +263,12 @@ export default defineComponent({
}) })
const computeDateValue = computed(() => { const computeDateValue = computed(() => {
const { modelValue, type } = props const { modelValue } = props
const isDatePickerType = computeIsDatePickerType.value const isDatePickerType = computeIsDatePickerType.value
const dateValueFormat = computeDateValueFormat.value const dateValueFormat = computeDateValueFormat.value
let val = null let val = null
if (modelValue && isDatePickerType) { if (modelValue && isDatePickerType) {
let date const date = parseDate(modelValue, dateValueFormat)
if (type === 'time') {
date = toStringTimeDate(modelValue)
} else {
date = XEUtils.toStringDate(modelValue, dateValueFormat)
}
if (XEUtils.isValidDate(date)) { if (XEUtils.isValidDate(date)) {
val = date val = date
} }
@@ -356,12 +359,16 @@ export default defineComponent({
return '' return ''
}) })
const computeFirstDayOfWeek = computed(() => {
const { startDay, startWeek } = props
return XEUtils.toNumber(XEUtils.isNumber(startDay) || XEUtils.isString(startDay) ? startDay : startWeek) as VxeInputPropTypes.StartDay
})
const computeWeekDatas = computed(() => { const computeWeekDatas = computed(() => {
const weeks = [] const weeks = []
const isDatePickerType = computeIsDatePickerType.value const isDatePickerType = computeIsDatePickerType.value
if (isDatePickerType) { if (isDatePickerType) {
const { startDay, startWeek } = props let sWeek = computeFirstDayOfWeek.value
let sWeek = XEUtils.toNumber(XEUtils.isNumber(startDay) || XEUtils.isString(startDay) ? startDay : startWeek)
weeks.push(sWeek) weeks.push(sWeek)
for (let index = 0; index < 6; index++) { for (let index = 0; index < 6; index++) {
if (sWeek >= 6) { if (sWeek >= 6) {
@@ -516,6 +523,7 @@ export default defineComponent({
const computeWeekDates = computed(() => { const computeWeekDates = computed(() => {
const dayDatas = computeDayDatas.value const dayDatas = computeDayDatas.value
const firstDayOfWeek = computeFirstDayOfWeek.value
return dayDatas.map((list) => { return dayDatas.map((list) => {
const firstItem = list[0] const firstItem = list[0]
const item: DateDayItem = { const item: DateDayItem = {
@@ -525,7 +533,7 @@ export default defineComponent({
isCurrent: false, isCurrent: false,
isNow: false, isNow: false,
isNext: false, isNext: false,
label: XEUtils.getYearWeek(firstItem.date) label: XEUtils.getYearWeek(firstItem.date, firstDayOfWeek)
} }
return [item].concat(list) return [item].concat(list)
}) })
@@ -711,17 +719,27 @@ export default defineComponent({
const { type } = props const { type } = props
const { valueFormat } = props const { valueFormat } = props
const dateLabelFormat = computeDateLabelFormat.value const dateLabelFormat = computeDateLabelFormat.value
const firstDayOfWeek = computeFirstDayOfWeek.value
let dValue: Date | null = null let dValue: Date | null = null
let dLabel = '' let dLabel = ''
if (value) { if (value) {
if (type === 'time') { dValue = parseDate(value, valueFormat)
dValue = toStringTimeDate(value)
} else {
dValue = XEUtils.toStringDate(value, valueFormat)
}
} }
if (XEUtils.isValidDate(dValue)) { if (XEUtils.isValidDate(dValue)) {
dLabel = XEUtils.toDateString(dValue, dateLabelFormat) dLabel = XEUtils.toDateString(dValue, dateLabelFormat, { firstDay: firstDayOfWeek })
// 由于年份和第几周是冲突的行为,所以需要特殊处理,判断是否跨年
if (dateLabelFormat && type === 'week') {
const firstWeekDate = XEUtils.getWhatWeek(dValue, 0, firstDayOfWeek, firstDayOfWeek)
if (firstWeekDate.getFullYear() < dValue.getFullYear()) {
const yyIndex = dateLabelFormat.indexOf('yyyy')
if (yyIndex > -1) {
const yyNum = Number(dLabel.substring(yyIndex, yyIndex + 4))
if (yyNum && !isNaN(yyNum)) {
dLabel = dLabel.replace(`${yyNum}`, `${yyNum - 1}`)
}
}
}
}
} else { } else {
dValue = null dValue = null
} }
@@ -785,15 +803,16 @@ export default defineComponent({
const { datetimePanelValue } = reactData const { datetimePanelValue } = reactData
const isDateTimeType = computeIsDateTimeType.value const isDateTimeType = computeIsDateTimeType.value
const dateValueFormat = computeDateValueFormat.value const dateValueFormat = computeDateValueFormat.value
const firstDayOfWeek = computeFirstDayOfWeek.value
if (props.type === 'week') { if (props.type === 'week') {
const sWeek = XEUtils.toNumber(props.selectDay) const sWeek = XEUtils.toNumber(props.selectDay) as VxeInputPropTypes.SelectDay
date = XEUtils.getWhatWeek(date, 0, sWeek) date = XEUtils.getWhatWeek(date, 0, sWeek, firstDayOfWeek)
} else if (isDateTimeType) { } else if (isDateTimeType) {
date.setHours(datetimePanelValue.getHours()) date.setHours(datetimePanelValue.getHours())
date.setMinutes(datetimePanelValue.getMinutes()) date.setMinutes(datetimePanelValue.getMinutes())
date.setSeconds(datetimePanelValue.getSeconds()) date.setSeconds(datetimePanelValue.getSeconds())
} }
const inpVal = XEUtils.toDateString(date, dateValueFormat) const inpVal = XEUtils.toDateString(date, dateValueFormat, { firstDay: firstDayOfWeek })
dateCheckMonth(date) dateCheckMonth(date)
if (!XEUtils.isEqual(modelValue, inpVal)) { if (!XEUtils.isEqual(modelValue, inpVal)) {
emitModel(inpVal, { type: 'update' }) emitModel(inpVal, { type: 'update' })
@@ -826,12 +845,7 @@ export default defineComponent({
} }
} else if (isDatePickerType) { } else if (isDatePickerType) {
if (inputValue) { if (inputValue) {
let inpDateVal: VxeInputPropTypes.ModelValue let inpDateVal: VxeInputPropTypes.ModelValue = parseDate(inputValue, dateLabelFormat as string)
if (type === 'time') {
inpDateVal = toStringTimeDate(inputValue)
} else {
inpDateVal = XEUtils.toStringDate(inputValue, dateLabelFormat)
}
if (XEUtils.isValidDate(inpDateVal)) { if (XEUtils.isValidDate(inpDateVal)) {
if (type === 'time') { if (type === 'time') {
inpDateVal = XEUtils.toDateString(inpDateVal, dateLabelFormat) inpDateVal = XEUtils.toDateString(inpDateVal, dateLabelFormat)
@@ -841,6 +855,7 @@ export default defineComponent({
reactData.inputValue = inpDateVal reactData.inputValue = inpDateVal
} else { } else {
let isChange = false let isChange = false
const firstDayOfWeek = computeFirstDayOfWeek.value
if (type === 'datetime') { if (type === 'datetime') {
const dateValue = computeDateValue.value const dateValue = computeDateValue.value
if (inputValue !== XEUtils.toDateString(dateValue, dateLabelFormat) || inputValue !== XEUtils.toDateString(inpDateVal, dateLabelFormat)) { if (inputValue !== XEUtils.toDateString(dateValue, dateLabelFormat) || inputValue !== XEUtils.toDateString(inpDateVal, dateLabelFormat)) {
@@ -852,7 +867,7 @@ export default defineComponent({
} else { } else {
isChange = true isChange = true
} }
reactData.inputValue = XEUtils.toDateString(inpDateVal, dateLabelFormat) reactData.inputValue = XEUtils.toDateString(inpDateVal, dateLabelFormat, { firstDay: firstDayOfWeek })
if (isChange) { if (isChange) {
dateChange(inpDateVal) dateChange(inpDateVal)
} }
@@ -1291,14 +1306,15 @@ export default defineComponent({
dateMoveMonth(offsetMonth) dateMoveMonth(offsetMonth)
} else { } else {
let offsetDay = datePanelValue || XEUtils.getWhatDay(Date.now(), 0, 'first') let offsetDay = datePanelValue || XEUtils.getWhatDay(Date.now(), 0, 'first')
const firstDayOfWeek = computeFirstDayOfWeek.value
if (isLeftArrow) { if (isLeftArrow) {
offsetDay = XEUtils.getWhatDay(offsetDay, -1) offsetDay = XEUtils.getWhatDay(offsetDay, -1)
} else if (isUpArrow) { } else if (isUpArrow) {
offsetDay = XEUtils.getWhatWeek(offsetDay, -1) offsetDay = XEUtils.getWhatWeek(offsetDay, -1, firstDayOfWeek)
} else if (isRightArrow) { } else if (isRightArrow) {
offsetDay = XEUtils.getWhatDay(offsetDay, 1) offsetDay = XEUtils.getWhatDay(offsetDay, 1)
} else if (isDwArrow) { } else if (isDwArrow) {
offsetDay = XEUtils.getWhatWeek(offsetDay, 1) offsetDay = XEUtils.getWhatWeek(offsetDay, 1, firstDayOfWeek)
} }
dateMoveDay(offsetDay) dateMoveDay(offsetDay)
} }

View File

@@ -2806,6 +2806,25 @@ export default defineComponent({
} }
return rowList return rowList
}, },
/**
* 只对 tree-config 有效,获取行的父级
*/
getParentRow (rowOrRowid) {
const { treeConfig } = props
const { fullDataRowIdData } = internalData
if (rowOrRowid && treeConfig) {
let rowid
if (XEUtils.isString(rowOrRowid)) {
rowid = rowOrRowid
} else {
rowid = getRowid($xetable, rowOrRowid)
}
if (rowid) {
return fullDataRowIdData[rowid] ? fullDataRowIdData[rowid].parent : null
}
}
return null
},
/** /**
* 根据行的唯一主键获取行 * 根据行的唯一主键获取行
* @param {String/Number} rowid 行主键 * @param {String/Number} rowid 行主键

4
types/input.d.ts vendored
View File

@@ -66,8 +66,8 @@ export namespace VxeInputPropTypes {
export type Digits = string | number; export type Digits = string | number;
export type MinDate = string | number | Date; export type MinDate = string | number | Date;
export type MaxDate = string | number | Date; export type MaxDate = string | number | Date;
export type StartDay = number; export type StartDay = 0 | 1 | 2 | 3 | 4 | 5 | 6;
export type SelectDay = number; export type SelectDay = 0 | 1 | 2 | 3 | 4 | 5 | 6;
export type LabelFormat = string; export type LabelFormat = string;
export type ValueFormat = string; export type ValueFormat = string;
export type Editable = boolean; export type Editable = boolean;

4
types/table.d.ts vendored
View File

@@ -272,6 +272,10 @@ export interface TablePublicMethods {
* 用于 type=checkbox获取已选中的行数据 * 用于 type=checkbox获取已选中的行数据
*/ */
getCheckboxRecords(isFull?: boolean): any[]; getCheckboxRecords(isFull?: boolean): any[];
/**
* 只对 tree-config 有效,获取行的父级
*/
getParentRow (rowOrRowid: any): any | null;
/** /**
* 根据行的唯一主键获取行 * 根据行的唯一主键获取行
* @param rowid 行主键 * @param rowid 行主键