@activecollab/components 1.0.370 → 1.0.371
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/dist/cjs/components/EditableHours/EditableHours.js +54 -19
- package/dist/cjs/components/EditableHours/EditableHours.js.map +1 -1
- package/dist/cjs/components/EditableText/EditableText.js +1 -1
- package/dist/cjs/components/EditableText/EditableText.js.map +1 -1
- package/dist/esm/components/EditableHours/EditableHours.d.ts +2 -0
- package/dist/esm/components/EditableHours/EditableHours.d.ts.map +1 -1
- package/dist/esm/components/EditableHours/EditableHours.js +53 -19
- package/dist/esm/components/EditableHours/EditableHours.js.map +1 -1
- package/dist/esm/components/EditableText/EditableText.d.ts.map +1 -1
- package/dist/esm/components/EditableText/EditableText.js +1 -1
- package/dist/esm/components/EditableText/EditableText.js.map +1 -1
- package/dist/index.js +55 -20
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,7 +10,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
10
10
|
var _timeUtils = require("../../utils/timeUtils");
|
|
11
11
|
var _useForkRef = _interopRequireDefault(require("../../utils/useForkRef"));
|
|
12
12
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
13
|
-
var _excluded = ["value", "onCancel", "onSave", "inputProps", "allowEmptyValue", "withLeadingZero", "validation"];
|
|
13
|
+
var _excluded = ["value", "onCancel", "onSave", "inputProps", "allowEmptyValue", "withLeadingZero", "validation", "incrementOnlySelected", "minuteIncrement"];
|
|
14
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
15
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
16
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
@@ -39,6 +39,10 @@ var EditableHours = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref)
|
|
|
39
39
|
validation = _ref$validation === void 0 ? function () {
|
|
40
40
|
return true;
|
|
41
41
|
} : _ref$validation,
|
|
42
|
+
_ref$incrementOnlySel = _ref.incrementOnlySelected,
|
|
43
|
+
incrementOnlySelected = _ref$incrementOnlySel === void 0 ? false : _ref$incrementOnlySel,
|
|
44
|
+
_ref$minuteIncrement = _ref.minuteIncrement,
|
|
45
|
+
minuteIncrement = _ref$minuteIncrement === void 0 ? 1 : _ref$minuteIncrement,
|
|
42
46
|
rest = _objectWithoutProperties(_ref, _excluded);
|
|
43
47
|
var inputRef = (0, _react.useRef)(null);
|
|
44
48
|
var handleRef = (0, _useForkRef.default)(ref, inputRef);
|
|
@@ -83,7 +87,7 @@ var EditableHours = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref)
|
|
|
83
87
|
setCurrentValue(_value);
|
|
84
88
|
typeof onSave === "function" && onSave(e);
|
|
85
89
|
} else {
|
|
86
|
-
!allowEmptyValue ? setCurrentValue(prevValue) : typeof onSave === "function" && onSave(e);
|
|
90
|
+
!allowEmptyValue ? setCurrentValue(prevValue) : typeof onSave === "function" && prevValue !== e.target.value && onSave(e);
|
|
87
91
|
}
|
|
88
92
|
}
|
|
89
93
|
}, [allowEmptyValue, onSave, prevValue, withLeadingZero]);
|
|
@@ -92,28 +96,46 @@ var EditableHours = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref)
|
|
|
92
96
|
var selectionStart = inputRef.current.selectionStart;
|
|
93
97
|
if (selectionStart !== null) {
|
|
94
98
|
var dotsIndex = currentValue.indexOf(":");
|
|
95
|
-
var
|
|
99
|
+
var _currentValue$split$m = currentValue.split(":").map(Number),
|
|
100
|
+
_currentValue$split$m2 = _slicedToArray(_currentValue$split$m, 2),
|
|
101
|
+
hours = _currentValue$split$m2[0],
|
|
102
|
+
minutes = _currentValue$split$m2[1];
|
|
103
|
+
var newHours = hours;
|
|
104
|
+
var newMinutes = minutes;
|
|
96
105
|
if (selectionStart < dotsIndex) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
106
|
+
if (increment) {
|
|
107
|
+
newHours += 1;
|
|
108
|
+
} else {
|
|
109
|
+
newHours -= 1;
|
|
110
|
+
if (newHours < 0) newHours = 0;
|
|
101
111
|
}
|
|
102
112
|
} else if (selectionStart > dotsIndex) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
113
|
+
if (increment) {
|
|
114
|
+
newMinutes += minuteIncrement;
|
|
115
|
+
if (newMinutes > 59) {
|
|
116
|
+
newMinutes = 0;
|
|
117
|
+
if (!incrementOnlySelected) newHours += 1;
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
if (newMinutes >= minuteIncrement || newMinutes === 0) {
|
|
121
|
+
newMinutes -= minuteIncrement;
|
|
122
|
+
if (newMinutes < 0 && newHours > 0) {
|
|
123
|
+
newMinutes = 60 - minuteIncrement;
|
|
124
|
+
if (!incrementOnlySelected) newHours -= 1;
|
|
125
|
+
}
|
|
126
|
+
if (newHours < 0) {
|
|
127
|
+
newHours = 0;
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
newMinutes = 0;
|
|
131
|
+
}
|
|
107
132
|
}
|
|
108
133
|
}
|
|
109
|
-
|
|
134
|
+
var newMinutesString = newMinutes < 10 ? "0".concat(newMinutes) : newMinutes;
|
|
135
|
+
var newHoursString = withLeadingZero && newHours < 10 ? "0".concat(newHours) : newHours;
|
|
136
|
+
var newValue = "".concat(newHoursString, ":").concat(newMinutesString);
|
|
137
|
+
if (validation(newValue)) {
|
|
110
138
|
setCurrentValue(newValue);
|
|
111
|
-
if (onSave) {
|
|
112
|
-
onSave(new Event("input", {
|
|
113
|
-
bubbles: true,
|
|
114
|
-
cancelable: true
|
|
115
|
-
}));
|
|
116
|
-
}
|
|
117
139
|
requestAnimationFrame(function () {
|
|
118
140
|
var _inputRef$current;
|
|
119
141
|
var newDotsIndex = newValue.indexOf(":");
|
|
@@ -125,11 +147,17 @@ var EditableHours = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref)
|
|
|
125
147
|
}
|
|
126
148
|
}
|
|
127
149
|
}
|
|
128
|
-
}, [currentValue,
|
|
150
|
+
}, [currentValue, incrementOnlySelected, minuteIncrement, validation, withLeadingZero]);
|
|
129
151
|
var handleKeyDown = (0, _react.useCallback)(function (e) {
|
|
130
152
|
if (e.key === "Enter") {
|
|
131
153
|
e.target.blur();
|
|
132
154
|
}
|
|
155
|
+
if (e.key === "ArrowLeft") {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (e.key === "ArrowRight") {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
133
161
|
if (e.key === "Escape") {
|
|
134
162
|
escapeRef.current = true;
|
|
135
163
|
e.target.blur();
|
|
@@ -203,6 +231,12 @@ var EditableHours = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref)
|
|
|
203
231
|
}
|
|
204
232
|
}
|
|
205
233
|
};
|
|
234
|
+
var handleDoubleClick = function handleDoubleClick() {
|
|
235
|
+
if (inputRef.current) {
|
|
236
|
+
var _inputRef$current7;
|
|
237
|
+
(_inputRef$current7 = inputRef.current) === null || _inputRef$current7 === void 0 ? void 0 : _inputRef$current7.setSelectionRange(0, currentValue.length);
|
|
238
|
+
}
|
|
239
|
+
};
|
|
206
240
|
return /*#__PURE__*/_react.default.createElement(_EditableContent.EditableContent, _extends({
|
|
207
241
|
ref: handleRef,
|
|
208
242
|
inputProps: _objectSpread(_objectSpread({}, inputProps), {}, {
|
|
@@ -212,6 +246,7 @@ var EditableHours = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref)
|
|
|
212
246
|
onChange: handleChange,
|
|
213
247
|
type: "text",
|
|
214
248
|
onClick: handleClick,
|
|
249
|
+
onDoubleClick: handleDoubleClick,
|
|
215
250
|
className: (0, _classnames.default)("c-input", inputProps === null || inputProps === void 0 ? void 0 : inputProps.className)
|
|
216
251
|
})
|
|
217
252
|
}, rest));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableHours.js","names":["EditableHours","React","forwardRef","ref","value","onCancel","onSave","inputProps","allowEmptyValue","withLeadingZero","validation","rest","inputRef","useRef","handleRef","useForkRef","useState","undefined","decimalToHours","currentValue","setCurrentValue","prevValue","setPrevValue","escapeRef","useEffect","_value","handleBlur","useCallback","e","current","target","trim","length","handleIncrementDecrement","increment","selectionStart","dotsIndex","indexOf","newValue","hours","parseInt","substring","newHours","minutes","newMinutes","Event","bubbles","cancelable","requestAnimationFrame","newDotsIndex","isHoursSelected","newSelectionStart","selectionEnd","setSelectionRange","handleKeyDown","key","blur","input","start","end","shiftKey","isMinutesSelected","preventDefault","handleChange","handleClick","onBlur","onKeyDown","onChange","type","onClick","className","classNames","displayName"],"sources":["../../../../src/components/EditableHours/EditableHours.tsx"],"sourcesContent":["import { EditableContent, EditableContentInterface } from \"../EditableContent\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { decimalToHours } from \"../../utils/timeUtils\";\nimport useForkRef from \"../../utils/useForkRef\";\nimport classNames from \"classnames\";\n\nexport interface EditableHoursProps extends EditableContentInterface {\n value?: number | string;\n onSave?: (e: Event) => void;\n onCancel?: () => void;\n withLeadingZero?: boolean;\n validation?: (value: string) => boolean;\n allowEmptyValue?: boolean;\n}\nexport const EditableHours = React.forwardRef<\n HTMLDivElement,\n EditableHoursProps\n>(\n (\n {\n value = 0,\n onCancel,\n onSave,\n inputProps,\n allowEmptyValue,\n withLeadingZero = true,\n validation = () => true,\n ...rest\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const handleRef = useForkRef(ref, inputRef);\n const [currentValue, setCurrentValue] = useState(() => {\n if (value !== undefined) {\n return decimalToHours(value, withLeadingZero);\n }\n return \"\";\n });\n const [prevValue, setPrevValue] = useState(() => {\n if (value !== undefined) {\n return decimalToHours(value, withLeadingZero);\n }\n return \"\";\n });\n const escapeRef = useRef(false);\n\n useEffect(() => {\n let _value;\n if (value !== undefined) {\n _value = decimalToHours(value, withLeadingZero);\n }\n\n if (currentValue !== _value) {\n setCurrentValue(_value);\n setPrevValue(_value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n escapeRef.current = false;\n } else {\n if (\n e.target.value.trim().length > 0 &&\n prevValue !== e.target.value\n ) {\n const _value = decimalToHours(e.target.value, withLeadingZero);\n\n setPrevValue(_value);\n setCurrentValue(_value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n !allowEmptyValue\n ? setCurrentValue(prevValue)\n : typeof onSave === \"function\" && onSave(e);\n }\n }\n },\n [allowEmptyValue, onSave, prevValue, withLeadingZero]\n );\n\n const handleIncrementDecrement = useCallback(\n (increment: boolean) => {\n if (inputRef.current) {\n const selectionStart = inputRef.current.selectionStart;\n if (selectionStart !== null) {\n const dotsIndex = currentValue.indexOf(\":\");\n let newValue = \"\";\n if (selectionStart < dotsIndex) {\n const hours = parseInt(currentValue.substring(0, dotsIndex), 10);\n const newHours = increment ? hours + 1 : hours - 1;\n if (newHours >= 0) {\n newValue = `${\n newHours < 10 ? \"0\" : \"\"\n }${newHours}:${currentValue.substring(dotsIndex + 1)}`;\n }\n } else if (selectionStart > dotsIndex) {\n const minutes = parseInt(\n currentValue.substring(dotsIndex + 1),\n 10\n );\n const newMinutes = increment ? minutes + 1 : minutes - 1;\n if (newMinutes >= 0 && newMinutes < 60) {\n newValue = `${currentValue.substring(0, dotsIndex + 1)}${\n newMinutes < 10 ? \"0\" : \"\"\n }${newMinutes}`;\n }\n }\n\n if (newValue && validation(newValue)) {\n setCurrentValue(newValue);\n if (onSave) {\n onSave(new Event(\"input\", { bubbles: true, cancelable: true }));\n }\n\n requestAnimationFrame(() => {\n const newDotsIndex = newValue.indexOf(\":\");\n const isHoursSelected = selectionStart < newDotsIndex;\n const newSelectionStart = isHoursSelected\n ? 0\n : newDotsIndex + 1;\n const selectionEnd = isHoursSelected\n ? newDotsIndex\n : newValue.length;\n inputRef.current?.setSelectionRange(\n newSelectionStart,\n selectionEnd\n );\n });\n }\n }\n }\n },\n [currentValue, inputRef, onSave, validation]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === \"Enter\") {\n e.target.blur();\n }\n if (e.key === \"Escape\") {\n escapeRef.current = true;\n e.target.blur();\n typeof onCancel === \"function\" && onCancel();\n }\n if (e.key === \"Backspace\") {\n return;\n }\n const input = e.target;\n const start = input.selectionStart;\n const end = input.selectionEnd;\n const currentValue = input.value;\n if (e.key === \"Tab\") {\n if (start !== end) {\n if (e.shiftKey) {\n const newDotsIndex = currentValue.indexOf(\":\");\n const isMinutesSelected = start > newDotsIndex;\n if (isMinutesSelected) {\n e.preventDefault();\n inputRef.current?.setSelectionRange(0, newDotsIndex);\n }\n } else {\n const newDotsIndex = currentValue.indexOf(\":\");\n const isHoursSelected = start < newDotsIndex;\n if (isHoursSelected) {\n e.preventDefault();\n inputRef.current?.setSelectionRange(\n newDotsIndex + 1,\n currentValue.length\n );\n }\n }\n }\n return;\n }\n\n if (start !== end) {\n if (e.key === \"ArrowUp\") {\n handleIncrementDecrement(true);\n return;\n }\n if (e.key === \"ArrowDown\") {\n handleIncrementDecrement(false);\n return;\n }\n const newValue =\n currentValue.substring(0, start) +\n e.key +\n currentValue.substring(end);\n if (!validation(newValue)) {\n e.preventDefault();\n return;\n }\n } else {\n const newValue =\n currentValue.substring(0, start) +\n e.key +\n currentValue.substring(end);\n\n if (!validation(newValue)) {\n e.preventDefault();\n return;\n }\n }\n },\n [handleIncrementDecrement, onCancel, validation]\n );\n\n const handleChange = useCallback((e) => {\n setCurrentValue(e.target.value);\n }, []);\n\n const handleClick = () => {\n const selectionStart = inputRef.current?.selectionStart;\n if (\n inputRef.current &&\n currentValue &&\n currentValue.length > 0 &&\n typeof selectionStart === \"number\"\n ) {\n const dotsIndex = currentValue.indexOf(\":\");\n if (selectionStart < dotsIndex) {\n inputRef.current?.setSelectionRange(0, dotsIndex);\n } else if (selectionStart >= dotsIndex) {\n inputRef.current?.setSelectionRange(\n dotsIndex + 1,\n currentValue.length\n );\n }\n }\n };\n\n return (\n <EditableContent\n ref={handleRef}\n inputProps={{\n ...inputProps,\n value: currentValue,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n type: \"text\",\n onClick: handleClick,\n className: classNames(\"c-input\", inputProps?.className),\n }}\n {...rest}\n />\n );\n }\n);\n\nEditableHours.displayName = \"EditableHours\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditableHours.js","names":["EditableHours","React","forwardRef","ref","value","onCancel","onSave","inputProps","allowEmptyValue","withLeadingZero","validation","incrementOnlySelected","minuteIncrement","rest","inputRef","useRef","handleRef","useForkRef","useState","undefined","decimalToHours","currentValue","setCurrentValue","prevValue","setPrevValue","escapeRef","useEffect","_value","handleBlur","useCallback","e","current","target","trim","length","handleIncrementDecrement","increment","selectionStart","dotsIndex","indexOf","split","map","Number","hours","minutes","newHours","newMinutes","newMinutesString","newHoursString","newValue","requestAnimationFrame","newDotsIndex","isHoursSelected","newSelectionStart","selectionEnd","setSelectionRange","handleKeyDown","key","blur","input","start","end","shiftKey","isMinutesSelected","preventDefault","substring","handleChange","handleClick","handleDoubleClick","onBlur","onKeyDown","onChange","type","onClick","onDoubleClick","className","classNames","displayName"],"sources":["../../../../src/components/EditableHours/EditableHours.tsx"],"sourcesContent":["import { EditableContent, EditableContentInterface } from \"../EditableContent\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { decimalToHours } from \"../../utils/timeUtils\";\nimport useForkRef from \"../../utils/useForkRef\";\nimport classNames from \"classnames\";\n\nexport interface EditableHoursProps extends EditableContentInterface {\n value?: number | string;\n onSave?: (e: Event) => void;\n onCancel?: () => void;\n withLeadingZero?: boolean;\n incrementOnlySelected?: boolean;\n validation?: (value: string) => boolean;\n allowEmptyValue?: boolean;\n minuteIncrement?: number;\n}\nexport const EditableHours = React.forwardRef<\n HTMLDivElement,\n EditableHoursProps\n>(\n (\n {\n value = 0,\n onCancel,\n onSave,\n inputProps,\n allowEmptyValue,\n withLeadingZero = true,\n validation = () => true,\n incrementOnlySelected = false,\n minuteIncrement = 1,\n ...rest\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const handleRef = useForkRef(ref, inputRef);\n const [currentValue, setCurrentValue] = useState(() => {\n if (value !== undefined) {\n return decimalToHours(value, withLeadingZero);\n }\n return \"\";\n });\n const [prevValue, setPrevValue] = useState(() => {\n if (value !== undefined) {\n return decimalToHours(value, withLeadingZero);\n }\n return \"\";\n });\n const escapeRef = useRef(false);\n\n useEffect(() => {\n let _value;\n if (value !== undefined) {\n _value = decimalToHours(value, withLeadingZero);\n }\n if (currentValue !== _value) {\n setCurrentValue(_value);\n setPrevValue(_value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n escapeRef.current = false;\n } else {\n if (\n e.target.value.trim().length > 0 &&\n prevValue !== e.target.value\n ) {\n const _value = decimalToHours(e.target.value, withLeadingZero);\n setPrevValue(_value);\n setCurrentValue(_value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n !allowEmptyValue\n ? setCurrentValue(prevValue)\n : typeof onSave === \"function\" &&\n prevValue !== e.target.value &&\n onSave(e);\n }\n }\n },\n [allowEmptyValue, onSave, prevValue, withLeadingZero]\n );\n\n const handleIncrementDecrement = useCallback(\n (increment: boolean) => {\n if (inputRef.current) {\n const selectionStart = inputRef.current.selectionStart;\n if (selectionStart !== null) {\n const dotsIndex = currentValue.indexOf(\":\");\n const [hours, minutes] = currentValue.split(\":\").map(Number);\n let newHours = hours;\n let newMinutes = minutes;\n\n if (selectionStart < dotsIndex) {\n if (increment) {\n newHours += 1;\n } else {\n newHours -= 1;\n if (newHours < 0) newHours = 0;\n }\n } else if (selectionStart > dotsIndex) {\n if (increment) {\n newMinutes += minuteIncrement;\n if (newMinutes > 59) {\n newMinutes = 0;\n if (!incrementOnlySelected) newHours += 1;\n }\n } else {\n if (newMinutes >= minuteIncrement || newMinutes === 0) {\n newMinutes -= minuteIncrement;\n if (newMinutes < 0 && newHours > 0) {\n newMinutes = 60 - minuteIncrement;\n if (!incrementOnlySelected) newHours -= 1;\n }\n if (newHours < 0) {\n newHours = 0;\n }\n } else {\n newMinutes = 0;\n }\n }\n }\n\n const newMinutesString =\n newMinutes < 10 ? `0${newMinutes}` : newMinutes;\n const newHoursString =\n withLeadingZero && newHours < 10 ? `0${newHours}` : newHours;\n const newValue = `${newHoursString}:${newMinutesString}`;\n\n if (validation(newValue)) {\n setCurrentValue(newValue);\n\n requestAnimationFrame(() => {\n const newDotsIndex = newValue.indexOf(\":\");\n const isHoursSelected = selectionStart < newDotsIndex;\n const newSelectionStart = isHoursSelected\n ? 0\n : newDotsIndex + 1;\n const selectionEnd = isHoursSelected\n ? newDotsIndex\n : newValue.length;\n inputRef.current?.setSelectionRange(\n newSelectionStart,\n selectionEnd\n );\n });\n }\n }\n }\n },\n [\n currentValue,\n incrementOnlySelected,\n minuteIncrement,\n validation,\n withLeadingZero,\n ]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === \"Enter\") {\n e.target.blur();\n }\n if (e.key === \"ArrowLeft\") {\n return;\n }\n if (e.key === \"ArrowRight\") {\n return;\n }\n if (e.key === \"Escape\") {\n escapeRef.current = true;\n e.target.blur();\n typeof onCancel === \"function\" && onCancel();\n }\n if (e.key === \"Backspace\") {\n return;\n }\n const input = e.target;\n const start = input.selectionStart;\n const end = input.selectionEnd;\n const currentValue = input.value;\n if (e.key === \"Tab\") {\n if (start !== end) {\n if (e.shiftKey) {\n const newDotsIndex = currentValue.indexOf(\":\");\n const isMinutesSelected = start > newDotsIndex;\n if (isMinutesSelected) {\n e.preventDefault();\n inputRef.current?.setSelectionRange(0, newDotsIndex);\n }\n } else {\n const newDotsIndex = currentValue.indexOf(\":\");\n const isHoursSelected = start < newDotsIndex;\n if (isHoursSelected) {\n e.preventDefault();\n inputRef.current?.setSelectionRange(\n newDotsIndex + 1,\n currentValue.length\n );\n }\n }\n }\n return;\n }\n\n if (start !== end) {\n if (e.key === \"ArrowUp\") {\n handleIncrementDecrement(true);\n return;\n }\n if (e.key === \"ArrowDown\") {\n handleIncrementDecrement(false);\n return;\n }\n const newValue =\n currentValue.substring(0, start) +\n e.key +\n currentValue.substring(end);\n if (!validation(newValue)) {\n e.preventDefault();\n return;\n }\n } else {\n const newValue =\n currentValue.substring(0, start) +\n e.key +\n currentValue.substring(end);\n\n if (!validation(newValue)) {\n e.preventDefault();\n return;\n }\n }\n },\n [handleIncrementDecrement, onCancel, validation]\n );\n\n const handleChange = useCallback((e) => {\n setCurrentValue(e.target.value);\n }, []);\n\n const handleClick = () => {\n const selectionStart = inputRef.current?.selectionStart;\n if (\n inputRef.current &&\n currentValue &&\n currentValue.length > 0 &&\n typeof selectionStart === \"number\"\n ) {\n const dotsIndex = currentValue.indexOf(\":\");\n if (selectionStart < dotsIndex) {\n inputRef.current?.setSelectionRange(0, dotsIndex);\n } else if (selectionStart >= dotsIndex) {\n inputRef.current?.setSelectionRange(\n dotsIndex + 1,\n currentValue.length\n );\n }\n }\n };\n\n const handleDoubleClick = () => {\n if (inputRef.current) {\n inputRef.current?.setSelectionRange(0, currentValue.length);\n }\n };\n\n return (\n <EditableContent\n ref={handleRef}\n inputProps={{\n ...inputProps,\n value: currentValue,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n type: \"text\",\n onClick: handleClick,\n onDoubleClick: handleDoubleClick,\n className: classNames(\"c-input\", inputProps?.className),\n }}\n {...rest}\n />\n );\n }\n);\n\nEditableHours.displayName = \"EditableHours\";\n"],"mappings":"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"}
|
|
@@ -57,7 +57,7 @@ var EditableText = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
57
57
|
setCurrentValue(e.target.value);
|
|
58
58
|
typeof onSave === "function" && onSave(e);
|
|
59
59
|
} else {
|
|
60
|
-
!allowEmptyString ? setCurrentValue(prevValue) : typeof onSave === "function" && onSave(e);
|
|
60
|
+
!allowEmptyString ? setCurrentValue(prevValue) : typeof onSave === "function" && prevValue !== e.target.value && onSave(e);
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
}, [allowEmptyString, onSave, prevValue]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableText.js","names":["EditableText","forwardRef","ref","onSave","onCancel","value","inputProps","allowEmptyString","props","useState","currentValue","setCurrentValue","prevValue","setPrevValue","escapeRef","useRef","useEffect","handleBlur","useCallback","e","current","target","trim","length","handleKeyDown","key","blur","handleChange","onBlur","onKeyDown","onChange","type","className","classNames","displayName"],"sources":["../../../../src/components/EditableText/EditableText.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n EditableContent,\n EditableContentInterface,\n} from \"../EditableContent/EditableContent\";\nimport classNames from \"classnames\";\n\nexport interface EditableTextInterface extends EditableContentInterface {\n /** Value to display. */\n value?: string | null;\n /** Optional callback called on enter, click outside and tab. */\n onSave?: (e: ChangeEvent<HTMLInputElement>) => void;\n /** Optional callback called on input reset. */\n onCancel?: () => void;\n /** If true, setting empty value will save it, instead of revert to previous value. */\n allowEmptyString?: boolean;\n}\n\nexport const EditableText = forwardRef<HTMLDivElement, EditableTextInterface>(\n (\n { onSave, onCancel, value, inputProps, allowEmptyString, ...props },\n ref\n ) => {\n const [currentValue, setCurrentValue] = useState(value);\n const [prevValue, setPrevValue] = useState(value);\n const escapeRef = useRef(false);\n\n useEffect(() => {\n if (currentValue !== value) {\n setCurrentValue(value);\n setPrevValue(value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n escapeRef.current = false;\n } else {\n if (\n e.target.value.trim().length > 0 &&\n prevValue !== e.target.value\n ) {\n setPrevValue(e.target.value);\n setCurrentValue(e.target.value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n !allowEmptyString\n ? setCurrentValue(prevValue)\n : typeof onSave === \"function\"
|
|
1
|
+
{"version":3,"file":"EditableText.js","names":["EditableText","forwardRef","ref","onSave","onCancel","value","inputProps","allowEmptyString","props","useState","currentValue","setCurrentValue","prevValue","setPrevValue","escapeRef","useRef","useEffect","handleBlur","useCallback","e","current","target","trim","length","handleKeyDown","key","blur","handleChange","onBlur","onKeyDown","onChange","type","className","classNames","displayName"],"sources":["../../../../src/components/EditableText/EditableText.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n EditableContent,\n EditableContentInterface,\n} from \"../EditableContent/EditableContent\";\nimport classNames from \"classnames\";\n\nexport interface EditableTextInterface extends EditableContentInterface {\n /** Value to display. */\n value?: string | null;\n /** Optional callback called on enter, click outside and tab. */\n onSave?: (e: ChangeEvent<HTMLInputElement>) => void;\n /** Optional callback called on input reset. */\n onCancel?: () => void;\n /** If true, setting empty value will save it, instead of revert to previous value. */\n allowEmptyString?: boolean;\n}\n\nexport const EditableText = forwardRef<HTMLDivElement, EditableTextInterface>(\n (\n { onSave, onCancel, value, inputProps, allowEmptyString, ...props },\n ref\n ) => {\n const [currentValue, setCurrentValue] = useState(value);\n const [prevValue, setPrevValue] = useState(value);\n const escapeRef = useRef(false);\n\n useEffect(() => {\n if (currentValue !== value) {\n setCurrentValue(value);\n setPrevValue(value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n escapeRef.current = false;\n } else {\n if (\n e.target.value.trim().length > 0 &&\n prevValue !== e.target.value\n ) {\n setPrevValue(e.target.value);\n setCurrentValue(e.target.value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n !allowEmptyString\n ? setCurrentValue(prevValue)\n : typeof onSave === \"function\" &&\n prevValue !== e.target.value &&\n onSave(e);\n }\n }\n },\n [allowEmptyString, onSave, prevValue]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === \"Enter\") {\n e.target.blur();\n }\n if (e.key === \"Escape\") {\n escapeRef.current = true;\n e.target.blur();\n typeof onCancel === \"function\" && onCancel();\n }\n },\n [onCancel]\n );\n\n const handleChange = useCallback((e) => {\n setCurrentValue(e.target.value);\n }, []);\n\n return (\n <EditableContent\n {...props}\n ref={ref}\n inputProps={{\n ...inputProps,\n value: currentValue ?? \"\",\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n type: \"text\",\n className: classNames(\"c-input\", inputProps?.className),\n }}\n />\n );\n }\n);\n\nEditableText.displayName = \"EditableText\";\n"],"mappings":"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"}
|
|
@@ -5,8 +5,10 @@ export interface EditableHoursProps extends EditableContentInterface {
|
|
|
5
5
|
onSave?: (e: Event) => void;
|
|
6
6
|
onCancel?: () => void;
|
|
7
7
|
withLeadingZero?: boolean;
|
|
8
|
+
incrementOnlySelected?: boolean;
|
|
8
9
|
validation?: (value: string) => boolean;
|
|
9
10
|
allowEmptyValue?: boolean;
|
|
11
|
+
minuteIncrement?: number;
|
|
10
12
|
}
|
|
11
13
|
export declare const EditableHours: React.ForwardRefExoticComponent<EditableHoursProps & React.RefAttributes<HTMLDivElement>>;
|
|
12
14
|
//# sourceMappingURL=EditableHours.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableHours.d.ts","sourceRoot":"","sources":["../../../../src/components/EditableHours/EditableHours.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAmD,MAAM,OAAO,CAAC;AAKxE,MAAM,WAAW,kBAAmB,SAAQ,wBAAwB;IAClE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"EditableHours.d.ts","sourceRoot":"","sources":["../../../../src/components/EditableHours/EditableHours.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAmD,MAAM,OAAO,CAAC;AAKxE,MAAM,WAAW,kBAAmB,SAAQ,wBAAwB;IAClE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AACD,eAAO,MAAM,aAAa,2FAoRzB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
var _excluded = ["value", "onCancel", "onSave", "inputProps", "allowEmptyValue", "withLeadingZero", "validation"];
|
|
3
|
+
var _excluded = ["value", "onCancel", "onSave", "inputProps", "allowEmptyValue", "withLeadingZero", "validation", "incrementOnlySelected", "minuteIncrement"];
|
|
4
4
|
import { EditableContent } from "../EditableContent";
|
|
5
5
|
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
6
6
|
import { decimalToHours } from "../../utils/timeUtils";
|
|
@@ -19,6 +19,10 @@ export var EditableHours = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
19
19
|
validation = _ref$validation === void 0 ? function () {
|
|
20
20
|
return true;
|
|
21
21
|
} : _ref$validation,
|
|
22
|
+
_ref$incrementOnlySel = _ref.incrementOnlySelected,
|
|
23
|
+
incrementOnlySelected = _ref$incrementOnlySel === void 0 ? false : _ref$incrementOnlySel,
|
|
24
|
+
_ref$minuteIncrement = _ref.minuteIncrement,
|
|
25
|
+
minuteIncrement = _ref$minuteIncrement === void 0 ? 1 : _ref$minuteIncrement,
|
|
22
26
|
rest = _objectWithoutPropertiesLoose(_ref, _excluded);
|
|
23
27
|
var inputRef = useRef(null);
|
|
24
28
|
var handleRef = useForkRef(ref, inputRef);
|
|
@@ -61,7 +65,7 @@ export var EditableHours = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
61
65
|
setCurrentValue(_value);
|
|
62
66
|
typeof onSave === "function" && onSave(e);
|
|
63
67
|
} else {
|
|
64
|
-
!allowEmptyValue ? setCurrentValue(prevValue) : typeof onSave === "function" && onSave(e);
|
|
68
|
+
!allowEmptyValue ? setCurrentValue(prevValue) : typeof onSave === "function" && prevValue !== e.target.value && onSave(e);
|
|
65
69
|
}
|
|
66
70
|
}
|
|
67
71
|
}, [allowEmptyValue, onSave, prevValue, withLeadingZero]);
|
|
@@ -70,28 +74,45 @@ export var EditableHours = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
70
74
|
var selectionStart = inputRef.current.selectionStart;
|
|
71
75
|
if (selectionStart !== null) {
|
|
72
76
|
var dotsIndex = currentValue.indexOf(":");
|
|
73
|
-
var
|
|
77
|
+
var _currentValue$split$m = currentValue.split(":").map(Number),
|
|
78
|
+
hours = _currentValue$split$m[0],
|
|
79
|
+
minutes = _currentValue$split$m[1];
|
|
80
|
+
var newHours = hours;
|
|
81
|
+
var newMinutes = minutes;
|
|
74
82
|
if (selectionStart < dotsIndex) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
if (increment) {
|
|
84
|
+
newHours += 1;
|
|
85
|
+
} else {
|
|
86
|
+
newHours -= 1;
|
|
87
|
+
if (newHours < 0) newHours = 0;
|
|
79
88
|
}
|
|
80
89
|
} else if (selectionStart > dotsIndex) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
90
|
+
if (increment) {
|
|
91
|
+
newMinutes += minuteIncrement;
|
|
92
|
+
if (newMinutes > 59) {
|
|
93
|
+
newMinutes = 0;
|
|
94
|
+
if (!incrementOnlySelected) newHours += 1;
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
if (newMinutes >= minuteIncrement || newMinutes === 0) {
|
|
98
|
+
newMinutes -= minuteIncrement;
|
|
99
|
+
if (newMinutes < 0 && newHours > 0) {
|
|
100
|
+
newMinutes = 60 - minuteIncrement;
|
|
101
|
+
if (!incrementOnlySelected) newHours -= 1;
|
|
102
|
+
}
|
|
103
|
+
if (newHours < 0) {
|
|
104
|
+
newHours = 0;
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
newMinutes = 0;
|
|
108
|
+
}
|
|
85
109
|
}
|
|
86
110
|
}
|
|
87
|
-
|
|
111
|
+
var newMinutesString = newMinutes < 10 ? "0" + newMinutes : newMinutes;
|
|
112
|
+
var newHoursString = withLeadingZero && newHours < 10 ? "0" + newHours : newHours;
|
|
113
|
+
var newValue = newHoursString + ":" + newMinutesString;
|
|
114
|
+
if (validation(newValue)) {
|
|
88
115
|
setCurrentValue(newValue);
|
|
89
|
-
if (onSave) {
|
|
90
|
-
onSave(new Event("input", {
|
|
91
|
-
bubbles: true,
|
|
92
|
-
cancelable: true
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
116
|
requestAnimationFrame(function () {
|
|
96
117
|
var _inputRef$current;
|
|
97
118
|
var newDotsIndex = newValue.indexOf(":");
|
|
@@ -103,11 +124,17 @@ export var EditableHours = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
103
124
|
}
|
|
104
125
|
}
|
|
105
126
|
}
|
|
106
|
-
}, [currentValue,
|
|
127
|
+
}, [currentValue, incrementOnlySelected, minuteIncrement, validation, withLeadingZero]);
|
|
107
128
|
var handleKeyDown = useCallback(function (e) {
|
|
108
129
|
if (e.key === "Enter") {
|
|
109
130
|
e.target.blur();
|
|
110
131
|
}
|
|
132
|
+
if (e.key === "ArrowLeft") {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (e.key === "ArrowRight") {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
111
138
|
if (e.key === "Escape") {
|
|
112
139
|
escapeRef.current = true;
|
|
113
140
|
e.target.blur();
|
|
@@ -181,6 +208,12 @@ export var EditableHours = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
181
208
|
}
|
|
182
209
|
}
|
|
183
210
|
};
|
|
211
|
+
var handleDoubleClick = function handleDoubleClick() {
|
|
212
|
+
if (inputRef.current) {
|
|
213
|
+
var _inputRef$current7;
|
|
214
|
+
(_inputRef$current7 = inputRef.current) == null ? void 0 : _inputRef$current7.setSelectionRange(0, currentValue.length);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
184
217
|
return /*#__PURE__*/React.createElement(EditableContent, _extends({
|
|
185
218
|
ref: handleRef,
|
|
186
219
|
inputProps: _extends({}, inputProps, {
|
|
@@ -190,6 +223,7 @@ export var EditableHours = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
190
223
|
onChange: handleChange,
|
|
191
224
|
type: "text",
|
|
192
225
|
onClick: handleClick,
|
|
226
|
+
onDoubleClick: handleDoubleClick,
|
|
193
227
|
className: classNames("c-input", inputProps == null ? void 0 : inputProps.className)
|
|
194
228
|
})
|
|
195
229
|
}, rest));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableHours.js","names":["EditableContent","React","useCallback","useEffect","useRef","useState","decimalToHours","useForkRef","classNames","EditableHours","forwardRef","ref","value","onCancel","onSave","inputProps","allowEmptyValue","withLeadingZero","validation","rest","inputRef","handleRef","undefined","currentValue","setCurrentValue","prevValue","setPrevValue","escapeRef","_value","handleBlur","e","current","target","trim","length","handleIncrementDecrement","increment","selectionStart","dotsIndex","indexOf","newValue","hours","parseInt","substring","newHours","minutes","newMinutes","Event","bubbles","cancelable","requestAnimationFrame","newDotsIndex","isHoursSelected","newSelectionStart","selectionEnd","setSelectionRange","handleKeyDown","key","blur","input","start","end","shiftKey","isMinutesSelected","preventDefault","handleChange","handleClick","onBlur","onKeyDown","onChange","type","onClick","className","displayName"],"sources":["../../../../src/components/EditableHours/EditableHours.tsx"],"sourcesContent":["import { EditableContent, EditableContentInterface } from \"../EditableContent\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { decimalToHours } from \"../../utils/timeUtils\";\nimport useForkRef from \"../../utils/useForkRef\";\nimport classNames from \"classnames\";\n\nexport interface EditableHoursProps extends EditableContentInterface {\n value?: number | string;\n onSave?: (e: Event) => void;\n onCancel?: () => void;\n withLeadingZero?: boolean;\n validation?: (value: string) => boolean;\n allowEmptyValue?: boolean;\n}\nexport const EditableHours = React.forwardRef<\n HTMLDivElement,\n EditableHoursProps\n>(\n (\n {\n value = 0,\n onCancel,\n onSave,\n inputProps,\n allowEmptyValue,\n withLeadingZero = true,\n validation = () => true,\n ...rest\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const handleRef = useForkRef(ref, inputRef);\n const [currentValue, setCurrentValue] = useState(() => {\n if (value !== undefined) {\n return decimalToHours(value, withLeadingZero);\n }\n return \"\";\n });\n const [prevValue, setPrevValue] = useState(() => {\n if (value !== undefined) {\n return decimalToHours(value, withLeadingZero);\n }\n return \"\";\n });\n const escapeRef = useRef(false);\n\n useEffect(() => {\n let _value;\n if (value !== undefined) {\n _value = decimalToHours(value, withLeadingZero);\n }\n\n if (currentValue !== _value) {\n setCurrentValue(_value);\n setPrevValue(_value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n escapeRef.current = false;\n } else {\n if (\n e.target.value.trim().length > 0 &&\n prevValue !== e.target.value\n ) {\n const _value = decimalToHours(e.target.value, withLeadingZero);\n\n setPrevValue(_value);\n setCurrentValue(_value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n !allowEmptyValue\n ? setCurrentValue(prevValue)\n : typeof onSave === \"function\" && onSave(e);\n }\n }\n },\n [allowEmptyValue, onSave, prevValue, withLeadingZero]\n );\n\n const handleIncrementDecrement = useCallback(\n (increment: boolean) => {\n if (inputRef.current) {\n const selectionStart = inputRef.current.selectionStart;\n if (selectionStart !== null) {\n const dotsIndex = currentValue.indexOf(\":\");\n let newValue = \"\";\n if (selectionStart < dotsIndex) {\n const hours = parseInt(currentValue.substring(0, dotsIndex), 10);\n const newHours = increment ? hours + 1 : hours - 1;\n if (newHours >= 0) {\n newValue = `${\n newHours < 10 ? \"0\" : \"\"\n }${newHours}:${currentValue.substring(dotsIndex + 1)}`;\n }\n } else if (selectionStart > dotsIndex) {\n const minutes = parseInt(\n currentValue.substring(dotsIndex + 1),\n 10\n );\n const newMinutes = increment ? minutes + 1 : minutes - 1;\n if (newMinutes >= 0 && newMinutes < 60) {\n newValue = `${currentValue.substring(0, dotsIndex + 1)}${\n newMinutes < 10 ? \"0\" : \"\"\n }${newMinutes}`;\n }\n }\n\n if (newValue && validation(newValue)) {\n setCurrentValue(newValue);\n if (onSave) {\n onSave(new Event(\"input\", { bubbles: true, cancelable: true }));\n }\n\n requestAnimationFrame(() => {\n const newDotsIndex = newValue.indexOf(\":\");\n const isHoursSelected = selectionStart < newDotsIndex;\n const newSelectionStart = isHoursSelected\n ? 0\n : newDotsIndex + 1;\n const selectionEnd = isHoursSelected\n ? newDotsIndex\n : newValue.length;\n inputRef.current?.setSelectionRange(\n newSelectionStart,\n selectionEnd\n );\n });\n }\n }\n }\n },\n [currentValue, inputRef, onSave, validation]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === \"Enter\") {\n e.target.blur();\n }\n if (e.key === \"Escape\") {\n escapeRef.current = true;\n e.target.blur();\n typeof onCancel === \"function\" && onCancel();\n }\n if (e.key === \"Backspace\") {\n return;\n }\n const input = e.target;\n const start = input.selectionStart;\n const end = input.selectionEnd;\n const currentValue = input.value;\n if (e.key === \"Tab\") {\n if (start !== end) {\n if (e.shiftKey) {\n const newDotsIndex = currentValue.indexOf(\":\");\n const isMinutesSelected = start > newDotsIndex;\n if (isMinutesSelected) {\n e.preventDefault();\n inputRef.current?.setSelectionRange(0, newDotsIndex);\n }\n } else {\n const newDotsIndex = currentValue.indexOf(\":\");\n const isHoursSelected = start < newDotsIndex;\n if (isHoursSelected) {\n e.preventDefault();\n inputRef.current?.setSelectionRange(\n newDotsIndex + 1,\n currentValue.length\n );\n }\n }\n }\n return;\n }\n\n if (start !== end) {\n if (e.key === \"ArrowUp\") {\n handleIncrementDecrement(true);\n return;\n }\n if (e.key === \"ArrowDown\") {\n handleIncrementDecrement(false);\n return;\n }\n const newValue =\n currentValue.substring(0, start) +\n e.key +\n currentValue.substring(end);\n if (!validation(newValue)) {\n e.preventDefault();\n return;\n }\n } else {\n const newValue =\n currentValue.substring(0, start) +\n e.key +\n currentValue.substring(end);\n\n if (!validation(newValue)) {\n e.preventDefault();\n return;\n }\n }\n },\n [handleIncrementDecrement, onCancel, validation]\n );\n\n const handleChange = useCallback((e) => {\n setCurrentValue(e.target.value);\n }, []);\n\n const handleClick = () => {\n const selectionStart = inputRef.current?.selectionStart;\n if (\n inputRef.current &&\n currentValue &&\n currentValue.length > 0 &&\n typeof selectionStart === \"number\"\n ) {\n const dotsIndex = currentValue.indexOf(\":\");\n if (selectionStart < dotsIndex) {\n inputRef.current?.setSelectionRange(0, dotsIndex);\n } else if (selectionStart >= dotsIndex) {\n inputRef.current?.setSelectionRange(\n dotsIndex + 1,\n currentValue.length\n );\n }\n }\n };\n\n return (\n <EditableContent\n ref={handleRef}\n inputProps={{\n ...inputProps,\n value: currentValue,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n type: \"text\",\n onClick: handleClick,\n className: classNames(\"c-input\", inputProps?.className),\n }}\n {...rest}\n />\n );\n }\n);\n\nEditableHours.displayName = \"EditableHours\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditableHours.js","names":["EditableContent","React","useCallback","useEffect","useRef","useState","decimalToHours","useForkRef","classNames","EditableHours","forwardRef","ref","value","onCancel","onSave","inputProps","allowEmptyValue","withLeadingZero","validation","incrementOnlySelected","minuteIncrement","rest","inputRef","handleRef","undefined","currentValue","setCurrentValue","prevValue","setPrevValue","escapeRef","_value","handleBlur","e","current","target","trim","length","handleIncrementDecrement","increment","selectionStart","dotsIndex","indexOf","split","map","Number","hours","minutes","newHours","newMinutes","newMinutesString","newHoursString","newValue","requestAnimationFrame","newDotsIndex","isHoursSelected","newSelectionStart","selectionEnd","setSelectionRange","handleKeyDown","key","blur","input","start","end","shiftKey","isMinutesSelected","preventDefault","substring","handleChange","handleClick","handleDoubleClick","onBlur","onKeyDown","onChange","type","onClick","onDoubleClick","className","displayName"],"sources":["../../../../src/components/EditableHours/EditableHours.tsx"],"sourcesContent":["import { EditableContent, EditableContentInterface } from \"../EditableContent\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { decimalToHours } from \"../../utils/timeUtils\";\nimport useForkRef from \"../../utils/useForkRef\";\nimport classNames from \"classnames\";\n\nexport interface EditableHoursProps extends EditableContentInterface {\n value?: number | string;\n onSave?: (e: Event) => void;\n onCancel?: () => void;\n withLeadingZero?: boolean;\n incrementOnlySelected?: boolean;\n validation?: (value: string) => boolean;\n allowEmptyValue?: boolean;\n minuteIncrement?: number;\n}\nexport const EditableHours = React.forwardRef<\n HTMLDivElement,\n EditableHoursProps\n>(\n (\n {\n value = 0,\n onCancel,\n onSave,\n inputProps,\n allowEmptyValue,\n withLeadingZero = true,\n validation = () => true,\n incrementOnlySelected = false,\n minuteIncrement = 1,\n ...rest\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const handleRef = useForkRef(ref, inputRef);\n const [currentValue, setCurrentValue] = useState(() => {\n if (value !== undefined) {\n return decimalToHours(value, withLeadingZero);\n }\n return \"\";\n });\n const [prevValue, setPrevValue] = useState(() => {\n if (value !== undefined) {\n return decimalToHours(value, withLeadingZero);\n }\n return \"\";\n });\n const escapeRef = useRef(false);\n\n useEffect(() => {\n let _value;\n if (value !== undefined) {\n _value = decimalToHours(value, withLeadingZero);\n }\n if (currentValue !== _value) {\n setCurrentValue(_value);\n setPrevValue(_value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n escapeRef.current = false;\n } else {\n if (\n e.target.value.trim().length > 0 &&\n prevValue !== e.target.value\n ) {\n const _value = decimalToHours(e.target.value, withLeadingZero);\n setPrevValue(_value);\n setCurrentValue(_value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n !allowEmptyValue\n ? setCurrentValue(prevValue)\n : typeof onSave === \"function\" &&\n prevValue !== e.target.value &&\n onSave(e);\n }\n }\n },\n [allowEmptyValue, onSave, prevValue, withLeadingZero]\n );\n\n const handleIncrementDecrement = useCallback(\n (increment: boolean) => {\n if (inputRef.current) {\n const selectionStart = inputRef.current.selectionStart;\n if (selectionStart !== null) {\n const dotsIndex = currentValue.indexOf(\":\");\n const [hours, minutes] = currentValue.split(\":\").map(Number);\n let newHours = hours;\n let newMinutes = minutes;\n\n if (selectionStart < dotsIndex) {\n if (increment) {\n newHours += 1;\n } else {\n newHours -= 1;\n if (newHours < 0) newHours = 0;\n }\n } else if (selectionStart > dotsIndex) {\n if (increment) {\n newMinutes += minuteIncrement;\n if (newMinutes > 59) {\n newMinutes = 0;\n if (!incrementOnlySelected) newHours += 1;\n }\n } else {\n if (newMinutes >= minuteIncrement || newMinutes === 0) {\n newMinutes -= minuteIncrement;\n if (newMinutes < 0 && newHours > 0) {\n newMinutes = 60 - minuteIncrement;\n if (!incrementOnlySelected) newHours -= 1;\n }\n if (newHours < 0) {\n newHours = 0;\n }\n } else {\n newMinutes = 0;\n }\n }\n }\n\n const newMinutesString =\n newMinutes < 10 ? `0${newMinutes}` : newMinutes;\n const newHoursString =\n withLeadingZero && newHours < 10 ? `0${newHours}` : newHours;\n const newValue = `${newHoursString}:${newMinutesString}`;\n\n if (validation(newValue)) {\n setCurrentValue(newValue);\n\n requestAnimationFrame(() => {\n const newDotsIndex = newValue.indexOf(\":\");\n const isHoursSelected = selectionStart < newDotsIndex;\n const newSelectionStart = isHoursSelected\n ? 0\n : newDotsIndex + 1;\n const selectionEnd = isHoursSelected\n ? newDotsIndex\n : newValue.length;\n inputRef.current?.setSelectionRange(\n newSelectionStart,\n selectionEnd\n );\n });\n }\n }\n }\n },\n [\n currentValue,\n incrementOnlySelected,\n minuteIncrement,\n validation,\n withLeadingZero,\n ]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === \"Enter\") {\n e.target.blur();\n }\n if (e.key === \"ArrowLeft\") {\n return;\n }\n if (e.key === \"ArrowRight\") {\n return;\n }\n if (e.key === \"Escape\") {\n escapeRef.current = true;\n e.target.blur();\n typeof onCancel === \"function\" && onCancel();\n }\n if (e.key === \"Backspace\") {\n return;\n }\n const input = e.target;\n const start = input.selectionStart;\n const end = input.selectionEnd;\n const currentValue = input.value;\n if (e.key === \"Tab\") {\n if (start !== end) {\n if (e.shiftKey) {\n const newDotsIndex = currentValue.indexOf(\":\");\n const isMinutesSelected = start > newDotsIndex;\n if (isMinutesSelected) {\n e.preventDefault();\n inputRef.current?.setSelectionRange(0, newDotsIndex);\n }\n } else {\n const newDotsIndex = currentValue.indexOf(\":\");\n const isHoursSelected = start < newDotsIndex;\n if (isHoursSelected) {\n e.preventDefault();\n inputRef.current?.setSelectionRange(\n newDotsIndex + 1,\n currentValue.length\n );\n }\n }\n }\n return;\n }\n\n if (start !== end) {\n if (e.key === \"ArrowUp\") {\n handleIncrementDecrement(true);\n return;\n }\n if (e.key === \"ArrowDown\") {\n handleIncrementDecrement(false);\n return;\n }\n const newValue =\n currentValue.substring(0, start) +\n e.key +\n currentValue.substring(end);\n if (!validation(newValue)) {\n e.preventDefault();\n return;\n }\n } else {\n const newValue =\n currentValue.substring(0, start) +\n e.key +\n currentValue.substring(end);\n\n if (!validation(newValue)) {\n e.preventDefault();\n return;\n }\n }\n },\n [handleIncrementDecrement, onCancel, validation]\n );\n\n const handleChange = useCallback((e) => {\n setCurrentValue(e.target.value);\n }, []);\n\n const handleClick = () => {\n const selectionStart = inputRef.current?.selectionStart;\n if (\n inputRef.current &&\n currentValue &&\n currentValue.length > 0 &&\n typeof selectionStart === \"number\"\n ) {\n const dotsIndex = currentValue.indexOf(\":\");\n if (selectionStart < dotsIndex) {\n inputRef.current?.setSelectionRange(0, dotsIndex);\n } else if (selectionStart >= dotsIndex) {\n inputRef.current?.setSelectionRange(\n dotsIndex + 1,\n currentValue.length\n );\n }\n }\n };\n\n const handleDoubleClick = () => {\n if (inputRef.current) {\n inputRef.current?.setSelectionRange(0, currentValue.length);\n }\n };\n\n return (\n <EditableContent\n ref={handleRef}\n inputProps={{\n ...inputProps,\n value: currentValue,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n type: \"text\",\n onClick: handleClick,\n onDoubleClick: handleDoubleClick,\n className: classNames(\"c-input\", inputProps?.className),\n }}\n {...rest}\n />\n );\n }\n);\n\nEditableHours.displayName = \"EditableHours\";\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableText.d.ts","sourceRoot":"","sources":["../../../../src/components/EditableText/EditableText.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,WAAW,EAMZ,MAAM,OAAO,CAAC;AACf,OAAO,EAEL,wBAAwB,EACzB,MAAM,oCAAoC,CAAC;AAG5C,MAAM,WAAW,qBAAsB,SAAQ,wBAAwB;IACrE,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gEAAgE;IAChE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpD,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"EditableText.d.ts","sourceRoot":"","sources":["../../../../src/components/EditableText/EditableText.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,WAAW,EAMZ,MAAM,OAAO,CAAC;AACf,OAAO,EAEL,wBAAwB,EACzB,MAAM,oCAAoC,CAAC;AAG5C,MAAM,WAAW,qBAAsB,SAAQ,wBAAwB;IACrE,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gEAAgE;IAChE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpD,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,YAAY,8FA4ExB,CAAC"}
|
|
@@ -35,7 +35,7 @@ export var EditableText = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
35
35
|
setCurrentValue(e.target.value);
|
|
36
36
|
typeof onSave === "function" && onSave(e);
|
|
37
37
|
} else {
|
|
38
|
-
!allowEmptyString ? setCurrentValue(prevValue) : typeof onSave === "function" && onSave(e);
|
|
38
|
+
!allowEmptyString ? setCurrentValue(prevValue) : typeof onSave === "function" && prevValue !== e.target.value && onSave(e);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}, [allowEmptyString, onSave, prevValue]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableText.js","names":["React","forwardRef","useCallback","useEffect","useRef","useState","EditableContent","classNames","EditableText","ref","onSave","onCancel","value","inputProps","allowEmptyString","props","currentValue","setCurrentValue","prevValue","setPrevValue","escapeRef","handleBlur","e","current","target","trim","length","handleKeyDown","key","blur","handleChange","onBlur","onKeyDown","onChange","type","className","displayName"],"sources":["../../../../src/components/EditableText/EditableText.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n EditableContent,\n EditableContentInterface,\n} from \"../EditableContent/EditableContent\";\nimport classNames from \"classnames\";\n\nexport interface EditableTextInterface extends EditableContentInterface {\n /** Value to display. */\n value?: string | null;\n /** Optional callback called on enter, click outside and tab. */\n onSave?: (e: ChangeEvent<HTMLInputElement>) => void;\n /** Optional callback called on input reset. */\n onCancel?: () => void;\n /** If true, setting empty value will save it, instead of revert to previous value. */\n allowEmptyString?: boolean;\n}\n\nexport const EditableText = forwardRef<HTMLDivElement, EditableTextInterface>(\n (\n { onSave, onCancel, value, inputProps, allowEmptyString, ...props },\n ref\n ) => {\n const [currentValue, setCurrentValue] = useState(value);\n const [prevValue, setPrevValue] = useState(value);\n const escapeRef = useRef(false);\n\n useEffect(() => {\n if (currentValue !== value) {\n setCurrentValue(value);\n setPrevValue(value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n escapeRef.current = false;\n } else {\n if (\n e.target.value.trim().length > 0 &&\n prevValue !== e.target.value\n ) {\n setPrevValue(e.target.value);\n setCurrentValue(e.target.value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n !allowEmptyString\n ? setCurrentValue(prevValue)\n : typeof onSave === \"function\"
|
|
1
|
+
{"version":3,"file":"EditableText.js","names":["React","forwardRef","useCallback","useEffect","useRef","useState","EditableContent","classNames","EditableText","ref","onSave","onCancel","value","inputProps","allowEmptyString","props","currentValue","setCurrentValue","prevValue","setPrevValue","escapeRef","handleBlur","e","current","target","trim","length","handleKeyDown","key","blur","handleChange","onBlur","onKeyDown","onChange","type","className","displayName"],"sources":["../../../../src/components/EditableText/EditableText.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n EditableContent,\n EditableContentInterface,\n} from \"../EditableContent/EditableContent\";\nimport classNames from \"classnames\";\n\nexport interface EditableTextInterface extends EditableContentInterface {\n /** Value to display. */\n value?: string | null;\n /** Optional callback called on enter, click outside and tab. */\n onSave?: (e: ChangeEvent<HTMLInputElement>) => void;\n /** Optional callback called on input reset. */\n onCancel?: () => void;\n /** If true, setting empty value will save it, instead of revert to previous value. */\n allowEmptyString?: boolean;\n}\n\nexport const EditableText = forwardRef<HTMLDivElement, EditableTextInterface>(\n (\n { onSave, onCancel, value, inputProps, allowEmptyString, ...props },\n ref\n ) => {\n const [currentValue, setCurrentValue] = useState(value);\n const [prevValue, setPrevValue] = useState(value);\n const escapeRef = useRef(false);\n\n useEffect(() => {\n if (currentValue !== value) {\n setCurrentValue(value);\n setPrevValue(value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n escapeRef.current = false;\n } else {\n if (\n e.target.value.trim().length > 0 &&\n prevValue !== e.target.value\n ) {\n setPrevValue(e.target.value);\n setCurrentValue(e.target.value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n !allowEmptyString\n ? setCurrentValue(prevValue)\n : typeof onSave === \"function\" &&\n prevValue !== e.target.value &&\n onSave(e);\n }\n }\n },\n [allowEmptyString, onSave, prevValue]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === \"Enter\") {\n e.target.blur();\n }\n if (e.key === \"Escape\") {\n escapeRef.current = true;\n e.target.blur();\n typeof onCancel === \"function\" && onCancel();\n }\n },\n [onCancel]\n );\n\n const handleChange = useCallback((e) => {\n setCurrentValue(e.target.value);\n }, []);\n\n return (\n <EditableContent\n {...props}\n ref={ref}\n inputProps={{\n ...inputProps,\n value: currentValue ?? \"\",\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n type: \"text\",\n className: classNames(\"c-input\", inputProps?.className),\n }}\n />\n );\n }\n);\n\nEditableText.displayName = \"EditableText\";\n"],"mappings":";;;AAAA,OAAOA,KAAK,IAEVC,UAAU,EACVC,WAAW,EACXC,SAAS,EACTC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,SACEC,eAAe,QAEV,oCAAoC;AAC3C,OAAOC,UAAU,MAAM,YAAY;AAanC,OAAO,IAAMC,YAAY,gBAAGP,UAAU,CACpC,gBAEEQ,GAAG,EACA;EAAA,IAFDC,MAAM,QAANA,MAAM;IAAEC,QAAQ,QAARA,QAAQ;IAAEC,KAAK,QAALA,KAAK;IAAEC,UAAU,QAAVA,UAAU;IAAEC,gBAAgB,QAAhBA,gBAAgB;IAAKC,KAAK;EAGjE,gBAAwCV,QAAQ,CAACO,KAAK,CAAC;IAAhDI,YAAY;IAAEC,eAAe;EACpC,iBAAkCZ,QAAQ,CAACO,KAAK,CAAC;IAA1CM,SAAS;IAAEC,YAAY;EAC9B,IAAMC,SAAS,GAAGhB,MAAM,CAAC,KAAK,CAAC;EAE/BD,SAAS,CAAC,YAAM;IACd,IAAIa,YAAY,KAAKJ,KAAK,EAAE;MAC1BK,eAAe,CAACL,KAAK,CAAC;MACtBO,YAAY,CAACP,KAAK,CAAC;IACrB;IACA;EACF,CAAC,EAAE,CAACA,KAAK,CAAC,CAAC;EAEX,IAAMS,UAAU,GAAGnB,WAAW,CAC5B,UAACoB,CAAC,EAAK;IACL,IAAIF,SAAS,CAACG,OAAO,EAAE;MACrBN,eAAe,CAACC,SAAS,CAAC;MAC1BE,SAAS,CAACG,OAAO,GAAG,KAAK;IAC3B,CAAC,MAAM;MACL,IACED,CAAC,CAACE,MAAM,CAACZ,KAAK,CAACa,IAAI,EAAE,CAACC,MAAM,GAAG,CAAC,IAChCR,SAAS,KAAKI,CAAC,CAACE,MAAM,CAACZ,KAAK,EAC5B;QACAO,YAAY,CAACG,CAAC,CAACE,MAAM,CAACZ,KAAK,CAAC;QAC5BK,eAAe,CAACK,CAAC,CAACE,MAAM,CAACZ,KAAK,CAAC;QAC/B,OAAOF,MAAM,KAAK,UAAU,IAAIA,MAAM,CAACY,CAAC,CAAC;MAC3C,CAAC,MAAM;QACL,CAACR,gBAAgB,GACbG,eAAe,CAACC,SAAS,CAAC,GAC1B,OAAOR,MAAM,KAAK,UAAU,IAC5BQ,SAAS,KAAKI,CAAC,CAACE,MAAM,CAACZ,KAAK,IAC5BF,MAAM,CAACY,CAAC,CAAC;MACf;IACF;EACF,CAAC,EACD,CAACR,gBAAgB,EAAEJ,MAAM,EAAEQ,SAAS,CAAC,CACtC;EAED,IAAMS,aAAa,GAAGzB,WAAW,CAC/B,UAACoB,CAAC,EAAK;IACL,IAAIA,CAAC,CAACM,GAAG,KAAK,OAAO,EAAE;MACrBN,CAAC,CAACE,MAAM,CAACK,IAAI,EAAE;IACjB;IACA,IAAIP,CAAC,CAACM,GAAG,KAAK,QAAQ,EAAE;MACtBR,SAAS,CAACG,OAAO,GAAG,IAAI;MACxBD,CAAC,CAACE,MAAM,CAACK,IAAI,EAAE;MACf,OAAOlB,QAAQ,KAAK,UAAU,IAAIA,QAAQ,EAAE;IAC9C;EACF,CAAC,EACD,CAACA,QAAQ,CAAC,CACX;EAED,IAAMmB,YAAY,GAAG5B,WAAW,CAAC,UAACoB,CAAC,EAAK;IACtCL,eAAe,CAACK,CAAC,CAACE,MAAM,CAACZ,KAAK,CAAC;EACjC,CAAC,EAAE,EAAE,CAAC;EAEN,oBACE,oBAAC,eAAe,eACVG,KAAK;IACT,GAAG,EAAEN,GAAI;IACT,UAAU,eACLI,UAAU;MACbD,KAAK,EAAEI,YAAY,WAAZA,YAAY,GAAI,EAAE;MACzBe,MAAM,EAAEV,UAAU;MAClBW,SAAS,EAAEL,aAAa;MACxBM,QAAQ,EAAEH,YAAY;MACtBI,IAAI,EAAE,MAAM;MACZC,SAAS,EAAE5B,UAAU,CAAC,SAAS,EAAEM,UAAU,oBAAVA,UAAU,CAAEsB,SAAS;IAAC;EACvD,GACF;AAEN,CAAC,CACF;AAED3B,YAAY,CAAC4B,WAAW,GAAG,cAAc"}
|