@deephaven/components 0.19.2-beta.0 → 0.19.2-beta.5
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/AutoCompleteInput.d.ts.map +1 -1
- package/dist/AutoCompleteInput.js +7 -11
- package/dist/AutoCompleteInput.js.map +1 -1
- package/dist/BasicModal.d.ts.map +1 -1
- package/dist/BasicModal.js +5 -7
- package/dist/BasicModal.js.map +1 -1
- package/dist/Button.d.ts +9 -3
- package/dist/Button.d.ts.map +1 -1
- package/dist/Button.js +18 -10
- package/dist/Button.js.map +1 -1
- package/dist/CardFlip.js +1 -1
- package/dist/CardFlip.js.map +1 -1
- package/dist/Collapse.js +2 -2
- package/dist/Collapse.js.map +1 -1
- package/dist/ComboBox.d.ts.map +1 -1
- package/dist/ComboBox.js +11 -15
- package/dist/ComboBox.js.map +1 -1
- package/dist/CustomTimeSelect.js +2 -2
- package/dist/CustomTimeSelect.js.map +1 -1
- package/dist/DraggableItemList.d.ts +1 -1
- package/dist/DraggableItemList.d.ts.map +1 -1
- package/dist/DraggableItemList.js +10 -7
- package/dist/DraggableItemList.js.map +1 -1
- package/dist/HierarchicalCheckboxMenu.d.ts.map +1 -1
- package/dist/HierarchicalCheckboxMenu.js +9 -6
- package/dist/HierarchicalCheckboxMenu.js.map +1 -1
- package/dist/ItemList.js +19 -17
- package/dist/ItemList.js.map +1 -1
- package/dist/LoadingOverlay.js +1 -1
- package/dist/LoadingOverlay.js.map +1 -1
- package/dist/MaskedInput.js +3 -1
- package/dist/MaskedInput.js.map +1 -1
- package/dist/RadioGroup.js +12 -8
- package/dist/RadioGroup.js.map +1 -1
- package/dist/SocketedButton.d.ts.map +1 -1
- package/dist/SocketedButton.js +1 -1
- package/dist/SocketedButton.js.map +1 -1
- package/dist/TimeSlider.d.ts.map +1 -1
- package/dist/TimeSlider.js +2 -2
- package/dist/TimeSlider.js.map +1 -1
- package/dist/ValidateLabelInput.d.ts.map +1 -1
- package/dist/ValidateLabelInput.js +2 -2
- package/dist/ValidateLabelInput.js.map +1 -1
- package/dist/context-actions/ContextActionUtils.d.ts +3 -3
- package/dist/context-actions/ContextActionUtils.js +14 -8
- package/dist/context-actions/ContextActionUtils.js.map +1 -1
- package/dist/context-actions/ContextActions.d.ts.map +1 -1
- package/dist/context-actions/ContextActions.js +9 -16
- package/dist/context-actions/ContextActions.js.map +1 -1
- package/dist/context-actions/ContextMenu.d.ts.map +1 -1
- package/dist/context-actions/ContextMenu.js +11 -13
- package/dist/context-actions/ContextMenu.js.map +1 -1
- package/dist/context-actions/ContextMenuItem.d.ts.map +1 -1
- package/dist/context-actions/ContextMenuItem.js +8 -6
- package/dist/context-actions/ContextMenuItem.js.map +1 -1
- package/dist/context-actions/GlobalContextAction.d.ts.map +1 -1
- package/dist/context-actions/GlobalContextAction.js +7 -12
- package/dist/context-actions/GlobalContextAction.js.map +1 -1
- package/dist/context-actions/GlobalContextActions.js +1 -1
- package/dist/context-actions/GlobalContextActions.js.map +1 -1
- package/dist/menu-actions/DropdownMenu.js +1 -1
- package/dist/menu-actions/DropdownMenu.js.map +1 -1
- package/dist/menu-actions/Menu.d.ts.map +1 -1
- package/dist/menu-actions/Menu.js +3 -3
- package/dist/menu-actions/Menu.js.map +1 -1
- package/dist/navigation/MenuItem.js +2 -2
- package/dist/navigation/MenuItem.js.map +1 -1
- package/dist/navigation/Stack.d.ts.map +1 -1
- package/dist/navigation/Stack.js +2 -2
- package/dist/navigation/Stack.js.map +1 -1
- package/dist/popper/Tooltip.js +1 -1
- package/dist/popper/Tooltip.js.map +1 -1
- package/package.json +8 -8
- package/scss/BaseStyleSheet.scss +5 -0
package/dist/MaskedInput.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaskedInput.js","names":["React","useMemo","useEffect","useCallback","classNames","Log","useForwardedRef","log","module","SELECTION_DIRECTION","FORWARD","BACKWARD","NONE","FIXED_WIDTH_SPACE","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","value","replaceIndex","newChar","substring","fillToLength","checkValue","exampleValue","length","trimTrailingMask","emptyMask","i","MaskedInput","forwardRef","props","ref","className","example","getNextSegmentValue","range","delta","segmentValue","getPreferredReplacementString","onChange","onSelect","pattern","placeholder","selection","onFocus","onBlur","dataTestId","input","examples","Array","isArray","replace","setSelectedSegment","debug","selectionStart","selectionEnd","selectionDirection","current","setSelectionRange","getSegment","cursorPosition","testValue","test","charAt","fillValue","filledValue","concat","isValid","patternRegex","RegExp","nextSegment","position","currentSegment","nextPosition","previousSegment","previousPosition","nextSegmentValue","segment","newSegmentValue","newValue","handleSelect","event","target","error","debug2","nativeEvent","type","newSelection","handleSelectCapture","preventDefault","stopPropagation","handleArrowKey","key","handleKeyDown","startsWith","trimmedValue","altKey","metaKey","ctrlKey","newChars","from","Set","toUpperCase","toLowerCase","maxReplaceIndex","newSelectionStart","nextSegmentSelection","undefined","defaultProps"],"sources":["../src/MaskedInput.tsx"],"sourcesContent":["import React, { useMemo, useEffect, useCallback } 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\n/**\n * Fill the string on the right side with the example value to the given length\n * @param checkValue Initial string to pad\n * @param exampleValue Example value\n * @param length Target length\n * @returns String padded with the given example value\n */\nexport function fillToLength(\n checkValue: string,\n exampleValue: string,\n length: number\n): string {\n return checkValue.length < length\n ? `${checkValue}${exampleValue.substring(checkValue.length, length)}`\n : checkValue;\n}\n\n/**\n * Trim all characters matching the empty mask on the right side of the given value\n * @param value String to trim\n * @param emptyMask Empty mask\n * @returns Trimmed string\n */\nexport function trimTrailingMask(value: string, emptyMask: string): string {\n let { length } = value;\n for (let i = value.length - 1; i >= 0; i -= 1) {\n if (emptyMask[i] === value[i]) {\n length = i;\n } else {\n break;\n }\n }\n return value.substring(0, length);\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 /** Input placeholder */\n placeholder?: 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 placeholder,\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 const emptyMask = useMemo(\n () => examples[0].replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE),\n [examples]\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 const getSegment = useCallback(\n (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 [examples, value]\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 const handleSelect = useCallback(\n (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 (\n selection != null &&\n selectionStart === value.length &&\n selectionEnd === value.length &&\n event.nativeEvent.type !== 'mouseup'\n ) {\n // React triggers onSelect event with the cursor at the end of the input content\n // when the component is rendered at a different location in the DOM,\n // i.e. when start/end times switch places in the TimeSlider.\n // Ignore this event and reset the selection to its previous state.\n onSelect({ ...selection });\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 [getSegment, onSelect, selection, value]\n );\n\n const handleSelectCapture = useCallback(\n (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 [input, selection, value]\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 // Deleting at the end of the value\n if (selectionEnd >= trimTrailingMask(value, emptyMask).length) {\n const newValue = value.substring(\n 0,\n // Delete whole selection or just the char before the cursor\n selectionStart === selectionEnd\n ? selectionStart - 1\n : selectionStart\n );\n const trimmedValue = trimTrailingMask(newValue, emptyMask);\n if (trimmedValue !== value) {\n onChange(trimmedValue);\n onSelect({\n selectionStart: trimmedValue.length,\n selectionEnd: trimmedValue.length,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n }\n return;\n }\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 ? examples[0].length - 1\n : selectionStart;\n for (\n let replaceIndex = selectionStart;\n replaceIndex <= maxReplaceIndex;\n replaceIndex += 1\n ) {\n // Fill with the example chars if necessary\n const filledValue = fillToLength(\n value,\n examples[0],\n replaceIndex + 1\n );\n const newValue = getPreferredReplacementString(\n filledValue,\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 placeholder={placeholder}\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 placeholder: undefined,\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MaskedInput.js","names":["React","useMemo","useEffect","useCallback","classNames","Log","useForwardedRef","log","module","SELECTION_DIRECTION","FORWARD","BACKWARD","NONE","FIXED_WIDTH_SPACE","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","value","replaceIndex","newChar","substring","fillToLength","checkValue","exampleValue","length","trimTrailingMask","emptyMask","i","MaskedInput","forwardRef","props","ref","className","example","getNextSegmentValue","range","delta","segmentValue","getPreferredReplacementString","onChange","onSelect","pattern","placeholder","selection","onFocus","onBlur","dataTestId","input","examples","Array","isArray","replace","setSelectedSegment","debug","selectionStart","selectionEnd","selectionDirection","current","setSelectionRange","getSegment","cursorPosition","testValue","test","charAt","fillValue","filledValue","concat","isValid","patternRegex","RegExp","nextSegment","position","currentSegment","nextPosition","previousSegment","previousPosition","nextSegmentValue","segment","newSegmentValue","newValue","handleSelect","event","target","error","debug2","nativeEvent","type","newSelection","handleSelectCapture","preventDefault","stopPropagation","handleArrowKey","key","handleKeyDown","startsWith","trimmedValue","altKey","metaKey","ctrlKey","newChars","from","Set","toUpperCase","toLowerCase","maxReplaceIndex","newSelectionStart","nextSegmentSelection","undefined","defaultProps"],"sources":["../src/MaskedInput.tsx"],"sourcesContent":["import React, { useMemo, useEffect, useCallback } 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\n/**\n * Fill the string on the right side with the example value to the given length\n * @param checkValue Initial string to pad\n * @param exampleValue Example value\n * @param length Target length\n * @returns String padded with the given example value\n */\nexport function fillToLength(\n checkValue: string,\n exampleValue: string,\n length: number\n): string {\n return checkValue.length < length\n ? `${checkValue}${exampleValue.substring(checkValue.length, length)}`\n : checkValue;\n}\n\n/**\n * Trim all characters matching the empty mask on the right side of the given value\n * @param value String to trim\n * @param emptyMask Empty mask\n * @returns Trimmed string\n */\nexport function trimTrailingMask(value: string, emptyMask: string): string {\n let { length } = value;\n for (let i = value.length - 1; i >= 0; i -= 1) {\n if (emptyMask[i] === value[i]) {\n length = i;\n } else {\n break;\n }\n }\n return value.substring(0, length);\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 /** Input placeholder */\n placeholder?: 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 placeholder,\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 const emptyMask = useMemo(\n () => examples[0].replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE),\n [examples]\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 const getSegment = useCallback(\n (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 [examples, value]\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 const handleSelect = useCallback(\n (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 (\n selection != null &&\n selectionStart === value.length &&\n selectionEnd === value.length &&\n event.nativeEvent.type !== 'mouseup'\n ) {\n // React triggers onSelect event with the cursor at the end of the input content\n // when the component is rendered at a different location in the DOM,\n // i.e. when start/end times switch places in the TimeSlider.\n // Ignore this event and reset the selection to its previous state.\n onSelect({ ...selection });\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 [getSegment, onSelect, selection, value]\n );\n\n const handleSelectCapture = useCallback(\n (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 [input, selection, value]\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 // Deleting at the end of the value\n if (selectionEnd >= trimTrailingMask(value, emptyMask).length) {\n const newValue = value.substring(\n 0,\n // Delete whole selection or just the char before the cursor\n selectionStart === selectionEnd\n ? selectionStart - 1\n : selectionStart\n );\n const trimmedValue = trimTrailingMask(newValue, emptyMask);\n if (trimmedValue !== value) {\n onChange(trimmedValue);\n onSelect({\n selectionStart: trimmedValue.length,\n selectionEnd: trimmedValue.length,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n }\n return;\n }\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 ? examples[0].length - 1\n : selectionStart;\n for (\n let replaceIndex = selectionStart;\n replaceIndex <= maxReplaceIndex;\n replaceIndex += 1\n ) {\n // Fill with the example chars if necessary\n const filledValue = fillToLength(\n value,\n examples[0],\n replaceIndex + 1\n );\n const newValue = getPreferredReplacementString(\n filledValue,\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 placeholder={placeholder}\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 placeholder: undefined,\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"],"mappings":"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"}
|
package/dist/RadioGroup.js
CHANGED
|
@@ -17,15 +17,19 @@ var RadioGroup = props => {
|
|
|
17
17
|
value = '',
|
|
18
18
|
'data-testid': dataTestId
|
|
19
19
|
} = props;
|
|
20
|
-
var [name] = useState(propsName
|
|
20
|
+
var [name] = useState(propsName !== null && propsName !== void 0 ? propsName : shortid()); // Need to use "text" type so we can apply a pattern and make selection properly
|
|
21
21
|
|
|
22
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, React.Children.map(children, child =>
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, React.Children.map(children, child => {
|
|
23
|
+
var _child$props$onChange, _child$props$disabled;
|
|
24
|
+
|
|
25
|
+
return child ? /*#__PURE__*/React.cloneElement(child, {
|
|
26
|
+
name,
|
|
27
|
+
onChange: (_child$props$onChange = child.props.onChange) !== null && _child$props$onChange !== void 0 ? _child$props$onChange : onChange,
|
|
28
|
+
checked: value === child.props.value,
|
|
29
|
+
disabled: (_child$props$disabled = child.props.disabled) !== null && _child$props$disabled !== void 0 ? _child$props$disabled : disabled,
|
|
30
|
+
'data-testid': dataTestId
|
|
31
|
+
}) : null;
|
|
32
|
+
}));
|
|
29
33
|
};
|
|
30
34
|
|
|
31
35
|
export default RadioGroup;
|
package/dist/RadioGroup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RadioGroup.js","names":["React","useState","shortid","RadioGroup","props","children","disabled","name","propsName","onChange","value","dataTestId","Children","map","child","cloneElement","checked"],"sources":["../src/RadioGroup.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport shortid from 'shortid';\n\ntype RadioGroupProps = {\n /** The radio items to populate this radio. Should be of type RadioItem. */\n children?: React.ReactElement | React.ReactElement[];\n\n /** The name to use for the radio items. If not specified, a name is automatically generated */\n name?: string;\n\n /** Triggered when a radio button is changed */\n onChange: React.ChangeEventHandler<HTMLInputElement>;\n\n /** The currently selected value. Will automatically set the `checked` attribute of the RadioItem. */\n value?: string;\n\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\n/**\n * A group of radio buttons. Use with RadioItems to populate, eg.\n * <RadioGroup>\n * <RadioItem .../>\n * <RadioItem .../>\n * </RadioGroup>\n */\nconst RadioGroup = (props: RadioGroupProps): JSX.Element => {\n const {\n children,\n disabled = false,\n name: propsName,\n onChange,\n value = '',\n 'data-testid': dataTestId,\n } = props;\n const [name] = useState(propsName
|
|
1
|
+
{"version":3,"file":"RadioGroup.js","names":["React","useState","shortid","RadioGroup","props","children","disabled","name","propsName","onChange","value","dataTestId","Children","map","child","cloneElement","checked"],"sources":["../src/RadioGroup.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport shortid from 'shortid';\n\ntype RadioGroupProps = {\n /** The radio items to populate this radio. Should be of type RadioItem. */\n children?: React.ReactElement | React.ReactElement[];\n\n /** The name to use for the radio items. If not specified, a name is automatically generated */\n name?: string;\n\n /** Triggered when a radio button is changed */\n onChange: React.ChangeEventHandler<HTMLInputElement>;\n\n /** The currently selected value. Will automatically set the `checked` attribute of the RadioItem. */\n value?: string;\n\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\n/**\n * A group of radio buttons. Use with RadioItems to populate, eg.\n * <RadioGroup>\n * <RadioItem .../>\n * <RadioItem .../>\n * </RadioGroup>\n */\nconst RadioGroup = (props: RadioGroupProps): JSX.Element => {\n const {\n children,\n disabled = false,\n name: propsName,\n onChange,\n value = '',\n 'data-testid': dataTestId,\n } = props;\n const [name] = useState(propsName ?? shortid());\n\n // Need to use \"text\" type so we can apply a pattern and make selection properly\n return (\n <>\n {React.Children.map(children, child =>\n child\n ? React.cloneElement(child, {\n name,\n onChange: child.props.onChange ?? onChange,\n checked: value === child.props.value,\n disabled: child.props.disabled ?? disabled,\n 'data-testid': dataTestId,\n })\n : null\n )}\n </>\n );\n};\n\nexport default RadioGroup;\n"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,QAAhB,QAAgC,OAAhC;AACA,OAAOC,OAAP,MAAoB,SAApB;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,UAAU,GAAIC,KAAD,IAAyC;EAC1D,IAAM;IACJC,QADI;IAEJC,QAAQ,GAAG,KAFP;IAGJC,IAAI,EAAEC,SAHF;IAIJC,QAJI;IAKJC,KAAK,GAAG,EALJ;IAMJ,eAAeC;EANX,IAOFP,KAPJ;EAQA,IAAM,CAACG,IAAD,IAASN,QAAQ,CAACO,SAAD,aAACA,SAAD,cAACA,SAAD,GAAcN,OAAO,EAArB,CAAvB,CAT0D,CAW1D;;EACA,oBACE,0CACGF,KAAK,CAACY,QAAN,CAAeC,GAAf,CAAmBR,QAAnB,EAA6BS,KAAK;IAAA;;IAAA,OACjCA,KAAK,gBACDd,KAAK,CAACe,YAAN,CAAmBD,KAAnB,EAA0B;MACxBP,IADwB;MAExBE,QAAQ,2BAAEK,KAAK,CAACV,KAAN,CAAYK,QAAd,yEAA0BA,QAFV;MAGxBO,OAAO,EAAEN,KAAK,KAAKI,KAAK,CAACV,KAAN,CAAYM,KAHP;MAIxBJ,QAAQ,2BAAEQ,KAAK,CAACV,KAAN,CAAYE,QAAd,yEAA0BA,QAJV;MAKxB,eAAeK;IALS,CAA1B,CADC,GAQD,IAT6B;EAAA,CAAlC,CADH,CADF;AAeD,CA3BD;;AA6BA,eAAeR,UAAf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SocketedButton.d.ts","sourceRoot":"","sources":["../src/SocketedButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,uBAAuB,CAAC;AAE/B,aAAK,mBAAmB,GAAG;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC1D,YAAY,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC1D,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,cAAc,+
|
|
1
|
+
{"version":3,"file":"SocketedButton.d.ts","sourceRoot":"","sources":["../src/SocketedButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,uBAAuB,CAAC;AAE/B,aAAK,mBAAmB,GAAG;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC1D,YAAY,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC1D,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,cAAc,+FAiDnB,CAAC;AAkBF,eAAe,cAAc,CAAC"}
|
package/dist/SocketedButton.js
CHANGED
|
@@ -21,7 +21,7 @@ var SocketedButton = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
21
21
|
ref: ref,
|
|
22
22
|
type: "button",
|
|
23
23
|
className: classNames('btn-socketed', {
|
|
24
|
-
'btn-socketed-linked': isLinked || isLinkedSource
|
|
24
|
+
'btn-socketed-linked': isLinked !== undefined && isLinked || isLinkedSource
|
|
25
25
|
}, {
|
|
26
26
|
'btn-socketed-linked-source': isLinkedSource
|
|
27
27
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SocketedButton.js","names":["React","classNames","dhExclamation","vsLink","FontAwesomeIcon","SocketedButton","forwardRef","props","ref","children","className","disabled","isLinked","isLinkedSource","isInvalid","onClick","onMouseEnter","onMouseLeave","style","dataTestId","
|
|
1
|
+
{"version":3,"file":"SocketedButton.js","names":["React","classNames","dhExclamation","vsLink","FontAwesomeIcon","SocketedButton","forwardRef","props","ref","children","className","disabled","isLinked","isLinkedSource","isInvalid","onClick","onMouseEnter","onMouseLeave","style","dataTestId","undefined","displayName","defaultProps"],"sources":["../src/SocketedButton.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { dhExclamation, vsLink } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nimport './SocketedButton.scss';\n\ntype SocketedButtonProps = {\n children?: React.ReactNode;\n className?: string;\n disabled?: boolean;\n isLinked?: boolean;\n isLinkedSource?: boolean;\n isInvalid?: boolean;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n onMouseEnter?: React.MouseEventHandler<HTMLButtonElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLButtonElement>;\n style?: React.CSSProperties;\n 'data-testid'?: string;\n};\n\nconst SocketedButton = React.forwardRef<HTMLButtonElement, SocketedButtonProps>(\n (props: SocketedButtonProps, ref) => {\n const {\n children,\n className,\n disabled,\n isLinked,\n isLinkedSource,\n isInvalid,\n onClick,\n onMouseEnter,\n onMouseLeave,\n style,\n 'data-testid': dataTestId,\n } = props;\n return (\n <button\n ref={ref}\n type=\"button\"\n className={classNames(\n 'btn-socketed',\n {\n 'btn-socketed-linked':\n (isLinked !== undefined && isLinked) || isLinkedSource,\n },\n { 'btn-socketed-linked-source': isLinkedSource },\n { 'is-invalid': isInvalid },\n className\n )}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n style={style}\n disabled={disabled}\n data-testid={dataTestId}\n >\n {children}\n <FontAwesomeIcon\n icon={vsLink}\n className=\"linked btn-socketed-icon\"\n transform=\"down-1\"\n />\n <FontAwesomeIcon\n icon={dhExclamation}\n className=\"is-invalid btn-socketed-icon\"\n />\n </button>\n );\n }\n);\n\nSocketedButton.displayName = 'SocketedButton';\n\nSocketedButton.defaultProps = {\n children: undefined,\n className: '',\n disabled: false,\n isLinked: false,\n isLinkedSource: false,\n isInvalid: false,\n onClick: undefined,\n onMouseEnter: undefined,\n onMouseLeave: undefined,\n style: undefined,\n 'data-testid': undefined,\n};\n\nexport default SocketedButton;\n"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,aAAT,EAAwBC,MAAxB,QAAsC,kBAAtC;AACA,SAASC,eAAT,QAAgC,gCAAhC;;AAkBA,IAAMC,cAAc,gBAAGL,KAAK,CAACM,UAAN,CACrB,CAACC,KAAD,EAA6BC,GAA7B,KAAqC;EACnC,IAAM;IACJC,QADI;IAEJC,SAFI;IAGJC,QAHI;IAIJC,QAJI;IAKJC,cALI;IAMJC,SANI;IAOJC,OAPI;IAQJC,YARI;IASJC,YATI;IAUJC,KAVI;IAWJ,eAAeC;EAXX,IAYFZ,KAZJ;EAaA,oBACE;IACE,GAAG,EAAEC,GADP;IAEE,IAAI,EAAC,QAFP;IAGE,SAAS,EAAEP,UAAU,CACnB,cADmB,EAEnB;MACE,uBACGW,QAAQ,KAAKQ,SAAb,IAA0BR,QAA3B,IAAwCC;IAF5C,CAFmB,EAMnB;MAAE,8BAA8BA;IAAhC,CANmB,EAOnB;MAAE,cAAcC;IAAhB,CAPmB,EAQnBJ,SARmB,CAHvB;IAaE,OAAO,EAAEK,OAbX;IAcE,YAAY,EAAEC,YAdhB;IAeE,YAAY,EAAEC,YAfhB;IAgBE,KAAK,EAAEC,KAhBT;IAiBE,QAAQ,EAAEP,QAjBZ;IAkBE,eAAaQ;EAlBf,GAoBGV,QApBH,eAqBE,oBAAC,eAAD;IACE,IAAI,EAAEN,MADR;IAEE,SAAS,EAAC,0BAFZ;IAGE,SAAS,EAAC;EAHZ,EArBF,eA0BE,oBAAC,eAAD;IACE,IAAI,EAAED,aADR;IAEE,SAAS,EAAC;EAFZ,EA1BF,CADF;AAiCD,CAhDoB,CAAvB;AAmDAG,cAAc,CAACgB,WAAf,GAA6B,gBAA7B;AAEAhB,cAAc,CAACiB,YAAf,GAA8B;EAC5Bb,QAAQ,EAAEW,SADkB;EAE5BV,SAAS,EAAE,EAFiB;EAG5BC,QAAQ,EAAE,KAHkB;EAI5BC,QAAQ,EAAE,KAJkB;EAK5BC,cAAc,EAAE,KALY;EAM5BC,SAAS,EAAE,KANiB;EAO5BC,OAAO,EAAEK,SAPmB;EAQ5BJ,YAAY,EAAEI,SARc;EAS5BH,YAAY,EAAEG,SATc;EAU5BF,KAAK,EAAEE,SAVqB;EAW5B,eAAeA;AAXa,CAA9B;AAcA,eAAef,cAAf"}
|
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,WAuFpB,CAAC;
|
|
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;AAwSF,eAAe,UAAU,CAAC"}
|
package/dist/TimeSlider.js
CHANGED
|
@@ -178,7 +178,7 @@ var PopOvers = props => {
|
|
|
178
178
|
value: firstTime,
|
|
179
179
|
onChange: onFirstTimeChange,
|
|
180
180
|
onSelect: onFirstTimeSelect,
|
|
181
|
-
"data-testid": dataTestId ? "".concat(dataTestId, "-input-1") : undefined
|
|
181
|
+
"data-testid": dataTestId !== undefined ? "".concat(dataTestId, "-input-1") : undefined
|
|
182
182
|
})), /*#__PURE__*/React.createElement("div", {
|
|
183
183
|
className: "flex-spacer"
|
|
184
184
|
}), /*#__PURE__*/React.createElement("div", {
|
|
@@ -193,7 +193,7 @@ var PopOvers = props => {
|
|
|
193
193
|
value: secondTime,
|
|
194
194
|
onChange: onSecondTimeChange,
|
|
195
195
|
onSelect: onSecondTimeSelect,
|
|
196
|
-
"data-testid": dataTestId ? "".concat(dataTestId, "-input-2") : undefined
|
|
196
|
+
"data-testid": dataTestId !== undefined ? "".concat(dataTestId, "-input-2") : undefined
|
|
197
197
|
})), /*#__PURE__*/React.createElement("div", {
|
|
198
198
|
className: "flex",
|
|
199
199
|
style: {
|
package/dist/TimeSlider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeSlider.js","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","swapTimes","firstTime","setFirstTime","secondTime","setSecondTime","firstTimeRef","secondTimeRef","firstTimeSelectionRef","secondTimeSelectionRef","setFocusOnSwapTimesChange","current","setSelection","onFirstTimeChange","onSecondTimeChange","onFirstTimeSelect","selection","onSecondTimeSelect","flexBasis","modified","undefined","TrackFills","transform","Handle","time","setTime","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","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"],"sources":["../src/TimeSlider.tsx"],"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, { SelectionSegment, TimeInputElement } 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 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 swapTimes = startTime > endTime;\n\n const [firstTime, setFirstTime] = useState(swapTimes ? endTime : startTime);\n const [secondTime, setSecondTime] = useState(swapTimes ? startTime : endTime);\n const firstTimeRef = useRef<TimeInputElement>(null);\n const secondTimeRef = useRef<TimeInputElement>(null);\n // Keep track of selection in both time inputs\n const firstTimeSelectionRef = useRef<SelectionSegment | null>(null);\n const secondTimeSelectionRef = useRef<SelectionSegment | null>(null);\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 useEffect(\n function setFocusOnSwapTimesChange() {\n if (firstTimeSelectionRef.current !== null) {\n secondTimeRef.current?.setSelection(firstTimeSelectionRef.current);\n }\n if (secondTimeSelectionRef.current !== null) {\n firstTimeRef.current?.setSelection(secondTimeSelectionRef.current);\n }\n },\n [swapTimes]\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 const onFirstTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = selection;\n secondTimeSelectionRef.current = null;\n }, []);\n\n const onSecondTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = null;\n secondTimeSelectionRef.current = selection;\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: swapTimes ? isEndModified : isStartModified,\n })}\n >\n {swapTimes ? 'End Time' : 'Start Time'}\n </label>\n <TimeInput\n ref={firstTimeRef}\n allowValueWrapping={false}\n value={firstTime}\n onChange={onFirstTimeChange}\n onSelect={onFirstTimeSelect}\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: swapTimes ? isStartModified : isEndModified,\n })}\n >\n {swapTimes ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n ref={secondTimeRef}\n allowValueWrapping={false}\n value={secondTime}\n onChange={onSecondTimeChange}\n onSelect={onSecondTimeSelect}\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 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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TimeSlider.js","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","swapTimes","firstTime","setFirstTime","secondTime","setSecondTime","firstTimeRef","secondTimeRef","firstTimeSelectionRef","secondTimeSelectionRef","setFocusOnSwapTimesChange","current","setSelection","onFirstTimeChange","onSecondTimeChange","onFirstTimeSelect","selection","onSecondTimeSelect","flexBasis","modified","undefined","TrackFills","transform","Handle","time","setTime","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","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"],"sources":["../src/TimeSlider.tsx"],"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, { SelectionSegment, TimeInputElement } 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 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 swapTimes = startTime > endTime;\n\n const [firstTime, setFirstTime] = useState(swapTimes ? endTime : startTime);\n const [secondTime, setSecondTime] = useState(swapTimes ? startTime : endTime);\n const firstTimeRef = useRef<TimeInputElement>(null);\n const secondTimeRef = useRef<TimeInputElement>(null);\n // Keep track of selection in both time inputs\n const firstTimeSelectionRef = useRef<SelectionSegment | null>(null);\n const secondTimeSelectionRef = useRef<SelectionSegment | null>(null);\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 useEffect(\n function setFocusOnSwapTimesChange() {\n if (firstTimeSelectionRef.current !== null) {\n secondTimeRef.current?.setSelection(firstTimeSelectionRef.current);\n }\n if (secondTimeSelectionRef.current !== null) {\n firstTimeRef.current?.setSelection(secondTimeSelectionRef.current);\n }\n },\n [swapTimes]\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 const onFirstTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = selection;\n secondTimeSelectionRef.current = null;\n }, []);\n\n const onSecondTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = null;\n secondTimeSelectionRef.current = selection;\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: swapTimes ? isEndModified : isStartModified,\n })}\n >\n {swapTimes ? 'End Time' : 'Start Time'}\n </label>\n <TimeInput\n ref={firstTimeRef}\n allowValueWrapping={false}\n value={firstTime}\n onChange={onFirstTimeChange}\n onSelect={onFirstTimeSelect}\n data-testid={\n dataTestId !== undefined ? `${dataTestId}-input-1` : undefined\n }\n />\n </div>\n <div className=\"flex-spacer\" />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: swapTimes ? isStartModified : isEndModified,\n })}\n >\n {swapTimes ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n ref={secondTimeRef}\n allowValueWrapping={false}\n value={secondTime}\n onChange={onSecondTimeChange}\n onSelect={onSecondTimeSelect}\n data-testid={\n dataTestId !== undefined ? `${dataTestId}-input-2` : undefined\n }\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 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"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValidateLabelInput.d.ts","sourceRoot":"","sources":["../src/ValidateLabelInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiB,MAAM,OAAO,CAAC;AAGtC,OAAO,2BAA2B,CAAC;AAEnC,oBAAY,uBAAuB,GAAG;IACpC,8BAA8B;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE9B,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,yCAAyC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,gDAAgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,uBAAuB,GAC7B,KAAK,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"ValidateLabelInput.d.ts","sourceRoot":"","sources":["../src/ValidateLabelInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiB,MAAM,OAAO,CAAC;AAGtC,OAAO,2BAA2B,CAAC;AAEnC,oBAAY,uBAAuB,GAAG;IACpC,8BAA8B;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE9B,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,yCAAyC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,gDAAgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,uBAAuB,GAC7B,KAAK,CAAC,YAAY,CA8CpB;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -40,9 +40,9 @@ export function ValidateLabelInput(props) {
|
|
|
40
40
|
'is-invalid': validationError
|
|
41
41
|
})
|
|
42
42
|
});
|
|
43
|
-
}), hintText && /*#__PURE__*/React.createElement("small", {
|
|
43
|
+
}), hintText !== undefined && /*#__PURE__*/React.createElement("small", {
|
|
44
44
|
className: "form-text text-muted"
|
|
45
|
-
}, hintText), validationError && showValidationError && /*#__PURE__*/React.createElement("p", {
|
|
45
|
+
}, hintText), validationError !== undefined && showValidationError && /*#__PURE__*/React.createElement("p", {
|
|
46
46
|
className: "validate-label-error text-danger"
|
|
47
47
|
}, validationError));
|
|
48
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValidateLabelInput.js","names":["React","useRef","classNames","shortid","ValidateLabelInput","props","children","className","labelText","hintText","isModified","validationError","showValidationError","dataTestId","id","idProp","current","modified","Children","toArray","map","child","isValidElement","cloneElement"],"sources":["../src/ValidateLabelInput.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport classNames from 'classnames';\nimport shortid from 'shortid';\nimport './ValidateLabelInput.scss';\n\nexport type ValidateLabelInputProps = {\n /** Element to add label to */\n children: React.ReactNode;\n\n /** Any classnames to add */\n className?: string | string[];\n\n /** Text for this validation label */\n labelText?: string;\n\n /** Small hint text next to the main label */\n hintText?: string;\n\n /** Show a modified state. Defaults to false. */\n isModified?: boolean;\n\n /** Validation error that has occurred */\n validationError?: string;\n\n /** Show the validation error if it exists. Default to true. */\n showValidationError?: boolean;\n\n /** ID to use. Auto-generates if not provided */\n id?: string;\n\n /** data-testid to apply to the label */\n 'data-testid'?: string;\n};\n\n/**\n * Takes a child and add a label and validaton error\n */\nexport function ValidateLabelInput(\n props: ValidateLabelInputProps\n): React.ReactElement {\n const {\n children,\n className,\n labelText,\n hintText,\n isModified,\n validationError,\n showValidationError = true,\n 'data-testid': dataTestId,\n id: idProp,\n } = props;\n\n const { current: id } = useRef(idProp ?? shortid());\n\n return (\n <>\n <label\n className={classNames('validate-label', className, {\n modified: isModified,\n })}\n htmlFor={id}\n data-testid={dataTestId}\n >\n {labelText}\n </label>\n {React.Children.toArray(children).map(child => {\n if (!React.isValidElement(child)) {\n return <div className={classNames(className)}>{child}</div>;\n }\n\n // toArray strips null children\n return React.cloneElement(child, {\n className: classNames(child.props.className, {\n 'is-invalid': validationError,\n }),\n });\n })}\n {hintText && <small className=\"form-text text-muted\">{hintText}</small
|
|
1
|
+
{"version":3,"file":"ValidateLabelInput.js","names":["React","useRef","classNames","shortid","ValidateLabelInput","props","children","className","labelText","hintText","isModified","validationError","showValidationError","dataTestId","id","idProp","current","modified","Children","toArray","map","child","isValidElement","cloneElement","undefined"],"sources":["../src/ValidateLabelInput.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport classNames from 'classnames';\nimport shortid from 'shortid';\nimport './ValidateLabelInput.scss';\n\nexport type ValidateLabelInputProps = {\n /** Element to add label to */\n children: React.ReactNode;\n\n /** Any classnames to add */\n className?: string | string[];\n\n /** Text for this validation label */\n labelText?: string;\n\n /** Small hint text next to the main label */\n hintText?: string;\n\n /** Show a modified state. Defaults to false. */\n isModified?: boolean;\n\n /** Validation error that has occurred */\n validationError?: string;\n\n /** Show the validation error if it exists. Default to true. */\n showValidationError?: boolean;\n\n /** ID to use. Auto-generates if not provided */\n id?: string;\n\n /** data-testid to apply to the label */\n 'data-testid'?: string;\n};\n\n/**\n * Takes a child and add a label and validaton error\n */\nexport function ValidateLabelInput(\n props: ValidateLabelInputProps\n): React.ReactElement {\n const {\n children,\n className,\n labelText,\n hintText,\n isModified,\n validationError,\n showValidationError = true,\n 'data-testid': dataTestId,\n id: idProp,\n } = props;\n\n const { current: id } = useRef(idProp ?? shortid());\n\n return (\n <>\n <label\n className={classNames('validate-label', className, {\n modified: isModified,\n })}\n htmlFor={id}\n data-testid={dataTestId}\n >\n {labelText}\n </label>\n {React.Children.toArray(children).map(child => {\n if (!React.isValidElement(child)) {\n return <div className={classNames(className)}>{child}</div>;\n }\n\n // toArray strips null children\n return React.cloneElement(child, {\n className: classNames(child.props.className, {\n 'is-invalid': validationError,\n }),\n });\n })}\n {hintText !== undefined && (\n <small className=\"form-text text-muted\">{hintText}</small>\n )}\n {validationError !== undefined && showValidationError && (\n <p className=\"validate-label-error text-danger\">{validationError}</p>\n )}\n </>\n );\n}\n\nexport default ValidateLabelInput;\n"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,MAAhB,QAA8B,OAA9B;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,OAAOC,OAAP,MAAoB,SAApB;;;AAgCA;AACA;AACA;AACA,OAAO,SAASC,kBAAT,CACLC,KADK,EAEe;EACpB,IAAM;IACJC,QADI;IAEJC,SAFI;IAGJC,SAHI;IAIJC,QAJI;IAKJC,UALI;IAMJC,eANI;IAOJC,mBAAmB,GAAG,IAPlB;IAQJ,eAAeC,UARX;IASJC,EAAE,EAAEC;EATA,IAUFV,KAVJ;EAYA,IAAM;IAAEW,OAAO,EAAEF;EAAX,IAAkBb,MAAM,CAACc,MAAD,aAACA,MAAD,cAACA,MAAD,GAAWZ,OAAO,EAAlB,CAA9B;EAEA,oBACE,uDACE;IACE,SAAS,EAAED,UAAU,CAAC,gBAAD,EAAmBK,SAAnB,EAA8B;MACjDU,QAAQ,EAAEP;IADuC,CAA9B,CADvB;IAIE,OAAO,EAAEI,EAJX;IAKE,eAAaD;EALf,GAOGL,SAPH,CADF,EAUGR,KAAK,CAACkB,QAAN,CAAeC,OAAf,CAAuBb,QAAvB,EAAiCc,GAAjC,CAAqCC,KAAK,IAAI;IAC7C,IAAI,eAACrB,KAAK,CAACsB,cAAN,CAAqBD,KAArB,CAAL,EAAkC;MAChC,oBAAO;QAAK,SAAS,EAAEnB,UAAU,CAACK,SAAD;MAA1B,GAAwCc,KAAxC,CAAP;IACD,CAH4C,CAK7C;;;IACA,oBAAOrB,KAAK,CAACuB,YAAN,CAAmBF,KAAnB,EAA0B;MAC/Bd,SAAS,EAAEL,UAAU,CAACmB,KAAK,CAAChB,KAAN,CAAYE,SAAb,EAAwB;QAC3C,cAAcI;MAD6B,CAAxB;IADU,CAA1B,CAAP;EAKD,CAXA,CAVH,EAsBGF,QAAQ,KAAKe,SAAb,iBACC;IAAO,SAAS,EAAC;EAAjB,GAAyCf,QAAzC,CAvBJ,EAyBGE,eAAe,KAAKa,SAApB,IAAiCZ,mBAAjC,iBACC;IAAG,SAAS,EAAC;EAAb,GAAiDD,eAAjD,CA1BJ,CADF;AA+BD;AAED,eAAeP,kBAAf"}
|
|
@@ -44,12 +44,12 @@ declare class ContextActionUtils {
|
|
|
44
44
|
*/
|
|
45
45
|
static getModifierKey(): 'metaKey' | 'ctrlKey';
|
|
46
46
|
/**
|
|
47
|
-
* Returns true if the modifier key for the current platform is
|
|
47
|
+
* Returns true if the modifier key for the current platform is down for the event (Ctrl for windows/linux, Command (meta) for mac)
|
|
48
48
|
* @param event The event to get the meta key status from
|
|
49
49
|
*/
|
|
50
50
|
static isModifierKeyDown(event: KeyboardEvent | MouseEvent | React.KeyboardEvent | React.MouseEvent): boolean;
|
|
51
51
|
/**
|
|
52
|
-
* Copy the
|
|
52
|
+
* Copy the p assed in text to the clipboard.
|
|
53
53
|
* @param text The text to copy
|
|
54
54
|
* @returns Promise Resolved on success, rejected on failure
|
|
55
55
|
*/
|
|
@@ -61,7 +61,7 @@ declare class ContextActionUtils {
|
|
|
61
61
|
*/
|
|
62
62
|
static copyToClipboardExecCommand(text: string): void;
|
|
63
63
|
/**
|
|
64
|
-
* Returns the menu items for the provided context actions, or empty array if none
|
|
64
|
+
* Returns the menu items for the provided context actions, or empty array if none foun d.
|
|
65
65
|
* @param actionsParam The actions to get menu items for
|
|
66
66
|
* @param includePromises Whether or not to include promises in the returned menu items
|
|
67
67
|
*/
|
|
@@ -25,15 +25,21 @@ class ContextActionUtils {
|
|
|
25
25
|
|
|
26
26
|
static compareActions(a, b) {
|
|
27
27
|
if (a.group !== b.group) {
|
|
28
|
-
|
|
28
|
+
var _a$group, _b$group;
|
|
29
|
+
|
|
30
|
+
return ((_a$group = a.group) !== null && _a$group !== void 0 ? _a$group : 0) > ((_b$group = b.group) !== null && _b$group !== void 0 ? _b$group : 0) ? 1 : -1;
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
if (a.order !== b.order) {
|
|
32
|
-
|
|
34
|
+
var _a$order, _b$order;
|
|
35
|
+
|
|
36
|
+
return ((_a$order = a.order) !== null && _a$order !== void 0 ? _a$order : 0) > ((_b$order = b.order) !== null && _b$order !== void 0 ? _b$order : 0) ? 1 : -1;
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
if (a.title !== b.title) {
|
|
36
|
-
|
|
40
|
+
var _a$title, _b$title;
|
|
41
|
+
|
|
42
|
+
return ((_a$title = a.title) !== null && _a$title !== void 0 ? _a$title : '') > ((_b$title = b.title) !== null && _b$title !== void 0 ? _b$title : '') ? 1 : -1;
|
|
37
43
|
}
|
|
38
44
|
|
|
39
45
|
if (a !== b) {
|
|
@@ -49,7 +55,7 @@ class ContextActionUtils {
|
|
|
49
55
|
|
|
50
56
|
|
|
51
57
|
static sortActions(actions) {
|
|
52
|
-
if (
|
|
58
|
+
if (actions == null || !Array.isArray(actions)) {
|
|
53
59
|
return [];
|
|
54
60
|
}
|
|
55
61
|
|
|
@@ -77,7 +83,7 @@ class ContextActionUtils {
|
|
|
77
83
|
return 'ctrlKey';
|
|
78
84
|
}
|
|
79
85
|
/**
|
|
80
|
-
* Returns true if the modifier key for the current platform is
|
|
86
|
+
* Returns true if the modifier key for the current platform is down for the event (Ctrl for windows/linux, Command (meta) for mac)
|
|
81
87
|
* @param event The event to get the meta key status from
|
|
82
88
|
*/
|
|
83
89
|
|
|
@@ -87,7 +93,7 @@ class ContextActionUtils {
|
|
|
87
93
|
return event[modifierKey];
|
|
88
94
|
}
|
|
89
95
|
/**
|
|
90
|
-
* Copy the
|
|
96
|
+
* Copy the p assed in text to the clipboard.
|
|
91
97
|
* @param text The text to copy
|
|
92
98
|
* @returns Promise Resolved on success, rejected on failure
|
|
93
99
|
*/
|
|
@@ -133,7 +139,7 @@ class ContextActionUtils {
|
|
|
133
139
|
}
|
|
134
140
|
}
|
|
135
141
|
/**
|
|
136
|
-
* Returns the menu items for the provided context actions, or empty array if none
|
|
142
|
+
* Returns the menu items for the provided context actions, or empty array if none foun d.
|
|
137
143
|
* @param actionsParam The actions to get menu items for
|
|
138
144
|
* @param includePromises Whether or not to include promises in the returned menu items
|
|
139
145
|
*/
|
|
@@ -171,7 +177,7 @@ class ContextActionUtils {
|
|
|
171
177
|
}
|
|
172
178
|
}
|
|
173
179
|
|
|
174
|
-
menuItems = menuItems.filter(action => action.title || action.then || action.menuElement);
|
|
180
|
+
menuItems = menuItems.filter(action => action.title !== undefined || action.then || action.menuElement);
|
|
175
181
|
return menuItems;
|
|
176
182
|
}
|
|
177
183
|
/**
|