ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 날짜 input(datepicker)
    프론트엔드/Vue 2022. 1. 14. 15:13
    반응형
    SMALL

    # What?

    날짜 선택 input

     

    # How?

    1. jquery, moment 라이브러리 세팅

    js.zip
    0.11MB

    @ app.blade.php

    <!DOCTYPE html>
    <html>
    <head>
        ...
        <script src="{{ asset('js/jquery-1.12.4') }}" defer></script>
        <script src="{{ asset('js/jquerr-ui-1.12.1') }}" defer></script>
        <script src="{{ asset('js/moment-2.24.0') }}" defer></script>
    </head>
    <body>
    
    </body>
    </html>

    2. vue 세팅

    @ InputDate.vue

    <template>
        <input type="text" :id="id" :value="value">
    </template>
    <script>
    export default {
        props: {
            id: {
                default : "date"
            },
            minDate: {
                default: null
            },
            maxDate: {
                default: null
            },
            disableWeekOfDays:{
                default: () => {
                    return [];
                }
            },
            disableDates: {
                default: () => {
                    return [];
                }
            },
            value: {
                default: null
            }
        },
    
        methods: {
            disableDays(day){
                let month = day.getMonth();
                let date = day.getDate();
                let year = day.getFullYear();
                let formedDay = `${year}-${month+1}-${date}`;
    
                let isDisableWeekOfDay = this.disableWeekOfDays.includes(moment(formedDay).day());
    
                let isDisableDay = this.disableDates.some(disableDate => {
                    return moment(formedDay).format("YY-MM-DD") === moment(disableDate).format("YY-MM-DD");
                });
    
                return [!isDisableDay && !isDisableWeekOfDay];
            }
        },
    
        mounted() {
            let self = this;
    
            $("#" + this.id).datepicker({
                dateFormat: "yy-mm-dd",
                firstDay: 1, // ,월요일부터 시작
                monthNames: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
                monthNamesShort: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
                dayNames: ['일', '월', '화', '수', '목', '금', '토'],
                dayNamesShort: ['일', '월', '화', '수', '목', '금', '토'],
                dayNamesMin: ['일', '월', '화', '수', '목', '금', '토'],
                changeMonth: true, // 월선택 select box 표시 (기본은 false)
                changeYear: true, // 년선택 selectbox 표시 (기본은 false)
                showMonthAfterYear: true,  // 다음년도 월 보이기
                showOtherMonths: true, // 다른 월 달력에 보이기
                selectOtherMonths: true, // 다른 월 달력에 보이는거 클릭 가능하게 하기
    
                onSelect: function (date) {
                    self.$emit('change', date);
                },
                minDate: self.minDate, // n일 이후부터 선택(0이면 오늘부터, 1이면 1일 뒤부터)
                maxDate: self.maxDate, // n일 이후까지만 선택(0이면 오늘날짜까지만, 1이면 1일 뒤까지만)
                beforeShowDay : self.disableDays
            });
    
            // 특정 요일 선택 막기
        }
    }
    </script>
    <template>
        <input type="text" :id="id" :value="value">
    </template>
    <script>
    export default {
        props: {
            id: {
                default : "date"
            },
            minDate: {
                default: null
            },
            maxDate: {
                default: null
            },
            disableWeekOfDays:{
                default: () => {
                    return [];
                }
            },
            disableDates: {
                default: () => {
                    return [];
                }
            },
            value: {
                default: null
            }
        },
    
        methods: {
            disableDays(day){
                let month = day.getMonth();
                let date = day.getDate();
                let year = day.getFullYear();
                let formedDay = `${year}-${month+1}-${date}`;
    
                let isDisableWeekOfDay = this.disableWeekOfDays.includes(moment(formedDay).day());
    
                let isDisableDay = this.disableDates.some(disableDate => {
                    return moment(formedDay).format("YY-MM-DD") === moment(disableDate).format("YY-MM-DD");
                });
    
                return [!isDisableDay && !isDisableWeekOfDay];
            }
        },
    
        mounted() {
            let self = this;
    
            $("#" + this.id).datepicker({
                dateFormat: "yy-mm-dd",
                firstDay: 1, // ,월요일부터 시작
                monthNames: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
                monthNamesShort: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
                dayNames: ['일', '월', '화', '수', '목', '금', '토'],
                dayNamesShort: ['일', '월', '화', '수', '목', '금', '토'],
                dayNamesMin: ['일', '월', '화', '수', '목', '금', '토'],
                changeMonth: true, // 월선택 select box 표시 (기본은 false)
                changeYear: true, // 년선택 selectbox 표시 (기본은 false)
                showMonthAfterYear: true,  // 다음년도 월 보이기
                showOtherMonths: true, // 다른 월 달력에 보이기
                selectOtherMonths: true, // 다른 월 달력에 보이는거 클릭 가능하게 하기
    
                onSelect: function (date) {
                    self.$emit('change', date);
                },
                minDate: self.minDate, // n일 이후부터 선택(0이면 오늘부터, 1이면 1일 뒤부터)
                maxDate: self.maxDate, // n일 이후까지만 선택(0이면 오늘날짜까지만, 1이면 1일 뒤까지만)
                beforeShowDay : self.disableDays
            });
    
            // 특정 요일 선택 막기
        }
    }
    </script>

     

    @ Create.vue

    <template>
              <div class="m-input-text type01">
                     <input-date :value="form.delivery_started_at" @change="(data) => {form.delivery_started_at = data; create()}" />
    
    
                      <p class="m-input-error">{{form.errors.delivery_started_at}}</p>
               </div>
    </template>
    <script>
    
    import InputDate from "../../Components/Form/InputDate";
    export default {
        components: {InputDate},
    
        data() {
            return {
                form: this.$inertia.form({
                    "delivery_started_at" : this.$page.props.delivery_started_at,
                }),
    
            }
        },
    
        methods: {
            create(){
                this.form.get("/dietProducts/create", {
                    preserveScroll: true,
                });
            },
        },
    
    
        }
    }
    </script>

     

     

    LIST

    댓글

Designed by Tistory.