diff --git a/examples/docs/en-US/date-picker.md b/examples/docs/en-US/date-picker.md index 824aad350..539e6b2e2 100644 --- a/examples/docs/en-US/date-picker.md +++ b/examples/docs/en-US/date-picker.md @@ -389,6 +389,7 @@ This feature is at alpha stage. Feedback welcome. | default-value | optional, default date of the calendar | Date | anything accepted by `new Date()` | — | | value-format | optional, format of binding value. If not specified, the binding value will be a Date object | string | year `yyyy`, month `MM`, day `dd`, hour `HH`, minute `mm`, second `ss` | — | | name | same as `name` in native input | string | — | — | +| unlink-panels | unllink two date-panels in range-picker | boolean | — | false | ### Picker Options | Attribute | Description | Type | Accepted Values | Default | diff --git a/examples/docs/en-US/datetime-picker.md b/examples/docs/en-US/datetime-picker.md index de4964293..56c2c2c56 100644 --- a/examples/docs/en-US/datetime-picker.md +++ b/examples/docs/en-US/datetime-picker.md @@ -255,6 +255,7 @@ DateTimePicker is derived from DatePicker and TimePicker. For a more detailed ex | default-value | optional, default date of the calendar | Date | anything accepted by `new Date()` | — | | value-format | optional, format of binding value. If not specified, the binding value will be a Date object | string | year `yyyy`, month `MM`, day `dd`, hour `HH`, minute `mm`, second `ss` | — | | name | same as `name` in native input | string | — | — | +| unlink-panels | unllink two date-panels in range-picker | boolean | — | false | ### Picker Options | Attribute | Description | Type | Accepted Values | Default | diff --git a/examples/docs/zh-CN/date-picker.md b/examples/docs/zh-CN/date-picker.md index 461d7e195..625e5a2f1 100644 --- a/examples/docs/zh-CN/date-picker.md +++ b/examples/docs/zh-CN/date-picker.md @@ -399,6 +399,7 @@ | default-value | 可选,选择器打开时默认显示的时间 | Date | 可被`new Date()`解析 | — | | value-format | 可选,绑定值的格式。不指定则绑定值为 Date 对象 | string | 年 `yyyy`,月 `MM`,日 `dd`,小时 `HH`,分 `mm`,秒 `ss` | — | | name | 原生属性 | string | — | — | +| unlink-panels | 在范围选择器里取消两个日期面板之间的联动 | boolean | — | false | ### Picker Options | 参数 | 说明 | 类型 | 可选值 | 默认值 | diff --git a/examples/docs/zh-CN/datetime-picker.md b/examples/docs/zh-CN/datetime-picker.md index 3429da41c..c45f8cea9 100644 --- a/examples/docs/zh-CN/datetime-picker.md +++ b/examples/docs/zh-CN/datetime-picker.md @@ -254,6 +254,7 @@ DateTimePicker 由 DatePicker 和 TimePicker 派生,`Picker Options` 或者其 | default-value | 可选,选择器打开时默认显示的时间 | Date | 可被`new Date()`解析 | — | | value-format | 可选,绑定值的格式。不指定则绑定值为 Date 对象 | string | 年 `yyyy`,月 `MM`,日 `dd`,小时 `HH`,分 `mm`,秒 `ss` | — | | name | 原生属性 | string | — | — | +| unlink-panels | 在范围选择器里取消两个日期面板之间的联动 | boolean | — | false | ### Picker Options | 参数 | 说明 | 类型 | 可选值 | 默认值 | diff --git a/packages/date-picker/src/panel/date-range.vue b/packages/date-picker/src/panel/date-range.vue index 618355a72..3cc738b1c 100644 --- a/packages/date-picker/src/panel/date-range.vue +++ b/packages/date-picker/src/panel/date-range.vue @@ -82,12 +82,26 @@
+ +
{{ leftLabel }}
+ +
{{ rightLabel }}
@@ -250,6 +278,16 @@ } else { return 'HH:mm:ss'; } + }, + + enableMonthArrow() { + const nextMonth = (this.leftMonth + 1) % 12; + const yearOffset = this.leftMonth + 1 >= 12 ? 1 : 0; + return this.unlinkPanels && new Date(`${this.leftYear + yearOffset}-${nextMonth + 1}`) < new Date(`${this.rightYear}-${this.rightMonth + 1}`); + }, + + enableYearArrow() { + return this.unlinkPanels && this.rightYear * 12 + this.rightMonth - (this.leftYear * 12 + this.leftMonth + 1) >= 12; } }, @@ -276,7 +314,8 @@ minTimePickerVisible: false, maxTimePickerVisible: false, format: '', - arrowControl: false + arrowControl: false, + unlinkPanels: false }; }, @@ -478,24 +517,52 @@ } }, - prevMonth() { - this.leftDate = prevMonth(this.leftDate); - this.rightDate = nextMonth(this.leftDate); - }, - - nextMonth() { - this.leftDate = nextMonth(this.leftDate); - this.rightDate = nextMonth(this.leftDate); - }, - - nextYear() { - this.leftDate = modifyDate(this.leftDate, this.leftYear + 1, this.leftMonth, this.leftMonthDate); - this.rightDate = nextMonth(this.leftDate); - }, - - prevYear() { + leftPrevYear() { this.leftDate = modifyDate(this.leftDate, this.leftYear - 1, this.leftMonth, this.leftMonthDate); - this.rightDate = nextMonth(this.leftDate); + if (!this.unlinkPanels) { + this.rightDate = nextMonth(this.leftDate); + } + }, + + leftNextYear() { + this.leftDate = modifyDate(this.leftDate, this.leftYear + 1, this.leftMonth, this.leftMonthDate); + }, + + leftPrevMonth() { + this.leftDate = prevMonth(this.leftDate); + if (!this.unlinkPanels) { + this.rightDate = nextMonth(this.leftDate); + } + }, + + leftNextMonth() { + this.leftDate = nextMonth(this.leftDate); + }, + + rightPrevYear() { + this.rightDate = modifyDate(this.rightDate, this.rightYear - 1, this.rightMonth, this.rightMonthDate); + }, + + rightNextYear() { + if (!this.unlinkPanels) { + this.leftDate = modifyDate(this.leftDate, this.leftYear + 1, this.leftMonth, this.leftMonthDate); + this.rightDate = nextMonth(this.leftDate); + } else { + this.rightDate = modifyDate(this.rightDate, this.rightYear + 1, this.rightMonth, this.rightMonthDate); + } + }, + + rightPrevMonth() { + this.rightDate = prevMonth(this.rightDate); + }, + + rightNextMonth() { + if (!this.unlinkPanels) { + this.leftDate = nextMonth(this.leftDate); + this.rightDate = nextMonth(this.leftDate); + } else { + this.rightDate = nextMonth(this.rightDate); + } }, handleConfirm(visible = false) { diff --git a/packages/date-picker/src/picker.vue b/packages/date-picker/src/picker.vue index 60623af0b..dfcd52b2a 100644 --- a/packages/date-picker/src/picker.vue +++ b/packages/date-picker/src/picker.vue @@ -303,7 +303,8 @@ export default { rangeSeparator: { default: '-' }, - pickerOptions: {} + pickerOptions: {}, + unlinkPanels: Boolean }, components: { ElInput }, @@ -678,6 +679,7 @@ export default { this.picker.width = this.reference.getBoundingClientRect().width; this.picker.showTime = this.type === 'datetime' || this.type === 'datetimerange'; this.picker.selectionMode = this.selectionMode; + this.picker.unlinkPanels = this.unlinkPanels; this.picker.arrowControl = this.arrowControl || this.timeArrowControl || false; if (this.format) { this.picker.format = this.format; diff --git a/packages/theme-chalk/src/checkbox.scss b/packages/theme-chalk/src/checkbox.scss index 25c69fbed..48c6d83cc 100644 --- a/packages/theme-chalk/src/checkbox.scss +++ b/packages/theme-chalk/src/checkbox.scss @@ -10,7 +10,7 @@ cursor: pointer; display: inline-block; white-space: nowrap; - @include utils-user-select(none); + user-select: none; @include when(bordered) { padding: $--checkbox-bordered-padding; @@ -33,35 +33,47 @@ &.el-checkbox--medium { padding: $--checkbox-bordered-medium-padding; border-radius: $--button-medium-border-radius; + .el-checkbox__label { + line-height: 17px; font-size: $--button-medium-font-size; } + .el-checkbox__inner { height: $--checkbox-bordered-medium-input-height; width: $--checkbox-bordered-medium-input-width; } } + &.el-checkbox--small { padding: $--checkbox-bordered-small-padding; border-radius: $--button-small-border-radius; + .el-checkbox__label { + line-height: 15px; font-size: $--button-small-font-size; } + .el-checkbox__inner { height: $--checkbox-bordered-small-input-height; width: $--checkbox-bordered-small-input-width; + &::after { height: 6px; width: 2px; } } } + &.el-checkbox--mini { padding: $--checkbox-bordered-mini-padding; border-radius: $--button-mini-border-radius; + .el-checkbox__label { + line-height: 12px; font-size: $--button-mini-font-size; } + .el-checkbox__inner { height: $--checkbox-bordered-mini-input-height; width: $--checkbox-bordered-mini-input-width; @@ -97,6 +109,7 @@ cursor: not-allowed; } } + &.is-checked { .el-checkbox__inner { background-color: $--checkbox-disabled-checked-input-fill; @@ -107,6 +120,7 @@ } } } + &.is-indeterminate { .el-checkbox__inner { background-color: $--checkbox-disabled-checked-input-fill; @@ -118,11 +132,13 @@ } } } + & + span.el-checkbox__label { color: $--disabled-color-base; cursor: not-allowed; } } + @include when(checked) { .el-checkbox__inner { background-color: $--checkbox-checked-input-fill; @@ -210,8 +226,10 @@ } @include e(label) { - font-size: $--checkbox-font-size; + display: inline-block; padding-left: 10px; + line-height: 19px; + font-size: $--checkbox-font-size; } & + .el-checkbox { @@ -306,17 +324,17 @@ } } @include m(medium) { - & .el-checkbox-button__inner { + .el-checkbox-button__inner { @include button-size($--button-medium-padding-vertical, $--button-medium-padding-horizontal, $--button-medium-font-size, 0); } } @include m(small) { - & .el-checkbox-button__inner { + .el-checkbox-button__inner { @include button-size($--button-small-padding-vertical, $--button-small-padding-horizontal, $--button-small-font-size, 0); } } @include m(mini) { - & .el-checkbox-button__inner { + .el-checkbox-button__inner { @include button-size($--button-mini-padding-vertical, $--button-mini-padding-horizontal, $--button-mini-font-size, 0); } } diff --git a/packages/theme-chalk/src/common/var.scss b/packages/theme-chalk/src/common/var.scss index 5bfbdc145..4f87fe02e 100644 --- a/packages/theme-chalk/src/common/var.scss +++ b/packages/theme-chalk/src/common/var.scss @@ -136,10 +136,10 @@ $--checkbox-checked-icon-color: $--fill-base; $--checkbox-input-border-color-hover: $--color-primary; -$--checkbox-bordered-padding: 10px 20px 10px 10px; -$--checkbox-bordered-medium-padding: 8px 20px 8px 10px; -$--checkbox-bordered-small-padding: 6px 20px 6px 10px; -$--checkbox-bordered-mini-padding: 4px 20px 4px 10px; +$--checkbox-bordered-padding: 9px 20px 9px 10px; +$--checkbox-bordered-medium-padding: 7px 20px 7px 10px; +$--checkbox-bordered-small-padding: 4px 20px 6px 10px; +$--checkbox-bordered-mini-padding: 2px 20px 4px 10px; $--checkbox-bordered-medium-input-height: 14px; $--checkbox-bordered-medium-input-width: 14px; $--checkbox-bordered-small-input-height: 12px; diff --git a/packages/theme-chalk/src/date-picker/date-range-picker.scss b/packages/theme-chalk/src/date-picker/date-range-picker.scss index 6dc282faf..dabfc6c7d 100644 --- a/packages/theme-chalk/src/date-picker/date-range-picker.scss +++ b/packages/theme-chalk/src/date-picker/date-range-picker.scss @@ -25,10 +25,14 @@ text-align: center; height: 28px; - button { + [class*=arrow-left] { float: left; } + [class*=arrow-right] { + float: right; + } + div { font-size: 14px; margin-right: 50px; @@ -48,9 +52,6 @@ @include when(right) { .el-date-range-picker__header { - button { - float: right; - } div { margin-left: 50px; diff --git a/packages/theme-chalk/src/date-picker/picker-panel.scss b/packages/theme-chalk/src/date-picker/picker-panel.scss index 741a3fdcf..6bd2b6c25 100644 --- a/packages/theme-chalk/src/date-picker/picker-panel.scss +++ b/packages/theme-chalk/src/date-picker/picker-panel.scss @@ -83,6 +83,14 @@ &:hover { color: $--datepicker-text-hover-color; } + + @include when(disabled) { + color: $--font-color-disabled-base; + + &:hover { + cursor: not-allowed; + } + } } @include e(link-btn) { diff --git a/packages/theme-chalk/src/date-picker/picker.scss b/packages/theme-chalk/src/date-picker/picker.scss index 3a056c423..a747a718a 100644 --- a/packages/theme-chalk/src/date-picker/picker.scss +++ b/packages/theme-chalk/src/date-picker/picker.scss @@ -54,13 +54,13 @@ .el-range-separator { display: inline-block; - width: 5%; height: 100%; padding: 0 5px; margin: 0; text-align: center; line-height: 32px; font-size: 14px; + width: 5%; color: $--color-text-primary; } diff --git a/test/unit/specs/date-picker.spec.js b/test/unit/specs/date-picker.spec.js index 2f4edca3e..3e2086fa1 100644 --- a/test/unit/specs/date-picker.spec.js +++ b/test/unit/specs/date-picker.spec.js @@ -1105,6 +1105,37 @@ describe('DatePicker', () => { }, DELAY); }); + it('type:daterange with unlink-panels', done => { + vm = createTest(DatePicker, { + type: 'daterange', + unlinkPanels: true + }, true); + const input = vm.$el.querySelector('input'); + + input.click(); + + setTimeout(_ => { + const panels = vm.picker.$el.querySelectorAll('.el-date-range-picker__content'); + + expect(Array.prototype.slice.call(panels)).to.length(2); + + panels[1].querySelector('.el-icon-d-arrow-right').click(); + panels[1].querySelector('.el-icon-arrow-right').click(); + + setTimeout(_ => { + const left = panels[0].querySelector('.el-date-range-picker__header'); + const right = panels[1].querySelector('.is-right .el-date-range-picker__header'); + const leftText = left.textContent.match(/\d+/g); + const rightText = right.textContent.match(/\d+/g); + + expect(rightText[0] - leftText[0]).to.equal(1); + expect((rightText[1] <= 2 ? rightText[1] + 12 : rightText[1]) - leftText[1]).to.equal(2); + + done(); + }, DELAY); + }, DELAY); + }); + describe('type:datetimerange', () => { let vm; beforeEach(done => {