calendar.view.js 5.4 KB

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