calendar.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <template>
  2. <div class="demo-app">
  3. <FullCalendar
  4. ref="fullCalendar"
  5. locale="zh-cn"
  6. firstDay="1"
  7. :defaultDate="defaultDate"
  8. weekNumberCalculation="ISO"
  9. :header="{
  10. left: 'prev',
  11. center: 'title',
  12. right: 'today ,next',
  13. }"
  14. :button-text="{
  15. today: '今天',
  16. }"
  17. :valid-range="{
  18. start: rangeStart,
  19. end: rangeEnd,
  20. }"
  21. :slot-event-overlap="false"
  22. defaultView="dayGridMonth"
  23. :plugins="calendarPlugins"
  24. :selectable="true"
  25. :events="events"
  26. @select="drawSelect"
  27. :eventOrder="`start`"
  28. @eventClick="clickEvent"
  29. />
  30. <el-dialog :visible.sync="dialog" :title="addTitle" center @close="toClose">
  31. <el-form :model="form" label-width="80px" size="mini">
  32. <el-form-item label="时间"> {{ form.start }} 至 {{ form.end }} </el-form-item>
  33. <el-form-item label="期数">
  34. <el-input v-model="form.qishu"></el-input>
  35. </el-form-item>
  36. <el-form-item label="批次">
  37. <el-input v-model="form.pici"></el-input>
  38. </el-form-item>
  39. <el-form-item label="是否全天">
  40. <el-checkbox v-model="form.isAllDay"></el-checkbox>
  41. </el-form-item>
  42. <el-form-item label="上/下午" v-if="!form.isAllDay">
  43. <el-radio-group v-model="form.isMorning">
  44. <el-radio label="0">上午</el-radio>
  45. <el-radio label="1">下午</el-radio>
  46. </el-radio-group>
  47. </el-form-item>
  48. <el-form-item>
  49. <el-button @click="toSave">保存</el-button>
  50. </el-form-item>
  51. </el-form>
  52. </el-dialog>
  53. </div>
  54. </template>
  55. <script>
  56. import FullCalendar from '@fullcalendar/vue';
  57. import dayGridPlugin from '@fullcalendar/daygrid';
  58. import interactionPlugin from '@fullcalendar/interaction';
  59. import _ from 'lodash';
  60. export default {
  61. props: {
  62. year: { type: String, default: `${new Date().getFullYear()}` }, //当前日历的年份
  63. events: { type: Array, default: () => [] },
  64. },
  65. components: {
  66. FullCalendar, // make the <FullCalendar> tag available
  67. },
  68. data: function() {
  69. return {
  70. form: { isAllDay: true },
  71. dialog: false,
  72. calendarPlugins: [
  73. // plugins must be defined in the JS
  74. dayGridPlugin,
  75. // timeGridPlugin,
  76. interactionPlugin, // needed for dateClick
  77. ],
  78. // calendarEvents: [],
  79. planList: [],
  80. addTitle: '',
  81. };
  82. },
  83. methods: {
  84. handleDateClick(arg) {
  85. console.log(arg);
  86. this.dialog = true;
  87. // let calendarApi = this.$refs.fullCalendar.getApi();
  88. },
  89. drawSelect(arg) {
  90. // this.dialog = true;
  91. // let { startStr, endStr } = arg;
  92. // this.form.start = startStr;
  93. // this.form.end = endStr;
  94. // this.addTitle = '新增计划安排';
  95. this.$emit('draft', arg);
  96. },
  97. toSave() {
  98. //处理数据
  99. let data = {
  100. title: `第${JSON.parse(JSON.stringify(this.form.qishu))}期第${JSON.parse(JSON.stringify(this.form.pici))}批次`,
  101. start: JSON.parse(JSON.stringify(this.form.start)),
  102. end: JSON.parse(JSON.stringify(this.form.end)),
  103. qishu: parseInt(JSON.parse(JSON.stringify(this.form.qishu))),
  104. pici: parseInt(JSON.parse(JSON.stringify(this.form.pici))),
  105. isAllDay: JSON.parse(JSON.stringify(this.form.isAllDay)),
  106. };
  107. if (this.form.isMorning) {
  108. data.isMorning = JSON.parse(JSON.stringify(this.form.isMorning));
  109. JSON.parse(JSON.stringify(this.form.isMorning)) === '0' ? (data.title = `上午 ${data.title}`) : (data.title = `下午 ${data.title}`);
  110. }
  111. //添加/修改
  112. if (!this.form.id) {
  113. data.id = new Date().getTime();
  114. this.calendarEvents.push(data);
  115. } else {
  116. data.id = JSON.parse(JSON.stringify(this.form.id));
  117. this.$set(
  118. this.calendarEvents,
  119. _.findIndex(this.calendarEvents, item => item.id == data.id),
  120. data
  121. );
  122. }
  123. //先排批次,再排期数=>期数优先级最高,其次是批次
  124. //优先级高的后排,低的先排
  125. let mid = _.sortBy(this.calendarEvents, item => item.pici);
  126. mid = _.sortBy(this.calendarEvents, item => item.qishu);
  127. this.$set(this, `calendarEvents`, mid);
  128. this.toClose();
  129. },
  130. toClose() {
  131. this.form = { isAllDay: true };
  132. this.dialog = false;
  133. },
  134. clickEvent(arg) {
  135. // let event = arg.event;
  136. // let arr = this.calendarEvents.filter(fil => fil.id == event.id);
  137. // if (arr.length > 0) this.form = arr[0];
  138. // else {
  139. // console.warn(`无对应id事件`);
  140. // return;
  141. // }
  142. // this.dialog = true;
  143. // this.addTitle = `修改计划安排`;
  144. this.$emit('eventClick', arg);
  145. },
  146. },
  147. computed: {
  148. defaultDate() {
  149. return `${this.year}-01-01`;
  150. },
  151. rangeStart() {
  152. return `${this.year}-01-01`;
  153. },
  154. rangeEnd() {
  155. return `${this.year}-12-31`;
  156. },
  157. },
  158. };
  159. </script>
  160. <style lang="less">
  161. @import '~@fullcalendar/core/main.css';
  162. @import '~@fullcalendar/daygrid/main.css';
  163. </style>