cloudmr-ux 2.0.7 → 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,87 @@
|
|
|
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 __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
13
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
14
|
+
if (ar || !(i in from)) {
|
|
15
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
16
|
+
ar[i] = from[i];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
20
|
+
};
|
|
21
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
22
|
+
import React, { cloneElement } from "react";
|
|
23
|
+
import "./Collapse.css";
|
|
24
|
+
var CmrCollapse = function (props) {
|
|
25
|
+
var activeKey = props.activeKey, defaultActiveKey = props.defaultActiveKey, onChange = props.onChange, children = props.children;
|
|
26
|
+
defaultActiveKey = defaultActiveKey || [];
|
|
27
|
+
var _a = React.useState(defaultActiveKey), activeKeys = _a[0], setActiveKeys = _a[1];
|
|
28
|
+
// Sync activeKey prop with state
|
|
29
|
+
React.useEffect(function () {
|
|
30
|
+
if (activeKey !== undefined && activeKey !== activeKeys) {
|
|
31
|
+
if (Array.isArray(activeKey)) {
|
|
32
|
+
setActiveKeys(activeKey);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
setActiveKeys([activeKey]);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}, [activeKey]);
|
|
39
|
+
// Handle toggling panels
|
|
40
|
+
var onToggle = function (key) {
|
|
41
|
+
var newKeys = __spreadArray([], activeKeys, true);
|
|
42
|
+
var keyIndex = newKeys.indexOf(key);
|
|
43
|
+
if (keyIndex === -1) {
|
|
44
|
+
newKeys.push(key);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
newKeys.splice(keyIndex, 1);
|
|
48
|
+
}
|
|
49
|
+
setActiveKeys(newKeys);
|
|
50
|
+
if (onChange)
|
|
51
|
+
onChange(newKeys);
|
|
52
|
+
};
|
|
53
|
+
// Render children
|
|
54
|
+
var renderChildren = function () {
|
|
55
|
+
if (!children)
|
|
56
|
+
return null;
|
|
57
|
+
if (Array.isArray(children)) {
|
|
58
|
+
return children.map(function (child, index) {
|
|
59
|
+
var panelKey = index;
|
|
60
|
+
var expanded = activeKeys.includes(panelKey).toString();
|
|
61
|
+
// Make header clickable
|
|
62
|
+
var header = (_jsx("div", __assign({ onClick: function () { return onToggle(panelKey); }, style: { cursor: "pointer" } }, { children: child.props.header })));
|
|
63
|
+
return (_jsx(React.Fragment, { children: cloneElement(child, {
|
|
64
|
+
expanded: expanded,
|
|
65
|
+
// panelKey,
|
|
66
|
+
onToggle: onToggle,
|
|
67
|
+
header: header
|
|
68
|
+
}) }, panelKey));
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Handle single child case
|
|
73
|
+
var panelKey_1 = 0;
|
|
74
|
+
var expanded = activeKeys.includes(panelKey_1);
|
|
75
|
+
// Make header clickable
|
|
76
|
+
var header = (_jsx("div", __assign({ onClick: function () { return onToggle(panelKey_1); }, style: { cursor: "pointer" } }, { children: children.props.header })));
|
|
77
|
+
return cloneElement(children, {
|
|
78
|
+
expanded: expanded,
|
|
79
|
+
// panelKey,
|
|
80
|
+
onToggle: onToggle,
|
|
81
|
+
header: header
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
return (_jsx("div", __assign({ className: "cmr-collapse" }, { children: _jsx("div", { children: renderChildren() }) })));
|
|
86
|
+
};
|
|
87
|
+
export default CmrCollapse;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
type ExtraButton = {
|
|
2
|
+
text: string;
|
|
3
|
+
color?: "inherit" | "primary" | "secondary" | "success" | "error" | "info" | "warning";
|
|
4
|
+
onClick: () => void;
|
|
5
|
+
};
|
|
6
|
+
export default function CmrConfirmation({ name, message, cancelText, confirmText, color, open, setOpen, confirmCallback, cancelCallback, cancellable, width, extraButtons, }: {
|
|
7
|
+
name: string | undefined;
|
|
8
|
+
message: string | undefined;
|
|
9
|
+
cancelText?: string;
|
|
10
|
+
confirmText?: string;
|
|
11
|
+
color?: "inherit" | "primary" | "secondary" | "success" | "error" | "info" | "warning";
|
|
12
|
+
open: boolean;
|
|
13
|
+
setOpen: (open: boolean) => void;
|
|
14
|
+
confirmCallback?: () => void;
|
|
15
|
+
cancelCallback?: () => void;
|
|
16
|
+
cancellable?: boolean;
|
|
17
|
+
width?: number;
|
|
18
|
+
extraButtons?: ExtraButton[];
|
|
19
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
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 Dialog from '@mui/material/Dialog';
|
|
14
|
+
import DialogActions from '@mui/material/DialogActions';
|
|
15
|
+
import DialogContent from '@mui/material/DialogContent';
|
|
16
|
+
import DialogContentText from '@mui/material/DialogContentText';
|
|
17
|
+
import DialogTitle from '@mui/material/DialogTitle';
|
|
18
|
+
import CmrButton from '../CmrButton/CmrButton';
|
|
19
|
+
export default function CmrConfirmation(_a) {
|
|
20
|
+
var name = _a.name, message = _a.message, _b = _a.cancelText, cancelText = _b === void 0 ? 'Cancel' : _b, _c = _a.confirmText, confirmText = _c === void 0 ? 'Confirm' : _c, color = _a.color, open = _a.open, setOpen = _a.setOpen, _d = _a.confirmCallback, confirmCallback = _d === void 0 ? function () { } : _d, _e = _a.cancelCallback, cancelCallback = _e === void 0 ? function () { } : _e, _f = _a.cancellable, cancellable = _f === void 0 ? false : _f, width = _a.width, _g = _a.extraButtons, extraButtons = _g === void 0 ? [] : _g;
|
|
21
|
+
var handleClose = function () {
|
|
22
|
+
setOpen(false);
|
|
23
|
+
};
|
|
24
|
+
var handleConfirm = function () {
|
|
25
|
+
confirmCallback();
|
|
26
|
+
handleClose();
|
|
27
|
+
};
|
|
28
|
+
var handleCancel = function () {
|
|
29
|
+
cancelCallback();
|
|
30
|
+
handleClose();
|
|
31
|
+
};
|
|
32
|
+
return (_jsxs(Dialog, __assign({ open: open, onClose: handleClose }, { children: [_jsx(DialogTitle, { children: name ? name : 'Confirmation' }), _jsxs(DialogContent, __assign({ sx: { width: width } }, { children: [_jsx(DialogContentText, __assign({ alignContent: 'center' }, { children: message })), _jsxs(DialogActions, __assign({ className: 'mt-4' }, { children: [cancellable && (_jsx(CmrButton, __assign({ variant: "outlined", onClick: handleCancel }, { children: cancelText }))), extraButtons.map(function (btn, idx) { return (_jsx(CmrButton, __assign({ variant: "outlined", color: btn.color || 'success', onClick: function () {
|
|
33
|
+
btn.onClick();
|
|
34
|
+
handleClose();
|
|
35
|
+
} }, { children: btn.text }), idx)); }), _jsx(CmrButton, __assign({ variant: "contained", color: color, onClick: handleConfirm }, { children: confirmText }))] }))] }))] })));
|
|
36
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
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 * as React from 'react';
|
|
14
|
+
import TextField from '@mui/material/TextField';
|
|
15
|
+
import Dialog from '@mui/material/Dialog';
|
|
16
|
+
import DialogActions from '@mui/material/DialogActions';
|
|
17
|
+
import DialogContent from '@mui/material/DialogContent';
|
|
18
|
+
import DialogContentText from '@mui/material/DialogContentText';
|
|
19
|
+
import DialogTitle from '@mui/material/DialogTitle';
|
|
20
|
+
export default function CmrDeletionDialog(props) {
|
|
21
|
+
var _a = React.useState(true), open = _a[0], setOpen = _a[1];
|
|
22
|
+
var _b = React.useState(''), text = _b[0], setText = _b[1];
|
|
23
|
+
var handleClickOpen = function () {
|
|
24
|
+
setOpen(true);
|
|
25
|
+
};
|
|
26
|
+
var handleClose = function () {
|
|
27
|
+
setOpen(false);
|
|
28
|
+
};
|
|
29
|
+
var handleConfirm = function () {
|
|
30
|
+
if (text === props.name) {
|
|
31
|
+
props.deletionCallback();
|
|
32
|
+
setOpen(false);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
var handleTextFieldChange = function (e) {
|
|
36
|
+
setText(e.target.value);
|
|
37
|
+
};
|
|
38
|
+
return (_jsx("div", { children: _jsxs(Dialog, __assign({ open: open, onClose: handleClose }, { children: [_jsx(DialogTitle, { children: "Confirmation" }), _jsxs(DialogContent, { children: [_jsx(DialogContentText, { children: "To delete the files, please type your full name below and confirm." }), _jsx(TextField, { autoFocus: true, margin: "dense", id: "name", type: "email", placeholder: props.name, fullWidth: true, inputProps: { style: { fontSize: "16pt" } }, variant: "standard", onChange: handleTextFieldChange })] }), _jsxs(DialogActions, { children: [_jsx("button", __assign({ className: 'btn btn-secondary', onClick: handleClose }, { children: "Cancel" })), _jsx("button", __assign({ className: 'btn btn-danger', onClick: handleConfirm }, { children: "Confirm" }))] })] })) }));
|
|
39
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface EditConfirmationProps {
|
|
2
|
+
name?: string;
|
|
3
|
+
defaultText?: string;
|
|
4
|
+
message?: string;
|
|
5
|
+
color?: "inherit" | "primary" | "secondary" | "success" | "error" | "info" | "warning";
|
|
6
|
+
open: boolean;
|
|
7
|
+
setOpen: (open: boolean) => void;
|
|
8
|
+
confirmCallback?: (text: string) => void;
|
|
9
|
+
cancellable?: boolean;
|
|
10
|
+
cancelCallback?: (edit: string) => void;
|
|
11
|
+
suffix?: string;
|
|
12
|
+
}
|
|
13
|
+
export default function CmrEditConfirmation({ name, message, defaultText, color, open, setOpen, confirmCallback, cancellable, cancelCallback, suffix }: EditConfirmationProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,45 @@
|
|
|
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 * as React from 'react';
|
|
14
|
+
import TextField from '@mui/material/TextField';
|
|
15
|
+
import Dialog from '@mui/material/Dialog';
|
|
16
|
+
import DialogActions from '@mui/material/DialogActions';
|
|
17
|
+
import DialogContent from '@mui/material/DialogContent';
|
|
18
|
+
import DialogContentText from '@mui/material/DialogContentText';
|
|
19
|
+
import DialogTitle from '@mui/material/DialogTitle';
|
|
20
|
+
import CmrButton from '../CmrButton/CmrButton';
|
|
21
|
+
import { InputAdornment } from '@mui/material';
|
|
22
|
+
import { useEffect } from "react";
|
|
23
|
+
export default function CmrEditConfirmation(_a) {
|
|
24
|
+
var name = _a.name, message = _a.message, _b = _a.defaultText, defaultText = _b === void 0 ? '' : _b, color = _a.color, open = _a.open, setOpen = _a.setOpen, _c = _a.confirmCallback, confirmCallback = _c === void 0 ? function () { } : _c, _d = _a.cancellable, cancellable = _d === void 0 ? false : _d, _e = _a.cancelCallback, cancelCallback = _e === void 0 ? function () { } : _e, _f = _a.suffix, suffix = _f === void 0 ? '' : _f;
|
|
25
|
+
var _g = React.useState(defaultText), text = _g[0], setText = _g[1];
|
|
26
|
+
useEffect(function () {
|
|
27
|
+
if (open)
|
|
28
|
+
setText(defaultText);
|
|
29
|
+
}, [open]);
|
|
30
|
+
var handleClose = function () {
|
|
31
|
+
setOpen(false);
|
|
32
|
+
};
|
|
33
|
+
var handleConfirm = function () {
|
|
34
|
+
confirmCallback(text + suffix);
|
|
35
|
+
handleClose();
|
|
36
|
+
};
|
|
37
|
+
var handleCancel = function () {
|
|
38
|
+
cancelCallback(text + suffix);
|
|
39
|
+
handleClose();
|
|
40
|
+
};
|
|
41
|
+
return (_jsxs(Dialog, __assign({ maxWidth: "xs", fullWidth: true, open: open, onClose: handleCancel }, { children: [_jsx(DialogTitle, { children: name ? name : 'Confirmation' }), _jsxs(DialogContent, { children: [_jsx(DialogContentText, __assign({ alignContent: 'center' }, { children: message })), _jsx(DialogActions, { children: _jsx(TextField, { fullWidth: true, variant: 'standard', InputProps: {
|
|
42
|
+
endAdornment: (_jsx(InputAdornment, __assign({ position: "end", sx: { whiteSpace: 'nowrap' } }, { children: suffix })))
|
|
43
|
+
}, defaultValue: text, onChange: function (e) { return setText(e.target.value); } }) }), _jsxs(DialogActions, { children: [cancellable &&
|
|
44
|
+
_jsx(CmrButton, __assign({ variant: "outlined", onClick: handleCancel }, { children: "Cancel" })), _jsx(CmrButton, __assign({ variant: "contained", color: color, onClick: handleConfirm }, { children: "Confirm" }))] })] })] })));
|
|
45
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This dual slider (lil-gui styled) allows users to control the max and min of an interval simultaneously.
|
|
3
|
+
* The rendered interval (and number control) can be masked by a transformation - inverse pair.
|
|
4
|
+
* @param name
|
|
5
|
+
* @param min
|
|
6
|
+
* @param max
|
|
7
|
+
* @param setMin
|
|
8
|
+
* @param setMax
|
|
9
|
+
* @param transform transform and inverse are a pair that masks the rendered values and rendered inputs by a transformation
|
|
10
|
+
* @param inverse transform and inverse are a pair that masks the rendered values and rendered inputs by a transformation
|
|
11
|
+
* @constructor
|
|
12
|
+
*/
|
|
13
|
+
export declare const DualSlider: ({ name, min, max, setMin, setMax, transform, inverse }: {
|
|
14
|
+
name: string;
|
|
15
|
+
min: number;
|
|
16
|
+
max: number;
|
|
17
|
+
setMin?: ((min: number) => void) | undefined;
|
|
18
|
+
setMax?: ((max: number) => void) | undefined;
|
|
19
|
+
transform?: ((x: number) => number) | undefined;
|
|
20
|
+
inverse?: ((x: number) => number) | undefined;
|
|
21
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,152 @@
|
|
|
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";
|
|
14
|
+
import { useRef, useState } from "react";
|
|
15
|
+
/**
|
|
16
|
+
* This dual slider (lil-gui styled) allows users to control the max and min of an interval simultaneously.
|
|
17
|
+
* The rendered interval (and number control) can be masked by a transformation - inverse pair.
|
|
18
|
+
* @param name
|
|
19
|
+
* @param min
|
|
20
|
+
* @param max
|
|
21
|
+
* @param setMin
|
|
22
|
+
* @param setMax
|
|
23
|
+
* @param transform transform and inverse are a pair that masks the rendered values and rendered inputs by a transformation
|
|
24
|
+
* @param inverse transform and inverse are a pair that masks the rendered values and rendered inputs by a transformation
|
|
25
|
+
* @constructor
|
|
26
|
+
*/
|
|
27
|
+
export var DualSlider = function (_a) {
|
|
28
|
+
var name = _a.name, min = _a.min, max = _a.max, setMin = _a.setMin, setMax = _a.setMax, _b = _a.transform, transform = _b === void 0 ? function (x) { return x; } : _b, _c = _a.inverse, inverse = _c === void 0 ? function (x) { return x; } : _c;
|
|
29
|
+
var _d = useState(0), leftSliderPosition = _d[0], setLeftSliderPosition = _d[1]; // Initial percentage for the left slider
|
|
30
|
+
var _e = useState(100), rightSliderPosition = _e[0], setRightSliderPosition = _e[1]; // Initial percentage for the right slider
|
|
31
|
+
var _f = useState(false), isHovering = _f[0], setIsHovering = _f[1];
|
|
32
|
+
var _g = useState(false), leftEditing = _g[0], setLeftEditing = _g[1];
|
|
33
|
+
var _h = useState(undefined), minOverride = _h[0], setMinOverride = _h[1];
|
|
34
|
+
var _j = useState(undefined), maxOverride = _j[0], setMaxOverride = _j[1];
|
|
35
|
+
if (minOverride)
|
|
36
|
+
min = minOverride;
|
|
37
|
+
if (maxOverride)
|
|
38
|
+
max = maxOverride;
|
|
39
|
+
var a = transform((max - min) * leftSliderPosition / 100 + min);
|
|
40
|
+
var b = transform((max - min) * rightSliderPosition / 100 + min);
|
|
41
|
+
var left = Math.min(a, b);
|
|
42
|
+
var right = Math.max(a, b);
|
|
43
|
+
var sliderRef = useRef(null); // Ref for the parent box
|
|
44
|
+
var handleDragStart = function (e, slider) {
|
|
45
|
+
// Prevent default behavior
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
setLeftEditing(false);
|
|
48
|
+
setLeftIsNaN(false);
|
|
49
|
+
leftRef.current.blur();
|
|
50
|
+
setRightEditing(false);
|
|
51
|
+
setRightIsNaN(false);
|
|
52
|
+
rightRef.current.blur();
|
|
53
|
+
// Calculate initial positions
|
|
54
|
+
var startX = e.clientX;
|
|
55
|
+
// @ts-ignore
|
|
56
|
+
var sliderWidth = sliderRef.current.offsetWidth;
|
|
57
|
+
var handleMouseMove = function (e) {
|
|
58
|
+
var moveX = e.clientX - startX;
|
|
59
|
+
var newPosition = ((moveX / sliderWidth) * 100) + (slider === 'left' ? leftSliderPosition : rightSliderPosition);
|
|
60
|
+
// Prevent the slider from going outside the parent box
|
|
61
|
+
var clampedPosition = Math.min(100, Math.max(0, newPosition));
|
|
62
|
+
// Update the position of the slider
|
|
63
|
+
if (slider === 'left') {
|
|
64
|
+
setLeftSliderPosition(clampedPosition);
|
|
65
|
+
var a_1 = (max - min) * clampedPosition / 100 + min;
|
|
66
|
+
var b_1 = (max - min) * rightSliderPosition / 100 + min;
|
|
67
|
+
setMin && setMin(Math.min(a_1, b_1));
|
|
68
|
+
setMax && setMax(Math.max(a_1, b_1));
|
|
69
|
+
}
|
|
70
|
+
else if (slider === 'right') {
|
|
71
|
+
setRightSliderPosition(clampedPosition);
|
|
72
|
+
var a_2 = (max - min) * leftSliderPosition / 100 + min;
|
|
73
|
+
var b_2 = (max - min) * clampedPosition / 100 + min;
|
|
74
|
+
setMin && setMin(Math.min(a_2, b_2));
|
|
75
|
+
setMax && setMax(Math.max(a_2, b_2));
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
var handleMouseUp = function () {
|
|
79
|
+
// Remove event listeners once dragging is complete
|
|
80
|
+
document.removeEventListener('mousemove', handleMouseMove);
|
|
81
|
+
document.removeEventListener('mouseup', handleMouseUp);
|
|
82
|
+
};
|
|
83
|
+
// Add mouse move and mouse up listeners to document to handle drag
|
|
84
|
+
document.addEventListener('mousemove', handleMouseMove);
|
|
85
|
+
document.addEventListener('mouseup', handleMouseUp);
|
|
86
|
+
};
|
|
87
|
+
var leftText = Math.abs(left) < 0.01 && left != 0 ? Number(left).toExponential(3).toUpperCase() : Number(left).toFixed(3);
|
|
88
|
+
var _k = useState(''), leftEditedText = _k[0], setLeftEditedText = _k[1];
|
|
89
|
+
var _l = useState(false), leftIsNaN = _l[0], setLeftIsNaN = _l[1];
|
|
90
|
+
var leftRef = useRef(null);
|
|
91
|
+
var _m = useState(false), rightEditing = _m[0], setRightEditing = _m[1];
|
|
92
|
+
var _o = useState(''), rightEditedText = _o[0], setRightEditedText = _o[1];
|
|
93
|
+
var _p = useState(false), rightIsNaN = _p[0], setRightIsNaN = _p[1];
|
|
94
|
+
var rightRef = useRef(null);
|
|
95
|
+
// Logic to handle right value box editing...
|
|
96
|
+
var rightText = Math.abs(right) < 0.01 && right != 0 ? Number(right).toExponential(3).toUpperCase() : Number(right).toFixed(3);
|
|
97
|
+
return _jsxs(Box, __assign({ sx: { display: 'flex', flexDirection: 'row', paddingLeft: '4px', paddingRight: '4px' }, height: 20 }, { children: [_jsx(Box, __assign({ flex: 0.322, fontSize: 16, color: '#3D3D3D', alignItems: 'center', display: 'flex', marginBottom: '1pt', fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif' }, { children: name })), _jsxs(Box, __assign({ sx: { display: 'flex', flexDirection: 'row' }, flex: 1 }, { children: [_jsx("input", { ref: leftRef, style: { backgroundColor: '#f0f0f0', width: '45px', borderRadius: '2px', outline: "none", borderStyle: 'none', paddingLeft: '3px', paddingRight: '3px', lineHeight: '20px',
|
|
98
|
+
whiteSpace: 'nowrap', fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif', fontSize: '11px', color: leftIsNaN ? 'red' : 'black' }, value: (leftEditing) ? leftEditedText : leftText, onKeyDown: function (e) {
|
|
99
|
+
if (e.key === 'Enter' && !leftIsNaN) {
|
|
100
|
+
//@ts-ignore
|
|
101
|
+
e.target.blur(); // This will cause the input to lose focus
|
|
102
|
+
}
|
|
103
|
+
}, onFocus: function (e) {
|
|
104
|
+
setLeftEditedText(e.target.value);
|
|
105
|
+
setLeftEditing(true);
|
|
106
|
+
}, onChange: function (event) {
|
|
107
|
+
setLeftIsNaN(isNaN(Number(event.target.value)));
|
|
108
|
+
setLeftEditedText(event.target.value);
|
|
109
|
+
}, onBlur: function (e) {
|
|
110
|
+
var val = inverse(Number(leftEditedText));
|
|
111
|
+
if (isNaN(val)) {
|
|
112
|
+
return e.preventDefault();
|
|
113
|
+
}
|
|
114
|
+
setLeftEditing(false);
|
|
115
|
+
setMin && setMin(val);
|
|
116
|
+
var newMin = min;
|
|
117
|
+
if (val < min) {
|
|
118
|
+
setMinOverride(val);
|
|
119
|
+
newMin = val;
|
|
120
|
+
}
|
|
121
|
+
var leftPosition = (val - newMin) / (max - newMin) * 100;
|
|
122
|
+
setLeftSliderPosition(leftPosition);
|
|
123
|
+
} }), _jsxs(Box, __assign({ sx: { backgroundColor: '#f0f0f0', flex: 1, marginLeft: '4px', marginRight: '4px', borderRadius: '2px', position: 'relative',
|
|
124
|
+
overflow: 'hidden', opacity: isHovering ? 0.75 : 1
|
|
125
|
+
}, ref: sliderRef, onMouseEnter: function () { return setIsHovering(true); }, onMouseLeave: function () { return setIsHovering(false); } }, { children: [_jsx(Box, __assign({ sx: { position: 'absolute', left: "calc(".concat(leftSliderPosition * 0.97, "% - 10px)"), width: '20px', height: '100%', cursor: 'ew-resize', zIndex: 1 }, onMouseDown: function (e) { return handleDragStart(e, 'left'); } }, { children: _jsx(Box, { sx: { position: 'absolute', left: '10px', width: '2px', height: '100%', backgroundColor: 'black' } }) })), _jsx(Box, __assign({ sx: { position: 'absolute', right: "calc(".concat((100 - rightSliderPosition) * 0.97, "% - 10px)"), width: '20px', height: '100%', cursor: 'ew-resize', zIndex: 1 }, onMouseDown: function (e) { return handleDragStart(e, 'right'); } }, { children: _jsx(Box, { sx: { position: 'absolute', right: '10px', width: '2px', height: '100%', backgroundColor: 'black' } }) }))] })), _jsx("input", { style: { backgroundColor: '#f0f0f0', width: '45px', borderRadius: '2px', outline: "none", borderStyle: 'none', paddingLeft: '3px', paddingRight: '3px', lineHeight: '20px',
|
|
126
|
+
whiteSpace: 'nowrap', fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif', fontSize: '11px', color: rightIsNaN ? 'red' : 'black' }, value: (rightEditing) ? rightEditedText : rightText, ref: rightRef, onKeyDown: function (e) {
|
|
127
|
+
if (e.key === 'Enter' && !rightIsNaN) {
|
|
128
|
+
//@ts-ignore
|
|
129
|
+
e.target.blur(); // This will cause the input to lose focus
|
|
130
|
+
}
|
|
131
|
+
}, onFocus: function (e) {
|
|
132
|
+
setRightEditedText(e.target.value);
|
|
133
|
+
setRightEditing(true);
|
|
134
|
+
}, onChange: function (event) {
|
|
135
|
+
setRightIsNaN(isNaN(Number(event.target.value)));
|
|
136
|
+
setRightEditedText(event.target.value);
|
|
137
|
+
}, onBlur: function (e) {
|
|
138
|
+
var val = inverse(Number(rightEditedText));
|
|
139
|
+
if (isNaN(val)) {
|
|
140
|
+
return e.preventDefault();
|
|
141
|
+
}
|
|
142
|
+
setRightEditing(false);
|
|
143
|
+
setMax && setMax(val);
|
|
144
|
+
var newMax = max;
|
|
145
|
+
if (val > max) {
|
|
146
|
+
setMaxOverride(val);
|
|
147
|
+
newMax = val;
|
|
148
|
+
}
|
|
149
|
+
var rightPosition = (val - min) / (newMax - min) * 100;
|
|
150
|
+
setRightSliderPosition(rightPosition);
|
|
151
|
+
} })] }))] }));
|
|
152
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This dual slider (lil-gui styled) allows users to control the max and min of an interval simultaneously.
|
|
3
|
+
* The rendered interval (and number control) can be masked by a transformation - inverse pair.
|
|
4
|
+
* @param name
|
|
5
|
+
* @param min
|
|
6
|
+
* @param max
|
|
7
|
+
* @param setMin
|
|
8
|
+
* @param setMax
|
|
9
|
+
* @param reverse
|
|
10
|
+
* @param transform transform and inverse are a pair that masks the rendered values and rendered inputs by a transformation
|
|
11
|
+
* @param inverse transform and inverse are a pair that masks the rendered values and rendered inputs by a transformation
|
|
12
|
+
* @constructor
|
|
13
|
+
*/
|
|
14
|
+
export declare const InvertibleDualSlider: ({ name, min, max, setMin, setMax, reverse, transform, inverse, onFinalize }: {
|
|
15
|
+
name: string;
|
|
16
|
+
min: number;
|
|
17
|
+
max: number;
|
|
18
|
+
setMin?: ((min: number) => void) | undefined;
|
|
19
|
+
setMax?: ((max: number) => void) | undefined;
|
|
20
|
+
reverse?: boolean | undefined;
|
|
21
|
+
transform?: ((x: number) => number) | undefined;
|
|
22
|
+
inverse?: ((x: number) => number) | undefined;
|
|
23
|
+
onFinalize?: (() => void) | undefined;
|
|
24
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,174 @@
|
|
|
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";
|
|
14
|
+
import { useEffect, useRef, useState } from "react";
|
|
15
|
+
/**
|
|
16
|
+
* This dual slider (lil-gui styled) allows users to control the max and min of an interval simultaneously.
|
|
17
|
+
* The rendered interval (and number control) can be masked by a transformation - inverse pair.
|
|
18
|
+
* @param name
|
|
19
|
+
* @param min
|
|
20
|
+
* @param max
|
|
21
|
+
* @param setMin
|
|
22
|
+
* @param setMax
|
|
23
|
+
* @param reverse
|
|
24
|
+
* @param transform transform and inverse are a pair that masks the rendered values and rendered inputs by a transformation
|
|
25
|
+
* @param inverse transform and inverse are a pair that masks the rendered values and rendered inputs by a transformation
|
|
26
|
+
* @constructor
|
|
27
|
+
*/
|
|
28
|
+
export var InvertibleDualSlider = function (_a) {
|
|
29
|
+
var name = _a.name, min = _a.min, max = _a.max, setMin = _a.setMin, setMax = _a.setMax, _b = _a.reverse, reverse = _b === void 0 ? false : _b, _c = _a.transform, transform = _c === void 0 ? function (x) { return x; } : _c, _d = _a.inverse, inverse = _d === void 0 ? function (x) { return x; } : _d, onFinalize = _a.onFinalize;
|
|
30
|
+
var _e = useState(0), leftSliderPosition = _e[0], setLeftSliderPosition = _e[1]; // Initial percentage for the left slider
|
|
31
|
+
var _f = useState(100), rightSliderPosition = _f[0], setRightSliderPosition = _f[1]; // Initial percentage for the right slider
|
|
32
|
+
useEffect(function () {
|
|
33
|
+
setMin && setMin(min);
|
|
34
|
+
setMax && setMax(max);
|
|
35
|
+
setLeftSliderPosition(0);
|
|
36
|
+
setRightSliderPosition(100);
|
|
37
|
+
}, [min, max]);
|
|
38
|
+
var _g = useState(false), isHovering = _g[0], setIsHovering = _g[1];
|
|
39
|
+
var _h = useState(false), leftEditing = _h[0], setLeftEditing = _h[1];
|
|
40
|
+
var _j = useState(undefined), minOverride = _j[0], setMinOverride = _j[1];
|
|
41
|
+
var _k = useState(undefined), maxOverride = _k[0], setMaxOverride = _k[1];
|
|
42
|
+
if (minOverride)
|
|
43
|
+
min = minOverride;
|
|
44
|
+
if (maxOverride)
|
|
45
|
+
max = maxOverride;
|
|
46
|
+
var a = transform((max - min) * leftSliderPosition / 100 + min);
|
|
47
|
+
var b = transform((max - min) * rightSliderPosition / 100 + min);
|
|
48
|
+
var left = Math.min(a, b);
|
|
49
|
+
var right = Math.max(a, b);
|
|
50
|
+
var sliderRef = useRef(null); // Ref for the parent box
|
|
51
|
+
var handleDragStart = function (e, slider) {
|
|
52
|
+
// Prevent default behavior
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
setLeftEditing(false);
|
|
55
|
+
setLeftIsNaN(false);
|
|
56
|
+
leftRef.current.blur();
|
|
57
|
+
setRightEditing(false);
|
|
58
|
+
setRightIsNaN(false);
|
|
59
|
+
rightRef.current.blur();
|
|
60
|
+
// Calculate initial positions
|
|
61
|
+
var startX = e.clientX;
|
|
62
|
+
// @ts-ignore
|
|
63
|
+
var sliderWidth = sliderRef.current.offsetWidth;
|
|
64
|
+
var handleMouseMove = function (e) {
|
|
65
|
+
var moveX = e.clientX - startX;
|
|
66
|
+
var newPosition = ((moveX / sliderWidth) * 100) + (slider === 'left' ? leftSliderPosition : rightSliderPosition);
|
|
67
|
+
// Prevent the slider from going outside the parent box
|
|
68
|
+
var clampedPosition = Math.min(100, Math.max(0, newPosition));
|
|
69
|
+
// Update the position of the slider
|
|
70
|
+
if (slider === 'left') {
|
|
71
|
+
setLeftSliderPosition(clampedPosition);
|
|
72
|
+
var a_1 = (max - min) * clampedPosition / 100 + min;
|
|
73
|
+
var b_1 = (max - min) * rightSliderPosition / 100 + min;
|
|
74
|
+
setMin && setMin(Math.min(a_1, b_1));
|
|
75
|
+
setMax && setMax(Math.max(a_1, b_1));
|
|
76
|
+
}
|
|
77
|
+
else if (slider === 'right') {
|
|
78
|
+
setRightSliderPosition(clampedPosition);
|
|
79
|
+
var a_2 = (max - min) * leftSliderPosition / 100 + min;
|
|
80
|
+
var b_2 = (max - min) * clampedPosition / 100 + min;
|
|
81
|
+
setMin && setMin(Math.min(a_2, b_2));
|
|
82
|
+
setMax && setMax(Math.max(a_2, b_2));
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
var handleMouseUp = function () {
|
|
86
|
+
// Remove event listeners once dragging is complete
|
|
87
|
+
document.removeEventListener('mousemove', handleMouseMove);
|
|
88
|
+
document.removeEventListener('mouseup', handleMouseUp);
|
|
89
|
+
onFinalize && onFinalize();
|
|
90
|
+
};
|
|
91
|
+
// Add mouse move and mouse up listeners to document to handle drag
|
|
92
|
+
document.addEventListener('mousemove', handleMouseMove);
|
|
93
|
+
document.addEventListener('mouseup', handleMouseUp);
|
|
94
|
+
};
|
|
95
|
+
var leftText = Math.abs(left) < 0.01 && left != 0 ? Number(left).toExponential(3).toUpperCase() : Number(left).toFixed(3);
|
|
96
|
+
var _l = useState(''), leftEditedText = _l[0], setLeftEditedText = _l[1];
|
|
97
|
+
var _m = useState(false), leftIsNaN = _m[0], setLeftIsNaN = _m[1];
|
|
98
|
+
var leftRef = useRef(null);
|
|
99
|
+
var _o = useState(false), rightEditing = _o[0], setRightEditing = _o[1];
|
|
100
|
+
var _p = useState(''), rightEditedText = _p[0], setRightEditedText = _p[1];
|
|
101
|
+
var _q = useState(false), rightIsNaN = _q[0], setRightIsNaN = _q[1];
|
|
102
|
+
var rightRef = useRef(null);
|
|
103
|
+
// Logic to handle right value box editing...
|
|
104
|
+
var rightText = Math.abs(right) < 0.01 && right != 0 ? Number(right).toExponential(3).toUpperCase() : Number(right).toFixed(3);
|
|
105
|
+
return _jsxs(Box, __assign({ sx: { display: 'flex', flexDirection: 'row', paddingLeft: '4px', paddingRight: '4px' }, height: 27 }, { children: [name != '' && _jsx(Box, __assign({ fontSize: 16, marginRight: '5pt', color: 'white', alignItems: 'center', display: 'flex', marginBottom: '1pt', fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif' }, { children: name })), _jsxs(Box, __assign({ sx: { display: 'flex', flexDirection: 'row' }, flex: 1 }, { children: [_jsx("input", { ref: leftRef, style: { backgroundColor: '#ffffff', width: '45px', borderRadius: '2px', outline: "none", borderStyle: 'none', paddingLeft: '3px', paddingRight: '3px', lineHeight: '20px',
|
|
106
|
+
whiteSpace: 'nowrap', fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif', fontSize: '11px', color: leftIsNaN ? 'red' : 'black' }, value: (leftEditing) ? leftEditedText : leftText, onKeyDown: function (e) {
|
|
107
|
+
if (e.key === 'Enter' && !leftIsNaN) {
|
|
108
|
+
//@ts-ignore
|
|
109
|
+
e.target.blur(); // This will cause the input to lose focus
|
|
110
|
+
}
|
|
111
|
+
}, onFocus: function (e) {
|
|
112
|
+
setLeftEditedText(e.target.value);
|
|
113
|
+
setLeftEditing(true);
|
|
114
|
+
}, onChange: function (event) {
|
|
115
|
+
setLeftIsNaN(isNaN(Number(event.target.value)));
|
|
116
|
+
setLeftEditedText(event.target.value);
|
|
117
|
+
}, onBlur: function (e) {
|
|
118
|
+
var val = inverse(Number(leftEditedText));
|
|
119
|
+
if (isNaN(val)) {
|
|
120
|
+
return e.preventDefault();
|
|
121
|
+
}
|
|
122
|
+
setLeftEditing(false);
|
|
123
|
+
setMin && setMin(val);
|
|
124
|
+
var newMin = min;
|
|
125
|
+
if (val < min) {
|
|
126
|
+
setMinOverride(val);
|
|
127
|
+
newMin = val;
|
|
128
|
+
}
|
|
129
|
+
var leftPosition = (val - newMin) / (max - newMin) * 100;
|
|
130
|
+
setLeftSliderPosition(leftPosition);
|
|
131
|
+
onFinalize && onFinalize();
|
|
132
|
+
} }), _jsxs(Box, __assign({ sx: { backgroundColor: '#ffffff', flex: 1, marginLeft: '4px', marginRight: '4px', borderRadius: '2px', position: 'relative',
|
|
133
|
+
overflow: 'hidden'
|
|
134
|
+
}, ref: sliderRef, onMouseEnter: function () { return setIsHovering(true); }, onMouseLeave: function () { return setIsHovering(false); } }, { children: [!reverse && _jsx(Box, { sx: { backgroundColor: isHovering ? '#b9deff' : '#8ec7ff',
|
|
135
|
+
height: '100%', position: 'absolute',
|
|
136
|
+
left: "calc(".concat(Math.min(leftSliderPosition, rightSliderPosition + 3) * 0.97, "%)"),
|
|
137
|
+
right: "calc(".concat((100 - Math.max(leftSliderPosition - 3, rightSliderPosition)) * 0.97, "%)"),
|
|
138
|
+
zIndex: 1 } }), reverse && _jsx(Box, { sx: { backgroundColor: isHovering ? '#b9deff' : '#8ec7ff',
|
|
139
|
+
height: '100%', position: 'absolute',
|
|
140
|
+
left: "calc(".concat(Math.max(leftSliderPosition, rightSliderPosition + 3) * 0.97, "%)"),
|
|
141
|
+
right: "0",
|
|
142
|
+
zIndex: 1 } }), reverse && _jsx(Box, { sx: { backgroundColor: isHovering ? '#b9deff' : '#8ec7ff',
|
|
143
|
+
height: '100%', position: 'absolute',
|
|
144
|
+
left: "0",
|
|
145
|
+
right: "calc(".concat((100 - Math.min(leftSliderPosition - 3, rightSliderPosition)) * 0.97, "%)"),
|
|
146
|
+
zIndex: 1 } }), _jsx(Box, __assign({ sx: { position: 'absolute', left: "calc(".concat(leftSliderPosition * 0.97, "% - 10px)"), width: '20px', height: '100%', cursor: 'ew-resize', zIndex: 1 }, onMouseDown: function (e) { return handleDragStart(e, 'left'); } }, { children: _jsx(Box, { sx: { position: 'absolute', left: '10px', width: '2px', height: '100%', backgroundColor: '#2e9eff' } }) })), _jsx(Box, __assign({ sx: { position: 'absolute', right: "calc(".concat((100 - rightSliderPosition) * 0.97, "% - 10px)"), width: '20px', height: '100%', cursor: 'ew-resize', zIndex: 1 }, onMouseDown: function (e) { return handleDragStart(e, 'right'); } }, { children: _jsx(Box, { sx: { position: 'absolute', right: '10px', width: '2px', height: '100%', backgroundColor: '#2e9eff' } }) }))] })), _jsx("input", { style: { backgroundColor: '#ffffff', width: '45px', borderRadius: '2px', outline: "none", borderStyle: 'none', paddingLeft: '3px', paddingRight: '3px', lineHeight: '20px',
|
|
147
|
+
whiteSpace: 'nowrap', fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif', fontSize: '11px', color: rightIsNaN ? 'red' : 'black' }, value: (rightEditing) ? rightEditedText : rightText, ref: rightRef, onKeyDown: function (e) {
|
|
148
|
+
if (e.key === 'Enter' && !rightIsNaN) {
|
|
149
|
+
//@ts-ignore
|
|
150
|
+
e.target.blur(); // This will cause the input to lose focus
|
|
151
|
+
}
|
|
152
|
+
}, onFocus: function (e) {
|
|
153
|
+
setRightEditedText(e.target.value);
|
|
154
|
+
setRightEditing(true);
|
|
155
|
+
}, onChange: function (event) {
|
|
156
|
+
setRightIsNaN(isNaN(Number(event.target.value)));
|
|
157
|
+
setRightEditedText(event.target.value);
|
|
158
|
+
}, onBlur: function (e) {
|
|
159
|
+
var val = inverse(Number(rightEditedText));
|
|
160
|
+
if (isNaN(val)) {
|
|
161
|
+
return e.preventDefault();
|
|
162
|
+
}
|
|
163
|
+
setRightEditing(false);
|
|
164
|
+
setMax && setMax(val);
|
|
165
|
+
var newMax = max;
|
|
166
|
+
if (val > max) {
|
|
167
|
+
setMaxOverride(val);
|
|
168
|
+
newMax = val;
|
|
169
|
+
}
|
|
170
|
+
var rightPosition = (val - min) / (newMax - min) * 100;
|
|
171
|
+
setRightSliderPosition(rightPosition);
|
|
172
|
+
onFinalize && onFinalize();
|
|
173
|
+
} })] }))] }));
|
|
174
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const ControlledSlider: ({ name, min, max, setValue, transform, inverse, value }: {
|
|
2
|
+
name: string;
|
|
3
|
+
min: number;
|
|
4
|
+
max: number;
|
|
5
|
+
setValue?: ((value: number) => void) | undefined;
|
|
6
|
+
transform?: ((x: number) => number) | undefined;
|
|
7
|
+
inverse?: ((x: number) => number) | undefined;
|
|
8
|
+
value: number;
|
|
9
|
+
}) => import("react/jsx-runtime").JSX.Element;
|