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.
- package/README.md +24 -24
- package/dist/CmrComponents/CmrButton/CmrButton.css +0 -0
- package/dist/CmrComponents/CmrButton/CmrButton.d.ts +4 -0
- package/dist/CmrComponents/CmrButton/CmrButton.js +30 -0
- package/dist/CmrComponents/CmrButton/index.d.ts +1 -0
- package/dist/CmrComponents/CmrButton/index.js +1 -0
- package/dist/CmrComponents/CmrCheckbox/CmrCheckbox.css +29 -0
- package/dist/CmrComponents/CmrCheckbox/CmrCheckbox.d.ts +14 -0
- package/dist/CmrComponents/CmrCheckbox/CmrCheckbox.js +30 -0
- package/dist/CmrComponents/CmrCheckbox/index.d.ts +1 -0
- package/dist/CmrComponents/CmrCheckbox/index.js +1 -0
- package/dist/CmrComponents/CmrColorPicker/CmrColorPicker.d.ts +8 -0
- package/dist/CmrComponents/CmrColorPicker/CmrColorPicker.js +29 -0
- package/dist/CmrComponents/CmrColorPicker/CmrColorPicker.scss +27 -0
- package/dist/CmrComponents/CmrInput/CmrInput.css +27 -0
- package/dist/CmrComponents/CmrInput/CmrInput.d.ts +17 -0
- package/dist/CmrComponents/CmrInput/CmrInput.js +29 -0
- package/dist/CmrComponents/CmrInput/index.d.ts +1 -0
- package/dist/CmrComponents/CmrInput/index.js +1 -0
- package/dist/CmrComponents/CmrRadioGroup/CmrRadioGroup.css +25 -0
- package/dist/CmrComponents/CmrRadioGroup/CmrRadioGroup.d.ts +15 -0
- package/dist/CmrComponents/CmrRadioGroup/CmrRadioGroup.js +37 -0
- package/dist/CmrComponents/CmrRadioGroup/index.d.ts +1 -0
- package/dist/CmrComponents/CmrRadioGroup/index.js +1 -0
- package/dist/CmrComponents/CmrSelect/CmrSelect.css +1 -0
- package/dist/CmrComponents/CmrSelect/CmrSelect.d.ts +24 -0
- package/dist/CmrComponents/CmrSelect/CmrSelect.js +46 -0
- package/dist/CmrComponents/CmrSelect/index.d.ts +1 -0
- package/dist/CmrComponents/CmrSelect/index.js +1 -0
- package/dist/CmrComponents/checkbox/Checkbox.css +8 -0
- package/dist/CmrComponents/checkbox/Checkbox.d.ts +15 -0
- package/dist/CmrComponents/checkbox/Checkbox.js +25 -0
- package/dist/CmrComponents/collapse/Collapse.css +3 -0
- package/dist/CmrComponents/collapse/Collapse.d.ts +18 -0
- package/dist/CmrComponents/collapse/Collapse.js +87 -0
- package/dist/CmrComponents/dialogue/Confirmation.d.ts +20 -0
- package/dist/CmrComponents/dialogue/Confirmation.js +36 -0
- package/dist/CmrComponents/dialogue/DeletionDialog.d.ts +4 -0
- package/dist/CmrComponents/dialogue/DeletionDialog.js +39 -0
- package/dist/CmrComponents/dialogue/EditConfirmation.d.ts +13 -0
- package/dist/CmrComponents/dialogue/EditConfirmation.js +45 -0
- package/dist/CmrComponents/double-slider/DualSlider.d.ts +21 -0
- package/dist/CmrComponents/double-slider/DualSlider.js +152 -0
- package/dist/CmrComponents/double-slider/InvertibleDualSlider.d.ts +24 -0
- package/dist/CmrComponents/double-slider/InvertibleDualSlider.js +174 -0
- package/dist/CmrComponents/gui-slider/ControlledSlider.d.ts +9 -0
- package/dist/CmrComponents/gui-slider/ControlledSlider.js +96 -0
- package/dist/CmrComponents/gui-slider/Slider.d.ts +20 -0
- package/dist/CmrComponents/gui-slider/Slider.js +127 -0
- package/dist/CmrComponents/header/Header.d.ts +17 -0
- package/dist/CmrComponents/header/Header.js +90 -0
- package/dist/CmrComponents/header/Header.scss +32 -0
- package/dist/CmrComponents/input-number/InputNumber.css +0 -0
- package/dist/CmrComponents/input-number/InputNumber.d.ts +17 -0
- package/dist/CmrComponents/input-number/InputNumber.js +30 -0
- package/dist/CmrComponents/label/Label.css +13 -0
- package/dist/CmrComponents/label/Label.d.ts +9 -0
- package/dist/CmrComponents/label/Label.js +18 -0
- package/dist/CmrComponents/panel/Panel.css +5 -0
- package/dist/CmrComponents/panel/Panel.d.ts +12 -0
- package/dist/CmrComponents/panel/Panel.js +42 -0
- package/dist/CmrComponents/rename/edit.d.ts +7 -0
- package/dist/CmrComponents/rename/edit.js +117 -0
- package/dist/CmrComponents/select-upload/SelectUpload.css +26 -0
- package/dist/CmrComponents/select-upload/SelectUpload.d.ts +33 -0
- package/dist/CmrComponents/select-upload/SelectUpload.js +90 -0
- package/dist/CmrComponents/tk-dualrange/TKDualRange.d.ts +17 -0
- package/dist/CmrComponents/tk-dualrange/TKDualRange.js +65 -0
- package/dist/CmrComponents/tk-dualrange/tk-dual-range.css +140 -0
- package/dist/CmrComponents/tooltip/Tooltip.css +0 -0
- package/dist/CmrComponents/tooltip/Tooltip.d.ts +18 -0
- package/dist/CmrComponents/tooltip/Tooltip.js +30 -0
- package/dist/CmrComponents/upload/Upload.css +5 -0
- package/dist/CmrComponents/upload/Upload.d.ts +80 -0
- package/dist/CmrComponents/upload/Upload.js +185 -0
- package/dist/CmrComponents/upload/UploadWindow.d.ts +15 -0
- package/dist/CmrComponents/upload/UploadWindow.js +286 -0
- package/dist/CmrTable/CmrTable.css +26 -0
- package/dist/CmrTable/CmrTable.d.ts +13 -0
- package/dist/CmrTable/CmrTable.js +47 -0
- package/dist/CmrTabs/CmrTabs.d.ts +7 -0
- package/dist/CmrTabs/CmrTabs.js +64 -0
- package/dist/CmrTabs/tab.model.d.ts +12 -0
- package/dist/CmrTabs/tab.model.js +1 -0
- package/dist/core/app/main/Main.d.ts +6 -0
- package/dist/core/app/main/Main.js +18 -0
- package/dist/core/app/results/Logs.d.ts +1 -0
- package/dist/core/app/results/Logs.js +33 -0
- package/dist/core/app/results/PreprocessJob.d.ts +1 -0
- package/dist/core/app/results/PreprocessJob.js +100 -0
- package/dist/core/app/results/Results.d.ts +15 -0
- package/dist/core/app/results/Results.js +372 -0
- package/dist/core/app/results/Results.scss +92 -0
- package/dist/core/app/results/Rois.d.ts +11 -0
- package/dist/core/app/results/Rois.js +269 -0
- package/dist/core/app/settings/Settings.d.ts +1 -0
- package/dist/core/app/settings/Settings.js +109 -0
- package/dist/core/app/signin/ForgotPassword.d.ts +3 -0
- package/dist/core/app/signin/ForgotPassword.js +142 -0
- package/dist/core/app/signin/Register.d.ts +3 -0
- package/dist/core/app/signin/Register.js +126 -0
- package/dist/core/app/signin/Signin.d.ts +5 -0
- package/dist/core/app/signin/Signin.js +84 -0
- package/dist/core/app/signin/Signin.scss +86 -0
- package/dist/core/app/upload/Upload.d.ts +3 -0
- package/dist/core/app/upload/Upload.js +261 -0
- package/dist/core/app/upload/Upload.scss +0 -0
- package/dist/core/common/components/CmrColorPicker/CmrColorPicker.d.ts +8 -0
- package/dist/core/common/components/CmrColorPicker/CmrColorPicker.js +29 -0
- package/dist/core/common/components/CmrColorPicker/CmrColorPicker.scss +27 -0
- package/dist/core/common/components/NiivueTools/Niivue.css +8 -0
- package/dist/core/common/components/NiivueTools/Niivue.d.ts +14 -0
- package/dist/core/common/components/NiivueTools/Niivue.js +1270 -0
- package/dist/core/common/components/NiivueTools/NiivuePatcher.js +1875 -0
- package/dist/core/common/components/NiivueTools/components/ColorPicker.d.ts +5 -0
- package/dist/core/common/components/NiivueTools/components/ColorPicker.js +68 -0
- package/dist/core/common/components/NiivueTools/components/DrawPlatte.d.ts +10 -0
- package/dist/core/common/components/NiivueTools/components/DrawPlatte.js +88 -0
- package/dist/core/common/components/NiivueTools/components/DrawToolKit.d.ts +32 -0
- package/dist/core/common/components/NiivueTools/components/DrawToolKit.js +164 -0
- package/dist/core/common/components/NiivueTools/components/EraserPlatte.d.ts +10 -0
- package/dist/core/common/components/NiivueTools/components/EraserPlatte.js +43 -0
- package/dist/core/common/components/NiivueTools/components/Layer.d.ts +10 -0
- package/dist/core/common/components/NiivueTools/components/Layer.js +117 -0
- package/dist/core/common/components/NiivueTools/components/LayersPanel.d.ts +8 -0
- package/dist/core/common/components/NiivueTools/components/LayersPanel.js +108 -0
- package/dist/core/common/components/NiivueTools/components/LocationTable.d.ts +9 -0
- package/dist/core/common/components/NiivueTools/components/LocationTable.js +42 -0
- package/dist/core/common/components/NiivueTools/components/MaskPlatte.d.ts +10 -0
- package/dist/core/common/components/NiivueTools/components/MaskPlatte.js +123 -0
- package/dist/core/common/components/NiivueTools/components/NiivuePanel.d.ts +34 -0
- package/dist/core/common/components/NiivueTools/components/NiivuePanel.js +305 -0
- package/dist/core/common/components/NiivueTools/components/NumberPicker.d.ts +8 -0
- package/dist/core/common/components/NiivueTools/components/NumberPicker.js +40 -0
- package/dist/core/common/components/NiivueTools/components/SettingsPanel.d.ts +7 -0
- package/dist/core/common/components/NiivueTools/components/SettingsPanel.js +30 -0
- package/dist/core/common/components/NiivueTools/components/Switch.d.ts +5 -0
- package/dist/core/common/components/NiivueTools/components/Switch.js +26 -0
- package/dist/core/common/components/NiivueTools/components/Toolbar.d.ts +40 -0
- package/dist/core/common/components/NiivueTools/components/Toolbar.js +184 -0
- package/dist/core/common/components/NiivueTools/components/Toolbar.scss +39 -0
- package/dist/core/common/components/NiivueTools/components/stats.d.ts +2 -0
- package/dist/core/common/components/NiivueTools/components/stats.js +13 -0
- package/dist/core/common/components/NiivueTools/index.css +14 -0
- package/dist/core/common/components/NiivueTools/util.js +309 -0
- package/dist/core/common/components/footer/Footer.d.ts +3 -0
- package/dist/core/common/components/footer/Footer.js +20 -0
- package/dist/core/common/components/footer/Footer.scss +5 -0
- package/dist/core/common/utilities/AuthenticatedRequests.d.ts +16 -0
- package/dist/core/common/utilities/AuthenticatedRequests.js +158 -0
- package/dist/core/common/utilities/CalendarHelper.d.ts +5 -0
- package/dist/core/common/utilities/CalendarHelper.js +27 -0
- package/dist/core/common/utilities/DownloadFromText.d.ts +3 -0
- package/dist/core/common/utilities/DownloadFromText.js +20 -0
- package/dist/core/common/utilities/StoreToRequest.d.ts +1 -0
- package/dist/core/common/utilities/StoreToRequest.js +4 -0
- package/dist/core/common/utilities/SystemUtilities.d.ts +4 -0
- package/dist/core/common/utilities/SystemUtilities.js +79 -0
- package/dist/core/common/utilities/file-transformation/anonymize.d.ts +1 -0
- package/dist/core/common/utilities/file-transformation/anonymize.js +114 -0
- package/dist/core/common/utilities/file-transformation/utilities.d.ts +2 -0
- package/dist/core/common/utilities/file-transformation/utilities.js +23 -0
- package/dist/core/common/utilities/index.d.ts +25 -0
- package/dist/core/common/utilities/index.js +118 -0
- package/dist/core/common/utilities/parse-jwt.d.ts +1 -0
- package/dist/core/common/utilities/parse-jwt.js +14 -0
- package/dist/core/components/PasswordRequirements.d.ts +7 -0
- package/dist/core/components/PasswordRequirements.js +30 -0
- package/dist/core/config/AppConfig.d.ts +5 -0
- package/dist/core/config/AppConfig.js +42 -0
- package/dist/core/config/types.d.ts +40 -0
- package/dist/core/config/types.js +1 -0
- package/dist/core/features/authenticate/authenticateActionCreation.d.ts +46 -0
- package/dist/core/features/authenticate/authenticateActionCreation.js +326 -0
- package/dist/core/features/authenticate/authenticateSlice.d.ts +45 -0
- package/dist/core/features/authenticate/authenticateSlice.js +203 -0
- package/dist/core/features/data/dataActionCreation.d.ts +40 -0
- package/dist/core/features/data/dataActionCreation.js +340 -0
- package/dist/core/features/data/dataSlice.d.ts +37 -0
- package/dist/core/features/data/dataSlice.js +87 -0
- package/dist/core/features/jobs/jobActionCreation.d.ts +35 -0
- package/dist/core/features/jobs/jobActionCreation.js +242 -0
- package/dist/core/features/jobs/jobsSlice.d.ts +57 -0
- package/dist/core/features/jobs/jobsSlice.js +54 -0
- package/dist/core/features/rois/resultActionCreation.d.ts +21 -0
- package/dist/core/features/rois/resultActionCreation.js +114 -0
- package/dist/core/features/rois/resultSlice.d.ts +24 -0
- package/dist/core/features/rois/resultSlice.js +68 -0
- package/dist/core/features/rois/roiTypes.d.ts +44 -0
- package/dist/core/features/rois/roiTypes.js +1 -0
- package/dist/core/features/setup/setupActionCreation.d.ts +7 -0
- package/dist/core/features/setup/setupActionCreation.js +100 -0
- package/dist/core/index.d.ts +22 -0
- package/dist/core/index.js +27 -0
- package/dist/core/store/configureStore.d.ts +13 -0
- package/dist/core/store/configureStore.js +38 -0
- package/dist/core/store/hooks.d.ts +11 -0
- package/dist/core/store/hooks.js +5 -0
- package/dist/core/utils/passwordValidation.d.ts +25 -0
- package/dist/core/utils/passwordValidation.js +19 -0
- package/dist/index.d.ts +29 -329
- package/dist/index.js +26 -1402
- package/dist/style.css +47 -0
- package/package.json +309 -41
- package/dist/index.css +0 -170
- package/dist/index.mjs +0 -1354
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
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;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var hasAnonymizedFields = function (text) {
|
|
38
|
+
// Detect long sequences of zeros, X's, or hexadecimal strings
|
|
39
|
+
var anonymizedPatterns = [
|
|
40
|
+
/\b0{10,}\b/,
|
|
41
|
+
/\b[xX]{4,}\b/,
|
|
42
|
+
/"[\da-fA-F]{16,}"/ // Hexadecimal strings (common in IDs)
|
|
43
|
+
];
|
|
44
|
+
return anonymizedPatterns.some(function (pattern) { return pattern.test(text); });
|
|
45
|
+
};
|
|
46
|
+
var detectPHI = function (text) {
|
|
47
|
+
var patterns = {
|
|
48
|
+
ssn: /\b\d{3}-\d{2}-\d{4}\b/,
|
|
49
|
+
address: /\b\d+ [A-Z][a-z]+ [A-Z][a-z]+, [A-Z]{2} \d{5}\b/,
|
|
50
|
+
patientname: /<ParamString\.["']PatientName["']>\s*{\s*["']([^"^]+)\^([^"^]+)["']\s*}/i
|
|
51
|
+
};
|
|
52
|
+
var detected = {};
|
|
53
|
+
for (var _i = 0, _a = Object.entries(patterns); _i < _a.length; _i++) {
|
|
54
|
+
var _b = _a[_i], key = _b[0], regex = _b[1];
|
|
55
|
+
var matches = text.match(regex);
|
|
56
|
+
if (matches) {
|
|
57
|
+
detected[key] = matches; // Store matches
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
var hasAnonymized = hasAnonymizedFields(text);
|
|
61
|
+
// If anonymized fields are found and no PHI is detected, return false (safe)
|
|
62
|
+
if (hasAnonymized) {
|
|
63
|
+
return false; // File is safe and anonymized
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
return Object.keys(detected).length > 0; // File is not safe if PHI is detected
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
export var is_safe_twix = function (file) { return __awaiter(void 0, void 0, void 0, function () {
|
|
70
|
+
var ssnRegex, addressRegex, nameRegex, anonymizedRegex, reader, decoder, _a, chunk, done, tail, text, finalText;
|
|
71
|
+
var _b;
|
|
72
|
+
return __generator(this, function (_c) {
|
|
73
|
+
switch (_c.label) {
|
|
74
|
+
case 0:
|
|
75
|
+
ssnRegex = /\b\d{3}-\d{2}-\d{4}\b/;
|
|
76
|
+
addressRegex = /\b\d+ [A-Z][a-z]+ [A-Z][a-z]+, [A-Z]{2} \d{5}\b/;
|
|
77
|
+
nameRegex = /<ParamString\.["']PatientName["']>\s*{\s*["']([^"^]+)\^([^"^]+)["']\s*}/i;
|
|
78
|
+
anonymizedRegex = /\b0{10,}\b|\b[xX]{4,}\b|["'][\da-fA-F]{16,}["']/g;
|
|
79
|
+
reader = file.stream().getReader();
|
|
80
|
+
decoder = new TextDecoder("utf-8");
|
|
81
|
+
return [4 /*yield*/, reader.read()];
|
|
82
|
+
case 1:
|
|
83
|
+
_a = _c.sent(), chunk = _a.value, done = _a.done;
|
|
84
|
+
tail = "";
|
|
85
|
+
_c.label = 2;
|
|
86
|
+
case 2:
|
|
87
|
+
if (!!done) return [3 /*break*/, 4];
|
|
88
|
+
text = tail + decoder.decode(chunk, { stream: true });
|
|
89
|
+
// keep a little tail in case pattern crosses chunk boundary
|
|
90
|
+
tail = text.slice(-50);
|
|
91
|
+
// check for anonymized fields first
|
|
92
|
+
if (anonymizedRegex.test(text)) {
|
|
93
|
+
return [2 /*return*/, true]; // safe
|
|
94
|
+
}
|
|
95
|
+
// check for any PHI
|
|
96
|
+
if (ssnRegex.test(text) || addressRegex.test(text) || nameRegex.test(text)) {
|
|
97
|
+
return [2 /*return*/, false]; // unsafe
|
|
98
|
+
}
|
|
99
|
+
return [4 /*yield*/, reader.read()];
|
|
100
|
+
case 3:
|
|
101
|
+
// read next chunk
|
|
102
|
+
(_b = _c.sent(), chunk = _b.value, done = _b.done);
|
|
103
|
+
return [3 /*break*/, 2];
|
|
104
|
+
case 4:
|
|
105
|
+
finalText = tail + decoder.decode();
|
|
106
|
+
if (anonymizedRegex.test(finalText))
|
|
107
|
+
return [2 /*return*/, true];
|
|
108
|
+
if (ssnRegex.test(finalText) || addressRegex.test(finalText) || nameRegex.test(finalText)) {
|
|
109
|
+
return [2 /*return*/, false];
|
|
110
|
+
}
|
|
111
|
+
return [2 /*return*/, true]; // no PHI found, no anonymized-fields found
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}); };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// File extension utility functions
|
|
2
|
+
export function getFileExtension(filename) {
|
|
3
|
+
var parts = filename.split('.');
|
|
4
|
+
if (parts.length === 1)
|
|
5
|
+
return '';
|
|
6
|
+
if (parts.length === 2)
|
|
7
|
+
return parts[1];
|
|
8
|
+
// Handle .nii.gz case
|
|
9
|
+
if (parts[parts.length - 2] === 'nii' && parts[parts.length - 1] === 'gz') {
|
|
10
|
+
return 'nii.gz';
|
|
11
|
+
}
|
|
12
|
+
return parts[parts.length - 1];
|
|
13
|
+
}
|
|
14
|
+
export function formatBytes(bytes, decimals) {
|
|
15
|
+
if (decimals === void 0) { decimals = 2; }
|
|
16
|
+
if (bytes === 0)
|
|
17
|
+
return '0 Bytes';
|
|
18
|
+
var k = 1024;
|
|
19
|
+
var dm = decimals < 0 ? 0 : decimals;
|
|
20
|
+
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
21
|
+
var i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
22
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
|
|
23
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const isUndefined: (value: any) => boolean;
|
|
2
|
+
export declare const complexToPolarR: (re: Array<number>, im: Array<number>) => number[];
|
|
3
|
+
export declare const complexToPolarP: (re: Array<number>, im: Array<number>) => number[];
|
|
4
|
+
declare global {
|
|
5
|
+
interface Array<T> {
|
|
6
|
+
GetMaxMin(): any;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export declare const getUIID: () => string;
|
|
10
|
+
export declare const linearFit2pts: (p0: any, p1: any) => {
|
|
11
|
+
q: any;
|
|
12
|
+
m: number;
|
|
13
|
+
};
|
|
14
|
+
export declare const purgenan: (array: any) => any;
|
|
15
|
+
export declare const average: (param: any) => number;
|
|
16
|
+
export declare const median: (numbers: any) => number;
|
|
17
|
+
export declare const formatBytes: (bytes: number, decimals?: number) => string;
|
|
18
|
+
export declare const getFileExtension: (fileName: string) => string;
|
|
19
|
+
/**
|
|
20
|
+
* Use get max and get min on voxels instead of using
|
|
21
|
+
* spread operators to prevent call stack exceptions
|
|
22
|
+
* @param array
|
|
23
|
+
*/
|
|
24
|
+
export declare function getMax(array: number[]): number;
|
|
25
|
+
export declare function getMin(array: number[]): number;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { complex, random } from "mathjs";
|
|
2
|
+
export var isUndefined = function (value) {
|
|
3
|
+
return typeof value === "undefined";
|
|
4
|
+
};
|
|
5
|
+
export var complexToPolarR = function (re, im) {
|
|
6
|
+
var result = [];
|
|
7
|
+
for (var i = 0; i < (re === null || re === void 0 ? void 0 : re.length); i++) {
|
|
8
|
+
var a = complex(re[i], im[i]);
|
|
9
|
+
var p = a.toPolar();
|
|
10
|
+
result[i] = p.r;
|
|
11
|
+
}
|
|
12
|
+
return result;
|
|
13
|
+
};
|
|
14
|
+
export var complexToPolarP = function (re, im) {
|
|
15
|
+
var result = [];
|
|
16
|
+
for (var i = 0; i < (re === null || re === void 0 ? void 0 : re.length); i++) {
|
|
17
|
+
var a = complex(re[i], im[i]);
|
|
18
|
+
var p = a.toPolar();
|
|
19
|
+
result[i] = p.phi;
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
23
|
+
Array.prototype.GetMaxMin = function () {
|
|
24
|
+
var max = Number.MIN_VALUE;
|
|
25
|
+
var min = Number.MAX_VALUE;
|
|
26
|
+
for (var i = 0, len = this.length; i < len; i++) {
|
|
27
|
+
if (isNaN(this[i])) {
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
if (this[i] > max)
|
|
31
|
+
max = this[i];
|
|
32
|
+
if (this[i] < min)
|
|
33
|
+
min = this[i];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { Max: max, Min: min };
|
|
37
|
+
};
|
|
38
|
+
export var getUIID = function () {
|
|
39
|
+
return (random().toString(36).substring(2, 15) +
|
|
40
|
+
random().toString(36).substring(2, 15));
|
|
41
|
+
};
|
|
42
|
+
export var linearFit2pts = function (p0, p1) {
|
|
43
|
+
var slope = (p1.y - p0.y) / (p1.x - p0.x);
|
|
44
|
+
var intercept = -slope * p0.x + p0.y;
|
|
45
|
+
return {
|
|
46
|
+
q: intercept,
|
|
47
|
+
m: slope
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
export var purgenan = function (array) {
|
|
51
|
+
var par = [];
|
|
52
|
+
for (var i = 0; i < array.length; i++) {
|
|
53
|
+
if (!isNaN(array[i])) {
|
|
54
|
+
par.push(array[i]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return par;
|
|
58
|
+
};
|
|
59
|
+
export var average = function (param) {
|
|
60
|
+
var sum = 0;
|
|
61
|
+
for (var i = 0; i < param.length; i++) {
|
|
62
|
+
sum += param[i];
|
|
63
|
+
}
|
|
64
|
+
return sum / param.length;
|
|
65
|
+
};
|
|
66
|
+
export var median = function (numbers) {
|
|
67
|
+
var median = 0, numsLen = numbers.length;
|
|
68
|
+
numbers.sort();
|
|
69
|
+
if (numsLen % 2 === 0) {
|
|
70
|
+
// average of two middle numbers
|
|
71
|
+
median = (numbers[numsLen / 2 - 1] + numbers[numsLen / 2]) / 2;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// middle number only
|
|
75
|
+
median = numbers[(numsLen - 1) / 2];
|
|
76
|
+
}
|
|
77
|
+
return median;
|
|
78
|
+
};
|
|
79
|
+
export var formatBytes = function (bytes, decimals) {
|
|
80
|
+
if (decimals === void 0) { decimals = 2; }
|
|
81
|
+
if (bytes === 0)
|
|
82
|
+
return "0 Bytes";
|
|
83
|
+
var k = 1024;
|
|
84
|
+
var dm = decimals < 0 ? 0 : decimals;
|
|
85
|
+
var sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
|
86
|
+
var i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
87
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
|
|
88
|
+
};
|
|
89
|
+
export var getFileExtension = function (fileName) {
|
|
90
|
+
var lower = fileName.toLowerCase();
|
|
91
|
+
if (lower.endsWith(".nii.gz"))
|
|
92
|
+
return "nii.gz";
|
|
93
|
+
var lastDot = lower.lastIndexOf(".");
|
|
94
|
+
return lastDot !== -1 ? lower.slice(lastDot + 1) : "";
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Use get max and get min on voxels instead of using
|
|
98
|
+
* spread operators to prevent call stack exceptions
|
|
99
|
+
* @param array
|
|
100
|
+
*/
|
|
101
|
+
export function getMax(array) {
|
|
102
|
+
var max = array.length > 0 ? array[0] : 0;
|
|
103
|
+
for (var _i = 0, array_1 = array; _i < array_1.length; _i++) {
|
|
104
|
+
var element = array_1[_i];
|
|
105
|
+
if (element > max)
|
|
106
|
+
max = element;
|
|
107
|
+
}
|
|
108
|
+
return max;
|
|
109
|
+
}
|
|
110
|
+
export function getMin(array) {
|
|
111
|
+
var min = array.length > 0 ? array[0] : 0;
|
|
112
|
+
for (var _i = 0, array_2 = array; _i < array_2.length; _i++) {
|
|
113
|
+
var element = array_2[_i];
|
|
114
|
+
if (element < min)
|
|
115
|
+
min = element;
|
|
116
|
+
}
|
|
117
|
+
return min;
|
|
118
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function parseJwt(token: string): any;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function parseJwt(token) {
|
|
2
|
+
try {
|
|
3
|
+
var base64Url = token.split('.')[1];
|
|
4
|
+
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
|
|
5
|
+
var jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
|
|
6
|
+
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
|
|
7
|
+
}).join(''));
|
|
8
|
+
return JSON.parse(jsonPayload);
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
console.error('Error parsing JWT:', e);
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PasswordValidation } from "../utils/passwordValidation";
|
|
2
|
+
interface PasswordRequirementsProps {
|
|
3
|
+
validation: PasswordValidation;
|
|
4
|
+
show: boolean;
|
|
5
|
+
}
|
|
6
|
+
export default function PasswordRequirements({ validation, show, }: PasswordRequirementsProps): import("react/jsx-runtime").JSX.Element | null;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
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 CheckCircleIcon from "@mui/icons-material/CheckCircle";
|
|
16
|
+
import CancelIcon from "@mui/icons-material/Cancel";
|
|
17
|
+
import { getPasswordRequirements, } from "../utils/passwordValidation";
|
|
18
|
+
export default function PasswordRequirements(_a) {
|
|
19
|
+
var validation = _a.validation, show = _a.show;
|
|
20
|
+
if (!show)
|
|
21
|
+
return null;
|
|
22
|
+
var requirements = getPasswordRequirements();
|
|
23
|
+
return (_jsxs(Box, __assign({ sx: { mt: 1, mb: 1 } }, { children: [_jsx(Typography, __assign({ variant: "caption", display: "block", sx: { mb: 0.5, fontWeight: "bold" } }, { children: "Password Requirements:" })), requirements.map(function (_a) {
|
|
24
|
+
var key = _a.key, label = _a.label;
|
|
25
|
+
var isValid = validation[key];
|
|
26
|
+
return (_jsxs(Typography, __assign({ variant: "caption", display: "flex", alignItems: "center", sx: {
|
|
27
|
+
color: isValid ? "success.main" : "error.main"
|
|
28
|
+
} }, { children: [isValid ? (_jsx(CheckCircleIcon, { sx: { fontSize: 16, mr: 0.5 } })) : (_jsx(CancelIcon, { sx: { fontSize: 16, mr: 0.5 } })), label] }), key));
|
|
29
|
+
})] })));
|
|
30
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { CloudMRCoreConfig, AppConfig, AppEndpoints } from './types';
|
|
2
|
+
export declare function initializeCloudMRCore(config: CloudMRCoreConfig): void;
|
|
3
|
+
export declare function getAppConfig(): AppConfig;
|
|
4
|
+
export declare function getEndpoints(): AppEndpoints;
|
|
5
|
+
export declare function createEndpoints(baseServer: string): AppEndpoints;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
var globalConfig = null;
|
|
2
|
+
export function initializeCloudMRCore(config) {
|
|
3
|
+
globalConfig = config;
|
|
4
|
+
}
|
|
5
|
+
export function getAppConfig() {
|
|
6
|
+
if (!globalConfig) {
|
|
7
|
+
throw new Error('CloudMR Core not initialized. Call initializeCloudMRCore() first.');
|
|
8
|
+
}
|
|
9
|
+
return globalConfig.appConfig;
|
|
10
|
+
}
|
|
11
|
+
export function getEndpoints() {
|
|
12
|
+
if (!globalConfig) {
|
|
13
|
+
throw new Error('CloudMR Core not initialized. Call initializeCloudMRCore() first.');
|
|
14
|
+
}
|
|
15
|
+
return globalConfig.endpoints;
|
|
16
|
+
}
|
|
17
|
+
export function createEndpoints(baseServer) {
|
|
18
|
+
return {
|
|
19
|
+
SIGNIN: "".concat(baseServer, "/auth/login"),
|
|
20
|
+
SIGNOUT: "".concat(baseServer, "/auth/logout"),
|
|
21
|
+
REGISTER: "".concat(baseServer, "/auth/register"),
|
|
22
|
+
CHANGE_PASSWORD: "".concat(baseServer, "/auth/change-password"),
|
|
23
|
+
FORGOT_PASSWORD: "".concat(baseServer, "/auth/forgot-password"),
|
|
24
|
+
RESET_PASSWORD: "".concat(baseServer, "/auth/reset-password"),
|
|
25
|
+
PROFILE: "".concat(baseServer, "/profile"),
|
|
26
|
+
REFRESH_TOKEN: "".concat(baseServer, "/auth/refresh"),
|
|
27
|
+
DATA_API: "".concat(baseServer, "/data/read"),
|
|
28
|
+
DATA_DELETE_API: "".concat(baseServer, "/data/delete"),
|
|
29
|
+
DATA_RENAME_API: "".concat(baseServer, "/data/update"),
|
|
30
|
+
DATA_UPLOAD_INIT: "".concat(baseServer, "/upload_initiate"),
|
|
31
|
+
DATA_UPLOAD_FINALIZE: "".concat(baseServer, "/upload_finalize"),
|
|
32
|
+
JOBS_API: "".concat(baseServer, "/pipeline/queue_job"),
|
|
33
|
+
JOBS_RETRIEVE_API: "".concat(baseServer, "/pipeline/list"),
|
|
34
|
+
JOBS_DELETE_API: "".concat(baseServer, "/pipeline/delete"),
|
|
35
|
+
JOBS_RENAME_API: "".concat(baseServer, "/pipeline/update"),
|
|
36
|
+
JOB_UPLOAD_INIT: "".concat(baseServer, "/upload_initiate/results"),
|
|
37
|
+
JOB_UPLOAD_FINALIZE: "".concat(baseServer, "/upload_finalize/results"),
|
|
38
|
+
ROI_GET: "".concat(baseServer, "/roi/list"),
|
|
39
|
+
ROI_UPLOAD: "".concat(baseServer, "/roi/upload"),
|
|
40
|
+
UNZIP: "".concat(baseServer, "/unzip")
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface AppEndpoints {
|
|
2
|
+
SIGNIN: string;
|
|
3
|
+
SIGNOUT: string;
|
|
4
|
+
REGISTER: string;
|
|
5
|
+
CHANGE_PASSWORD: string;
|
|
6
|
+
FORGOT_PASSWORD: string;
|
|
7
|
+
RESET_PASSWORD: string;
|
|
8
|
+
PROFILE: string;
|
|
9
|
+
REFRESH_TOKEN?: string;
|
|
10
|
+
FINEGRAIN?: string;
|
|
11
|
+
DATA_API: string;
|
|
12
|
+
DATA_DELETE_API: string;
|
|
13
|
+
DATA_RENAME_API: string;
|
|
14
|
+
DATA_UPLOAD_INIT: string;
|
|
15
|
+
DATA_UPLOAD_FINALIZE: string;
|
|
16
|
+
JOBS_API: string;
|
|
17
|
+
JOBS_RETRIEVE_API: string;
|
|
18
|
+
JOBS_DELETE_API: string;
|
|
19
|
+
JOBS_RENAME_API: string;
|
|
20
|
+
JOB_UPLOAD_INIT: string;
|
|
21
|
+
JOB_UPLOAD_FINALIZE: string;
|
|
22
|
+
ROI_GET: string;
|
|
23
|
+
ROI_UPLOAD: string;
|
|
24
|
+
UNZIP: string;
|
|
25
|
+
}
|
|
26
|
+
export interface AppConfig {
|
|
27
|
+
APP_NAME: string;
|
|
28
|
+
CLOUDMR_SERVER: string;
|
|
29
|
+
API_TOKEN: string;
|
|
30
|
+
API_URL?: string;
|
|
31
|
+
COGNITO_CLIENT_ID?: string;
|
|
32
|
+
USER_POOL_ID?: string;
|
|
33
|
+
REQUESTS_TIMEOUT?: number;
|
|
34
|
+
FILE_CHUNK_SIZE?: number;
|
|
35
|
+
APP_BUG_REPORT?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface CloudMRCoreConfig {
|
|
38
|
+
appConfig: AppConfig;
|
|
39
|
+
endpoints: AppEndpoints;
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AuthenticateToken } from "./authenticateSlice";
|
|
2
|
+
export interface SigninDataType {
|
|
3
|
+
email: string;
|
|
4
|
+
password: string;
|
|
5
|
+
}
|
|
6
|
+
export interface RegisterDataType {
|
|
7
|
+
email: string;
|
|
8
|
+
password: string;
|
|
9
|
+
firstname: string;
|
|
10
|
+
lastname: string;
|
|
11
|
+
username: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ChangePasswordDataType {
|
|
14
|
+
oldPassword: string;
|
|
15
|
+
newPassword: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ForgotPasswordDataType {
|
|
18
|
+
email: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ResetPasswordDataType {
|
|
21
|
+
email: string;
|
|
22
|
+
code: string;
|
|
23
|
+
newPassword: string;
|
|
24
|
+
}
|
|
25
|
+
export declare const registerUser: import("@reduxjs/toolkit").AsyncThunk<any, RegisterDataType, import("@reduxjs/toolkit").AsyncThunkConfig>;
|
|
26
|
+
export declare const changePassword: import("@reduxjs/toolkit").AsyncThunk<any, ChangePasswordDataType, import("@reduxjs/toolkit").AsyncThunkConfig>;
|
|
27
|
+
export declare const forgotPassword: import("@reduxjs/toolkit").AsyncThunk<any, ForgotPasswordDataType, import("@reduxjs/toolkit").AsyncThunkConfig>;
|
|
28
|
+
export declare const resetPassword: import("@reduxjs/toolkit").AsyncThunk<any, ResetPasswordDataType, import("@reduxjs/toolkit").AsyncThunkConfig>;
|
|
29
|
+
export declare const getLoggedInToken: import("@reduxjs/toolkit").AsyncThunk<any, SigninDataType, import("@reduxjs/toolkit").AsyncThunkConfig>;
|
|
30
|
+
export declare const signOut: import("@reduxjs/toolkit").AsyncThunk<{
|
|
31
|
+
message: string;
|
|
32
|
+
}, void, import("@reduxjs/toolkit").AsyncThunkConfig>;
|
|
33
|
+
export declare const getFineGrainToken: import("@reduxjs/toolkit").AsyncThunk<any, {
|
|
34
|
+
accessToken: string;
|
|
35
|
+
categories?: {
|
|
36
|
+
app: string;
|
|
37
|
+
activities: string[];
|
|
38
|
+
} | undefined;
|
|
39
|
+
}, import("@reduxjs/toolkit").AsyncThunkConfig>;
|
|
40
|
+
export declare const webSignin: import("@reduxjs/toolkit").AsyncThunk<{
|
|
41
|
+
access_token: string;
|
|
42
|
+
token_type: string;
|
|
43
|
+
expires_in: string;
|
|
44
|
+
}, string, import("@reduxjs/toolkit").AsyncThunkConfig>;
|
|
45
|
+
export declare const getProfile: import("@reduxjs/toolkit").AsyncThunk<any, string, import("@reduxjs/toolkit").AsyncThunkConfig>;
|
|
46
|
+
export declare const refreshAccessToken: import("@reduxjs/toolkit").AsyncThunk<AuthenticateToken, string, import("@reduxjs/toolkit").AsyncThunkConfig>;
|