|
@@ -6,6 +6,7 @@
|
|
|
:disabled="disabled"
|
|
|
:size="size"
|
|
|
:name="name"
|
|
|
+ v-if="!ranged"
|
|
|
v-clickoutside="handleClose"
|
|
|
:placeholder="placeholder"
|
|
|
@focus="handleFocus"
|
|
@@ -25,6 +26,40 @@
|
|
|
v-if="haveTrigger">
|
|
|
</i>
|
|
|
</el-input>
|
|
|
+ <div
|
|
|
+ class="el-date-editor el-range-editor el-input__inner"
|
|
|
+ :class="[
|
|
|
+ 'el-date-editor--' + type,
|
|
|
+ 'el-range-editor--' + size,
|
|
|
+ pickerVisible ? 'is-active' : ''
|
|
|
+ ]"
|
|
|
+ @click="handleRangeClick"
|
|
|
+ @mouseenter="handleMouseEnter"
|
|
|
+ @mouseleave="showClose = false"
|
|
|
+ ref="reference"
|
|
|
+ v-clickoutside="handleClose"
|
|
|
+ v-else>
|
|
|
+ <i :class="['el-input__icon', 'el-range__icon', triggerClass]"></i>
|
|
|
+ <input
|
|
|
+ :placeholder="startPlaceholder"
|
|
|
+ :value="displayValue && displayValue[0]"
|
|
|
+ @keydown="handleKeydown"
|
|
|
+ @change="handleStartChange"
|
|
|
+ class="el-range-input">
|
|
|
+ <span class="el-range-separator">{{ rangeSeparator }}</span>
|
|
|
+ <input
|
|
|
+ :placeholder="endPlaceholder"
|
|
|
+ :value="displayValue && displayValue[1]"
|
|
|
+ @keydown="handleKeydown"
|
|
|
+ @change="handleEndChange"
|
|
|
+ class="el-range-input">
|
|
|
+ <i
|
|
|
+ @click="handleClickIcon"
|
|
|
+ v-if="haveTrigger"
|
|
|
+ :class="{ 'el-icon-circle-close': showClose }"
|
|
|
+ class="el-input__icon el-range__close-icon">
|
|
|
+ </i>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
@@ -79,19 +114,21 @@ const DATE_FORMATTER = function(value, format) {
|
|
|
const DATE_PARSER = function(text, format) {
|
|
|
return parseDate(text, format);
|
|
|
};
|
|
|
-const RANGE_FORMATTER = function(value, format, separator) {
|
|
|
+const RANGE_FORMATTER = function(value, format) {
|
|
|
if (Array.isArray(value) && value.length === 2) {
|
|
|
const start = value[0];
|
|
|
const end = value[1];
|
|
|
|
|
|
if (start && end) {
|
|
|
- return formatDate(start, format) + separator + formatDate(end, format);
|
|
|
+ return [formatDate(start, format), formatDate(end, format)];
|
|
|
}
|
|
|
}
|
|
|
return '';
|
|
|
};
|
|
|
-const RANGE_PARSER = function(text, format, separator) {
|
|
|
- const array = text.split(separator);
|
|
|
+const RANGE_PARSER = function(array, format, separator) {
|
|
|
+ if (!Array.isArray(array)) {
|
|
|
+ array = array.split(separator);
|
|
|
+ }
|
|
|
if (array.length === 2) {
|
|
|
const range1 = array[0];
|
|
|
const range2 = array[1];
|
|
@@ -210,6 +247,8 @@ export default {
|
|
|
format: String,
|
|
|
readonly: Boolean,
|
|
|
placeholder: String,
|
|
|
+ startPlaceholder: String,
|
|
|
+ endPlaceholder: String,
|
|
|
name: String,
|
|
|
disabled: Boolean,
|
|
|
clearable: {
|
|
@@ -228,7 +267,7 @@ export default {
|
|
|
value: {},
|
|
|
defaultValue: {},
|
|
|
rangeSeparator: {
|
|
|
- default: ' - '
|
|
|
+ default: '-'
|
|
|
},
|
|
|
pickerOptions: {}
|
|
|
},
|
|
@@ -272,13 +311,20 @@ export default {
|
|
|
},
|
|
|
|
|
|
computed: {
|
|
|
+ ranged() {
|
|
|
+ return this.type.indexOf('range') > -1;
|
|
|
+ },
|
|
|
+
|
|
|
reference() {
|
|
|
- return this.$refs.reference.$el;
|
|
|
+ const reference = this.$refs.reference;
|
|
|
+ return reference.$el || reference;
|
|
|
},
|
|
|
|
|
|
refInput() {
|
|
|
- if (this.reference) return this.reference.querySelector('input');
|
|
|
- return {};
|
|
|
+ if (this.reference) {
|
|
|
+ return [].slice.call(this.reference.querySelectorAll('input'));
|
|
|
+ }
|
|
|
+ return [];
|
|
|
},
|
|
|
|
|
|
valueIsEmpty() {
|
|
@@ -330,7 +376,7 @@ export default {
|
|
|
).formatter;
|
|
|
const format = DEFAULT_FORMATS[this.type];
|
|
|
|
|
|
- return formatter(value, this.format || format, this.rangeSeparator);
|
|
|
+ return formatter(value, this.format || format);
|
|
|
},
|
|
|
|
|
|
set(value) {
|
|
@@ -340,7 +386,7 @@ export default {
|
|
|
TYPE_VALUE_RESOLVER_MAP[type] ||
|
|
|
TYPE_VALUE_RESOLVER_MAP['default']
|
|
|
).parser;
|
|
|
- const parsedValue = parser(value, this.format || DEFAULT_FORMATS[type], this.rangeSeparator);
|
|
|
+ const parsedValue = parser(value, this.format || DEFAULT_FORMATS[type]);
|
|
|
|
|
|
if (parsedValue && this.picker) {
|
|
|
this.picker.value = parsedValue;
|
|
@@ -371,11 +417,28 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
|
|
|
- handleClickIcon() {
|
|
|
+ handleStartChange(event) {
|
|
|
+ if (this.displayValue && this.displayValue[1]) {
|
|
|
+ this.displayValue = [event.target.value, this.displayValue[1]];
|
|
|
+ } else {
|
|
|
+ this.displayValue = [event.target.value, event.target.value];
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ handleEndChange(event) {
|
|
|
+ if (this.displayValue && this.displayValue[0]) {
|
|
|
+ this.displayValue = [this.displayValue[0], event.target.value];
|
|
|
+ } else {
|
|
|
+ this.displayValue = [event.target.value, event.target.value];
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ handleClickIcon(event) {
|
|
|
if (this.readonly || this.disabled) return;
|
|
|
if (this.showClose) {
|
|
|
this.currentValue = this.$options.defaultValue || '';
|
|
|
this.showClose = false;
|
|
|
+ event.stopPropagation();
|
|
|
} else {
|
|
|
this.pickerVisible = !this.pickerVisible;
|
|
|
}
|
|
@@ -397,6 +460,9 @@ export default {
|
|
|
|
|
|
handleClose() {
|
|
|
this.pickerVisible = false;
|
|
|
+ if (this.ranged) {
|
|
|
+ this.$emit('blur', this);
|
|
|
+ }
|
|
|
},
|
|
|
|
|
|
handleFocus() {
|
|
@@ -422,6 +488,15 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
|
|
|
+ handleRangeClick() {
|
|
|
+ const type = this.type;
|
|
|
+
|
|
|
+ if (HAVE_TRIGGER_TYPES.indexOf(type) !== -1 && !this.pickerVisible) {
|
|
|
+ this.pickerVisible = true;
|
|
|
+ }
|
|
|
+ this.$emit('focus', this);
|
|
|
+ },
|
|
|
+
|
|
|
hidePicker() {
|
|
|
if (this.picker) {
|
|
|
this.picker.resetView && this.picker.resetView();
|
|
@@ -503,9 +578,15 @@ export default {
|
|
|
this.picker.resetView && this.picker.resetView();
|
|
|
});
|
|
|
|
|
|
- this.picker.$on('select-range', (start, end) => {
|
|
|
- this.refInput.setSelectionRange(start, end);
|
|
|
- this.refInput.focus();
|
|
|
+ this.picker.$on('select-range', (start, end, pos) => {
|
|
|
+ if (this.refInput.length === 0) return;
|
|
|
+ if (!pos || pos === 'min') {
|
|
|
+ this.refInput[0].setSelectionRange(start, end);
|
|
|
+ this.refInput[0].focus();
|
|
|
+ } else if (pos === 'max') {
|
|
|
+ this.refInput[1].setSelectionRange(start, end);
|
|
|
+ this.refInput[1].focus();
|
|
|
+ }
|
|
|
});
|
|
|
},
|
|
|
|