@deephaven/components 0.11.10-beta.0 → 0.11.10-beta.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/dist/AutoResizeTextarea.d.ts.map +1 -1
- package/dist/AutoResizeTextarea.js +2 -2
- package/dist/AutoResizeTextarea.js.map +1 -1
- package/dist/CardFlip.d.ts.map +1 -1
- package/dist/CardFlip.js +7 -1
- package/dist/CardFlip.js.map +1 -1
- package/dist/Checkbox.d.ts.map +1 -1
- package/dist/Checkbox.js +1 -1
- package/dist/Checkbox.js.map +1 -1
- package/dist/MaskedInput.d.ts.map +1 -1
- package/dist/MaskedInput.js +1 -1
- package/dist/MaskedInput.js.map +1 -1
- package/dist/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput.js +1 -1
- package/dist/TimeInput.js.map +1 -1
- package/dist/TimeSlider.d.ts.map +1 -1
- package/dist/TimeSlider.js +6 -4
- package/dist/TimeSlider.js.map +1 -1
- package/dist/navigation/Stack.d.ts.map +1 -1
- package/dist/navigation/Stack.js +1 -1
- package/dist/navigation/Stack.js.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoResizeTextarea.d.ts","sourceRoot":"","sources":["../src/AutoResizeTextarea.tsx"],"names":[],"mappings":";AACA,OAAO,SAAS,MAAM,YAAY,CAAC;AAGnC,OAAO,2BAA2B,CAAC;AAEnC,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,QAAA,MAAM,kBAAkB;+HAUrB,uBAAuB,GAAG,WAAW;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"AutoResizeTextarea.d.ts","sourceRoot":"","sources":["../src/AutoResizeTextarea.tsx"],"names":[],"mappings":";AACA,OAAO,SAAS,MAAM,YAAY,CAAC;AAGnC,OAAO,2BAA2B,CAAC;AAEnC,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,QAAA,MAAM,kBAAkB;+HAUrB,uBAAuB,GAAG,WAAW;;;;;;;;;;;;;;;;;;;;;CA8GvC,CAAC;AAwBF,eAAe,kBAAkB,CAAC"}
|
|
@@ -24,7 +24,7 @@ var AutoResizeTextarea = _ref => {
|
|
|
24
24
|
var [value, setValue] = useState(propsValue);
|
|
25
25
|
var [isPastedChange, setIsPastedChange] = useState(false);
|
|
26
26
|
var element = useRef(null);
|
|
27
|
-
useEffect(()
|
|
27
|
+
useEffect(function syncStateWithProp() {
|
|
28
28
|
// keep state value in sync with prop changes
|
|
29
29
|
setValue(propsValue);
|
|
30
30
|
}, [propsValue]);
|
|
@@ -98,7 +98,7 @@ var AutoResizeTextarea = _ref => {
|
|
|
98
98
|
setIsPastedChange(true);
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
useEffect(()
|
|
101
|
+
useEffect(function reCalculate() {
|
|
102
102
|
reCalculateLayout();
|
|
103
103
|
}, [value]);
|
|
104
104
|
return /*#__PURE__*/React.createElement("textarea", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AutoResizeTextarea.tsx"],"names":["React","useState","useRef","useEffect","PropTypes","classNames","AutoResizeTextarea","className","value","propsValue","onChange","spellCheck","placeholder","disabled","delimiter","id","dataTestId","setValue","isPastedChange","setIsPastedChange","element","explode","input","trim","split","filter","string","join","implode","map","reCalculateLayout","current","style","height","resizedHeight","scrollHeight","offsetHeight","clientHeight","handleChange","event","newValue","target","handleFocus","scrollLeft","handleMouseDown","document","activeElement","focus","handleBlur","handlePaste","propTypes","isRequired","func","bool","defaultProps","undefined"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,QAAhB,EAA0BC,MAA1B,EAAkCC,SAAlC,QAAmD,OAAnD;AACA,OAAOC,SAAP,MAAsB,YAAtB;AACA,OAAOC,UAAP,MAAuB,YAAvB;;;AAgBA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,kBAAkB,GAAG,QAUiB;AAAA,MAVhB;AAC1BC,IAAAA,SAAS,GAAG,EADc;AAE1BC,IAAAA,KAAK,EAAEC,UAFmB;AAG1BC,IAAAA,QAH0B;AAI1BC,IAAAA,UAAU,GAAG,KAJa;AAK1BC,IAAAA,WAAW,GAAG,EALY;AAM1BC,IAAAA,QAAQ,GAAG,KANe;AAO1BC,IAAAA,SAAS,GAAG,EAPc;AAQ1BC,IAAAA,EAAE,GAAG,EARqB;AAS1B,mBAAeC;AATW,GAUgB;AAC1C,MAAM,CAACR,KAAD,EAAQS,QAAR,IAAoBhB,QAAQ,CAACQ,UAAD,CAAlC;AACA,MAAM,CAACS,cAAD,EAAiBC,iBAAjB,IAAsClB,QAAQ,CAAC,KAAD,CAApD;AACA,MAAMmB,OAAO,GAAGlB,MAAM,CAAsB,IAAtB,CAAtB;AAEAC,EAAAA,SAAS,
|
|
1
|
+
{"version":3,"sources":["../src/AutoResizeTextarea.tsx"],"names":["React","useState","useRef","useEffect","PropTypes","classNames","AutoResizeTextarea","className","value","propsValue","onChange","spellCheck","placeholder","disabled","delimiter","id","dataTestId","setValue","isPastedChange","setIsPastedChange","element","syncStateWithProp","explode","input","trim","split","filter","string","join","implode","map","reCalculateLayout","current","style","height","resizedHeight","scrollHeight","offsetHeight","clientHeight","handleChange","event","newValue","target","handleFocus","scrollLeft","handleMouseDown","document","activeElement","focus","handleBlur","handlePaste","reCalculate","propTypes","isRequired","func","bool","defaultProps","undefined"],"mappings":"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","sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nimport './AutoResizeTextarea.scss';\n\ninterface AutoResizeTextareaProps {\n value: string;\n onChange: (val: string) => void;\n className?: string;\n spellCheck?: boolean;\n placeholder?: string;\n disabled?: boolean;\n delimiter?: string;\n id?: string;\n 'data-testid'?: string;\n}\n\n/**\n * Makes a textarea that auto resizes based on contents, its height grows with new lines.\n * If a delimeter is set, such as \" -\" or \" \", as used by jvm args or env vars\n * then the field will also \"explode\" the value by the delimiter over new lines\n * on focus, and implode on blur. By default, it doesn't word wrap.\n */\nconst AutoResizeTextarea = ({\n className = '',\n value: propsValue,\n onChange,\n spellCheck = false,\n placeholder = '',\n disabled = false,\n delimiter = '',\n id = '',\n 'data-testid': dataTestId,\n}: AutoResizeTextareaProps): JSX.Element => {\n const [value, setValue] = useState(propsValue);\n const [isPastedChange, setIsPastedChange] = useState(false);\n const element = useRef<HTMLTextAreaElement>(null);\n\n useEffect(\n function syncStateWithProp() {\n // keep state value in sync with prop changes\n setValue(propsValue);\n },\n [propsValue]\n );\n\n function explode(input: string) {\n // split by delimiter, commonly \" \" or \" -\"\n // strip empty strings (if delimiter is space, and there are multiple spaces in a row)\n // and join with new line and a trimmed delimeter (get rid of leading spaces)\n return input\n .trim()\n .split(delimiter)\n .filter(string => string) // remove empty strings\n .join(`\\n${delimiter.trim()}`);\n }\n\n function implode(input: string) {\n return input\n .split('\\n')\n .map(string => string.trim())\n .join(' ');\n }\n\n function reCalculateLayout() {\n if (!element.current) {\n return;\n }\n element.current.style.height = '0'; // shrink component to get scrollHeight\n const resizedHeight =\n element.current.scrollHeight +\n (element.current.offsetHeight - element.current.clientHeight);\n // accounts for border, padding is captured by scroll height\n if (resizedHeight > 0) element.current.style.height = `${resizedHeight}px`;\n }\n\n function handleChange(event: React.ChangeEvent<HTMLTextAreaElement>) {\n let newValue = event.target.value;\n if (isPastedChange) {\n if (delimiter) newValue = explode(newValue);\n setIsPastedChange(false);\n }\n setValue(newValue);\n onChange(newValue);\n }\n\n function handleFocus() {\n if (!element.current) {\n return;\n }\n if (delimiter) {\n setValue(explode(value));\n reCalculateLayout();\n }\n element.current.scrollLeft = 0;\n // scroll left as it can be disorienting if you click on a long line\n }\n\n // make it explode when dragging the resize handle\n // by making it trigger focus (which normally doesn't\n // trigger when just resizing).\n function handleMouseDown() {\n if (!element.current) return;\n if (document.activeElement === element.current) return;\n element.current.focus();\n }\n\n function handleBlur() {\n if (delimiter) {\n setValue(implode(value));\n onChange(implode(value));\n }\n }\n\n function handlePaste() {\n setIsPastedChange(true);\n }\n\n useEffect(\n function reCalculate() {\n reCalculateLayout();\n },\n [value]\n );\n\n return (\n <textarea\n ref={element}\n id={id}\n className={classNames(className, 'auto-resize-textarea form-control')}\n placeholder={placeholder}\n value={value}\n rows={1}\n onChange={handleChange}\n onFocus={handleFocus}\n onMouseDown={handleMouseDown}\n onBlur={handleBlur}\n onPaste={handlePaste}\n spellCheck={spellCheck}\n disabled={disabled}\n data-testid={dataTestId}\n />\n );\n};\n\nAutoResizeTextarea.propTypes = {\n value: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n className: PropTypes.string,\n placeholder: PropTypes.string,\n spellCheck: PropTypes.bool,\n disabled: PropTypes.bool,\n delimiter: PropTypes.string,\n id: PropTypes.string,\n 'data-testid': PropTypes.string,\n};\n\nAutoResizeTextarea.defaultProps = {\n className: '',\n id: '',\n placeholder: '',\n disabled: false,\n spellCheck: false,\n delimiter: '',\n 'data-testid': undefined,\n};\n\nexport default AutoResizeTextarea;\n"],"file":"AutoResizeTextarea.js"}
|
package/dist/CardFlip.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CardFlip.d.ts","sourceRoot":"","sources":["../src/CardFlip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,iBAAiB,CAAC;AAEzB,aAAK,aAAa,GAAG;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,QAAQ,mEAKX,aAAa,KAAG,
|
|
1
|
+
{"version":3,"file":"CardFlip.d.ts","sourceRoot":"","sources":["../src/CardFlip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,iBAAiB,CAAC;AAEzB,aAAK,aAAa,GAAG;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,QAAQ,mEAKX,aAAa,KAAG,WAuDlB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/CardFlip.js
CHANGED
|
@@ -37,9 +37,15 @@ var CardFlip = _ref => {
|
|
|
37
37
|
document.body.classList.remove('card-flip--is-flipping');
|
|
38
38
|
}
|
|
39
39
|
}, []);
|
|
40
|
-
useEffect(()
|
|
40
|
+
useEffect(function setIsFlippingClassOnTransitionStart() {
|
|
41
41
|
if (!front.current) throw Error('ref undefined');
|
|
42
42
|
front.current.addEventListener('transitionstart', transitionStart);
|
|
43
|
+
var refObj = front.current;
|
|
44
|
+
return function cleanupListener() {
|
|
45
|
+
if (refObj) {
|
|
46
|
+
return refObj.removeEventListener('transitionstart', transitionStart);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
43
49
|
}, [transitionStart]);
|
|
44
50
|
return /*#__PURE__*/React.createElement("div", {
|
|
45
51
|
className: classNames(className, {
|
package/dist/CardFlip.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CardFlip.tsx"],"names":["React","useCallback","useEffect","useRef","classNames","CardFlip","className","isFlipped","children","dataTestId","getComponent","key","length","Error","front","transitionStart","event","target","currentTarget","document","body","classList","add","transitionEnd","remove","current","addEventListener"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,WAAhB,EAA6BC,SAA7B,EAAwCC,MAAxC,QAAsD,OAAtD;AACA,OAAOC,UAAP,MAAuB,YAAvB;;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,QAAQ,GAAG,QAKiB;AAAA,MALhB;AAChBC,IAAAA,SADgB;AAEhBC,IAAAA,SAFgB;AAGhBC,IAAAA,QAHgB;AAIhB,mBAAeC;AAJC,GAKgB;;AAChC,MAAMC,YAAY,GAAIC,GAAD,IAAgB;AACnC,QAAIH,QAAQ,CAACI,MAAT,KAAoB,CAAxB,EAA2B;AACzB,YAAM,IAAIC,KAAJ,CAAU,0CAAV,CAAN;AACD;;AACD,WAAOL,QAAQ,CAACG,GAAD,CAAf;AACD,GALD;;AAOA,MAAMG,KAAK,GAAGX,MAAM,CAAiB,IAAjB,CAApB;AAEA,MAAMY,eAAe,GAAGd,WAAW,CAACe,KAAK,IAAI;AAC3C,QAAIA,KAAK,CAACC,MAAN,KAAiBD,KAAK,CAACE,aAA3B,EAA0C;AACxCC,MAAAA,QAAQ,CAACC,IAAT,CAAcC,SAAd,CAAwBC,GAAxB,CAA4B,wBAA5B;AACD;AACF,GAJkC,EAIhC,EAJgC,CAAnC;AAMA,MAAMC,aAAa,GAAGtB,WAAW,CAACe,KAAK,IAAI;AACzC,QAAIA,KAAK,CAACC,MAAN,KAAiBD,KAAK,CAACE,aAA3B,EAA0C;AACxCC,MAAAA,QAAQ,CAACC,IAAT,CAAcC,SAAd,CAAwBG,MAAxB,CAA+B,wBAA/B;AACD;AACF,GAJgC,EAI9B,EAJ8B,CAAjC;AAMAtB,EAAAA,SAAS,
|
|
1
|
+
{"version":3,"sources":["../src/CardFlip.tsx"],"names":["React","useCallback","useEffect","useRef","classNames","CardFlip","className","isFlipped","children","dataTestId","getComponent","key","length","Error","front","transitionStart","event","target","currentTarget","document","body","classList","add","transitionEnd","remove","setIsFlippingClassOnTransitionStart","current","addEventListener","refObj","cleanupListener","removeEventListener"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,WAAhB,EAA6BC,SAA7B,EAAwCC,MAAxC,QAAsD,OAAtD;AACA,OAAOC,UAAP,MAAuB,YAAvB;;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,QAAQ,GAAG,QAKiB;AAAA,MALhB;AAChBC,IAAAA,SADgB;AAEhBC,IAAAA,SAFgB;AAGhBC,IAAAA,QAHgB;AAIhB,mBAAeC;AAJC,GAKgB;;AAChC,MAAMC,YAAY,GAAIC,GAAD,IAAgB;AACnC,QAAIH,QAAQ,CAACI,MAAT,KAAoB,CAAxB,EAA2B;AACzB,YAAM,IAAIC,KAAJ,CAAU,0CAAV,CAAN;AACD;;AACD,WAAOL,QAAQ,CAACG,GAAD,CAAf;AACD,GALD;;AAOA,MAAMG,KAAK,GAAGX,MAAM,CAAiB,IAAjB,CAApB;AAEA,MAAMY,eAAe,GAAGd,WAAW,CAACe,KAAK,IAAI;AAC3C,QAAIA,KAAK,CAACC,MAAN,KAAiBD,KAAK,CAACE,aAA3B,EAA0C;AACxCC,MAAAA,QAAQ,CAACC,IAAT,CAAcC,SAAd,CAAwBC,GAAxB,CAA4B,wBAA5B;AACD;AACF,GAJkC,EAIhC,EAJgC,CAAnC;AAMA,MAAMC,aAAa,GAAGtB,WAAW,CAACe,KAAK,IAAI;AACzC,QAAIA,KAAK,CAACC,MAAN,KAAiBD,KAAK,CAACE,aAA3B,EAA0C;AACxCC,MAAAA,QAAQ,CAACC,IAAT,CAAcC,SAAd,CAAwBG,MAAxB,CAA+B,wBAA/B;AACD;AACF,GAJgC,EAI9B,EAJ8B,CAAjC;AAMAtB,EAAAA,SAAS,CACP,SAASuB,mCAAT,GAA+C;AAC7C,QAAI,CAACX,KAAK,CAACY,OAAX,EAAoB,MAAMb,KAAK,CAAC,eAAD,CAAX;AACpBC,IAAAA,KAAK,CAACY,OAAN,CAAcC,gBAAd,CAA+B,iBAA/B,EAAkDZ,eAAlD;AAEA,QAAMa,MAAM,GAAGd,KAAK,CAACY,OAArB;AACA,WAAO,SAASG,eAAT,GAA2B;AAChC,UAAID,MAAJ,EAAY;AACV,eAAOA,MAAM,CAACE,mBAAP,CAA2B,iBAA3B,EAA8Cf,eAA9C,CAAP;AACD;AACF,KAJD;AAKD,GAXM,EAYP,CAACA,eAAD,CAZO,CAAT;AAeA,sBACE;AACE,IAAA,SAAS,EAAEX,UAAU,CAACE,SAAD,EAAY;AAC/B,+BAAyBC,SADM;AAE/B,8BAAwB,CAACA;AAFM,KAAZ,CADvB;AAKE,mBAAaE;AALf,kBAOE;AAAK,IAAA,SAAS,EAAC;AAAf,KAAkCC,YAAY,CAAC,CAAD,CAA9C,CAPF,eAQE;AACE,IAAA,GAAG,EAAEI,KADP;AAEE,IAAA,SAAS,EAAC,kBAFZ;AAGE,IAAA,eAAe,EAAES;AAHnB,KAKGb,YAAY,CAAC,CAAD,CALf,CARF,CADF;AAkBD,CA5DD;;AA8DA,eAAeL,QAAf","sourcesContent":["import React, { useCallback, useEffect, useRef } from 'react';\nimport classNames from 'classnames';\nimport './CardFlip.scss';\n\ntype CardFlipProps = {\n isFlipped: boolean;\n children: [React.ReactNode, React.ReactNode];\n className?: string;\n 'data-testid'?: string;\n};\n\n/**\n * Card flip component, switches between a front and back face being visible.\n * Has logic to handle overflow on body, caused by perspective transforms\n * and moves z-index to top during transition.\n * @param isFlipped true shows second child, false shows first child\n * @param children Expects exactly two children\n * @returns\n */\nconst CardFlip = ({\n className,\n isFlipped,\n children,\n 'data-testid': dataTestId,\n}: CardFlipProps): JSX.Element => {\n const getComponent = (key: 0 | 1) => {\n if (children.length !== 2) {\n throw new Error('CardFlip requires 2 children to function');\n }\n return children[key];\n };\n\n const front = useRef<HTMLDivElement>(null);\n\n const transitionStart = useCallback(event => {\n if (event.target === event.currentTarget) {\n document.body.classList.add('card-flip--is-flipping');\n }\n }, []);\n\n const transitionEnd = useCallback(event => {\n if (event.target === event.currentTarget) {\n document.body.classList.remove('card-flip--is-flipping');\n }\n }, []);\n\n useEffect(\n function setIsFlippingClassOnTransitionStart() {\n if (!front.current) throw Error('ref undefined');\n front.current.addEventListener('transitionstart', transitionStart);\n\n const refObj = front.current;\n return function cleanupListener() {\n if (refObj) {\n return refObj.removeEventListener('transitionstart', transitionStart);\n }\n };\n },\n [transitionStart]\n );\n\n return (\n <div\n className={classNames(className, {\n 'card-flip--show-front': isFlipped,\n 'card-flip--show-back': !isFlipped,\n })}\n data-testid={dataTestId}\n >\n <div className=\"card-flip--back\">{getComponent(0)}</div>\n <div\n ref={front}\n className=\"card-flip--front\"\n onTransitionEnd={transitionEnd}\n >\n {getComponent(1)}\n </div>\n </div>\n );\n};\n\nexport default CardFlip;\n"],"file":"CardFlip.js"}
|
package/dist/Checkbox.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../src/Checkbox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAMhE,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACtD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,QAAA,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../src/Checkbox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAMhE,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACtD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,QAAA,MAAM,QAAQ,wFAiEb,CAAC;AAmDF,eAAe,QAAQ,CAAC"}
|
package/dist/Checkbox.js
CHANGED
|
@@ -21,7 +21,7 @@ var Checkbox = /*#__PURE__*/React.forwardRef((props, forwardedRef) => {
|
|
|
21
21
|
} = props;
|
|
22
22
|
var [id] = useState(shortid());
|
|
23
23
|
var ref = useForwardedRef(forwardedRef);
|
|
24
|
-
useEffect(()
|
|
24
|
+
useEffect(function setIndeterminateProperty() {
|
|
25
25
|
if (ref.current) {
|
|
26
26
|
// indeterminate is not actually an html attr, can only be set via JS
|
|
27
27
|
ref.current.indeterminate = checked === null;
|
package/dist/Checkbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Checkbox.tsx"],"names":["React","useState","useEffect","useCallback","classNames","PropTypes","shortid","useForwardedRef","Checkbox","forwardRef","props","forwardedRef","checked","children","className","disabled","inputClassName","isInvalid","labelClassName","onChange","dataTestId","id","ref","current","indeterminate","handleOnChange","event","displayName","propTypes","propName","checkedType","Error","node","isRequired","string","bool","func","defaultProps","undefined"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,QAAhB,EAA0BC,SAA1B,EAAqCC,WAArC,QAAwD,OAAxD;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,OAAOC,SAAP,MAAsB,YAAtB;AACA,OAAOC,OAAP,MAAoB,SAApB;AACA,SAASC,eAAT,QAAgC,wBAAhC;;AAcA;AACA;AACA;AACA,IAAMC,QAAQ,gBAAGR,KAAK,CAACS,UAAN,CACf,CAACC,KAAD,EAAQC,YAAR,KAAyB;AACvB,MAAM;AACJC,IAAAA,OAAO,GAAG,KADN;AAEJC,IAAAA,QAFI;AAGJC,IAAAA,SAHI;AAIJC,IAAAA,QAJI;AAKJC,IAAAA,cALI;AAMJC,IAAAA,SANI;AAOJC,IAAAA,cAPI;AAQJC,IAAAA,QARI;AASJ,mBAAeC;AATX,MAUFV,KAVJ;AAYA,MAAM,CAACW,EAAD,IAAOpB,QAAQ,CAACK,OAAO,EAAR,CAArB;AAEA,MAAMgB,GAAG,GAAGf,eAAe,CAAmBI,YAAnB,CAA3B;AAEAT,EAAAA,SAAS,
|
|
1
|
+
{"version":3,"sources":["../src/Checkbox.tsx"],"names":["React","useState","useEffect","useCallback","classNames","PropTypes","shortid","useForwardedRef","Checkbox","forwardRef","props","forwardedRef","checked","children","className","disabled","inputClassName","isInvalid","labelClassName","onChange","dataTestId","id","ref","setIndeterminateProperty","current","indeterminate","handleOnChange","event","displayName","propTypes","propName","checkedType","Error","node","isRequired","string","bool","func","defaultProps","undefined"],"mappings":"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","sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport shortid from 'shortid';\nimport { useForwardedRef } from '@deephaven/react-hooks';\n\ninterface CheckboxProps {\n checked: boolean | null;\n className?: string;\n disabled?: boolean;\n inputClassName?: string;\n isInvalid?: boolean;\n labelClassName?: string;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n children?: React.ReactNode;\n 'data-testid'?: string;\n}\n\n/**\n * A simple checkbox component. Automatically generates an id so htmlFor/id attributes are unique.\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n (props, forwardedRef) => {\n const {\n checked = false,\n children,\n className,\n disabled,\n inputClassName,\n isInvalid,\n labelClassName,\n onChange,\n 'data-testid': dataTestId,\n } = props;\n\n const [id] = useState(shortid());\n\n const ref = useForwardedRef<HTMLInputElement>(forwardedRef);\n\n useEffect(\n function setIndeterminateProperty() {\n if (ref.current) {\n // indeterminate is not actually an html attr, can only be set via JS\n ref.current.indeterminate = checked === null;\n }\n },\n [ref, checked]\n );\n\n const handleOnChange: React.ChangeEventHandler<HTMLInputElement> = useCallback(\n event => {\n if (ref.current) {\n // ref.current can be null in tests, doesn't impact behaviour\n ref.current.indeterminate = checked === null;\n }\n\n if (onChange) {\n onChange(event);\n }\n },\n [ref, checked, onChange]\n );\n\n return (\n <div className={classNames('custom-control custom-checkbox', className)}>\n <input\n type=\"checkbox\"\n ref={ref}\n checked={checked ?? false} // checked attr must always have a value to remain as a controlled component\n className={classNames('custom-control-input', inputClassName, {\n 'is-invalid': isInvalid,\n })}\n disabled={disabled}\n id={id}\n onChange={handleOnChange}\n data-testid={dataTestId}\n />\n <label\n className={classNames('custom-control-label', labelClassName)}\n htmlFor={id}\n >\n {children}\n </label>\n </div>\n );\n }\n);\n\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\nCheckbox.displayName = 'Checkbox';\n\nCheckbox.propTypes = {\n /** Current value of the checkbox. */\n checked: (props, propName) => {\n const { [propName]: checkedType } = props;\n if (checkedType !== null && typeof checkedType !== 'boolean') {\n return new Error('Checked must be a boolean or null for indeterminate');\n }\n return null;\n },\n\n /** The node/text to put in the label of this checkbox */\n children: PropTypes.node.isRequired,\n\n /** An extra class name to add to the outer div component */\n className: PropTypes.string,\n\n /** An extra class for disabling the checkbox component */\n disabled: PropTypes.bool,\n\n /** An extra class name for the input component */\n inputClassName: PropTypes.string,\n\n /** Convenience for styling appropriately for an invalid value */\n isInvalid: PropTypes.bool,\n\n /** An extra class name for the label component */\n labelClassName: PropTypes.string,\n\n /** Triggered when the input is checked/unchecked */\n onChange: PropTypes.func,\n\n 'data-testid': PropTypes.string,\n};\n\nCheckbox.defaultProps = {\n checked: false,\n className: '',\n disabled: false,\n inputClassName: '',\n isInvalid: false,\n labelClassName: '',\n onChange: undefined,\n 'data-testid': undefined,\n};\n\nexport default Checkbox;\n"],"file":"Checkbox.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaskedInput.d.ts","sourceRoot":"","sources":["../src/MaskedInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAIlD,OAAO,oBAAoB,CAAC;AAI5B,QAAA,MAAM,mBAAmB;;;;CAIf,CAAC;AAQX,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CAMR;AAED,oBAAY,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,mBAAmB,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;CACnF,CAAC;AAEF,aAAK,gBAAgB,GAAG;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,2IAA2I;IAC3I,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,iDAAiD;IACjD,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oCAAoC;IACpC,QAAQ,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,qDAAqD;IACrD,mBAAmB,CAAC,CAClB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC;IACV,6BAA6B,CAAC,CAC5B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAClC,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAEjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AAIH,QAAA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"MaskedInput.d.ts","sourceRoot":"","sources":["../src/MaskedInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAIlD,OAAO,oBAAoB,CAAC;AAI5B,QAAA,MAAM,mBAAmB;;;;CAIf,CAAC;AAQX,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CAMR;AAED,oBAAY,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,mBAAmB,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;CACnF,CAAC;AAEF,aAAK,gBAAgB,GAAG;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,2IAA2I;IAC3I,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,iDAAiD;IACjD,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oCAAoC;IACpC,QAAQ,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,qDAAqD;IACrD,mBAAmB,CAAC,CAClB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC;IACV,6BAA6B,CAAC,CAC5B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAClC,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAEjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AAIH,QAAA,MAAM,WAAW,2FAiahB,CAAC;AAsBF,eAAe,WAAW,CAAC"}
|
package/dist/MaskedInput.js
CHANGED
|
@@ -43,7 +43,7 @@ var MaskedInput = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
43
43
|
} = props;
|
|
44
44
|
var input = useForwardedRef(ref);
|
|
45
45
|
var examples = useMemo(() => Array.isArray(example) ? example : [example], [example]);
|
|
46
|
-
useEffect(()
|
|
46
|
+
useEffect(function setSelectedSegment() {
|
|
47
47
|
if (selection != null) {
|
|
48
48
|
var _input$current;
|
|
49
49
|
|
package/dist/MaskedInput.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/MaskedInput.tsx"],"names":["React","useMemo","useEffect","classNames","Log","useForwardedRef","log","module","SELECTION_DIRECTION","FORWARD","BACKWARD","NONE","FIXED_WIDTH_SPACE","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","value","replaceIndex","newChar","substring","MaskedInput","forwardRef","props","ref","className","example","getNextSegmentValue","range","delta","segmentValue","getPreferredReplacementString","onChange","onSelect","pattern","selection","onFocus","onBlur","dataTestId","input","examples","Array","isArray","debug","selectionStart","selectionEnd","selectionDirection","current","setSelectionRange","getSegment","cursorPosition","testValue","length","i","test","charAt","fillValue","checkValue","exampleValue","filledValue","concat","isValid","patternRegex","RegExp","nextSegment","position","currentSegment","nextPosition","previousSegment","previousPosition","nextSegmentValue","segment","newSegmentValue","newValue","handleSelect","event","target","error","debug2","newSelection","handleSelectCapture","preventDefault","stopPropagation","handleArrowKey","key","handleKeyDown","startsWith","replace","altKey","metaKey","ctrlKey","newChars","from","Set","toUpperCase","toLowerCase","maxReplaceIndex","newSelectionStart","nextSegmentSelection","undefined","defaultProps"],"mappings":"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","sourcesContent":["import React, { useMemo, useEffect } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { useForwardedRef } from '@deephaven/react-hooks';\nimport './MaskedInput.scss';\n\nconst log = Log.module('MaskedInput');\n\nconst SELECTION_DIRECTION = {\n FORWARD: 'forward',\n BACKWARD: 'backward',\n NONE: 'none',\n} as const;\n\n/**\n * Special space character that's the same size as tabular numbers\n * https://www.fileformat.info/info/unicode/char/2007/index.htm\n */\nconst FIXED_WIDTH_SPACE = '\\u2007';\n\nexport function DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n value: string,\n replaceIndex: number,\n newChar: string\n): string {\n return (\n value.substring(0, replaceIndex) +\n newChar +\n value.substring(replaceIndex + 1)\n );\n}\n\nexport type SelectionSegment = {\n selectionStart: number;\n selectionEnd: number;\n selectionDirection?: typeof SELECTION_DIRECTION[keyof typeof SELECTION_DIRECTION];\n};\n\ntype MaskedInputProps = {\n /** An extra class name to add to the component */\n className?: string;\n /** The regex pattern this masked input must match */\n pattern: string;\n /** The current value to display */\n value: string;\n /** One or more examples of valid values. Used when deciding if next keystroke is valid (as rest of the current value may be incomplete) */\n example: string | string[];\n /** The current selection to use for the input */\n selection?: SelectionSegment;\n /** Called when the value changes. Note the value may still be incomplete. */\n onChange?(value: string): void;\n /** Called when selection changes */\n onSelect?(segment: SelectionSegment): void;\n /** Retrieve the next value for a provided segment */\n getNextSegmentValue?(\n segment: SelectionSegment,\n delta: number,\n segmentValue: string,\n value: string\n ): string;\n getPreferredReplacementString?(\n value: string,\n replaceIndex: number,\n replaceChar: string,\n selectionStart: number,\n selectionEnd: number\n ): string;\n onFocus?: React.FocusEventHandler;\n onBlur?: React.FocusEventHandler;\n\n 'data-testid'?: string;\n};\n\n/**\n * A masked input for entering data from a template.\n * Won't work by itself, must use within another component and handle updating the value/selection.\n */\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(\n (props: MaskedInputProps, ref) => {\n const {\n className,\n example,\n getNextSegmentValue = (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString = DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n onChange = () => false,\n onSelect = () => false,\n pattern,\n selection,\n value,\n onFocus = () => false,\n onBlur = () => false,\n 'data-testid': dataTestId,\n } = props;\n const input = useForwardedRef(ref);\n const examples = useMemo(\n () => (Array.isArray(example) ? example : [example]),\n [example]\n );\n\n useEffect(() => {\n if (selection != null) {\n log.debug('setting selection...', selection);\n const { selectionStart, selectionEnd, selectionDirection } = selection;\n input.current?.setSelectionRange(\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n log.debug('selection set!');\n }\n }, [selection, input]);\n\n /**\n * Returns the selection range for the segment at the given cursor position\n * @param cursorPosition The current position of the cursor\n */\n function getSegment(cursorPosition: number) {\n let selectionStart = cursorPosition;\n let selectionEnd = cursorPosition;\n const testValue = examples.length > 0 ? examples[0] : value;\n\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionStart = i;\n }\n\n for (let i = selectionEnd; i < testValue.length; i += 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionEnd = i + 1;\n }\n\n const selectionDirection =\n selectionStart === selectionEnd\n ? SELECTION_DIRECTION.NONE\n : SELECTION_DIRECTION.BACKWARD;\n\n return {\n selectionStart,\n selectionEnd,\n selectionDirection,\n };\n }\n\n /**\n * Replaces all blank spaces and everything after the current cursor position with the example value\n * @param checkValue The value to check/fill in\n * @param exampleValue The example to fill in the value from\n * @param cursorPosition The cursor position\n * @returns The filled in value\n */\n function fillValue(\n checkValue: string,\n exampleValue: string,\n cursorPosition = checkValue.length\n ): string {\n let filledValue = '';\n for (let i = 0; i < cursorPosition; i += 1) {\n if (checkValue.charAt(i) !== FIXED_WIDTH_SPACE) {\n filledValue = filledValue.concat(checkValue[i]);\n } else {\n filledValue = filledValue.concat(exampleValue[i]);\n }\n }\n filledValue = filledValue.concat(exampleValue.substring(cursorPosition));\n\n return filledValue;\n }\n\n /**\n * Checks if a given `value` is valid up until the `cursorPosition`.\n * Uses the examples to build the rest of the string\n * @param checkValue The value to check validity of\n * @param cursorPosition The position of the cursor to check up to\n */\n function isValid(\n checkValue: string,\n cursorPosition = checkValue.length\n ): boolean {\n const patternRegex = new RegExp(pattern);\n if (patternRegex.test(checkValue)) {\n return true;\n }\n\n for (let i = 0; i < examples.length; i += 1) {\n const filledValue = fillValue(checkValue, examples[i], cursorPosition);\n if (patternRegex.test(filledValue)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns the next segment after the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function nextSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const nextPosition = currentSegment.selectionEnd + 1;\n if (nextPosition >= value.length) {\n return currentSegment;\n }\n\n return getSegment(nextPosition);\n }\n\n /**\n * Returns the previous segment before the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function previousSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const previousPosition = currentSegment.selectionStart - 1;\n if (previousPosition <= 0) {\n return currentSegment;\n }\n\n return getSegment(previousPosition);\n }\n\n function nextSegmentValue(position: number, delta: number): void {\n const segment = getSegment(position);\n const segmentValue = value.substring(\n segment.selectionStart,\n segment.selectionEnd\n );\n const newSegmentValue = getNextSegmentValue(\n segment,\n delta,\n segmentValue,\n value\n );\n const newValue =\n value.substring(0, segment.selectionStart) +\n newSegmentValue +\n value.substring(segment.selectionEnd);\n if (isValid(newValue, segment.selectionEnd)) {\n onChange(newValue);\n onSelect(segment);\n }\n }\n\n function handleSelect(event: React.UIEvent<HTMLInputElement>) {\n const {\n selectionStart = 0,\n selectionEnd = 0,\n selectionDirection = 'none',\n } = event.target as HTMLInputElement;\n\n if (\n selectionStart === null ||\n selectionEnd === null ||\n selectionDirection === null\n ) {\n log.error(\n 'Selection attempted on non-text input element',\n event.target\n );\n return;\n }\n\n log.debug2(\n 'handleSelect',\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n if (\n selection != null &&\n selectionStart === selection.selectionStart &&\n selectionEnd === selection.selectionEnd\n ) {\n return;\n }\n if (selectionStart === selectionEnd) {\n const newSelection = getSegment(selectionStart);\n log.debug(\n 'Selection segment from ',\n selectionStart,\n selectionEnd,\n '=>',\n newSelection\n );\n onSelect(newSelection);\n } else {\n onSelect({ selectionStart, selectionEnd, selectionDirection });\n }\n }\n\n function handleSelectCapture(event: React.UIEvent<HTMLInputElement>) {\n if (!input.current) {\n return;\n }\n log.debug('handleSelectCapture', event);\n const selectionStart = input.current.selectionStart || 0;\n if (\n selectionStart === value.length &&\n selection != null &&\n selectionStart !== selection.selectionStart\n ) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n function handleArrowKey(event: React.KeyboardEvent<HTMLInputElement>) {\n event.preventDefault();\n event.stopPropagation();\n\n if (!input.current) {\n return;\n }\n\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection arrow nvaigation attempted on non-text input element',\n event.target\n );\n return;\n }\n\n if (key === 'ArrowLeft') {\n onSelect(previousSegment(selectionStart));\n } else if (key === 'ArrowRight') {\n onSelect(nextSegment(selectionEnd));\n } else if (key === 'ArrowUp') {\n nextSegmentValue(selectionStart, -1);\n } else if (key === 'ArrowDown') {\n nextSegmentValue(selectionStart, 1);\n }\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (!input.current) {\n return;\n }\n log.debug('handleKeyDown', event);\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection key event on non-text input element',\n event.target\n );\n return;\n }\n\n if (key.startsWith('Arrow')) {\n handleArrowKey(event);\n return;\n }\n\n if (key === 'Delete' || key === 'Backspace') {\n event.preventDefault();\n event.stopPropagation();\n\n if (selectionStart !== selectionEnd) {\n // Replace all non-masked characters with blanks, set selection to start\n const newValue =\n value.substring(0, selectionStart) +\n value\n .substring(selectionStart, selectionEnd)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionEnd);\n log.debug(\n 'Range ',\n selectionStart,\n selectionEnd,\n 'deleted, setting value',\n newValue\n );\n\n onChange(newValue);\n onSelect({\n selectionStart,\n selectionEnd: selectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n } else if (selectionStart > 0) {\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n // Only replace non placeholder text\n const newValue =\n value.substring(0, i) +\n value\n .substring(i, selectionStart)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionStart);\n\n if (newValue !== value) {\n onChange(newValue);\n onSelect({\n selectionStart: i,\n selectionEnd: i,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n return;\n }\n }\n }\n\n return;\n }\n\n if (event.altKey || event.metaKey || event.ctrlKey || key.length > 1) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Get the different permutations of the character they entered, remove duplicates\n const newChars = Array.from(\n new Set([key, key.toUpperCase(), key.toLowerCase()])\n );\n for (let i = 0; i < newChars.length; i += 1) {\n const newChar = newChars[i];\n\n // If they're typing an alphanumeric character, be smart and allow it to jump ahead\n const maxReplaceIndex = /[a-zA-Z0-9]/g.test(newChar)\n ? value.length - 1\n : selectionStart;\n for (\n let replaceIndex = selectionStart;\n replaceIndex <= maxReplaceIndex;\n replaceIndex += 1\n ) {\n const newValue = getPreferredReplacementString(\n value,\n replaceIndex,\n newChar,\n selectionStart,\n selectionEnd\n );\n if (isValid(newValue, replaceIndex + 1)) {\n const currentSegment = getSegment(replaceIndex);\n const newSelectionStart = replaceIndex + 1;\n let newSelection: SelectionSegment = {\n selectionStart: newSelectionStart,\n selectionEnd: newSelectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n };\n if (newSelectionStart >= currentSegment.selectionEnd) {\n const nextSegmentSelection = nextSegment(replaceIndex);\n if (\n nextSegmentSelection.selectionStart !==\n currentSegment.selectionStart\n ) {\n newSelection = nextSegmentSelection;\n }\n }\n log.debug('handleKeyDown', key, '=>', newValue, newSelection);\n onChange(newValue);\n onSelect(newSelection);\n return;\n }\n }\n }\n }\n\n // Need to use \"text\" type so we can apply a pattern and make selection properly\n return (\n <input\n ref={input}\n className={classNames('form-control masked-input', className)}\n type=\"text\"\n pattern={pattern}\n value={value}\n onChange={() => undefined}\n onKeyDown={handleKeyDown}\n onSelect={handleSelect}\n onSelectCapture={handleSelectCapture}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nMaskedInput.defaultProps = {\n className: '',\n onChange(): void {\n // no-op\n },\n onSelect(): void {\n // no-op\n },\n getNextSegmentValue: (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString: DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n selection: undefined,\n onFocus(): void {\n // no-op\n },\n onBlur(): void {\n // no-op\n },\n 'data-testid': undefined,\n};\n\nexport default MaskedInput;\n"],"file":"MaskedInput.js"}
|
|
1
|
+
{"version":3,"sources":["../src/MaskedInput.tsx"],"names":["React","useMemo","useEffect","classNames","Log","useForwardedRef","log","module","SELECTION_DIRECTION","FORWARD","BACKWARD","NONE","FIXED_WIDTH_SPACE","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","value","replaceIndex","newChar","substring","MaskedInput","forwardRef","props","ref","className","example","getNextSegmentValue","range","delta","segmentValue","getPreferredReplacementString","onChange","onSelect","pattern","selection","onFocus","onBlur","dataTestId","input","examples","Array","isArray","setSelectedSegment","debug","selectionStart","selectionEnd","selectionDirection","current","setSelectionRange","getSegment","cursorPosition","testValue","length","i","test","charAt","fillValue","checkValue","exampleValue","filledValue","concat","isValid","patternRegex","RegExp","nextSegment","position","currentSegment","nextPosition","previousSegment","previousPosition","nextSegmentValue","segment","newSegmentValue","newValue","handleSelect","event","target","error","debug2","newSelection","handleSelectCapture","preventDefault","stopPropagation","handleArrowKey","key","handleKeyDown","startsWith","replace","altKey","metaKey","ctrlKey","newChars","from","Set","toUpperCase","toLowerCase","maxReplaceIndex","newSelectionStart","nextSegmentSelection","undefined","defaultProps"],"mappings":"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","sourcesContent":["import React, { useMemo, useEffect } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { useForwardedRef } from '@deephaven/react-hooks';\nimport './MaskedInput.scss';\n\nconst log = Log.module('MaskedInput');\n\nconst SELECTION_DIRECTION = {\n FORWARD: 'forward',\n BACKWARD: 'backward',\n NONE: 'none',\n} as const;\n\n/**\n * Special space character that's the same size as tabular numbers\n * https://www.fileformat.info/info/unicode/char/2007/index.htm\n */\nconst FIXED_WIDTH_SPACE = '\\u2007';\n\nexport function DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n value: string,\n replaceIndex: number,\n newChar: string\n): string {\n return (\n value.substring(0, replaceIndex) +\n newChar +\n value.substring(replaceIndex + 1)\n );\n}\n\nexport type SelectionSegment = {\n selectionStart: number;\n selectionEnd: number;\n selectionDirection?: typeof SELECTION_DIRECTION[keyof typeof SELECTION_DIRECTION];\n};\n\ntype MaskedInputProps = {\n /** An extra class name to add to the component */\n className?: string;\n /** The regex pattern this masked input must match */\n pattern: string;\n /** The current value to display */\n value: string;\n /** One or more examples of valid values. Used when deciding if next keystroke is valid (as rest of the current value may be incomplete) */\n example: string | string[];\n /** The current selection to use for the input */\n selection?: SelectionSegment;\n /** Called when the value changes. Note the value may still be incomplete. */\n onChange?(value: string): void;\n /** Called when selection changes */\n onSelect?(segment: SelectionSegment): void;\n /** Retrieve the next value for a provided segment */\n getNextSegmentValue?(\n segment: SelectionSegment,\n delta: number,\n segmentValue: string,\n value: string\n ): string;\n getPreferredReplacementString?(\n value: string,\n replaceIndex: number,\n replaceChar: string,\n selectionStart: number,\n selectionEnd: number\n ): string;\n onFocus?: React.FocusEventHandler;\n onBlur?: React.FocusEventHandler;\n\n 'data-testid'?: string;\n};\n\n/**\n * A masked input for entering data from a template.\n * Won't work by itself, must use within another component and handle updating the value/selection.\n */\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(\n (props: MaskedInputProps, ref) => {\n const {\n className,\n example,\n getNextSegmentValue = (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString = DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n onChange = () => false,\n onSelect = () => false,\n pattern,\n selection,\n value,\n onFocus = () => false,\n onBlur = () => false,\n 'data-testid': dataTestId,\n } = props;\n const input = useForwardedRef(ref);\n const examples = useMemo(\n () => (Array.isArray(example) ? example : [example]),\n [example]\n );\n\n useEffect(\n function setSelectedSegment() {\n if (selection != null) {\n log.debug('setting selection...', selection);\n const {\n selectionStart,\n selectionEnd,\n selectionDirection,\n } = selection;\n input.current?.setSelectionRange(\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n log.debug('selection set!');\n }\n },\n [selection, input]\n );\n\n /**\n * Returns the selection range for the segment at the given cursor position\n * @param cursorPosition The current position of the cursor\n */\n function getSegment(cursorPosition: number) {\n let selectionStart = cursorPosition;\n let selectionEnd = cursorPosition;\n const testValue = examples.length > 0 ? examples[0] : value;\n\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionStart = i;\n }\n\n for (let i = selectionEnd; i < testValue.length; i += 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionEnd = i + 1;\n }\n\n const selectionDirection =\n selectionStart === selectionEnd\n ? SELECTION_DIRECTION.NONE\n : SELECTION_DIRECTION.BACKWARD;\n\n return {\n selectionStart,\n selectionEnd,\n selectionDirection,\n };\n }\n\n /**\n * Replaces all blank spaces and everything after the current cursor position with the example value\n * @param checkValue The value to check/fill in\n * @param exampleValue The example to fill in the value from\n * @param cursorPosition The cursor position\n * @returns The filled in value\n */\n function fillValue(\n checkValue: string,\n exampleValue: string,\n cursorPosition = checkValue.length\n ): string {\n let filledValue = '';\n for (let i = 0; i < cursorPosition; i += 1) {\n if (checkValue.charAt(i) !== FIXED_WIDTH_SPACE) {\n filledValue = filledValue.concat(checkValue[i]);\n } else {\n filledValue = filledValue.concat(exampleValue[i]);\n }\n }\n filledValue = filledValue.concat(exampleValue.substring(cursorPosition));\n\n return filledValue;\n }\n\n /**\n * Checks if a given `value` is valid up until the `cursorPosition`.\n * Uses the examples to build the rest of the string\n * @param checkValue The value to check validity of\n * @param cursorPosition The position of the cursor to check up to\n */\n function isValid(\n checkValue: string,\n cursorPosition = checkValue.length\n ): boolean {\n const patternRegex = new RegExp(pattern);\n if (patternRegex.test(checkValue)) {\n return true;\n }\n\n for (let i = 0; i < examples.length; i += 1) {\n const filledValue = fillValue(checkValue, examples[i], cursorPosition);\n if (patternRegex.test(filledValue)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns the next segment after the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function nextSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const nextPosition = currentSegment.selectionEnd + 1;\n if (nextPosition >= value.length) {\n return currentSegment;\n }\n\n return getSegment(nextPosition);\n }\n\n /**\n * Returns the previous segment before the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function previousSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const previousPosition = currentSegment.selectionStart - 1;\n if (previousPosition <= 0) {\n return currentSegment;\n }\n\n return getSegment(previousPosition);\n }\n\n function nextSegmentValue(position: number, delta: number): void {\n const segment = getSegment(position);\n const segmentValue = value.substring(\n segment.selectionStart,\n segment.selectionEnd\n );\n const newSegmentValue = getNextSegmentValue(\n segment,\n delta,\n segmentValue,\n value\n );\n const newValue =\n value.substring(0, segment.selectionStart) +\n newSegmentValue +\n value.substring(segment.selectionEnd);\n if (isValid(newValue, segment.selectionEnd)) {\n onChange(newValue);\n onSelect(segment);\n }\n }\n\n function handleSelect(event: React.UIEvent<HTMLInputElement>) {\n const {\n selectionStart = 0,\n selectionEnd = 0,\n selectionDirection = 'none',\n } = event.target as HTMLInputElement;\n\n if (\n selectionStart === null ||\n selectionEnd === null ||\n selectionDirection === null\n ) {\n log.error(\n 'Selection attempted on non-text input element',\n event.target\n );\n return;\n }\n\n log.debug2(\n 'handleSelect',\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n if (\n selection != null &&\n selectionStart === selection.selectionStart &&\n selectionEnd === selection.selectionEnd\n ) {\n return;\n }\n if (selectionStart === selectionEnd) {\n const newSelection = getSegment(selectionStart);\n log.debug(\n 'Selection segment from ',\n selectionStart,\n selectionEnd,\n '=>',\n newSelection\n );\n onSelect(newSelection);\n } else {\n onSelect({ selectionStart, selectionEnd, selectionDirection });\n }\n }\n\n function handleSelectCapture(event: React.UIEvent<HTMLInputElement>) {\n if (!input.current) {\n return;\n }\n log.debug('handleSelectCapture', event);\n const selectionStart = input.current.selectionStart || 0;\n if (\n selectionStart === value.length &&\n selection != null &&\n selectionStart !== selection.selectionStart\n ) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n function handleArrowKey(event: React.KeyboardEvent<HTMLInputElement>) {\n event.preventDefault();\n event.stopPropagation();\n\n if (!input.current) {\n return;\n }\n\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection arrow nvaigation attempted on non-text input element',\n event.target\n );\n return;\n }\n\n if (key === 'ArrowLeft') {\n onSelect(previousSegment(selectionStart));\n } else if (key === 'ArrowRight') {\n onSelect(nextSegment(selectionEnd));\n } else if (key === 'ArrowUp') {\n nextSegmentValue(selectionStart, -1);\n } else if (key === 'ArrowDown') {\n nextSegmentValue(selectionStart, 1);\n }\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (!input.current) {\n return;\n }\n log.debug('handleKeyDown', event);\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection key event on non-text input element',\n event.target\n );\n return;\n }\n\n if (key.startsWith('Arrow')) {\n handleArrowKey(event);\n return;\n }\n\n if (key === 'Delete' || key === 'Backspace') {\n event.preventDefault();\n event.stopPropagation();\n\n if (selectionStart !== selectionEnd) {\n // Replace all non-masked characters with blanks, set selection to start\n const newValue =\n value.substring(0, selectionStart) +\n value\n .substring(selectionStart, selectionEnd)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionEnd);\n log.debug(\n 'Range ',\n selectionStart,\n selectionEnd,\n 'deleted, setting value',\n newValue\n );\n\n onChange(newValue);\n onSelect({\n selectionStart,\n selectionEnd: selectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n } else if (selectionStart > 0) {\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n // Only replace non placeholder text\n const newValue =\n value.substring(0, i) +\n value\n .substring(i, selectionStart)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionStart);\n\n if (newValue !== value) {\n onChange(newValue);\n onSelect({\n selectionStart: i,\n selectionEnd: i,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n return;\n }\n }\n }\n\n return;\n }\n\n if (event.altKey || event.metaKey || event.ctrlKey || key.length > 1) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Get the different permutations of the character they entered, remove duplicates\n const newChars = Array.from(\n new Set([key, key.toUpperCase(), key.toLowerCase()])\n );\n for (let i = 0; i < newChars.length; i += 1) {\n const newChar = newChars[i];\n\n // If they're typing an alphanumeric character, be smart and allow it to jump ahead\n const maxReplaceIndex = /[a-zA-Z0-9]/g.test(newChar)\n ? value.length - 1\n : selectionStart;\n for (\n let replaceIndex = selectionStart;\n replaceIndex <= maxReplaceIndex;\n replaceIndex += 1\n ) {\n const newValue = getPreferredReplacementString(\n value,\n replaceIndex,\n newChar,\n selectionStart,\n selectionEnd\n );\n if (isValid(newValue, replaceIndex + 1)) {\n const currentSegment = getSegment(replaceIndex);\n const newSelectionStart = replaceIndex + 1;\n let newSelection: SelectionSegment = {\n selectionStart: newSelectionStart,\n selectionEnd: newSelectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n };\n if (newSelectionStart >= currentSegment.selectionEnd) {\n const nextSegmentSelection = nextSegment(replaceIndex);\n if (\n nextSegmentSelection.selectionStart !==\n currentSegment.selectionStart\n ) {\n newSelection = nextSegmentSelection;\n }\n }\n log.debug('handleKeyDown', key, '=>', newValue, newSelection);\n onChange(newValue);\n onSelect(newSelection);\n return;\n }\n }\n }\n }\n\n // Need to use \"text\" type so we can apply a pattern and make selection properly\n return (\n <input\n ref={input}\n className={classNames('form-control masked-input', className)}\n type=\"text\"\n pattern={pattern}\n value={value}\n onChange={() => undefined}\n onKeyDown={handleKeyDown}\n onSelect={handleSelect}\n onSelectCapture={handleSelectCapture}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nMaskedInput.defaultProps = {\n className: '',\n onChange(): void {\n // no-op\n },\n onSelect(): void {\n // no-op\n },\n getNextSegmentValue: (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString: DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n selection: undefined,\n onFocus(): void {\n // no-op\n },\n onBlur(): void {\n // no-op\n },\n 'data-testid': undefined,\n};\n\nexport default MaskedInput;\n"],"file":"MaskedInput.js"}
|
package/dist/TimeInput.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../src/TimeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAanD,aAAK,cAAc,GAAG;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,MAAM,CAAC,IAAI,IAAI,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAKF,QAAA,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../src/TimeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAanD,aAAK,cAAc,GAAG;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,MAAM,CAAC,IAAI,IAAI,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAKF,QAAA,MAAM,SAAS,yFA8Fd,CAAC;AAYF,eAAe,SAAS,CAAC"}
|
package/dist/TimeInput.js
CHANGED
|
@@ -20,7 +20,7 @@ var TimeInput = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
20
20
|
} = props;
|
|
21
21
|
var [value, setValue] = useState(TimeUtils.formatTime(propsValue));
|
|
22
22
|
var [selection, setSelection] = useState();
|
|
23
|
-
useEffect(()
|
|
23
|
+
useEffect(function setFormattedTime() {
|
|
24
24
|
setValue(TimeUtils.formatTime(propsValue));
|
|
25
25
|
}, [propsValue]);
|
|
26
26
|
|
package/dist/TimeInput.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/TimeInput.tsx"],"names":["React","useEffect","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","log","module","TIME_PATTERN","EXAMPLES","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","value","propsValue","onFocus","onBlur","dataTestId","setValue","formatTime","selection","setSelection","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","substring","handleChange","newValue","debug","isTimeString","parseTime","handleSelect","newSelection","defaultProps","undefined"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,SAAhB,EAA2BC,QAA3B,QAA2C,OAA3C;AACA,OAAOC,GAAP,MAAgB,gBAAhB;AACA,SAASC,SAAT,QAA0B,kBAA1B;OACOC,W,IACLC,wC;AAIF,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAJ,CAAW,WAAX,CAAZ;AAEA,IAAMC,YAAY,GAAG,0CAArB;AACA,IAAMC,QAAQ,GAAG,CAAC,UAAD,EAAa,UAAb,EAAyB,UAAzB,CAAjB;AAYA;AACA;AACA;AACA,IAAMC,SAAS,gBAAGX,KAAK,CAACY,UAAN,CAChB,CAACC,KAAD,EAAwBC,GAAxB,KAAgC;AAC9B,MAAM;AACJC,IAAAA,kBAAkB,GAAG,IADjB;AAEJC,IAAAA,SAAS,GAAG,EAFR;AAGJC,IAAAA,QAAQ,GAAG,MAAM,KAHb;AAIJC,IAAAA,KAAK,EAAEC,UAAU,GAAG,CAJhB;AAKJC,IAAAA,OAAO,GAAG,MAAM,KALZ;AAMJC,IAAAA,MAAM,GAAG,MAAM,KANX;AAOJ,mBAAeC;AAPX,MAQFT,KARJ;AASA,MAAM,CAACK,KAAD,EAAQK,QAAR,IAAoBrB,QAAQ,CAACE,SAAS,CAACoB,UAAV,CAAqBL,UAArB,CAAD,CAAlC;AACA,MAAM,CAACM,SAAD,EAAYC,YAAZ,IAA4BxB,QAAQ,EAA1C;AACAD,EAAAA,SAAS,
|
|
1
|
+
{"version":3,"sources":["../src/TimeInput.tsx"],"names":["React","useEffect","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","log","module","TIME_PATTERN","EXAMPLES","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","value","propsValue","onFocus","onBlur","dataTestId","setValue","formatTime","selection","setSelection","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","substring","handleChange","newValue","debug","isTimeString","parseTime","handleSelect","newSelection","defaultProps","undefined"],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from 'react';\nimport Log from '@deephaven/log';\nimport { TimeUtils } from '@deephaven/utils';\nimport MaskedInput, {\n DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n SelectionSegment,\n} from './MaskedInput';\n\nconst log = Log.module('TimeInput');\n\nconst TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';\nconst EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];\n\ntype TimeInputProps = {\n allowValueWrapping?: boolean;\n className?: string;\n onChange?(timeInSec: number): void;\n value?: number;\n onFocus?(): void;\n onBlur?(): void;\n 'data-testid'?: string;\n};\n\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst TimeInput = React.forwardRef<HTMLInputElement, TimeInputProps>(\n (props: TimeInputProps, ref) => {\n const {\n allowValueWrapping = true,\n className = '',\n onChange = () => false,\n value: propsValue = 0,\n onFocus = () => false,\n onBlur = () => false,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const [selection, setSelection] = useState<SelectionSegment>();\n useEffect(\n function setFormattedTime() {\n setValue(TimeUtils.formatTime(propsValue));\n },\n [propsValue]\n );\n\n function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n ): string {\n // Delta is backward because negative Y is up\n const maxValue = range.selectionStart === 0 ? 24 : 60;\n let newSegmentValue = parseInt(segmentValue, 10) - delta;\n if (Number.isNaN(newSegmentValue)) {\n newSegmentValue = 0;\n } else if (allowValueWrapping) {\n // Add max value and re-mod so we don't get negative values after mod\n newSegmentValue = ((newSegmentValue % maxValue) + maxValue) % maxValue;\n } else {\n newSegmentValue = Math.min(Math.max(0, newSegmentValue), maxValue - 1);\n }\n return `${newSegmentValue}`.padStart(2, '0');\n }\n\n function getPreferredReplacementString(\n replaceValue: string,\n replaceIndex: number,\n newChar: string,\n selectionStart: number,\n selectionEnd: number\n ) {\n if (\n selectionStart === 0 &&\n selectionEnd === 2 &&\n replaceIndex === 1 &&\n parseInt(newChar, 10) > 1\n ) {\n // DH-10082 Special case for when typing `3` when it's already 12\n return `0${newChar}${replaceValue.substring(2)}`;\n }\n return DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n replaceValue,\n replaceIndex,\n newChar\n );\n }\n\n function handleChange(newValue: string): void {\n log.debug('handleChange', newValue);\n setValue(newValue);\n\n // Only send a change if the value is actually valid\n if (TimeUtils.isTimeString(newValue)) {\n onChange(TimeUtils.parseTime(newValue));\n }\n }\n\n function handleSelect(newSelection: SelectionSegment) {\n setSelection(newSelection);\n }\n\n return (\n <MaskedInput\n ref={ref}\n className={className}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n getPreferredReplacementString={getPreferredReplacementString}\n onChange={handleChange}\n onSelect={handleSelect}\n pattern={TIME_PATTERN}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nTimeInput.defaultProps = {\n allowValueWrapping: true,\n className: '',\n onChange: () => false,\n value: 0,\n onFocus: () => false,\n onBlur: () => false,\n 'data-testid': undefined,\n};\n\nexport default TimeInput;\n"],"file":"TimeInput.js"}
|
package/dist/TimeSlider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeSlider.d.ts","sourceRoot":"","sources":["../src/TimeSlider.tsx"],"names":[],"mappings":";AAaA,OAAO,mBAAmB,CAAC;AAO3B,aAAK,eAAe,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,UAAU,6HAOb,eAAe,KAAG,
|
|
1
|
+
{"version":3,"file":"TimeSlider.d.ts","sourceRoot":"","sources":["../src/TimeSlider.tsx"],"names":[],"mappings":";AAaA,OAAO,mBAAmB,CAAC;AAO3B,aAAK,eAAe,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,UAAU,6HAOb,eAAe,KAAG,WAuFpB,CAAC;AAuQF,eAAe,UAAU,CAAC"}
|
package/dist/TimeSlider.js
CHANGED
|
@@ -29,7 +29,7 @@ var TimeSlider = _ref => {
|
|
|
29
29
|
var track = useRef(null); // we need the track width while calulculating time from handle drag
|
|
30
30
|
// updates state if props change
|
|
31
31
|
|
|
32
|
-
useEffect(()
|
|
32
|
+
useEffect(function setTimeOnPropTimeChange() {
|
|
33
33
|
setStartTime(propStartTime);
|
|
34
34
|
setEndTime(propEndTime);
|
|
35
35
|
}, [propStartTime, propEndTime]);
|
|
@@ -111,7 +111,7 @@ var PopOvers = props => {
|
|
|
111
111
|
} = props;
|
|
112
112
|
var [firstTime, setFirstTime] = useState(startTime > endTime ? endTime : startTime);
|
|
113
113
|
var [secondTime, setSecondTime] = useState(startTime > endTime ? startTime : endTime);
|
|
114
|
-
useEffect(()
|
|
114
|
+
useEffect(function setTimeOnPropTimeChange() {
|
|
115
115
|
setFirstTime(startTime > endTime ? endTime : startTime);
|
|
116
116
|
setSecondTime(startTime > endTime ? startTime : endTime);
|
|
117
117
|
}, [startTime, endTime]);
|
|
@@ -274,8 +274,10 @@ var Handle = props => {
|
|
|
274
274
|
var handleMouseDown = useCallback(() => {
|
|
275
275
|
startDragListening();
|
|
276
276
|
}, [startDragListening]);
|
|
277
|
-
useEffect(
|
|
278
|
-
|
|
277
|
+
useEffect(function removeListenersOnUnmount() {
|
|
278
|
+
return () => {
|
|
279
|
+
stopDragListening();
|
|
280
|
+
};
|
|
279
281
|
}, [stopDragListening]);
|
|
280
282
|
return /*#__PURE__*/React.createElement("div", {
|
|
281
283
|
className: "handle-track",
|
package/dist/TimeSlider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/TimeSlider.tsx"],"names":["React","useCallback","useMemo","useRef","useState","useEffect","classNames","TimeInput","StyleExports","HANDLE_SIZE","parseInt","POPOVER_WIDTH","SECONDS_IN_DAY","SNAP_NEAREST_MINUTES","TimeSlider","startTime","propStartTime","endTime","propEndTime","onChange","isStartModified","isEndModified","dataTestId","setStartTime","setEndTime","track","updateTime","newStartTime","newEndTime","start","end","handleStartTimeChange","handleEndTimeChange","Array","fill","map","value","index","PopOvers","props","onStartTimeChange","onEndTimeChange","firstTime","setFirstTime","secondTime","setSecondTime","onFirstTimeChange","onSecondTimeChange","flexBasis","modified","undefined","TrackFills","transform","Handle","time","setTime","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","current","trackRect","getBoundingClientRect","leftEdge","Math","max","left","preciseTime","min","width","roundedTime","round","limitMax","handleMouseMove","handleMouseUp","window","removeEventListener","document","documentElement","classList","remove","startDragListening","addEventListener","add","stopDragListening","handleMouseDown"],"mappings":"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","sourcesContent":["/* eslint-disable react/no-array-index-key */\n// array maps being used are static, this is fine.\n\nimport React, {\n useCallback,\n useMemo,\n useRef,\n useState,\n useEffect,\n} from 'react';\nimport classNames from 'classnames';\nimport TimeInput from './TimeInput';\nimport StyleExports from './TimeSlider.module.scss';\nimport './TimeSlider.scss';\n\nconst HANDLE_SIZE = parseInt(StyleExports['handle-size'], 10);\nconst POPOVER_WIDTH = parseInt(StyleExports['popover-width'], 10);\nconst SECONDS_IN_DAY = 24 * 60 * 60 - 1; // Max is actually 23:59:59\nconst SNAP_NEAREST_MINUTES = 5 * 60; // rounds in 5 minute intervals\n\ntype TimeSliderProps = {\n startTime: number;\n endTime: number;\n onChange(value: { startTime: number; endTime: number }): void;\n isStartModified?: boolean;\n isEndModified?: boolean;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a time slider for setting a start and end time, that can also run overnight\n * @param {startTime, endTime, onChange} props takes times in seconds 0 - 86399 and a callback\n */\nconst TimeSlider = ({\n startTime: propStartTime,\n endTime: propEndTime,\n onChange,\n isStartModified = false,\n isEndModified = false,\n 'data-testid': dataTestId,\n}: TimeSliderProps): JSX.Element => {\n const [startTime, setStartTime] = useState(propStartTime);\n const [endTime, setEndTime] = useState(propEndTime);\n\n const track = useRef<HTMLDivElement>(null); // we need the track width while calulculating time from handle drag\n\n // updates state if props change\n useEffect(() => {\n setStartTime(propStartTime);\n setEndTime(propEndTime);\n }, [propStartTime, propEndTime]);\n\n const updateTime = useCallback(\n (newStartTime: number, newEndTime: number) => {\n let start = newStartTime;\n let end = newEndTime;\n if (start === end) {\n if (end < SECONDS_IN_DAY) {\n end += 1;\n } else {\n start -= 1;\n }\n }\n\n setStartTime(start);\n setEndTime(end);\n onChange({ startTime: start, endTime: end });\n },\n [setStartTime, setEndTime, onChange]\n );\n\n const handleStartTimeChange = useCallback(\n (newStartTime: number) => {\n updateTime(newStartTime, endTime);\n },\n [updateTime, endTime]\n );\n\n const handleEndTimeChange = useCallback(\n (newEndTime: number) => {\n updateTime(startTime, newEndTime);\n },\n [updateTime, startTime]\n );\n\n return (\n <div className=\"time-slider\" data-testid={dataTestId}>\n <PopOvers\n startTime={startTime}\n endTime={endTime}\n onStartTimeChange={handleStartTimeChange}\n onEndTimeChange={handleEndTimeChange}\n isStartModified={isStartModified}\n isEndModified={isEndModified}\n />\n <div className=\"track\" ref={track}>\n <TrackFills startTime={startTime} endTime={endTime} />\n <div className=\"ticks\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick\" key={index} />\n ))}\n </div>\n <Handle\n track={track}\n time={startTime}\n setTime={handleStartTimeChange}\n />\n <Handle track={track} time={endTime} setTime={handleEndTimeChange} />\n </div>\n\n <div className=\"tick-labels\">\n <div className=\"tick-label\">0:00</div>\n <div className=\"tick-label-wrapper\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick-label\" key={index}>{`${index + 1}:00`}</div>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\ntype PopOversProps = {\n startTime: number;\n endTime: number;\n onStartTimeChange(time: number): void;\n onEndTimeChange(time: number): void;\n isStartModified: boolean;\n isEndModified: boolean;\n 'data-testid'?: string;\n};\n\nconst PopOvers = (props: PopOversProps): JSX.Element => {\n const {\n startTime,\n endTime,\n onStartTimeChange,\n onEndTimeChange,\n isStartModified,\n isEndModified,\n 'data-testid': dataTestId,\n } = props;\n\n const [firstTime, setFirstTime] = useState(\n startTime > endTime ? endTime : startTime\n );\n const [secondTime, setSecondTime] = useState(\n startTime > endTime ? startTime : endTime\n );\n\n useEffect(() => {\n setFirstTime(startTime > endTime ? endTime : startTime);\n setSecondTime(startTime > endTime ? startTime : endTime);\n }, [startTime, endTime]);\n\n function onFirstTimeChange(value: number) {\n if (startTime <= endTime) {\n onStartTimeChange(value);\n } else {\n onEndTimeChange(value);\n }\n }\n\n function onSecondTimeChange(value: number) {\n if (startTime <= endTime) {\n onEndTimeChange(value);\n } else {\n onStartTimeChange(value);\n }\n }\n\n return (\n <div className=\"time-slider-popovers\">\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${(firstTime / SECONDS_IN_DAY) * 100}% - ${\n POPOVER_WIDTH / 2\n }px)`,\n }}\n />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: startTime < endTime ? isStartModified : isEndModified,\n })}\n >\n {startTime <= endTime ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n allowValueWrapping={false}\n value={firstTime}\n onChange={onFirstTimeChange}\n data-testid={dataTestId ? `${dataTestId}-input-1` : undefined}\n />\n </div>\n <div className=\"flex-spacer\" />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: startTime > endTime ? isStartModified : isEndModified,\n })}\n >\n {startTime > endTime ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n allowValueWrapping={false}\n value={secondTime}\n onChange={onSecondTimeChange}\n data-testid={dataTestId ? `${dataTestId}-input-2` : undefined}\n />\n </div>\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${\n ((SECONDS_IN_DAY - secondTime) / SECONDS_IN_DAY) * 100\n }% - ${POPOVER_WIDTH / 2}px)`,\n }}\n />\n </div>\n );\n};\n\ntype TrackFillsProps = {\n startTime: number;\n endTime: number;\n 'data-testid'?: string;\n};\n\n/**\n * Shades the area between or outside of handles according to if start or endtime is greater.\n */\nconst TrackFills = (props: TrackFillsProps): JSX.Element => {\n const { startTime, endTime, 'data-testid': dataTestId } = props;\n return (\n <div className=\"track-fills\" data-testid={dataTestId}>\n {startTime > endTime && (\n <>\n <div\n className=\"track-fill track-fill-start\"\n style={{ transform: `scaleX(${endTime / SECONDS_IN_DAY})` }}\n />\n <div\n className=\"track-fill track-fill-end\"\n style={{\n transform: `scaleX(${\n (SECONDS_IN_DAY - startTime) / SECONDS_IN_DAY\n })`,\n }}\n />\n </>\n )}\n {startTime < endTime && (\n <div\n className=\"track-fill track-fill-middle\"\n style={{\n transform: `translateX(${\n (startTime / SECONDS_IN_DAY) * 100\n }%) scaleX(${(endTime - startTime) / SECONDS_IN_DAY})`,\n }}\n />\n )}\n </div>\n );\n};\n\ntype HandleProps = {\n track: React.RefObject<HTMLDivElement>;\n time: number;\n setTime(time: number): void;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a draggable handle the sets the time\n */\nconst Handle = (props: HandleProps): JSX.Element => {\n const { track, time, setTime, 'data-testid': dataTestId } = props;\n\n /**\n * Takes the time and generate our translation string taking into account handle offset.\n * The handle offset changes for the first and last tick range dynmaically. Normally,\n * the center of the handle (size/2) is the selection origin, but at edges, it becomes either\n * end of the handle, requireing a relative offset range of 0 - 0.5, and 0.5 - 1 of handle size.\n * @param {number} t time in seconds\n */\n const transform = useMemo(() => {\n const ONE_HOUR = 60 * 60;\n let handleOffset = HANDLE_SIZE / 2;\n if (time < ONE_HOUR) {\n handleOffset = (time / ONE_HOUR) * (HANDLE_SIZE / 2); // 0 - 0.5 Handle size\n } else if (time > 23 * ONE_HOUR) {\n handleOffset =\n HANDLE_SIZE / 2 +\n (1 / (SECONDS_IN_DAY - 23 * ONE_HOUR)) *\n (time - 23 * ONE_HOUR) *\n (HANDLE_SIZE / 2); // 0.5 - 1 Handle size\n }\n return `translateX(calc(${\n (time / SECONDS_IN_DAY) * 100\n }% - ${handleOffset}px))`;\n }, [time]);\n\n const calculatePositionAsTime = useCallback(\n (clientX: number) => {\n if (!track.current) {\n return 0;\n }\n const trackRect = track.current.getBoundingClientRect();\n const leftEdge = Math.max(clientX - trackRect.left, 0);\n // get position as 0-1 on slider and mulitply by seconds in a day to convert to time\n const preciseTime =\n SECONDS_IN_DAY * Math.min(1, leftEdge / trackRect.width);\n // snap to nearest N(5) minute interval\n const roundedTime =\n SNAP_NEAREST_MINUTES * Math.round(preciseTime / SNAP_NEAREST_MINUTES);\n // prevent over-rounding to 24:00:00\n const limitMax = Math.min(SECONDS_IN_DAY, roundedTime);\n return limitMax;\n },\n [track]\n );\n\n const handleMouseMove = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n },\n [setTime, calculatePositionAsTime]\n );\n\n const handleMouseUp = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n },\n [setTime, calculatePositionAsTime, handleMouseMove]\n );\n\n const startDragListening = useCallback(() => {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.add('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const stopDragListening = useCallback(() => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const handleMouseDown = useCallback(() => {\n startDragListening();\n }, [startDragListening]);\n\n useEffect(\n () => () => {\n stopDragListening();\n },\n [stopDragListening]\n );\n\n return (\n <div className=\"handle-track\" style={{ transform }}>\n <button\n className=\"handle\"\n type=\"button\"\n aria-label=\"Change time\"\n onMouseDown={handleMouseDown}\n data-testid={dataTestId}\n />\n </div>\n );\n};\n\nexport default TimeSlider;\n"],"file":"TimeSlider.js"}
|
|
1
|
+
{"version":3,"sources":["../src/TimeSlider.tsx"],"names":["React","useCallback","useMemo","useRef","useState","useEffect","classNames","TimeInput","StyleExports","HANDLE_SIZE","parseInt","POPOVER_WIDTH","SECONDS_IN_DAY","SNAP_NEAREST_MINUTES","TimeSlider","startTime","propStartTime","endTime","propEndTime","onChange","isStartModified","isEndModified","dataTestId","setStartTime","setEndTime","track","setTimeOnPropTimeChange","updateTime","newStartTime","newEndTime","start","end","handleStartTimeChange","handleEndTimeChange","Array","fill","map","value","index","PopOvers","props","onStartTimeChange","onEndTimeChange","firstTime","setFirstTime","secondTime","setSecondTime","onFirstTimeChange","onSecondTimeChange","flexBasis","modified","undefined","TrackFills","transform","Handle","time","setTime","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","current","trackRect","getBoundingClientRect","leftEdge","Math","max","left","preciseTime","min","width","roundedTime","round","limitMax","handleMouseMove","handleMouseUp","window","removeEventListener","document","documentElement","classList","remove","startDragListening","addEventListener","add","stopDragListening","handleMouseDown","removeListenersOnUnmount"],"mappings":"AAAA;AACA;AAEA,OAAOA,KAAP,IACEC,WADF,EAEEC,OAFF,EAGEC,MAHF,EAIEC,QAJF,EAKEC,SALF,QAMO,OANP;AAOA,OAAOC,UAAP,MAAuB,YAAvB;OACOC,S;OACAC,Y;;AAGP,IAAMC,WAAW,GAAGC,QAAQ,CAACF,YAAY,CAAC,aAAD,CAAb,EAA8B,EAA9B,CAA5B;AACA,IAAMG,aAAa,GAAGD,QAAQ,CAACF,YAAY,CAAC,eAAD,CAAb,EAAgC,EAAhC,CAA9B;AACA,IAAMI,cAAc,GAAG,KAAK,EAAL,GAAU,EAAV,GAAe,CAAtC,C,CAAyC;;AACzC,IAAMC,oBAAoB,GAAG,IAAI,EAAjC,C,CAAqC;;AAWrC;AACA;AACA;AACA;AACA,IAAMC,UAAU,GAAG,QAOiB;AAAA,MAPhB;AAClBC,IAAAA,SAAS,EAAEC,aADO;AAElBC,IAAAA,OAAO,EAAEC,WAFS;AAGlBC,IAAAA,QAHkB;AAIlBC,IAAAA,eAAe,GAAG,KAJA;AAKlBC,IAAAA,aAAa,GAAG,KALE;AAMlB,mBAAeC;AANG,GAOgB;AAClC,MAAM,CAACP,SAAD,EAAYQ,YAAZ,IAA4BnB,QAAQ,CAACY,aAAD,CAA1C;AACA,MAAM,CAACC,OAAD,EAAUO,UAAV,IAAwBpB,QAAQ,CAACc,WAAD,CAAtC;AAEA,MAAMO,KAAK,GAAGtB,MAAM,CAAiB,IAAjB,CAApB,CAJkC,CAIU;AAE5C;;AACAE,EAAAA,SAAS,CACP,SAASqB,uBAAT,GAAmC;AACjCH,IAAAA,YAAY,CAACP,aAAD,CAAZ;AACAQ,IAAAA,UAAU,CAACN,WAAD,CAAV;AACD,GAJM,EAKP,CAACF,aAAD,EAAgBE,WAAhB,CALO,CAAT;AAQA,MAAMS,UAAU,GAAG1B,WAAW,CAC5B,CAAC2B,YAAD,EAAuBC,UAAvB,KAA8C;AAC5C,QAAIC,KAAK,GAAGF,YAAZ;AACA,QAAIG,GAAG,GAAGF,UAAV;;AACA,QAAIC,KAAK,KAAKC,GAAd,EAAmB;AACjB,UAAIA,GAAG,GAAGnB,cAAV,EAA0B;AACxBmB,QAAAA,GAAG,IAAI,CAAP;AACD,OAFD,MAEO;AACLD,QAAAA,KAAK,IAAI,CAAT;AACD;AACF;;AAEDP,IAAAA,YAAY,CAACO,KAAD,CAAZ;AACAN,IAAAA,UAAU,CAACO,GAAD,CAAV;AACAZ,IAAAA,QAAQ,CAAC;AAAEJ,MAAAA,SAAS,EAAEe,KAAb;AAAoBb,MAAAA,OAAO,EAAEc;AAA7B,KAAD,CAAR;AACD,GAf2B,EAgB5B,CAACR,YAAD,EAAeC,UAAf,EAA2BL,QAA3B,CAhB4B,CAA9B;AAmBA,MAAMa,qBAAqB,GAAG/B,WAAW,CACtC2B,YAAD,IAA0B;AACxBD,IAAAA,UAAU,CAACC,YAAD,EAAeX,OAAf,CAAV;AACD,GAHsC,EAIvC,CAACU,UAAD,EAAaV,OAAb,CAJuC,CAAzC;AAOA,MAAMgB,mBAAmB,GAAGhC,WAAW,CACpC4B,UAAD,IAAwB;AACtBF,IAAAA,UAAU,CAACZ,SAAD,EAAYc,UAAZ,CAAV;AACD,GAHoC,EAIrC,CAACF,UAAD,EAAaZ,SAAb,CAJqC,CAAvC;AAOA,sBACE;AAAK,IAAA,SAAS,EAAC,aAAf;AAA6B,mBAAaO;AAA1C,kBACE,oBAAC,QAAD;AACE,IAAA,SAAS,EAAEP,SADb;AAEE,IAAA,OAAO,EAAEE,OAFX;AAGE,IAAA,iBAAiB,EAAEe,qBAHrB;AAIE,IAAA,eAAe,EAAEC,mBAJnB;AAKE,IAAA,eAAe,EAAEb,eALnB;AAME,IAAA,aAAa,EAAEC;AANjB,IADF,eASE;AAAK,IAAA,SAAS,EAAC,OAAf;AAAuB,IAAA,GAAG,EAAEI;AAA5B,kBACE,oBAAC,UAAD;AAAY,IAAA,SAAS,EAAEV,SAAvB;AAAkC,IAAA,OAAO,EAAEE;AAA3C,IADF,eAEE;AAAK,IAAA,SAAS,EAAC;AAAf,KACGiB,KAAK,CAAC,EAAD,CAAL,CACEC,IADF,CACO,IADP,EAEEC,GAFF,CAEM,CAACC,KAAD,EAAQC,KAAR,kBACH;AAAK,IAAA,SAAS,EAAC,MAAf;AAAsB,IAAA,GAAG,EAAEA;AAA3B,IAHH,CADH,CAFF,eASE,oBAAC,MAAD;AACE,IAAA,KAAK,EAAEb,KADT;AAEE,IAAA,IAAI,EAAEV,SAFR;AAGE,IAAA,OAAO,EAAEiB;AAHX,IATF,eAcE,oBAAC,MAAD;AAAQ,IAAA,KAAK,EAAEP,KAAf;AAAsB,IAAA,IAAI,EAAER,OAA5B;AAAqC,IAAA,OAAO,EAAEgB;AAA9C,IAdF,CATF,eA0BE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AAAK,IAAA,SAAS,EAAC;AAAf,YADF,eAEE;AAAK,IAAA,SAAS,EAAC;AAAf,KACGC,KAAK,CAAC,EAAD,CAAL,CACEC,IADF,CACO,IADP,EAEEC,GAFF,CAEM,CAACC,KAAD,EAAQC,KAAR,kBACH;AAAK,IAAA,SAAS,EAAC,YAAf;AAA4B,IAAA,GAAG,EAAEA;AAAjC,eAA4CA,KAAK,GAAG,CAApD,SAHH,CADH,CAFF,CA1BF,CADF;AAuCD,CA9FD;;AA0GA,IAAMC,QAAQ,GAAIC,KAAD,IAAuC;AACtD,MAAM;AACJzB,IAAAA,SADI;AAEJE,IAAAA,OAFI;AAGJwB,IAAAA,iBAHI;AAIJC,IAAAA,eAJI;AAKJtB,IAAAA,eALI;AAMJC,IAAAA,aANI;AAOJ,mBAAeC;AAPX,MAQFkB,KARJ;AAUA,MAAM,CAACG,SAAD,EAAYC,YAAZ,IAA4BxC,QAAQ,CACxCW,SAAS,GAAGE,OAAZ,GAAsBA,OAAtB,GAAgCF,SADQ,CAA1C;AAGA,MAAM,CAAC8B,UAAD,EAAaC,aAAb,IAA8B1C,QAAQ,CAC1CW,SAAS,GAAGE,OAAZ,GAAsBF,SAAtB,GAAkCE,OADQ,CAA5C;AAIAZ,EAAAA,SAAS,CACP,SAASqB,uBAAT,GAAmC;AACjCkB,IAAAA,YAAY,CAAC7B,SAAS,GAAGE,OAAZ,GAAsBA,OAAtB,GAAgCF,SAAjC,CAAZ;AACA+B,IAAAA,aAAa,CAAC/B,SAAS,GAAGE,OAAZ,GAAsBF,SAAtB,GAAkCE,OAAnC,CAAb;AACD,GAJM,EAKP,CAACF,SAAD,EAAYE,OAAZ,CALO,CAAT;;AAQA,WAAS8B,iBAAT,CAA2BV,KAA3B,EAA0C;AACxC,QAAItB,SAAS,IAAIE,OAAjB,EAA0B;AACxBwB,MAAAA,iBAAiB,CAACJ,KAAD,CAAjB;AACD,KAFD,MAEO;AACLK,MAAAA,eAAe,CAACL,KAAD,CAAf;AACD;AACF;;AAED,WAASW,kBAAT,CAA4BX,KAA5B,EAA2C;AACzC,QAAItB,SAAS,IAAIE,OAAjB,EAA0B;AACxByB,MAAAA,eAAe,CAACL,KAAD,CAAf;AACD,KAFD,MAEO;AACLI,MAAAA,iBAAiB,CAACJ,KAAD,CAAjB;AACD;AACF;;AAED,sBACE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AACE,IAAA,SAAS,EAAC,MADZ;AAEE,IAAA,KAAK,EAAE;AACLY,MAAAA,SAAS,iBAAWN,SAAS,GAAG/B,cAAb,GAA+B,GAAzC,iBACPD,aAAa,GAAG,CADT;AADJ;AAFT,IADF,eASE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AACE,IAAA,SAAS,EAAEL,UAAU,CAAC;AACpB4C,MAAAA,QAAQ,EAAEnC,SAAS,GAAGE,OAAZ,GAAsBG,eAAtB,GAAwCC;AAD9B,KAAD;AADvB,KAKGN,SAAS,IAAIE,OAAb,GAAuB,YAAvB,GAAsC,UALzC,CADF,eAQE,oBAAC,SAAD;AACE,IAAA,kBAAkB,EAAE,KADtB;AAEE,IAAA,KAAK,EAAE0B,SAFT;AAGE,IAAA,QAAQ,EAAEI,iBAHZ;AAIE,mBAAazB,UAAU,aAAMA,UAAN,gBAA6B6B;AAJtD,IARF,CATF,eAwBE;AAAK,IAAA,SAAS,EAAC;AAAf,IAxBF,eAyBE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AACE,IAAA,SAAS,EAAE7C,UAAU,CAAC;AACpB4C,MAAAA,QAAQ,EAAEnC,SAAS,GAAGE,OAAZ,GAAsBG,eAAtB,GAAwCC;AAD9B,KAAD;AADvB,KAKGN,SAAS,GAAGE,OAAZ,GAAsB,YAAtB,GAAqC,UALxC,CADF,eAQE,oBAAC,SAAD;AACE,IAAA,kBAAkB,EAAE,KADtB;AAEE,IAAA,KAAK,EAAE4B,UAFT;AAGE,IAAA,QAAQ,EAAEG,kBAHZ;AAIE,mBAAa1B,UAAU,aAAMA,UAAN,gBAA6B6B;AAJtD,IARF,CAzBF,eAwCE;AACE,IAAA,SAAS,EAAC,MADZ;AAEE,IAAA,KAAK,EAAE;AACLF,MAAAA,SAAS,iBACN,CAACrC,cAAc,GAAGiC,UAAlB,IAAgCjC,cAAjC,GAAmD,GAD5C,iBAEFD,aAAa,GAAG,CAFd;AADJ;AAFT,IAxCF,CADF;AAmDD,CA7FD;;AAqGA;AACA;AACA;AACA,IAAMyC,UAAU,GAAIZ,KAAD,IAAyC;AAC1D,MAAM;AAAEzB,IAAAA,SAAF;AAAaE,IAAAA,OAAb;AAAsB,mBAAeK;AAArC,MAAoDkB,KAA1D;AACA,sBACE;AAAK,IAAA,SAAS,EAAC,aAAf;AAA6B,mBAAalB;AAA1C,KACGP,SAAS,GAAGE,OAAZ,iBACC,uDACE;AACE,IAAA,SAAS,EAAC,6BADZ;AAEE,IAAA,KAAK,EAAE;AAAEoC,MAAAA,SAAS,mBAAYpC,OAAO,GAAGL,cAAtB;AAAX;AAFT,IADF,eAKE;AACE,IAAA,SAAS,EAAC,2BADZ;AAEE,IAAA,KAAK,EAAE;AACLyC,MAAAA,SAAS,mBACP,CAACzC,cAAc,GAAGG,SAAlB,IAA+BH,cADxB;AADJ;AAFT,IALF,CAFJ,EAiBGG,SAAS,GAAGE,OAAZ,iBACC;AACE,IAAA,SAAS,EAAC,8BADZ;AAEE,IAAA,KAAK,EAAE;AACLoC,MAAAA,SAAS,uBACNtC,SAAS,GAAGH,cAAb,GAA+B,GADxB,uBAEI,CAACK,OAAO,GAAGF,SAAX,IAAwBH,cAF5B;AADJ;AAFT,IAlBJ,CADF;AA8BD,CAhCD;;AAyCA;AACA;AACA;AACA,IAAM0C,MAAM,GAAId,KAAD,IAAqC;AAClD,MAAM;AAAEf,IAAAA,KAAF;AAAS8B,IAAAA,IAAT;AAAeC,IAAAA,OAAf;AAAwB,mBAAelC;AAAvC,MAAsDkB,KAA5D;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;;AACE,MAAMa,SAAS,GAAGnD,OAAO,CAAC,MAAM;AAC9B,QAAMuD,QAAQ,GAAG,KAAK,EAAtB;AACA,QAAIC,YAAY,GAAGjD,WAAW,GAAG,CAAjC;;AACA,QAAI8C,IAAI,GAAGE,QAAX,EAAqB;AACnBC,MAAAA,YAAY,GAAIH,IAAI,GAAGE,QAAR,IAAqBhD,WAAW,GAAG,CAAnC,CAAf,CADmB,CACmC;AACvD,KAFD,MAEO,IAAI8C,IAAI,GAAG,KAAKE,QAAhB,EAA0B;AAC/BC,MAAAA,YAAY,GACVjD,WAAW,GAAG,CAAd,GACC,KAAKG,cAAc,GAAG,KAAK6C,QAA3B,CAAD,IACGF,IAAI,GAAG,KAAKE,QADf,KAEGhD,WAAW,GAAG,CAFjB,CAFF,CAD+B,CAKR;AACxB;;AACD,qCACG8C,IAAI,GAAG3C,cAAR,GAA0B,GAD5B,iBAEO8C,YAFP;AAGD,GAfwB,EAetB,CAACH,IAAD,CAfsB,CAAzB;AAiBA,MAAMI,uBAAuB,GAAG1D,WAAW,CACxC2D,OAAD,IAAqB;AACnB,QAAI,CAACnC,KAAK,CAACoC,OAAX,EAAoB;AAClB,aAAO,CAAP;AACD;;AACD,QAAMC,SAAS,GAAGrC,KAAK,CAACoC,OAAN,CAAcE,qBAAd,EAAlB;AACA,QAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAL,CAASN,OAAO,GAAGE,SAAS,CAACK,IAA7B,EAAmC,CAAnC,CAAjB,CALmB,CAMnB;;AACA,QAAMC,WAAW,GACfxD,cAAc,GAAGqD,IAAI,CAACI,GAAL,CAAS,CAAT,EAAYL,QAAQ,GAAGF,SAAS,CAACQ,KAAjC,CADnB,CAPmB,CASnB;;AACA,QAAMC,WAAW,GACf1D,oBAAoB,GAAGoD,IAAI,CAACO,KAAL,CAAWJ,WAAW,GAAGvD,oBAAzB,CADzB,CAVmB,CAYnB;;AACA,QAAM4D,QAAQ,GAAGR,IAAI,CAACI,GAAL,CAASzD,cAAT,EAAyB2D,WAAzB,CAAjB;AACA,WAAOE,QAAP;AACD,GAhBwC,EAiBzC,CAAChD,KAAD,CAjByC,CAA3C;AAoBA,MAAMiD,eAAe,GAAGzE,WAAW,CACjC,SAA6B;AAAA,QAA5B;AAAE2D,MAAAA;AAAF,KAA4B;AAC3BJ,IAAAA,OAAO,CAACG,uBAAuB,CAACC,OAAD,CAAxB,CAAP;AACD,GAHgC,EAIjC,CAACJ,OAAD,EAAUG,uBAAV,CAJiC,CAAnC;AAOA,MAAMgB,aAAa,GAAG1E,WAAW,CAC/B,SAA6B;AAAA,QAA5B;AAAE2D,MAAAA;AAAF,KAA4B;AAC3BJ,IAAAA,OAAO,CAACG,uBAAuB,CAACC,OAAD,CAAxB,CAAP;AAEAgB,IAAAA,MAAM,CAACC,mBAAP,CAA2B,WAA3B,EAAwCH,eAAxC;AACAE,IAAAA,MAAM,CAACC,mBAAP,CAA2B,SAA3B,EAAsCF,aAAtC;AACAG,IAAAA,QAAQ,CAACC,eAAT,CAAyBC,SAAzB,CAAmCC,MAAnC,CAA0C,0BAA1C;AACD,GAP8B,EAQ/B,CAACzB,OAAD,EAAUG,uBAAV,EAAmCe,eAAnC,CAR+B,CAAjC;AAWA,MAAMQ,kBAAkB,GAAGjF,WAAW,CAAC,MAAM;AAC3C2E,IAAAA,MAAM,CAACO,gBAAP,CAAwB,WAAxB,EAAqCT,eAArC;AACAE,IAAAA,MAAM,CAACO,gBAAP,CAAwB,SAAxB,EAAmCR,aAAnC;AACAG,IAAAA,QAAQ,CAACC,eAAT,CAAyBC,SAAzB,CAAmCI,GAAnC,CAAuC,0BAAvC;AACD,GAJqC,EAInC,CAACV,eAAD,EAAkBC,aAAlB,CAJmC,CAAtC;AAMA,MAAMU,iBAAiB,GAAGpF,WAAW,CAAC,MAAM;AAC1C2E,IAAAA,MAAM,CAACC,mBAAP,CAA2B,WAA3B,EAAwCH,eAAxC;AACAE,IAAAA,MAAM,CAACC,mBAAP,CAA2B,SAA3B,EAAsCF,aAAtC;AACAG,IAAAA,QAAQ,CAACC,eAAT,CAAyBC,SAAzB,CAAmCC,MAAnC,CAA0C,0BAA1C;AACD,GAJoC,EAIlC,CAACP,eAAD,EAAkBC,aAAlB,CAJkC,CAArC;AAMA,MAAMW,eAAe,GAAGrF,WAAW,CAAC,MAAM;AACxCiF,IAAAA,kBAAkB;AACnB,GAFkC,EAEhC,CAACA,kBAAD,CAFgC,CAAnC;AAIA7E,EAAAA,SAAS,CACP,SAASkF,wBAAT,GAAoC;AAClC,WAAO,MAAM;AACXF,MAAAA,iBAAiB;AAClB,KAFD;AAGD,GALM,EAMP,CAACA,iBAAD,CANO,CAAT;AASA,sBACE;AAAK,IAAA,SAAS,EAAC,cAAf;AAA8B,IAAA,KAAK,EAAE;AAAEhC,MAAAA;AAAF;AAArC,kBACE;AACE,IAAA,SAAS,EAAC,QADZ;AAEE,IAAA,IAAI,EAAC,QAFP;AAGE,kBAAW,aAHb;AAIE,IAAA,WAAW,EAAEiC,eAJf;AAKE,mBAAahE;AALf,IADF,CADF;AAWD,CArGD;;AAuGA,eAAeR,UAAf","sourcesContent":["/* eslint-disable react/no-array-index-key */\n// array maps being used are static, this is fine.\n\nimport React, {\n useCallback,\n useMemo,\n useRef,\n useState,\n useEffect,\n} from 'react';\nimport classNames from 'classnames';\nimport TimeInput from './TimeInput';\nimport StyleExports from './TimeSlider.module.scss';\nimport './TimeSlider.scss';\n\nconst HANDLE_SIZE = parseInt(StyleExports['handle-size'], 10);\nconst POPOVER_WIDTH = parseInt(StyleExports['popover-width'], 10);\nconst SECONDS_IN_DAY = 24 * 60 * 60 - 1; // Max is actually 23:59:59\nconst SNAP_NEAREST_MINUTES = 5 * 60; // rounds in 5 minute intervals\n\ntype TimeSliderProps = {\n startTime: number;\n endTime: number;\n onChange(value: { startTime: number; endTime: number }): void;\n isStartModified?: boolean;\n isEndModified?: boolean;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a time slider for setting a start and end time, that can also run overnight\n * @param {startTime, endTime, onChange} props takes times in seconds 0 - 86399 and a callback\n */\nconst TimeSlider = ({\n startTime: propStartTime,\n endTime: propEndTime,\n onChange,\n isStartModified = false,\n isEndModified = false,\n 'data-testid': dataTestId,\n}: TimeSliderProps): JSX.Element => {\n const [startTime, setStartTime] = useState(propStartTime);\n const [endTime, setEndTime] = useState(propEndTime);\n\n const track = useRef<HTMLDivElement>(null); // we need the track width while calulculating time from handle drag\n\n // updates state if props change\n useEffect(\n function setTimeOnPropTimeChange() {\n setStartTime(propStartTime);\n setEndTime(propEndTime);\n },\n [propStartTime, propEndTime]\n );\n\n const updateTime = useCallback(\n (newStartTime: number, newEndTime: number) => {\n let start = newStartTime;\n let end = newEndTime;\n if (start === end) {\n if (end < SECONDS_IN_DAY) {\n end += 1;\n } else {\n start -= 1;\n }\n }\n\n setStartTime(start);\n setEndTime(end);\n onChange({ startTime: start, endTime: end });\n },\n [setStartTime, setEndTime, onChange]\n );\n\n const handleStartTimeChange = useCallback(\n (newStartTime: number) => {\n updateTime(newStartTime, endTime);\n },\n [updateTime, endTime]\n );\n\n const handleEndTimeChange = useCallback(\n (newEndTime: number) => {\n updateTime(startTime, newEndTime);\n },\n [updateTime, startTime]\n );\n\n return (\n <div className=\"time-slider\" data-testid={dataTestId}>\n <PopOvers\n startTime={startTime}\n endTime={endTime}\n onStartTimeChange={handleStartTimeChange}\n onEndTimeChange={handleEndTimeChange}\n isStartModified={isStartModified}\n isEndModified={isEndModified}\n />\n <div className=\"track\" ref={track}>\n <TrackFills startTime={startTime} endTime={endTime} />\n <div className=\"ticks\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick\" key={index} />\n ))}\n </div>\n <Handle\n track={track}\n time={startTime}\n setTime={handleStartTimeChange}\n />\n <Handle track={track} time={endTime} setTime={handleEndTimeChange} />\n </div>\n\n <div className=\"tick-labels\">\n <div className=\"tick-label\">0:00</div>\n <div className=\"tick-label-wrapper\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick-label\" key={index}>{`${index + 1}:00`}</div>\n ))}\n </div>\n </div>\n </div>\n );\n};\n\ntype PopOversProps = {\n startTime: number;\n endTime: number;\n onStartTimeChange(time: number): void;\n onEndTimeChange(time: number): void;\n isStartModified: boolean;\n isEndModified: boolean;\n 'data-testid'?: string;\n};\n\nconst PopOvers = (props: PopOversProps): JSX.Element => {\n const {\n startTime,\n endTime,\n onStartTimeChange,\n onEndTimeChange,\n isStartModified,\n isEndModified,\n 'data-testid': dataTestId,\n } = props;\n\n const [firstTime, setFirstTime] = useState(\n startTime > endTime ? endTime : startTime\n );\n const [secondTime, setSecondTime] = useState(\n startTime > endTime ? startTime : endTime\n );\n\n useEffect(\n function setTimeOnPropTimeChange() {\n setFirstTime(startTime > endTime ? endTime : startTime);\n setSecondTime(startTime > endTime ? startTime : endTime);\n },\n [startTime, endTime]\n );\n\n function onFirstTimeChange(value: number) {\n if (startTime <= endTime) {\n onStartTimeChange(value);\n } else {\n onEndTimeChange(value);\n }\n }\n\n function onSecondTimeChange(value: number) {\n if (startTime <= endTime) {\n onEndTimeChange(value);\n } else {\n onStartTimeChange(value);\n }\n }\n\n return (\n <div className=\"time-slider-popovers\">\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${(firstTime / SECONDS_IN_DAY) * 100}% - ${\n POPOVER_WIDTH / 2\n }px)`,\n }}\n />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: startTime < endTime ? isStartModified : isEndModified,\n })}\n >\n {startTime <= endTime ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n allowValueWrapping={false}\n value={firstTime}\n onChange={onFirstTimeChange}\n data-testid={dataTestId ? `${dataTestId}-input-1` : undefined}\n />\n </div>\n <div className=\"flex-spacer\" />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: startTime > endTime ? isStartModified : isEndModified,\n })}\n >\n {startTime > endTime ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n allowValueWrapping={false}\n value={secondTime}\n onChange={onSecondTimeChange}\n data-testid={dataTestId ? `${dataTestId}-input-2` : undefined}\n />\n </div>\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${\n ((SECONDS_IN_DAY - secondTime) / SECONDS_IN_DAY) * 100\n }% - ${POPOVER_WIDTH / 2}px)`,\n }}\n />\n </div>\n );\n};\n\ntype TrackFillsProps = {\n startTime: number;\n endTime: number;\n 'data-testid'?: string;\n};\n\n/**\n * Shades the area between or outside of handles according to if start or endtime is greater.\n */\nconst TrackFills = (props: TrackFillsProps): JSX.Element => {\n const { startTime, endTime, 'data-testid': dataTestId } = props;\n return (\n <div className=\"track-fills\" data-testid={dataTestId}>\n {startTime > endTime && (\n <>\n <div\n className=\"track-fill track-fill-start\"\n style={{ transform: `scaleX(${endTime / SECONDS_IN_DAY})` }}\n />\n <div\n className=\"track-fill track-fill-end\"\n style={{\n transform: `scaleX(${\n (SECONDS_IN_DAY - startTime) / SECONDS_IN_DAY\n })`,\n }}\n />\n </>\n )}\n {startTime < endTime && (\n <div\n className=\"track-fill track-fill-middle\"\n style={{\n transform: `translateX(${\n (startTime / SECONDS_IN_DAY) * 100\n }%) scaleX(${(endTime - startTime) / SECONDS_IN_DAY})`,\n }}\n />\n )}\n </div>\n );\n};\n\ntype HandleProps = {\n track: React.RefObject<HTMLDivElement>;\n time: number;\n setTime(time: number): void;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a draggable handle the sets the time\n */\nconst Handle = (props: HandleProps): JSX.Element => {\n const { track, time, setTime, 'data-testid': dataTestId } = props;\n\n /**\n * Takes the time and generate our translation string taking into account handle offset.\n * The handle offset changes for the first and last tick range dynmaically. Normally,\n * the center of the handle (size/2) is the selection origin, but at edges, it becomes either\n * end of the handle, requireing a relative offset range of 0 - 0.5, and 0.5 - 1 of handle size.\n * @param {number} t time in seconds\n */\n const transform = useMemo(() => {\n const ONE_HOUR = 60 * 60;\n let handleOffset = HANDLE_SIZE / 2;\n if (time < ONE_HOUR) {\n handleOffset = (time / ONE_HOUR) * (HANDLE_SIZE / 2); // 0 - 0.5 Handle size\n } else if (time > 23 * ONE_HOUR) {\n handleOffset =\n HANDLE_SIZE / 2 +\n (1 / (SECONDS_IN_DAY - 23 * ONE_HOUR)) *\n (time - 23 * ONE_HOUR) *\n (HANDLE_SIZE / 2); // 0.5 - 1 Handle size\n }\n return `translateX(calc(${\n (time / SECONDS_IN_DAY) * 100\n }% - ${handleOffset}px))`;\n }, [time]);\n\n const calculatePositionAsTime = useCallback(\n (clientX: number) => {\n if (!track.current) {\n return 0;\n }\n const trackRect = track.current.getBoundingClientRect();\n const leftEdge = Math.max(clientX - trackRect.left, 0);\n // get position as 0-1 on slider and mulitply by seconds in a day to convert to time\n const preciseTime =\n SECONDS_IN_DAY * Math.min(1, leftEdge / trackRect.width);\n // snap to nearest N(5) minute interval\n const roundedTime =\n SNAP_NEAREST_MINUTES * Math.round(preciseTime / SNAP_NEAREST_MINUTES);\n // prevent over-rounding to 24:00:00\n const limitMax = Math.min(SECONDS_IN_DAY, roundedTime);\n return limitMax;\n },\n [track]\n );\n\n const handleMouseMove = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n },\n [setTime, calculatePositionAsTime]\n );\n\n const handleMouseUp = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n },\n [setTime, calculatePositionAsTime, handleMouseMove]\n );\n\n const startDragListening = useCallback(() => {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.add('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const stopDragListening = useCallback(() => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const handleMouseDown = useCallback(() => {\n startDragListening();\n }, [startDragListening]);\n\n useEffect(\n function removeListenersOnUnmount() {\n return () => {\n stopDragListening();\n };\n },\n [stopDragListening]\n );\n\n return (\n <div className=\"handle-track\" style={{ transform }}>\n <button\n className=\"handle\"\n type=\"button\"\n aria-label=\"Change time\"\n onMouseDown={handleMouseDown}\n data-testid={dataTestId}\n />\n </div>\n );\n};\n\nexport default TimeSlider;\n"],"file":"TimeSlider.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stack.d.ts","sourceRoot":"","sources":["../../src/navigation/Stack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAIzE,OAAO,cAAc,CAAC;AAEtB,oBAAY,UAAU,GAAG;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,KAAK,6CAGf,UAAU,KAAG,
|
|
1
|
+
{"version":3,"file":"Stack.d.ts","sourceRoot":"","sources":["../../src/navigation/Stack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAIzE,OAAO,cAAc,CAAC;AAEtB,oBAAY,UAAU,GAAG;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,KAAK,6CAGf,UAAU,KAAG,WAyFf,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
package/dist/navigation/Stack.js
CHANGED
|
@@ -28,7 +28,7 @@ export var Stack = _ref => {
|
|
|
28
28
|
* Completion of the animation is handled in `pushComplete` or `popComplete`, and then the stack is in an idle state again.
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
|
-
useEffect(()
|
|
31
|
+
useEffect(function initAnimation() {
|
|
32
32
|
if (prevChildrenArray === undefined || childrenArray === prevChildrenArray) {
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/navigation/Stack.tsx"],"names":["React","useState","useEffect","useMemo","useCallback","CSSTransition","usePrevious","ThemeExport","Stack","children","dataTestId","childrenArray","Children","toArray","prevChildrenArray","mainView","setMainView","length","pushingView","setPushingView","poppingView","setPoppingView","undefined","topChild","pushComplete","popComplete","transitionMidMs"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,QAAhB,EAA0BC,SAA1B,EAAqCC,OAArC,EAA8CC,WAA9C,QAAiE,OAAjE;AACA,SAASC,aAAT,QAA8B,wBAA9B;AACA,SAASC,WAAT,QAA4B,wBAA5B;OACOC,W;;;AAQP;AACA;AACA;AACA;AACA,OAAO,IAAMC,KAAK,GAAG,QAGU;AAAA,MAHT;AACpBC,IAAAA,QADoB;AAEpB,mBAAeC;AAFK,GAGS;AAC7B,MAAMC,aAAa,GAAGR,OAAO,CAAC,MAAMH,KAAK,CAACY,QAAN,CAAeC,OAAf,CAAuBJ,QAAvB,CAAP,EAAyC,CACpEA,QADoE,CAAzC,CAA7B;AAGA,MAAMK,iBAAiB,GAAGR,WAAW,CAACK,aAAD,CAArC;AACA,MAAM,CAACI,QAAD,EAAWC,WAAX,IAA0Bf,QAAQ,CACtCU,aAAa,CAACA,aAAa,CAACM,MAAd,GAAuB,CAAxB,CADyB,CAAxC;AAIA,MAAM,CAACC,WAAD,EAAcC,cAAd,IAAgClB,QAAQ,CAAkB,IAAlB,CAA9C;AACA,MAAM,CAACmB,WAAD,EAAcC,cAAd,IAAgCpB,QAAQ,CAAkB,IAAlB,CAA9C;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACEC,EAAAA,SAAS,
|
|
1
|
+
{"version":3,"sources":["../../src/navigation/Stack.tsx"],"names":["React","useState","useEffect","useMemo","useCallback","CSSTransition","usePrevious","ThemeExport","Stack","children","dataTestId","childrenArray","Children","toArray","prevChildrenArray","mainView","setMainView","length","pushingView","setPushingView","poppingView","setPoppingView","initAnimation","undefined","topChild","pushComplete","popComplete","transitionMidMs"],"mappings":"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","sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport { usePrevious } from '@deephaven/react-hooks';\nimport ThemeExport from '../ThemeExport';\nimport './Stack.scss';\n\nexport type StackProps = {\n children: React.ReactNode | React.ReactNode[];\n 'data-testid'?: string;\n};\n\n/**\n * Pass a full navigation stack of children, and then automatically does a sliding animation when the stack changes.\n * Adding items to the stack will do a \"push\" animation, and removing items from the stack will do a \"pop\" animation.\n */\nexport const Stack = ({\n children,\n 'data-testid': dataTestId,\n}: StackProps): JSX.Element => {\n const childrenArray = useMemo(() => React.Children.toArray(children), [\n children,\n ]);\n const prevChildrenArray = usePrevious(childrenArray);\n const [mainView, setMainView] = useState<React.ReactNode>(\n childrenArray[childrenArray.length - 1]\n );\n\n const [pushingView, setPushingView] = useState<React.ReactNode>(null);\n const [poppingView, setPoppingView] = useState<React.ReactNode>(null);\n\n /**\n * To do the animation effect, we just need to set the proper pushing/popping views when the stack changes.\n * `mainView` - The main view of the stack, stationary, filling the container.\n * `pushingView` - A view that's currently being pushed. Slides from off screen right to overtop of `mainView`.\n * `poppingView` - A view that's currently being popped. Slides from overtop of `mainView` to right off screen.\n *\n * When the `pushingView` or `poppingView` is set, that will kick off their animation.\n * Completion of the animation is handled in `pushComplete` or `popComplete`, and then the stack is in an idle state again.\n */\n useEffect(\n function initAnimation() {\n if (\n prevChildrenArray === undefined ||\n childrenArray === prevChildrenArray\n ) {\n return;\n }\n const topChild = childrenArray[childrenArray.length - 1];\n if (\n childrenArray.length === prevChildrenArray.length ||\n prevChildrenArray.length === 0 ||\n pushingView !== null ||\n poppingView !== null\n ) {\n // 1) Stack is the same size, we've just mounted, or we're already in an animation - just update the view\n if (pushingView !== null && topChild !== pushingView) {\n // Stack was updated mid animation\n setPushingView(topChild);\n } else if (topChild !== poppingView && topChild !== mainView) {\n // Replace the current view\n setMainView(topChild);\n }\n } else if (childrenArray.length > prevChildrenArray.length) {\n // 2) Stack has grown - start the push animation\n setPushingView(topChild);\n } else if (childrenArray.length < prevChildrenArray.length) {\n // 3) Stack has shrunk - start the pop animation\n setMainView(topChild);\n setPoppingView(prevChildrenArray[prevChildrenArray.length - 1]);\n }\n },\n [childrenArray, prevChildrenArray, pushingView, poppingView, mainView]\n );\n\n const pushComplete = useCallback(() => {\n setMainView(pushingView);\n setPushingView(null);\n }, [pushingView]);\n\n const popComplete = useCallback(() => {\n setPoppingView(null);\n }, []);\n\n return (\n <div className=\"navigation-stack\">\n <div className=\"main-view\" data-testid={dataTestId}>\n {mainView}\n </div>\n\n <CSSTransition\n in={poppingView != null}\n timeout={ThemeExport.transitionMidMs}\n classNames=\"slide-right\"\n onEntered={popComplete}\n >\n <>{poppingView && <div className=\"popping-view\">{poppingView}</div>}</>\n </CSSTransition>\n <CSSTransition\n in={pushingView != null}\n timeout={ThemeExport.transitionMidMs}\n classNames=\"slide-left\"\n onEntered={pushComplete}\n >\n <>{pushingView && <div className=\"pushing-view\">{pushingView}</div>}</>\n </CSSTransition>\n </div>\n );\n};\n\nexport default Stack;\n"],"file":"Stack.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/components",
|
|
3
|
-
"version": "0.11.10-beta.
|
|
3
|
+
"version": "0.11.10-beta.1+981349f",
|
|
4
4
|
"description": "Deephaven React component library",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"start": "cross-env NODE_ENV=development npm run watch"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@deephaven/icons": "^0.11.10-beta.
|
|
34
|
-
"@deephaven/react-hooks": "^0.11.10-beta.
|
|
35
|
-
"@deephaven/utils": "^0.11.10-beta.
|
|
33
|
+
"@deephaven/icons": "^0.11.10-beta.1+981349f",
|
|
34
|
+
"@deephaven/react-hooks": "^0.11.10-beta.1+981349f",
|
|
35
|
+
"@deephaven/utils": "^0.11.10-beta.1+981349f",
|
|
36
36
|
"@fortawesome/fontawesome-svg-core": "1.2.36",
|
|
37
37
|
"@fortawesome/react-fontawesome": "^0.1.15",
|
|
38
38
|
"bootstrap": "4.6.1",
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"react-dom": "^17.x"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
-
"@deephaven/log": "^0.11.10-beta.
|
|
61
|
-
"@deephaven/mocks": "^0.11.10-beta.
|
|
62
|
-
"@deephaven/tsconfig": "^0.11.10-beta.
|
|
60
|
+
"@deephaven/log": "^0.11.10-beta.1+981349f",
|
|
61
|
+
"@deephaven/mocks": "^0.11.10-beta.1+981349f",
|
|
62
|
+
"@deephaven/tsconfig": "^0.11.10-beta.1+981349f"
|
|
63
63
|
},
|
|
64
64
|
"files": [
|
|
65
65
|
"dist",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"publishConfig": {
|
|
72
72
|
"access": "public"
|
|
73
73
|
},
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "981349fbbde1dcacd9a5f4ac1386d08c2c3da371"
|
|
75
75
|
}
|