Advertisement
Guest User

Untitled

a guest
Apr 2nd, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React from 'react'
  2. import { Calendar, Views, momentLocalizer } from 'react-big-calendar'
  3. import {Drawer, Row, Col, Collapse } from 'antd';
  4. import { MenuOutlined, UpOutlined ,DownOutlined, LeftOutlined, RightOutlined, FilterOutlined, PlusCircleOutlined} from '@ant-design/icons';
  5. import toolbar from 'react-big-calendar/lib/Toolbar';
  6. import FilterView from '../shared/FilterView';
  7. import moment from 'moment'
  8. import events from './DummyEvent'
  9.  
  10. import 'antd/dist/antd.css';
  11. import 'react-big-calendar/lib/css/react-big-calendar.css'
  12. import './CustomCalendarStyle.css'
  13. import AddJobView from '../shared/AddJobView';
  14.  
  15. const { Panel } = Collapse;
  16. const propTypes = {}
  17.  
  18. const MonthEvent = ({event}) => (
  19.   <div className={`custom-calendar_event month ${event.status}`}>
  20.     <p className="title">{event.title}</p>
  21.   </div>
  22. );
  23.  
  24. const DayEvent = ({event}) => (
  25.   <div className={`custom-calendar_event day ${event.status}`}  onClick={() => {alert('event.title')}}>
  26.     <p className="title">{event.title}</p>
  27.     <p className="location">{event.location}</p>
  28.   </div>
  29. );
  30.  
  31. const ScheduleEvent = ({event}) => (
  32.   <div className={`custom-calendar_event schedule ${event.status}`}  onClick={() => {alert('event.title')}}>
  33.     <p className="title">{event.title}</p>
  34.     <p className="location">{event.location}</p>
  35.   </div>
  36. );
  37.  
  38. const MiniMonthEvent = ({event}) => (
  39.   <div className={`custom-mini_calendar_event ${event.status}`}>
  40.     {/* <div className="event-dot"></div> */}
  41.   </div>
  42. );
  43.  
  44. const headerMarkup = () => (
  45.   <div className="header-container">
  46.     <Row className="main-control">
  47.       <Col className="head-container" span={12}>
  48.         <div className="icon">
  49.           <a onClick={this.showDrawer}><MenuOutlined /></a>
  50.         </div>
  51.         <div className="title">
  52.           <a onClick={this.openHeaderOption}>{this.state.selectedMonth} <i>{this.state.openHeaderOption ? <UpOutlined />:<DownOutlined />}</i> </a>
  53.         </div>
  54.       </Col>
  55.       <Col className="option-container" span={12}>
  56.         <a onClick={this.setFilterVisible(true)}><FilterOutlined /></a>
  57.         <a onClick={this.showDrawer}><MenuOutlined /></a>
  58.         <a onClick={this.setAddJobVisible(true)}><PlusCircleOutlined /></a>
  59.       </Col>
  60.     </Row>
  61.   </div>
  62. );
  63.  
  64.  
  65. const CustomToolbar = (toolbar) => {
  66.   const goToBack = () => {
  67.     toolbar.date.setMonth(toolbar.date.getMonth() - 1);
  68.     toolbar.onNavigate('prev');
  69.   };
  70.  
  71.   const goToNext = () => {
  72.     toolbar.date.setMonth(toolbar.date.getMonth() + 1);
  73.     toolbar.onNavigate('next');
  74.   };
  75.  
  76.   const goToCurrent = () => {
  77.     const now = new Date();
  78.     toolbar.date.setMonth(now.getMonth());
  79.     toolbar.date.setYear(now.getFullYear());
  80.     toolbar.onNavigate('current');
  81.   };
  82.  
  83.   return (
  84.     <div className={['toolbar-container']} style={{display:'none'}}>
  85.       <div className={['back-next-buttons']}>
  86.         <button id="toolbar_btn-back" className={['toolbar_btn-back']} onClick={goToBack}>&#8249;</button>
  87.         <button id="toolbar_btn-current" className={['toolbar_btn-current']} onClick={goToCurrent}>today</button>
  88.         <button id="toolbar_btn-next" className={['toolbar_btn-next']} onClick={goToNext}>&#8250;</button>
  89.       </div>
  90.     </div >
  91.   );
  92. };
  93.  
  94.  
  95. class Selectable extends React.Component {
  96.   constructor(props) {
  97.     super(props);
  98.  
  99.     this.state = {
  100.       events,
  101.       selectedMonth: moment(new Date()).format('MMMM'),
  102.       prevMonth: moment(new Date()).add(-1, 'months').format('MMM'),
  103.       nextMonth: moment(new Date()).add(+1, 'months').format('MMM'),
  104.       openHeaderOption : true,
  105.       filterVisible: false,
  106.       addJobVisible: false,
  107.     }
  108.   }
  109.  
  110.   componentDidMount() {
  111.     //แก้บักการเลื่อนเดือนที่ต้องกดเปล่าๆก่อนทีนึงถึงจะทำงานได้ (ยังไม่ได้หาคำตอบ)
  112.     this.customChangeMonth('next')
  113.  }
  114.  
  115.   customChangeMonth = (action) =>{
  116.     let el = document.getElementsByClassName(`toolbar_btn-${action}`);
  117.     for (var i=0;i<el.length; i++) {
  118.         el[i].click();
  119.     }
  120.   }
  121.  
  122.   selectedDate = (date,event) =>{
  123.     this.setState({ selectedDate: date})
  124.     console.log(event)
  125.   }
  126.  
  127.   onNavigate = (date) => {
  128.     this.setState({
  129.       selectedMonth: moment(date).format('MMMM'),
  130.       prevMonth: moment(date).add(-1, 'months').format('MMM'),
  131.       nextMonth: moment(date).add(+1, 'months').format('MMM'),
  132.     });
  133.    
  134.   }
  135.  
  136.   changeCalendarView = (view) => {
  137.     this.setState({ views: view})
  138.   }
  139.  
  140.   showDrawer = () => {
  141.     this.setState({
  142.       drawerVisible: true,
  143.     });
  144.   };
  145.  
  146.   overflowY = document.getElementsByTagName('body')[0].style.msOverflowStyle;
  147.   setFilterVisible = (visible = false) => () => {
  148.     document.getElementsByTagName('body')[0].style.overflowY = visible ? 'hidden' : this.overflowY;
  149.     this.setState({
  150.       filterVisible: visible,
  151.     });
  152.   };
  153.  
  154.   setAddJobVisible = (visible = false) => () => {
  155.     document.getElementsByTagName('body')[0].style.overflowY = visible ? 'hidden' : this.overflowY;
  156.     this.setState({
  157.       addJobVisible: visible,
  158.     });
  159.   };
  160.  
  161.   onClose = () => {
  162.     this.setState({
  163.       drawerVisible: false,
  164.     });
  165.   };
  166.  
  167.   createJob = ({ start, end }) => {
  168.     const title = window.prompt('New Event name')
  169.     let {date} = this.props;
  170.  
  171.     if (title)
  172.       this.setState({
  173.         events: [
  174.           ...this.state.events,
  175.           {
  176.             start,
  177.             end,
  178.             title,
  179.           },
  180.         ],
  181.       })
  182.   }
  183.  
  184.   openHeaderOption = () => {
  185.     this.setState({
  186.       openHeaderOption: !this.state.openHeaderOption,
  187.     });
  188.   }
  189.  
  190.  
  191.   render() {
  192.     return (
  193.       <div>
  194.       <Drawer
  195.               title="Menu"
  196.               placement="left"
  197.               closable={true}
  198.               onClose={this.onClose}
  199.               visible={this.state.drawerVisible}
  200.         />
  201.       <Drawer
  202.         title="Filter"
  203.         placement="bottom"
  204.         onClose={this.setFilterVisible(false)}
  205.         visible={this.state.filterVisible}
  206.         height={"100%"}
  207.       >
  208.         <FilterView {...this.props}/>
  209.       </Drawer>
  210.       <Drawer
  211.         title="Create Job"
  212.         placement="right"
  213.         onClose={this.setAddJobVisible(false)}
  214.         visible={this.state.addJobVisible}
  215.         width={"100%"}
  216.       >
  217.         <AddJobView {...this.props}/>
  218.       </Drawer>
  219.       <Collapse
  220.           bordered={false}
  221.           defaultActiveKey={['1']}
  222.           className="site-collapse-custom-collapse">
  223.           <Panel header={this.headerMarkup()} key="1" className="site-collapse-custom-panel">
  224.             <div>
  225.               <Row className="view-control">
  226.                 <Col className="prev_month" span={6}> <a onClick={() => this.customChangeMonth('back')}><LeftOutlined />{this.state.prevMonth}</a></Col>
  227.                 <Col className="calendar_view" span={12}>
  228.                   <ul>
  229.                     <li>
  230.                       <a onClick={() => this.changeCalendarView('agenda')}><MenuOutlined />Schedule</a>                                          
  231.                     </li>
  232.                     <li>                
  233.                       <a onClick={() => this.changeCalendarView('day')}><MenuOutlined />Day</a>                            
  234.                     </li>
  235.                     <li>            
  236.                       <a onClick={() => this.changeCalendarView('month')}><MenuOutlined />Month</a>              
  237.                     </li>
  238.                   </ul>
  239.                 </Col>
  240.                 <Col className="next_month" span={6}><a onClick={() => this.customChangeMonth('next')}>{this.state.nextMonth}<RightOutlined /></a></Col>
  241.               </Row>
  242.                 <div className="mini_calendar-container">
  243.                   <Calendar
  244.                     localizer={momentLocalizer(moment)}
  245.                     events={this.state.events}
  246.                     className="mini_calendar"
  247.                     view={'month'}
  248.                     date={new Date(moment(this.state.selectedDate).format())}
  249.                     startAccessor="start"
  250.                     endAccessor="end"
  251.                     popup={true}
  252.                     defaultView={Views.MONTH}
  253.                     components={{
  254.                       toolbar: CustomToolbar,
  255.                       month: {
  256.                         event: MiniMonthEvent,
  257.                         dateHeader: ({ date, label }) => {
  258.                           let highlightDate =
  259.                             events.find(event =>
  260.                               moment(date).isBetween(
  261.                                 moment(event.start),
  262.                                 moment(event.end),
  263.                                 null,
  264.                                 "[]"
  265.                               )
  266.                             ) != undefined;
  267.                           return (
  268.                             <p onClick={() => this.selectedDate(date)} className={highlightDate ? 'haveEvent' : ''}>{label}</p>
  269.                           );
  270.                         }
  271.                       },
  272.                     }}
  273.                   />
  274.                 </div>
  275.           </div>
  276.           </Panel>
  277.         </Collapse>
  278.           <Calendar
  279.             selectable
  280.             localizer={momentLocalizer(moment)}
  281.             events={this.state.events}
  282.             view={this.state.views || 'agenda'}
  283.             startAccessor="start"
  284.             endAccessor="end"
  285.             popup={true}
  286.             date={new Date(moment(this.state.selectedDate).format())}
  287.             defaultView={Views.MONTH}
  288.             onSelectEvent={event => alert(event.title)}
  289.             onSelectSlot={this.createJob}
  290.             onNavigate={this.onNavigate}
  291.            
  292.             components={{
  293.               agenda: { event: ScheduleEvent },
  294.               day: { event: DayEvent },
  295.               month: { event: MonthEvent },
  296.               toolbar: CustomToolbar
  297.             }}
  298.           />
  299.  
  300.  
  301.       </div>
  302.     )
  303.   }
  304.  
  305. }
  306.  
  307.  
  308. Selectable.propTypes = propTypes
  309.  
  310. export default Selectable
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement