필요 지식
#javascript #jquery #pignose-calendar #moment

웹사이트를 만들면서 지금까지 사용해온 달력 소스가 맘에 들지 않았다면 이번에 피그노즈 캘린더로 바꿔보시는걸 추천합니다.

경로 : https://www.pigno.se/barn/PIGNOSE-Calendar/
설치 : npm install pg-calendar
현재버전 : 1.4.29

피그노즈

JQuery 와 moment 라이브러리를 필요로 하는 이 캘린더는 깔끔한 디자인을 제공할 뿐 아니라 기간 선택과 특정일 비활성화 등을 제공합니다. 그뿐 아니라 다국어도 기본 지원합니다.

세팅

피그노즈 캘린더는 JQuery와 moment에 의존성이 있습니다. 따라서 아래와 같은 순서로 HTML을 작성하셔야 합니다.

  1. <link rel="stylesheet" href="pignose.calendar.min.css">
  2. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  3. <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
  4. <script src="pignose.calendar.full.min.js"></script>

pignose.calendar.min.css 에서는 아래처럼 폰트 파일을 사용하고 있는데 해당 경로에 폰트 파일을 넣어주거나 또는 폰트 파일 위치에 맞게 css를 수정해주셔야 합니다.

  1. @font-face {
  2. font-family: 'pignose-calendar-icon';
  3. src: url("../fonts/pignose.calendar.eot?gpa4vl");
  4. src: url("../fonts/pignose.calendar.eot?gpa4vl#iefix") format('embedded-opentype'), url("../fonts/pignose.calendar.ttf?gpa4vl") format('truetype'), url("../fonts/pignose.calendar.woff?gpa4vl") format('woff'), url("../fonts/pignose.calendar.svg?gpa4vl#pignose.calendar") format('svg');
  5. font-weight: normal;
  6. font-style: normal;
  7. }

만약 AMD 로딩을 사용하거나 node.js 에서 별도의 빌드 환경을 구축해서 쓰고 있다면 위의 순서로 로딩되도록 해주시면 됩니다.

캘린더 사용법

HTML 샘플)

  1. <div>
  2. <input type="text" id="text-calendar1" class="calendar" value="2019-02-01"/> 기본
  3. </div>
  4. <div>
  5. <input type="text" id="text-calendar2" class="calendar" value="2019.02.02"/> 년.월.일 로 포맷변경
  6. </div>
  7. <div>
  8. <input type="text" id="text-calendar3" class="calendar" /> 테마변경
  9. </div>
  10. <div>
  11. <input type="text" id="text-calendar4" class="calendar" /> 한국
  12. </div>
  13. ...

위와 같은 HTML 샘플이 있을 경우 캘린더 적용 방법입니다. 홈페이지에 샘플이 매우 잘 되어있기 떄문에 기본적인 적용 방법과 샘플에 없는 적용 방법 몇 가지를 소개 하겠습니다. 전체 샘플은 가장 하단에 있습니다.

기본)

  1. //기본
  2. $('#text-calendar1').pignoseCalendar();
  3. //년.월.일 로 포맷변경
  4. $('#text-calendar2').pignoseCalendar({
  5. format: 'YYYY.MM.DD' // date format string. (2017-02-02)
  6. });
  7. //테마변경
  8. $('#text-calendar3').pignoseCalendar({
  9. theme: 'dark' // light, dark, blue
  10. });
  11. //한국
  12. $('#text-calendar4').pignoseCalendar({
  13. lang: 'ko'
  14. });

오늘 날짜 비활성화

샘플에도 있듯이 아래와 같이 호출하면 특정일에 대해서 선택하지 못하도록 비활성화 할 수 있습니다. 숙소 예약 사이트라면 만석되어 예약이 불가능한 날은 선택이 못하도록 되어야 할 것입니다.

  1. $('.calendar').pignoseCalendar({
  2. disabledDates: [
  3. '2017-01-01',
  4. '2017-06-01',
  5. '2017-06-02'
  6. ]
  7. });

이때 disabledDates 에 들어가는 날짜는 반드시 ‘년-월-일’ 형태여야 합니다. format 형식을 ‘YYYY.MM.DD’ 로 지정했다 하더라도 반드시 ‘년-월-일’ 형태로 지정해야 합니다. 따라서 오늘 날짜를 비활성화 시키고 싶을때 아래처럼 할 수 있습니다.

  1. $('#text-calendar5').pignoseCalendar({
  2. format: 'YYYY.MM.DD',
  3. disabledDates: [
  4. moment().format("YYYY-MM-DD") //format 속성과 상관없이 반드시 년-월-일 이어야 한다.
  5. ]
  6. });

모든 휴일은 선택 못하게 하고 빨간색 표시

보통 공공기관은 공휴일과 토,일 모두 쉬죠. 만약 고용정보센터 방문 예약 사이트 같은것이 있다고 할 경우 날짜를 선택할때 모든 휴일은 선택하지 못하게 제공하는 것이 좋을 것입니다. 휴일이라고 빨간색으로 보여주면 더 좋겠죠. 아래와 같이 할 수 있습니다.

  1. $('#text-calendar6').pignoseCalendar({
  2. format: 'YYYY.MM.DD',
  3. disabledWeekdays: [0, 6], // SUN (0), SAT (6)
  4. disabledDates: [
  5. '2019-01-01',
  6. '2019-02-04', '2019-02-05','2019-02-06',
  7. '2019-03-01',
  8. '2019-05-06',
  9. '2019-06-06',
  10. '2019-08-15',
  11. '2019-09-12', '2019-09-13',
  12. '2019-10-03', '2019-10-09',
  13. '2019-12-25',
  14. moment().add(-1, 'd').format("YYYY-MM-DD"), //어제 날짜 비활성화
  15. moment().add(1, 'd').format("YYYY-MM-DD") //내일 날짜 비활성화
  16. ]
  17. });

그러나 비활성화된 평일은 휴일처럼 안보이네요. css를 한줄 추가하면 됩니다.

  1. .pignose-calendar-unit-disabled a{color:red !important}

지난 날짜는 선택 못함

앞의 시나리오와 같은 상황입니다. 방문 예약을 하려고 하는데 오늘날짜나 지난 날짜를 예약하는건 말이 안되겠죠? 이전 옵션값에 속성 하나만 추가하면 됩니다.

  1. $('#text-calendar7').pignoseCalendar({
  2. format: 'YYYY.MM.DD',
  3. disabledWeekdays: [0, 6], // SUN (0), SAT (6)
  4. disabledDates: [
  5. '2019-01-01',
  6. '2019-02-04', '2019-02-05','2019-02-06',
  7. '2019-03-01',
  8. '2019-05-06',
  9. '2019-06-06',
  10. '2019-08-15',
  11. '2019-09-12', '2019-09-13',
  12. '2019-10-03', '2019-10-09',
  13. '2019-12-25',
  14. ],
  15. minDate: moment().format("YYYY-MM-DD") //추가
  16. });

전체 적용

색상도 바꾸고 테마도 바꾸고 앞의 시나리오도 적용해 보겠습니다. 어떤가요? 물로 실제로 사이트에 적용할때는 $('#text-calendar8') 가 아니라 $('.calendar') 로 일괄 적용하면 됩니다.

  1. $('#text-calendar8').pignoseCalendar({
  2. format: 'YYYY.MM.DD',
  3. disabledWeekdays: [0, 6], // SUN (0), SAT (6)
  4. theme: 'blue',
  5. lang: 'ko',
  6. disabledDates: [
  7. '2019-01-01',
  8. '2019-02-04', '2019-02-05','2019-02-06',
  9. '2019-03-01',
  10. '2019-05-06',
  11. '2019-06-06',
  12. '2019-08-15',
  13. '2019-09-12', '2019-09-13',
  14. '2019-10-03', '2019-10-09',
  15. '2019-12-25',
  16. ],
  17. minDate: moment().format("YYYY-MM-DD")
  18. });

정리

피그노즈 캘린더는 AMD과 CommonJS 로딩을 지원(UMD)하는 매우 괜찮은 라이브러리 입니다. 그리고 상당히 사용하기 쉽게 되어있죠. 혹시 JQuery의 Datepicker 만 써왔다면 피그노즈 캘린더는 굉장히 괜찮은 선택일 것입니다.

휴일에 대한것은 약간의 편법을 이용했지만 특별히 문제는 없을듯 합니다. 라이브러리에 휴일 기능을 넣고 싶네요

최종 샘플

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <link rel="stylesheet" href="pignose.calendar.min.css">
  8. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  9. <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
  10. <script src="pignose.calendar.full.min.js"></script>
  11. <style>
  12. .pignose-calendar-unit-disabled a{color:red !important}
  13. </style>
  14. <title>Document</title>
  15. </head>
  16. <body>
  17. <div class="wrap">
  18. <div>
  19. <input type="text" id="text-calendar1" class="calendar" value="2019-02-01"/> 기본
  20. </div>
  21. <div>
  22. <input type="text" id="text-calendar2" class="calendar" value="2019.02.02"/> 년.월.일 로 포맷변경
  23. </div>
  24. <div>
  25. <input type="text" id="text-calendar3" class="calendar" /> 테마변경
  26. </div>
  27. <div>
  28. <input type="text" id="text-calendar4" class="calendar" /> 한국
  29. </div>
  30. <div>
  31. <input type="text" id="text-calendar5" class="calendar" /> 오늘 날짜 비활성화
  32. </div>
  33. <div>
  34. <input type="text" id="text-calendar6" class="calendar" /> 휴일은 비활성화 시키고 비활성화 된 모든 날짜는 빨간색 처리
  35. </div>
  36. <div>
  37. <input type="text" id="text-calendar7" class="calendar" /> 지난 날짜는 선택 못함
  38. </div>
  39. <div>
  40. <input type="text" id="text-calendar8" class="calendar" /> 전체
  41. </div>
  42. </div>
  43. <script>
  44. //기본
  45. $('#text-calendar1').pignoseCalendar();
  46. //년.월.일 로 포맷변경
  47. $('#text-calendar2').pignoseCalendar({
  48. format: 'YYYY.MM.DD' // date format string. (2017-02-02)
  49. });
  50. //테마변경
  51. $('#text-calendar3').pignoseCalendar({
  52. theme: 'dark' // light, dark, blue
  53. });
  54. //한국
  55. $('#text-calendar4').pignoseCalendar({
  56. lang: 'ko'
  57. });
  58. //오늘 날짜 비활성화
  59. $('#text-calendar5').pignoseCalendar({
  60. format: 'YYYY.MM.DD',
  61. disabledDates: [
  62. moment().format("YYYY-MM-DD") //format 속성과 상관없이 반드시 년-월-일 이어야 한다.
  63. ]
  64. });
  65. //휴일은 비활성화 시키고 비활성화 된 모든 날짜는 빨간색 처리
  66. $('#text-calendar6').pignoseCalendar({
  67. format: 'YYYY.MM.DD',
  68. disabledWeekdays: [0, 6], // SUN (0), SAT (6)
  69. disabledDates: [
  70. '2019-01-01',
  71. '2019-02-04', '2019-02-05','2019-02-06',
  72. '2019-03-01',
  73. '2019-05-06',
  74. '2019-06-06',
  75. '2019-08-15',
  76. '2019-09-12', '2019-09-13',
  77. '2019-10-03', '2019-10-09',
  78. '2019-12-25',
  79. moment().add(-1, 'd').format("YYYY-MM-DD"), //어제 날짜 비활성화
  80. moment().add(1, 'd').format("YYYY-MM-DD") //내일 날짜 비활성화
  81. ]
  82. });
  83. //지난 날짜는 선택 못함
  84. $('#text-calendar7').pignoseCalendar({
  85. format: 'YYYY.MM.DD',
  86. disabledWeekdays: [0, 6], // SUN (0), SAT (6)
  87. disabledDates: [
  88. '2019-01-01',
  89. '2019-02-04', '2019-02-05','2019-02-06',
  90. '2019-03-01',
  91. '2019-05-06',
  92. '2019-06-06',
  93. '2019-08-15',
  94. '2019-09-12', '2019-09-13',
  95. '2019-10-03', '2019-10-09',
  96. '2019-12-25',
  97. ],
  98. minDate: moment().format("YYYY-MM-DD") //추가
  99. });
  100. $('#text-calendar8').pignoseCalendar({
  101. format: 'YYYY.MM.DD',
  102. disabledWeekdays: [0, 6], // SUN (0), SAT (6)
  103. theme: 'blue',
  104. lang: 'ko',
  105. disabledDates: [
  106. '2019-01-01',
  107. '2019-02-04', '2019-02-05','2019-02-06',
  108. '2019-03-01',
  109. '2019-05-06',
  110. '2019-06-06',
  111. '2019-08-15',
  112. '2019-09-12', '2019-09-13',
  113. '2019-10-03', '2019-10-09',
  114. '2019-12-25',
  115. ],
  116. minDate: moment().format("YYYY-MM-DD")
  117. });
  118. </script>
  119. </body>
  120. </html>