728x90
반응형
비교 날짜 ( 시작과 끝 ) 존재할 때 날짜 유효성 검사 로직
시작 날짜 선택시 고려 사항
End Date 날짜보다 크면
ㄴ "끝 날짜보다 많은 날짜를 선택 할 수 없습니다"
ㄴ Start old Date 를 Start Date 에 삽입
끝 날짜 선택시 고려 사항
Start Date 날짜보다 작으면
ㄴ "시작 날짜보다 적은 날짜를 선택 할 수 없습니다"
ㄴ End old Date 를 End Date 에 삽입
기존 코드
<!--
- Date Picker 사용법
@auther : sbjung@realsn.com
- 이벤트
1. 상위 컴포넌트는 데이터 변경 할 수 있는 이벤트를 만들어 주세요.
2. 이벤트를 'change:datepicker' 로 설정해주세요.
- 기본값 설정
1. dateDefalutValue 에 기본값을 실어서 보내주세요
-->
<template>
<div style = "float: left;">
<div>
<el-button
@click = "changeDisableByDatePicker"
style = "padding: 12px 30px 12px 30px"
round>
<i class = "el-icon-date"></i> {{ date1 }}
<span style = "padding: 0 10px 0 10px"> ~ </span>
<i class = "el-icon-date"></i> {{ date2 }}
</el-button>
</div>
<div
style = "float: left; position :relative; z-index: 0;"
v-if = "dateDisable">
<Datepicker
style = "position: absolute; top: 0; left: 0px;"
v-model = "date1"
:inline = "inline"
:language="ko"
:format = "DatePickerFormat"/>
<Datepicker
style = "position: absolute; top: 0; left: 300px;"
v-model = "date2"
:inline = "inline"
:language="ko"
:format = "DatePickerFormat"/>
</div>
</div>
</template>
<script>
import Datepicker from 'vuejs-datepicker'
import {ko} from 'vuejs-datepicker/dist/locale'
import moment from 'moment';
export default {
name: 'DatePacker_1'
, components: {
Datepicker
}
, props: {
dateDefalutValue: {
type : Array,
default : function (){
return [ '2021/12/11', '2021/12/31' ]
}
}
, closeState : false
}
, data() {
return {
inline : true
, dateDisable : false
, date1 : moment().format('YYYY/MM/DD')
, date2 : moment().format('YYYY/MM/DD')
, DatePickerFormat: 'yyyy-MM-dd'
, ko : ko
}
}
, created (){
if( this.dateDefalutValue != null || this.dateDefalutValue != undefined ){
this.date1 = this.dateDefalutValue[0]
this.date2 = this.dateDefalutValue[1]
}
}
, methods : {
changeDisableByDatePicker ( ){
this.dateDisable = !this.dateDisable
}
, setDatePicker(){
this.$emit('change:datepicker', [
this.date1
, this.date2
])
}
/** 포커스가 벗어나면 date picker 닫아 **/
, documentClick: function( $e ){
var el = this.$el;
var target = $e.target;
if ( el !== target && !el.contains( target ) ) {
this.dateDisable = false;
}
}
}
, watch : {
dateDefalutValue(value){
this.date1 = value[0]
this.date2 = value[1]
}
, date1 ( value ){
this.date1 = moment(new Date(value)).format('YYYY/MM/DD')
this.setDatePicker()
}
, date2( value ){
this.date2 = moment(new Date(value)).format('YYYY/MM/DD')
this.setDatePicker()
}
/** 부모가 data Picker 를 닫을 수 있음 / 여는건 안됨 **/
, closeState ( ){
this.dateDisable = false
}
/** 포커스가 벗어났는지 확인 **/
, dateDisable ( $val ){
if($val){
document.addEventListener( "click", this.documentClick );
}
}
}
}
</script>
<style scoped>
.vdp-datepicker__calendar .cell.selected {
background: #5c80ff;
border-radius: 20px;
color: white;
}
.vdp-datepicker__calendar .cell:not(.blank):not(.disabled).day:hover{
background: #26459b;
border-radius: 20px;
color: white;
border-color: #3f3cff;
}
</style>
비교 코드
<!--
- Date Picker 사용법
@auther : sbjung@realsn.com
- 이벤트
1. 상위 컴포넌트는 데이터 변경 할 수 있는 이벤트를 만들어 주세요.
2. 이벤트를 'change:datepicker' 로 설정해주세요.
- 기본값 설정
1. dateDefalutValue 에 기본값을 실어서 보내주세요
-->
<template>
<div style = "float: left;">
<div>
<el-button
@click = "changeDisableByDatePicker"
style = "padding: 12px 30px 12px 30px"
round>
<i class = "el-icon-date"></i> {{ dateStr1 }}
<span style = "padding: 0 10px 0 10px"> ~ </span>
<i class = "el-icon-date"></i> {{ dateStr2 }}
</el-button>
</div>
<div
style = "float: left; position :relative; z-index: 0;"
v-if = "dateDisable">
<Datepicker
style = "position: absolute; top: 0; left: 0px;"
v-model = "date1"
:inline = "inline"
:language = "ko"
:format = "DatePickerFormat"/>
<Datepicker
style = "position: absolute; top: 0; left: 300px;"
v-model = "date2"
:inline = "inline"
:language = "ko"
:format = "DatePickerFormat"/>
</div>
</div>
</template>
<script>
import Datepicker from 'vuejs-datepicker'
import moment from 'moment';
import { ko } from 'vuejs-datepicker/dist/locale'
export default {
name: 'DatePacker_1'
, components: {
Datepicker
}
, props: {
dateDefalutValue: {
type : Array,
default : function (){
return [
moment().format('YYYY/MM/DD')
, moment().format('YYYY/MM/DD')
]
}
}
, closeState : false
}
, data() {
return {
date1 : moment().format('YYYY/MM/DD')
, date2 : moment().format('YYYY/MM/DD')
, dateStr1 : moment().format('YYYY/MM/DD')
, dateStr2 : moment().format('YYYY/MM/DD')
, DatePickerFormat : 'yyyy-MM-dd'
, dateDisable : false
, inline : true
, ko : ko
, sendDate : []
}
}
, created (){
if( this.dateDefalutValue != null || this.dateDefalutValue != undefined ){
this.date1 = this.dateDefalutValue[0]
this.date2 = this.dateDefalutValue[1]
}
}
, methods : {
changeDisableByDatePicker ( ){
this.dateDisable = !this.dateDisable
}
, setDatePicker(){
// sendDate 는 데이터 연속 전송 방지 변수입니다.
if( this.sendDate[0] === this.date1 && this.sendDate[1] === this.date2 ){
return
}
this.sendDate = [
this.date1
, this.date2
]
this.$emit('change:datepicker', this.sendDate )
}
/** 포커스가 벗어나면 datePicker 닫습니다 **/
, documentClick: function( $e ){
var el = this.$el;
var target = $e.target;
if ( el !== target && !el.contains( target ) ) {
this.dateDisable = false;
}
}
}
, watch : {
dateDefalutValue(value){
this.date1 = value[0]
this.date2 = value[1]
}
, date1 ( newValue , oldValue ){
if( moment(new Date(newValue)).format('YYYY/MM/DD') > moment(new Date(this.date2)).format('YYYY/MM/DD')){
this.$alert('끝 날짜보다 클 수 없습니다')
this.date1 = moment(new Date(oldValue)).format('YYYY/MM/DD')
this.dateStr1 = moment(new Date(oldValue)).format('YYYY/MM/DD')
}else{
this.date1 = moment(new Date(newValue)).format('YYYY/MM/DD')
this.dateStr1 = moment(new Date(newValue)).format('YYYY/MM/DD')
}
this.setDatePicker()
}
, date2( newValue, oldValue ){
if( moment(new Date(newValue)).format('YYYY/MM/DD') < moment(new Date(this.date1)).format('YYYY/MM/DD')){
this.$alert('시작 날짜보다 작을 수 없습니다')
this.date2 = moment(new Date(oldValue)).format('YYYY/MM/DD')
this.dateStr2 = moment(new Date(oldValue)).format('YYYY/MM/DD')
}else{
this.date2 = moment(new Date(newValue)).format('YYYY/MM/DD')
this.dateStr2 = moment(new Date(newValue)).format('YYYY/MM/DD')
}
this.setDatePicker()
}
/** 부모가 data Picker 를 닫을 수 있음 / 여는건 안됨 **/
, closeState ( ){
this.dateDisable = false
}
/** 포커스가 벗어났는지 확인 **/
, dateDisable ( $val ){
if($val){
document.addEventListener( "click", this.documentClick );
}
}
}
}
</script>
<style scoped>
.vdp-datepicker__calendar .cell.selected {
background: #5c80ff;
border-radius: 20px;
color: white;
}
.vdp-datepicker__calendar .cell:not(.blank):not(.disabled).day:hover{
background: #26459b;
border-radius: 20px;
color: white;
border-color: #3f3cff;
}
</style>
728x90
반응형
'개발중 > Vue.js' 카테고리의 다른 글
vue 프로젝트 생성법 (0) | 2022.04.16 |
---|---|
el-tabs tab 크기 조정하기 (0) | 2022.03.23 |
[ vue ] - tree 구현 정리 (0) | 2021.12.29 |
el-date-picker 시작날짜 / 끝날짜 disable (0) | 2021.12.23 |
[ vue ] Date Picker 시작날짜 끝날짜 선택시 고정 (0) | 2021.12.23 |