cloudmr-ux 2.0.7 → 3.0.2

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,126 @@
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 Grid from "@mui/material/Grid";
19
+ import Alert from "@mui/material/Alert";
20
+ import Paper from "@mui/material/Paper";
21
+ import Container from "@mui/material/Container";
22
+ import { registerUser, } from "../../features/authenticate/authenticateActionCreation";
23
+ import { useAppDispatch, useAppSelector } from "../../store/hooks";
24
+ import { clearError, clearRegisterSuccess, } from "../../features/authenticate/authenticateSlice";
25
+ import { useEffect, useState } from "react";
26
+ import { validatePassword, isPasswordValid as checkPasswordValid, } from "../../utils/passwordValidation";
27
+ import PasswordRequirements from "../../components/PasswordRequirements";
28
+ export default function Register(_a) {
29
+ var onBackToSignin = _a.onBackToSignin;
30
+ var dispatch = useAppDispatch();
31
+ var _b = useAppSelector(function (state) { return state.authenticate; }), loading = _b.loading, error = _b.error, registerSuccess = _b.registerSuccess;
32
+ var _c = useState(false), showSuccess = _c[0], setShowSuccess = _c[1];
33
+ var _d = useState(""), password = _d[0], setPassword = _d[1];
34
+ var _e = useState(""), confirmPassword = _e[0], setConfirmPassword = _e[1];
35
+ var _f = useState(false), showPasswordValidation = _f[0], setShowPasswordValidation = _f[1];
36
+ var _g = useState({
37
+ minLength: false,
38
+ hasNumber: false,
39
+ hasSpecial: false,
40
+ hasUppercase: false,
41
+ hasLowercase: false
42
+ }), passwordValidation = _g[0], setPasswordValidation = _g[1];
43
+ useEffect(function () {
44
+ if (registerSuccess) {
45
+ setShowSuccess(true);
46
+ // Clear success message after showing it
47
+ setTimeout(function () {
48
+ dispatch(clearRegisterSuccess());
49
+ setShowSuccess(false);
50
+ }, 5000);
51
+ }
52
+ }, [registerSuccess, dispatch]);
53
+ useEffect(function () {
54
+ // Clear error when component unmounts
55
+ return function () {
56
+ dispatch(clearError());
57
+ };
58
+ }, [dispatch]);
59
+ // Validate password with debounce - only update after user stops typing
60
+ useEffect(function () {
61
+ if (password.length === 0) {
62
+ setShowPasswordValidation(false);
63
+ return;
64
+ }
65
+ var timeoutId = setTimeout(function () {
66
+ var validation = validatePassword(password);
67
+ setPasswordValidation(validation);
68
+ setShowPasswordValidation(true);
69
+ }, 500); // 500ms debounce
70
+ return function () { return clearTimeout(timeoutId); };
71
+ }, [password]);
72
+ var handlePasswordChange = function (e) {
73
+ setPassword(e.target.value);
74
+ };
75
+ var handleConfirmPasswordChange = function (e) {
76
+ setConfirmPassword(e.target.value);
77
+ };
78
+ var passwordsMatch = password === confirmPassword && confirmPassword.length > 0;
79
+ var isEmailValid = function (email) {
80
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
81
+ };
82
+ var isFormValid = function () {
83
+ // Check if password meets all requirements
84
+ var passwordValid = checkPasswordValid(passwordValidation);
85
+ // Check if passwords match
86
+ var passwordsMatchValid = password === confirmPassword && confirmPassword.length > 0;
87
+ // Check if password fields have content
88
+ var hasPasswordContent = password.length > 0 && confirmPassword.length > 0;
89
+ return passwordValid && passwordsMatchValid && hasPasswordContent;
90
+ };
91
+ var handleSubmit = function (event) {
92
+ event.preventDefault();
93
+ var data = new FormData(event.currentTarget);
94
+ var emailValue = data.get("email");
95
+ // Validate email format
96
+ if (!isEmailValid(emailValue)) {
97
+ return;
98
+ }
99
+ // Do immediate validation before submit
100
+ var currentValidation = validatePassword(password);
101
+ setPasswordValidation(currentValidation);
102
+ setShowPasswordValidation(true);
103
+ // Check if all validation rules pass
104
+ if (!checkPasswordValid(currentValidation)) {
105
+ return; // Validation messages will be shown
106
+ }
107
+ // Validate password confirmation
108
+ if (!passwordsMatch) {
109
+ return; // Validation message already shown
110
+ }
111
+ var registerData = {
112
+ email: emailValue,
113
+ password: password,
114
+ firstname: data.get("firstname"),
115
+ lastname: data.get("lastname"),
116
+ username: data.get("username")
117
+ };
118
+ dispatch(registerUser(registerData));
119
+ };
120
+ return (_jsx(Container, __assign({ maxWidth: "md", sx: { mt: 4, mb: 4 } }, { children: _jsx(Paper, __assign({ sx: { p: 3 } }, { children: _jsxs(Box, __assign({ component: "form", onSubmit: handleSubmit, noValidate: true }, { children: [_jsx(Typography, __assign({ variant: "h6", gutterBottom: true, sx: { mb: 2 } }, { children: "Create Account" })), error && (_jsx(Alert, __assign({ severity: "error", sx: { mb: 2 }, onClose: function () { return dispatch(clearError()); } }, { children: error }))), showSuccess && (_jsx(Alert, __assign({ severity: "success", sx: { mb: 2 } }, { children: "Registration successful! Please wait for admin approval before signing in." }))), _jsxs(Grid, __assign({ container: true, spacing: 2 }, { children: [_jsx(Grid, __assign({ item: true, xs: 12, sm: 6 }, { children: _jsx(TextField, { margin: "normal", required: true, fullWidth: true, id: "firstname", label: "First Name", name: "firstname", size: "small", autoFocus: true }) })), _jsx(Grid, __assign({ item: true, xs: 12, sm: 6 }, { children: _jsx(TextField, { margin: "normal", required: true, fullWidth: true, id: "lastname", label: "Last Name", name: "lastname", size: "small" }) }))] })), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, id: "username", label: "Username", name: "username", size: "small" }), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, id: "email", label: "Email Address", name: "email", type: "email", size: "small", autoComplete: "email" }), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, name: "password", label: "Password", type: "password", id: "password", size: "small", autoComplete: "new-password", value: password, onChange: handlePasswordChange }), _jsx(PasswordRequirements, { validation: passwordValidation, show: showPasswordValidation }), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, name: "confirmPassword", label: "Confirm Password", type: "password", id: "confirmPassword", size: "small", autoComplete: "new-password", value: confirmPassword, onChange: handleConfirmPasswordChange, error: confirmPassword.length > 0 && !passwordsMatch, helperText: confirmPassword.length > 0 && !passwordsMatch
121
+ ? "Passwords do not match"
122
+ : "" }), _jsx(Button, __assign({ type: "submit", fullWidth: true, variant: "contained", sx: { mt: 3, mb: 2 }, disabled: loading || !isFormValid() }, { children: loading ? "Registering..." : "Register" })), _jsx(Grid, __assign({ container: true, justifyContent: "flex-end" }, { children: _jsx(Grid, __assign({ item: true }, { children: _jsx(Link, __assign({ href: "#", onClick: function (e) {
123
+ e.preventDefault();
124
+ onBackToSignin();
125
+ }, variant: "body2" }, { children: "Already have an account? Sign in" })) })) }))] })) })) })));
126
+ }
@@ -0,0 +1,5 @@
1
+ import "./Signin.scss";
2
+ export default function Signin({ appIcon, appTitle, }: {
3
+ appIcon: string;
4
+ appTitle: string;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,84 @@
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 FormControlLabel from "@mui/material/FormControlLabel";
16
+ import Checkbox from "@mui/material/Checkbox";
17
+ import Link from "@mui/material/Link";
18
+ import Grid from "@mui/material/Grid";
19
+ import Box from "@mui/material/Box";
20
+ import Typography from "@mui/material/Typography";
21
+ import Alert from "@mui/material/Alert";
22
+ import Paper from "@mui/material/Paper";
23
+ import Container from "@mui/material/Container";
24
+ import { getLoggedInToken } from "../../features/authenticate/authenticateActionCreation";
25
+ import { useAppDispatch, useAppSelector } from "../../store/hooks";
26
+ import { clearError } from "../../features/authenticate/authenticateSlice";
27
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
28
+ import { useState, useEffect } from "react";
29
+ import Register from "./Register";
30
+ import ForgotPassword from "./ForgotPassword";
31
+ import "./Signin.scss";
32
+ var theme = createTheme({
33
+ palette: {
34
+ primary: {
35
+ main: "#580F8B"
36
+ },
37
+ secondary: {
38
+ main: "#6c757d"
39
+ }
40
+ }
41
+ });
42
+ export default function Signin(_a) {
43
+ var appIcon = _a.appIcon, appTitle = _a.appTitle;
44
+ var dispatch = useAppDispatch();
45
+ var _b = useAppSelector(function (state) { return state.authenticate; }), loading = _b.loading, error = _b.error;
46
+ var _c = useState(false), showRegister = _c[0], setShowRegister = _c[1];
47
+ var _d = useState(false), showForgotPassword = _d[0], setShowForgotPassword = _d[1];
48
+ useEffect(function () {
49
+ // Clear error when component unmounts
50
+ return function () {
51
+ dispatch(clearError());
52
+ };
53
+ }, [dispatch]);
54
+ var handleSubmit = function (event) {
55
+ event.preventDefault();
56
+ var data = new FormData(event.currentTarget);
57
+ //@ts-ignore
58
+ //
59
+ var credentials = {
60
+ email: data.get("email"),
61
+ password: data.get("password")
62
+ };
63
+ dispatch(getLoggedInToken(credentials));
64
+ };
65
+ return (_jsx(ThemeProvider, __assign({ theme: theme }, { children: _jsx("div", __assign({ className: "flex-center page-root", style: { paddingTop: "calc(20vh - 20px)" } }, { children: _jsxs("div", __assign({ id: "welcome" }, { children: [_jsx("div", __assign({ id: "welcome-logo" }, { children: _jsxs("div", __assign({ style: {
66
+ margin: "auto",
67
+ width: "100%",
68
+ display: "flex",
69
+ justifyContent: "center",
70
+ alignItems: "center"
71
+ } }, { children: [_jsx("img", { src: appIcon, className: "img-fluid", style: { margin: "auto", height: "70pt" }, alt: "" }), _jsx("h1", __assign({ style: {
72
+ display: "block",
73
+ marginTop: "8pt",
74
+ marginRight: "5pt",
75
+ textAlign: "center",
76
+ fontWeight: "bold"
77
+ } }, { children: appTitle }))] })) })), _jsx("div", __assign({ id: "welcome-login" }, { children: !showRegister && !showForgotPassword ? (_jsx(Container, __assign({ maxWidth: "lg", sx: { mt: 4, mb: 4 } }, { children: _jsx(Paper, __assign({ sx: { p: 3 } }, { children: _jsxs(Box, __assign({ component: "form", onSubmit: handleSubmit, noValidate: true }, { children: [_jsx(Typography, __assign({ variant: "h6", gutterBottom: true, sx: { mb: 2 } }, { children: "Sign In" })), error && (_jsx(Alert, __assign({ severity: "error", sx: { mb: 2 }, onClose: function () { return dispatch(clearError()); } }, { children: error }))), _jsx(TextField, { margin: "normal", className: "col-md-6", required: true, fullWidth: true, id: "email", label: "Email Address", name: "email", size: "small", autoComplete: "email", autoFocus: true }), _jsx(TextField, { margin: "normal", required: true, fullWidth: true, name: "password", label: "Password", type: "password", id: "password", size: "small", autoComplete: "current-password" }), _jsx(FormControlLabel, { control: _jsx(Checkbox, { value: "remember", size: "small", color: "primary" }), label: _jsx(Typography, __assign({ variant: "subtitle2" }, { children: "Remember Me" })), style: { float: "right", marginRight: "0" }, className: "input-sm" }), _jsx(Button, __assign({ type: "submit", fullWidth: true, variant: "contained", sx: { mt: 3, mb: 2 }, disabled: loading }, { children: loading ? "Signing In..." : "Sign In" })), _jsxs(Grid, __assign({ container: true, justifyContent: "space-between", alignItems: "center" }, { children: [_jsx(Grid, __assign({ item: true }, { children: _jsx(Link, __assign({ href: "#", onClick: function (e) {
78
+ e.preventDefault();
79
+ setShowForgotPassword(true);
80
+ }, variant: "body2" }, { children: "Forgot Password?" })) })), _jsx(Grid, __assign({ item: true }, { children: _jsx(Link, __assign({ href: "#", onClick: function (e) {
81
+ e.preventDefault();
82
+ setShowRegister(true);
83
+ }, variant: "body2" }, { children: "Sign Up" })) }))] }))] })) })) }))) : showForgotPassword ? (_jsx(ForgotPassword, { onBackToSignin: function () { return setShowForgotPassword(false); } })) : (_jsx(Register, { onBackToSignin: function () { return setShowRegister(false); } })) }))] })) })) })));
84
+ }
@@ -0,0 +1,86 @@
1
+ html,
2
+ body {
3
+ color: #636b6f;
4
+ font-family: 'Nunito', sans-serif;
5
+ font-weight: 200;
6
+ height: 100vh;
7
+ margin: 0;
8
+ }
9
+
10
+ .full-height {
11
+ height: 100vh;
12
+ }
13
+
14
+ .flex-center {
15
+ align-items: center;
16
+ display: flex;
17
+ justify-content: center;
18
+ }
19
+
20
+ .position-ref {
21
+ position: relative;
22
+ }
23
+
24
+ .top-right {
25
+ position: absolute;
26
+ right: 10px;
27
+ top: 18px;
28
+ }
29
+
30
+ .bottom-right {
31
+ position: absolute;
32
+ right: 10px;
33
+ bottom: 18px;
34
+ }
35
+
36
+ .bottom {
37
+ position: absolute;
38
+ bottom: 13px;
39
+ }
40
+
41
+ .links>a {
42
+ color: #636b6f;
43
+ padding: 0 25px;
44
+ font-size: 13px;
45
+ font-weight: 600;
46
+ letter-spacing: .1rem;
47
+ text-decoration: none;
48
+ text-transform: uppercase;
49
+ }
50
+
51
+ #welcome{
52
+ display: grid;
53
+ grid-template-columns: 25% 50% 25%;
54
+ grid-template-rows: fit-content(30%) 0pt 1fr;
55
+ row-gap: 5px;
56
+ }
57
+
58
+ #welcome-logo{
59
+ grid-row: 1;
60
+ grid-column: 2;
61
+ width: 90%;
62
+ display: flex;
63
+ position: relative;
64
+ margin-left: auto;
65
+ margin-right: auto;
66
+ color: #555;
67
+ }
68
+
69
+ #welcome-login{
70
+ grid-row: 3;
71
+ grid-column: 2 / span 1;
72
+ display: flex;
73
+ justify-content: center;
74
+ }
75
+
76
+ #welcome-icon{
77
+ position:absolute;
78
+ top:-50pt; /*it pushes away div element from top 30pt down Remember with
79
+ browser window*/
80
+ left:0;
81
+ right:0;
82
+ /*last three property excatly similar to top property it just pushes away
83
+ from specified direction*/
84
+ display: flex;
85
+ }
86
+
@@ -0,0 +1,3 @@
1
+ import "./Upload.scss";
2
+ declare const Upload: () => import("react/jsx-runtime").JSX.Element;
3
+ export default Upload;
@@ -0,0 +1,261 @@
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
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
+ if (ar || !(i in from)) {
51
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
+ ar[i] = from[i];
53
+ }
54
+ }
55
+ return to.concat(ar || Array.prototype.slice.call(from));
56
+ };
57
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
58
+ import { Fragment, useEffect, useState } from "react";
59
+ import "./Upload.scss";
60
+ import { useAppDispatch, useAppSelector } from "../../store/hooks";
61
+ import IconButton from "@mui/material/IconButton";
62
+ import EditIcon from "@mui/icons-material/Edit";
63
+ import GetAppIcon from "@mui/icons-material/GetApp";
64
+ import DeleteIcon from "@mui/icons-material/Delete";
65
+ import { CmrTable, CmrCollapse, CmrPanel, CmrNameDialog } from "../../../index";
66
+ import { deleteUploadedData, getUploadedData, renameUploadedData, uploadData, } from "../../features/data/dataActionCreation";
67
+ import { getUpstreamJobs } from "../../features/jobs/jobActionCreation";
68
+ import { CmrConfirmation } from "../../../index";
69
+ import { Button, CircularProgress } from "@mui/material";
70
+ import { CMRUpload } from "../../../index";
71
+ import { uploadHandlerFactory } from "../../common/utilities/SystemUtilities";
72
+ var Upload = function () {
73
+ var dispatch = useAppDispatch();
74
+ var uploadToken = useAppSelector(function (state) { return state.authenticate; }).uploadToken;
75
+ var files = useAppSelector(function (state) { return state.data; }).files;
76
+ var renamingProxy = function (newName, proxyCallback) {
77
+ return new Promise(function (resolve) {
78
+ var originalExt = originalName.split(".").pop();
79
+ if (newName.split(".").length === 1) {
80
+ setMessage("Missing file extension in '".concat(newName, "'."));
81
+ setColor("error");
82
+ setConfirmCallback(function () { return function () {
83
+ resolve(false);
84
+ }; });
85
+ setCancelCallback(function () { return function () {
86
+ resolve(false);
87
+ }; });
88
+ setOpen(true);
89
+ }
90
+ else if (newName.split(".").pop() !== originalExt) {
91
+ var newExt = newName.split(".").pop();
92
+ var orgExt = originalExt !== null && originalExt !== void 0 ? originalExt : "?";
93
+ setMessage("Changing file extension from ".concat(orgExt, " to ").concat(newExt, "."));
94
+ setColor("primary");
95
+ setConfirmCallback(function () { return function () {
96
+ proxyCallback();
97
+ resolve(true);
98
+ }; });
99
+ setCancelCallback(function () { return function () {
100
+ resolve(false);
101
+ }; });
102
+ setOpen(true);
103
+ }
104
+ else {
105
+ proxyCallback();
106
+ resolve(true);
107
+ }
108
+ });
109
+ };
110
+ var uploadedFilesColumns = [
111
+ {
112
+ headerName: "File Name",
113
+ dataIndex: "fileName",
114
+ field: "fileName",
115
+ editable: true,
116
+ flex: 1
117
+ },
118
+ {
119
+ headerName: "Date Submitted",
120
+ dataIndex: "createdAt",
121
+ field: "createdAt",
122
+ flex: 1
123
+ },
124
+ {
125
+ headerName: "Status",
126
+ dataIndex: "status",
127
+ field: "status",
128
+ flex: 1
129
+ },
130
+ {
131
+ field: "actions",
132
+ headerName: "Edit File Name",
133
+ sortable: false,
134
+ width: 160,
135
+ disableClickEventBubbling: true,
136
+ renderCell: function (params) {
137
+ var index = files.findIndex(function (row) { return row.id === params.id; });
138
+ return (_jsx("div", { children: _jsx(IconButton, __assign({ onClick: function () {
139
+ setOriginalName(files[index].fileName);
140
+ setNameDialogOpen(true);
141
+ setRenamingCallback(function () { return function (newName) {
142
+ return renamingProxy(newName, function () {
143
+ // In case of working API
144
+ var dataReference = files[index];
145
+ //@ts-ignore
146
+ dispatch(renameUploadedData({
147
+ fileId: dataReference.id,
148
+ newName: newName
149
+ }));
150
+ });
151
+ // In case of non-working API, change name locally
152
+ // dispatch(dataSlice.actions.renameData({index:index,alias:newName}));
153
+ }; });
154
+ } }, { children: params.row.renamingPending ? (_jsx(CircularProgress, { size: 20 })) : (_jsx(EditIcon, {})) })) }));
155
+ }
156
+ },
157
+ ];
158
+ // const dispatch = useAppDispatch();
159
+ // const { uploadToken } = useAppSelector((state) => state.authenticate);
160
+ // const { files } = useAppSelector((state) => state.data);
161
+ var _a = useState(false), nameDialogOpen = _a[0], setNameDialogOpen = _a[1];
162
+ var _b = useState(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
163
+ return [2 /*return*/, true];
164
+ }); }); }), renamingCallback = _b[0], setRenamingCallback = _b[1];
165
+ var _c = useState(""), originalName = _c[0], setOriginalName = _c[1];
166
+ var _d = useState(undefined), name = _d[0], setName = _d[1];
167
+ var _e = useState(undefined), message = _e[0], setMessage = _e[1];
168
+ var _f = useState(undefined), color = _f[0], setColor = _f[1];
169
+ var _g = useState(false), open = _g[0], setOpen = _g[1];
170
+ var _h = useState(function () { }), confirmCallback = _h[0], setConfirmCallback = _h[1];
171
+ var _j = useState(function () { }), cancelCallback = _j[0], setCancelCallback = _j[1];
172
+ var _k = useState([]), selectedData = _k[0], setSelectedData = _k[1];
173
+ useEffect(function () {
174
+ //@ts-ignore
175
+ dispatch(getUploadedData());
176
+ //@ts-ignore
177
+ dispatch(getUpstreamJobs());
178
+ console.log("dispatched");
179
+ }, []);
180
+ var _l = useState(0), uploadKey = _l[0], setUploadKey = _l[1];
181
+ function downloadSelectedValues() {
182
+ var downloadPending = [];
183
+ selectedData.forEach(function (id) {
184
+ for (var _i = 0, files_1 = files; _i < files_1.length; _i++) {
185
+ var file = files_1[_i];
186
+ if (file.id === id)
187
+ downloadPending.push(file);
188
+ }
189
+ });
190
+ console.log(selectedData);
191
+ function downloadMultipleFiles(files) {
192
+ // This function creates an anchor and triggers a download
193
+ function triggerDownload(url, fileName) {
194
+ var anchor = document.createElement("a");
195
+ anchor.href = url;
196
+ console.log(url);
197
+ anchor.download = fileName;
198
+ document.body.appendChild(anchor);
199
+ anchor.click();
200
+ document.body.removeChild(anchor);
201
+ }
202
+ // Iterate over the files array
203
+ files.forEach(function (file, index) {
204
+ // Set a timeout to space out the downloads
205
+ setTimeout(function () {
206
+ triggerDownload(file.link, file.fileName);
207
+ }, index * 1000); // Delay each download by 1 second
208
+ });
209
+ }
210
+ downloadMultipleFiles(downloadPending);
211
+ }
212
+ return (_jsxs(Fragment, { children: [_jsxs(CmrCollapse, __assign({ accordion: false, defaultActiveKey: [0, 1], expandIconPosition: "right" }, { children: [_jsxs(CmrPanel, __assign({ header: "Uploaded Data", className: "mb-2" }, { children: [_jsx(CmrTable, { dataSource: __spreadArray([], files, true).filter(function (file) {
213
+ var name = file.fileName.toLowerCase();
214
+ // return !name.endsWith(".zip") && !name.endsWith(".nii");
215
+ // TODO RJW: does this make sense? confusing if you upload a zip, it just disappears
216
+ return true; // Show all files for now
217
+ })
218
+ .reverse(), rowSelectionModel: selectedData, onRowSelectionModelChange: function (rowSelectionModel) {
219
+ setSelectedData(rowSelectionModel);
220
+ }, columns: uploadedFilesColumns }), _jsxs("div", __assign({ className: "row mt-2" }, { children: [_jsx("div", __assign({ className: "col-4" }, { children: _jsxs(Button, __assign({ color: "error", style: { textTransform: "none" }, variant: "contained", fullWidth: true, onClick: function () {
221
+ setName("Deleting Data");
222
+ setMessage("Please confirm that you are deleting the selected data.");
223
+ setColor("error");
224
+ setConfirmCallback(function () { return function () {
225
+ var _loop_1 = function (id) {
226
+ var file = files.find(function (row) { return row.id === id; });
227
+ if (file) {
228
+ dispatch(deleteUploadedData({
229
+ fileId: file.id
230
+ }));
231
+ }
232
+ };
233
+ for (var _i = 0, selectedData_1 = selectedData; _i < selectedData_1.length; _i++) {
234
+ var id = selectedData_1[_i];
235
+ _loop_1(id);
236
+ }
237
+ }; });
238
+ setOpen(true);
239
+ }, disabled: selectedData.length === 0 }, { children: [" ", _jsx(DeleteIcon, { className: "me-2" }), "Delete"] })) })), _jsx("div", __assign({ className: "col-4" }, { children: _jsxs(Button, __assign({ color: "success", style: { textTransform: "none" }, variant: "contained", fullWidth: true, onClick: function () {
240
+ downloadSelectedValues();
241
+ }, disabled: selectedData.length === 0 }, { children: [_jsx(GetAppIcon, { className: "me-2" }), "Download"] })) })), _jsx("div", __assign({ className: "col-4" }, { children: _jsx(CMRUpload, { fileExtension: [
242
+ ".nii",
243
+ ".nii.gz",
244
+ ".mha",
245
+ ".mhd",
246
+ ".mrd",
247
+ ".dat",
248
+ ".h5",
249
+ ".png",
250
+ ".jpg",
251
+ ".jpeg",
252
+ ".npx",
253
+ ".npy",
254
+ ".pkl",
255
+ ".mat",
256
+ ], color: "primary", fullWidth: true, onUploaded: function (res, file) {
257
+ dispatch(getUploadedData());
258
+ setUploadKey(uploadKey + 1);
259
+ }, uploadHandler: uploadHandlerFactory(uploadToken, dispatch, uploadData), maxCount: 1 }, uploadKey) }))] }))] }), "0"), _jsx(CmrNameDialog, { open: nameDialogOpen, setOpen: setNameDialogOpen, originalName: originalName, renamingCallback: renamingCallback }), _jsx(CmrConfirmation, { name: name, message: message, color: color, open: open, setOpen: setOpen, confirmCallback: confirmCallback, cancelCallback: cancelCallback, cancellable: true, width: 450 })] })), _jsx("div", { style: { height: "69px" } })] }));
260
+ };
261
+ export default Upload;
File without changes
@@ -0,0 +1,8 @@
1
+ import { ColorResult, RGBColor } from 'react-color';
2
+ import './CmrColorPicker.scss';
3
+ interface CmrColorPickerProps {
4
+ color: RGBColor;
5
+ onColorChange: (result: ColorResult) => void;
6
+ }
7
+ declare const CmrColorPicker: (props: CmrColorPickerProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default CmrColorPicker;
@@ -0,0 +1,29 @@
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 { useState } from 'react';
14
+ import { ChromePicker } from 'react-color';
15
+ import './CmrColorPicker.scss';
16
+ var CmrColorPicker = function (props) {
17
+ var color = props.color, onColorChange = props.onColorChange;
18
+ var _a = useState(false), displayColorPicker = _a[0], setDisplayColorPicker = _a[1];
19
+ var handleClick = function () {
20
+ setDisplayColorPicker(!displayColorPicker);
21
+ };
22
+ var handleClose = function () {
23
+ setDisplayColorPicker(false);
24
+ };
25
+ return (_jsxs("div", { children: [_jsx("div", __assign({ className: "swatch", onClick: handleClick }, { children: _jsx("div", { className: "color", style: {
26
+ backgroundColor: "rgba(".concat(color.r, ", ").concat(color.g, ", ").concat(color.b, ", ").concat(color.a, ")")
27
+ } }) })), displayColorPicker ? (_jsxs("div", __assign({ className: "popover" }, { children: [_jsx("div", { className: "cover", onClick: handleClose }), _jsx(ChromePicker, { color: color, onChange: onColorChange })] }))) : null] }));
28
+ };
29
+ export default CmrColorPicker;
@@ -0,0 +1,27 @@
1
+ .color {
2
+ width: 36px;
3
+ height: 14px;
4
+ border-radius: 2px;
5
+ }
6
+
7
+ .swatch {
8
+ padding: 5px;
9
+ background: #fff;
10
+ border-radius: 1px;
11
+ box-shadow: 0 0 0 1px rgba(0,0,0,.1);
12
+ display: inline-block;
13
+ cursor: pointer;
14
+ }
15
+
16
+ .popover {
17
+ position: absolute;
18
+ z-index: 2;
19
+ }
20
+
21
+ .cover {
22
+ position: fixed;
23
+ top: 0;
24
+ right: 0;
25
+ bottom: 0;
26
+ left: 0;
27
+ }
@@ -0,0 +1,8 @@
1
+ canvas:focus {
2
+ outline: none;
3
+ }
4
+
5
+ .js-plotly-plot,
6
+ .plot-container {
7
+ width:100%;
8
+ }