|
1 | 1 | import React, { useState, useEffect } from 'react' |
2 | 2 | import ReviewFilesFilters from './Widgets/ReviewFilesFilters' |
| 3 | +import ToggleSwitch from './Widgets/ToggleSwitch' |
3 | 4 | import SortableTable from './Widgets/SortableTable' |
4 | 5 | import FileFixitWidget from './Widgets/FileFixitWidget' |
5 | 6 | import FileReviewPreview from './Widgets/FileReviewPreview' |
@@ -106,7 +107,7 @@ export default function ReviewFilesPage({ |
106 | 107 | const [showLearnMore, setShowLearnMore] = useState(false) |
107 | 108 |
|
108 | 109 | const [unusedFiles, setUnusedFiles] = useState([]) |
109 | | - const [fileDeleteQueue, setFileDeleteQueue] = useState([]) |
| 110 | + const [deleteFileQueue, setDeleteFileQueue] = useState([]) |
110 | 111 |
|
111 | 112 |
|
112 | 113 | const formatFileData = (fileData) => { |
@@ -240,12 +241,14 @@ export default function ReviewFilesPage({ |
240 | 241 | for (const [key, value] of Object.entries(tempFiles)) { |
241 | 242 | let tempFile = formatFileData(value) |
242 | 243 | tempUnfilteredIssues.push(tempFile) |
243 | | - if(!tempFile?.fileData?.references || tempFile?.fileData?.references?.length == 0){ |
| 244 | + if((!tempFile?.fileData?.references || tempFile?.fileData?.references?.length === 0) |
| 245 | + && (!tempFile?.fileData?.sectionRefs || tempFile?.fileData?.sectionRefs?.length === 0)) { |
244 | 246 | tempUnusedFiles.push(tempFile.fileData) |
245 | 247 | } |
246 | 248 | } |
247 | 249 |
|
248 | | - console.log(tempUnusedFiles) |
| 250 | + setUnusedFiles(tempUnusedFiles) |
| 251 | + setDeleteFileQueue((oldQueue) => oldQueue.filter((fileId) => tempUnusedFiles.some((file) => file.id === fileId))) |
249 | 252 |
|
250 | 253 | tempUnfilteredIssues.sort((a, b) => { |
251 | 254 | return (a.formLabel.toLowerCase() < b.formLabel.toLowerCase()) ? -1 : 1 |
@@ -379,6 +382,28 @@ export default function ReviewFilesPage({ |
379 | 382 | } |
380 | 383 | } |
381 | 384 |
|
| 385 | + const toggleDeleteFileQueue = (fileId) => { |
| 386 | + if(!fileId) { |
| 387 | + return |
| 388 | + } |
| 389 | + |
| 390 | + setDeleteFileQueue((oldQueue) => { |
| 391 | + if(oldQueue.includes(fileId)) { |
| 392 | + return oldQueue.filter((id) => id !== fileId) |
| 393 | + } |
| 394 | + return [...oldQueue, fileId] |
| 395 | + }) |
| 396 | + } |
| 397 | + |
| 398 | + const updateSelectAllUnusedFilesToggle = (newValue) => { |
| 399 | + if(newValue === false) { |
| 400 | + setDeleteFileQueue([]) |
| 401 | + return |
| 402 | + } |
| 403 | + |
| 404 | + setDeleteFileQueue(unusedFiles.map((file) => file.id)) |
| 405 | + } |
| 406 | + |
382 | 407 | const getFileTypeDisplay = (fileType) => { |
383 | 408 | const fileTypeText = t(`label.mime.${fileType}`) |
384 | 409 |
|
@@ -935,6 +960,8 @@ const getSectionPostOptions = (newFile, sectionReferences) => { |
935 | 960 | } |
936 | 961 | } |
937 | 962 |
|
| 963 | + const allUnusedFilesSelected = unusedFiles.length > 0 && deleteFileQueue.length === unusedFiles.length |
| 964 | + |
938 | 965 | return ( |
939 | 966 | <> |
940 | 967 | { widgetState === WIDGET_STATE.LOADING ? ( |
@@ -1079,7 +1106,61 @@ const getSectionPostOptions = (newFile, sectionReferences) => { |
1079 | 1106 | <div className='flex-column h-100'> |
1080 | 1107 | <div className='dialog-header'> |
1081 | 1108 | <h2>{t('files.button.delete_unused_files')}</h2> |
1082 | | - <CloseIcon onClick={() => closeDialog(unusedFileDialogId)} onKeyDown={(e) => e.key == "Enter" ? () => closeDialog(unusedFileDialogId) : ""} className="close-icon icon-lg" tabIndex="0" alt={t('fix.button.close')} title={t('fix.button.close')} /> |
| 1109 | + <CloseIcon onClick={() => closeDialog(unusedFileDialogId)} onKeyDown={(e) => e.key == "Enter" ? closeDialog(unusedFileDialogId) : ""} className="close-icon icon-lg" tabIndex="0" alt={t('fix.button.close')} title={t('fix.button.close')} /> |
| 1110 | + </div> |
| 1111 | + <div className="dialog-content"> |
| 1112 | + <div className="unused-files-list-container"> |
| 1113 | + {unusedFiles.length > 0 && ( |
| 1114 | + <div className="select-all-unused-toggle-row"> |
| 1115 | + <ToggleSwitch |
| 1116 | + key={allUnusedFilesSelected ? 'select-all-on' : 'select-all-off'} |
| 1117 | + labelId="selectAllUnusedFiles" |
| 1118 | + initialValue={allUnusedFilesSelected} |
| 1119 | + updateToggle={updateSelectAllUnusedFilesToggle} |
| 1120 | + small={true} |
| 1121 | + /> |
| 1122 | + <div id="selectAllUnusedFiles" className="align-self-center subtext"> |
| 1123 | + {t('files.label.select_all_unused_files')} |
| 1124 | + </div> |
| 1125 | + </div> |
| 1126 | + )} |
| 1127 | + {unusedFiles.length === 0 ? ( |
| 1128 | + <div className="flex-column gap-2 p-3"> |
| 1129 | + <h3 className="mt-0 mb-0 primary-dark">{t('report.label.no_results')}</h3> |
| 1130 | + <div className="subtext">{t('files.msg.no_unused_files')}</div> |
| 1131 | + </div> |
| 1132 | + ) : ( |
| 1133 | + unusedFiles.map((unusedFile) => { |
| 1134 | + const isSelected = deleteFileQueue.includes(unusedFile.id) |
| 1135 | + return ( |
| 1136 | + <label key={unusedFile.id} htmlFor={`unused-file-${unusedFile.id}`} className="unused-file-list-item"> |
| 1137 | + <input |
| 1138 | + id={`unused-file-${unusedFile.id}`} |
| 1139 | + type="checkbox" |
| 1140 | + checked={isSelected} |
| 1141 | + onChange={() => toggleDeleteFileQueue(unusedFile.id)} |
| 1142 | + /> |
| 1143 | + <div className="unused-file-list-details"> |
| 1144 | + <div className="unused-file-list-title">{unusedFile.fileName || t('label.unknown')}</div> |
| 1145 | + <div className="subtext">{getReadableFileType(unusedFile.fileType)}</div> |
| 1146 | + </div> |
| 1147 | + </label> |
| 1148 | + ) |
| 1149 | + }) |
| 1150 | + )} |
| 1151 | + </div> |
| 1152 | + </div> |
| 1153 | + <div className='dialog-footer'> |
| 1154 | + <div className="subtext align-self-center">{t('files.label.selected_count', { count: deleteFileQueue.length })}</div> |
| 1155 | + <div className="flex-row gap-2"> |
| 1156 | + <button |
| 1157 | + className='btn btn-small btn-icon-left review-files-delete-button' |
| 1158 | + tabIndex='0' |
| 1159 | + disabled={deleteFileQueue.length === 0}> |
| 1160 | + <DeleteIcon className="icon-sm" /> |
| 1161 | + <div className="flex-column justify-content-center">{t('files.button.delete_selected')}</div> |
| 1162 | + </button> |
| 1163 | + </div> |
1083 | 1164 | </div> |
1084 | 1165 | </div> |
1085 | 1166 | </dialog> |
|
0 commit comments