Commit e32b86e97f1239114d82ad37bdc2361895925426

Authored by Sergio Crisostomo
1 parent 11867c87

move date.vue to subfolder

src/components/date-picker/panel/Date/date.vue 0 → 100644
  1 +<template>
  2 + <div :class="classes" @mousedown.prevent>
  3 + <div :class="[prefixCls + '-sidebar']" v-if="shortcuts.length">
  4 + <div
  5 + :class="[prefixCls + '-shortcut']"
  6 + v-for="shortcut in shortcuts"
  7 + @click="handleShortcutClick(shortcut)">{{ shortcut.text }}</div>
  8 + </div>
  9 + <div :class="[prefixCls + '-body']">
  10 + <div :class="[datePrefixCls + '-header']" v-show="currentView !== 'time'">
  11 + <span
  12 + :class="iconBtnCls('prev', '-double')"
  13 + @click="changeYear(-1)"><Icon type="ios-arrow-left"></Icon></span>
  14 + <span
  15 + :class="iconBtnCls('prev')"
  16 + @click="changeMonth(-1)"
  17 + v-show="currentView === 'date'"><Icon type="ios-arrow-left"></Icon></span>
  18 + <date-panel-label
  19 + :date-panel-label="datePanelLabel"
  20 + :current-view="currentView"
  21 + :date-prefix-cls="datePrefixCls"></date-panel-label>
  22 + <span
  23 + :class="iconBtnCls('next', '-double')"
  24 + @click="changeYear(+1)"><Icon type="ios-arrow-right"></Icon></span>
  25 + <span
  26 + :class="iconBtnCls('next')"
  27 + @click="changeMonth(+1)"
  28 + v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span>
  29 + </div>
  30 + <div :class="[prefixCls + '-content']">
  31 + <component
  32 + :is="pickerTable"
  33 + ref="pickerTable"
  34 + v-if="currentView !== 'time'"
  35 + :table-date="panelDate"
  36 + :value="dates"
  37 + :selection-mode="selectionMode"
  38 + :disabled-date="disabledDate"
  39 + @on-pick="handlePick"
  40 + @on-pick-click="handlePickClick"
  41 + ></component>
  42 + </div>
  43 + <div :class="[prefixCls + '-content']" v-show="isTime">
  44 + <time-picker
  45 + ref="timePicker"
  46 + v-if="currentView === 'time'"
  47 + :value="dates"
  48 + :format="format"
  49 + :time-disabled="timeDisabled"
  50 + @on-pick="handlePick"
  51 + @on-pick-click="handlePickClick"
  52 + @on-pick-clear="handlePickClear"
  53 + @on-pick-success="handlePickSuccess"
  54 + @on-pick-toggle-time="handleToggleTime"
  55 + ></time-picker>
  56 + </div>
  57 + <Confirm
  58 + v-if="confirm"
  59 + :show-time="showTime"
  60 + :is-time="isTime"
  61 + @on-pick-toggle-time="handleToggleTime"
  62 + @on-pick-clear="handlePickClear"
  63 + @on-pick-success="handlePickSuccess"
  64 + ></Confirm>
  65 + </div>
  66 + </div>
  67 +</template>
  68 +<script>
  69 + import Icon from '../../../icon/icon.vue';
  70 + import DateTable from '../../base/date-table.vue';
  71 + import YearTable from '../../base/year-table.vue';
  72 + import MonthTable from '../../base/month-table.vue';
  73 + import TimePicker from '../Time/time.vue';
  74 + import Confirm from '../../base/confirm.vue';
  75 + import datePanelLabel from './date-panel-label.vue';
  76 +
  77 + import Mixin from '../panel-mixin';
  78 + import DateMixin from './date-panel-mixin';
  79 + import Locale from '../../../../mixins/locale';
  80 +
  81 + import { siblingMonth, formatDateLabels } from '../../util';
  82 +
  83 + const prefixCls = 'ivu-picker-panel';
  84 + const datePrefixCls = 'ivu-date-picker';
  85 +
  86 + export default {
  87 + name: 'DatePickerPanel',
  88 + mixins: [ Mixin, Locale, DateMixin ],
  89 + components: { Icon, DateTable, YearTable, MonthTable, TimePicker, Confirm, datePanelLabel },
  90 + props: {
  91 + // in the mixin
  92 + },
  93 + data () {
  94 + const dates = this.value.slice().sort();
  95 + return {
  96 + prefixCls: prefixCls,
  97 + datePrefixCls: datePrefixCls,
  98 + currentView: this.selectionMode || 'date',
  99 + dates: dates,
  100 + panelDate: dates[0] || new Date()
  101 + };
  102 + },
  103 + computed: {
  104 + classes () {
  105 + return [
  106 + `${prefixCls}-body-wrapper`,
  107 + {
  108 + [`${prefixCls}-with-sidebar`]: this.shortcuts.length
  109 + }
  110 + ];
  111 + },
  112 + pickerTable(){
  113 + return this.currentView.match(/^time/) ? 'time-picker' : `${this.currentView}-table`;
  114 + },
  115 + datePanelLabel () {
  116 + const locale = this.t('i.locale');
  117 + const datePanelLabel = this.t('i.datepicker.datePanelLabel');
  118 + const date = this.panelDate;
  119 + const { labels, separator } = formatDateLabels(locale, datePanelLabel, date);
  120 +
  121 + const handler = type => {
  122 + return () => (this.currentView = type);
  123 + };
  124 +
  125 + return {
  126 + separator: separator,
  127 + labels: labels.map(obj => ((obj.handler = handler(obj.type)), obj))
  128 + };
  129 + },
  130 + timeDisabled(){
  131 + return !this.dates[0];
  132 + }
  133 + },
  134 + watch: {
  135 + value (newVal) {
  136 + this.dates = newVal;
  137 + },
  138 + selectionMode(){
  139 + this.currentView = this.selectionMode;
  140 + },
  141 + currentView (val) {
  142 + this.$emit('on-selection-mode-change', val);
  143 + }
  144 + },
  145 + methods: {
  146 + changeYear(dir){
  147 + this.panelDate = siblingMonth(this.panelDate, dir * 12);
  148 + },
  149 + changeMonth(dir){
  150 + this.panelDate = siblingMonth(this.panelDate, dir);
  151 + },
  152 + handlePick (value) {
  153 + const {selectionMode} = this;
  154 + if (selectionMode === 'year') value = new Date(value, 0, 1);
  155 + else if (selectionMode === 'month') value = new Date(this.panelDate.getFullYear(), value, 1);
  156 + else value = new Date(value);
  157 +
  158 + this.$emit('on-pick', value);
  159 + },
  160 + },
  161 + };
  162 +</script>
src/components/date-picker/panel/date.vue deleted
1 -<template>  
2 - <div :class="classes" @mousedown.prevent>  
3 - <div :class="[prefixCls + '-sidebar']" v-if="shortcuts.length">  
4 - <div  
5 - :class="[prefixCls + '-shortcut']"  
6 - v-for="shortcut in shortcuts"  
7 - @click="handleShortcutClick(shortcut)">{{ shortcut.text }}</div>  
8 - </div>  
9 - <div :class="[prefixCls + '-body']">  
10 - <div :class="[datePrefixCls + '-header']" v-show="currentView !== 'time'">  
11 - <span  
12 - :class="iconBtnCls('prev', '-double')"  
13 - @click="changeYear(-1)"><Icon type="ios-arrow-left"></Icon></span>  
14 - <span  
15 - :class="iconBtnCls('prev')"  
16 - @click="changeMonth(-1)"  
17 - v-show="currentView === 'date'"><Icon type="ios-arrow-left"></Icon></span>  
18 - <date-panel-label  
19 - :date-panel-label="datePanelLabel"  
20 - :current-view="currentView"  
21 - :date-prefix-cls="datePrefixCls"/>  
22 - <span  
23 - :class="iconBtnCls('next', '-double')"  
24 - @click="changeYear(+1)"><Icon type="ios-arrow-right"></Icon></span>  
25 - <span  
26 - :class="iconBtnCls('next')"  
27 - @click="changeMonth(+1)"  
28 - v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span>  
29 - </div>  
30 - <div :class="[prefixCls + '-content']">  
31 - <date-table  
32 - v-show="currentView === 'date'"  
33 - :year="year"  
34 - :month="month"  
35 - :date="date"  
36 - :value="value"  
37 - :selection-mode="selectionMode"  
38 - :disabled-date="disabledDate"  
39 - @on-pick="handleDatePick"  
40 - @on-pick-click="handlePickClick"></date-table>  
41 - <year-table  
42 - ref="yearTable"  
43 - v-show="currentView === 'year'"  
44 - :year="year"  
45 - :date="date"  
46 - :selection-mode="selectionMode"  
47 - :disabled-date="disabledDate"  
48 - @on-pick="handleYearPick"  
49 - @on-pick-click="handlePickClick"></year-table>  
50 - <month-table  
51 - ref="monthTable"  
52 - v-show="currentView === 'month'"  
53 - :month="month"  
54 - :date="date"  
55 - :selection-mode="selectionMode"  
56 - :disabled-date="disabledDate"  
57 - @on-pick="handleMonthPick"  
58 - @on-pick-click="handlePickClick"></month-table>  
59 - <time-picker  
60 - ref="timePicker"  
61 - show-date  
62 - v-show="currentView === 'time'"  
63 - @on-pick="handleTimePick"  
64 - @on-pick-click="handlePickClick"></time-picker>  
65 - </div>  
66 - <Confirm  
67 - v-if="confirm"  
68 - :show-time="showTime"  
69 - :is-time="isTime"  
70 - @on-pick-toggle-time="handleToggleTime"  
71 - @on-pick-clear="handlePickClear"  
72 - @on-pick-success="handlePickSuccess"></Confirm>  
73 - </div>  
74 - </div>  
75 -</template>  
76 -<script>  
77 - import Icon from '../../icon/icon.vue';  
78 - import DateTable from '../base/date-table.vue';  
79 - import YearTable from '../base/year-table.vue';  
80 - import MonthTable from '../base/month-table.vue';  
81 - import TimePicker from './time.vue';  
82 - import Confirm from '../base/confirm.vue';  
83 - import datePanelLabel from './date-panel-label.vue';  
84 -  
85 - import Mixin from './mixin';  
86 - import Locale from '../../../mixins/locale';  
87 -  
88 - import { initTimeDate, siblingMonth, formatDateLabels } from '../util';  
89 -  
90 - const prefixCls = 'ivu-picker-panel';  
91 - const datePrefixCls = 'ivu-date-picker';  
92 -  
93 - export default {  
94 - name: 'DatePicker',  
95 - mixins: [ Mixin, Locale ],  
96 - components: { Icon, DateTable, YearTable, MonthTable, TimePicker, Confirm, datePanelLabel },  
97 - data () {  
98 - return {  
99 - prefixCls: prefixCls,  
100 - datePrefixCls: datePrefixCls,  
101 - shortcuts: [],  
102 - currentView: 'date',  
103 - date: initTimeDate(),  
104 - value: '',  
105 - showTime: false,  
106 - selectionMode: 'day',  
107 - disabledDate: '',  
108 - year: null,  
109 - month: null,  
110 - confirm: false,  
111 - isTime: false,  
112 - format: 'yyyy-MM-dd'  
113 - };  
114 - },  
115 - computed: {  
116 - classes () {  
117 - return [  
118 - `${prefixCls}-body-wrapper`,  
119 - {  
120 - [`${prefixCls}-with-sidebar`]: this.shortcuts.length  
121 - }  
122 - ];  
123 - },  
124 - datePanelLabel () {  
125 - if (!this.year) return null; // not ready yet  
126 - const locale = this.t('i.locale');  
127 - const datePanelLabel = this.t('i.datepicker.datePanelLabel');  
128 - const date = new Date(this.year, this.month);  
129 - const { labels, separator } = formatDateLabels(locale, datePanelLabel, date);  
130 -  
131 - const handler = type => {  
132 - return () => (this.currentView = type);  
133 - };  
134 -  
135 - return {  
136 - separator: separator,  
137 - labels: labels.map(obj => ((obj.handler = handler(obj.type)), obj))  
138 - };  
139 - }  
140 - },  
141 - watch: {  
142 - value (newVal) {  
143 - if (!newVal) return;  
144 - newVal = new Date(newVal);  
145 - if (!isNaN(newVal)) {  
146 - this.date = newVal;  
147 - this.setMonthYear(newVal);  
148 - }  
149 - if (this.showTime) this.$refs.timePicker.value = newVal;  
150 - },  
151 - date (val) {  
152 - if (this.showTime) this.$refs.timePicker.date = val;  
153 - },  
154 - format (val) {  
155 - if (this.showTime) this.$refs.timePicker.format = val;  
156 - },  
157 - currentView (val) {  
158 - if (val === 'time') this.$refs.timePicker.updateScroll();  
159 - }  
160 - },  
161 - methods: {  
162 - resetDate () {  
163 - this.date = new Date(this.date);  
164 - },  
165 - setMonthYear(date){  
166 - this.month = date.getMonth();  
167 - this.year = date.getFullYear();  
168 - },  
169 - handleClear () {  
170 - this.date = new Date();  
171 - this.$emit('on-pick', '');  
172 - if (this.showTime) this.$refs.timePicker.handleClear();  
173 - },  
174 - resetView (reset = false) {  
175 - if (this.currentView !== 'time' || reset) {  
176 - if (this.selectionMode === 'month') {  
177 - this.currentView = 'month';  
178 - } else if (this.selectionMode === 'year') {  
179 - this.currentView = 'year';  
180 - } else {  
181 - this.currentView = 'date';  
182 - }  
183 - }  
184 - this.setMonthYear(this.date);  
185 - if (reset) this.isTime = false;  
186 - },  
187 - changeYear(dir){  
188 - if (this.currentView === 'year') {  
189 - this.$refs.yearTable[dir == 1 ? 'nextTenYear' : 'prevTenYear']();  
190 - } else {  
191 - this.year+= dir;  
192 - this.date = siblingMonth(this.date, dir * 12);  
193 - }  
194 - },  
195 - changeMonth(dir){  
196 - this.date = siblingMonth(this.date, dir);  
197 - this.setMonthYear(this.date);  
198 - },  
199 - handleToggleTime () {  
200 - if (this.currentView === 'date') {  
201 - this.currentView = 'time';  
202 - this.isTime = true;  
203 - } else if (this.currentView === 'time') {  
204 - this.currentView = 'date';  
205 - this.isTime = false;  
206 - }  
207 - },  
208 - handleYearPick(year, close = true) {  
209 - this.year = year;  
210 - if (!close) return;  
211 -  
212 - this.date.setFullYear(year);  
213 - if (this.selectionMode === 'year') {  
214 - this.$emit('on-pick', new Date(year, 0, 1));  
215 - } else {  
216 - this.currentView = 'month';  
217 - }  
218 -  
219 - this.resetDate();  
220 - },  
221 - handleMonthPick (month) {  
222 - this.month = month;  
223 - this.date.setMonth(month);  
224 - if (this.selectionMode !== 'month') {  
225 - this.currentView = 'date';  
226 - this.resetDate();  
227 - } else {  
228 - this.year && this.date.setFullYear(this.year);  
229 - this.resetDate();  
230 - const value = new Date(this.date.getFullYear(), month, 1);  
231 - this.$emit('on-pick', value);  
232 - }  
233 - },  
234 - handleDatePick (value) {  
235 - if (this.selectionMode === 'day') {  
236 - this.$emit('on-pick', new Date(value.getTime()));  
237 - this.date = new Date(value);  
238 - }  
239 - },  
240 - handleTimePick (date) {  
241 - this.handleDatePick(date);  
242 - }  
243 - },  
244 - mounted () {  
245 - if (this.selectionMode === 'month') {  
246 - this.currentView = 'month';  
247 - }  
248 -  
249 - if (this.date && !this.year) {  
250 - this.setMonthYear(this.date);  
251 - }  
252 - if (this.showTime) {  
253 - // todo 这里可能有问题,并不能进入到这里,但不影响正常使用  
254 - this.$refs.timePicker.date = this.date;  
255 - this.$refs.timePicker.value = this.value;  
256 - this.$refs.timePicker.format = this.format;  
257 - this.$refs.timePicker.showDate = true;  
258 - }  
259 - }  
260 - };  
261 -</script>