xiongchao 3 년 전
부모
커밋
46bb01d10d
72개의 변경된 파일8143개의 추가작업 그리고 59개의 파일을 삭제
  1. 244 0
      public/tui-calendar/css/default.css
  2. 80 0
      public/tui-calendar/css/icons.css
  3. 21 0
      public/tui-calendar/css/tui-example-style.css
  4. 1164 0
      public/tui-calendar/dist/tui-calendar.css
  5. 0 0
      public/tui-calendar/dist/tui-calendar.css.map
  6. 286 0
      public/tui-calendar/dist/tui-calendar.js
  7. 0 0
      public/tui-calendar/dist/tui-calendar.js.map
  8. 5 0
      public/tui-calendar/dist/tui-calendar.min.css
  9. 0 0
      public/tui-calendar/dist/tui-calendar.min.css.map
  10. 6 0
      public/tui-calendar/dist/tui-calendar.min.js
  11. 0 0
      public/tui-calendar/dist/tui-calendar.min.js.map
  12. 124 0
      public/tui-calendar/example00-basic.html
  13. BIN
      public/tui-calendar/fonts/icon.eot
  14. 17 0
      public/tui-calendar/fonts/icon.svg
  15. BIN
      public/tui-calendar/fonts/icon.ttf
  16. BIN
      public/tui-calendar/fonts/icon.woff
  17. BIN
      public/tui-calendar/images/ic-arrow-line-left.png
  18. BIN
      public/tui-calendar/images/ic-arrow-line-left@2x.png
  19. BIN
      public/tui-calendar/images/ic-arrow-line-left@3x.png
  20. BIN
      public/tui-calendar/images/ic-arrow-line-right.png
  21. BIN
      public/tui-calendar/images/ic-arrow-line-right@2x.png
  22. BIN
      public/tui-calendar/images/ic-arrow-line-right@3x.png
  23. BIN
      public/tui-calendar/images/ic-traveltime-w.png
  24. BIN
      public/tui-calendar/images/ic-view-day.png
  25. BIN
      public/tui-calendar/images/ic-view-day@2x.png
  26. BIN
      public/tui-calendar/images/ic-view-day@3x.png
  27. BIN
      public/tui-calendar/images/ic-view-month.png
  28. BIN
      public/tui-calendar/images/ic-view-month@2x.png
  29. BIN
      public/tui-calendar/images/ic-view-month@3x.png
  30. BIN
      public/tui-calendar/images/ic-view-week.png
  31. BIN
      public/tui-calendar/images/ic-view-week@2x.png
  32. BIN
      public/tui-calendar/images/ic-view-week@3x.png
  33. BIN
      public/tui-calendar/images/icon.png
  34. BIN
      public/tui-calendar/images/img-bi.png
  35. BIN
      public/tui-calendar/images/img-bi@2x.png
  36. BIN
      public/tui-calendar/images/img-bi@3x.png
  37. 0 0
      public/tui-calendar/js/1.1.8/chance.min.js
  38. 0 0
      public/tui-calendar/js/2.24.0/moment.min.js
  39. 454 0
      public/tui-calendar/js/app.js
  40. 1912 0
      public/tui-calendar/js/chance-1.0.13.min.js
  41. 141 0
      public/tui-calendar/js/data/calendars.js
  42. 201 0
      public/tui-calendar/js/data/schedules.js
  43. 190 0
      public/tui-calendar/js/default.js
  44. 1 0
      public/tui-calendar/js/jquery-3.1.1.min.js
  45. 2370 0
      public/tui-calendar/js/moment-2.20.1.min.js
  46. 117 0
      public/tui-calendar/js/theme/dooray.js
  47. 6 0
      public/tui-calendar/js/tui-calendar.min.js
  48. 32 0
      src/api/check/checkjob.js
  49. 77 0
      src/components/G2/G2Chart.vue
  50. 2 1
      src/components/index.js
  51. 4 4
      src/components/tools/UserMenu.vue
  52. 5 2
      src/router/generator-platform-routers.js
  53. 13 1
      src/utils/dict.js
  54. 11 0
      src/views/check/checkjob/CheckJob.vue
  55. 11 0
      src/views/check/checkjob/modules/DetailSbCheckJob.vue
  56. 12 0
      src/views/check/checkstandard/CheckStandard.vue
  57. 29 2
      src/views/check/checkstandard/modules/BaseForm.vue
  58. 59 18
      src/views/check/checkstandard/modules/CheckStandardSelectModal.vue
  59. 10 6
      src/views/check/checkstandard/modules/Detail.vue
  60. 11 0
      src/views/check/checkstandard/modules/DetailSbCheck.vue
  61. 136 0
      src/views/dashboard/CheckJobReport.vue
  62. 27 4
      src/views/repair/application-form/RepairApplicationForm.vue
  63. 91 10
      src/views/repair/application-form/RepairCheckForm.vue
  64. 28 5
      src/views/repair/application-form/RepairForm.vue
  65. 6 0
      src/views/repair/repair-reason/RepairReason.vue
  66. 40 1
      src/views/repair/repair-reason/modules/BaseForm.vue
  67. 3 0
      src/views/repair/repair-reason/modules/Detail.vue
  68. 6 0
      src/views/repair/repair-reason/modules/DetailRepairReason.vue
  69. 6 0
      src/views/repair/repair-reason/modules/RepairReasonTable.vue
  70. 49 4
      src/views/sb/info/modules/BaseForm.vue
  71. 20 1
      src/views/sb/info/modules/Detail.vue
  72. 116 0
      src/views/sb/info/modules/ParamForm.vue

+ 244 - 0
public/tui-calendar/css/default.css

@@ -0,0 +1,244 @@
+@import url(https://fonts.googleapis.com/css?family=Noto+Sans);
+
+body {
+  font-family: 'Noto Sans', sans-serif;
+  font-size: 12px;
+}
+
+/**  custom bootstrap - start */
+.btn {
+  border-radius: 25px;
+  border-color: #ddd;
+}
+
+.btn:hover {
+  border: solid 1px #bbb;
+  background-color: #fff;
+}
+
+.btn:active {
+  background-color: #f9f9f9;
+  border: solid 1px #bbb;
+  outline: none;
+}
+
+.btn:disabled {
+  background-color: #f9f9f9;
+  border: solid 1px #ddd;
+  color: #bbb;
+}
+
+.btn:focus:active, .btn:focus, .btn:active {
+  outline: none;
+}
+
+.open > .dropdown-toggle.btn-default {
+  background-color: #fff;
+}
+
+.dropdown-menu {
+  top: 25px;
+  padding: 3px 0;
+  border-radius: 2px;
+  border: 1px solid #bbb;
+}
+
+.dropdown-menu > li > a {
+  padding: 9px 12px;
+  cursor: pointer;
+}
+
+.dropdown-menu > li > a:hover {
+  background-color: rgba(81, 92, 230, 0.05);
+  color: #333;
+}
+
+.bi15 {
+  width: 15px;
+  height: 15px;
+}
+/** custom fontawesome - end */
+
+.calendar-icon {
+  width: 14px;
+  height: 14px;
+}
+
+#top {
+  height: 49px;
+  border-bottom: 1px solid #bbb;
+  padding: 16px;
+  font-size: 10px;
+}
+
+#lnb {
+  position: absolute;
+  width: 200px;
+  top: 49px;
+  bottom: 0;
+  border-right: 1px solid #d5d5d5;
+  padding: 12px 10px;
+  background: #fafafa;
+}
+
+#right {
+  position: absolute;
+  left: 200px;
+  top: 49px;
+  right: 0;
+  bottom: 0;
+}
+
+#lnb label {
+  margin-bottom: 0;
+  cursor: pointer;
+}
+
+.lnb-new-schedule {
+  padding-bottom: 12px;
+  border-bottom: 1px solid #e5e5e5;
+}
+
+.lnb-new-schedule-btn {
+  height: 100%;
+  font-size: 14px;
+  background-color: #ff6618;
+  color: #ffffff;
+  border: 0;
+  border-radius: 25px;
+  padding: 10px 20px;
+  font-weight: bold;
+}
+
+.lnb-new-schedule-btn:hover {
+  height: 100%;
+  font-size: 14px;
+  background-color: #e55b15;
+  color: #ffffff;
+  border: 0;
+  border-radius: 25px;
+  padding: 10px 20px;
+  font-weight: bold;
+}
+
+.lnb-new-schedule-btn:active {
+  height: 100%;
+  font-size: 14px;
+  background-color: #d95614;
+  color: #ffffff;
+  border: 0;
+  border-radius: 25px;
+  padding: 10px 20px;
+  font-weight: bold;
+}
+
+.lnb-calendars > div {
+  padding: 12px 16px;
+  border-bottom: 1px solid #e5e5e5;
+  font-weight: normal;
+}
+
+.lnb-calendars-d1 {
+  padding-left: 8px;
+}
+
+.lnb-calendars-d1 label {
+  font-weight: normal;
+}
+
+.lnb-calendars-item {
+  min-height: 14px;
+  line-height: 14px;
+  padding: 8px 0;
+}
+
+.lnb-footer {
+  color: #999;
+  font-size: 11px;
+  position: absolute;
+  bottom: 12px;
+  padding-left: 16px;
+}
+
+#menu {
+  padding: 16px;
+}
+
+#dropdownMenu-calendarType {
+  padding: 0 8px 0 11px;
+}
+
+#calendarTypeName {
+  min-width: 62px;
+  display: inline-block;
+  text-align: left;
+  line-height: 30px;
+}
+
+.move-today {
+  padding: 0 16px;
+  line-height: 30px;
+}
+
+.move-day {
+  padding: 8px;
+  font-size: 0;
+}
+
+#renderRange {
+  padding-left: 12px;
+  font-size: 19px;
+  vertical-align: middle;
+}
+
+.dropdown-menu-title .calendar-icon {
+  margin-right: 8px;
+}
+
+.calendar-bar {
+  width: 16px;
+  height: 16px;
+  margin-right: 5px;
+  display: inline-block;
+  border: 1px solid #eee;
+  vertical-align: middle;
+}
+
+.calendar-name {
+    font-size: 14px;
+    font-weight: bold;
+    vertical-align: middle;
+}
+
+.schedule-time {
+    color: #005aff;
+}
+
+#calendar {
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 5px;
+    top: 64px;
+}
+
+/** custom fontawesome */
+.fa {
+    width: 12px;
+    height: 12px;
+    margin-right: 2px;
+}
+
+.weekday-grid-more-schedules {
+  float: right;
+  margin-top: 4px;
+  margin-right: 6px;
+  height: 18px;
+  line-height: 17px;
+  padding: 0 5px;
+  border-radius: 3px;
+  border: 1px solid #ddd;
+  font-size: 12px;
+  text-align: center;
+  color: #000;
+}

+ 80 - 0
public/tui-calendar/css/icons.css

@@ -0,0 +1,80 @@
+/* font icons */
+@font-face {
+    font-family: 'tui-calendar-font-icon';
+    src: url('../fonts/icon.eot') format('embedded-opentype'),
+         url('../fonts/icon.ttf') format('truetype'),
+         url('../fonts/icon.woff') format('woff'),
+         url('../fonts/icon.svg') format('svg');
+}
+
+.calendar-icon {
+  width: 14px;
+  height: 14px;
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.calendar-font-icon {
+  font-family: 'tui-calendar-font-icon';
+  font-size: 10px;
+  font-weight: normal;
+}
+
+.img-bi {
+  background: url('../images/img-bi.png') no-repeat;
+  width: 215px;
+  height: 16px;
+}
+
+.ic_view_month {
+  background: url('../images/ic-view-month.png') no-repeat;
+}
+
+.ic_view_week {
+  background: url('../images/ic-view-week.png') no-repeat;
+}
+
+.ic_view_day {
+  background: url('../images/ic-view-day.png') no-repeat;
+}
+
+.ic-arrow-line-left {
+  background: url('../images/ic-arrow-line-left.png') no-repeat;
+}
+
+.ic-arrow-line-right {
+  background: url('../images/ic-arrow-line-right.png') no-repeat;
+}
+
+.ic-travel-time {
+  background: url('../images/ic-traveltime-w.png') no-repeat;
+}
+
+/* font icons */
+.ic-location-b:before {
+  content: '\e900';
+}
+
+.ic-lock-b:before {
+  content: '\e901';
+}
+
+.ic-milestone-b:before {
+  content: '\e902';
+}
+
+.ic-readonly-b:before {
+  content: '\e903';
+}
+
+.ic-repeat-b:before {
+  content: '\e904';
+}
+
+.ic-state-b:before {
+  content: '\e905';
+}
+
+.ic-user-b:before {
+  content: '\e906';
+}

+ 21 - 0
public/tui-calendar/css/tui-example-style.css

@@ -0,0 +1,21 @@
+body {
+  margin: 0;
+  padding: 0;
+}
+
+.code-description {
+  padding: 22px 52px;
+  background-color: rgba(81, 92, 230, 0.1);
+  line-height: 1.4em;
+}
+
+.code-description,
+.code-description a {
+  font-family: Arial;
+  font-size: 14px;
+  color: #515ce6;
+}
+
+.code-html {
+  padding: 20px 52px;
+}

+ 1164 - 0
public/tui-calendar/dist/tui-calendar.css

@@ -0,0 +1,1164 @@
+/*!
+ * TOAST UI Calendar
+ * @version 1.14.1 | Wed Sep 01 2021
+ * @author NHN FE Development Lab <dl_javascript@nhn.com>
+ * @license MIT
+ */
+.tui-full-calendar-layout {
+  height: 100%;
+  position: relative;
+  box-sizing: border-box;
+}
+.tui-full-calendar-layout * {
+  box-sizing: border-box;
+}
+.tui-full-calendar-dragging {
+  cursor: move;
+}
+.tui-full-calendar-resizing {
+  cursor: row-resize;
+}
+.tui-full-calendar-resizing-x {
+  cursor: col-resize;
+}
+.tui-full-calendar-hidden {
+  display: none !important;
+}
+.tui-full-calendar-invisible span {
+  visibility: hidden;
+}
+.tui-full-calendar-clear:after {
+  content: '';
+  display: block;
+  clear: both;
+}
+.tui-full-calendar-scroll-y {
+  overflow-y: scroll;
+}
+.tui-full-calendar-dot {
+  display: inline-block;
+  position: relative;
+  top: -1px;
+  content: '';
+  width: 7px;
+  height: 7px;
+  border-radius: 50%;
+}
+.tui-full-calendar-holiday {
+  color: #f00;
+}
+.tui-full-calendar-today {
+  background: rgba(218,229,249,0.3);
+}
+.handle-x {
+  background-position: center center;
+  background-repeat: no-repeat;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAMAAACEE47CAAAACVBMVEX///////////+OSuX+AAAAA3RSTlMrQJG5H4EIAAAAEUlEQVR4AWNgYoRABhjEFAEAArQAIcHQcPsAAAAASUVORK5CYII=);
+}
+.handle-y {
+  background-position: center center;
+  background-repeat: no-repeat;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAICAMAAADp7a43AAAACVBMVEX///////////+OSuX+AAAAA3RSTlMrQJG5H4EIAAAAEUlEQVR4AWNgYmRiZABB/CwAAtgAIUTUNkMAAAAASUVORK5CYII=);
+}
+@media only screen and (-moz-min-device-pixel-ratio: 1.5), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-devicepixel-ratio: 1.5), only screen and (min-resolution: 1.5dppx) {
+  .handle-x {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAMAAADHqI+lAAAACVBMVEX///////////+OSuX+AAAAA3RSTlMZK5EY+QKaAAAAGUlEQVR4AWNgYmJAwegCIMDIiIwxBKhhBgAcSABh8gN42gAAAABJRU5ErkJggg==);
+    background-size: 8px 4px;
+  }
+  .handle-y {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAMAAAAcVM5PAAAACVBMVEX///////////+OSuX+AAAAA3RSTlMEK5EMBzK5AAAAGElEQVR4AWNgYmIAYxgDBBgZQRjOoKcaABzQAGGjsIM/AAAAAElFTkSuQmCC);
+    background-size: 4px 8px;
+  }
+}
+.tui-full-calendar-month-week-item .tui-full-calendar-weekday-grid {
+  overflow-y: hidden;
+}
+.tui-full-calendar-month-week-item .tui-full-calendar-weekday-schedules {
+  overflow-y: visible;
+  height: 0;
+}
+.tui-full-calendar-month-week-item .tui-full-calendar-weekday-schedule {
+  margin: 0 10px;
+}
+.tui-full-calendar-month-week-item .tui-full-calendar-today {
+  background: none;
+}
+.tui-full-calendar-month-week-item .tui-full-calendar-today .tui-full-calendar-weekday-grid-date-decorator {
+  display: inline-block;
+  width: 27px;
+  height: 27px;
+  line-height: 27px;
+  text-align: center;
+  background: #135de6;
+  border-radius: 50%;
+  color: #fff;
+  font-weight: bold;
+  margin-left: 2px;
+}
+.tui-full-calendar-weekday-container,
+.tui-full-calendar-weekday-grid,
+.tui-full-calendar-weekday-grid-line {
+  height: 100%;
+  min-height: inherit;
+}
+.tui-full-calendar-weekday-grid {
+  position: absolute;
+  width: 100%;
+  overflow-y: scroll;
+}
+.tui-full-calendar-weekday-border {
+  border-top: 1px solid #ddd;
+}
+.tui-full-calendar-weekday-container {
+  position: relative;
+}
+.tui-full-calendar-weekday-container>div {
+  height: 100%;
+}
+.tui-full-calendar-weekday-grid-line {
+  position: absolute;
+  padding: 3px;
+}
+.tui-full-calendar-weekday-grid-line .tui-full-calendar-weekday-grid-footer {
+  position: absolute;
+  bottom: 4px;
+}
+.tui-full-calendar-weekday-grid-line .tui-full-calendar-weekday-grid-date {
+  display: inline-block;
+  width: 27px;
+  height: 27px;
+  line-height: 27px;
+  text-align: center;
+}
+.tui-full-calendar-weekday-grid-line .tui-full-calendar-weekday-grid-date-title {
+  line-height: 27px;
+  margin-right: 5px;
+}
+.tui-full-calendar-weekday-grid-line .tui-full-calendar-weekday-grid-more-schedules {
+  float: right;
+  display: inline-block;
+  height: 27px;
+  line-height: 27px;
+  padding: 0 5px;
+  text-align: center;
+  font-size: 11px;
+  font-weight: bold;
+  color: #aaa;
+}
+.tui-full-calendar-weekday-creation {
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  overflow-y: scroll;
+}
+.tui-full-calendar-weekday-schedules {
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  font-size: 12px;
+  overflow-y: scroll;
+}
+.tui-full-calendar-weekday-schedules-height-span {
+  width: 1px;
+  margin-left: -1px;
+}
+.tui-full-calendar-weekday-schedule-block {
+  position: absolute;
+}
+.tui-full-calendar-weekday-schedule-block-dragging-dim {
+  opacity: 0.3;
+}
+.tui-full-calendar-weekday-schedule {
+  position: relative;
+  margin: 0 10px 0 1px;
+  cursor: pointer;
+  border-left-style: solid;
+  border-left-width: 3px;
+}
+.tui-full-calendar-weekday-schedule.tui-full-calendar-weekday-schedule-time {
+  border-left-width: 0;
+}
+.tui-full-calendar-weekday-schedule.tui-full-calendar-weekday-schedule-time .tui-full-calendar-weekday-schedule-title {
+  padding-left: 9px;
+}
+.tui-full-calendar-weekday-schedule-bullet {
+  position: absolute;
+  padding: 0;
+  width: 6px;
+  height: 6px;
+  top: 6px;
+  left: 0;
+  border-radius: 50%;
+}
+.tui-full-calendar-weekday-schedule-bullet-focused {
+  left: 10px;
+  background: #fff;
+}
+.tui-full-calendar-weekday-schedule-title {
+  display: block;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  padding-left: 3px;
+  font-weight: bold;
+}
+.tui-full-calendar-weekday-schedule-title-focused {
+  padding-left: 16px;
+}
+.tui-full-calendar-weekday-schedule-cover {
+  position: absolute;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0,0,0,0.2);
+  box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);
+}
+.tui-full-calendar-weekday-exceed-left .tui-full-calendar-weekday-schedule {
+  margin-left: 0;
+  border-left-width: 0;
+}
+.tui-full-calendar-weekday-exceed-right .tui-full-calendar-weekday-schedule {
+  margin-right: 0;
+}
+.tui-full-calendar-weekday-exceed-right .tui-full-calendar-weekday-resize-handle {
+  display: none;
+}
+.tui-full-calendar-weekday-exceed-in-month {
+  cursor: pointer;
+}
+.tui-full-calendar-weekday-exceed-in-month:hover {
+  background-color: #f0f1f5;
+}
+.tui-full-calendar-weekday-exceed-in-week,
+.tui-full-calendar-weekday-collapse-btn {
+  position: absolute;
+  bottom: 5px;
+  margin-right: 5px;
+  font-size: 12px;
+  line-height: 14px;
+  cursor: pointer;
+  padding: 1px 5px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  color: #000;
+}
+.tui-full-calendar-weekday-resize-handle {
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 6px;
+  background-position: 3px center;
+  cursor: col-resize;
+  line-height: 18px;
+}
+.tui-full-calendar-weekday-filled {
+  background-color: #e8e8e8 !important;
+}
+.tui-full-calendar-left {
+  height: 100%;
+  float: left;
+  box-sizing: border-box;
+  display: table;
+}
+.tui-full-calendar-left-content {
+  display: table-cell;
+  vertical-align: middle;
+  text-align: right;
+  font-size: 11px;
+}
+.tui-full-calendar-right {
+  height: 100%;
+  overflow-y: scroll;
+  position: relative;
+}
+.tui-full-calendar-week-container {
+  width: 100%;
+  height: inherit;
+  display: inline-block;
+  font-size: 10px;
+  min-height: 600px;
+}
+.tui-full-calendar-week-container .tui-full-calendar-today {
+  background: none;
+}
+.tui-full-calendar-dayname {
+  position: absolute;
+  margin-left: -1px;
+  height: 100%;
+  overflow: hidden;
+}
+.tui-full-calendar-dayname.tui-full-calendar-today {
+  font-weight: bold;
+}
+.tui-full-calendar-dayname-container {
+  overflow-y: scroll;
+}
+.tui-full-calendar-dayname-leftmargin {
+  position: relative;
+  height: 100%;
+}
+.tui-full-calendar-dayname-date {
+  font-size: 26px;
+}
+.tui-full-calendar-dayname-name {
+  font-weight: bold;
+  font-size: 12px;
+}
+.tui-full-calendar-daygrid-layout {
+  height: 100%;
+}
+.tui-full-calendar-daygrid-layout .tui-full-calendar-right {
+  overflow-y: hidden;
+}
+.tui-full-calendar-daygrid-guide-creation-block {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  z-index: 1;
+}
+.tui-full-calendar-timegrid-container {
+  height: 100%;
+  position: relative;
+  overflow: hidden;
+  overflow-y: scroll;
+}
+.tui-full-calendar-timegrid-container-split {
+  height: 100%;
+  position: relative;
+  overflow: hidden;
+}
+.tui-full-calendar-timegrid-left {
+  position: absolute;
+}
+.tui-full-calendar-timegrid-hour {
+  position: relative;
+  color: #555;
+  box-sizing: border-box;
+}
+.tui-full-calendar-timegrid-hour:first-child span {
+  display: none;
+}
+.tui-full-calendar-timegrid-hour:last-child {
+  border-bottom: none;
+}
+.tui-full-calendar-timegrid-hour span {
+  position: absolute;
+  top: -11px;
+  left: 0;
+  right: 5px;
+  text-align: right;
+  line-height: 25px;
+}
+.tui-full-calendar-timegrid-right {
+  position: relative;
+}
+.tui-full-calendar-timegrid-gridline {
+  border-bottom: 1px solid #eee;
+  box-sizing: border-box;
+}
+.tui-full-calendar-timegrid-gridline:last-child {
+  border-bottom: none;
+}
+.tui-full-calendar-timegrid-schedules {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  cursor: pointer;
+}
+.tui-full-calendar-timegrid-hourmarker {
+  position: absolute;
+  width: 100%;
+  display: table;
+}
+.tui-full-calendar-timegrid-hourmarker-line-left {
+  position: absolute;
+  min-height: 1px;
+  left: 0;
+}
+.tui-full-calendar-timegrid-hourmarker-line-today {
+  position: absolute;
+  min-height: 1px;
+}
+.tui-full-calendar-timegrid-hourmarker-line-right {
+  position: absolute;
+  min-height: 1px;
+  right: 0;
+}
+.tui-full-calendar-timegrid-hourmarker-time {
+  padding-right: 5px;
+  line-height: 12px;
+  text-align: right;
+  display: table-cell;
+  vertical-align: bottom;
+}
+.tui-full-calendar-timegrid-todaymarker {
+  position: absolute;
+  text-indent: -9999px;
+  width: 9px;
+  height: 9px;
+  background-color: #135de6;
+  margin: -4px 0 0 -5px;
+  border-radius: 50%;
+}
+.tui-full-calendar-timegrid-sticky-container {
+  position: absolute;
+  top: 0;
+}
+.tui-full-calendar-timegrid-timezone-label-container {
+  position: absolute;
+}
+.tui-full-calendar-timegrid-timezone-label-cell {
+  display: table;
+}
+.tui-full-calendar-timegrid-timezone-label {
+  display: table-cell;
+  vertical-align: middle;
+  padding-right: 5px;
+  text-align: right;
+}
+.tui-full-calendar-timegrid-timezone-close-btn {
+  cursor: pointer;
+  position: absolute;
+  text-align: center;
+  background-color: #fff;
+}
+.tui-full-calendar-timegrid-timezone-close-btn .tui-full-calendar-icon {
+  width: 5px;
+  height: 10px;
+}
+.tui-full-calendar-time-date {
+  position: absolute;
+  height: 100%;
+  margin-left: -1px;
+  box-sizing: content-box;
+}
+.tui-full-calendar-time-date:last-child {
+  border-right: none;
+  margin: 0;
+}
+.tui-full-calendar-time-date:last-child .tui-full-calendar-time-schedule,
+.tui-full-calendar-time-date:last-child .tui-full-calendar-time-guide-creation {
+  left: 0px;
+}
+.tui-full-calendar-time-date-schedule-block-wrap {
+  position: relative;
+  height: 100%;
+}
+.tui-full-calendar-time-date-schedule-block {
+  position: absolute;
+  right: 0px;
+}
+.tui-full-calendar-time-date-schedule-block-pending {
+  opacity: 0.7;
+}
+.tui-full-calendar-time-date-schedule-block-dragging-dim {
+  opacity: 0.3;
+}
+.tui-full-calendar-time-date-schedule-block-focused {
+  box-shadow: 0 0 8px 0 rgba(0,0,0,0.2);
+}
+.tui-full-calendar-time-date-schedule-block-cover {
+  position: absolute;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0,0,0,0.2);
+  box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);
+}
+.tui-full-calendar-time-schedule {
+  position: relative;
+  left: 1px;
+  height: 100%;
+  overflow: hidden;
+  font-size: 12px;
+  font-weight: bold;
+}
+.tui-full-calendar-time-schedule-content {
+  overflow: hidden;
+  border-left-width: 3px;
+  border-left-style: solid;
+  padding: 1px 0 0 3px;
+}
+.tui-full-calendar-time-schedule-content-travel-time {
+  font-weight: normal;
+  font-size: 11px;
+}
+.tui-full-calendar-time-resize-handle {
+  position: absolute;
+  right: 0px;
+  bottom: 0px;
+  left: 0px;
+  height: 5px;
+  text-align: center;
+  color: #fff;
+  cursor: row-resize;
+  background-position: center top;
+}
+.tui-full-calendar-time-guide-creation {
+  position: absolute;
+  right: 10px;
+  left: 1px;
+  padding: 3px;
+}
+.tui-full-calendar-time-guide-move .tui-full-calendar-time-schedule,
+.tui-full-calendar-time-guide-resize .tui-full-calendar-time-schedule,
+.tui-full-calendar-time-guide-move .tui-full-calendar-time-resize-handle,
+.tui-full-calendar-time-guide-resize .tui-full-calendar-time-resize-handle {
+  opacity: 0.8;
+  z-index: 97;
+}
+.tui-full-calendar-time-guide-creation-label {
+  cursor: default;
+}
+.tui-full-calendar-time-guide-bottom {
+  position: absolute;
+  bottom: 3px;
+}
+.tui-full-calendar-month {
+  height: 100%;
+  min-height: 600px;
+}
+.tui-full-calendar-month-dayname {
+  width: 100%;
+  position: absolute;
+  font-size: 13px;
+}
+.tui-full-calendar-month-dayname-item {
+  height: 100%;
+  font-weight: bold;
+}
+.tui-full-calendar-month-week-item {
+  position: relative;
+}
+.tui-full-calendar-month-week-item>div {
+  height: 100%;
+}
+.tui-full-calendar-month-more {
+  height: inherit;
+  min-width: 280px;
+  min-height: 150px;
+}
+.tui-full-calendar-month-more-title {
+  position: relative;
+}
+.tui-full-calendar-month-more-title-day {
+  font-size: 23px;
+  color: #333;
+}
+.tui-full-calendar-month-more-title-day-label {
+  font-size: 12px;
+  color: #333;
+}
+.tui-full-calendar-month-more-close {
+  position: absolute;
+  right: 0;
+  outline: 0;
+  background: none;
+  border: 0;
+  font-size: 14px;
+  line-height: 28px;
+  padding: 0 7px;
+  cursor: pointer;
+}
+.tui-full-calendar-month-more-list {
+  overflow-y: auto;
+}
+.tui-full-calendar-month-more-schedule {
+  cursor: pointer;
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  font-size: 12px;
+}
+.tui-full-calendar-month-guide-block {
+  position: absolute;
+}
+.tui-full-calendar-month-weekday-schedule {
+  margin-top: 2px;
+}
+.tui-full-calendar-month-creation-guide {
+  top: 0;
+  bottom: -1px;
+  left: -1px;
+  right: 0;
+  position: absolute;
+  z-index: 20;
+}
+.tui-full-calendar-month-guide-focused {
+  box-shadow: 0 0 8px 0 rgba(0,0,0,0.2);
+}
+.tui-full-calendar-month-guide {
+  position: relative;
+  padding-left: 3px;
+  line-height: 18px;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+.tui-full-calendar-month-guide-cover {
+  width: 100%;
+  position: absolute;
+  top: -50%;
+  left: -50%;
+  background-color: rgba(0,0,0,0.2);
+  box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);
+}
+.tui-full-calendar-month-exceed-left .tui-full-calendar-month-guide {
+  margin-left: 0px;
+}
+.tui-full-calendar-month-exceed-right .tui-full-calendar-month-guide {
+  margin-right: 0px;
+}
+.tui-full-calendar-month-exceed-right .tui-full-calendar-month-guide-handle {
+  display: none;
+}
+.tui-full-calendar-month-guide-handle {
+  position: absolute;
+  top: 0;
+  right: 3px;
+  width: 6px;
+  background-position: 3px center;
+  cursor: col-resize;
+}
+.tui-full-calendar-vlayout-container {
+  position: relative;
+}
+.tui-full-calendar-splitter {
+  clear: left;
+  cursor: row-resize;
+}
+.tui-full-calendar-splitter:hover {
+  border-color: #999;
+}
+.tui-full-calendar-splitter-focused {
+  background-color: #ddd;
+  border: none;
+}
+.tui-full-calendar-splitter-guide {
+  position: absolute;
+  width: 100%;
+  height: 3px;
+  border: none;
+  background-color: #e8e8e8;
+}
+.tui-full-calendar-popup {
+  position: absolute;
+  font-weight: 2.5;
+  box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);
+  clear: both;
+}
+.tui-full-calendar-popup-container {
+  min-width: 474px;
+  box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1);
+  background-color: #fff;
+  border: solid 1px #d5d5d5;
+  padding: 17px;
+  border-radius: 2px;
+}
+.tui-full-calendar-popup-section {
+  font-size: 0;
+  min-height: 40px;
+}
+.tui-full-calendar-section-calendar {
+  width: 176px;
+}
+.tui-full-calendar-section-calendar.tui-full-calendar-hide {
+  height: 21px;
+  visibility: hidden;
+}
+.tui-full-calendar-section-title {
+  width: calc(100% - 36px);
+  padding-right: 4px;
+}
+.tui-full-calendar-section-title input {
+  width: 365px;
+}
+.tui-full-calendar-button.tui-full-calendar-section-private {
+  height: 32px;
+  padding: 8px;
+  font-size: 0;
+  margin-left: 4px;
+}
+.tui-full-calendar-section-private.tui-full-calendar-public .tui-full-calendar-ic-private {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAKdJREFUKBVjYCATMKLri46Olvn9+3fX////HUByjIyMB1hZWcuWLl36BFktikaQpl+/fl0EKhBCVgRkv2NjY9NH1syErABkE1TTdqBCWRAG8reDxKBycOUoGmHOA2pIA5kOwiA2SDVMDq4TmREaGvofhJHFcLHhfgwLC9sKNNULl0KQODCgtq1atcobxIY7lZAmkGJkNXCNIAlSwIjSCApqIgJnK0wNALoOPwSpOcq0AAAAAElFTkSuQmCC) no-repeat;
+}
+.tui-full-calendar-section-start-date,
+.tui-full-calendar-section-end-date {
+  width: 176px;
+}
+.tui-full-calendar-section-start-date input,
+.tui-full-calendar-section-end-date input {
+  width: 139px;
+}
+.tui-full-calendar-section-start-date:hover .tui-full-calendar-popup-section-item,
+.tui-full-calendar-section-end-date:hover .tui-full-calendar-popup-section-item,
+.tui-full-calendar-section-start-date:focus .tui-full-calendar-popup-section-item,
+.tui-full-calendar-section-end-date:focus .tui-full-calendar-popup-section-item,
+.tui-full-calendar-section-start-date:hover .tui-datepicker,
+.tui-full-calendar-section-end-date:hover .tui-datepicker,
+.tui-full-calendar-section-start-date:focus .tui-datepicker,
+.tui-full-calendar-section-end-date:focus .tui-datepicker {
+  border-color: #bbb;
+}
+.tui-full-calendar-popup-section-item:focus {
+  border-color: #bbb;
+}
+.tui-full-calendar-section-date-dash {
+  font-size: 12px;
+  color: #d5d5d5;
+  height: 32px;
+  padding: 0 4px;
+  vertical-align: middle;
+}
+.tui-full-calendar-popup-section-item.tui-full-calendar-section-allday {
+  border: none;
+  padding: 0 0 0 8px;
+  cursor: pointer;
+}
+.tui-full-calendar-popup-section-item.tui-full-calendar-section-location {
+  display: block;
+}
+.tui-full-calendar-popup-section-item.tui-full-calendar-section-location input {
+  width: 400px;
+}
+.tui-full-calendar-section-allday .tui-full-calendar-icon.tui-full-calendar-ic-checkbox {
+  margin: 0;
+}
+.tui-full-calendar-popup-section-item.tui-full-calendar-section-allday .tui-full-calendar-content {
+  padding-left: 4px;
+}
+.tui-full-calendar-section-state {
+  width: 109px;
+}
+.tui-full-calendar-section-state .tui-full-calendar-content {
+  width: 58px;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.tui-full-calendar-popup-section-item {
+  height: 32px;
+  padding: 0 9px 0 12px;
+  border: 1px solid #d5d5d5;
+  display: inline-block;
+  font-size: 0;
+  border-radius: 2px;
+}
+.tui-full-calendar-popup-section-item:hover {
+  border-color: #bbb;
+}
+.tui-full-calendar-popup-section-item:focus {
+  border-color: #bbb;
+}
+.tui-full-calendar-popup-section-item .tui-full-calendar-icon {
+  position: relative;
+}
+.tui-full-calendar-popup-section-item .tui-full-calendar-content {
+  text-align: left;
+  display: inline-block;
+  font-size: 12px;
+  vertical-align: middle;
+  position: relative;
+  padding-left: 8px;
+}
+.tui-full-calendar-section-calendar .tui-full-calendar-dropdown-button .tui-full-calendar-content {
+  width: 125px;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  top: -1px;
+}
+.tui-full-calendar-popup-section-item input {
+  border: none;
+  height: 30px;
+  outline: none;
+  display: inline-block;
+}
+.tui-full-calendar-popup-section-item input::placeholder {
+  color: #bbb;
+  font-weight: 300;
+}
+.tui-full-calendar-dropdown {
+  position: relative;
+}
+.tui-full-calendar-dropdown:hover .tui-full-calendar-dropdown-button {
+  border: 1px solid #bbb;
+}
+.tui-full-calendar-dropdown-button.tui-full-calendar-popup-section-item {
+  height: 32px;
+  font-size: 0;
+  top: -1px;
+}
+.tui-full-calendar-dropdown-arrow {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAHlJREFUKBVjYBgFOEOAEVkmPDxc89+/f6eAYjzI4kD2FyYmJrOVK1deh4kzwRggGiQBVJCELAZig8SQNYHEmEEEMrh69eo1HR0dfqCYJUickZGxf9WqVf3IakBsFBthklpaWmVA9mEQhrJhUoTp0NBQCRAmrHL4qgAAuu4cWZOZIGsAAAAASUVORK5CYII=) no-repeat;
+}
+.dropdown.open .tui-full-calendar-dropdown-arrow,
+.tui-full-calendar-open .tui-full-calendar-dropdown-arrow {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAIFJREFUKBVjYBj+gBmXF2NiYiTV1dV5rl279gWbGiZsgg0NDSw/f/5cCZRbBWJjU4PVRjExsR6g4nAgln/z5g3v1atXd6JrxtAYHh4e+v///z4khZa6urrXgJqvIYkxMCJzgJo0//37dwooxoMsDmR/YWJiMlu5cuV1NPFRLrYQAADMVCaUtbG7XwAAAABJRU5ErkJggg==) no-repeat;
+}
+.tui-full-calendar-dropdown-menu {
+  position: absolute;
+  top: 31px;
+  padding: 4px 0;
+  background-color: #fff;
+  border: 1px solid #d5d5d5;
+  border-top: none;
+  border-radius: 0 0 2px 2px;
+  width: 100%;
+  display: none;
+}
+.tui-full-calendar-dropdown:hover .tui-full-calendar-dropdown-menu {
+  border: 1px solid #bbb;
+  border-top: none;
+}
+.tui-full-calendar-open .tui-full-calendar-dropdown-menu {
+  display: block;
+}
+.tui-full-calendar-dropdown-menu-item {
+  height: 30px;
+  border: none;
+  cursor: pointer;
+}
+.tui-full-calendar-section-calendar .tui-full-calendar-dropdown-menu-item {
+  width: 100%;
+}
+.tui-full-calendar-section-state .tui-full-calendar-dropdown-menu-item {
+  width: 100%;
+}
+.tui-full-calendar-dropdown-menu-item:hover {
+  background-color: rgba(81,92,230,0.05);
+}
+.tui-full-calendar-dropdown-menu-item .tui-full-calendar-content {
+  line-height: 30px;
+}
+.tui-full-calendar-button.tui-full-calendar-popup-close {
+  position: absolute;
+  top: 10px;
+  right: 10px;
+  background-color: #fff;
+  padding: 2px;
+  border: none;
+}
+.tui-full-calendar-section-button-save {
+  height: 36px;
+}
+.tui-full-calendar-popup-save {
+  float: right;
+}
+.tui-full-calendar-popup-arrow-border,
+.tui-full-calendar-popup-arrow-fill {
+  position: absolute;
+}
+.tui-full-calendar-arrow-top .tui-full-calendar-popup-arrow-border {
+  border-top: none;
+  border-right: 8px solid transparent;
+  border-bottom: 8px solid #d5d5d5;
+  border-left: 8px solid transparent;
+  left: calc(50% - 8px);
+  top: -7px;
+}
+.tui-full-calendar-arrow-right .tui-full-calendar-popup-arrow-border {
+  border-top: 8px solid transparent;
+  border-right: none;
+  border-bottom: 8px solid transparent;
+  border-left: 8px solid #d5d5d5;
+  top: calc(50% - 8px);
+  right: -7px;
+}
+.tui-full-calendar-arrow-bottom .tui-full-calendar-popup-arrow-border {
+  border-top: 8px solid #d5d5d5;
+  border-right: 8px solid transparent;
+  border-bottom: none;
+  border-left: 8px solid transparent;
+  left: calc(50% - 8px);
+  bottom: -7px;
+}
+.tui-full-calendar-arrow-left .tui-full-calendar-popup-arrow-border {
+  border-top: 8px solid transparent;
+  border-right: 8px solid #d5d5d5;
+  border-bottom: 8px solid transparent;
+  border-left: none;
+  top: calc(50% - 8px);
+  left: -7px;
+}
+.tui-full-calendar-arrow-top .tui-full-calendar-popup-arrow-fill {
+  border-top: none;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #fff;
+  border-left: 7px solid transparent;
+  left: -7px;
+  top: 1px;
+}
+.tui-full-calendar-arrow-right .tui-full-calendar-popup-arrow-fill {
+  border-top: 7px solid transparent;
+  border-right: none;
+  border-bottom: 7px solid transparent;
+  border-left: 7px solid #fff;
+  top: -7px;
+  right: 1px;
+}
+.tui-full-calendar-arrow-bottom .tui-full-calendar-popup-arrow-fill {
+  border-top: 7px solid #fff;
+  border-right: 7px solid transparent;
+  border-bottom: none;
+  border-left: 7px solid transparent;
+  left: -7px;
+  bottom: 1px;
+}
+.tui-full-calendar-arrow-left .tui-full-calendar-popup-arrow-fill {
+  border-top: 7px solid transparent;
+  border-right: 7px solid #fff;
+  border-bottom: 7px solid transparent;
+  border-left: none;
+  top: -7px;
+  left: 1px;
+}
+.tui-full-calendar-button {
+  background: #fff;
+  border: 1px solid #d5d5d5;
+  border-radius: 2px;
+  text-align: center;
+  outline: none;
+  font-size: 12px;
+  cursor: pointer;
+  color: #333;
+}
+.tui-full-calendar-button:hover {
+  border-color: #bbb;
+  color: #333;
+}
+.tui-full-calendar-button:active {
+  background: #f9f9f9;
+  color: #333;
+}
+.tui-full-calendar-button .round {
+  border-radius: 25px;
+}
+.tui-full-calendar-confirm {
+  width: 96px;
+  height: 36px;
+  border-radius: 40px;
+  background-color: #ff6618;
+  font-size: 12px;
+  font-weight: bold;
+  color: #fff;
+  border: none;
+}
+.tui-full-calendar-confirm:hover {
+  background-color: #e55b15;
+  color: #fff;
+}
+.tui-full-calendar-confirm:active {
+  background-color: #d95614;
+  color: #fff;
+}
+.tui-full-calendar-icon.tui-full-calendar-right {
+  float: right;
+  top: 1px;
+}
+.tui-full-calendar-icon .tui-full-calendar-none {
+  display: none;
+}
+.tui-full-calendar-icon.tui-full-calendar-calendar-dot {
+  border-radius: 8px;
+  width: 12px;
+  height: 12px;
+  margin: 1px;
+}
+input[type='checkbox'].tui-full-calendar-checkbox-square {
+  display: none;
+}
+input[type='checkbox'].tui-full-calendar-checkbox-square + span {
+  display: inline-block;
+  cursor: pointer;
+  line-height: 14px;
+  margin-right: 8px;
+  width: 14px;
+  height: 14px;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADpJREFUKBVjPHfu3O5///65MJAAmJiY9jCcOXPmP6kApIeJBItQlI5qRAkOVM5o4KCGBwqPkcxEvhsAbzRE+Jhb9IwAAAAASUVORK5CYII=) no-repeat;
+  vertical-align: middle;
+}
+input[type='checkbox'].tui-full-calendar-checkbox-square:checked + span {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMBJREFUKBWVkjEOwjAMRe2WgZW7IIHEDdhghhuwcQ42rlJugAQS54Cxa5cq1QM5TUpByZfS2j9+dlJVt/tX5ZxbS4ZU9VLkQvSHKTIGRaVJYFmKrBbTCJxE2UgCdDzMZDkHrOV6b95V0US6UmgKodujEZbJg0B0ZgEModO5lrY1TMQf1TpyJGBEjD+E2NPN7ukIUDiF/BfEXgRiGEw8NgkffYGYwCi808fpn/6OvfUfsDr/Vc1IfRf8sKnFVqeiVQfDu0tf/nWH9gAAAABJRU5ErkJggg==) no-repeat;
+}
+input[type='checkbox'].tui-full-calendar-checkbox-round {
+  display: none;
+}
+input[type='checkbox'].tui-full-calendar-checkbox-round + span {
+  display: inline-block;
+  cursor: pointer;
+  width: 14px;
+  height: 14px;
+  line-height: 14px;
+  vertical-align: middle;
+  margin-right: 8px;
+  border-radius: 8px;
+  border: solid 2px;
+  background: transparent;
+}
+.tui-full-calendar-popup-top-line {
+  position: absolute;
+  border-radius: 2px 2px 0 0;
+  width: 100%;
+  height: 4px;
+  border: none;
+  top: 0;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-popup-container {
+  width: 301px;
+  min-width: 301px;
+  padding-bottom: 0;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-icon {
+  width: 12px;
+  height: 12px;
+  background-size: 12px;
+  position: relative;
+  margin-right: 8px;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-ic-location-b {
+  top: -2px;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-ic-user-b {
+  top: -2px;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-ic-state-b {
+  top: -1px;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-icon.tui-full-calendar-calendar-dot {
+  width: 10px;
+  height: 10px;
+  margin-right: 8px;
+  top: -1px;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-content {
+  line-height: 24px;
+  height: 24px;
+  font-size: 12px;
+  line-height: 2;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-section-header {
+  margin-bottom: 6px;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-popup-detail-item-separate {
+  margin-top: 4px;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-popup-detail-item-indent {
+  text-indent: -20px;
+  padding-left: 20px;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-schedule-title {
+  font-size: 15px;
+  font-weight: bold;
+  line-height: 1.6;
+  word-break: break-all;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-schedule-private {
+  display: none;
+  width: 16px;
+  height: 16px;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAKpJREFUKBVjYCATMKLri46Olvn9+3fX////HUByjIyMB1hZWcuWLl36BFktikaQpl+/fl0EKhBCVgRkv2NjY9NH1syErABkE1TTdqBCWRAG8reDxKBycOUoGmHOA2pIA5kOwiA2SDVMDqYTRSNQUBIkgewkJDZYDqYR7sewsLCtQFO9YBLYaGBAbVu1apU3SA5uIyFNIMXIauAaQRKkgBGlERTURATOVpgaABRQQOK46wEAAAAAAElFTkSuQmCC) no-repeat 16px;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-schedule-private .tui-full-calendar-ic-private {
+  display: block;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-section-detail {
+  margin-bottom: 16px;
+}
+.tui-full-calendar-popup-detail .tui-full-calendar-section-button {
+  border-top: 1px solid #e5e5e5;
+  font-size: 0;
+}
+.tui-full-calendar-section-button .tui-full-calendar-icon {
+  margin-right: 4px;
+  top: -3px;
+}
+.tui-full-calendar-section-button .tui-full-calendar-content {
+  position: relative;
+  top: 2px;
+}
+.tui-full-calendar-popup-edit,
+.tui-full-calendar-popup-delete {
+  display: inline-block;
+  padding: 7px 9px 11px 9px;
+  width: calc(50% - 1px);
+  outline: none;
+  background: none;
+  border: none;
+  cursor: pointer;
+}
+.tui-full-calendar-popup-vertical-line {
+  background: #e5e5e5;
+  width: 1px;
+  height: 14px;
+  vertical-align: middle;
+  display: inline-block;
+  margin-top: -7px;
+}
+.tui-datepicker {
+  left: -12px;
+  z-index: 1;
+  border-color: #d5d5d5;
+}
+.tui-full-calendar-icon {
+  width: 14px;
+  height: 14px;
+  display: inline-block;
+  vertical-align: middle;
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-title {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAO5JREFUKBVjYCATMOLSFxkZqfHnz5+1QHktNDVbV69e7cOCJgjmQjXtB3IksMh7g8SY0CXQNTEyMlYD1fBCabhyFI3omkCq/v//PwnotC8gGq4LyIBrxKYJpBBoU15oaCgPiEbWCPYjUEIFGBBY/QS0qRWooRVIg/UBDXgMYoBtBHJSgWxsAQFWjET8BBqQBuLDNM4Can6GpAAb8ydQMADo3x0gSbDGlStX3gVqdMSjGUUTSCNKAggPD1cDOmU/EEuBJKEAQxNIHEUjSABNM1ZNIHXMIAIZXL169a2+vv5moK18QKeXAv20B1meYjYAr7xrljpOzc0AAAAASUVORK5CYII=) no-repeat;
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-location {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAR1JREFUKBWdUTtPg1AUBiT8CydHJtv/0MTJRWAgcTK1bq0/pO3k4E4IYLo2Me46tS4wumjSpV07kAb6HXLPzaGPRZLL+c73uE/D+OdnHuaCIOhVVTUEf620pWVZ0yRJ3qW3FfR9f1zX9UgaGJumOUnT9Fn3DDzPuwPOuD9TvSzL3kizhOFJ4LnjOJc0wM0FP2Asgx0mEehHUfRHgzDzqF3GOogzbJg8V6XHFqYv4Cvqy7J8DcOwWYmw8Hwy1kHMRjcaKuEGgV82caWbZay3indagJyxcKLOlKeRdJA627YfUVaN0v6tlKbZVjCO4zW2cw91px3AxJEmOONCNoTzPP9xXZfOd6u0Bzz60RGOgmQuiuIb4S3gB0IvaoJW2QMDs1bBoH1CAQAAAABJRU5ErkJggg==) no-repeat;
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-date {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAGpJREFUKBVjYKAGCA0N/Q/C6GZhE2cEKQoLC9v6//9/L3QN2PiMjIzbVq1a5c0EkiRWE7JasEZsJhMSI1sjC7LJq1evBvsZWQyZjRxwZNs4hDSiBA6y55EDBRsb7EdQasAmiUNsKw5x4oQBkUAeDPJ53KsAAAAASUVORK5CYII=) no-repeat;
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-state {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAIxJREFUKBVjYCATMKLrCw8P9/z3798soLgMVO4JExNT2sqVK7cjq2VC5oDYME2MjIyNIAwUkoGKoShlQeFBOGCbVq1a1QDihoaG1gMpmO0gITAAOzUsLGzr////vWCC+GigK7YBDfUGO5VYTSADYWox/IjPNmS5UY3IoYHGBgcOKG7QxPFxt+KTJCgHAGcZJbGLRuJ2AAAAAElFTkSuQmCC) no-repeat;
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-private {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAKpJREFUKBVjYCATMKLri46Olvn9+3fX////HUByjIyMB1hZWcuWLl36BFktikaQpl+/fl0EKhBCVgRkv2NjY9NH1syErABkE1TTdqBCWRAG8reDxKBycOUoGmHOA2pIA5kOwiA2SDVMDqYTRSNQUBIkgewkJDZYDqYR7sewsLCtQFO9YBLYaGBAbVu1apU3SA5uIyFNIMXIauAaQRKkgBGlERTURATOVpgaABRQQOK46wEAAAAAAElFTkSuQmCC) no-repeat;
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-close {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAJRJREFUKBXFkNERhCAMREUbuEKohzq0Eq2DDq6Da4B60KezDORkxj+ZwchmX0IYhtdWCGFl9y5g82NtzDnPdzAaudo76ZBS+nrvPxiInMkJcs5tMcZFfqcfxdqIRiELof+BiIJPg+mExmpmvKRn3zKj7OrG9Y79szPL14A1xEP0Hgy4gBZS5R7czHj3ehSgOzkVeyfuGrBw/WLm0hsAAAAASUVORK5CYII=) no-repeat;
+}
+.tui-full-calendar-ic-location-b {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAOZJREFUKBWVUT0KwjAUbkzGTuJWPYNDpV0cXD2ETuIRBK+gs4ubp3BwcXBp6eINBKWDgydoid9X8oKCggYeee/7S9IGwZ9LverTNO3Wdb2y1o6IK6WOWutFlmU30XmDE58hbgvpTA+Y+mJqCemS20jdG2N6LPYMICc6b5BrIG3ONBZ7CoVj7w0cfllGRDj+gKQpjt/iPU0ye/LkROcNANaoCUzjqqquIsBuHddAWoiyLO9RFHUwJ4JxR/qmKIqdYG9vCMNwCeIiJHuHecj/B0GSJBng7ifO+ErDPM8L4b7ucRzPWJ8ET1E7YC7tmi9qAAAAAElFTkSuQmCC);
+}
+.tui-full-calendar-ic-state-b {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAHlJREFUKBVjYCARMCKrNzEx8QTyZ/3//18GJM7IyPgESKWdOXNmO4gPAkwQCk6CFQMVNoIwVOMsuCw6w9jY+D8Iw8TR+SBxsJOATtkKNM0LphAbDbRxG9Bp3mAnEVIMMgCmBt0P2AxHERusGkAhgOJQ7Jyt2IUJiAIAwwIn24FgmhkAAAAASUVORK5CYII=);
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-user-b {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAJpJREFUKBVjYKA1YES3wMTExBMoNgsqnnbmzJntyGqYkDlQ9qz////LgDCQD9MIV4ZNA1wSGwObhjRGRsYnIAzUkIZNE0licE+bm5tr/fnzJx1osjPQBFmoKY+BftnLwsIy8+TJk9dAYmANxsbGoUD2YiBmBwliAT+BYrFnz55dDfNDO1AAl2KQfpAcSA0DTIMyiEMAEKMG0wgAolIjcM7Tjm8AAAAASUVORK5CYII=);
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-edit {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAMdJREFUKBVjYCARMOJTb2xsLMfIyBjLysq64Pjx409BapnwaQDKzf7//3/L79+/D1tbW0uB1LJg02BmZqYIVPgdKBf/79+//UC2xs+fP8OB/H4MG0CK//79ewCkEGQYExOTI5DawMnJuQTER/EDTDFQXA4kCQQ3QBpOnz79AsJF8gMWxTA1KDTYBhyKMUwH6WSysrKSB7kZyIY5AySOVTFIggno+5VAmijFYA1AwhzEgAKcJsMUwIMVGKPH2NnZ7ZFDBKYImQYAuO5YIMgk39gAAAAASUVORK5CYII=);
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-delete {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAFhJREFUKBVjYCARMKKrNzEx2fr//38vkDgjI+O2M2fOeCOrAWtAVoQsicyGaWZCFsTHBtr6H588Tjm4H4yNjfGacPbsWbBaop0Es3JYaQBFDMxjWOitMDEA3EEZfFEISwUAAAAASUVORK5CYII=);
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-arrow-solid-top {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAIFJREFUKBVjYBj+gBmXF2NiYiTV1dV5rl279gWbGiZsgg0NDSw/f/5cCZRbBWJjU4PVRjExsR6g4nAgln/z5g3v1atXd6JrxtAYHh4e+v///z4khZa6urrXgJqvIYkxMCJzgJo0//37dwooxoMsDmR/YWJiMlu5cuV1NPFRLrYQAADMVCaUtbG7XwAAAABJRU5ErkJggg==) no-repeat;
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-milestone {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAGFJREFUKBVjYCARMILU/3dw+I+hj5FxG+P+/d7o4rg1IKtE0syELI6T/f+/F0yOOA0w1UCa9hpYkGxjYDxwABwIILH/jo5bGWBuZ2TcClOHogEmCKKxBSlInPZ+ANlCEgAA37EU4AHbBQUAAAAASUVORK5CYII=) no-repeat;
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-arrow-left {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHCAYAAAAvZezQAAAAAXNSR0IArs4c6QAAAFZJREFUCB1jZICCyspK83///hUxgvhVVVV6f//+3c3ExJTMVFNTowqU2cHMzJzf3t6+hen379/zgIp2t7W1rQCpZmJlZU0C0q5AbREgAQwzwAIgGZgtADMCJqH/QyvhAAAAAElFTkSuQmCC) no-repeat;
+}
+.tui-full-calendar-icon.tui-full-calendar-ic-arrow-right {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHCAYAAAAvZezQAAAAAXNSR0IArs4c6QAAAFxJREFUCB1jKC8vX1lZWWnOAAVMQLD4379/m6qqqvRAYowgAsiJAAr2sbCw2IMFQIIVFRUL////r8SCpMKVlZXVnhFooA9Q+VxmZmbXtra2S0xATizQYD8QB6QaAJMLJ9BqE9yTAAAAAElFTkSuQmCC) no-repeat;
+}
+.tui-full-calendar-ic-repeat-b {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAQpJREFUKBVjYCARMCKrNzU1tf/3718lUMwQiP8yMjKeYWJi6j516tRhExOThjNnzjTANQAFqv///98CVHQPSO8A0ixATa5AtjyQPgDETmfPngULMpiZmbn//fu3BSg4B6ggCyjxG8hm8PT0ZH/9+vUJoJgTiA8CTCACqDgXaOJ9Xl7eTJhikDhQcSVQsQGITT8A9rSxsfF/mJVApzWCQgPGd3BwYPny5cstoNOuAZ3rAwoJOAAqviAqKtoOEwAaxPr58+dpQL4iEGeAxJFt2AfkOwA1PQTSu4Em/gGyPYC0EpCuAdraCtIADiWgQCPQOmdmZmYHoNgVoCJfIB0CpG8DI84BphgoRjoAAAzgdELI91E5AAAAAElFTkSuQmCC);
+}
+/*# sourceMappingURL=src/css/main.css.map */
+
+/*# sourceMappingURL=tui-calendar.css.map*/

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
public/tui-calendar/dist/tui-calendar.css.map


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 286 - 0
public/tui-calendar/dist/tui-calendar.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
public/tui-calendar/dist/tui-calendar.js.map


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 5 - 0
public/tui-calendar/dist/tui-calendar.min.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
public/tui-calendar/dist/tui-calendar.min.css.map


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 6 - 0
public/tui-calendar/dist/tui-calendar.min.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
public/tui-calendar/dist/tui-calendar.min.js.map


+ 124 - 0
public/tui-calendar/example00-basic.html

@@ -0,0 +1,124 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <title>TOAST UI Calendar App DEMO</title>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
+    <link rel="stylesheet" type="text/css" href="https://uicdn.toast.com/tui.time-picker/latest/tui-time-picker.css">
+    <link rel="stylesheet" type="text/css" href="https://uicdn.toast.com/tui.date-picker/latest/tui-date-picker.css">
+    <link rel="stylesheet" type="text/css" href="./dist/tui-calendar.css">
+    <link rel="stylesheet" type="text/css" href="./css/default.css">
+    <link rel="stylesheet" type="text/css" href="./css/icons.css">
+</head>
+<body>
+    <div id="top">
+        <a href="https://github.com/nhn/tui.calendar">
+            <img src="./images/img-bi.png" srcset="./images/img-bi@2x.png 2x,./images/img-bi@3x.png 3x">
+        </a>
+    </div>
+    <div id="lnb">
+        <div class="lnb-new-schedule">
+            <button id="btn-new-schedule" type="button" class="btn btn-default btn-block lnb-new-schedule-btn" data-toggle="modal">
+                任务状态</button>
+        </div>
+        <div id="lnb-calendars" class="lnb-calendars">
+            <div>
+                <div class="lnb-calendars-item">
+                    <label>
+                        <input class="tui-full-calendar-checkbox-square" type="checkbox" value="all" checked>
+                        <span></span>
+                        <strong>全部状态</strong>
+                    </label>
+                </div>
+            </div>
+            <div id="calendarList" class="lnb-calendars-d1">
+            </div>
+        </div>
+        <div class="lnb-footer">
+            © HITACHI.
+        </div>
+    </div>
+    <div id="right">
+        <div id="menu">
+            <span class="dropdown">
+                <button id="dropdownMenu-calendarType" class="btn btn-default btn-sm dropdown-toggle" type="button" data-toggle="dropdown"
+                    aria-haspopup="true" aria-expanded="true">
+                    <i id="calendarTypeIcon" class="calendar-icon ic_view_month" style="margin-right: 4px;"></i>
+                    <span id="calendarTypeName">Dropdown</span>&nbsp;
+                    <i class="calendar-icon tui-full-calendar-dropdown-arrow"></i>
+                </button>
+                <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu-calendarType">
+                    <li role="presentation">
+                        <a class="dropdown-menu-title" role="menuitem" data-action="toggle-daily">
+                            <i class="calendar-icon ic_view_day"></i>Daily
+                        </a>
+                    </li>
+                    <li role="presentation">
+                        <a class="dropdown-menu-title" role="menuitem" data-action="toggle-weekly">
+                            <i class="calendar-icon ic_view_week"></i>Weekly
+                        </a>
+                    </li>
+                    <li role="presentation">
+                        <a class="dropdown-menu-title" role="menuitem" data-action="toggle-monthly">
+                            <i class="calendar-icon ic_view_month"></i>Month
+                        </a>
+                    </li>
+                    <li role="presentation">
+                        <a class="dropdown-menu-title" role="menuitem" data-action="toggle-weeks2">
+                            <i class="calendar-icon ic_view_week"></i>2 weeks
+                        </a>
+                    </li>
+                    <li role="presentation">
+                        <a class="dropdown-menu-title" role="menuitem" data-action="toggle-weeks3">
+                            <i class="calendar-icon ic_view_week"></i>3 weeks
+                        </a>
+                    </li>
+                    <li role="presentation" class="dropdown-divider"></li>
+                    <li role="presentation">
+                        <a role="menuitem" data-action="toggle-workweek">
+                            <input type="checkbox" class="tui-full-calendar-checkbox-square" value="toggle-workweek" checked>
+                            <span class="checkbox-title"></span>Show weekends
+                        </a>
+                    </li>
+                    <li role="presentation">
+                        <a role="menuitem" data-action="toggle-start-day-1">
+                            <input type="checkbox" class="tui-full-calendar-checkbox-square" value="toggle-start-day-1">
+                            <span class="checkbox-title"></span>Start Week on Monday
+                        </a>
+                    </li>
+                    <li role="presentation">
+                        <a role="menuitem" data-action="toggle-narrow-weekend">
+                            <input type="checkbox" class="tui-full-calendar-checkbox-square" value="toggle-narrow-weekend">
+                            <span class="checkbox-title"></span>Narrower than weekdays
+                        </a>
+                    </li>
+                </ul>
+            </span>
+            <span id="menu-navi">
+                <button type="button" class="btn btn-default btn-sm move-today" data-action="move-today">Today</button>
+                <button type="button" class="btn btn-default btn-sm move-day" data-action="move-prev">
+                    <i class="calendar-icon ic-arrow-line-left" data-action="move-prev"></i>
+                </button>
+                <button type="button" class="btn btn-default btn-sm move-day" data-action="move-next">
+                    <i class="calendar-icon ic-arrow-line-right" data-action="move-next"></i>
+                </button>
+            </span>
+            <span id="renderRange" class="render-range"></span>
+        </div>
+        <div id="calendar"></div>
+    </div>
+
+    <script src="./js/jquery-3.1.1.min.js"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
+    <script src="https://uicdn.toast.com/tui.code-snippet/v1.5.2/tui-code-snippet.min.js"></script>
+    <script src="https://uicdn.toast.com/tui.time-picker/v2.0.3/tui-time-picker.min.js"></script>
+    <script src="https://uicdn.toast.com/tui.date-picker/v4.0.3/tui-date-picker.min.js"></script>
+    <script src='js/moment-2.20.1.min.js'></script>
+    <script src='js/chance-1.0.13.min.js'></script>
+    <script src="./dist/tui-calendar.js"></script>
+    <script src="./js/data/calendars.js"></script>
+    <script src="./js/data/schedules.js"></script>
+    <script src="./js/theme/dooray.js"></script>
+    <script src="./js/app.js"></script>
+</body>
+</html>

BIN
public/tui-calendar/fonts/icon.eot


+ 17 - 0
public/tui-calendar/fonts/icon.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe900;" glyph-name="ic_location_b" horiz-adv-x="745" d="M372.364-64c-248.242 297.324-372.364 514.536-372.364 651.636 0 205.651 166.713 372.364 372.364 372.364s372.364-166.713 372.364-372.364c0-137.101-124.121-354.313-372.364-651.636zM372.364 401.455c102.825 0 186.182 83.356 186.182 186.182s-83.356 186.182-186.182 186.182c-102.825 0-186.182-83.356-186.182-186.182s83.356-186.182 186.182-186.182z" />
+<glyph unicode="&#xe901;" glyph-name="ic_lock_b" horiz-adv-x="819" d="M716.8 550.4c56.554 0 102.4-45.846 102.4-102.4v-409.6c0-56.554-45.846-102.4-102.4-102.4h-614.4c-56.554 0-102.4 45.846-102.4 102.4v409.6c0 56.554 45.846 102.4 102.4 102.4v102.4c0 169.662 137.538 307.2 307.2 307.2s307.2-137.538 307.2-307.2v-102.4zM563.2 550.4v102.4c0 84.831-68.769 153.6-153.6 153.6s-153.6-68.769-153.6-153.6v-102.4h307.2z" />
+<glyph unicode="&#xe902;" glyph-name="ic_milestone" horiz-adv-x="922" d="M512 345.6h-307.2v-409.6h-204.8v1024h512c56.554 0 102.4-45.846 102.4-102.4h204.8c56.554 0 102.4-45.846 102.4-102.4v-409.6c0-56.554-45.846-102.4-102.4-102.4h-204.8c-56.554 0-102.4 45.846-102.4 102.4z" />
+<glyph unicode="&#xe903;" glyph-name="ic_readonly_b" d="M316.713 147.428c56.18-36.576 123.252-57.828 195.287-57.828 197.939 0 358.4 160.461 358.4 358.4 0 72.035-21.252 139.107-57.828 195.287l-495.859-495.859zM208.828 256.766l494.406 494.406c-55.341 34.981-120.923 55.228-191.234 55.228-197.939 0-358.4-160.461-358.4-358.4 0-70.311 20.247-135.893 55.228-191.234zM512-64c-282.77 0-512 229.23-512 512s229.23 512 512 512c282.77 0 512-229.23 512-512s-229.23-512-512-512z" />
+<glyph unicode="&#xe904;" glyph-name="ic_repeat_b" d="M149.961 85.961l-149.961-149.961v409.6h409.6l-151.027-151.027c64.858-64.858 154.458-104.973 253.427-104.973 162.356 0 299.498 107.956 343.558 256h158.2c-47.439-233.701-254.057-409.6-501.758-409.6-141.385 0-269.385 57.308-362.039 149.961zM874.039 810.039l149.961 149.961v-409.6h-409.6l151.027 151.027c-64.858 64.858-154.458 104.973-253.427 104.973-162.356 0-299.498-107.956-343.558-256h-158.2c47.439 233.701 254.057 409.6 501.758 409.6 141.385 0 269.385-57.308 362.039-149.961z" />
+<glyph unicode="&#xe905;" glyph-name="ic_state_b" d="M409.6 960h204.8c113.108 0 204.8-91.692 204.8-204.8v-204.8c0-113.108-91.692-204.8-204.8-204.8h-204.8c-113.108 0-204.8 91.692-204.8 204.8v204.8c0 113.108 91.692 204.8 204.8 204.8zM409.6 806.4v-307.2h204.8v307.2h-204.8zM102.4 652.8h819.2c56.554 0 102.4-45.846 102.4-102.4v-512c0-56.554-45.846-102.4-102.4-102.4h-819.2c-56.554 0-102.4 45.846-102.4 102.4v512c0 56.554 45.846 102.4 102.4 102.4z" />
+<glyph unicode="&#xe906;" glyph-name="ic_user_b" horiz-adv-x="1138" d="M19.766 49.778c-12.815 5.936-19.766 12.441-19.766 19.521 0 177.732 254.7 321.812 568.889 321.812s568.889-144.080 568.889-321.812c0-7.058-7.462-13.567-21.177-19.521h21.177v-113.778h-1137.778v113.778h19.766zM568.889 960c125.675 0 227.556-101.88 227.556-227.556s-101.88-227.556-227.556-227.556c-125.675 0-227.556 101.88-227.556 227.556s101.88 227.556 227.556 227.556z" />
+</font></defs></svg>

BIN
public/tui-calendar/fonts/icon.ttf


BIN
public/tui-calendar/fonts/icon.woff


BIN
public/tui-calendar/images/ic-arrow-line-left.png


BIN
public/tui-calendar/images/ic-arrow-line-left@2x.png


BIN
public/tui-calendar/images/ic-arrow-line-left@3x.png


BIN
public/tui-calendar/images/ic-arrow-line-right.png


BIN
public/tui-calendar/images/ic-arrow-line-right@2x.png


BIN
public/tui-calendar/images/ic-arrow-line-right@3x.png


BIN
public/tui-calendar/images/ic-traveltime-w.png


BIN
public/tui-calendar/images/ic-view-day.png


BIN
public/tui-calendar/images/ic-view-day@2x.png


BIN
public/tui-calendar/images/ic-view-day@3x.png


BIN
public/tui-calendar/images/ic-view-month.png


BIN
public/tui-calendar/images/ic-view-month@2x.png


BIN
public/tui-calendar/images/ic-view-month@3x.png


BIN
public/tui-calendar/images/ic-view-week.png


BIN
public/tui-calendar/images/ic-view-week@2x.png


BIN
public/tui-calendar/images/ic-view-week@3x.png


BIN
public/tui-calendar/images/icon.png


BIN
public/tui-calendar/images/img-bi.png


BIN
public/tui-calendar/images/img-bi@2x.png


BIN
public/tui-calendar/images/img-bi@3x.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
public/tui-calendar/js/1.1.8/chance.min.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
public/tui-calendar/js/2.24.0/moment.min.js


+ 454 - 0
public/tui-calendar/js/app.js

@@ -0,0 +1,454 @@
+'use strict';
+
+/* eslint-disable */
+/* eslint-env jquery */
+/* global moment, tui, chance */
+/* global findCalendar, CalendarList, ScheduleList, generateSchedule */
+
+(function(window, Calendar) {
+    var cal, resizeThrottled;
+    var useCreationPopup = true;
+    var useDetailPopup = true;
+    var datePicker, selectedCalendar;
+
+    cal = new Calendar('#calendar', {
+        defaultView: 'month',
+        useCreationPopup: useCreationPopup,
+        useDetailPopup: useDetailPopup,
+        calendars: CalendarList,
+        template: {
+            milestone: function(model) {
+                return '<span class="calendar-font-icon ic-milestone-b"></span> <span style="background-color: ' + model.bgColor + '">' + model.title + '</span>';
+            },
+            allday: function(schedule) {
+                return getTimeTemplate(schedule, true);
+            },
+            time: function(schedule) {
+                return getTimeTemplate(schedule, false);
+            }
+        }
+    });
+
+    // event handlers
+    cal.on({
+        'clickMore': function(e) {
+            console.log('clickMore', e);
+        },
+        'clickSchedule': function(e) {
+            console.log('clickSchedule', e);
+        },
+        'clickDayname': function(date) {
+            console.log('clickDayname', date);
+        },
+        'beforeCreateSchedule': function(e) {
+            console.log('beforeCreateSchedule', e);
+            saveNewSchedule(e);
+        },
+        'beforeUpdateSchedule': function(e) {
+            var schedule = e.schedule;
+            var changes = e.changes;
+
+            console.log('beforeUpdateSchedule', e);
+
+            if (changes && !changes.isAllDay && schedule.category === 'allday') {
+                changes.category = 'time';
+            }
+
+            cal.updateSchedule(schedule.id, schedule.calendarId, changes);
+            refreshScheduleVisibility();
+        },
+        'beforeDeleteSchedule': function(e) {
+            console.log('beforeDeleteSchedule', e);
+            cal.deleteSchedule(e.schedule.id, e.schedule.calendarId);
+        },
+        'afterRenderSchedule': function(e) {
+            var schedule = e.schedule;
+            // var element = cal.getElement(schedule.id, schedule.calendarId);
+            // console.log('afterRenderSchedule', element);
+        },
+        'clickTimezonesCollapseBtn': function(timezonesCollapsed) {
+            console.log('timezonesCollapsed', timezonesCollapsed);
+
+            if (timezonesCollapsed) {
+                cal.setTheme({
+                    'week.daygridLeft.width': '77px',
+                    'week.timegridLeft.width': '77px'
+                });
+            } else {
+                cal.setTheme({
+                    'week.daygridLeft.width': '60px',
+                    'week.timegridLeft.width': '60px'
+                });
+            }
+
+            return true;
+        }
+    });
+
+    /**
+     * Get time template for time and all-day
+     * @param {Schedule} schedule - schedule
+     * @param {boolean} isAllDay - isAllDay or hasMultiDates
+     * @returns {string}
+     */
+    function getTimeTemplate(schedule, isAllDay) {
+        var html = [];
+        var start = moment(schedule.start.toUTCString());
+        if (!isAllDay) {
+            html.push('<strong>' + start.format('HH:mm') + '</strong> ');
+        }
+        if (schedule.isPrivate) {
+            html.push('<span class="calendar-font-icon ic-lock-b"></span>');
+            html.push(' Private');
+        } else {
+            if (schedule.isReadOnly) {
+                html.push('<span class="calendar-font-icon ic-readonly-b"></span>');
+            } else if (schedule.recurrenceRule) {
+                html.push('<span class="calendar-font-icon ic-repeat-b"></span>');
+            } else if (schedule.attendees.length) {
+                html.push('<span class="calendar-font-icon ic-user-b"></span>');
+            } else if (schedule.location) {
+                html.push('<span class="calendar-font-icon ic-location-b"></span>');
+            }
+            html.push(' ' + schedule.title);
+        }
+
+        return html.join('');
+    }
+
+    /**
+     * A listener for click the menu
+     * @param {Event} e - click event
+     */
+    function onClickMenu(e) {
+        var target = $(e.target).closest('a[role="menuitem"]')[0];
+        var action = getDataAction(target);
+        var options = cal.getOptions();
+        var viewName = '';
+
+        console.log(target);
+        console.log(action);
+        switch (action) {
+            case 'toggle-daily':
+                viewName = 'day';
+                break;
+            case 'toggle-weekly':
+                viewName = 'week';
+                break;
+            case 'toggle-monthly':
+                options.month.visibleWeeksCount = 0;
+                viewName = 'month';
+                break;
+            case 'toggle-weeks2':
+                options.month.visibleWeeksCount = 2;
+                viewName = 'month';
+                break;
+            case 'toggle-weeks3':
+                options.month.visibleWeeksCount = 3;
+                viewName = 'month';
+                break;
+            case 'toggle-narrow-weekend':
+                options.month.narrowWeekend = !options.month.narrowWeekend;
+                options.week.narrowWeekend = !options.week.narrowWeekend;
+                viewName = cal.getViewName();
+
+                target.querySelector('input').checked = options.month.narrowWeekend;
+                break;
+            case 'toggle-start-day-1':
+                options.month.startDayOfWeek = options.month.startDayOfWeek ? 0 : 1;
+                options.week.startDayOfWeek = options.week.startDayOfWeek ? 0 : 1;
+                viewName = cal.getViewName();
+
+                target.querySelector('input').checked = options.month.startDayOfWeek;
+                break;
+            case 'toggle-workweek':
+                options.month.workweek = !options.month.workweek;
+                options.week.workweek = !options.week.workweek;
+                viewName = cal.getViewName();
+
+                target.querySelector('input').checked = !options.month.workweek;
+                break;
+            default:
+                break;
+        }
+
+        cal.setOptions(options, true);
+        cal.changeView(viewName, true);
+
+        setDropdownCalendarType();
+        setRenderRangeText();
+        setSchedules();
+    }
+
+    function onClickNavi(e) {
+        var action = getDataAction(e.target);
+
+        switch (action) {
+            case 'move-prev':
+                cal.prev();
+                break;
+            case 'move-next':
+                cal.next();
+                break;
+            case 'move-today':
+                cal.today();
+                break;
+            default:
+                return;
+        }
+
+        setRenderRangeText();
+        setSchedules();
+    }
+
+    function onNewSchedule() {
+        var title = $('#new-schedule-title').val();
+        var location = $('#new-schedule-location').val();
+        var isAllDay = document.getElementById('new-schedule-allday').checked;
+        var start = datePicker.getStartDate();
+        var end = datePicker.getEndDate();
+        var calendar = selectedCalendar ? selectedCalendar : CalendarList[0];
+
+        if (!title) {
+            return;
+        }
+
+        cal.createSchedules([{
+            id: String(chance.guid()),
+            calendarId: calendar.id,
+            title: title,
+            isAllDay: isAllDay,
+            start: start,
+            end: end,
+            category: isAllDay ? 'allday' : 'time',
+            dueDateClass: '',
+            color: calendar.color,
+            bgColor: calendar.bgColor,
+            dragBgColor: calendar.bgColor,
+            borderColor: calendar.borderColor,
+            raw: {
+                location: location
+            },
+            state: 'Busy'
+        }]);
+
+        $('#modal-new-schedule').modal('hide');
+    }
+
+    function onChangeNewScheduleCalendar(e) {
+        var target = $(e.target).closest('a[role="menuitem"]')[0];
+        var calendarId = getDataAction(target);
+        changeNewScheduleCalendar(calendarId);
+    }
+
+    function changeNewScheduleCalendar(calendarId) {
+        var calendarNameElement = document.getElementById('calendarName');
+        var calendar = findCalendar(calendarId);
+        var html = [];
+
+        html.push('<span class="calendar-bar" style="background-color: ' + calendar.bgColor + '; border-color:' + calendar.borderColor + ';"></span>');
+        html.push('<span class="calendar-name">' + calendar.name + '</span>');
+
+        calendarNameElement.innerHTML = html.join('');
+
+        selectedCalendar = calendar;
+    }
+
+    function createNewSchedule(event) {
+        var start = event.start ? new Date(event.start.getTime()) : new Date();
+        var end = event.end ? new Date(event.end.getTime()) : moment().add(1, 'hours').toDate();
+
+        if (useCreationPopup) {
+            cal.openCreationPopup({
+                start: start,
+                end: end
+            });
+        }
+    }
+    function saveNewSchedule(scheduleData) {
+        var calendar = scheduleData.calendar || findCalendar(scheduleData.calendarId);
+        var schedule = {
+            id: String(chance.guid()),
+            title: scheduleData.title,
+            isAllDay: scheduleData.isAllDay,
+            start: scheduleData.start,
+            end: scheduleData.end,
+            category: scheduleData.isAllDay ? 'allday' : 'time',
+            dueDateClass: '',
+            color: calendar.color,
+            bgColor: calendar.bgColor,
+            dragBgColor: calendar.bgColor,
+            borderColor: calendar.borderColor,
+            location: scheduleData.location,
+            raw: {
+                class: scheduleData.raw['class']
+            },
+            state: scheduleData.state
+        };
+        if (calendar) {
+            schedule.calendarId = calendar.id;
+            schedule.color = calendar.color;
+            schedule.bgColor = calendar.bgColor;
+            schedule.borderColor = calendar.borderColor;
+        }
+
+        cal.createSchedules([schedule]);
+
+        refreshScheduleVisibility();
+    }
+
+    function onChangeCalendars(e) {
+        var calendarId = e.target.value;
+        var checked = e.target.checked;
+        var viewAll = document.querySelector('.lnb-calendars-item input');
+        var calendarElements = Array.prototype.slice.call(document.querySelectorAll('#calendarList input'));
+        var allCheckedCalendars = true;
+
+        if (calendarId === 'all') {
+            allCheckedCalendars = checked;
+
+            calendarElements.forEach(function(input) {
+                var span = input.parentNode;
+                input.checked = checked;
+                span.style.backgroundColor = checked ? span.style.borderColor : 'transparent';
+            });
+
+            CalendarList.forEach(function(calendar) {
+                calendar.checked = checked;
+            });
+        } else {
+            findCalendar(calendarId).checked = checked;
+
+            allCheckedCalendars = calendarElements.every(function(input) {
+                return input.checked;
+            });
+
+            if (allCheckedCalendars) {
+                viewAll.checked = true;
+            } else {
+                viewAll.checked = false;
+            }
+        }
+
+        refreshScheduleVisibility();
+    }
+
+    function refreshScheduleVisibility() {
+        var calendarElements = Array.prototype.slice.call(document.querySelectorAll('#calendarList input'));
+
+        CalendarList.forEach(function(calendar) {
+            cal.toggleSchedules(calendar.id, !calendar.checked, false);
+        });
+
+        cal.render(true);
+
+        calendarElements.forEach(function(input) {
+            var span = input.nextElementSibling;
+            span.style.backgroundColor = input.checked ? span.style.borderColor : 'transparent';
+        });
+    }
+
+    function setDropdownCalendarType() {
+        var calendarTypeName = document.getElementById('calendarTypeName');
+        var calendarTypeIcon = document.getElementById('calendarTypeIcon');
+        var options = cal.getOptions();
+        var type = cal.getViewName();
+        var iconClassName;
+
+        if (type === 'day') {
+            type = 'Daily';
+            iconClassName = 'calendar-icon ic_view_day';
+        } else if (type === 'week') {
+            type = 'Weekly';
+            iconClassName = 'calendar-icon ic_view_week';
+        } else if (options.month.visibleWeeksCount === 2) {
+            type = '2 weeks';
+            iconClassName = 'calendar-icon ic_view_week';
+        } else if (options.month.visibleWeeksCount === 3) {
+            type = '3 weeks';
+            iconClassName = 'calendar-icon ic_view_week';
+        } else {
+            type = 'Monthly';
+            iconClassName = 'calendar-icon ic_view_month';
+        }
+
+        calendarTypeName.innerHTML = type;
+        calendarTypeIcon.className = iconClassName;
+    }
+
+    function currentCalendarDate(format) {
+      var currentDate = moment([cal.getDate().getFullYear(), cal.getDate().getMonth(), cal.getDate().getDate()]);
+
+      return currentDate.format(format);
+    }
+
+    function setRenderRangeText() {
+        var renderRange = document.getElementById('renderRange');
+        var options = cal.getOptions();
+        var viewName = cal.getViewName();
+
+        var html = [];
+        if (viewName === 'day') {
+            html.push(currentCalendarDate('YYYY.MM.DD'));
+        } else if (viewName === 'month' &&
+            (!options.month.visibleWeeksCount || options.month.visibleWeeksCount > 4)) {
+            html.push(currentCalendarDate('YYYY.MM'));
+        } else {
+            html.push(moment(cal.getDateRangeStart().getTime()).format('YYYY.MM.DD'));
+            html.push(' ~ ');
+            html.push(moment(cal.getDateRangeEnd().getTime()).format(' MM.DD'));
+        }
+        renderRange.innerHTML = html.join('');
+    }
+
+    function setSchedules() {
+        cal.clear();
+        generateSchedule(cal.getViewName(), cal.getDateRangeStart(), cal.getDateRangeEnd());
+        cal.createSchedules(ScheduleList);
+
+        refreshScheduleVisibility();
+    }
+
+    function setEventListener() {
+        $('#menu-navi').on('click', onClickNavi);
+        $('.dropdown-menu a[role="menuitem"]').on('click', onClickMenu);
+        $('#lnb-calendars').on('change', onChangeCalendars);
+
+        $('#btn-save-schedule').on('click', onNewSchedule);
+        $('#btn-new-schedule').on('click', createNewSchedule);
+
+        $('#dropdownMenu-calendars-list').on('click', onChangeNewScheduleCalendar);
+
+        window.addEventListener('resize', resizeThrottled);
+    }
+
+    function getDataAction(target) {
+        return target.dataset ? target.dataset.action : target.getAttribute('data-action');
+    }
+
+    resizeThrottled = tui.util.throttle(function() {
+        cal.render();
+    }, 50);
+
+    window.cal = cal;
+
+    setDropdownCalendarType();
+    setRenderRangeText();
+    setSchedules();
+    setEventListener();
+})(window, tui.Calendar);
+
+// set calendars
+(function() {
+    var calendarList = document.getElementById('calendarList');
+    var html = [];
+    CalendarList.forEach(function(calendar) {
+        html.push('<div class="lnb-calendars-item"><label>' +
+            '<input type="checkbox" class="tui-full-calendar-checkbox-round" value="' + calendar.id + '" checked>' +
+            '<span style="border-color: ' + calendar.borderColor + '; background-color: ' + calendar.borderColor + ';"></span>' +
+            '<span>' + calendar.name + '</span>' +
+            '</label></div>'
+        );
+    });
+    calendarList.innerHTML = html.join('\n');
+})();

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1912 - 0
public/tui-calendar/js/chance-1.0.13.min.js


+ 141 - 0
public/tui-calendar/js/data/calendars.js

@@ -0,0 +1,141 @@
+'use strict'
+
+/* eslint-disable require-jsdoc, no-unused-vars */
+
+var CalendarList = []
+
+function CalendarInfo () {
+  this.id = null
+  this.name = null
+  this.checked = true
+  this.color = null
+  this.bgColor = null
+  this.borderColor = null
+  this.dragBgColor = null
+}
+
+function addCalendar (calendar) {
+  CalendarList.push(calendar)
+}
+
+function findCalendar (id) {
+  var found
+
+  CalendarList.forEach(function (calendar) {
+    if (calendar.id === id) {
+      found = calendar
+    }
+  })
+
+  return found || CalendarList[0]
+}
+
+function hexToRGBA (hex) {
+  var radix = 16
+  var r = parseInt(hex.slice(1, 3), radix)
+  var g = parseInt(hex.slice(3, 5), radix)
+  var b = parseInt(hex.slice(5, 7), radix)
+  var a = parseInt(hex.slice(7, 9), radix) / 255 || 1
+  var rgba = 'rgba(' + r + ', ' + g + ', ' + b + ', ' + a + ')'
+
+  return rgba
+}
+
+(function () {
+  if (CalendarList.length === 0) {
+    var cList = JSON.parse(localStorage.getItem('calendarList'))
+    for (var i = 0; i < cList.length; i++) {
+      console.log(cList[i].id)
+      var calendar = new CalendarInfo()
+      calendar.id = cList[i].id
+      calendar.name = cList[i].name
+      calendar.color = cList[i].color
+      calendar.bgColor = cList[i].bgColor
+      calendar.dragBgColor = cList[i].dragBgColor
+      calendar.borderColor = cList[i].borderColor
+      addCalendar(calendar)
+    }
+    /*var calendar
+    var id = 0
+
+    calendar = new CalendarInfo()
+    id += 1
+    calendar.id = String(id)
+    calendar.name = 'My Calendar'
+    calendar.color = '#ffffff'
+    calendar.bgColor = '#9e5fff'
+    calendar.dragBgColor = '#9e5fff'
+    calendar.borderColor = '#9e5fff'
+    addCalendar(calendar)
+
+    calendar = new CalendarInfo()
+    id += 1
+    calendar.id = String(id)
+    calendar.name = 'Company'
+    calendar.color = '#ffffff'
+    calendar.bgColor = '#00a9ff'
+    calendar.dragBgColor = '#00a9ff'
+    calendar.borderColor = '#00a9ff'
+    addCalendar(calendar)
+
+    calendar = new CalendarInfo()
+    id += 1
+    calendar.id = String(id)
+    calendar.name = 'Family'
+    calendar.color = '#ffffff'
+    calendar.bgColor = '#ff5583'
+    calendar.dragBgColor = '#ff5583'
+    calendar.borderColor = '#ff5583'
+    addCalendar(calendar)
+
+    calendar = new CalendarInfo()
+    id += 1
+    calendar.id = String(id)
+    calendar.name = 'Friend'
+    calendar.color = '#ffffff'
+    calendar.bgColor = '#03bd9e'
+    calendar.dragBgColor = '#03bd9e'
+    calendar.borderColor = '#03bd9e'
+    addCalendar(calendar)
+
+    calendar = new CalendarInfo()
+    id += 1
+    calendar.id = String(id)
+    calendar.name = 'Travel'
+    calendar.color = '#ffffff'
+    calendar.bgColor = '#bbdc00'
+    calendar.dragBgColor = '#bbdc00'
+    calendar.borderColor = '#bbdc00'
+    addCalendar(calendar)
+
+    calendar = new CalendarInfo()
+    id += 1
+    calendar.id = String(id)
+    calendar.name = 'etc'
+    calendar.color = '#ffffff'
+    calendar.bgColor = '#9d9d9d'
+    calendar.dragBgColor = '#9d9d9d'
+    calendar.borderColor = '#9d9d9d'
+    addCalendar(calendar)
+
+    calendar = new CalendarInfo()
+    id += 1
+    calendar.id = String(id)
+    calendar.name = 'Birthdays'
+    calendar.color = '#ffffff'
+    calendar.bgColor = '#ffbb3b'
+    calendar.dragBgColor = '#ffbb3b'
+    calendar.borderColor = '#ffbb3b'
+    addCalendar(calendar)
+
+    calendar = new CalendarInfo()
+    id += 1
+    calendar.id = String(id)
+    calendar.name = 'National Holidays'
+    calendar.color = '#ffffff'
+    calendar.bgColor = '#ff4040'
+    calendar.dragBgColor = '#ff4040'
+    calendar.borderColor = '#ff4040'
+    addCalendar(calendar)*/
+  }
+})()

+ 201 - 0
public/tui-calendar/js/data/schedules.js

@@ -0,0 +1,201 @@
+'use strict'
+
+/*eslint-disable*/
+
+var ScheduleList = [];
+
+var SCHEDULE_CATEGORY = [
+    'milestone',
+    'task'
+];
+
+function ScheduleInfo() {
+    this.id = null;
+    this.calendarId = null;
+
+    this.title = null;
+    this.body = null;
+    this.isAllday = false;
+    this.start = null;
+    this.end = null;
+    this.category = '';
+    this.dueDateClass = '';
+
+    this.color = null;
+    this.bgColor = null;
+    this.dragBgColor = null;
+    this.borderColor = null;
+    this.customStyle = '';
+
+    this.isFocused = false;
+    this.isPending = false;
+    this.isVisible = true;
+    this.isReadOnly = false;
+    this.goingDuration = 0;
+    this.comingDuration = 0;
+    this.recurrenceRule = '';
+    this.state = '';
+
+    this.raw = {
+        memo: '',
+        hasToOrCc: false,
+        hasRecurrenceRule: false,
+        location: null,
+        class: 'public', // or 'private'
+        creator: {
+            name: '',
+            avatar: '',
+            company: '',
+            email: '',
+            phone: ''
+        }
+    };
+}
+
+function generateTime(schedule, renderStart, renderEnd) {
+    var startDate = moment(renderStart.getTime())
+    var endDate = moment(renderEnd.getTime());
+    var diffDate = endDate.diff(startDate, 'days');
+
+    schedule.isAllday = chance.bool({likelihood: 30});
+    if (schedule.isAllday) {
+        schedule.category = 'allday';
+    } else if (chance.bool({likelihood: 30})) {
+        schedule.category = SCHEDULE_CATEGORY[chance.integer({min: 0, max: 1})];
+        if (schedule.category === SCHEDULE_CATEGORY[1]) {
+            schedule.dueDateClass = 'morning';
+        }
+    } else {
+        schedule.category = 'time';
+    }
+
+    startDate.add(chance.integer({min: 0, max: diffDate}), 'days');
+    startDate.hours(chance.integer({min: 0, max: 23}))
+    startDate.minutes(chance.bool() ? 0 : 30);
+    schedule.start = startDate.toDate();
+
+    endDate = moment(startDate);
+    if (schedule.isAllday) {
+        endDate.add(chance.integer({min: 0, max: 3}), 'days');
+    }
+
+    schedule.end = endDate
+        .add(chance.integer({min: 1, max: 4}), 'hour')
+        .toDate();
+
+    if (!schedule.isAllday && chance.bool({likelihood: 20})) {
+        schedule.goingDuration = chance.integer({min: 30, max: 120});
+        schedule.comingDuration = chance.integer({min: 30, max: 120});;
+
+        if (chance.bool({likelihood: 50})) {
+            schedule.end = schedule.start;
+        }
+    }
+}
+
+function generateNames() {
+    var names = [];
+    var i = 0;
+    var length = chance.integer({min: 1, max: 10});
+
+    for (; i < length; i += 1) {
+        names.push(chance.name());
+    }
+
+    return names;
+}
+
+function generateRandomSchedule(calendar, renderStart, renderEnd) {
+    var schedule = new ScheduleInfo();
+
+    schedule.id = chance.guid();
+    schedule.calendarId = calendar.id;
+
+    schedule.title = chance.sentence({words: 3});
+    schedule.body = chance.bool({likelihood: 20}) ? chance.sentence({words: 10}) : '';
+    schedule.isReadOnly = chance.bool({likelihood: 20});
+    generateTime(schedule, renderStart, renderEnd);
+
+    schedule.isPrivate = chance.bool({likelihood: 10});
+    schedule.location = chance.address();
+    schedule.attendees = chance.bool({likelihood: 70}) ? generateNames() : [];
+    schedule.recurrenceRule = chance.bool({likelihood: 20}) ? 'repeated events' : '';
+    schedule.state = chance.bool({likelihood: 20}) ? 'Free' : 'Busy';
+    schedule.color = calendar.color;
+    schedule.bgColor = calendar.bgColor;
+    schedule.dragBgColor = calendar.dragBgColor;
+    schedule.borderColor = calendar.borderColor;
+
+    if (schedule.category === 'milestone') {
+        schedule.color = schedule.bgColor;
+        schedule.bgColor = 'transparent';
+        schedule.dragBgColor = 'transparent';
+        schedule.borderColor = 'transparent';
+    }
+
+    schedule.raw.memo = chance.sentence();
+    schedule.raw.creator.name = chance.name();
+    schedule.raw.creator.avatar = chance.avatar();
+    schedule.raw.creator.company = chance.name();
+    schedule.raw.creator.email = chance.email();
+    schedule.raw.creator.phone = chance.phone();
+
+    if (chance.bool({ likelihood: 20 })) {
+        var travelTime = chance.minute();
+        schedule.goingDuration = travelTime;
+        schedule.comingDuration = travelTime;
+    }
+
+    ScheduleList.push(schedule);
+}
+
+function generateSchedule(viewName, renderStart, renderEnd) {
+    ScheduleList = [];
+    generateScheduleFromLocal()
+    /*CalendarList.forEach(function(calendar) {
+        var i = 0, length = 10;
+        if (viewName === 'month') {
+            length = 3;
+        } else if (viewName === 'day') {
+            length = 4;
+        }
+        for (; i < length; i += 1) {
+            generateRandomSchedule(calendar, renderStart, renderEnd);
+        }
+    });*/
+}
+
+function generateScheduleFromLocal() {
+  var sList = JSON.parse(localStorage.getItem('scheduleList'))
+
+  for (var i = 0; i < sList.length; i++) {
+    var schedule = new ScheduleInfo();
+    console.log(sList[i].id)
+    schedule.id = sList[i].id;
+    schedule.calendarId = sList[i].calendarId;
+
+    schedule.title = sList[i].title;
+    schedule.body = sList[i].body;
+    schedule.isReadOnly = sList[i].isReadOnly;
+    schedule.isAllday = sList[i].isAllday;
+    schedule.dueDateClass = sList[i].dueDateClass;
+    schedule.category = sList[i].category;
+    schedule.isPrivate = sList[i].isPrivate;
+    schedule.location = sList[i].location;
+    schedule.attendees = sList[i].attendees;
+    schedule.recurrenceRule = sList[i].recurrenceRule;
+    schedule.state = sList[i].state;
+    schedule.color = sList[i].color;
+    schedule.bgColor = sList[i].bgColor;
+    schedule.dragBgColor = sList[i].dragBgColor;
+    schedule.borderColor = sList[i].borderColor;
+    console.log(sList[i].raw)
+    schedule.raw.memo = sList[i].raw.memo;
+    schedule.raw.creator.name = sList[i].raw.creator.name;
+    schedule.raw.creator.avatar = sList[i].raw.creator.avatar;
+    schedule.raw.creator.company = sList[i].raw.creator.company;
+    schedule.raw.creator.email = sList[i].raw.creator.email;
+    schedule.raw.creator.phone = sList[i].raw.creator.phone;
+    ScheduleList.push(schedule);
+  }
+}

+ 190 - 0
public/tui-calendar/js/default.js

@@ -0,0 +1,190 @@
+/* eslint-disable */
+function init() {
+  cal.setCalendars(CalendarList);
+
+  setRenderRangeText();
+  setSchedules();
+  setEventListener();
+}
+
+function getDataAction(target) {
+  return target.dataset ? target.dataset.action : target.getAttribute('data-action');
+}
+
+function setDropdownCalendarType() {
+  var calendarTypeName = document.getElementById('calendarTypeName');
+  var calendarTypeIcon = document.getElementById('calendarTypeIcon');
+  var options = cal.getOptions();
+  var type = cal.getViewName();
+  var iconClassName;
+
+  if (type === 'day') {
+    type = 'Daily';
+    iconClassName = 'calendar-icon ic_view_day';
+  } else if (type === 'week') {
+    type = 'Weekly';
+    iconClassName = 'calendar-icon ic_view_week';
+  } else if (options.month.visibleWeeksCount === 2) {
+    type = '2 weeks';
+    iconClassName = 'calendar-icon ic_view_week';
+  } else if (options.month.visibleWeeksCount === 3) {
+    type = '3 weeks';
+    iconClassName = 'calendar-icon ic_view_week';
+  } else {
+    type = 'Monthly';
+    iconClassName = 'calendar-icon ic_view_month';
+  }
+
+  calendarTypeName.innerHTML = type;
+  calendarTypeIcon.className = iconClassName;
+}
+
+function onClickMenu(e) {
+  var target = $(e.target).closest('a[role="menuitem"]')[0];
+  var action = getDataAction(target);
+  var options = cal.getOptions();
+  var viewName = '';
+
+  switch (action) {
+    case 'toggle-daily':
+      viewName = 'day';
+      break;
+    case 'toggle-weekly':
+      viewName = 'week';
+      break;
+    case 'toggle-monthly':
+      options.month.visibleWeeksCount = 0;
+      viewName = 'month';
+      break;
+    case 'toggle-weeks2':
+      options.month.visibleWeeksCount = 2;
+      viewName = 'month';
+      break;
+    case 'toggle-weeks3':
+      options.month.visibleWeeksCount = 3;
+      viewName = 'month';
+      break;
+    case 'toggle-narrow-weekend':
+      options.month.narrowWeekend = !options.month.narrowWeekend;
+      options.week.narrowWeekend = !options.week.narrowWeekend;
+      viewName = cal.getViewName();
+
+      target.querySelector('input').checked = options.month.narrowWeekend;
+      break;
+    case 'toggle-start-day-1':
+      options.month.startDayOfWeek = options.month.startDayOfWeek ? 0 : 1;
+      options.week.startDayOfWeek = options.week.startDayOfWeek ? 0 : 1;
+      viewName = cal.getViewName();
+
+      target.querySelector('input').checked = options.month.startDayOfWeek;
+      break;
+    case 'toggle-workweek':
+      options.month.workweek = !options.month.workweek;
+      options.week.workweek = !options.week.workweek;
+      viewName = cal.getViewName();
+
+      target.querySelector('input').checked = !options.month.workweek;
+      break;
+    default:
+      break;
+  }
+
+  cal.setOptions(options, true);
+  cal.changeView(viewName, true);
+
+  setDropdownCalendarType();
+  setRenderRangeText();
+  setSchedules();
+}
+
+function onClickNavi(e) {
+  var action = getDataAction(e.target);
+
+  switch (action) {
+    case 'move-prev':
+      cal.prev();
+      break;
+    case 'move-next':
+      cal.next();
+      break;
+    case 'move-today':
+      cal.today();
+      break;
+    default:
+      return;
+  }
+
+  setRenderRangeText();
+  setSchedules();
+}
+
+function setRenderRangeText() {
+  var renderRange = document.getElementById('renderRange');
+  var options = cal.getOptions();
+  var viewName = cal.getViewName();
+  var html = [];
+  if (viewName === 'day') {
+    html.push(moment(cal.getDate().getTime()).format('YYYY.MM.DD'));
+  } else if (viewName === 'month' &&
+    (!options.month.visibleWeeksCount || options.month.visibleWeeksCount > 4)) {
+    html.push(moment(cal.getDate().getTime()).format('YYYY.MM'));
+  } else {
+    html.push(moment(cal.getDateRangeStart().getTime()).format('YYYY.MM.DD'));
+    html.push(' ~ ');
+    html.push(moment(cal.getDateRangeEnd().getTime()).format(' MM.DD'));
+  }
+  renderRange.innerHTML = html.join('');
+}
+
+function setSchedules() {
+  cal.clear();
+  generateSchedule(cal.getViewName(), cal.getDateRangeStart(), cal.getDateRangeEnd());
+  cal.createSchedules(ScheduleList);
+  refreshScheduleVisibility();
+}
+
+
+function refreshScheduleVisibility() {
+  var calendarElements = Array.prototype.slice.call(document.querySelectorAll('#calendarList input'));
+
+  CalendarList.forEach(function(calendar) {
+    cal.toggleSchedules(calendar.id, !calendar.checked, false);
+  });
+
+  cal.render(true);
+
+  calendarElements.forEach(function(input) {
+    var span = input.nextElementSibling;
+    span.style.backgroundColor = input.checked ? span.style.borderColor : 'transparent';
+  });
+}
+
+resizeThrottled = tui.util.throttle(function() {
+  cal.render();
+}, 50);
+
+function setEventListener() {
+  $('.dropdown-menu a[role="menuitem"]').on('click', onClickMenu);
+  $('#menu-navi').on('click', onClickNavi);
+  window.addEventListener('resize', resizeThrottled);
+}
+
+cal.on({
+  'clickTimezonesCollapseBtn': function(timezonesCollapsed) {
+    if (timezonesCollapsed) {
+      cal.setTheme({
+        'week.daygridLeft.width': '77px',
+        'week.timegridLeft.width': '77px'
+      });
+    } else {
+      cal.setTheme({
+        'week.daygridLeft.width': '60px',
+        'week.timegridLeft.width': '60px'
+      });
+    }
+
+    return true;
+  }
+});
+
+init();

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
public/tui-calendar/js/jquery-3.1.1.min.js


+ 2370 - 0
public/tui-calendar/js/moment-2.20.1.min.js

@@ -0,0 +1,2370 @@
+!function(e, t) {
+  "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : e.moment = t()
+}(this, function() {
+  "use strict";
+  function e() {
+    return Qe.apply(null, arguments)
+  }
+  function t(e) {
+    return e instanceof Array || "[object Array]" === Object.prototype.toString.call(e)
+  }
+  function n(e) {
+    return null != e && "[object Object]" === Object.prototype.toString.call(e)
+  }
+  function s(e) {
+    return void 0 === e
+  }
+  function i(e) {
+    return "number" == typeof e || "[object Number]" === Object.prototype.toString.call(e)
+  }
+  function r(e) {
+    return e instanceof Date || "[object Date]" === Object.prototype.toString.call(e)
+  }
+  function a(e, t) {
+    var n, s = [];
+    for (n = 0; n < e.length; ++n)
+      s.push(t(e[n], n));
+    return s
+  }
+  function o(e, t) {
+    return Object.prototype.hasOwnProperty.call(e, t)
+  }
+  function u(e, t) {
+    for (var n in t)
+      o(t, n) && (e[n] = t[n]);
+    return o(t, "toString") && (e.toString = t.toString),
+    o(t, "valueOf") && (e.valueOf = t.valueOf),
+      e
+  }
+  function l(e, t, n, s) {
+    return ge(e, t, n, s, !0).utc()
+  }
+  function d(e) {
+    return null == e._pf && (e._pf = {
+      empty: !1,
+      unusedTokens: [],
+      unusedInput: [],
+      overflow: -2,
+      charsLeftOver: 0,
+      nullInput: !1,
+      invalidMonth: null,
+      invalidFormat: !1,
+      userInvalidated: !1,
+      iso: !1,
+      parsedDateParts: [],
+      meridiem: null,
+      rfc2822: !1,
+      weekdayMismatch: !1
+    }),
+      e._pf
+  }
+  function h(e) {
+    if (null == e._isValid) {
+      var t = d(e)
+        , n = Xe.call(t.parsedDateParts, function(e) {
+        return null != e
+      })
+        , s = !isNaN(e._d.getTime()) && t.overflow < 0 && !t.empty && !t.invalidMonth && !t.invalidWeekday && !t.weekdayMismatch && !t.nullInput && !t.invalidFormat && !t.userInvalidated && (!t.meridiem || t.meridiem && n);
+      if (e._strict && (s = s && 0 === t.charsLeftOver && 0 === t.unusedTokens.length && void 0 === t.bigHour),
+      null != Object.isFrozen && Object.isFrozen(e))
+        return s;
+      e._isValid = s
+    }
+    return e._isValid
+  }
+  function c(e) {
+    var t = l(NaN);
+    return null != e ? u(d(t), e) : d(t).userInvalidated = !0,
+      t
+  }
+  function f(e, t) {
+    var n, i, r;
+    if (s(t._isAMomentObject) || (e._isAMomentObject = t._isAMomentObject),
+    s(t._i) || (e._i = t._i),
+    s(t._f) || (e._f = t._f),
+    s(t._l) || (e._l = t._l),
+    s(t._strict) || (e._strict = t._strict),
+    s(t._tzm) || (e._tzm = t._tzm),
+    s(t._isUTC) || (e._isUTC = t._isUTC),
+    s(t._offset) || (e._offset = t._offset),
+    s(t._pf) || (e._pf = d(t)),
+    s(t._locale) || (e._locale = t._locale),
+    Ke.length > 0)
+      for (n = 0; n < Ke.length; n++)
+        s(r = t[i = Ke[n]]) || (e[i] = r);
+    return e
+  }
+  function m(t) {
+    f(this, t),
+      this._d = new Date(null != t._d ? t._d.getTime() : NaN),
+    this.isValid() || (this._d = new Date(NaN)),
+    !1 === et && (et = !0,
+      e.updateOffset(this),
+      et = !1)
+  }
+  function _(e) {
+    return e instanceof m || null != e && null != e._isAMomentObject
+  }
+  function y(e) {
+    return e < 0 ? Math.ceil(e) || 0 : Math.floor(e)
+  }
+  function g(e) {
+    var t = +e
+      , n = 0;
+    return 0 !== t && isFinite(t) && (n = y(t)),
+      n
+  }
+  function p(e, t, n) {
+    var s, i = Math.min(e.length, t.length), r = Math.abs(e.length - t.length), a = 0;
+    for (s = 0; s < i; s++)
+      (n && e[s] !== t[s] || !n && g(e[s]) !== g(t[s])) && a++;
+    return a + r
+  }
+  function w(t) {
+    !1 === e.suppressDeprecationWarnings && "undefined" != typeof console && console.warn && console.warn("Deprecation warning: " + t)
+  }
+  function v(t, n) {
+    var s = !0;
+    return u(function() {
+      if (null != e.deprecationHandler && e.deprecationHandler(null, t),
+        s) {
+        for (var i, r = [], a = 0; a < arguments.length; a++) {
+          if (i = "",
+          "object" == typeof arguments[a]) {
+            i += "\n[" + a + "] ";
+            for (var o in arguments[0])
+              i += o + ": " + arguments[0][o] + ", ";
+            i = i.slice(0, -2)
+          } else
+            i = arguments[a];
+          r.push(i)
+        }
+        w(t + "\nArguments: " + Array.prototype.slice.call(r).join("") + "\n" + (new Error).stack),
+          s = !1
+      }
+      return n.apply(this, arguments)
+    }, n)
+  }
+  function M(t, n) {
+    null != e.deprecationHandler && e.deprecationHandler(t, n),
+    tt[t] || (w(n),
+      tt[t] = !0)
+  }
+  function S(e) {
+    return e instanceof Function || "[object Function]" === Object.prototype.toString.call(e)
+  }
+  function D(e, t) {
+    var s, i = u({}, e);
+    for (s in t)
+      o(t, s) && (n(e[s]) && n(t[s]) ? (i[s] = {},
+        u(i[s], e[s]),
+        u(i[s], t[s])) : null != t[s] ? i[s] = t[s] : delete i[s]);
+    for (s in e)
+      o(e, s) && !o(t, s) && n(e[s]) && (i[s] = u({}, i[s]));
+    return i
+  }
+  function k(e) {
+    null != e && this.set(e)
+  }
+  function Y(e, t) {
+    var n = e.toLowerCase();
+    st[n] = st[n + "s"] = st[t] = e
+  }
+  function O(e) {
+    return "string" == typeof e ? st[e] || st[e.toLowerCase()] : void 0
+  }
+  function T(e) {
+    var t, n, s = {};
+    for (n in e)
+      o(e, n) && (t = O(n)) && (s[t] = e[n]);
+    return s
+  }
+  function x(e, t) {
+    it[e] = t
+  }
+  function b(e, t, n) {
+    var s = "" + Math.abs(e)
+      , i = t - s.length;
+    return (e >= 0 ? n ? "+" : "" : "-") + Math.pow(10, Math.max(0, i)).toString().substr(1) + s
+  }
+  function P(e, t, n, s) {
+    var i = s;
+    "string" == typeof s && (i = function() {
+        return this[s]()
+      }
+    ),
+    e && (ut[e] = i),
+    t && (ut[t[0]] = function() {
+        return b(i.apply(this, arguments), t[1], t[2])
+      }
+    ),
+    n && (ut[n] = function() {
+        return this.localeData().ordinal(i.apply(this, arguments), e)
+      }
+    )
+  }
+  function W(e) {
+    return e.match(/\[[\s\S]/) ? e.replace(/^\[|\]$/g, "") : e.replace(/\\/g, "")
+  }
+  function H(e, t) {
+    return e.isValid() ? (t = R(t, e.localeData()),
+      ot[t] = ot[t] || function(e) {
+        var t, n, s = e.match(rt);
+        for (t = 0,
+               n = s.length; t < n; t++)
+          ut[s[t]] ? s[t] = ut[s[t]] : s[t] = W(s[t]);
+        return function(t) {
+          var i, r = "";
+          for (i = 0; i < n; i++)
+            r += S(s[i]) ? s[i].call(t, e) : s[i];
+          return r
+        }
+      }(t),
+      ot[t](e)) : e.localeData().invalidDate()
+  }
+  function R(e, t) {
+    function n(e) {
+      return t.longDateFormat(e) || e
+    }
+    var s = 5;
+    for (at.lastIndex = 0; s >= 0 && at.test(e); )
+      e = e.replace(at, n),
+        at.lastIndex = 0,
+        s -= 1;
+    return e
+  }
+  function C(e, t, n) {
+    Yt[e] = S(t) ? t : function(e, s) {
+      return e && n ? n : t
+    }
+  }
+  function F(e, t) {
+    return o(Yt, e) ? Yt[e](t._strict, t._locale) : new RegExp(function(e) {
+      return U(e.replace("\\", "").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function(e, t, n, s, i) {
+        return t || n || s || i
+      }))
+    }(e))
+  }
+  function U(e) {
+    return e.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&")
+  }
+  function L(e, t) {
+    var n, s = t;
+    for ("string" == typeof e && (e = [e]),
+         i(t) && (s = function(e, n) {
+             n[t] = g(e)
+           }
+         ),
+           n = 0; n < e.length; n++)
+      Ot[e[n]] = s
+  }
+  function N(e, t) {
+    L(e, function(e, n, s, i) {
+      s._w = s._w || {},
+        t(e, s._w, s, i)
+    })
+  }
+  function G(e, t, n) {
+    null != t && o(Ot, e) && Ot[e](t, n._a, n, e)
+  }
+  function V(e) {
+    return E(e) ? 366 : 365
+  }
+  function E(e) {
+    return e % 4 == 0 && e % 100 != 0 || e % 400 == 0
+  }
+  function I(t, n) {
+    return function(s) {
+      return null != s ? (j(this, t, s),
+        e.updateOffset(this, n),
+        this) : A(this, t)
+    }
+  }
+  function A(e, t) {
+    return e.isValid() ? e._d["get" + (e._isUTC ? "UTC" : "") + t]() : NaN
+  }
+  function j(e, t, n) {
+    e.isValid() && !isNaN(n) && ("FullYear" === t && E(e.year()) && 1 === e.month() && 29 === e.date() ? e._d["set" + (e._isUTC ? "UTC" : "") + t](n, e.month(), Z(n, e.month())) : e._d["set" + (e._isUTC ? "UTC" : "") + t](n))
+  }
+  function Z(e, t) {
+    if (isNaN(e) || isNaN(t))
+      return NaN;
+    var n = function(e, t) {
+      return (e % t + t) % t
+    }(t, 12);
+    return e += (t - n) / 12,
+      1 === n ? E(e) ? 29 : 28 : 31 - n % 7 % 2
+  }
+  function z(e, t) {
+    var n;
+    if (!e.isValid())
+      return e;
+    if ("string" == typeof t)
+      if (/^\d+$/.test(t))
+        t = g(t);
+      else if (t = e.localeData().monthsParse(t),
+        !i(t))
+        return e;
+    return n = Math.min(e.date(), Z(e.year(), t)),
+      e._d["set" + (e._isUTC ? "UTC" : "") + "Month"](t, n),
+      e
+  }
+  function $(t) {
+    return null != t ? (z(this, t),
+      e.updateOffset(this, !0),
+      this) : A(this, "Month")
+  }
+  function q() {
+    function e(e, t) {
+      return t.length - e.length
+    }
+    var t, n, s = [], i = [], r = [];
+    for (t = 0; t < 12; t++)
+      n = l([2e3, t]),
+        s.push(this.monthsShort(n, "")),
+        i.push(this.months(n, "")),
+        r.push(this.months(n, "")),
+        r.push(this.monthsShort(n, ""));
+    for (s.sort(e),
+           i.sort(e),
+           r.sort(e),
+           t = 0; t < 12; t++)
+      s[t] = U(s[t]),
+        i[t] = U(i[t]);
+    for (t = 0; t < 24; t++)
+      r[t] = U(r[t]);
+    this._monthsRegex = new RegExp("^(" + r.join("|") + ")","i"),
+      this._monthsShortRegex = this._monthsRegex,
+      this._monthsStrictRegex = new RegExp("^(" + i.join("|") + ")","i"),
+      this._monthsShortStrictRegex = new RegExp("^(" + s.join("|") + ")","i")
+  }
+  function J(e) {
+    var t = new Date(Date.UTC.apply(null, arguments));
+    return e < 100 && e >= 0 && isFinite(t.getUTCFullYear()) && t.setUTCFullYear(e),
+      t
+  }
+  function B(e, t, n) {
+    var s = 7 + t - n;
+    return -((7 + J(e, 0, s).getUTCDay() - t) % 7) + s - 1
+  }
+  function Q(e, t, n, s, i) {
+    var r, a, o = 1 + 7 * (t - 1) + (7 + n - s) % 7 + B(e, s, i);
+    return o <= 0 ? a = V(r = e - 1) + o : o > V(e) ? (r = e + 1,
+      a = o - V(e)) : (r = e,
+      a = o),
+      {
+        year: r,
+        dayOfYear: a
+      }
+  }
+  function X(e, t, n) {
+    var s, i, r = B(e.year(), t, n), a = Math.floor((e.dayOfYear() - r - 1) / 7) + 1;
+    return a < 1 ? s = a + K(i = e.year() - 1, t, n) : a > K(e.year(), t, n) ? (s = a - K(e.year(), t, n),
+      i = e.year() + 1) : (i = e.year(),
+      s = a),
+      {
+        week: s,
+        year: i
+      }
+  }
+  function K(e, t, n) {
+    var s = B(e, t, n)
+      , i = B(e + 1, t, n);
+    return (V(e) - s + i) / 7
+  }
+  function ee() {
+    function e(e, t) {
+      return t.length - e.length
+    }
+    var t, n, s, i, r, a = [], o = [], u = [], d = [];
+    for (t = 0; t < 7; t++)
+      n = l([2e3, 1]).day(t),
+        s = this.weekdaysMin(n, ""),
+        i = this.weekdaysShort(n, ""),
+        r = this.weekdays(n, ""),
+        a.push(s),
+        o.push(i),
+        u.push(r),
+        d.push(s),
+        d.push(i),
+        d.push(r);
+    for (a.sort(e),
+           o.sort(e),
+           u.sort(e),
+           d.sort(e),
+           t = 0; t < 7; t++)
+      o[t] = U(o[t]),
+        u[t] = U(u[t]),
+        d[t] = U(d[t]);
+    this._weekdaysRegex = new RegExp("^(" + d.join("|") + ")","i"),
+      this._weekdaysShortRegex = this._weekdaysRegex,
+      this._weekdaysMinRegex = this._weekdaysRegex,
+      this._weekdaysStrictRegex = new RegExp("^(" + u.join("|") + ")","i"),
+      this._weekdaysShortStrictRegex = new RegExp("^(" + o.join("|") + ")","i"),
+      this._weekdaysMinStrictRegex = new RegExp("^(" + a.join("|") + ")","i")
+  }
+  function te() {
+    return this.hours() % 12 || 12
+  }
+  function ne(e, t) {
+    P(e, 0, 0, function() {
+      return this.localeData().meridiem(this.hours(), this.minutes(), t)
+    })
+  }
+  function se(e, t) {
+    return t._meridiemParse
+  }
+  function ie(e) {
+    return e ? e.toLowerCase().replace("_", "-") : e
+  }
+  function re(e) {
+    var t = null;
+    if (!Xt[e] && "undefined" != typeof module && module && module.exports)
+      try {
+        t = Jt._abbr;
+        require("./locale/" + e),
+          ae(t)
+      } catch (e) {}
+    return Xt[e]
+  }
+  function ae(e, t) {
+    var n;
+    return e && (n = s(t) ? ue(e) : oe(e, t)) && (Jt = n),
+      Jt._abbr
+  }
+  function oe(e, t) {
+    if (null !== t) {
+      var n = Qt;
+      if (t.abbr = e,
+      null != Xt[e])
+        M("defineLocaleOverride", "use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),
+          n = Xt[e]._config;
+      else if (null != t.parentLocale) {
+        if (null == Xt[t.parentLocale])
+          return Kt[t.parentLocale] || (Kt[t.parentLocale] = []),
+            Kt[t.parentLocale].push({
+              name: e,
+              config: t
+            }),
+            null;
+        n = Xt[t.parentLocale]._config
+      }
+      return Xt[e] = new k(D(n, t)),
+      Kt[e] && Kt[e].forEach(function(e) {
+        oe(e.name, e.config)
+      }),
+        ae(e),
+        Xt[e]
+    }
+    return delete Xt[e],
+      null
+  }
+  function ue(e) {
+    var n;
+    if (e && e._locale && e._locale._abbr && (e = e._locale._abbr),
+      !e)
+      return Jt;
+    if (!t(e)) {
+      if (n = re(e))
+        return n;
+      e = [e]
+    }
+    return function(e) {
+      for (var t, n, s, i, r = 0; r < e.length; ) {
+        for (t = (i = ie(e[r]).split("-")).length,
+               n = (n = ie(e[r + 1])) ? n.split("-") : null; t > 0; ) {
+          if (s = re(i.slice(0, t).join("-")))
+            return s;
+          if (n && n.length >= t && p(i, n, !0) >= t - 1)
+            break;
+          t--
+        }
+        r++
+      }
+      return null
+    }(e)
+  }
+  function le(e) {
+    var t, n = e._a;
+    return n && -2 === d(e).overflow && (t = n[xt] < 0 || n[xt] > 11 ? xt : n[bt] < 1 || n[bt] > Z(n[Tt], n[xt]) ? bt : n[Pt] < 0 || n[Pt] > 24 || 24 === n[Pt] && (0 !== n[Wt] || 0 !== n[Ht] || 0 !== n[Rt]) ? Pt : n[Wt] < 0 || n[Wt] > 59 ? Wt : n[Ht] < 0 || n[Ht] > 59 ? Ht : n[Rt] < 0 || n[Rt] > 999 ? Rt : -1,
+    d(e)._overflowDayOfYear && (t < Tt || t > bt) && (t = bt),
+    d(e)._overflowWeeks && -1 === t && (t = Ct),
+    d(e)._overflowWeekday && -1 === t && (t = Ft),
+      d(e).overflow = t),
+      e
+  }
+  function de(e, t, n) {
+    return null != e ? e : null != t ? t : n
+  }
+  function he(t) {
+    var n, s, i, r, a, o = [];
+    if (!t._d) {
+      for (i = function(t) {
+        var n = new Date(e.now());
+        return t._useUTC ? [n.getUTCFullYear(), n.getUTCMonth(), n.getUTCDate()] : [n.getFullYear(), n.getMonth(), n.getDate()]
+      }(t),
+           t._w && null == t._a[bt] && null == t._a[xt] && function(e) {
+             var t, n, s, i, r, a, o, u;
+             if (null != (t = e._w).GG || null != t.W || null != t.E)
+               r = 1,
+                 a = 4,
+                 n = de(t.GG, e._a[Tt], X(pe(), 1, 4).year),
+                 s = de(t.W, 1),
+               ((i = de(t.E, 1)) < 1 || i > 7) && (u = !0);
+             else {
+               r = e._locale._week.dow,
+                 a = e._locale._week.doy;
+               var l = X(pe(), r, a);
+               n = de(t.gg, e._a[Tt], l.year),
+                 s = de(t.w, l.week),
+                 null != t.d ? ((i = t.d) < 0 || i > 6) && (u = !0) : null != t.e ? (i = t.e + r,
+                 (t.e < 0 || t.e > 6) && (u = !0)) : i = r
+             }
+             s < 1 || s > K(n, r, a) ? d(e)._overflowWeeks = !0 : null != u ? d(e)._overflowWeekday = !0 : (o = Q(n, s, i, r, a),
+               e._a[Tt] = o.year,
+               e._dayOfYear = o.dayOfYear)
+           }(t),
+           null != t._dayOfYear && (a = de(t._a[Tt], i[Tt]),
+           (t._dayOfYear > V(a) || 0 === t._dayOfYear) && (d(t)._overflowDayOfYear = !0),
+             s = J(a, 0, t._dayOfYear),
+             t._a[xt] = s.getUTCMonth(),
+             t._a[bt] = s.getUTCDate()),
+             n = 0; n < 3 && null == t._a[n]; ++n)
+        t._a[n] = o[n] = i[n];
+      for (; n < 7; n++)
+        t._a[n] = o[n] = null == t._a[n] ? 2 === n ? 1 : 0 : t._a[n];
+      24 === t._a[Pt] && 0 === t._a[Wt] && 0 === t._a[Ht] && 0 === t._a[Rt] && (t._nextDay = !0,
+        t._a[Pt] = 0),
+        t._d = (t._useUTC ? J : function(e, t, n, s, i, r, a) {
+            var o = new Date(e,t,n,s,i,r,a);
+            return e < 100 && e >= 0 && isFinite(o.getFullYear()) && o.setFullYear(e),
+              o
+          }
+        ).apply(null, o),
+        r = t._useUTC ? t._d.getUTCDay() : t._d.getDay(),
+      null != t._tzm && t._d.setUTCMinutes(t._d.getUTCMinutes() - t._tzm),
+      t._nextDay && (t._a[Pt] = 24),
+      t._w && void 0 !== t._w.d && t._w.d !== r && (d(t).weekdayMismatch = !0)
+    }
+  }
+  function ce(e) {
+    var t, n, s, i, r, a, o = e._i, u = en.exec(o) || tn.exec(o);
+    if (u) {
+      for (d(e).iso = !0,
+             t = 0,
+             n = sn.length; t < n; t++)
+        if (sn[t][1].exec(u[1])) {
+          i = sn[t][0],
+            s = !1 !== sn[t][2];
+          break
+        }
+      if (null == i)
+        return void (e._isValid = !1);
+      if (u[3]) {
+        for (t = 0,
+               n = rn.length; t < n; t++)
+          if (rn[t][1].exec(u[3])) {
+            r = (u[2] || " ") + rn[t][0];
+            break
+          }
+        if (null == r)
+          return void (e._isValid = !1)
+      }
+      if (!s && null != r)
+        return void (e._isValid = !1);
+      if (u[4]) {
+        if (!nn.exec(u[4]))
+          return void (e._isValid = !1);
+        a = "Z"
+      }
+      e._f = i + (r || "") + (a || ""),
+        _e(e)
+    } else
+      e._isValid = !1
+  }
+  function fe(e, t, n, s, i, r) {
+    var a = [function(e) {
+      var t = parseInt(e, 10);
+      {
+        if (t <= 49)
+          return 2e3 + t;
+        if (t <= 999)
+          return 1900 + t
+      }
+      return t
+    }(e), Vt.indexOf(t), parseInt(n, 10), parseInt(s, 10), parseInt(i, 10)];
+    return r && a.push(parseInt(r, 10)),
+      a
+  }
+  function me(e) {
+    var t = on.exec(function(e) {
+      return e.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim()
+    }(e._i));
+    if (t) {
+      var n = fe(t[4], t[3], t[2], t[5], t[6], t[7]);
+      if (!function(e, t, n) {
+        if (e && jt.indexOf(e) !== new Date(t[0],t[1],t[2]).getDay())
+          return d(n).weekdayMismatch = !0,
+            n._isValid = !1,
+            !1;
+        return !0
+      }(t[1], n, e))
+        return;
+      e._a = n,
+        e._tzm = function(e, t, n) {
+          if (e)
+            return un[e];
+          if (t)
+            return 0;
+          var s = parseInt(n, 10)
+            , i = s % 100;
+          return (s - i) / 100 * 60 + i
+        }(t[8], t[9], t[10]),
+        e._d = J.apply(null, e._a),
+        e._d.setUTCMinutes(e._d.getUTCMinutes() - e._tzm),
+        d(e).rfc2822 = !0
+    } else
+      e._isValid = !1
+  }
+  function _e(t) {
+    if (t._f !== e.ISO_8601)
+      if (t._f !== e.RFC_2822) {
+        t._a = [],
+          d(t).empty = !0;
+        var n, s, i, r, a, o = "" + t._i, u = o.length, l = 0;
+        for (i = R(t._f, t._locale).match(rt) || [],
+               n = 0; n < i.length; n++)
+          r = i[n],
+          (s = (o.match(F(r, t)) || [])[0]) && ((a = o.substr(0, o.indexOf(s))).length > 0 && d(t).unusedInput.push(a),
+            o = o.slice(o.indexOf(s) + s.length),
+            l += s.length),
+            ut[r] ? (s ? d(t).empty = !1 : d(t).unusedTokens.push(r),
+              G(r, s, t)) : t._strict && !s && d(t).unusedTokens.push(r);
+        d(t).charsLeftOver = u - l,
+        o.length > 0 && d(t).unusedInput.push(o),
+        t._a[Pt] <= 12 && !0 === d(t).bigHour && t._a[Pt] > 0 && (d(t).bigHour = void 0),
+          d(t).parsedDateParts = t._a.slice(0),
+          d(t).meridiem = t._meridiem,
+          t._a[Pt] = function(e, t, n) {
+            var s;
+            if (null == n)
+              return t;
+            return null != e.meridiemHour ? e.meridiemHour(t, n) : null != e.isPM ? ((s = e.isPM(n)) && t < 12 && (t += 12),
+            s || 12 !== t || (t = 0),
+              t) : t
+          }(t._locale, t._a[Pt], t._meridiem),
+          he(t),
+          le(t)
+      } else
+        me(t);
+    else
+      ce(t)
+  }
+  function ye(o) {
+    var l = o._i
+      , y = o._f;
+    return o._locale = o._locale || ue(o._l),
+      null === l || void 0 === y && "" === l ? c({
+        nullInput: !0
+      }) : ("string" == typeof l && (o._i = l = o._locale.preparse(l)),
+        _(l) ? new m(le(l)) : (r(l) ? o._d = l : t(y) ? function(e) {
+          var t, n, s, i, r;
+          if (0 === e._f.length)
+            return d(e).invalidFormat = !0,
+              void (e._d = new Date(NaN));
+          for (i = 0; i < e._f.length; i++)
+            r = 0,
+              t = f({}, e),
+            null != e._useUTC && (t._useUTC = e._useUTC),
+              t._f = e._f[i],
+              _e(t),
+            h(t) && (r += d(t).charsLeftOver,
+              r += 10 * d(t).unusedTokens.length,
+              d(t).score = r,
+            (null == s || r < s) && (s = r,
+              n = t));
+          u(e, n || t)
+        }(o) : y ? _e(o) : function(o) {
+          var u = o._i;
+          s(u) ? o._d = new Date(e.now()) : r(u) ? o._d = new Date(u.valueOf()) : "string" == typeof u ? function(t) {
+            var n = an.exec(t._i);
+            null === n ? (ce(t),
+            !1 === t._isValid && (delete t._isValid,
+              me(t),
+            !1 === t._isValid && (delete t._isValid,
+              e.createFromInputFallback(t)))) : t._d = new Date(+n[1])
+          }(o) : t(u) ? (o._a = a(u.slice(0), function(e) {
+            return parseInt(e, 10)
+          }),
+            he(o)) : n(u) ? function(e) {
+            if (!e._d) {
+              var t = T(e._i);
+              e._a = a([t.year, t.month, t.day || t.date, t.hour, t.minute, t.second, t.millisecond], function(e) {
+                return e && parseInt(e, 10)
+              }),
+                he(e)
+            }
+          }(o) : i(u) ? o._d = new Date(u) : e.createFromInputFallback(o)
+        }(o),
+        h(o) || (o._d = null),
+          o))
+  }
+  function ge(e, s, i, r, a) {
+    var o = {};
+    return !0 !== i && !1 !== i || (r = i,
+      i = void 0),
+    (n(e) && function(e) {
+      if (Object.getOwnPropertyNames)
+        return 0 === Object.getOwnPropertyNames(e).length;
+      var t;
+      for (t in e)
+        if (e.hasOwnProperty(t))
+          return !1;
+      return !0
+    }(e) || t(e) && 0 === e.length) && (e = void 0),
+      o._isAMomentObject = !0,
+      o._useUTC = o._isUTC = a,
+      o._l = i,
+      o._i = e,
+      o._f = s,
+      o._strict = r,
+      function(e) {
+        var t = new m(le(ye(e)));
+        return t._nextDay && (t.add(1, "d"),
+          t._nextDay = void 0),
+          t
+      }(o)
+  }
+  function pe(e, t, n, s) {
+    return ge(e, t, n, s, !1)
+  }
+  function we(e, n) {
+    var s, i;
+    if (1 === n.length && t(n[0]) && (n = n[0]),
+      !n.length)
+      return pe();
+    for (s = n[0],
+           i = 1; i < n.length; ++i)
+      n[i].isValid() && !n[i][e](s) || (s = n[i]);
+    return s
+  }
+  function ve(e) {
+    var t = T(e)
+      , n = t.year || 0
+      , s = t.quarter || 0
+      , i = t.month || 0
+      , r = t.week || 0
+      , a = t.day || 0
+      , o = t.hour || 0
+      , u = t.minute || 0
+      , l = t.second || 0
+      , d = t.millisecond || 0;
+    this._isValid = function(e) {
+      for (var t in e)
+        if (-1 === Ut.call(hn, t) || null != e[t] && isNaN(e[t]))
+          return !1;
+      for (var n = !1, s = 0; s < hn.length; ++s)
+        if (e[hn[s]]) {
+          if (n)
+            return !1;
+          parseFloat(e[hn[s]]) !== g(e[hn[s]]) && (n = !0)
+        }
+      return !0
+    }(t),
+      this._milliseconds = +d + 1e3 * l + 6e4 * u + 1e3 * o * 60 * 60,
+      this._days = +a + 7 * r,
+      this._months = +i + 3 * s + 12 * n,
+      this._data = {},
+      this._locale = ue(),
+      this._bubble()
+  }
+  function Me(e) {
+    return e instanceof ve
+  }
+  function Se(e) {
+    return e < 0 ? -1 * Math.round(-1 * e) : Math.round(e)
+  }
+  function De(e, t) {
+    P(e, 0, 0, function() {
+      var e = this.utcOffset()
+        , n = "+";
+      return e < 0 && (e = -e,
+        n = "-"),
+      n + b(~~(e / 60), 2) + t + b(~~e % 60, 2)
+    })
+  }
+  function ke(e, t) {
+    var n = (t || "").match(e);
+    if (null === n)
+      return null;
+    var s = ((n[n.length - 1] || []) + "").match(cn) || ["-", 0, 0]
+      , i = 60 * s[1] + g(s[2]);
+    return 0 === i ? 0 : "+" === s[0] ? i : -i
+  }
+  function Ye(t, n) {
+    var s, i;
+    return n._isUTC ? (s = n.clone(),
+      i = (_(t) || r(t) ? t.valueOf() : pe(t).valueOf()) - s.valueOf(),
+      s._d.setTime(s._d.valueOf() + i),
+      e.updateOffset(s, !1),
+      s) : pe(t).local()
+  }
+  function Oe(e) {
+    return 15 * -Math.round(e._d.getTimezoneOffset() / 15)
+  }
+  function Te() {
+    return !!this.isValid() && (this._isUTC && 0 === this._offset)
+  }
+  function xe(e, t) {
+    var n, s, r, a = e, u = null;
+    return Me(e) ? a = {
+      ms: e._milliseconds,
+      d: e._days,
+      M: e._months
+    } : i(e) ? (a = {},
+      t ? a[t] = e : a.milliseconds = e) : (u = fn.exec(e)) ? (n = "-" === u[1] ? -1 : 1,
+      a = {
+        y: 0,
+        d: g(u[bt]) * n,
+        h: g(u[Pt]) * n,
+        m: g(u[Wt]) * n,
+        s: g(u[Ht]) * n,
+        ms: g(Se(1e3 * u[Rt])) * n
+      }) : (u = mn.exec(e)) ? (n = "-" === u[1] ? -1 : (u[1],
+      1),
+      a = {
+        y: be(u[2], n),
+        M: be(u[3], n),
+        w: be(u[4], n),
+        d: be(u[5], n),
+        h: be(u[6], n),
+        m: be(u[7], n),
+        s: be(u[8], n)
+      }) : null == a ? a = {} : "object" == typeof a && ("from"in a || "to"in a) && (r = function(e, t) {
+      var n;
+      if (!e.isValid() || !t.isValid())
+        return {
+          milliseconds: 0,
+          months: 0
+        };
+      t = Ye(t, e),
+        e.isBefore(t) ? n = Pe(e, t) : ((n = Pe(t, e)).milliseconds = -n.milliseconds,
+          n.months = -n.months);
+      return n
+    }(pe(a.from), pe(a.to)),
+      (a = {}).ms = r.milliseconds,
+      a.M = r.months),
+      s = new ve(a),
+    Me(e) && o(e, "_locale") && (s._locale = e._locale),
+      s
+  }
+  function be(e, t) {
+    var n = e && parseFloat(e.replace(",", "."));
+    return (isNaN(n) ? 0 : n) * t
+  }
+  function Pe(e, t) {
+    var n = {
+      milliseconds: 0,
+      months: 0
+    };
+    return n.months = t.month() - e.month() + 12 * (t.year() - e.year()),
+    e.clone().add(n.months, "M").isAfter(t) && --n.months,
+      n.milliseconds = +t - +e.clone().add(n.months, "M"),
+      n
+  }
+  function We(e, t) {
+    return function(n, s) {
+      var i, r;
+      return null === s || isNaN(+s) || (M(t, "moment()." + t + "(period, number) is deprecated. Please use moment()." + t + "(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),
+        r = n,
+        n = s,
+        s = r),
+        n = "string" == typeof n ? +n : n,
+        i = xe(n, s),
+        He(this, i, e),
+        this
+    }
+  }
+  function He(t, n, s, i) {
+    var r = n._milliseconds
+      , a = Se(n._days)
+      , o = Se(n._months);
+    t.isValid() && (i = null == i || i,
+    o && z(t, A(t, "Month") + o * s),
+    a && j(t, "Date", A(t, "Date") + a * s),
+    r && t._d.setTime(t._d.valueOf() + r * s),
+    i && e.updateOffset(t, a || o))
+  }
+  function Re(e, t) {
+    var n, s = 12 * (t.year() - e.year()) + (t.month() - e.month()), i = e.clone().add(s, "months");
+    return n = t - i < 0 ? (t - i) / (i - e.clone().add(s - 1, "months")) : (t - i) / (e.clone().add(s + 1, "months") - i),
+    -(s + n) || 0
+  }
+  function Ce(e) {
+    var t;
+    return void 0 === e ? this._locale._abbr : (null != (t = ue(e)) && (this._locale = t),
+      this)
+  }
+  function Fe() {
+    return this._locale
+  }
+  function Ue(e, t) {
+    P(0, [e, e.length], 0, t)
+  }
+  function Le(e, t, n, s, i) {
+    var r;
+    return null == e ? X(this, s, i).year : (r = K(e, s, i),
+    t > r && (t = r),
+      function(e, t, n, s, i) {
+        var r = Q(e, t, n, s, i)
+          , a = J(r.year, 0, r.dayOfYear);
+        return this.year(a.getUTCFullYear()),
+          this.month(a.getUTCMonth()),
+          this.date(a.getUTCDate()),
+          this
+      }
+        .call(this, e, t, n, s, i))
+  }
+  function Ne(e, t) {
+    t[Rt] = g(1e3 * ("0." + e))
+  }
+  function Ge(e) {
+    return e
+  }
+  function Ve(e, t, n, s) {
+    var i = ue()
+      , r = l().set(s, t);
+    return i[n](r, e)
+  }
+  function Ee(e, t, n) {
+    if (i(e) && (t = e,
+      e = void 0),
+      e = e || "",
+    null != t)
+      return Ve(e, t, n, "month");
+    var s, r = [];
+    for (s = 0; s < 12; s++)
+      r[s] = Ve(e, s, n, "month");
+    return r
+  }
+  function Ie(e, t, n, s) {
+    "boolean" == typeof e ? (i(t) && (n = t,
+      t = void 0),
+      t = t || "") : (n = t = e,
+      e = !1,
+    i(t) && (n = t,
+      t = void 0),
+      t = t || "");
+    var r = ue()
+      , a = e ? r._week.dow : 0;
+    if (null != n)
+      return Ve(t, (n + a) % 7, s, "day");
+    var o, u = [];
+    for (o = 0; o < 7; o++)
+      u[o] = Ve(t, (o + a) % 7, s, "day");
+    return u
+  }
+  function Ae(e, t, n, s) {
+    var i = xe(t, n);
+    return e._milliseconds += s * i._milliseconds,
+      e._days += s * i._days,
+      e._months += s * i._months,
+      e._bubble()
+  }
+  function je(e) {
+    return e < 0 ? Math.floor(e) : Math.ceil(e)
+  }
+  function Ze(e) {
+    return 4800 * e / 146097
+  }
+  function ze(e) {
+    return 146097 * e / 4800
+  }
+  function $e(e) {
+    return function() {
+      return this.as(e)
+    }
+  }
+  function qe(e) {
+    return function() {
+      return this.isValid() ? this._data[e] : NaN
+    }
+  }
+  function Je(e) {
+    return (e > 0) - (e < 0) || +e
+  }
+  function Be() {
+    if (!this.isValid())
+      return this.localeData().invalidDate();
+    var e, t, n = An(this._milliseconds) / 1e3, s = An(this._days), i = An(this._months);
+    t = y((e = y(n / 60)) / 60),
+      n %= 60,
+      e %= 60;
+    var r = y(i / 12)
+      , a = i %= 12
+      , o = s
+      , u = t
+      , l = e
+      , d = n ? n.toFixed(3).replace(/\.?0+$/, "") : ""
+      , h = this.asSeconds();
+    if (!h)
+      return "P0D";
+    var c = h < 0 ? "-" : ""
+      , f = Je(this._months) !== Je(h) ? "-" : ""
+      , m = Je(this._days) !== Je(h) ? "-" : ""
+      , _ = Je(this._milliseconds) !== Je(h) ? "-" : "";
+    return c + "P" + (r ? f + r + "Y" : "") + (a ? f + a + "M" : "") + (o ? m + o + "D" : "") + (u || l || d ? "T" : "") + (u ? _ + u + "H" : "") + (l ? _ + l + "M" : "") + (d ? _ + d + "S" : "")
+  }
+  var Qe, Xe;
+  Xe = Array.prototype.some ? Array.prototype.some : function(e) {
+    for (var t = Object(this), n = t.length >>> 0, s = 0; s < n; s++)
+      if (s in t && e.call(this, t[s], s, t))
+        return !0;
+    return !1
+  }
+  ;
+  var Ke = e.momentProperties = []
+    , et = !1
+    , tt = {};
+  e.suppressDeprecationWarnings = !1,
+    e.deprecationHandler = null;
+  var nt;
+  nt = Object.keys ? Object.keys : function(e) {
+    var t, n = [];
+    for (t in e)
+      o(e, t) && n.push(t);
+    return n
+  }
+  ;
+  var st = {}
+    , it = {}
+    , rt = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g
+    , at = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g
+    , ot = {}
+    , ut = {}
+    , lt = /\d/
+    , dt = /\d\d/
+    , ht = /\d{3}/
+    , ct = /\d{4}/
+    , ft = /[+-]?\d{6}/
+    , mt = /\d\d?/
+    , _t = /\d\d\d\d?/
+    , yt = /\d\d\d\d\d\d?/
+    , gt = /\d{1,3}/
+    , pt = /\d{1,4}/
+    , wt = /[+-]?\d{1,6}/
+    , vt = /\d+/
+    , Mt = /[+-]?\d+/
+    , St = /Z|[+-]\d\d:?\d\d/gi
+    , Dt = /Z|[+-]\d\d(?::?\d\d)?/gi
+    , kt = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i
+    , Yt = {}
+    , Ot = {}
+    , Tt = 0
+    , xt = 1
+    , bt = 2
+    , Pt = 3
+    , Wt = 4
+    , Ht = 5
+    , Rt = 6
+    , Ct = 7
+    , Ft = 8;
+  P("Y", 0, 0, function() {
+    var e = this.year();
+    return e <= 9999 ? "" + e : "+" + e
+  }),
+    P(0, ["YY", 2], 0, function() {
+      return this.year() % 100
+    }),
+    P(0, ["YYYY", 4], 0, "year"),
+    P(0, ["YYYYY", 5], 0, "year"),
+    P(0, ["YYYYYY", 6, !0], 0, "year"),
+    Y("year", "y"),
+    x("year", 1),
+    C("Y", Mt),
+    C("YY", mt, dt),
+    C("YYYY", pt, ct),
+    C("YYYYY", wt, ft),
+    C("YYYYYY", wt, ft),
+    L(["YYYYY", "YYYYYY"], Tt),
+    L("YYYY", function(t, n) {
+      n[Tt] = 2 === t.length ? e.parseTwoDigitYear(t) : g(t)
+    }),
+    L("YY", function(t, n) {
+      n[Tt] = e.parseTwoDigitYear(t)
+    }),
+    L("Y", function(e, t) {
+      t[Tt] = parseInt(e, 10)
+    }),
+    e.parseTwoDigitYear = function(e) {
+      return g(e) + (g(e) > 68 ? 1900 : 2e3)
+    }
+  ;
+  var Ut, Lt = I("FullYear", !0);
+  Ut = Array.prototype.indexOf ? Array.prototype.indexOf : function(e) {
+    var t;
+    for (t = 0; t < this.length; ++t)
+      if (this[t] === e)
+        return t;
+    return -1
+  }
+    ,
+    P("M", ["MM", 2], "Mo", function() {
+      return this.month() + 1
+    }),
+    P("MMM", 0, 0, function(e) {
+      return this.localeData().monthsShort(this, e)
+    }),
+    P("MMMM", 0, 0, function(e) {
+      return this.localeData().months(this, e)
+    }),
+    Y("month", "M"),
+    x("month", 8),
+    C("M", mt),
+    C("MM", mt, dt),
+    C("MMM", function(e, t) {
+      return t.monthsShortRegex(e)
+    }),
+    C("MMMM", function(e, t) {
+      return t.monthsRegex(e)
+    }),
+    L(["M", "MM"], function(e, t) {
+      t[xt] = g(e) - 1
+    }),
+    L(["MMM", "MMMM"], function(e, t, n, s) {
+      var i = n._locale.monthsParse(e, s, n._strict);
+      null != i ? t[xt] = i : d(n).invalidMonth = e
+    });
+  var Nt = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/
+    , Gt = "January_February_March_April_May_June_July_August_September_October_November_December".split("_")
+    , Vt = "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_")
+    , Et = kt
+    , It = kt;
+  P("w", ["ww", 2], "wo", "week"),
+    P("W", ["WW", 2], "Wo", "isoWeek"),
+    Y("week", "w"),
+    Y("isoWeek", "W"),
+    x("week", 5),
+    x("isoWeek", 5),
+    C("w", mt),
+    C("ww", mt, dt),
+    C("W", mt),
+    C("WW", mt, dt),
+    N(["w", "ww", "W", "WW"], function(e, t, n, s) {
+      t[s.substr(0, 1)] = g(e)
+    });
+  P("d", 0, "do", "day"),
+    P("dd", 0, 0, function(e) {
+      return this.localeData().weekdaysMin(this, e)
+    }),
+    P("ddd", 0, 0, function(e) {
+      return this.localeData().weekdaysShort(this, e)
+    }),
+    P("dddd", 0, 0, function(e) {
+      return this.localeData().weekdays(this, e)
+    }),
+    P("e", 0, 0, "weekday"),
+    P("E", 0, 0, "isoWeekday"),
+    Y("day", "d"),
+    Y("weekday", "e"),
+    Y("isoWeekday", "E"),
+    x("day", 11),
+    x("weekday", 11),
+    x("isoWeekday", 11),
+    C("d", mt),
+    C("e", mt),
+    C("E", mt),
+    C("dd", function(e, t) {
+      return t.weekdaysMinRegex(e)
+    }),
+    C("ddd", function(e, t) {
+      return t.weekdaysShortRegex(e)
+    }),
+    C("dddd", function(e, t) {
+      return t.weekdaysRegex(e)
+    }),
+    N(["dd", "ddd", "dddd"], function(e, t, n, s) {
+      var i = n._locale.weekdaysParse(e, s, n._strict);
+      null != i ? t.d = i : d(n).invalidWeekday = e
+    }),
+    N(["d", "e", "E"], function(e, t, n, s) {
+      t[s] = g(e)
+    });
+  var At = "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_")
+    , jt = "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_")
+    , Zt = "Su_Mo_Tu_We_Th_Fr_Sa".split("_")
+    , zt = kt
+    , $t = kt
+    , qt = kt;
+  P("H", ["HH", 2], 0, "hour"),
+    P("h", ["hh", 2], 0, te),
+    P("k", ["kk", 2], 0, function() {
+      return this.hours() || 24
+    }),
+    P("hmm", 0, 0, function() {
+      return "" + te.apply(this) + b(this.minutes(), 2)
+    }),
+    P("hmmss", 0, 0, function() {
+      return "" + te.apply(this) + b(this.minutes(), 2) + b(this.seconds(), 2)
+    }),
+    P("Hmm", 0, 0, function() {
+      return "" + this.hours() + b(this.minutes(), 2)
+    }),
+    P("Hmmss", 0, 0, function() {
+      return "" + this.hours() + b(this.minutes(), 2) + b(this.seconds(), 2)
+    }),
+    ne("a", !0),
+    ne("A", !1),
+    Y("hour", "h"),
+    x("hour", 13),
+    C("a", se),
+    C("A", se),
+    C("H", mt),
+    C("h", mt),
+    C("k", mt),
+    C("HH", mt, dt),
+    C("hh", mt, dt),
+    C("kk", mt, dt),
+    C("hmm", _t),
+    C("hmmss", yt),
+    C("Hmm", _t),
+    C("Hmmss", yt),
+    L(["H", "HH"], Pt),
+    L(["k", "kk"], function(e, t, n) {
+      var s = g(e);
+      t[Pt] = 24 === s ? 0 : s
+    }),
+    L(["a", "A"], function(e, t, n) {
+      n._isPm = n._locale.isPM(e),
+        n._meridiem = e
+    }),
+    L(["h", "hh"], function(e, t, n) {
+      t[Pt] = g(e),
+        d(n).bigHour = !0
+    }),
+    L("hmm", function(e, t, n) {
+      var s = e.length - 2;
+      t[Pt] = g(e.substr(0, s)),
+        t[Wt] = g(e.substr(s)),
+        d(n).bigHour = !0
+    }),
+    L("hmmss", function(e, t, n) {
+      var s = e.length - 4
+        , i = e.length - 2;
+      t[Pt] = g(e.substr(0, s)),
+        t[Wt] = g(e.substr(s, 2)),
+        t[Ht] = g(e.substr(i)),
+        d(n).bigHour = !0
+    }),
+    L("Hmm", function(e, t, n) {
+      var s = e.length - 2;
+      t[Pt] = g(e.substr(0, s)),
+        t[Wt] = g(e.substr(s))
+    }),
+    L("Hmmss", function(e, t, n) {
+      var s = e.length - 4
+        , i = e.length - 2;
+      t[Pt] = g(e.substr(0, s)),
+        t[Wt] = g(e.substr(s, 2)),
+        t[Ht] = g(e.substr(i))
+    });
+  var Jt, Bt = I("Hours", !0), Qt = {
+    calendar: {
+      sameDay: "[Today at] LT",
+      nextDay: "[Tomorrow at] LT",
+      nextWeek: "dddd [at] LT",
+      lastDay: "[Yesterday at] LT",
+      lastWeek: "[Last] dddd [at] LT",
+      sameElse: "L"
+    },
+    longDateFormat: {
+      LTS: "h:mm:ss A",
+      LT: "h:mm A",
+      L: "MM/DD/YYYY",
+      LL: "MMMM D, YYYY",
+      LLL: "MMMM D, YYYY h:mm A",
+      LLLL: "dddd, MMMM D, YYYY h:mm A"
+    },
+    invalidDate: "Invalid date",
+    ordinal: "%d",
+    dayOfMonthOrdinalParse: /\d{1,2}/,
+    relativeTime: {
+      future: "in %s",
+      past: "%s ago",
+      s: "a few seconds",
+      ss: "%d seconds",
+      m: "a minute",
+      mm: "%d minutes",
+      h: "an hour",
+      hh: "%d hours",
+      d: "a day",
+      dd: "%d days",
+      M: "a month",
+      MM: "%d months",
+      y: "a year",
+      yy: "%d years"
+    },
+    months: Gt,
+    monthsShort: Vt,
+    week: {
+      dow: 0,
+      doy: 6
+    },
+    weekdays: At,
+    weekdaysMin: Zt,
+    weekdaysShort: jt,
+    meridiemParse: /[ap]\.?m?\.?/i
+  }, Xt = {}, Kt = {}, en = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, tn = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, nn = /Z|[+-]\d\d(?::?\d\d)?/, sn = [["YYYYYY-MM-DD", /[+-]\d{6}-\d\d-\d\d/], ["YYYY-MM-DD", /\d{4}-\d\d-\d\d/], ["GGGG-[W]WW-E", /\d{4}-W\d\d-\d/], ["GGGG-[W]WW", /\d{4}-W\d\d/, !1], ["YYYY-DDD", /\d{4}-\d{3}/], ["YYYY-MM", /\d{4}-\d\d/, !1], ["YYYYYYMMDD", /[+-]\d{10}/], ["YYYYMMDD", /\d{8}/], ["GGGG[W]WWE", /\d{4}W\d{3}/], ["GGGG[W]WW", /\d{4}W\d{2}/, !1], ["YYYYDDD", /\d{7}/]], rn = [["HH:mm:ss.SSSS", /\d\d:\d\d:\d\d\.\d+/], ["HH:mm:ss,SSSS", /\d\d:\d\d:\d\d,\d+/], ["HH:mm:ss", /\d\d:\d\d:\d\d/], ["HH:mm", /\d\d:\d\d/], ["HHmmss.SSSS", /\d\d\d\d\d\d\.\d+/], ["HHmmss,SSSS", /\d\d\d\d\d\d,\d+/], ["HHmmss", /\d\d\d\d\d\d/], ["HHmm", /\d\d\d\d/], ["HH", /\d\d/]], an = /^\/?Date\((\-?\d+)/i, on = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, un = {
+    UT: 0,
+    GMT: 0,
+    EDT: -240,
+    EST: -300,
+    CDT: -300,
+    CST: -360,
+    MDT: -360,
+    MST: -420,
+    PDT: -420,
+    PST: -480
+  };
+  e.createFromInputFallback = v("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.", function(e) {
+    e._d = new Date(e._i + (e._useUTC ? " UTC" : ""))
+  }),
+    e.ISO_8601 = function() {}
+    ,
+    e.RFC_2822 = function() {}
+  ;
+  var ln = v("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/", function() {
+    var e = pe.apply(null, arguments);
+    return this.isValid() && e.isValid() ? e < this ? this : e : c()
+  })
+    , dn = v("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/", function() {
+    var e = pe.apply(null, arguments);
+    return this.isValid() && e.isValid() ? e > this ? this : e : c()
+  })
+    , hn = ["year", "quarter", "month", "week", "day", "hour", "minute", "second", "millisecond"];
+  De("Z", ":"),
+    De("ZZ", ""),
+    C("Z", Dt),
+    C("ZZ", Dt),
+    L(["Z", "ZZ"], function(e, t, n) {
+      n._useUTC = !0,
+        n._tzm = ke(Dt, e)
+    });
+  var cn = /([\+\-]|\d\d)/gi;
+  e.updateOffset = function() {}
+  ;
+  var fn = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/
+    , mn = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
+  xe.fn = ve.prototype,
+    xe.invalid = function() {
+      return xe(NaN)
+    }
+  ;
+  var _n = We(1, "add")
+    , yn = We(-1, "subtract");
+  e.defaultFormat = "YYYY-MM-DDTHH:mm:ssZ",
+    e.defaultFormatUtc = "YYYY-MM-DDTHH:mm:ss[Z]";
+  var gn = v("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.", function(e) {
+    return void 0 === e ? this.localeData() : this.locale(e)
+  });
+  P(0, ["gg", 2], 0, function() {
+    return this.weekYear() % 100
+  }),
+    P(0, ["GG", 2], 0, function() {
+      return this.isoWeekYear() % 100
+    }),
+    Ue("gggg", "weekYear"),
+    Ue("ggggg", "weekYear"),
+    Ue("GGGG", "isoWeekYear"),
+    Ue("GGGGG", "isoWeekYear"),
+    Y("weekYear", "gg"),
+    Y("isoWeekYear", "GG"),
+    x("weekYear", 1),
+    x("isoWeekYear", 1),
+    C("G", Mt),
+    C("g", Mt),
+    C("GG", mt, dt),
+    C("gg", mt, dt),
+    C("GGGG", pt, ct),
+    C("gggg", pt, ct),
+    C("GGGGG", wt, ft),
+    C("ggggg", wt, ft),
+    N(["gggg", "ggggg", "GGGG", "GGGGG"], function(e, t, n, s) {
+      t[s.substr(0, 2)] = g(e)
+    }),
+    N(["gg", "GG"], function(t, n, s, i) {
+      n[i] = e.parseTwoDigitYear(t)
+    }),
+    P("Q", 0, "Qo", "quarter"),
+    Y("quarter", "Q"),
+    x("quarter", 7),
+    C("Q", lt),
+    L("Q", function(e, t) {
+      t[xt] = 3 * (g(e) - 1)
+    }),
+    P("D", ["DD", 2], "Do", "date"),
+    Y("date", "D"),
+    x("date", 9),
+    C("D", mt),
+    C("DD", mt, dt),
+    C("Do", function(e, t) {
+      return e ? t._dayOfMonthOrdinalParse || t._ordinalParse : t._dayOfMonthOrdinalParseLenient
+    }),
+    L(["D", "DD"], bt),
+    L("Do", function(e, t) {
+      t[bt] = g(e.match(mt)[0])
+    });
+  var pn = I("Date", !0);
+  P("DDD", ["DDDD", 3], "DDDo", "dayOfYear"),
+    Y("dayOfYear", "DDD"),
+    x("dayOfYear", 4),
+    C("DDD", gt),
+    C("DDDD", ht),
+    L(["DDD", "DDDD"], function(e, t, n) {
+      n._dayOfYear = g(e)
+    }),
+    P("m", ["mm", 2], 0, "minute"),
+    Y("minute", "m"),
+    x("minute", 14),
+    C("m", mt),
+    C("mm", mt, dt),
+    L(["m", "mm"], Wt);
+  var wn = I("Minutes", !1);
+  P("s", ["ss", 2], 0, "second"),
+    Y("second", "s"),
+    x("second", 15),
+    C("s", mt),
+    C("ss", mt, dt),
+    L(["s", "ss"], Ht);
+  var vn = I("Seconds", !1);
+  P("S", 0, 0, function() {
+    return ~~(this.millisecond() / 100)
+  }),
+    P(0, ["SS", 2], 0, function() {
+      return ~~(this.millisecond() / 10)
+    }),
+    P(0, ["SSS", 3], 0, "millisecond"),
+    P(0, ["SSSS", 4], 0, function() {
+      return 10 * this.millisecond()
+    }),
+    P(0, ["SSSSS", 5], 0, function() {
+      return 100 * this.millisecond()
+    }),
+    P(0, ["SSSSSS", 6], 0, function() {
+      return 1e3 * this.millisecond()
+    }),
+    P(0, ["SSSSSSS", 7], 0, function() {
+      return 1e4 * this.millisecond()
+    }),
+    P(0, ["SSSSSSSS", 8], 0, function() {
+      return 1e5 * this.millisecond()
+    }),
+    P(0, ["SSSSSSSSS", 9], 0, function() {
+      return 1e6 * this.millisecond()
+    }),
+    Y("millisecond", "ms"),
+    x("millisecond", 16),
+    C("S", gt, lt),
+    C("SS", gt, dt),
+    C("SSS", gt, ht);
+  var Mn;
+  for (Mn = "SSSS"; Mn.length <= 9; Mn += "S")
+    C(Mn, vt);
+  for (Mn = "S"; Mn.length <= 9; Mn += "S")
+    L(Mn, Ne);
+  var Sn = I("Milliseconds", !1);
+  P("z", 0, 0, "zoneAbbr"),
+    P("zz", 0, 0, "zoneName");
+  var Dn = m.prototype;
+  Dn.add = _n,
+    Dn.calendar = function(t, n) {
+      var s = t || pe()
+        , i = Ye(s, this).startOf("day")
+        , r = e.calendarFormat(this, i) || "sameElse"
+        , a = n && (S(n[r]) ? n[r].call(this, s) : n[r]);
+      return this.format(a || this.localeData().calendar(r, this, pe(s)))
+    }
+    ,
+    Dn.clone = function() {
+      return new m(this)
+    }
+    ,
+    Dn.diff = function(e, t, n) {
+      var s, i, r;
+      if (!this.isValid())
+        return NaN;
+      if (!(s = Ye(e, this)).isValid())
+        return NaN;
+      switch (i = 6e4 * (s.utcOffset() - this.utcOffset()),
+        t = O(t)) {
+        case "year":
+          r = Re(this, s) / 12;
+          break;
+        case "month":
+          r = Re(this, s);
+          break;
+        case "quarter":
+          r = Re(this, s) / 3;
+          break;
+        case "second":
+          r = (this - s) / 1e3;
+          break;
+        case "minute":
+          r = (this - s) / 6e4;
+          break;
+        case "hour":
+          r = (this - s) / 36e5;
+          break;
+        case "day":
+          r = (this - s - i) / 864e5;
+          break;
+        case "week":
+          r = (this - s - i) / 6048e5;
+          break;
+        default:
+          r = this - s
+      }
+      return n ? r : y(r)
+    }
+    ,
+    Dn.endOf = function(e) {
+      return void 0 === (e = O(e)) || "millisecond" === e ? this : ("date" === e && (e = "day"),
+        this.startOf(e).add(1, "isoWeek" === e ? "week" : e).subtract(1, "ms"))
+    }
+    ,
+    Dn.format = function(t) {
+      t || (t = this.isUtc() ? e.defaultFormatUtc : e.defaultFormat);
+      var n = H(this, t);
+      return this.localeData().postformat(n)
+    }
+    ,
+    Dn.from = function(e, t) {
+      return this.isValid() && (_(e) && e.isValid() || pe(e).isValid()) ? xe({
+        to: this,
+        from: e
+      }).locale(this.locale()).humanize(!t) : this.localeData().invalidDate()
+    }
+    ,
+    Dn.fromNow = function(e) {
+      return this.from(pe(), e)
+    }
+    ,
+    Dn.to = function(e, t) {
+      return this.isValid() && (_(e) && e.isValid() || pe(e).isValid()) ? xe({
+        from: this,
+        to: e
+      }).locale(this.locale()).humanize(!t) : this.localeData().invalidDate()
+    }
+    ,
+    Dn.toNow = function(e) {
+      return this.to(pe(), e)
+    }
+    ,
+    Dn.get = function(e) {
+      return e = O(e),
+        S(this[e]) ? this[e]() : this
+    }
+    ,
+    Dn.invalidAt = function() {
+      return d(this).overflow
+    }
+    ,
+    Dn.isAfter = function(e, t) {
+      var n = _(e) ? e : pe(e);
+      return !(!this.isValid() || !n.isValid()) && ("millisecond" === (t = O(s(t) ? "millisecond" : t)) ? this.valueOf() > n.valueOf() : n.valueOf() < this.clone().startOf(t).valueOf())
+    }
+    ,
+    Dn.isBefore = function(e, t) {
+      var n = _(e) ? e : pe(e);
+      return !(!this.isValid() || !n.isValid()) && ("millisecond" === (t = O(s(t) ? "millisecond" : t)) ? this.valueOf() < n.valueOf() : this.clone().endOf(t).valueOf() < n.valueOf())
+    }
+    ,
+    Dn.isBetween = function(e, t, n, s) {
+      return ("(" === (s = s || "()")[0] ? this.isAfter(e, n) : !this.isBefore(e, n)) && (")" === s[1] ? this.isBefore(t, n) : !this.isAfter(t, n))
+    }
+    ,
+    Dn.isSame = function(e, t) {
+      var n, s = _(e) ? e : pe(e);
+      return !(!this.isValid() || !s.isValid()) && ("millisecond" === (t = O(t || "millisecond")) ? this.valueOf() === s.valueOf() : (n = s.valueOf(),
+      this.clone().startOf(t).valueOf() <= n && n <= this.clone().endOf(t).valueOf()))
+    }
+    ,
+    Dn.isSameOrAfter = function(e, t) {
+      return this.isSame(e, t) || this.isAfter(e, t)
+    }
+    ,
+    Dn.isSameOrBefore = function(e, t) {
+      return this.isSame(e, t) || this.isBefore(e, t)
+    }
+    ,
+    Dn.isValid = function() {
+      return h(this)
+    }
+    ,
+    Dn.lang = gn,
+    Dn.locale = Ce,
+    Dn.localeData = Fe,
+    Dn.max = dn,
+    Dn.min = ln,
+    Dn.parsingFlags = function() {
+      return u({}, d(this))
+    }
+    ,
+    Dn.set = function(e, t) {
+      if ("object" == typeof e)
+        for (var n = function(e) {
+          var t = [];
+          for (var n in e)
+            t.push({
+              unit: n,
+              priority: it[n]
+            });
+          return t.sort(function(e, t) {
+            return e.priority - t.priority
+          }),
+            t
+        }(e = T(e)), s = 0; s < n.length; s++)
+          this[n[s].unit](e[n[s].unit]);
+      else if (e = O(e),
+        S(this[e]))
+        return this[e](t);
+      return this
+    }
+    ,
+    Dn.startOf = function(e) {
+      switch (e = O(e)) {
+        case "year":
+          this.month(0);
+        case "quarter":
+        case "month":
+          this.date(1);
+        case "week":
+        case "isoWeek":
+        case "day":
+        case "date":
+          this.hours(0);
+        case "hour":
+          this.minutes(0);
+        case "minute":
+          this.seconds(0);
+        case "second":
+          this.milliseconds(0)
+      }
+      return "week" === e && this.weekday(0),
+      "isoWeek" === e && this.isoWeekday(1),
+      "quarter" === e && this.month(3 * Math.floor(this.month() / 3)),
+        this
+    }
+    ,
+    Dn.subtract = yn,
+    Dn.toArray = function() {
+      return [this.year(), this.month(), this.date(), this.hour(), this.minute(), this.second(), this.millisecond()]
+    }
+    ,
+    Dn.toObject = function() {
+      return {
+        years: this.year(),
+        months: this.month(),
+        date: this.date(),
+        hours: this.hours(),
+        minutes: this.minutes(),
+        seconds: this.seconds(),
+        milliseconds: this.milliseconds()
+      }
+    }
+    ,
+    Dn.toDate = function() {
+      return new Date(this.valueOf())
+    }
+    ,
+    Dn.toISOString = function(e) {
+      if (!this.isValid())
+        return null;
+      var t = !0 !== e
+        , n = t ? this.clone().utc() : this;
+      return n.year() < 0 || n.year() > 9999 ? H(n, t ? "YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYYYY-MM-DD[T]HH:mm:ss.SSSZ") : S(Date.prototype.toISOString) ? t ? this.toDate().toISOString() : new Date(this._d.valueOf()).toISOString().replace("Z", H(n, "Z")) : H(n, t ? "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYY-MM-DD[T]HH:mm:ss.SSSZ")
+    }
+    ,
+    Dn.inspect = function() {
+      if (!this.isValid())
+        return "moment.invalid(/* " + this._i + " */)";
+      var e = "moment"
+        , t = "";
+      this.isLocal() || (e = 0 === this.utcOffset() ? "moment.utc" : "moment.parseZone",
+        t = "Z");
+      var n = "[" + e + '("]'
+        , s = 0 <= this.year() && this.year() <= 9999 ? "YYYY" : "YYYYYY"
+        , i = t + '[")]';
+      return this.format(n + s + "-MM-DD[T]HH:mm:ss.SSS" + i)
+    }
+    ,
+    Dn.toJSON = function() {
+      return this.isValid() ? this.toISOString() : null
+    }
+    ,
+    Dn.toString = function() {
+      return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")
+    }
+    ,
+    Dn.unix = function() {
+      return Math.floor(this.valueOf() / 1e3)
+    }
+    ,
+    Dn.valueOf = function() {
+      return this._d.valueOf() - 6e4 * (this._offset || 0)
+    }
+    ,
+    Dn.creationData = function() {
+      return {
+        input: this._i,
+        format: this._f,
+        locale: this._locale,
+        isUTC: this._isUTC,
+        strict: this._strict
+      }
+    }
+    ,
+    Dn.year = Lt,
+    Dn.isLeapYear = function() {
+      return E(this.year())
+    }
+    ,
+    Dn.weekYear = function(e) {
+      return Le.call(this, e, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy)
+    }
+    ,
+    Dn.isoWeekYear = function(e) {
+      return Le.call(this, e, this.isoWeek(), this.isoWeekday(), 1, 4)
+    }
+    ,
+    Dn.quarter = Dn.quarters = function(e) {
+      return null == e ? Math.ceil((this.month() + 1) / 3) : this.month(3 * (e - 1) + this.month() % 3)
+    }
+    ,
+    Dn.month = $,
+    Dn.daysInMonth = function() {
+      return Z(this.year(), this.month())
+    }
+    ,
+    Dn.week = Dn.weeks = function(e) {
+      var t = this.localeData().week(this);
+      return null == e ? t : this.add(7 * (e - t), "d")
+    }
+    ,
+    Dn.isoWeek = Dn.isoWeeks = function(e) {
+      var t = X(this, 1, 4).week;
+      return null == e ? t : this.add(7 * (e - t), "d")
+    }
+    ,
+    Dn.weeksInYear = function() {
+      var e = this.localeData()._week;
+      return K(this.year(), e.dow, e.doy)
+    }
+    ,
+    Dn.isoWeeksInYear = function() {
+      return K(this.year(), 1, 4)
+    }
+    ,
+    Dn.date = pn,
+    Dn.day = Dn.days = function(e) {
+      if (!this.isValid())
+        return null != e ? this : NaN;
+      var t = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+      return null != e ? (e = function(e, t) {
+        return "string" != typeof e ? e : isNaN(e) ? "number" == typeof (e = t.weekdaysParse(e)) ? e : null : parseInt(e, 10)
+      }(e, this.localeData()),
+        this.add(e - t, "d")) : t
+    }
+    ,
+    Dn.weekday = function(e) {
+      if (!this.isValid())
+        return null != e ? this : NaN;
+      var t = (this.day() + 7 - this.localeData()._week.dow) % 7;
+      return null == e ? t : this.add(e - t, "d")
+    }
+    ,
+    Dn.isoWeekday = function(e) {
+      if (!this.isValid())
+        return null != e ? this : NaN;
+      if (null != e) {
+        var t = function(e, t) {
+          return "string" == typeof e ? t.weekdaysParse(e) % 7 || 7 : isNaN(e) ? null : e
+        }(e, this.localeData());
+        return this.day(this.day() % 7 ? t : t - 7)
+      }
+      return this.day() || 7
+    }
+    ,
+    Dn.dayOfYear = function(e) {
+      var t = Math.round((this.clone().startOf("day") - this.clone().startOf("year")) / 864e5) + 1;
+      return null == e ? t : this.add(e - t, "d")
+    }
+    ,
+    Dn.hour = Dn.hours = Bt,
+    Dn.minute = Dn.minutes = wn,
+    Dn.second = Dn.seconds = vn,
+    Dn.millisecond = Dn.milliseconds = Sn,
+    Dn.utcOffset = function(t, n, s) {
+      var i, r = this._offset || 0;
+      if (!this.isValid())
+        return null != t ? this : NaN;
+      if (null != t) {
+        if ("string" == typeof t) {
+          if (null === (t = ke(Dt, t)))
+            return this
+        } else
+          Math.abs(t) < 16 && !s && (t *= 60);
+        return !this._isUTC && n && (i = Oe(this)),
+          this._offset = t,
+          this._isUTC = !0,
+        null != i && this.add(i, "m"),
+        r !== t && (!n || this._changeInProgress ? He(this, xe(t - r, "m"), 1, !1) : this._changeInProgress || (this._changeInProgress = !0,
+          e.updateOffset(this, !0),
+          this._changeInProgress = null)),
+          this
+      }
+      return this._isUTC ? r : Oe(this)
+    }
+    ,
+    Dn.utc = function(e) {
+      return this.utcOffset(0, e)
+    }
+    ,
+    Dn.local = function(e) {
+      return this._isUTC && (this.utcOffset(0, e),
+        this._isUTC = !1,
+      e && this.subtract(Oe(this), "m")),
+        this
+    }
+    ,
+    Dn.parseZone = function() {
+      if (null != this._tzm)
+        this.utcOffset(this._tzm, !1, !0);
+      else if ("string" == typeof this._i) {
+        var e = ke(St, this._i);
+        null != e ? this.utcOffset(e) : this.utcOffset(0, !0)
+      }
+      return this
+    }
+    ,
+    Dn.hasAlignedHourOffset = function(e) {
+      return !!this.isValid() && (e = e ? pe(e).utcOffset() : 0,
+      (this.utcOffset() - e) % 60 == 0)
+    }
+    ,
+    Dn.isDST = function() {
+      return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset()
+    }
+    ,
+    Dn.isLocal = function() {
+      return !!this.isValid() && !this._isUTC
+    }
+    ,
+    Dn.isUtcOffset = function() {
+      return !!this.isValid() && this._isUTC
+    }
+    ,
+    Dn.isUtc = Te,
+    Dn.isUTC = Te,
+    Dn.zoneAbbr = function() {
+      return this._isUTC ? "UTC" : ""
+    }
+    ,
+    Dn.zoneName = function() {
+      return this._isUTC ? "Coordinated Universal Time" : ""
+    }
+    ,
+    Dn.dates = v("dates accessor is deprecated. Use date instead.", pn),
+    Dn.months = v("months accessor is deprecated. Use month instead", $),
+    Dn.years = v("years accessor is deprecated. Use year instead", Lt),
+    Dn.zone = v("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/", function(e, t) {
+      return null != e ? ("string" != typeof e && (e = -e),
+        this.utcOffset(e, t),
+        this) : -this.utcOffset()
+    }),
+    Dn.isDSTShifted = v("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information", function() {
+      if (!s(this._isDSTShifted))
+        return this._isDSTShifted;
+      var e = {};
+      if (f(e, this),
+        (e = ye(e))._a) {
+        var t = e._isUTC ? l(e._a) : pe(e._a);
+        this._isDSTShifted = this.isValid() && p(e._a, t.toArray()) > 0
+      } else
+        this._isDSTShifted = !1;
+      return this._isDSTShifted
+    });
+  var kn = k.prototype;
+  kn.calendar = function(e, t, n) {
+    var s = this._calendar[e] || this._calendar.sameElse;
+    return S(s) ? s.call(t, n) : s
+  }
+    ,
+    kn.longDateFormat = function(e) {
+      var t = this._longDateFormat[e]
+        , n = this._longDateFormat[e.toUpperCase()];
+      return t || !n ? t : (this._longDateFormat[e] = n.replace(/MMMM|MM|DD|dddd/g, function(e) {
+        return e.slice(1)
+      }),
+        this._longDateFormat[e])
+    }
+    ,
+    kn.invalidDate = function() {
+      return this._invalidDate
+    }
+    ,
+    kn.ordinal = function(e) {
+      return this._ordinal.replace("%d", e)
+    }
+    ,
+    kn.preparse = Ge,
+    kn.postformat = Ge,
+    kn.relativeTime = function(e, t, n, s) {
+      var i = this._relativeTime[n];
+      return S(i) ? i(e, t, n, s) : i.replace(/%d/i, e)
+    }
+    ,
+    kn.pastFuture = function(e, t) {
+      var n = this._relativeTime[e > 0 ? "future" : "past"];
+      return S(n) ? n(t) : n.replace(/%s/i, t)
+    }
+    ,
+    kn.set = function(e) {
+      var t, n;
+      for (n in e)
+        S(t = e[n]) ? this[n] = t : this["_" + n] = t;
+      this._config = e,
+        this._dayOfMonthOrdinalParseLenient = new RegExp((this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + "|" + /\d{1,2}/.source)
+    }
+    ,
+    kn.months = function(e, n) {
+      return e ? t(this._months) ? this._months[e.month()] : this._months[(this._months.isFormat || Nt).test(n) ? "format" : "standalone"][e.month()] : t(this._months) ? this._months : this._months.standalone
+    }
+    ,
+    kn.monthsShort = function(e, n) {
+      return e ? t(this._monthsShort) ? this._monthsShort[e.month()] : this._monthsShort[Nt.test(n) ? "format" : "standalone"][e.month()] : t(this._monthsShort) ? this._monthsShort : this._monthsShort.standalone
+    }
+    ,
+    kn.monthsParse = function(e, t, n) {
+      var s, i, r;
+      if (this._monthsParseExact)
+        return function(e, t, n) {
+          var s, i, r, a = e.toLocaleLowerCase();
+          if (!this._monthsParse)
+            for (this._monthsParse = [],
+                   this._longMonthsParse = [],
+                   this._shortMonthsParse = [],
+                   s = 0; s < 12; ++s)
+              r = l([2e3, s]),
+                this._shortMonthsParse[s] = this.monthsShort(r, "").toLocaleLowerCase(),
+                this._longMonthsParse[s] = this.months(r, "").toLocaleLowerCase();
+          return n ? "MMM" === t ? -1 !== (i = Ut.call(this._shortMonthsParse, a)) ? i : null : -1 !== (i = Ut.call(this._longMonthsParse, a)) ? i : null : "MMM" === t ? -1 !== (i = Ut.call(this._shortMonthsParse, a)) ? i : -1 !== (i = Ut.call(this._longMonthsParse, a)) ? i : null : -1 !== (i = Ut.call(this._longMonthsParse, a)) ? i : -1 !== (i = Ut.call(this._shortMonthsParse, a)) ? i : null
+        }
+          .call(this, e, t, n);
+      for (this._monthsParse || (this._monthsParse = [],
+        this._longMonthsParse = [],
+        this._shortMonthsParse = []),
+             s = 0; s < 12; s++) {
+        if (i = l([2e3, s]),
+        n && !this._longMonthsParse[s] && (this._longMonthsParse[s] = new RegExp("^" + this.months(i, "").replace(".", "") + "$","i"),
+          this._shortMonthsParse[s] = new RegExp("^" + this.monthsShort(i, "").replace(".", "") + "$","i")),
+        n || this._monthsParse[s] || (r = "^" + this.months(i, "") + "|^" + this.monthsShort(i, ""),
+          this._monthsParse[s] = new RegExp(r.replace(".", ""),"i")),
+        n && "MMMM" === t && this._longMonthsParse[s].test(e))
+          return s;
+        if (n && "MMM" === t && this._shortMonthsParse[s].test(e))
+          return s;
+        if (!n && this._monthsParse[s].test(e))
+          return s
+      }
+    }
+    ,
+    kn.monthsRegex = function(e) {
+      return this._monthsParseExact ? (o(this, "_monthsRegex") || q.call(this),
+        e ? this._monthsStrictRegex : this._monthsRegex) : (o(this, "_monthsRegex") || (this._monthsRegex = It),
+        this._monthsStrictRegex && e ? this._monthsStrictRegex : this._monthsRegex)
+    }
+    ,
+    kn.monthsShortRegex = function(e) {
+      return this._monthsParseExact ? (o(this, "_monthsRegex") || q.call(this),
+        e ? this._monthsShortStrictRegex : this._monthsShortRegex) : (o(this, "_monthsShortRegex") || (this._monthsShortRegex = Et),
+        this._monthsShortStrictRegex && e ? this._monthsShortStrictRegex : this._monthsShortRegex)
+    }
+    ,
+    kn.week = function(e) {
+      return X(e, this._week.dow, this._week.doy).week
+    }
+    ,
+    kn.firstDayOfYear = function() {
+      return this._week.doy
+    }
+    ,
+    kn.firstDayOfWeek = function() {
+      return this._week.dow
+    }
+    ,
+    kn.weekdays = function(e, n) {
+      return e ? t(this._weekdays) ? this._weekdays[e.day()] : this._weekdays[this._weekdays.isFormat.test(n) ? "format" : "standalone"][e.day()] : t(this._weekdays) ? this._weekdays : this._weekdays.standalone
+    }
+    ,
+    kn.weekdaysMin = function(e) {
+      return e ? this._weekdaysMin[e.day()] : this._weekdaysMin
+    }
+    ,
+    kn.weekdaysShort = function(e) {
+      return e ? this._weekdaysShort[e.day()] : this._weekdaysShort
+    }
+    ,
+    kn.weekdaysParse = function(e, t, n) {
+      var s, i, r;
+      if (this._weekdaysParseExact)
+        return function(e, t, n) {
+          var s, i, r, a = e.toLocaleLowerCase();
+          if (!this._weekdaysParse)
+            for (this._weekdaysParse = [],
+                   this._shortWeekdaysParse = [],
+                   this._minWeekdaysParse = [],
+                   s = 0; s < 7; ++s)
+              r = l([2e3, 1]).day(s),
+                this._minWeekdaysParse[s] = this.weekdaysMin(r, "").toLocaleLowerCase(),
+                this._shortWeekdaysParse[s] = this.weekdaysShort(r, "").toLocaleLowerCase(),
+                this._weekdaysParse[s] = this.weekdays(r, "").toLocaleLowerCase();
+          return n ? "dddd" === t ? -1 !== (i = Ut.call(this._weekdaysParse, a)) ? i : null : "ddd" === t ? -1 !== (i = Ut.call(this._shortWeekdaysParse, a)) ? i : null : -1 !== (i = Ut.call(this._minWeekdaysParse, a)) ? i : null : "dddd" === t ? -1 !== (i = Ut.call(this._weekdaysParse, a)) ? i : -1 !== (i = Ut.call(this._shortWeekdaysParse, a)) ? i : -1 !== (i = Ut.call(this._minWeekdaysParse, a)) ? i : null : "ddd" === t ? -1 !== (i = Ut.call(this._shortWeekdaysParse, a)) ? i : -1 !== (i = Ut.call(this._weekdaysParse, a)) ? i : -1 !== (i = Ut.call(this._minWeekdaysParse, a)) ? i : null : -1 !== (i = Ut.call(this._minWeekdaysParse, a)) ? i : -1 !== (i = Ut.call(this._weekdaysParse, a)) ? i : -1 !== (i = Ut.call(this._shortWeekdaysParse, a)) ? i : null
+        }
+          .call(this, e, t, n);
+      for (this._weekdaysParse || (this._weekdaysParse = [],
+        this._minWeekdaysParse = [],
+        this._shortWeekdaysParse = [],
+        this._fullWeekdaysParse = []),
+             s = 0; s < 7; s++) {
+        if (i = l([2e3, 1]).day(s),
+        n && !this._fullWeekdaysParse[s] && (this._fullWeekdaysParse[s] = new RegExp("^" + this.weekdays(i, "").replace(".", ".?") + "$","i"),
+          this._shortWeekdaysParse[s] = new RegExp("^" + this.weekdaysShort(i, "").replace(".", ".?") + "$","i"),
+          this._minWeekdaysParse[s] = new RegExp("^" + this.weekdaysMin(i, "").replace(".", ".?") + "$","i")),
+        this._weekdaysParse[s] || (r = "^" + this.weekdays(i, "") + "|^" + this.weekdaysShort(i, "") + "|^" + this.weekdaysMin(i, ""),
+          this._weekdaysParse[s] = new RegExp(r.replace(".", ""),"i")),
+        n && "dddd" === t && this._fullWeekdaysParse[s].test(e))
+          return s;
+        if (n && "ddd" === t && this._shortWeekdaysParse[s].test(e))
+          return s;
+        if (n && "dd" === t && this._minWeekdaysParse[s].test(e))
+          return s;
+        if (!n && this._weekdaysParse[s].test(e))
+          return s
+      }
+    }
+    ,
+    kn.weekdaysRegex = function(e) {
+      return this._weekdaysParseExact ? (o(this, "_weekdaysRegex") || ee.call(this),
+        e ? this._weekdaysStrictRegex : this._weekdaysRegex) : (o(this, "_weekdaysRegex") || (this._weekdaysRegex = zt),
+        this._weekdaysStrictRegex && e ? this._weekdaysStrictRegex : this._weekdaysRegex)
+    }
+    ,
+    kn.weekdaysShortRegex = function(e) {
+      return this._weekdaysParseExact ? (o(this, "_weekdaysRegex") || ee.call(this),
+        e ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex) : (o(this, "_weekdaysShortRegex") || (this._weekdaysShortRegex = $t),
+        this._weekdaysShortStrictRegex && e ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex)
+    }
+    ,
+    kn.weekdaysMinRegex = function(e) {
+      return this._weekdaysParseExact ? (o(this, "_weekdaysRegex") || ee.call(this),
+        e ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex) : (o(this, "_weekdaysMinRegex") || (this._weekdaysMinRegex = qt),
+        this._weekdaysMinStrictRegex && e ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex)
+    }
+    ,
+    kn.isPM = function(e) {
+      return "p" === (e + "").toLowerCase().charAt(0)
+    }
+    ,
+    kn.meridiem = function(e, t, n) {
+      return e > 11 ? n ? "pm" : "PM" : n ? "am" : "AM"
+    }
+    ,
+    ae("en", {
+      dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
+      ordinal: function(e) {
+        var t = e % 10;
+        return e + (1 === g(e % 100 / 10) ? "th" : 1 === t ? "st" : 2 === t ? "nd" : 3 === t ? "rd" : "th")
+      }
+    }),
+    e.lang = v("moment.lang is deprecated. Use moment.locale instead.", ae),
+    e.langData = v("moment.langData is deprecated. Use moment.localeData instead.", ue);
+  var Yn = Math.abs
+    , On = $e("ms")
+    , Tn = $e("s")
+    , xn = $e("m")
+    , bn = $e("h")
+    , Pn = $e("d")
+    , Wn = $e("w")
+    , Hn = $e("M")
+    , Rn = $e("y")
+    , Cn = qe("milliseconds")
+    , Fn = qe("seconds")
+    , Un = qe("minutes")
+    , Ln = qe("hours")
+    , Nn = qe("days")
+    , Gn = qe("months")
+    , Vn = qe("years")
+    , En = Math.round
+    , In = {
+    ss: 44,
+    s: 45,
+    m: 45,
+    h: 22,
+    d: 26,
+    M: 11
+  }
+    , An = Math.abs
+    , jn = ve.prototype;
+  return jn.isValid = function() {
+    return this._isValid
+  }
+    ,
+    jn.abs = function() {
+      var e = this._data;
+      return this._milliseconds = Yn(this._milliseconds),
+        this._days = Yn(this._days),
+        this._months = Yn(this._months),
+        e.milliseconds = Yn(e.milliseconds),
+        e.seconds = Yn(e.seconds),
+        e.minutes = Yn(e.minutes),
+        e.hours = Yn(e.hours),
+        e.months = Yn(e.months),
+        e.years = Yn(e.years),
+        this
+    }
+    ,
+    jn.add = function(e, t) {
+      return Ae(this, e, t, 1)
+    }
+    ,
+    jn.subtract = function(e, t) {
+      return Ae(this, e, t, -1)
+    }
+    ,
+    jn.as = function(e) {
+      if (!this.isValid())
+        return NaN;
+      var t, n, s = this._milliseconds;
+      if ("month" === (e = O(e)) || "year" === e)
+        return t = this._days + s / 864e5,
+          n = this._months + Ze(t),
+          "month" === e ? n : n / 12;
+      switch (t = this._days + Math.round(ze(this._months)),
+        e) {
+        case "week":
+          return t / 7 + s / 6048e5;
+        case "day":
+          return t + s / 864e5;
+        case "hour":
+          return 24 * t + s / 36e5;
+        case "minute":
+          return 1440 * t + s / 6e4;
+        case "second":
+          return 86400 * t + s / 1e3;
+        case "millisecond":
+          return Math.floor(864e5 * t) + s;
+        default:
+          throw new Error("Unknown unit " + e)
+      }
+    }
+    ,
+    jn.asMilliseconds = On,
+    jn.asSeconds = Tn,
+    jn.asMinutes = xn,
+    jn.asHours = bn,
+    jn.asDays = Pn,
+    jn.asWeeks = Wn,
+    jn.asMonths = Hn,
+    jn.asYears = Rn,
+    jn.valueOf = function() {
+      return this.isValid() ? this._milliseconds + 864e5 * this._days + this._months % 12 * 2592e6 + 31536e6 * g(this._months / 12) : NaN
+    }
+    ,
+    jn._bubble = function() {
+      var e, t, n, s, i, r = this._milliseconds, a = this._days, o = this._months, u = this._data;
+      return r >= 0 && a >= 0 && o >= 0 || r <= 0 && a <= 0 && o <= 0 || (r += 864e5 * je(ze(o) + a),
+        a = 0,
+        o = 0),
+        u.milliseconds = r % 1e3,
+        e = y(r / 1e3),
+        u.seconds = e % 60,
+        t = y(e / 60),
+        u.minutes = t % 60,
+        n = y(t / 60),
+        u.hours = n % 24,
+        a += y(n / 24),
+        i = y(Ze(a)),
+        o += i,
+        a -= je(ze(i)),
+        s = y(o / 12),
+        o %= 12,
+        u.days = a,
+        u.months = o,
+        u.years = s,
+        this
+    }
+    ,
+    jn.clone = function() {
+      return xe(this)
+    }
+    ,
+    jn.get = function(e) {
+      return e = O(e),
+        this.isValid() ? this[e + "s"]() : NaN
+    }
+    ,
+    jn.milliseconds = Cn,
+    jn.seconds = Fn,
+    jn.minutes = Un,
+    jn.hours = Ln,
+    jn.days = Nn,
+    jn.weeks = function() {
+      return y(this.days() / 7)
+    }
+    ,
+    jn.months = Gn,
+    jn.years = Vn,
+    jn.humanize = function(e) {
+      if (!this.isValid())
+        return this.localeData().invalidDate();
+      var t = this.localeData()
+        , n = function(e, t, n) {
+        var s = xe(e).abs()
+          , i = En(s.as("s"))
+          , r = En(s.as("m"))
+          , a = En(s.as("h"))
+          , o = En(s.as("d"))
+          , u = En(s.as("M"))
+          , l = En(s.as("y"))
+          , d = i <= In.ss && ["s", i] || i < In.s && ["ss", i] || r <= 1 && ["m"] || r < In.m && ["mm", r] || a <= 1 && ["h"] || a < In.h && ["hh", a] || o <= 1 && ["d"] || o < In.d && ["dd", o] || u <= 1 && ["M"] || u < In.M && ["MM", u] || l <= 1 && ["y"] || ["yy", l];
+        return d[2] = t,
+          d[3] = +e > 0,
+          d[4] = n,
+          function(e, t, n, s, i) {
+            return i.relativeTime(t || 1, !!n, e, s)
+          }
+            .apply(null, d)
+      }(this, !e, t);
+      return e && (n = t.pastFuture(+this, n)),
+        t.postformat(n)
+    }
+    ,
+    jn.toISOString = Be,
+    jn.toString = Be,
+    jn.toJSON = Be,
+    jn.locale = Ce,
+    jn.localeData = Fe,
+    jn.toIsoString = v("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)", Be),
+    jn.lang = gn,
+    P("X", 0, 0, "unix"),
+    P("x", 0, 0, "valueOf"),
+    C("x", Mt),
+    C("X", /[+-]?\d+(\.\d{1,3})?/),
+    L("X", function(e, t, n) {
+      n._d = new Date(1e3 * parseFloat(e, 10))
+    }),
+    L("x", function(e, t, n) {
+      n._d = new Date(g(e))
+    }),
+    e.version = "2.20.1",
+    function(e) {
+      Qe = e
+    }(pe),
+    e.fn = Dn,
+    e.min = function() {
+      return we("isBefore", [].slice.call(arguments, 0))
+    }
+    ,
+    e.max = function() {
+      return we("isAfter", [].slice.call(arguments, 0))
+    }
+    ,
+    e.now = function() {
+      return Date.now ? Date.now() : +new Date
+    }
+    ,
+    e.utc = l,
+    e.unix = function(e) {
+      return pe(1e3 * e)
+    }
+    ,
+    e.months = function(e, t) {
+      return Ee(e, t, "months")
+    }
+    ,
+    e.isDate = r,
+    e.locale = ae,
+    e.invalid = c,
+    e.duration = xe,
+    e.isMoment = _,
+    e.weekdays = function(e, t, n) {
+      return Ie(e, t, n, "weekdays")
+    }
+    ,
+    e.parseZone = function() {
+      return pe.apply(null, arguments).parseZone()
+    }
+    ,
+    e.localeData = ue,
+    e.isDuration = Me,
+    e.monthsShort = function(e, t) {
+      return Ee(e, t, "monthsShort")
+    }
+    ,
+    e.weekdaysMin = function(e, t, n) {
+      return Ie(e, t, n, "weekdaysMin")
+    }
+    ,
+    e.defineLocale = oe,
+    e.updateLocale = function(e, t) {
+      if (null != t) {
+        var n, s, i = Qt;
+        null != (s = re(e)) && (i = s._config),
+          (n = new k(t = D(i, t))).parentLocale = Xt[e],
+          Xt[e] = n,
+          ae(e)
+      } else
+        null != Xt[e] && (null != Xt[e].parentLocale ? Xt[e] = Xt[e].parentLocale : null != Xt[e] && delete Xt[e]);
+      return Xt[e]
+    }
+    ,
+    e.locales = function() {
+      return nt(Xt)
+    }
+    ,
+    e.weekdaysShort = function(e, t, n) {
+      return Ie(e, t, n, "weekdaysShort")
+    }
+    ,
+    e.normalizeUnits = O,
+    e.relativeTimeRounding = function(e) {
+      return void 0 === e ? En : "function" == typeof e && (En = e,
+        !0)
+    }
+    ,
+    e.relativeTimeThreshold = function(e, t) {
+      return void 0 !== In[e] && (void 0 === t ? In[e] : (In[e] = t,
+      "s" === e && (In.ss = t - 1),
+        !0))
+    }
+    ,
+    e.calendarFormat = function(e, t) {
+      var n = e.diff(t, "days", !0);
+      return n < -6 ? "sameElse" : n < -1 ? "lastWeek" : n < 0 ? "lastDay" : n < 1 ? "sameDay" : n < 2 ? "nextDay" : n < 7 ? "nextWeek" : "sameElse"
+    }
+    ,
+    e.prototype = Dn,
+    e.HTML5_FMT = {
+      DATETIME_LOCAL: "YYYY-MM-DDTHH:mm",
+      DATETIME_LOCAL_SECONDS: "YYYY-MM-DDTHH:mm:ss",
+      DATETIME_LOCAL_MS: "YYYY-MM-DDTHH:mm:ss.SSS",
+      DATE: "YYYY-MM-DD",
+      TIME: "HH:mm",
+      TIME_SECONDS: "HH:mm:ss",
+      TIME_MS: "HH:mm:ss.SSS",
+      WEEK: "YYYY-[W]WW",
+      MONTH: "YYYY-MM"
+    },
+    e
+});

+ 117 - 0
public/tui-calendar/js/theme/dooray.js

@@ -0,0 +1,117 @@
+'use strict';
+
+var THEME_DOORAY = {
+    'common.border': '1px solid #ddd',
+    'common.backgroundColor': 'white',
+    'common.holiday.color': '#f54f3d',
+    'common.saturday.color': '#333',
+    'common.dayname.color': '#333',
+    'common.today.color': '#135de6',
+
+    // creation guide style
+    'common.creationGuide.backgroundColor': 'rgba(19, 93, 230, 0.1)',
+    'common.creationGuide.border': '1px solid #135de6',
+
+    // month header 'dayname'
+    'month.dayname.height': '42px',
+    'month.dayname.borderLeft': 'none',
+    'month.dayname.paddingLeft': '8px',
+    'month.dayname.paddingRight': '0',
+    'month.dayname.fontSize': '13px',
+    'month.dayname.backgroundColor': 'inherit',
+    'month.dayname.fontWeight': 'normal',
+    'month.dayname.textAlign': 'left',
+
+    // month day grid cell 'day'
+    'month.holidayExceptThisMonth.color': '#f3acac',
+    'month.dayExceptThisMonth.color': '#bbb',
+    'month.weekend.backgroundColor': '#fafafa',
+    'month.day.fontSize': '16px',
+
+    // month schedule style
+    'month.schedule.height': '18px',
+    'month.schedule.marginTop': '2px',
+    'month.schedule.marginLeft': '10px',
+    'month.schedule.marginRight': '10px',
+
+    // month more view
+    'month.moreView.boxShadow': 'none',
+    'month.moreView.paddingBottom': '0',
+    'month.moreViewTitle.height': '28px',
+    'month.moreViewTitle.marginBottom': '0',
+    'month.moreViewTitle.backgroundColor': '#f4f4f4',
+    'month.moreViewTitle.borderBottom': '1px solid #ddd',
+    'month.moreViewTitle.padding': '0 10px',
+    'month.moreViewList.padding': '10px',
+
+    // week header 'dayname'
+    'week.dayname.height': '41px',
+    'week.dayname.borderTop': '1px solid #ddd',
+    'week.dayname.borderBottom': '1px solid #ddd',
+    'week.dayname.borderLeft': '1px solid #ddd',
+    'week.dayname.paddingLeft': '5px',
+    'week.dayname.backgroundColor': 'inherit',
+    'week.dayname.textAlign': 'left',
+    'week.today.color': '#135de6',
+    'week.pastDay.color': '#999',
+
+    // week vertical panel 'vpanel'
+    'week.vpanelSplitter.border': '1px solid #ddd',
+    'week.vpanelSplitter.height': '3px',
+
+    // week daygrid 'daygrid'
+    'week.daygrid.borderRight': '1px solid #ddd',
+
+    'week.daygridLeft.width': '77px',
+    'week.daygridLeft.backgroundColor': '',
+    'week.daygridLeft.paddingRight': '5px',
+    'week.daygridLeft.borderRight': '1px solid #ddd',
+
+    'week.today.backgroundColor': 'inherit',
+    'week.weekend.backgroundColor': 'inherit',
+
+    // week timegrid 'timegrid'
+    'week.timegridLeft.width': '77px',
+    'week.timegridLeft.backgroundColor': '#fafafa',
+    'week.timegridLeft.borderRight': '1px solid #ddd',
+    'week.timegridLeft.fontSize': '12px',
+    'week.timegridLeftTimezoneLabel.height': '51px',
+    'week.timegridLeftAdditionalTimezone.backgroundColor': '#fdfdfd',
+
+    'week.timegridOneHour.height': '48px',
+    'week.timegridHalfHour.height': '24px',
+    'week.timegridHalfHour.borderBottom': '1px dotted #f9f9f9',
+    'week.timegridHorizontalLine.borderBottom': '1px solid #eee',
+
+    'week.timegrid.paddingRight': '10px',
+    'week.timegrid.borderRight': '1px solid #ddd',
+    'week.timegridSchedule.borderRadius': '0',
+    'week.timegridSchedule.paddingLeft': '0',
+
+    'week.currentTime.color': '#135de6',
+    'week.currentTime.fontSize': '12px',
+    'week.currentTime.fontWeight': 'bold',
+
+    'week.pastTime.color': '#999',
+    'week.pastTime.fontWeight': 'normal',
+
+    'week.futureTime.color': '#333',
+    'week.futureTime.fontWeight': 'normal',
+
+    'week.currentTimeLinePast.border': '1px solid rgba(19, 93, 230, 0.3)',
+    'week.currentTimeLineBullet.backgroundColor': '#135de6',
+    'week.currentTimeLineToday.border': '1px solid #135de6',
+    'week.currentTimeLineFuture.border': '1px solid #135de6',
+
+    // week creation guide style
+    'week.creationGuide.color': '#135de6',
+    'week.creationGuide.fontSize': '12px',
+    'week.creationGuide.fontWeight': 'bold',
+
+    // week daygrid schedule style
+    'week.dayGridSchedule.borderRadius': '0',
+    'week.dayGridSchedule.height': '18px',
+    'week.dayGridSchedule.marginTop': '2px',
+    'week.dayGridSchedule.marginLeft': '10px',
+    'week.dayGridSchedule.marginRight': '10px'
+};

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 6 - 0
public/tui-calendar/js/tui-calendar.min.js


+ 32 - 0
src/api/check/checkjob.js

@@ -81,6 +81,38 @@ export function queryCheckJob (parameter) {
   })
 }
 
+/**
+ * query list func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function queryTuiCalendar (parameter) {
+  return axios({
+    url: '/check/jobs/tuiCalendar?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+/**
+ * query list func
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function queryTuiCalendarIgnores (parameter) {
+  return axios({
+    url: '/ignores/check/jobs/tuiCalendar?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
 /**
  * query list func
  * parameter: { }

+ 77 - 0
src/components/G2/G2Chart.vue

@@ -0,0 +1,77 @@
+<template>
+  <div style="padding: 10px">
+    <div id="container"></div>
+  </div>
+</template>
+
+<script>
+import { Chart } from '@antv/g2'
+export default {
+  name: 'G2Chart',
+  data () {
+    return {
+    }
+  },
+  mounted: function () {
+    this.drawChart() // 第一步想到的是创建的时候更新图表,但是这个不适用于异步请求接口获取相关数据,所以采用下面的监听的方式
+  },
+  beforeUpdate: function () {
+    //      this.drawChart();
+  },
+  watch: {
+  },
+  methods: {
+    drawChart: function (datas) {
+      const data = [
+        { name: 'London', 月份: 'Jan.', 月均降雨量: 18.9 },
+        { name: 'London', 月份: 'Feb.', 月均降雨量: 28.8 },
+        { name: 'London', 月份: 'Mar.', 月均降雨量: 39.3 },
+        { name: 'London', 月份: 'Apr.', 月均降雨量: 81.4 },
+        { name: 'London', 月份: 'May', 月均降雨量: 47 },
+        { name: 'London', 月份: 'Jun.', 月均降雨量: 20.3 },
+        { name: 'London', 月份: 'Jul.', 月均降雨量: 24 },
+        { name: 'London', 月份: 'Aug.', 月均降雨量: 35.6 },
+        { name: 'Berlin', 月份: 'Jan.', 月均降雨量: 12.4 },
+        { name: 'Berlin', 月份: 'Feb.', 月均降雨量: 23.2 },
+        { name: 'Berlin', 月份: 'Mar.', 月均降雨量: 34.5 },
+        { name: 'Berlin', 月份: 'Apr.', 月均降雨量: 99.7 },
+        { name: 'Berlin', 月份: 'May', 月均降雨量: 52.6 },
+        { name: 'Berlin', 月份: 'Jun.', 月均降雨量: 35.5 },
+        { name: 'Berlin', 月份: 'Jul.', 月均降雨量: 37.4 },
+        { name: 'Berlin', 月份: 'Aug.', 月均降雨量: 42.4 }
+      ]
+
+      const chart = new Chart({
+        container: 'container',
+        autoFit: true,
+        height: 400
+      })
+
+      chart.data(data)
+      chart.scale('月均降雨量', {
+        nice: true
+      })
+      chart.tooltip({
+        showMarkers: false,
+        shared: true
+      })
+      chart
+        .interval()
+        .position('月份*月均降雨量')
+        .color('name')
+        .adjust([
+          {
+            type: 'dodge',
+            marginRatio: 0
+          }
+        ])
+      chart.interaction('active-region')
+      chart.render()
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 2 - 1
src/components/index.js

@@ -28,8 +28,9 @@ import TagSelect from '@/components/TagSelect'
 import ExceptionPage from '@/components/Exception'
 import StandardFormRow from '@/components/StandardFormRow'
 import ArticleListContent from '@/components/ArticleListContent'
-
+import G2Chart from '@/components/G2/G2Chart'
 export {
+  G2Chart,
   AvatarList,
   Bar,
   ChartCard,

+ 4 - 4
src/components/tools/UserMenu.vue

@@ -76,10 +76,10 @@ export default {
   },
   methods: {
     ...mapActions(['Logout']),
-    changeLangEvent(type){
-        localStorage.setItem('locale',type)
-        this.$i18n.locale = type
-        this.$router.go(0)
+    changeLangEvent (type) {
+      localStorage.setItem('locale', type)
+      this.$i18n.locale = type
+      this.$router.go(0)
     },
     handleLogout () {
       this.$confirm({

+ 5 - 2
src/router/generator-platform-routers.js

@@ -283,7 +283,7 @@ const constantRouterComponents = {
   'FillProjectQuantity': () => import('@/views/fill/project-quantity/FillProjectQuantity'),
   'SbCheckDetail': () => import('@/views/sb/sbcheckdetail/SbCheckDetail'),
   'Article': () => import('@/views/operate/article/Article'),
-  'AnalysisSbInfo': () => import('@/views/dashboard/Analysis'),
+
   // 备件盘点
   'StoreCheckPlan': () => import('@/views/store/storecheckplan/StoreCheckPlan'),
   'StoreCheckJob': () => import('@/views/store/storecheckjob/StoreCheckJob'),
@@ -310,7 +310,10 @@ const constantRouterComponents = {
   'OutStoreFormDZ': () => import('@/views/dz/OutStoreFormDZ'), // 出库登记单
   'TransferStoreFormDZ': () => import('@/views/dz/TransferStoreFormDZ'), // 调拨登记单
   'SparePickFormDZ': () => import('@/views/dz/SparePickFormDZ'), // 领用登记单
-  'SpareBackFormDZ': () => import('@/views/dz/SpareBackFormDZ') // 退库登记单
+  'SpareBackFormDZ': () => import('@/views/dz/SpareBackFormDZ'), // 退库登记单
+
+  // 报表
+  'CheckJobReport': () => import('@/views/dashboard/CheckJobReport')// 保养任务完成率报表
 }
 
 // 前端未找到页面路由(固定不用改)

+ 13 - 1
src/utils/dict.js

@@ -134,6 +134,7 @@ DictCache.TYPE = {
   CHECK_USER_TYPE: 'CHECK_USER_TYPE', // 负责人选择方式
   CHECK_PLAN_PERIOD_TYPE: 'CHECK_PLAN_PERIOD_TYPE', // 计划周期类型
   CHECK_PLAN_ACTION_TYPE: 'CHECK_PLAN_ACTION_TYPE', // 计划动作类型
+  CHECK_PLAN_LEVEL: 'CHECK_PLAN_LEVEL', // 等级1:现场,2,维修,3厂家
   CHECK_JOB_STATUS: 'CHECK_JOB_STATUS', // 任务状态,
 
   /* 保养润滑模块 */
@@ -820,7 +821,9 @@ DictCache.VALUE = {
    */
   CHECK_USER_TYPE: {
     USE_USER: 1, // 使用人
-    REPAIR_USER: 2 // 维修人
+    REPAIR_USER: 2, // 维修人
+    ZHIDING: 3,// 维修人
+    FACTORY: 4 //
   },
   /**
    * 计划周期类型
@@ -844,6 +847,15 @@ DictCache.VALUE = {
     OUT_OF_DATE: 4// 已过期
   },
 
+  /**
+   * 任务状态
+   */
+  CHECK_PLAN_LEVEL: {
+    A: 1,
+    B: 2,
+    C: 3
+  },
+
   /* 保养润滑模块 */
   /**
    * 标准参数类型

+ 11 - 0
src/views/check/checkjob/CheckJob.vue

@@ -229,6 +229,15 @@ export default {
           checked: true,
           width: '150px'
         },
+        {
+          title: '保养等级',
+          dataIndex: 'standardlevel',
+          width: '100px',
+          checked: true,
+          customRender: (text, record, index) => {
+            return this.BaseTool.Table.getMapText(this.standardLevelMap, text)
+          }
+        },
         {
           title: '任务要求',
           dataIndex: 'requirement',
@@ -318,6 +327,7 @@ export default {
       ],
       // 下拉框map
       levelMap: {},
+      standardLevelMap: {},
       statusMap: {},
       sbStatusMap: {},
       periodTypeMap: {},
@@ -353,6 +363,7 @@ export default {
     this.sbStatusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
     this.periodTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_PERIOD_TYPE)
     this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.SBINFO_LEVEL)
+    this.standardLevelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_LEVEL)
     fetchSbTypeTree().then(res => {
       this.treeData = res.data
     })

+ 11 - 0
src/views/check/checkjob/modules/DetailSbCheckJob.vue

@@ -120,6 +120,7 @@ export default {
       modalTitle: null,
       visible: false,
       typeMap: {},
+      standardLevelMap: {},
       statusMap: {},
       actionTypeMap: {},
       // 表头
@@ -157,6 +158,15 @@ export default {
           checked: true,
           width: '100px'
         },
+        {
+          title: '保养等级',
+          dataIndex: 'standardlevel',
+          width: '100px',
+          checked: true,
+          customRender: (text, record, index) => {
+            return this.BaseTool.Table.getMapText(this.standardLevelMap, text)
+          }
+        },
         {
           title: '执行日期',
           dataIndex: 'startTime',
@@ -206,6 +216,7 @@ export default {
     this.periodTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_PERIOD_TYPE)
     this.actionTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_ACTION_TYPE)
     this.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_JOB_STATUS)
+    this.standardLevelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_LEVEL)
   },
   methods: {
     base (record) {

+ 12 - 0
src/views/check/checkstandard/CheckStandard.vue

@@ -179,6 +179,15 @@ export default {
           checked: true,
           width: '200px'
         },
+        {
+          title: '保养等级',
+          dataIndex: 'level',
+          width: '100px',
+          checked: true,
+          customRender: (text, record, index) => {
+            return this.BaseTool.Table.getMapText(this.levelMap, text)
+          }
+        },
         {
           title: '标准内容',
           dataIndex: 'requirement',
@@ -229,9 +238,11 @@ export default {
         }
       ],
       // 下拉框map
+      actionTypeMap: {},
       typeMap: {},
       enableMap: {},
       periodTypeMap: {},
+      levelMap: {},
       checkUserTypeMap: {},
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
@@ -269,6 +280,7 @@ export default {
     this.enableMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
     this.periodTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_PERIOD_TYPE)
     this.actionTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_ACTION_TYPE)
+    this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_LEVEL)
     this.checkUserTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_USER_TYPE)
     this.tableOption()
   },

+ 29 - 2
src/views/check/checkstandard/modules/BaseForm.vue

@@ -39,7 +39,7 @@
             <a-button type="primary" style="width: 20%" @click="handleSbSelect">选择</a-button>
           </a-form-item>
         </row-item>
-<!--        <row-item>
+        <!--        <row-item>
           <a-form-item
             label="标准名称"
             :labelCol="BaseTool.Constant.labelCol"
@@ -97,6 +97,25 @@
             </a-select>
           </a-form-item>
         </row-item>
+<!--        <row-item>
+          <a-form-item
+            label="保养等级"
+            :labelCol="BaseTool.Constant.labelCol"
+            :wrapperCol="BaseTool.Constant.wrapperCol"
+          >
+            <a-select
+              disabled
+              v-decorator="['level', {rules: [{required: true, message: '保养等级不能为空'}]}]"
+              placeholder="请选择">
+              <a-select-option
+                v-for="(label,value) in levelMap"
+                :key="value"
+                :label="label"
+                :value="parseInt(value)">{{ label }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </row-item>-->
         <row-item>
           <a-form-item
             label="计划周期"
@@ -244,7 +263,7 @@
               v-decorator="['requirement', {rules: [{required: true, message: '检查项目不能为空'}]}]"/>
           </a-form-item>
         </row-item>
-<!--        <row-item>
+        <!--        <row-item>
           <a-form-item
             label="操作说明及标准"
             :labelCol="BaseTool.Constant.labelCol2"
@@ -366,6 +385,7 @@ export default {
       form: this.$form.createForm(this),
       visible: false,
       sbId: null,
+      levelMap: {},
       checkUserType: null,
       // 下拉框map
       typeMap: {},
@@ -443,6 +463,7 @@ export default {
     this.actionTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_ACTION_TYPE)
     this.enableMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
     this.checkUserTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_USER_TYPE)
+    this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_LEVEL)
   },
   methods: {
     base (record, sbId, sbNo) {
@@ -514,6 +535,7 @@ export default {
           // 'no',
           // 'type',
           'period',
+          'level',
           'part',
           'partName',
           'checkUserType',
@@ -669,6 +691,11 @@ export default {
     },
     changeCheckUserType (value) {
       this.checkUserType = value
+      const { form: { setFieldsValue } } = this
+      // 日期处理
+      this.$nextTick(() => {
+        setFieldsValue({ level: value })
+      })
     },
     onQuantityChange (e, id, attr) {
       const value = e.target.value

+ 59 - 18
src/views/check/checkstandard/modules/CheckStandardSelectModal.vue

@@ -104,6 +104,7 @@ export default {
       modalTitle: null,
       visible: false,
       periodTypeMap: {},
+      levelMap: {},
       actionTypeMap: {},
       record: null,
       // 查询参数
@@ -121,43 +122,83 @@ export default {
           }
         },
         {
-          title: '标准名称',
-          dataIndex: 'name'
+          title: '设备新号',
+          dataIndex: 'sbNo',
+          checked: true,
+          width: '100px'
         },
         {
-          title: '检查类型',
-          dataIndex: 'type',
+          title: '设备名称',
+          dataIndex: 'sbName',
+          checked: true,
+          width: '150px'
+        },
+        {
+          title: '设备新号',
+          dataIndex: 'sbNo',
+          checked: true,
+          width: '150px'
+        },
+        {
+          title: '部位',
+          dataIndex: 'partName',
+          checked: true,
+          width: '200px'
+        },
+        {
+          title: '保养等级',
+          dataIndex: 'level',
+          width: '100px',
+          checked: true,
           customRender: (text, record, index) => {
-            return this.BaseTool.Table.getMapText(this.typeMap, text)
+            return this.BaseTool.Table.getMapText(this.levelMap, text)
           }
         },
         {
-          title: '周期',
-          dataIndex: 'periodType',
+          title: '标准内容',
+          dataIndex: 'requirement',
+          checked: true,
+          width: '250px',
           customRender: (text, record, index) => {
-            return text + this.BaseTool.Table.getMapText(this.periodTypeMap, text)
+            if (text != null) {
+              if (text.length > 40) {
+                return text.slice(0, 40)
+              } else {
+                return text
+              }
+            } else {
+              return text
+            }
           }
         },
         {
-          title: '检查类型',
-          dataIndex: 'actionType',
+          title: '计划周期',
+          dataIndex: 'period',
+          width: '100px',
+          checked: true,
           customRender: (text, record, index) => {
-            return this.BaseTool.Table.getMapText(this.actionTypeMap, text)
+            return text + this.BaseTool.Table.getMapText(this.periodTypeMap, record.periodType)
           }
         },
         {
-          title: '部位',
-          dataIndex: 'part'
+          title: '预计下次执行日期',
+          dataIndex: 'nextDate',
+          checked: true,
+          width: '200px'
         },
         {
-          title: '要求',
-          dataIndex: 'requirement'
+          title: '上次执行日期',
+          dataIndex: 'lastDate',
+          fixed: 'right',
+          checked: true,
+          width: '200px'
         },
-
         {
           title: '操作',
           key: 'action',
-          width: '200px',
+          width: '250px',
+          checked: true,
+          fixed: 'right',
           align: 'center',
           scopedSlots: { customRender: 'action' }
         }
@@ -204,7 +245,7 @@ export default {
     this.enableMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
     this.periodTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_PERIOD_TYPE)
     this.actionTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_ACTION_TYPE)
-
+    this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_LEVEL)
   },
   methods: {
     tableOption () {

+ 10 - 6
src/views/check/checkstandard/modules/Detail.vue

@@ -7,17 +7,18 @@
     @cancel="handleCancel"
   >
     <detail-list title="" :col="2">
-<!--      <detail-list-item term="标准名称">{{ model.name }}</detail-list-item>-->
+      <!--      <detail-list-item term="标准名称">{{ model.name }}</detail-list-item>-->
       <detail-list-item term="排序">{{ model.sort }}</detail-list-item>
-<!--      <detail-list-item term="编码">{{ model.no }}</detail-list-item>-->
+      <!--      <detail-list-item term="编码">{{ model.no }}</detail-list-item>-->
       <detail-list-item term="检查类型">{{ BaseTool.Object.getField(typeMap,model.type) }}</detail-list-item>
+      <detail-list-item term="保养等级">{{ BaseTool.Object.getField(levelMap,model.level) }}</detail-list-item>
       <detail-list-item term="计划周期">{{ model.period }}{{ BaseTool.Object.getField(periodTypeMap,model.periodType) }}</detail-list-item>
       <detail-list-item term="标准工时">{{ model.standardHours }}</detail-list-item>
       <detail-list-item term="上次实际日期">{{ model.lastDate }}</detail-list-item>
       <detail-list-item term="下次预计日期">{{ model.nextDate }}</detail-list-item>
-<!--      <detail-list-item term="动作类型">{{ BaseTool.Object.getField(actionTypeMap,model.actionType) }}</detail-list-item>-->
+      <!--      <detail-list-item term="动作类型">{{ BaseTool.Object.getField(actionTypeMap,model.actionType) }}</detail-list-item>-->
       <detail-list-item term="部位">{{ model.partName }}</detail-list-item>
-<!--      <detail-list-item term="是否启用"><badge :status="DictCache.COLOR.YES_NO[model.enable]" :text="enableMap[model.enable]"></badge></detail-list-item>-->
+      <!--      <detail-list-item term="是否启用"><badge :status="DictCache.COLOR.YES_NO[model.enable]" :text="enableMap[model.enable]"></badge></detail-list-item>-->
       <!--      <detail-list-item term="创建人">{{ model.createdUserName }}</detail-list-item>
           <detail-list-item term="更新人">{{ model.updateUserName }}</detail-list-item>
            <detail-list-item term="创建时间">{{ model.updateTime }}</detail-list-item>
@@ -48,7 +49,7 @@
         </a-upload>
       </detail-list-item>
     </detail-list>
-<!--    <a-tabs type="card" default-active-key="1">
+    <!--    <a-tabs type="card" default-active-key="1">
       <a-tab-pane key="1" tab="点检标准参数">
         <a-table
           bordered
@@ -93,14 +94,16 @@ export default {
       visible: false,
       // 下拉框map
       typeMap: {},
+      levelMap: {},
       periodTypeMap: {},
       checkUserTypeMap: {},
       actionTypeMap: {},
       enableMap: {},
       model: {
-       /* 'name': null,*/
+        /* 'name': null, */
         'no': null,
         'type': null,
+        'level': null,
         'part': null,
         'enable': null,
         'requirement': null,
@@ -140,6 +143,7 @@ export default {
     this.periodTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_PERIOD_TYPE)
     this.actionTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_ACTION_TYPE)
     this.checkUserTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_USER_TYPE)
+    this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_LEVEL)
   },
   methods: {
     inited (viewer) {

+ 11 - 0
src/views/check/checkstandard/modules/DetailSbCheck.vue

@@ -101,6 +101,7 @@ export default {
     return {
       confirmLoading: false,
       mdl: {},
+      levelMap: {},
       model: {
         'id': null,
         'modelId': null,
@@ -135,6 +136,15 @@ export default {
           checked: true,
           dataIndex: 'partName'
         },
+        {
+          title: '保养等级',
+          dataIndex: 'level',
+          width: '100px',
+          checked: true,
+          customRender: (text, record, index) => {
+            return this.BaseTool.Table.getMapText(this.levelMap, text)
+          }
+        },
         {
           title: '标准内容',
           dataIndex: 'requirement',
@@ -205,6 +215,7 @@ export default {
     this.periodTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_PERIOD_TYPE)
     this.actionTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_ACTION_TYPE)
     this.checkUserTypeMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_USER_TYPE)
+    this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.CHECK_PLAN_LEVEL)
   },
   methods: {
     onSelectChange (selectedRowKeys, selectedRows) {

+ 136 - 0
src/views/dashboard/CheckJobReport.vue

@@ -0,0 +1,136 @@
+<template>
+  <div class="page-header-index-wide">
+    <a-row :gutter="24">
+      <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
+        <chart-card :loading="loading" title="本月任务总数" total="¥126,560">
+          <a-tooltip title="指标说明" slot="action">
+            <a-icon type="info-circle-o" />
+          </a-tooltip>
+          <div>
+          </div>
+        </chart-card>
+      </a-col>
+      <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
+        <chart-card :loading="loading" title="本月完成数" :total="8846 | NumberFormat">
+          <a-tooltip title="指标说明" slot="action">
+            <a-icon type="info-circle-o" />
+          </a-tooltip>
+        </chart-card>
+      </a-col>
+      <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
+        <chart-card :loading="loading" title="本月未完成数" :total="6560 | NumberFormat">
+          <a-tooltip title="指标说明" slot="action">
+            <a-icon type="info-circle-o" />
+          </a-tooltip>
+        </chart-card>
+      </a-col>
+      <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
+        <chart-card :loading="loading" title="本月完成率" total="78%">
+          <a-tooltip title="指标说明" slot="action">
+            <a-icon type="info-circle-o" />
+          </a-tooltip>
+        </chart-card>
+      </a-col>
+    </a-row>
+
+    <a-card :loading="loading" :bordered="false" :body-style="{padding: '0'}">
+      <div class="salesCard">
+        <a-tabs default-active-key="1" size="large" :tab-bar-style="{marginBottom: '24px', paddingLeft: '16px'}">
+          <div class="extra-wrapper" slot="tabBarExtraContent">
+            <div class="extra-item">
+              <a>9月</a>
+            </div>
+            <a-range-picker :style="{width: '256px'}" />
+          </div>
+          <a-tab-pane loading="true" tab="月统计" key="1">
+            <a-row>
+              <a-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24">
+                <g2-chart></g2-chart>
+              </a-col>
+            </a-row>
+          </a-tab-pane>
+        </a-tabs>
+      </div>
+    </a-card>
+  </div>
+</template>
+
+<script>
+import moment from 'moment'
+import { ChartCard, G2Chart } from '@/components'
+
+export default {
+  name: 'Analysis',
+  components: {
+    ChartCard,
+    G2Chart
+  },
+  data () {
+    return {
+      loading: true,
+      serverData: []
+    }
+  },
+  created () {
+    setTimeout(() => {
+      this.loading = !this.loading
+    }, 1000)
+  },
+  methods: {
+    getData () {
+      this.serverData =
+        [{ 'mzkId': 112, 'strftime': '2017-01-11', 'value': 9275501 }, // 测试数据,根据自己需求自己设置数据
+          { 'mzkId': 112, 'strftime': '2017-01-12', 'value': 9281904 },
+          { 'mzkId': 112, 'strftime': '2017-01-13', 'value': 9290777 },
+          { 'mzkId': 112, 'strftime': '2017-01-14', 'value': 9297913 },
+          { 'mzkId': 112, 'strftime': '2017-01-15', 'value': 9306918 },
+          { 'mzkId': 112, 'strftime': '2017-01-16', 'value': 9315641 }]
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .extra-wrapper {
+    line-height: 55px;
+    padding-right: 24px;
+
+    .extra-item {
+      display: inline-block;
+      margin-right: 24px;
+
+      a {
+        margin-left: 24px;
+      }
+    }
+  }
+
+  .antd-pro-pages-dashboard-analysis-twoColLayout {
+    position: relative;
+    display: flex;
+    display: block;
+    flex-flow: row wrap;
+  }
+
+  .antd-pro-pages-dashboard-analysis-salesCard {
+    height: calc(100% - 24px);
+    /deep/ .ant-card-head {
+      position: relative;
+    }
+  }
+
+  .dashboard-analysis-iconGroup {
+    i {
+      margin-left: 16px;
+      color: rgba(0,0,0,.45);
+      cursor: pointer;
+      transition: color .32s;
+      color: black;
+    }
+  }
+  .analysis-salesTypeRadio {
+    position: absolute;
+    right: 54px;
+    bottom: 12px;
+  }
+</style>

+ 27 - 4
src/views/repair/application-form/RepairApplicationForm.vue

@@ -19,13 +19,30 @@
                 <a-input v-model="queryParam.actualUser" placeholder="请输入报修人"/>
               </a-form-item>
             </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="维修人">
+                <a-input v-model="queryParam.repairUserName" placeholder="请输入维修人"/>
+              </a-form-item>
+            </a-col>
             <a-col :md="6" :sm="24">
               <a-form-item label="问题描述">
                 <a-input v-model="queryParam.content" placeholder="问题描述模糊查询"/>
               </a-form-item>
             </a-col>
             <a-col :md="6" :sm="24">
-              <a-form-item label="起始日期">
+              <a-form-item label="状态">
+                <a-select v-model="queryParam.status" placeholder="请选择">
+                  <a-select-option
+                    v-for="(label,value) in statusMap"
+                    :key="value"
+                    :label="label"
+                    :value="parseInt(value)">{{ label }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="报修起始日期">
                 <a-date-picker
                   v-model="queryParam.searchStartTime"
                   style="width: 100%"
@@ -34,7 +51,7 @@
               </a-form-item>
             </a-col>
             <a-col :md="6" :sm="24">
-              <a-form-item label="结束日期">
+              <a-form-item label="报修结束日期">
                 <a-date-picker
                   v-model="queryParam.searchEndTime"
                   style="width: 100%"
@@ -44,7 +61,7 @@
             </a-col>
             <a-col :md="8 || 24" :sm="24">
               <span class="table-page-search-submitButtons">
-                <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+                <a-button type="primary" @click="handleOk()">查询</a-button>
                 <a-button style="margin-left: 8px" @click="resetSearchForm">重置</a-button>
               </span>
             </a-col>
@@ -175,6 +192,12 @@ export default {
           width: '120px',
           dataIndex: 'actualUser'
         },
+        {
+          title: '维修人',
+          checked: true,
+          width: '120px',
+          dataIndex: 'repairUserName'
+        },
         {
           title: '报修来源',
           checked: true,
@@ -187,7 +210,7 @@ export default {
         {
           title: '报修时间',
           checked: true,
-          width: '150px',
+          width: '200px',
           dataIndex: 'applyTime'
         },
         /* {

+ 91 - 10
src/views/repair/application-form/RepairCheckForm.vue

@@ -4,14 +4,64 @@
       <div class="table-page-search-wrapper">
         <a-form layout="inline">
           <a-row :gutter="48">
-            <a-col :md="8" :sm="24">
+            <a-col :md="6" :sm="24">
               <a-form-item label="关键字">
-                <a-input v-model="queryParam.keyword" placeholder="请输入名称/类型名称"/>
+                <a-input v-model="queryParam.keyword" placeholder="请输入设备名称/设备新号"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="设备旧号">
+                <a-input v-model="queryParam.zbh" placeholder="请输入设备旧号"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="报修人">
+                <a-input v-model="queryParam.actualUser" placeholder="请输入报修人"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="维修人">
+                <a-input v-model="queryParam.repairUserName" placeholder="请输入维修人"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="问题描述">
+                <a-input v-model="queryParam.content" placeholder="问题描述模糊查询"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="状态">
+                <a-select v-model="queryParam.status" placeholder="请选择">
+                  <a-select-option
+                    v-for="(label,value) in statusMap"
+                    :key="value"
+                    :label="label"
+                    :value="parseInt(value)">{{ label }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="报修开始日期">
+                <a-date-picker
+                  v-model="queryParam.searchStartTime"
+                  style="width: 100%"
+                  :format="BaseTool.Date.PICKER_NORM_DATETIME_PATTERN"
+                />
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="报修结束日期">
+                <a-date-picker
+                  v-model="queryParam.searchEndTime"
+                  style="width: 100%"
+                  :format="BaseTool.Date.PICKER_NORM_DATETIME_PATTERN"
+                />
               </a-form-item>
             </a-col>
             <a-col :md="8 || 24" :sm="24">
               <span class="table-page-search-submitButtons">
-                <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+                <a-button type="primary" @click="handleOk()">查询</a-button>
                 <a-button style="margin-left: 8px" @click="resetSearchForm">重置</a-button>
               </span>
             </a-col>
@@ -93,19 +143,21 @@ export default {
           title: '序号',
           dataIndex: 'index',
           checked: true,
+          width: '70px',
           customRender: (text, record, index) => {
             return `${(this.$refs.table.localPagination.current - 1) * this.$refs.table.localPagination.pageSize + index + 1}`
           }
         },
-
         {
           title: '设备编号',
           checked: true,
+          width: '100px',
           dataIndex: 'sbNo'
         },
         {
           title: '设备名称',
           checked: true,
+          width: '150px',
           dataIndex: 'sbId',
           customRender: (text, record, index) => {
             return record.sbName
@@ -114,16 +166,19 @@ export default {
         {
           title: '报修人',
           checked: true,
+          width: '120px',
           dataIndex: 'actualUser'
         },
         {
           title: '维修人',
           checked: true,
+          width: '120px',
           dataIndex: 'repairUserName'
         },
         {
           title: '报修来源',
           checked: true,
+          width: '100px',
           dataIndex: 'source',
           customRender: (text, record, index) => {
             return this.BaseTool.Object.getField(this.sourceMap, text)
@@ -132,11 +187,35 @@ export default {
         {
           title: '报修时间',
           checked: true,
+          width: '200px',
           dataIndex: 'applyTime'
         },
+        /* {
+          title: '紧急等级',
+          checked: true,
+          width: '200px',
+          dataIndex: 'level',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Object.getField(this.levelMap, text)
+          }
+        },
+        {
+          title: '是否停机',
+          checked: true,
+          dataIndex: 'needStop',
+          customRender: (text, record, index) => {
+            return this.BaseTool.Object.getField(this.needStopMap, text)
+          }
+        }, */
+        {
+          title: '创建日期',
+          width: '200px',
+          dataIndex: 'createdTime'
+        },
         {
           title: '接收超时',
           checked: true,
+          width: '100px',
           dataIndex: 'receiveOvertime',
           customRender: (text, record, index) => {
             if (text === '1') {
@@ -149,6 +228,7 @@ export default {
         {
           title: '维修超时',
           checked: true,
+          width: '100px',
           dataIndex: 'repairOvertime',
           customRender: (text, record, index) => {
             if (text === '1') {
@@ -161,18 +241,17 @@ export default {
         {
           title: '报修状态',
           checked: true,
+          width: '100px',
+          fixed: 'right',
           dataIndex: 'status',
           scopedSlots: { customRender: 'status' }
         },
-        {
-          title: '创建日期',
-          dataIndex: 'createdTime'
-        },
         {
           title: '操作',
           checked: true,
+          fixed: 'right',
           key: 'action',
-          width: '200px',
+          width: '150px',
           align: 'center',
           scopedSlots: { customRender: 'action' }
         }
@@ -189,7 +268,7 @@ export default {
           ...this.queryParam,
           dataScope: {
             sortBy: 'desc',
-            sortName: 'update_time'
+            sortName: 'check_start_time'
           }
         }
         return getRepairApplicationFormPage(Object.assign(parameter, this.queryParam))
@@ -281,6 +360,8 @@ export default {
     },
     handleOk () {
       this.visible = true
+      this.queryParam.searchStartTime = this.queryParam.searchStartTime ? this.BaseTool.Date.formatter(this.queryParam.searchStartTime, this.BaseTool.Date.PICKER_NORM_DATETIME_PATTERN) : null
+      this.queryParam.searchEndTime = this.queryParam.searchEndTime ? this.BaseTool.Date.formatter(this.queryParam.searchEndTime, this.BaseTool.Date.PICKER_NORM_DATETIME_PATTERN) : null
       this.$refs.table.refresh()
     },
     onSelectChange (selectedRowKeys, selectedRows) {

+ 28 - 5
src/views/repair/application-form/RepairForm.vue

@@ -19,13 +19,30 @@
                 <a-input v-model="queryParam.actualUser" placeholder="请输入报修人"/>
               </a-form-item>
             </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="维修人">
+                <a-input v-model="queryParam.repairUserName" placeholder="请输入维修人"/>
+              </a-form-item>
+            </a-col>
             <a-col :md="6" :sm="24">
               <a-form-item label="问题描述">
                 <a-input v-model="queryParam.content" placeholder="问题描述模糊查询"/>
               </a-form-item>
             </a-col>
             <a-col :md="6" :sm="24">
-              <a-form-item label="起始日期">
+              <a-form-item label="状态">
+                <a-select v-model="queryParam.status" placeholder="请选择">
+                  <a-select-option
+                    v-for="(label,value) in statusMap"
+                    :key="value"
+                    :label="label"
+                    :value="parseInt(value)">{{ label }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="报修起始日期">
                 <a-date-picker
                   v-model="queryParam.searchStartTime"
                   style="width: 100%"
@@ -34,7 +51,7 @@
               </a-form-item>
             </a-col>
             <a-col :md="6" :sm="24">
-              <a-form-item label="结束日期">
+              <a-form-item label="报修结束日期">
                 <a-date-picker
                   v-model="queryParam.searchEndTime"
                   style="width: 100%"
@@ -44,7 +61,7 @@
             </a-col>
             <a-col :md="8 || 24" :sm="24">
               <span class="table-page-search-submitButtons">
-                <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+                <a-button type="primary" @click="handleOk()">查询</a-button>
                 <a-button style="margin-left: 8px" @click="resetSearchForm">重置</a-button>
               </span>
             </a-col>
@@ -186,6 +203,12 @@ export default {
           width: '120px',
           dataIndex: 'actualUser'
         },
+        {
+          title: '维修人',
+          checked: true,
+          width: '120px',
+          dataIndex: 'repairUserName'
+        },
         {
           title: '报修来源',
           checked: true,
@@ -198,7 +221,7 @@ export default {
         {
           title: '报修时间',
           checked: true,
-          width: '150px',
+          width: '200px',
           dataIndex: 'applyTime'
         },
         /* {
@@ -280,7 +303,7 @@ export default {
           type: 1,
           dataScope: {
             sortBy: 'desc',
-            sortName: 'update_time'
+            sortName: 'apply_time'
           }
         }
         return getRepairApplicationFormPage(Object.assign(parameter, this.queryParam))

+ 6 - 0
src/views/repair/repair-reason/RepairReason.vue

@@ -101,6 +101,12 @@ export default {
           dataIndex: 'analyzeTime',
           width: '200px'
         },
+        {
+          title: '故障部位',
+          dataIndex: 'sbPartName',
+          ellipsis: true,
+          width: '150px'
+        },
         {
           title: '故障现象',
           dataIndex: 'problemDesc',

+ 40 - 1
src/views/repair/repair-reason/modules/BaseForm.vue

@@ -44,6 +44,21 @@
             </a-form-item>
           </a-col>
         </a-row>
+        <a-row class="form-row" :gutter="BaseTool.Constant.row.gutter">
+          <a-col :lg="24" :md="24" :sm="24">
+            <a-form-item
+              label="故障部位"
+              :labelCol="BaseTool.Constant.labelCol"
+              :wrapperCol="BaseTool.Constant.wrapperCol"
+            >
+              <a-input
+                disabled
+                style="width: 80%"
+                v-decorator="['sbPartName']"/>
+              <a-button type="primary" style="width: 20%" @click="handlePartSelect">选择</a-button>
+            </a-form-item>
+          </a-col>
+        </a-row>
         <a-row class="form-row" :gutter="BaseTool.Constant.row.gutter">
           <a-col :lg="24" :md="24" :sm="24">
             <a-form-item
@@ -120,6 +135,7 @@
     </div>
     <detail-sb-check ref="detailSbCheckModal" @ok="handleOk"/>
     <detail-sb-bom ref="detailSbBomModal" @ok="handleOk"/>
+    <part-info-select-modal ref="partInfoSelectModal" @selected="handlePartSelected"/>
   </a-card>
 </template>
 
@@ -129,12 +145,14 @@ import pick from 'lodash.pick'
 import DetailSbBom from '@/views/sb/modelbom/modules/DetailSbBom'
 import DetailSbCheck from '@/views/check/checkstandard/modules/DetailSbCheck'
 import { fetchSbInfo } from '@/api/sb/info'
+import PartInfoSelectModal from '@/views/part/info/modules/PartInfoSelectModal'
 
 export default {
   name: 'BaseRepairReason',
   components: {
     DetailSbCheck,
-    DetailSbBom
+    DetailSbBom,
+    PartInfoSelectModal
   },
   data () {
     return {
@@ -205,6 +223,8 @@ export default {
         setFieldsValue(Object.assign(pick(record, [
           'id',
           'sbId',
+          'sbPartId',
+          'sbPartName',
           'repairId',
           'no',
           'analyzeTime',
@@ -312,6 +332,25 @@ export default {
         const modal = this.$refs.detailSbBomModal
         modal.base(res.data)
       })
+    },
+    handlePartSelect () {
+      const sbId = this.form.getFieldValue('sbId')
+      if (this.BaseTool.Object.isBlank(sbId)) {
+        this.$message.error('请先选择设备')
+      }
+      this.$refs.partInfoSelectModal.base({ sbId })
+    },
+    handlePartSelected (keys, rows) {
+      const [ key ] = keys
+      const [ row ] = rows
+      const { form: { setFieldsValue } } = this
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign({
+          'partId': key,
+          'partName': row.name,
+          'partNo': row.no
+        }))
+      })
     }
   }
 }

+ 3 - 0
src/views/repair/repair-reason/modules/Detail.vue

@@ -10,6 +10,7 @@
     <detail-list title="" :col="2">
       <detail-list-item term="编号">{{ model.no }}</detail-list-item>
       <detail-list-item term="分析时间">{{ model.analyzeTime }}</detail-list-item>
+      <detail-list-item term="故障部位">{{ model.sbPartName }}</detail-list-item>
     </detail-list>
 
     <title-divider title="故障现象" width="120px"></title-divider>
@@ -99,6 +100,8 @@ export default {
       model: {
         'no': null,
         'sbId': null,
+        'sbPartId': null,
+        'sbPartName': null,
         'repairId': null,
         'analyzeTime': null,
         'problemDesc': null,

+ 6 - 0
src/views/repair/repair-reason/modules/DetailRepairReason.vue

@@ -102,6 +102,12 @@ export default {
           dataIndex: 'analyzeTime',
           width: '200px'
         },
+        {
+          title: '故障部位',
+          dataIndex: 'sbPartName',
+          ellipsis: true,
+          width: '150px'
+        },
         {
           title: '故障现象',
           dataIndex: 'problemDesc',

+ 6 - 0
src/views/repair/repair-reason/modules/RepairReasonTable.vue

@@ -118,6 +118,12 @@ export default {
           dataIndex: 'analyzeTime',
           width: '200px'
         },
+        {
+          title: '故障部位',
+          dataIndex: 'sbPartName',
+          ellipsis: true,
+          width: '150px'
+        },
         {
           title: '故障现象',
           dataIndex: 'problemDesc',

+ 49 - 4
src/views/sb/info/modules/BaseForm.vue

@@ -507,6 +507,29 @@
           </a-form-item>
         </a-col>
       </a-row>
+      <title-divider title="自定义参数" width="120px"></title-divider>
+      <div class="table-operator">
+        <a-button type="primary" @click="handleParam">
+          <a-icon type="plus"/>
+          添加
+        </a-button>
+      </div>
+      <a-row class="form-row" :gutter="BaseTool.Constant.row.gutter">
+        <a-col v-for="(item, index) in paramList" :lg="12" :md="24" :sm="24">
+          <a-form-item
+            :label="item.name"
+            :labelCol="BaseTool.Constant.labelCol"
+            :wrapperCol="BaseTool.Constant.wrapperCol"
+          >
+            <a-input
+              style="width: 70%"
+              :defaultValue="item.name"
+              disabled
+            />
+            <a-button style="width: 30%" type="primary" @click="handleDelParam(index)">删除</a-button>
+          </a-form-item>
+        </a-col>
+      </a-row>
       <title-divider title="资产编号" width="90px"></title-divider>
       <a-row class="form-row" :gutter="BaseTool.Constant.row.gutter">
         <a-col :lg="12" :md="24" :sm="24">
@@ -877,6 +900,7 @@
     <sb-model-select-modal ref="sbModelSelectModal" @selected="handleSbModelSelected"/>
     <sb-info-select-modal ref="sbInfoSelectModal" @selected="handleSbSelectd"/>
     <firm-producer-select-modal ref="producerSelectModal" @selected="handleProducerSelected"/>
+    <param-form ref="paramForm" @ok="handleParamList" />
   </a-card>
 </template>
 
@@ -894,8 +918,10 @@ import Vue from 'vue'
 import { uploadUrl } from '@/api/upms/file'
 import { queryDept, getDeptsAllByParentId } from '@/api/upms/dept'
 import { queryUser } from '@/api/upms/user'
-
+import DetailList from '@/components/tools/DetailList'
 import SbInfoSelectModal from '@/views/sb/info/modules/SbInfoSelectModal'
+import ParamForm from './ParamForm'
+const DetailListItem = DetailList.Item
 
 export default {
   name: 'BaseSbInfo',
@@ -903,7 +929,10 @@ export default {
     FirmProducerSelectModal,
     SbGuigeSelectModal,
     SbModelSelectModal,
-    SbInfoSelectModal
+    SbInfoSelectModal,
+    ParamForm,
+    DetailList,
+    DetailListItem
   },
   data () {
     return {
@@ -912,6 +941,7 @@ export default {
       form: this.$form.createForm(this),
       areaList: {},
       companyList: {},
+      paramList: [],
       projectList: {},
       deptList: {},
       groupList: {},
@@ -995,7 +1025,7 @@ export default {
       this.defaultUseFileList = this.BaseTool.UPLOAD.transImg(this.useFileList)
       this.defaultRecheckFileList = this.BaseTool.UPLOAD.transImg(this.recheckFileList)
       this.defaultSbFileList = this.BaseTool.UPLOAD.transImg(this.sbFileList)
-
+      this.paramList = JSON.parse(record.paramList)
       if (type === 1) {
         this.type = type
         this.modalTitle = '复制'
@@ -1164,7 +1194,7 @@ export default {
         values.useFileList = this.useFileList
         values.recheckFileList = this.recheckFileList
         values.sbFileList = this.sbFileList
-
+        values.paramList = JSON.stringify(this.paramList)
         values.useType = this.useType
         if (this.BaseTool.String.isBlank(values.id)) {
           addSbInfo(values)
@@ -1443,6 +1473,21 @@ export default {
       a.href = '/hitch-screen/point.html?id=' + this.id + '&zjm=' + zjm + '&jbdh=' + jbdh
       a.target = '_blank'
       a.click()
+    },
+    handleParam () {
+      const modal = this.$refs.paramForm
+      modal.base(this.model)
+    },
+    handleParamList (values) {
+      console.log(values)
+      if (this.paramList == null) {
+        this.paramList = []
+      }
+      this.paramList.push(values)
+    },
+    handleDelParam (index) {
+      console.log(index)
+      this.paramList.splice(index, 1)
     }
   }
 }

+ 20 - 1
src/views/sb/info/modules/Detail.vue

@@ -20,6 +20,7 @@
               <a-button style="margin-left: 8px" type="default" @click="handleViewCheckJob()">保养任务</a-button>
             </a-badge>
             <a-button v-show="model.useType==4" style="margin-left: 8px" type="default" @click="handleMeasure()">检定记录</a-button>
+            <a-button style="margin-left: 8px" type="error" @click="handleTuiCalendar()">保养日历图</a-button>
             <a-button style="margin-left: 8px" type="primary" @click="handleCancel()">返回</a-button>
           </span>
         </a-col>
@@ -53,6 +54,11 @@
         <detail-list-item term="状态"><badge :status="DictCache.COLOR.SB_INFO_STATUS[model.status]" :text="statusMap[model.status]"></badge></detail-list-item>
         <detail-list-item term="备注">{{ model.remark }}</detail-list-item>
       </detail-list>
+      <title-divider width="120px" title="自定义参数"></title-divider>
+      <detail-list v-for="item in paramList" title="" :col="3">
+        <detail-list-item term="参数名称">{{ item.name }}</detail-list-item>
+        <detail-list-item term="参数内容">{{ item.content }}</detail-list-item>
+      </detail-list>
       <title-divider title="资产编号" width="90px"></title-divider>
       <detail-list title="" :col="3">
         <detail-list-item term="资产编号1">{{ model.financingNo }}</detail-list-item>
@@ -163,7 +169,7 @@ import CheckJobTable from '@/views/check/checkjob/modules/CheckJobTable'
 // import CheckJobTableWaitDo from '@/views/check/checkjob/modules/CheckJobTableWaitDo'
 import { fetchFirmProducer } from '@/api/firm/producer'
 import { queryNumCheckStandard } from '@/api/check/checkstandard'
-import { queryNumCheckjob } from '@/api/check/checkjob'
+import { queryNumCheckjob, queryTuiCalendarIgnores } from '@/api/check/checkjob'
 import { queryNumRepairReason } from '@/api/repair/repair-reason'
 import { queryNumPartInfo } from '@/api/part/info'
 import { queryNumModelbom } from '@/api/sb/modelbom'
@@ -205,6 +211,7 @@ export default {
       confirmLoading: false,
       mdl: {},
       modalTitle: null,
+      paramList: [],
       visible: false,
       visibleDetail: false,
       activeKey: '3',
@@ -223,6 +230,7 @@ export default {
         'typeId': null,
         'isShow': null,
         'isChild': null,
+        'paramList': null,
         'parentId': null,
         'level': null,
         'useType': null,
@@ -362,6 +370,7 @@ export default {
       this.model = record
       this.activeKey = '1'
       this.collapseActiveKey = '0'
+      this.paramList = JSON.parse(record.paramList)
       this.fetchNum()
       fetchFirmProducer({ id: this.model.producerId }).then(res => {
         this.firmProducer = res.data
@@ -425,6 +434,16 @@ export default {
     checkJobTableWaitDoListView () {
       const modal = this.$refs.checkJobTableWaitDo
       modal.base({ sbId: this.model.id }, { sbId: this.model.id, status: 1 })
+    },
+    handleTuiCalendar () {
+      queryTuiCalendarIgnores({ sbId: this.model.id, type: 2 }).then(res => {
+        const a = document.createElement('a')
+        a.href = '/tui-calendar/example00-basic.html?'
+        localStorage.setItem('calendarList', JSON.stringify(res.data.calendarList))
+        localStorage.setItem('scheduleList', JSON.stringify(res.data.scheduleList))
+        a.target = '_blank'
+        a.click()
+      })
     }
   }
 }

+ 116 - 0
src/views/sb/info/modules/ParamForm.vue

@@ -0,0 +1,116 @@
+<template>
+  <a-modal
+    :title="modalTitle"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @cancel="handleCancel"
+  >
+    <a-form :form="form">
+      <row-list :col="2">
+        <row-item>
+          <a-form-item
+            label="参数名称"
+            :labelCol="BaseTool.Constant.labelCol"
+            :wrapperCol="BaseTool.Constant.wrapperCol"
+          >
+            <a-input
+              v-decorator="['name']"/>
+          </a-form-item>
+        </row-item>
+      </row-list>
+      <row-list :col="1">
+        <row-item>
+          <a-form-item
+            label="参数内容"
+            :labelCol="BaseTool.Constant.labelCol2"
+            :wrapperCol="BaseTool.Constant.wrapperCol2"
+          >
+            <a-textarea
+              :rows="4"
+              v-decorator="['content']"/>
+          </a-form-item>
+        </row-item>
+      </row-list>
+    </a-form>
+    <template slot="footer">
+      <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
+    </template>
+  </a-modal>
+</template>
+
+<script>
+import { dispatchModelByDTO } from '@/api/repair/application-form'
+import { queryUserDept } from '@/api/upms/user-dept'
+import { queryUser } from '@/api/upms/user'
+
+export default {
+  name: 'DispatchBaseForm',
+  data () {
+    return {
+      confirmLoading: false,
+      modalTitle: null,
+      form: this.$form.createForm(this),
+      visible: false,
+      // 下拉框map
+      sourceMap: {},
+      levelMap: {},
+      statusMap: {},
+      record: {},
+      userList: [],
+      deptUserList: []
+    }
+  },
+  props: {
+  },
+  created () {
+    // 下拉框map
+    this.sourceMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_SOURCE)
+    this.levelMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_LEVEL)
+    this.statusMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REPAIR_APPLICATION_FORM_STATUS)
+    this.getUsers()
+    this.getDeptUsers()
+  },
+  methods: {
+    base (record) {
+      this.visible = true
+      // 如果是空标识添加
+      this.modalTitle = '派工'
+      this.record = record
+    },
+    getDeptUsers () {
+      queryUserDept({ deptCode: this.DictCache.VALUE.SYS_DEPT_CODE.XIAN_CHANG_WEI_XIU_ZU, userStatus: 1 }).then(res => {
+        queryUserDept({ deptCode: this.DictCache.VALUE.SYS_DEPT_CODE.CHANG_NEI_WEI_XIU_ZU, userStatus: 1 }).then(res2 => {
+          this.deptUserList = res.data.concat(res2.data)
+        })
+      })
+    },
+    getUsers () {
+      queryUser({ status: 1 }).then(res => {
+        this.userList = res.data
+      })
+    },
+    save () {
+      const { form: { validateFieldsAndScroll } } = this
+      this.confirmLoading = true
+      validateFieldsAndScroll((errors, values) => {
+        if (errors) {
+          this.confirmLoading = false
+          return
+        }
+        this.handleCancel(values)
+      })
+    },
+    handleCancel (values) {
+      this.visible = false
+      this.confirmLoading = false
+      this.form.resetFields()
+      console.log(values)
+      if (this.BaseTool.Object.isNotBlank(values)) {
+        console.log(values)
+        this.$emit('ok', values)
+      }
+    }
+  }
+}
+</script>

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.