Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 KB | None | 0 0
  1. import React, { useContext, useState, useEffect } from 'react';
  2. import { Store } from '../../../../store/Store';
  3. import './style.scss';
  4. import {
  5. updateSelectedTickets,
  6. toggleRespondModal,
  7. toggleReopenModal,
  8. toggleClosedTickets,
  9. updateSortedDocs,
  10. updateSortCriterion
  11. } from '../../../../store/actions';
  12. import { sortDocsBy } from '../../../../utils/sortDocsBy';
  13. import { stripDivisionPrefix } from '../../../../utils/stripDivisionPrefix';
  14. import { SortBySelect } from '../SortBySelect';
  15.  
  16. export const DrawerHeader = ({ docs, isFolderDrawerVisible }) => {
  17. const { state, dispatch } = useContext(Store);
  18.  
  19. const {
  20. selectedTickets,
  21. closedTicketsVisible,
  22. ticketDetail,
  23. division,
  24. folder,
  25. ticketGroupLabel
  26. } = state;
  27.  
  28. const [allTicketsSelected, toggleAllTicketsSelected] = useState(false);
  29.  
  30. useEffect(() => {
  31. if (!isFolderDrawerVisible || selectedTickets.length === 0)
  32. toggleAllTicketsSelected(false);
  33. }, [isFolderDrawerVisible, selectedTickets]);
  34.  
  35. const handleSelectAllClick = () => {
  36. const toggled = !allTicketsSelected;
  37. toggleAllTicketsSelected(toggled);
  38. if (toggled === true) {
  39. const ids = docs.map(({ id }) => id);
  40. updateSelectedTickets(ids, dispatch);
  41. } else {
  42. updateSelectedTickets([], dispatch);
  43. }
  44. };
  45.  
  46. const handleSortByChange = ({ value }, docs) => {
  47. const updatedSortOrder = sortDocsBy(docs, value);
  48. updateSortedDocs(updatedSortOrder, dispatch);
  49. updateSortCriterion(value, dispatch);
  50. };
  51.  
  52. const handleOpenOrClose = e => {
  53. updateSortedDocs([], dispatch);
  54. toggleClosedTickets(e.target.getAttribute('name') === 'closed', dispatch);
  55. };
  56.  
  57. const folderAbbrev = folder.label
  58. ? stripDivisionPrefix(division.label, folder.label).substring(0, 2)
  59. : '';
  60.  
  61. const responseTypesArray = selectedTickets.reduce((array, ticket) => {
  62. const ticketDoc = ticketDetail
  63. ? ticketDetail
  64. : state.allDocs.find(doc => doc.doc && doc.id === ticket);
  65. let responseType = ticketDetail ? ticketDoc.docType : ticketDoc.doc.docType;
  66.  
  67. if (responseType === 'fieldMeet') {
  68. responseType = (ticketDetail
  69. ? ticketDoc.fieldMeetScheduledDate
  70. : ticketDoc.doc.fieldMeetScheduledDate)
  71. ? 'scheduledFieldMeet'
  72. : 'unscheduledFieldMeet';
  73. }
  74.  
  75. if (!array.includes(responseType)) {
  76. array.push(responseType);
  77. }
  78. return array;
  79. }, []);
  80.  
  81. let validResponseType;
  82. if (responseTypesArray.length === 1) {
  83. switch (responseTypesArray[0]) {
  84. case 'scheduledFieldMeet':
  85. validResponseType = 'Complete';
  86. break;
  87. case 'unscheduledFieldMeet':
  88. validResponseType = 'Schedule';
  89. break;
  90. case 'ticket':
  91. validResponseType = 'Respond';
  92. break;
  93. case 'standby':
  94. validResponseType = 'Schedule';
  95. break;
  96. default:
  97. validResponseType = null;
  98. }
  99. }
  100.  
  101. return (
  102. <div className="drawer-header-wrapper">
  103. <div className="ticket-group-label">{ticketGroupLabel}</div>
  104. {selectedTickets.length > 0 ? (
  105. <div className="selected-tickets-display-info-container">
  106. <div className="selected-tickets-count-container">
  107. <h2>+{selectedTickets.length}</h2>
  108. <h4>Ticket{selectedTickets.length > 1 ? 's' : ''} Selected</h4>
  109. </div>
  110. <div className={'action-button-container'}>
  111. <button
  112. className="cancel-button"
  113. type="button"
  114. onClick={() => updateSelectedTickets([], dispatch)}
  115. >
  116. Cancel
  117. </button>
  118. {closedTicketsVisible ? (
  119. <>
  120. <button
  121. type="button"
  122. onClick={() => toggleReopenModal(true, dispatch)}
  123. >
  124. Reopen
  125. </button>
  126. <button
  127. type="button"
  128. onClick={() => toggleRespondModal(true, dispatch)}
  129. >
  130. Append
  131. </button>
  132. </>
  133. ) : (
  134. <>
  135. {/*TODO uncomment once IRTH cutover is complete*/}
  136. {/*<button type="button" onClick={() => toggleMoveModal(true, dispatch)}>Move</button>*/}
  137. {validResponseType && (
  138. <button
  139. className="valid-response-type-button"
  140. type="button"
  141. onClick={() => toggleRespondModal(true, dispatch)}
  142. >
  143. {validResponseType}
  144. </button>
  145. )}
  146. </>
  147. )}
  148. </div>
  149. </div>
  150. ) : (
  151. <div className="unselected-tickets-display-info-container">
  152. <div className="division-and-folder-container">
  153. <div className="folder-letters">
  154. <p>{folderAbbrev}</p>
  155. </div>
  156. <div className="folder-name">{folder.label}</div>
  157. </div>
  158. <div className="open-closed-button-container">
  159. <div onClick={handleOpenOrClose}>
  160. <p className={closedTicketsVisible ? '' : 'selected'}>Open</p>
  161. </div>
  162. <div name="closed" onClick={handleOpenOrClose}>
  163. <p
  164. name="closed"
  165. className={closedTicketsVisible ? 'selected' : ''}
  166. >
  167. Closed
  168. </p>
  169. </div>
  170. </div>
  171. </div>
  172. )}
  173. <div className="drawer-filter-selector">
  174. <SortBySelect
  175. docs={docs}
  176. onChange={val => handleSortByChange(val, docs)}
  177. />
  178. <div className="select-all" onClick={handleSelectAllClick}>
  179. {allTicketsSelected ? 'Deselect All' : 'Select All'}
  180. </div>
  181. </div>
  182. </div>
  183. );
  184. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement