calendar.view.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import React, { Component } from "react";
  2. import ContentWrapper from "@/components/Layout/ContentWrapper";
  3. import { Card, CardBody, CardHeader, CardTitle } from "reactstrap";
  4. import { updateJadwal } from "../../actions/penjadwalan";
  5. import { getPelaporan } from "../../actions/pelaporan";
  6. import FullCalendar from "@fullcalendar/react";
  7. import dayGridPlugin from "@fullcalendar/daygrid";
  8. import timeGridPlugin from "@fullcalendar/timegrid";
  9. import interactionPlugin, { Draggable } from "@fullcalendar/interaction";
  10. import listPlugin from "@fullcalendar/list";
  11. import bootstrapPlugin from "@fullcalendar/bootstrap";
  12. import events from "./calendar.events";
  13. class Calendar extends Component {
  14. calendarEvents = events;
  15. calendarPlugins = [interactionPlugin, dayGridPlugin, timeGridPlugin, listPlugin, bootstrapPlugin];
  16. calendarHeader = {
  17. left: "prev,next today",
  18. center: "title",
  19. right: "dayGridMonth,timeGridWeek,timeGridDay,listWeek",
  20. };
  21. constructor(props) {
  22. super(props);
  23. this.state = {
  24. selectedEvent: null,
  25. evRemoveOnDrop: true,
  26. evNewName: "",
  27. externalEvents: [],
  28. dataLaporan: [],
  29. dataEvent: [],
  30. };
  31. }
  32. async componentDidMount() {
  33. /* initialize the external events */
  34. new Draggable(this.refs.externalEventsList, {
  35. itemSelector: ".fce-event",
  36. eventData: function (eventEl) {
  37. return {
  38. title: eventEl.innerText.trim(),
  39. };
  40. },
  41. });
  42. // await this.fetchData();
  43. const pelaporan = await getPelaporan();
  44. this.setState({ dataLaporan: pelaporan });
  45. this.getDataEvent();
  46. const cek = this.state.dataLaporan.data.filter((e) => e._number === this.props.query.number && e.pt_id == this.props.query.ptId)[0];
  47. let color = "#" + Math.floor(Math.random() * 16777215).toString(16);
  48. if (cek.penjadwalan) {
  49. color = cek.penjadwalan.background_color;
  50. }
  51. this.setState({ externalEvents: [{ id: this.props.query.number, color: color, name: "Jadwal Pemeriksaan - BI:" + this.props.query.number }] });
  52. }
  53. getDataEvent = () => {
  54. const dataEvent = this.state.dataLaporan.data
  55. .filter((e) => e.penjadwalan)
  56. .map((e) => ({
  57. title: e.penjadwalan.title,
  58. start: new Date(e.penjadwalan.from_date),
  59. end: new Date(e.penjadwalan.to_date),
  60. backgroundColor: e.penjadwalan.background_color, //red
  61. borderColor: e.penjadwalan.background_color,
  62. }));
  63. this.setState({ dataEvent });
  64. };
  65. dayClick = (date) => {
  66. this.setState({
  67. selectedEvent: {
  68. date: date.dateStr,
  69. },
  70. });
  71. };
  72. addEvent(event) {
  73. this.calendarEvents.push(event);
  74. }
  75. handleEventReceive = (info) => {
  76. var styles = getComputedStyle(info.draggedEl);
  77. info.event.setProp("backgroundColor", styles.backgroundColor);
  78. info.event.setProp("borderColor", styles.borderColor);
  79. this.handleEventCalendar(info);
  80. };
  81. handleEventCalendar = async ({ event }) => {
  82. const number = this.props.query.number;
  83. const ptId = this.props.query.ptId;
  84. const data = {
  85. title: event.title,
  86. from_date: event.start,
  87. to_date: event.end || event.start,
  88. background_color: event.backgroundColor,
  89. };
  90. const update = await updateJadwal({ number, ptId }, data);
  91. console.log(update);
  92. };
  93. render() {
  94. const { externalEvents, selectedEvent } = this.state;
  95. return (
  96. <ContentWrapper>
  97. <div className="content-heading">
  98. <div>
  99. Jadwal Pemeriksaan
  100. <small>Format pembuatan jadwal pemeriksaan v.0.1</small>
  101. </div>
  102. </div>
  103. <div className="calendar-app">
  104. <div className="row">
  105. <div className="col-xl-3 col-lg-4">
  106. <div className="row">
  107. <div className="col-lg-12 col-md-6 col-12">
  108. <Card className="card-default" title="">
  109. <CardHeader>
  110. <CardTitle tag="h4">Daftar Pemeriksaan</CardTitle>
  111. </CardHeader>
  112. <CardBody>
  113. <div className="external-events" ref="externalEventsList">
  114. {externalEvents.map((ev) => (
  115. <div
  116. className="fce-event"
  117. style={{
  118. backgroundColor: ev.color,
  119. }}
  120. key={ev.name + ev.color}
  121. data-id={ev.id}
  122. >
  123. {ev.name}
  124. </div>
  125. ))}
  126. </div>
  127. </CardBody>
  128. </Card>
  129. </div>
  130. </div>
  131. <div className="mb-3">
  132. {selectedEvent && (
  133. <div>
  134. <p>Selected:</p>
  135. <div className="box-placeholder">{JSON.stringify(selectedEvent)}</div>
  136. </div>
  137. )}
  138. {!selectedEvent && (
  139. <div>
  140. <p>Click calendar to show information</p>
  141. </div>
  142. )}
  143. </div>
  144. </div>
  145. <div className="col-xl-9 col-lg-8">
  146. <Card className="card-default">
  147. <CardBody>
  148. {/* START calendar */}
  149. <FullCalendar
  150. defaultView={this.dayGridMonth}
  151. plugins={this.calendarPlugins}
  152. events={this.state.dataEvent}
  153. themeSystem={"bootstrap"}
  154. header={this.calendarHeader}
  155. editable={true}
  156. droppable={true}
  157. deepChangeDetection={true}
  158. dateClick={this.dayClick}
  159. eventReceive={this.handleEventReceive}
  160. eventDrop={this.handleEventCalendar}
  161. eventResize={this.handleEventCalendar}
  162. ></FullCalendar>
  163. </CardBody>
  164. </Card>
  165. </div>
  166. </div>
  167. </div>
  168. </ContentWrapper>
  169. );
  170. }
  171. }
  172. export default Calendar;