cloudmr-ux 2.0.6 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/README.md +24 -24
  2. package/dist/CmrComponents/CmrButton/CmrButton.css +0 -0
  3. package/dist/CmrComponents/CmrButton/CmrButton.d.ts +4 -0
  4. package/dist/CmrComponents/CmrButton/CmrButton.js +30 -0
  5. package/dist/CmrComponents/CmrButton/index.d.ts +1 -0
  6. package/dist/CmrComponents/CmrButton/index.js +1 -0
  7. package/dist/CmrComponents/CmrCheckbox/CmrCheckbox.css +29 -0
  8. package/dist/CmrComponents/CmrCheckbox/CmrCheckbox.d.ts +14 -0
  9. package/dist/CmrComponents/CmrCheckbox/CmrCheckbox.js +30 -0
  10. package/dist/CmrComponents/CmrCheckbox/index.d.ts +1 -0
  11. package/dist/CmrComponents/CmrCheckbox/index.js +1 -0
  12. package/dist/CmrComponents/CmrColorPicker/CmrColorPicker.d.ts +8 -0
  13. package/dist/CmrComponents/CmrColorPicker/CmrColorPicker.js +29 -0
  14. package/dist/CmrComponents/CmrColorPicker/CmrColorPicker.scss +27 -0
  15. package/dist/CmrComponents/CmrInput/CmrInput.css +27 -0
  16. package/dist/CmrComponents/CmrInput/CmrInput.d.ts +17 -0
  17. package/dist/CmrComponents/CmrInput/CmrInput.js +29 -0
  18. package/dist/CmrComponents/CmrInput/index.d.ts +1 -0
  19. package/dist/CmrComponents/CmrInput/index.js +1 -0
  20. package/dist/CmrComponents/CmrRadioGroup/CmrRadioGroup.css +25 -0
  21. package/dist/CmrComponents/CmrRadioGroup/CmrRadioGroup.d.ts +15 -0
  22. package/dist/CmrComponents/CmrRadioGroup/CmrRadioGroup.js +37 -0
  23. package/dist/CmrComponents/CmrRadioGroup/index.d.ts +1 -0
  24. package/dist/CmrComponents/CmrRadioGroup/index.js +1 -0
  25. package/dist/CmrComponents/CmrSelect/CmrSelect.css +1 -0
  26. package/dist/CmrComponents/CmrSelect/CmrSelect.d.ts +24 -0
  27. package/dist/CmrComponents/CmrSelect/CmrSelect.js +46 -0
  28. package/dist/CmrComponents/CmrSelect/index.d.ts +1 -0
  29. package/dist/CmrComponents/CmrSelect/index.js +1 -0
  30. package/dist/CmrComponents/checkbox/Checkbox.css +8 -0
  31. package/dist/CmrComponents/checkbox/Checkbox.d.ts +15 -0
  32. package/dist/CmrComponents/checkbox/Checkbox.js +25 -0
  33. package/dist/CmrComponents/collapse/Collapse.css +3 -0
  34. package/dist/CmrComponents/collapse/Collapse.d.ts +18 -0
  35. package/dist/CmrComponents/collapse/Collapse.js +87 -0
  36. package/dist/CmrComponents/dialogue/Confirmation.d.ts +20 -0
  37. package/dist/CmrComponents/dialogue/Confirmation.js +36 -0
  38. package/dist/CmrComponents/dialogue/DeletionDialog.d.ts +4 -0
  39. package/dist/CmrComponents/dialogue/DeletionDialog.js +39 -0
  40. package/dist/CmrComponents/dialogue/EditConfirmation.d.ts +13 -0
  41. package/dist/CmrComponents/dialogue/EditConfirmation.js +45 -0
  42. package/dist/CmrComponents/double-slider/DualSlider.d.ts +21 -0
  43. package/dist/CmrComponents/double-slider/DualSlider.js +152 -0
  44. package/dist/CmrComponents/double-slider/InvertibleDualSlider.d.ts +24 -0
  45. package/dist/CmrComponents/double-slider/InvertibleDualSlider.js +174 -0
  46. package/dist/CmrComponents/gui-slider/ControlledSlider.d.ts +9 -0
  47. package/dist/CmrComponents/gui-slider/ControlledSlider.js +96 -0
  48. package/dist/CmrComponents/gui-slider/Slider.d.ts +20 -0
  49. package/dist/CmrComponents/gui-slider/Slider.js +127 -0
  50. package/dist/CmrComponents/header/Header.d.ts +17 -0
  51. package/dist/CmrComponents/header/Header.js +90 -0
  52. package/dist/CmrComponents/header/Header.scss +32 -0
  53. package/dist/CmrComponents/input-number/InputNumber.css +0 -0
  54. package/dist/CmrComponents/input-number/InputNumber.d.ts +17 -0
  55. package/dist/CmrComponents/input-number/InputNumber.js +30 -0
  56. package/dist/CmrComponents/label/Label.css +13 -0
  57. package/dist/CmrComponents/label/Label.d.ts +9 -0
  58. package/dist/CmrComponents/label/Label.js +18 -0
  59. package/dist/CmrComponents/panel/Panel.css +5 -0
  60. package/dist/CmrComponents/panel/Panel.d.ts +12 -0
  61. package/dist/CmrComponents/panel/Panel.js +42 -0
  62. package/dist/CmrComponents/rename/edit.d.ts +7 -0
  63. package/dist/CmrComponents/rename/edit.js +117 -0
  64. package/dist/CmrComponents/select-upload/SelectUpload.css +26 -0
  65. package/dist/CmrComponents/select-upload/SelectUpload.d.ts +33 -0
  66. package/dist/CmrComponents/select-upload/SelectUpload.js +90 -0
  67. package/dist/CmrComponents/tk-dualrange/TKDualRange.d.ts +17 -0
  68. package/dist/CmrComponents/tk-dualrange/TKDualRange.js +65 -0
  69. package/dist/CmrComponents/tk-dualrange/tk-dual-range.css +140 -0
  70. package/dist/CmrComponents/tooltip/Tooltip.css +0 -0
  71. package/dist/CmrComponents/tooltip/Tooltip.d.ts +18 -0
  72. package/dist/CmrComponents/tooltip/Tooltip.js +30 -0
  73. package/dist/CmrComponents/upload/Upload.css +5 -0
  74. package/dist/CmrComponents/upload/Upload.d.ts +80 -0
  75. package/dist/CmrComponents/upload/Upload.js +185 -0
  76. package/dist/CmrComponents/upload/UploadWindow.d.ts +15 -0
  77. package/dist/CmrComponents/upload/UploadWindow.js +286 -0
  78. package/dist/CmrTable/CmrTable.css +26 -0
  79. package/dist/CmrTable/CmrTable.d.ts +13 -0
  80. package/dist/CmrTable/CmrTable.js +47 -0
  81. package/dist/CmrTabs/CmrTabs.d.ts +7 -0
  82. package/dist/CmrTabs/CmrTabs.js +64 -0
  83. package/dist/CmrTabs/tab.model.d.ts +12 -0
  84. package/dist/CmrTabs/tab.model.js +1 -0
  85. package/dist/core/app/main/Main.d.ts +6 -0
  86. package/dist/core/app/main/Main.js +18 -0
  87. package/dist/core/app/results/Logs.d.ts +1 -0
  88. package/dist/core/app/results/Logs.js +33 -0
  89. package/dist/core/app/results/PreprocessJob.d.ts +1 -0
  90. package/dist/core/app/results/PreprocessJob.js +100 -0
  91. package/dist/core/app/results/Results.d.ts +15 -0
  92. package/dist/core/app/results/Results.js +372 -0
  93. package/dist/core/app/results/Results.scss +92 -0
  94. package/dist/core/app/results/Rois.d.ts +11 -0
  95. package/dist/core/app/results/Rois.js +269 -0
  96. package/dist/core/app/settings/Settings.d.ts +1 -0
  97. package/dist/core/app/settings/Settings.js +109 -0
  98. package/dist/core/app/signin/ForgotPassword.d.ts +3 -0
  99. package/dist/core/app/signin/ForgotPassword.js +142 -0
  100. package/dist/core/app/signin/Register.d.ts +3 -0
  101. package/dist/core/app/signin/Register.js +126 -0
  102. package/dist/core/app/signin/Signin.d.ts +5 -0
  103. package/dist/core/app/signin/Signin.js +84 -0
  104. package/dist/core/app/signin/Signin.scss +86 -0
  105. package/dist/core/app/upload/Upload.d.ts +3 -0
  106. package/dist/core/app/upload/Upload.js +261 -0
  107. package/dist/core/app/upload/Upload.scss +0 -0
  108. package/dist/core/common/components/CmrColorPicker/CmrColorPicker.d.ts +8 -0
  109. package/dist/core/common/components/CmrColorPicker/CmrColorPicker.js +29 -0
  110. package/dist/core/common/components/CmrColorPicker/CmrColorPicker.scss +27 -0
  111. package/dist/core/common/components/NiivueTools/Niivue.css +8 -0
  112. package/dist/core/common/components/NiivueTools/Niivue.d.ts +14 -0
  113. package/dist/core/common/components/NiivueTools/Niivue.js +1270 -0
  114. package/dist/core/common/components/NiivueTools/NiivuePatcher.js +1875 -0
  115. package/dist/core/common/components/NiivueTools/components/ColorPicker.d.ts +5 -0
  116. package/dist/core/common/components/NiivueTools/components/ColorPicker.js +68 -0
  117. package/dist/core/common/components/NiivueTools/components/DrawPlatte.d.ts +10 -0
  118. package/dist/core/common/components/NiivueTools/components/DrawPlatte.js +88 -0
  119. package/dist/core/common/components/NiivueTools/components/DrawToolKit.d.ts +32 -0
  120. package/dist/core/common/components/NiivueTools/components/DrawToolKit.js +164 -0
  121. package/dist/core/common/components/NiivueTools/components/EraserPlatte.d.ts +10 -0
  122. package/dist/core/common/components/NiivueTools/components/EraserPlatte.js +43 -0
  123. package/dist/core/common/components/NiivueTools/components/Layer.d.ts +10 -0
  124. package/dist/core/common/components/NiivueTools/components/Layer.js +117 -0
  125. package/dist/core/common/components/NiivueTools/components/LayersPanel.d.ts +8 -0
  126. package/dist/core/common/components/NiivueTools/components/LayersPanel.js +108 -0
  127. package/dist/core/common/components/NiivueTools/components/LocationTable.d.ts +9 -0
  128. package/dist/core/common/components/NiivueTools/components/LocationTable.js +42 -0
  129. package/dist/core/common/components/NiivueTools/components/MaskPlatte.d.ts +10 -0
  130. package/dist/core/common/components/NiivueTools/components/MaskPlatte.js +123 -0
  131. package/dist/core/common/components/NiivueTools/components/NiivuePanel.d.ts +34 -0
  132. package/dist/core/common/components/NiivueTools/components/NiivuePanel.js +305 -0
  133. package/dist/core/common/components/NiivueTools/components/NumberPicker.d.ts +8 -0
  134. package/dist/core/common/components/NiivueTools/components/NumberPicker.js +40 -0
  135. package/dist/core/common/components/NiivueTools/components/SettingsPanel.d.ts +7 -0
  136. package/dist/core/common/components/NiivueTools/components/SettingsPanel.js +30 -0
  137. package/dist/core/common/components/NiivueTools/components/Switch.d.ts +5 -0
  138. package/dist/core/common/components/NiivueTools/components/Switch.js +26 -0
  139. package/dist/core/common/components/NiivueTools/components/Toolbar.d.ts +40 -0
  140. package/dist/core/common/components/NiivueTools/components/Toolbar.js +184 -0
  141. package/dist/core/common/components/NiivueTools/components/Toolbar.scss +39 -0
  142. package/dist/core/common/components/NiivueTools/components/stats.d.ts +2 -0
  143. package/dist/core/common/components/NiivueTools/components/stats.js +13 -0
  144. package/dist/core/common/components/NiivueTools/index.css +14 -0
  145. package/dist/core/common/components/NiivueTools/util.js +309 -0
  146. package/dist/core/common/components/footer/Footer.d.ts +3 -0
  147. package/dist/core/common/components/footer/Footer.js +20 -0
  148. package/dist/core/common/components/footer/Footer.scss +5 -0
  149. package/dist/core/common/utilities/AuthenticatedRequests.d.ts +16 -0
  150. package/dist/core/common/utilities/AuthenticatedRequests.js +158 -0
  151. package/dist/core/common/utilities/CalendarHelper.d.ts +5 -0
  152. package/dist/core/common/utilities/CalendarHelper.js +27 -0
  153. package/dist/core/common/utilities/DownloadFromText.d.ts +3 -0
  154. package/dist/core/common/utilities/DownloadFromText.js +20 -0
  155. package/dist/core/common/utilities/StoreToRequest.d.ts +1 -0
  156. package/dist/core/common/utilities/StoreToRequest.js +4 -0
  157. package/dist/core/common/utilities/SystemUtilities.d.ts +4 -0
  158. package/dist/core/common/utilities/SystemUtilities.js +79 -0
  159. package/dist/core/common/utilities/file-transformation/anonymize.d.ts +1 -0
  160. package/dist/core/common/utilities/file-transformation/anonymize.js +114 -0
  161. package/dist/core/common/utilities/file-transformation/utilities.d.ts +2 -0
  162. package/dist/core/common/utilities/file-transformation/utilities.js +23 -0
  163. package/dist/core/common/utilities/index.d.ts +25 -0
  164. package/dist/core/common/utilities/index.js +118 -0
  165. package/dist/core/common/utilities/parse-jwt.d.ts +1 -0
  166. package/dist/core/common/utilities/parse-jwt.js +14 -0
  167. package/dist/core/components/PasswordRequirements.d.ts +7 -0
  168. package/dist/core/components/PasswordRequirements.js +30 -0
  169. package/dist/core/config/AppConfig.d.ts +5 -0
  170. package/dist/core/config/AppConfig.js +42 -0
  171. package/dist/core/config/types.d.ts +40 -0
  172. package/dist/core/config/types.js +1 -0
  173. package/dist/core/features/authenticate/authenticateActionCreation.d.ts +46 -0
  174. package/dist/core/features/authenticate/authenticateActionCreation.js +326 -0
  175. package/dist/core/features/authenticate/authenticateSlice.d.ts +45 -0
  176. package/dist/core/features/authenticate/authenticateSlice.js +203 -0
  177. package/dist/core/features/data/dataActionCreation.d.ts +40 -0
  178. package/dist/core/features/data/dataActionCreation.js +340 -0
  179. package/dist/core/features/data/dataSlice.d.ts +37 -0
  180. package/dist/core/features/data/dataSlice.js +87 -0
  181. package/dist/core/features/jobs/jobActionCreation.d.ts +35 -0
  182. package/dist/core/features/jobs/jobActionCreation.js +242 -0
  183. package/dist/core/features/jobs/jobsSlice.d.ts +57 -0
  184. package/dist/core/features/jobs/jobsSlice.js +54 -0
  185. package/dist/core/features/rois/resultActionCreation.d.ts +21 -0
  186. package/dist/core/features/rois/resultActionCreation.js +114 -0
  187. package/dist/core/features/rois/resultSlice.d.ts +24 -0
  188. package/dist/core/features/rois/resultSlice.js +68 -0
  189. package/dist/core/features/rois/roiTypes.d.ts +44 -0
  190. package/dist/core/features/rois/roiTypes.js +1 -0
  191. package/dist/core/features/setup/setupActionCreation.d.ts +7 -0
  192. package/dist/core/features/setup/setupActionCreation.js +100 -0
  193. package/dist/core/index.d.ts +22 -0
  194. package/dist/core/index.js +27 -0
  195. package/dist/core/store/configureStore.d.ts +13 -0
  196. package/dist/core/store/configureStore.js +38 -0
  197. package/dist/core/store/hooks.d.ts +11 -0
  198. package/dist/core/store/hooks.js +5 -0
  199. package/dist/core/utils/passwordValidation.d.ts +25 -0
  200. package/dist/core/utils/passwordValidation.js +19 -0
  201. package/dist/index.d.ts +29 -329
  202. package/dist/index.js +26 -1402
  203. package/dist/style.css +47 -0
  204. package/package.json +309 -41
  205. package/dist/index.css +0 -170
  206. package/dist/index.mjs +0 -1354
@@ -0,0 +1,269 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
49
+ import { CmrTable, CMRUpload, CmrConfirmation } from "../../../index";
50
+ import { useState } from "react";
51
+ import { Tooltip, IconButton } from "@mui/material";
52
+ import { getEndpoints } from "../../config/AppConfig";
53
+ import { useAppDispatch, useAppSelector } from "../../store/hooks";
54
+ import Box from "@mui/material/Box";
55
+ import VisibilityIcon from "@mui/icons-material/Visibility";
56
+ import VisibilityOffIcon from "@mui/icons-material/VisibilityOff";
57
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
58
+ import { faObjectGroup, faObjectUngroup, faDownload, faTrash, } from "@fortawesome/free-solid-svg-icons";
59
+ import { getPipelineROI } from "../../features/rois/resultActionCreation";
60
+ import { AuthenticatedHttpClient } from "../../common/utilities/AuthenticatedRequests";
61
+ export var ROITable = function (props) {
62
+ // const rois:ROI[] = useAppSelector(state=>{
63
+ // return (state.roi.rois[props.pipelineID]==undefined)?[]:state.roi.rois[props.pipelineID];
64
+ // })
65
+ // console.log(rois);
66
+ var endpoints = getEndpoints();
67
+ var _a = useState(1), uploadKey = _a[0], setUploadKey = _a[1];
68
+ var pipeline = useAppSelector(function (state) { var _a; return (_a = state.result.activeJob) === null || _a === void 0 ? void 0 : _a.pipeline_id; });
69
+ var _b = useState([]), selectedData = _b[0], setSelectedData = _b[1];
70
+ var dispatch = useAppDispatch();
71
+ var roiColumns = [
72
+ {
73
+ headerName: "ROI Label",
74
+ field: "alias",
75
+ flex: 1,
76
+ editable: true,
77
+ valueSetter: function (params) {
78
+ var value = params.value;
79
+ // console.log(params);
80
+ var newAlias = params.value; // Value entered by the user
81
+ // console.log(newAlias);
82
+ if (newAlias != params.row.alias) {
83
+ props.setLabelAlias(params.row.label, newAlias);
84
+ }
85
+ return params.row;
86
+ }
87
+ },
88
+ {
89
+ headerName: "Color",
90
+ field: "color",
91
+ flex: 0.5,
92
+ sortable: false,
93
+ // renderHeader: (params: any) => {
94
+ // return (
95
+ // <Box sx={{ display: 'flex', justifyContent: 'center', width: '100%' }}>
96
+ // {params.colDef.headerName}
97
+ // </Box>
98
+ // );
99
+ // },
100
+ renderCell: function (params) {
101
+ return (_jsx(Box, __assign({ sx: {
102
+ width: "100%",
103
+ display: "flex",
104
+ justifyContent: "center"
105
+ } }, { children: _jsx("div", { style: {
106
+ width: "14pt",
107
+ height: "14pt",
108
+ borderRadius: "3pt",
109
+ background: "".concat(params.row.color)
110
+ } }) })));
111
+ }
112
+ },
113
+ {
114
+ headerName: "Mean",
115
+ field: "mu",
116
+ flex: 1,
117
+ renderCell: function (params) {
118
+ return _jsx("div", { children: "".concat(params.row.mu.toFixed(3)) });
119
+ }
120
+ },
121
+ {
122
+ headerName: "SD",
123
+ field: "std",
124
+ flex: 1,
125
+ renderCell: function (params) {
126
+ return _jsx("div", { children: "".concat(params.row.std.toFixed(3)) });
127
+ }
128
+ },
129
+ {
130
+ headerName: "Visibility",
131
+ field: "visibility",
132
+ flex: 1,
133
+ sortable: false,
134
+ // renderHeader: (params: any) => {
135
+ // return (
136
+ // <Box sx={{ display: 'flex', justifyContent: 'center', width: '100%' }}>
137
+ // {params.colDef.headerName}
138
+ // </Box>
139
+ // );
140
+ // },
141
+ renderCell: function (params) {
142
+ return (_jsx(Box, __assign({ sx: {
143
+ width: "100%",
144
+ display: "flex",
145
+ justifyContent: "center"
146
+ } }, { children: _jsx(IconButton, __assign({ onClick: function (event) {
147
+ props.nv.setLabelVisibility(Number(params.row.label), !props.nv.getLabelVisibility(Number(params.row.label)));
148
+ props.resampleImage();
149
+ props.nv.drawScene();
150
+ event.stopPropagation();
151
+ } }, { children: params.row.visibility ? (_jsx(VisibilityIcon, { sx: { color: "#aaa" } })) : (_jsx(VisibilityOffIcon, { sx: { color: "#aaa" } })) })) })));
152
+ }
153
+ },
154
+ {
155
+ headerName: "Voxel Count",
156
+ field: "count",
157
+ flex: 1.5
158
+ },
159
+ ];
160
+ var _c = useState(false), warningVisible = _c[0], setWarningVisible = _c[1];
161
+ var _d = useState(""), warningMessage = _d[0], setWarningMessage = _d[1];
162
+ var warnEmptySelection = function (message) {
163
+ setWarningMessage(message);
164
+ setWarningVisible(true);
165
+ };
166
+ return (_jsxs(Box, __assign({ style: props.style }, { children: [_jsx(CmrTable
167
+ // sx={{
168
+ // borderBottomLeftRadius: 0,
169
+ // borderBottomRightRadius: 0,
170
+ // marginBottom: 0,
171
+ // paddingBottom: 0,
172
+ // }}
173
+ , {
174
+ // sx={{
175
+ // borderBottomLeftRadius: 0,
176
+ // borderBottomRightRadius: 0,
177
+ // marginBottom: 0,
178
+ // paddingBottom: 0,
179
+ // }}
180
+ hideFooter: true, getRowId: function (row) { return row.label; }, style: { height: "70%" }, dataSource: props.rois, columns: roiColumns, columnHeaderHeight: 40, rowSelectionModel: selectedData, onRowSelectionModelChange: function (rowSelectionModel) {
181
+ setSelectedData(rowSelectionModel);
182
+ } }), _jsxs(Box, __assign({ sx: {
183
+ display: "flex",
184
+ justifyContent: "flex-start",
185
+ alignItems: "center",
186
+ flexWrap: "wrap",
187
+ gap: 2,
188
+ mt: 0,
189
+ px: 2,
190
+ py: 1,
191
+ backgroundColor: "#f8f9fa",
192
+ border: "1px solid rgba(0, 0, 0, 0.12)",
193
+ borderTop: "none",
194
+ borderRadius: "0 0 4px 4px"
195
+ } }, { children: [_jsx(Tooltip, __assign({ title: "Group" }, { children: _jsx(IconButton, __assign({ onClick: function () {
196
+ props.nv.groupLabelsInto(selectedData.map(function (value) { return Number(value); }));
197
+ props.nv.drawScene();
198
+ props.resampleImage();
199
+ } }, { children: _jsx(FontAwesomeIcon, { icon: faObjectGroup, style: { fontSize: "16px" } }) })) })), _jsx(Tooltip, __assign({ title: "Ungroup" }, { children: _jsx(IconButton, __assign({ onClick: function () {
200
+ props.nv.ungroup();
201
+ props.nv.drawScene();
202
+ props.resampleImage();
203
+ } }, { children: _jsx(FontAwesomeIcon, { icon: faObjectUngroup, style: { fontSize: "16px" } }) })) })), _jsx(Tooltip, __assign({ title: "Download" }, { children: _jsx(IconButton, __assign({ onClick: function () { return __awaiter(void 0, void 0, void 0, function () {
204
+ var fileName, selectedLabels, _i, selectedData_1, label;
205
+ return __generator(this, function (_a) {
206
+ switch (_a.label) {
207
+ case 0:
208
+ fileName = "label";
209
+ selectedLabels = [];
210
+ for (_i = 0, selectedData_1 = selectedData; _i < selectedData_1.length; _i++) {
211
+ label = selectedData_1[_i];
212
+ fileName += label;
213
+ selectedLabels.push(Number(label));
214
+ }
215
+ fileName += ".nii";
216
+ if (selectedLabels.length == 0) {
217
+ warnEmptySelection("No ROI selected for download");
218
+ return [2 /*return*/];
219
+ }
220
+ return [4 /*yield*/, props.nv.saveImageByLabels(fileName, selectedLabels)];
221
+ case 1:
222
+ _a.sent();
223
+ return [2 /*return*/];
224
+ }
225
+ });
226
+ }); } }, { children: _jsx(FontAwesomeIcon, { icon: faDownload, style: { fontSize: "16px" } }) })) })), _jsx(Tooltip, __assign({ title: "Delete" }, { children: _jsx(IconButton, __assign({ onClick: function () {
227
+ props.nv.deleteDrawingByLabel(selectedData.map(function (value) { return Number(value); }));
228
+ props.resampleImage();
229
+ props.nv.drawScene();
230
+ } }, { children: _jsx(FontAwesomeIcon, { icon: faTrash, style: { fontSize: "16px" } }) })) })), _jsx(CMRUpload, { changeNameAfterUpload: false, color: "primary", onUploaded: function (res, file) { }, uploadHandler: function (file) { return __awaiter(void 0, void 0, void 0, function () {
231
+ var filename, response;
232
+ return __generator(this, function (_a) {
233
+ switch (_a.label) {
234
+ case 0:
235
+ console.log(props);
236
+ filename = file.name;
237
+ filename.split(".").pop();
238
+ return [4 /*yield*/, AuthenticatedHttpClient.post(endpoints.ROI_UPLOAD, {
239
+ filename: filename,
240
+ pipeline_id: props.pipelineID,
241
+ type: "image",
242
+ contentType: "application/octet-stream"
243
+ })];
244
+ case 1:
245
+ response = _a.sent();
246
+ console.log(response);
247
+ return [4 /*yield*/, props
248
+ .zipAndSendROI(response.data.upload_url, filename, file)
249
+ .then(function () { return __awaiter(void 0, void 0, void 0, function () {
250
+ return __generator(this, function (_a) {
251
+ switch (_a.label) {
252
+ case 0: return [4 /*yield*/, props.unpackROI(response.data.access_url)];
253
+ case 1:
254
+ _a.sent();
255
+ // @ts-ignore
256
+ dispatch(getPipelineROI({ pipeline: pipeline }));
257
+ return [2 /*return*/];
258
+ }
259
+ });
260
+ }); })];
261
+ case 2:
262
+ _a.sent();
263
+ return [2 /*return*/, 200];
264
+ }
265
+ });
266
+ }); },
267
+ // createPayload={createPayload}
268
+ maxCount: 1 }, uploadKey)] })), _jsx(CmrConfirmation, { name: "Warning", message: warningMessage, color: "error", width: 400, open: warningVisible, setOpen: function (open) { return setWarningVisible(open); }, confirmText: "OK" })] })));
269
+ };
@@ -0,0 +1 @@
1
+ export default function Settings(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,109 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import Box from "@mui/material/Box";
14
+ import Typography from "@mui/material/Typography";
15
+ import Container from "@mui/material/Container";
16
+ import Paper from "@mui/material/Paper";
17
+ import TextField from "@mui/material/TextField";
18
+ import Button from "@mui/material/Button";
19
+ import Alert from "@mui/material/Alert";
20
+ import { useState, useEffect } from "react";
21
+ import { useAppDispatch, useAppSelector } from "../../store/hooks";
22
+ import { changePassword, } from "../../features/authenticate/authenticateActionCreation";
23
+ import { clearError, clearChangePasswordSuccess, } from "../../features/authenticate/authenticateSlice";
24
+ import { validatePassword, isPasswordValid, } from "../../utils/passwordValidation";
25
+ import PasswordRequirements from "../../components/PasswordRequirements";
26
+ export default function Settings() {
27
+ var dispatch = useAppDispatch();
28
+ var _a = useAppSelector(function (state) { return state.authenticate; }), loading = _a.loading, error = _a.error, changePasswordSuccess = _a.changePasswordSuccess;
29
+ var _b = useState(""), oldPassword = _b[0], setOldPassword = _b[1];
30
+ var _c = useState(""), newPassword = _c[0], setNewPassword = _c[1];
31
+ var _d = useState(""), confirmNewPassword = _d[0], setConfirmNewPassword = _d[1];
32
+ var _e = useState(null), localError = _e[0], setLocalError = _e[1];
33
+ var _f = useState(false), showPasswordValidation = _f[0], setShowPasswordValidation = _f[1];
34
+ var _g = useState({
35
+ minLength: false,
36
+ hasNumber: false,
37
+ hasSpecial: false,
38
+ hasUppercase: false,
39
+ hasLowercase: false
40
+ }), passwordValidation = _g[0], setPasswordValidation = _g[1];
41
+ useEffect(function () {
42
+ if (changePasswordSuccess) {
43
+ // Clear the form on success
44
+ setOldPassword("");
45
+ setNewPassword("");
46
+ setConfirmNewPassword("");
47
+ setShowPasswordValidation(false);
48
+ // Clear success message after 5 seconds
49
+ setTimeout(function () {
50
+ dispatch(clearChangePasswordSuccess());
51
+ }, 5000);
52
+ }
53
+ }, [changePasswordSuccess, dispatch]);
54
+ // Validate password with debounce
55
+ useEffect(function () {
56
+ if (newPassword.length === 0) {
57
+ setShowPasswordValidation(false);
58
+ return;
59
+ }
60
+ var timeoutId = setTimeout(function () {
61
+ var validation = validatePassword(newPassword);
62
+ setPasswordValidation(validation);
63
+ setShowPasswordValidation(true);
64
+ }, 500); // 500ms debounce
65
+ return function () { return clearTimeout(timeoutId); };
66
+ }, [newPassword]);
67
+ useEffect(function () {
68
+ // Clear error when component unmounts
69
+ return function () {
70
+ dispatch(clearError());
71
+ dispatch(clearChangePasswordSuccess());
72
+ };
73
+ }, [dispatch]);
74
+ var handleSubmit = function (event) {
75
+ event.preventDefault();
76
+ setLocalError(null);
77
+ // Do immediate validation before submit
78
+ var currentValidation = validatePassword(newPassword);
79
+ setPasswordValidation(currentValidation);
80
+ setShowPasswordValidation(true);
81
+ // Check if all validation rules pass
82
+ if (!isPasswordValid(currentValidation)) {
83
+ setLocalError("Password does not meet requirements");
84
+ return;
85
+ }
86
+ // Validate passwords match
87
+ if (newPassword !== confirmNewPassword) {
88
+ setLocalError("New passwords do not match");
89
+ return;
90
+ }
91
+ var passwordData = {
92
+ oldPassword: oldPassword,
93
+ newPassword: newPassword
94
+ };
95
+ dispatch(changePassword(passwordData));
96
+ };
97
+ var isFormValid = function () {
98
+ var passwordValid = isPasswordValid(passwordValidation);
99
+ var passwordsMatch = newPassword === confirmNewPassword && confirmNewPassword.length > 0;
100
+ var hasContent = oldPassword.length > 0 && newPassword.length > 0 && confirmNewPassword.length > 0;
101
+ return passwordValid && passwordsMatch && hasContent;
102
+ };
103
+ return (_jsxs(Container, __assign({ maxWidth: "md", sx: { mt: 4, mb: 4 } }, { children: [_jsx(Typography, __assign({ variant: "h4", gutterBottom: true }, { children: "Settings" })), _jsxs(Paper, __assign({ sx: { p: 3, mt: 3 } }, { children: [_jsx(Typography, __assign({ variant: "h6", gutterBottom: true }, { children: "Change Password" })), (error || localError) && (_jsx(Alert, __assign({ severity: "error", sx: { mb: 2 }, onClose: function () {
104
+ dispatch(clearError());
105
+ setLocalError(null);
106
+ } }, { children: error || localError }))), changePasswordSuccess && (_jsx(Alert, __assign({ severity: "success", sx: { mb: 2 } }, { children: "Password changed successfully!" }))), _jsxs(Box, __assign({ component: "form", onSubmit: handleSubmit, noValidate: true }, { children: [_jsx(TextField, { margin: "normal", required: true, fullWidth: true, name: "oldPassword", label: "Current Password", type: "password", id: "oldPassword", value: oldPassword, onChange: function (e) { return setOldPassword(e.target.value); } }), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, name: "newPassword", label: "New Password", type: "password", id: "newPassword", value: newPassword, onChange: function (e) { return setNewPassword(e.target.value); } }), _jsx(PasswordRequirements, { validation: passwordValidation, show: showPasswordValidation }), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, name: "confirmNewPassword", label: "Confirm New Password", type: "password", id: "confirmNewPassword", value: confirmNewPassword, onChange: function (e) { return setConfirmNewPassword(e.target.value); }, error: confirmNewPassword.length > 0 && newPassword !== confirmNewPassword, helperText: confirmNewPassword.length > 0 && newPassword !== confirmNewPassword
107
+ ? "Passwords do not match"
108
+ : "" }), _jsx(Button, __assign({ type: "submit", fullWidth: true, variant: "contained", sx: { mt: 3, mb: 2 }, disabled: loading || !isFormValid() }, { children: loading ? "Changing Password..." : "Change Password" }))] }))] }))] })));
109
+ }
@@ -0,0 +1,3 @@
1
+ export default function ForgotPassword({ onBackToSignin, }: {
2
+ onBackToSignin: () => void;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,142 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import Button from "@mui/material/Button";
14
+ import TextField from "@mui/material/TextField";
15
+ import Box from "@mui/material/Box";
16
+ import Typography from "@mui/material/Typography";
17
+ import Link from "@mui/material/Link";
18
+ import Alert from "@mui/material/Alert";
19
+ import Paper from "@mui/material/Paper";
20
+ import Container from "@mui/material/Container";
21
+ import { forgotPassword, resetPassword, } from "../../features/authenticate/authenticateActionCreation";
22
+ import { useAppDispatch, useAppSelector } from "../../store/hooks";
23
+ import { clearError, clearForgotPasswordSuccess, clearResetPasswordSuccess, } from "../../features/authenticate/authenticateSlice";
24
+ import { useEffect, useState } from "react";
25
+ import { validatePassword, isPasswordValid as checkPasswordValid, } from "../../utils/passwordValidation";
26
+ import PasswordRequirements from "../../components/PasswordRequirements";
27
+ export default function ForgotPassword(_a) {
28
+ var onBackToSignin = _a.onBackToSignin;
29
+ var dispatch = useAppDispatch();
30
+ var _b = useAppSelector(function (state) { return state.authenticate; }), loading = _b.loading, error = _b.error, forgotPasswordSuccess = _b.forgotPasswordSuccess, resetPasswordSuccess = _b.resetPasswordSuccess;
31
+ var _c = useState(""), email = _c[0], setEmail = _c[1];
32
+ var _d = useState(""), code = _d[0], setCode = _d[1];
33
+ var _e = useState(""), newPassword = _e[0], setNewPassword = _e[1];
34
+ var _f = useState(""), confirmPassword = _f[0], setConfirmPassword = _f[1];
35
+ var _g = useState(false), showResetForm = _g[0], setShowResetForm = _g[1];
36
+ var _h = useState(false), showPasswordValidation = _h[0], setShowPasswordValidation = _h[1];
37
+ var _j = useState({
38
+ minLength: false,
39
+ hasNumber: false,
40
+ hasSpecial: false,
41
+ hasUppercase: false,
42
+ hasLowercase: false
43
+ }), passwordValidation = _j[0], setPasswordValidation = _j[1];
44
+ useEffect(function () {
45
+ if (forgotPasswordSuccess) {
46
+ // Show the reset form after successfully requesting code
47
+ setShowResetForm(true);
48
+ // Clear success message after showing it
49
+ setTimeout(function () {
50
+ dispatch(clearForgotPasswordSuccess());
51
+ }, 5000);
52
+ }
53
+ }, [forgotPasswordSuccess, dispatch]);
54
+ useEffect(function () {
55
+ if (resetPasswordSuccess) {
56
+ // Clear the form and go back to signin after successful reset
57
+ setTimeout(function () {
58
+ dispatch(clearResetPasswordSuccess());
59
+ onBackToSignin();
60
+ }, 3000);
61
+ }
62
+ }, [resetPasswordSuccess, dispatch, onBackToSignin]);
63
+ useEffect(function () {
64
+ // Clear error when component unmounts
65
+ return function () {
66
+ dispatch(clearError());
67
+ dispatch(clearForgotPasswordSuccess());
68
+ dispatch(clearResetPasswordSuccess());
69
+ };
70
+ }, [dispatch]);
71
+ // Validate password with debounce
72
+ useEffect(function () {
73
+ if (newPassword.length === 0) {
74
+ setShowPasswordValidation(false);
75
+ return;
76
+ }
77
+ var timeoutId = setTimeout(function () {
78
+ var validation = validatePassword(newPassword);
79
+ setPasswordValidation(validation);
80
+ setShowPasswordValidation(true);
81
+ }, 500); // 500ms debounce
82
+ return function () { return clearTimeout(timeoutId); };
83
+ }, [newPassword]);
84
+ var passwordsMatch = newPassword === confirmPassword && confirmPassword.length > 0;
85
+ var isEmailValid = function (emailAddr) {
86
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailAddr);
87
+ };
88
+ var isResetFormValid = function () {
89
+ var passwordValid = checkPasswordValid(passwordValidation);
90
+ var passwordsMatchValid = passwordsMatch;
91
+ var hasContent = email.length > 0 &&
92
+ code.length > 0 &&
93
+ newPassword.length > 0 &&
94
+ confirmPassword.length > 0;
95
+ return passwordValid && passwordsMatchValid && hasContent;
96
+ };
97
+ var handleForgotPasswordSubmit = function (event) {
98
+ event.preventDefault();
99
+ // Validate email format
100
+ if (!isEmailValid(email)) {
101
+ return;
102
+ }
103
+ var forgotData = {
104
+ email: email
105
+ };
106
+ dispatch(forgotPassword(forgotData));
107
+ };
108
+ var handleResetPasswordSubmit = function (event) {
109
+ event.preventDefault();
110
+ // Do immediate validation before submit
111
+ var currentValidation = validatePassword(newPassword);
112
+ setPasswordValidation(currentValidation);
113
+ setShowPasswordValidation(true);
114
+ // Check if all validation rules pass
115
+ if (!checkPasswordValid(currentValidation)) {
116
+ return;
117
+ }
118
+ // Validate password confirmation
119
+ if (!passwordsMatch) {
120
+ return;
121
+ }
122
+ var resetData = {
123
+ email: email,
124
+ code: code,
125
+ newPassword: newPassword
126
+ };
127
+ dispatch(resetPassword(resetData));
128
+ };
129
+ return (_jsx(Container, __assign({ maxWidth: "md", sx: { mt: 4, mb: 4 } }, { children: _jsx(Paper, __assign({ sx: { p: 3 } }, { children: !showResetForm ? (_jsxs(Box, __assign({ component: "form", onSubmit: handleForgotPasswordSubmit, noValidate: true }, { children: [_jsx(Typography, __assign({ variant: "h6", gutterBottom: true, sx: { mb: 2 } }, { children: "Forgot Password" })), _jsx(Typography, __assign({ variant: "body2", sx: { mb: 2 } }, { children: "Enter your email address and we'll send you a verification code to reset your password." })), error && (_jsx(Alert, __assign({ severity: "error", sx: { mb: 2 }, onClose: function () { return dispatch(clearError()); } }, { children: error }))), forgotPasswordSuccess && (_jsx(Alert, __assign({ severity: "success", sx: { mb: 2 } }, { children: "A verification code has been sent to your email." }))), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, id: "email", label: "Email Address", name: "email", type: "email", size: "small", autoComplete: "email", autoFocus: true, value: email, onChange: function (e) { return setEmail(e.target.value); } }), _jsx(Button, __assign({ type: "submit", fullWidth: true, variant: "contained", sx: { mt: 3, mb: 2 }, disabled: loading || !email || !isEmailValid(email) }, { children: loading ? "Sending Code..." : "Send Verification Code" })), _jsx(Box, __assign({ sx: { textAlign: "center" } }, { children: _jsx(Link, __assign({ href: "#", onClick: function (e) {
130
+ e.preventDefault();
131
+ onBackToSignin();
132
+ }, variant: "body2" }, { children: "Back to Sign In" })) }))] }))) : (_jsxs(Box, __assign({ component: "form", onSubmit: handleResetPasswordSubmit, noValidate: true }, { children: [_jsx(Typography, __assign({ variant: "h6", gutterBottom: true, sx: { mb: 2 } }, { children: "Reset Password" })), _jsx(Typography, __assign({ variant: "body2", sx: { mb: 2 } }, { children: "Enter the verification code sent to your email and choose a new password." })), error && (_jsx(Alert, __assign({ severity: "error", sx: { mb: 2 }, onClose: function () { return dispatch(clearError()); } }, { children: error }))), resetPasswordSuccess && (_jsx(Alert, __assign({ severity: "success", sx: { mb: 2 } }, { children: "Password reset successfully! Redirecting to sign in..." }))), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, id: "code", label: "Verification Code", name: "code", size: "small", autoFocus: true, value: code, onChange: function (e) { return setCode(e.target.value); } }), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, name: "newPassword", label: "New Password", type: "password", id: "newPassword", size: "small", autoComplete: "new-password", value: newPassword, onChange: function (e) { return setNewPassword(e.target.value); } }), _jsx(PasswordRequirements, { validation: passwordValidation, show: showPasswordValidation }), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, name: "confirmPassword", label: "Confirm New Password", type: "password", id: "confirmPassword", size: "small", autoComplete: "new-password", value: confirmPassword, onChange: function (e) { return setConfirmPassword(e.target.value); }, error: confirmPassword.length > 0 && !passwordsMatch, helperText: confirmPassword.length > 0 && !passwordsMatch
133
+ ? "Passwords do not match"
134
+ : "" }), _jsx(Button, __assign({ type: "submit", fullWidth: true, variant: "contained", sx: { mt: 3, mb: 2 }, disabled: loading || !isResetFormValid() }, { children: loading ? "Resetting Password..." : "Reset Password" })), _jsxs(Box, __assign({ sx: { textAlign: "center" } }, { children: [_jsx(Link, __assign({ href: "#", onClick: function (e) {
135
+ e.preventDefault();
136
+ setShowResetForm(false);
137
+ dispatch(clearError());
138
+ }, variant: "body2" }, { children: "Back" })), " | ", _jsx(Link, __assign({ href: "#", onClick: function (e) {
139
+ e.preventDefault();
140
+ onBackToSignin();
141
+ }, variant: "body2" }, { children: "Sign In" }))] }))] }))) })) })));
142
+ }
@@ -0,0 +1,3 @@
1
+ export default function Register({ onBackToSignin, }: {
2
+ onBackToSignin: () => void;
3
+ }): import("react/jsx-runtime").JSX.Element;