@itwin/imodel-components-react 3.1.0-dev.26 → 3.1.0-dev.31
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/CHANGELOG.md +39 -0
- package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.d.ts.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatType.d.ts.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatType.js +3 -3
- package/lib/cjs/imodel-components-react/quantityformat/FormatType.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.d.ts.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.d.ts.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js +6 -6
- package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.d.ts.map +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +1 -1
- package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
- package/lib/cjs/imodel-components-react/timeline/TimelineComponent.d.ts +0 -6
- package/lib/cjs/imodel-components-react/timeline/TimelineComponent.d.ts.map +1 -1
- package/lib/cjs/imodel-components-react/timeline/TimelineComponent.js +37 -46
- package/lib/cjs/imodel-components-react/timeline/TimelineComponent.js.map +1 -1
- package/lib/cjs/imodel-components-react.d.ts +0 -1
- package/lib/cjs/imodel-components-react.d.ts.map +1 -1
- package/lib/cjs/imodel-components-react.js +0 -1
- package/lib/cjs/imodel-components-react.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.d.ts.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js +2 -2
- package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatType.d.ts.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatType.js +4 -4
- package/lib/esm/imodel-components-react/quantityformat/FormatType.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.d.ts.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js +2 -2
- package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.d.ts.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js +7 -7
- package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.d.ts.map +1 -1
- package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +2 -2
- package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
- package/lib/esm/imodel-components-react/timeline/TimelineComponent.d.ts +0 -6
- package/lib/esm/imodel-components-react/timeline/TimelineComponent.d.ts.map +1 -1
- package/lib/esm/imodel-components-react/timeline/TimelineComponent.js +37 -46
- package/lib/esm/imodel-components-react/timeline/TimelineComponent.js.map +1 -1
- package/lib/esm/imodel-components-react.d.ts +0 -1
- package/lib/esm/imodel-components-react.d.ts.map +1 -1
- package/lib/esm/imodel-components-react.js +0 -1
- package/lib/esm/imodel-components-react.js.map +1 -1
- package/package.json +19 -19
- package/lib/cjs/imodel-components-react/timeline/ContextMenu.d.ts +0 -55
- package/lib/cjs/imodel-components-react/timeline/ContextMenu.d.ts.map +0 -1
- package/lib/cjs/imodel-components-react/timeline/ContextMenu.js +0 -82
- package/lib/cjs/imodel-components-react/timeline/ContextMenu.js.map +0 -1
- package/lib/cjs/imodel-components-react/timeline/ContextMenu.scss +0 -81
- package/lib/esm/imodel-components-react/timeline/ContextMenu.d.ts +0 -55
- package/lib/esm/imodel-components-react/timeline/ContextMenu.d.ts.map +0 -1
- package/lib/esm/imodel-components-react/timeline/ContextMenu.js +0 -55
- package/lib/esm/imodel-components-react/timeline/ContextMenu.js.map +0 -1
- package/lib/esm/imodel-components-react/timeline/ContextMenu.scss +0 -81
|
@@ -9,7 +9,7 @@ import classnames from "classnames";
|
|
|
9
9
|
import * as React from "react";
|
|
10
10
|
import { SpecialKey } from "@itwin/appui-abstract";
|
|
11
11
|
import { Checkbox } from "@itwin/itwinui-react";
|
|
12
|
-
import { Format, FormatTraits, FormatType, ScientificType } from "@itwin/core-quantity";
|
|
12
|
+
import { Format, FormatTraits, FormatType, getTraitString, parseFormatType, parseScientificType, parseShowSignOption, ScientificType, scientificTypeToString, showSignOptionToString, } from "@itwin/core-quantity";
|
|
13
13
|
import { SignOptionSelector } from "./misc/SignOption";
|
|
14
14
|
import { ThousandsSeparator } from "./misc/ThousandsSeparator";
|
|
15
15
|
import { DecimalSeparatorSelector } from "./misc/DecimalSeparator";
|
|
@@ -30,12 +30,12 @@ export function MiscFormatOptions(props) {
|
|
|
30
30
|
return Format.isFormatTraitSetInProps(formatProps, trait);
|
|
31
31
|
}, [formatProps]);
|
|
32
32
|
const handleShowSignChange = React.useCallback((option) => {
|
|
33
|
-
const newShowSignOption =
|
|
33
|
+
const newShowSignOption = showSignOptionToString(option);
|
|
34
34
|
const newFormatProps = { ...formatProps, showSignOption: newShowSignOption };
|
|
35
35
|
handleSetFormatProps(newFormatProps);
|
|
36
36
|
}, [formatProps, handleSetFormatProps]);
|
|
37
37
|
const setFormatTrait = React.useCallback((trait, setActive) => {
|
|
38
|
-
const traitStr =
|
|
38
|
+
const traitStr = getTraitString(trait);
|
|
39
39
|
let formatTraits = [traitStr];
|
|
40
40
|
if (setActive) { // setting trait
|
|
41
41
|
// istanbul ignore else
|
|
@@ -90,14 +90,14 @@ export function MiscFormatOptions(props) {
|
|
|
90
90
|
handleSetFormatProps(newFormatProps);
|
|
91
91
|
}, [formatProps, isFormatTraitSet, handleSetFormatProps]);
|
|
92
92
|
const handleScientificTypeChange = React.useCallback((type) => {
|
|
93
|
-
const newFormatProps = { ...formatProps, scientificType:
|
|
93
|
+
const newFormatProps = { ...formatProps, scientificType: scientificTypeToString(type) };
|
|
94
94
|
handleSetFormatProps(newFormatProps);
|
|
95
95
|
}, [formatProps, handleSetFormatProps]);
|
|
96
96
|
const handleFormatChange = React.useCallback((newFormatProps) => {
|
|
97
97
|
handleSetFormatProps(newFormatProps);
|
|
98
98
|
}, [handleSetFormatProps]);
|
|
99
|
-
const formatType = React.useMemo(() =>
|
|
100
|
-
const showSignOption = React.useMemo(() => { var _a; return
|
|
99
|
+
const formatType = React.useMemo(() => parseFormatType(formatProps.type, "format"), [formatProps.type]);
|
|
100
|
+
const showSignOption = React.useMemo(() => { var _a; return parseShowSignOption((_a = formatProps.showSignOption) !== null && _a !== void 0 ? _a : "onlyNegative", "format"); }, [formatProps.showSignOption]);
|
|
101
101
|
const handleToggleButtonClick = React.useCallback(() => {
|
|
102
102
|
onShowHideOptions(!showOptions);
|
|
103
103
|
}, [onShowHideOptions, showOptions]);
|
|
@@ -152,7 +152,7 @@ export function MiscFormatOptions(props) {
|
|
|
152
152
|
React.createElement("span", { className: classnames("uicore-label", formatType !== FormatType.Fractional && "uicore-disabled") }, fractionDashLabel.current),
|
|
153
153
|
React.createElement(Checkbox, { "data-testid": "fraction-dash", checked: isFormatTraitSet(FormatTraits.FractionDash), onChange: handleUseFractionDashChange, disabled: formatType !== FormatType.Fractional }),
|
|
154
154
|
React.createElement("span", { className: classnames("uicore-label", formatType !== FormatType.Scientific && "uicore-disabled") }, scientificTypeLabel.current),
|
|
155
|
-
React.createElement(ScientificTypeSelector, { "data-testid": "scientific-type-selector", type: (formatProps.scientificType && formatProps.scientificType.length > 0) ?
|
|
155
|
+
React.createElement(ScientificTypeSelector, { "data-testid": "scientific-type-selector", type: (formatProps.scientificType && formatProps.scientificType.length > 0) ? parseScientificType(formatProps.scientificType, "custom") : ScientificType.Normalized, disabled: formatType !== FormatType.Scientific, onChange: handleScientificTypeChange }),
|
|
156
156
|
props.children,
|
|
157
157
|
enableMinimumProperties && showOptions && React.createElement("a", { onClick: handleToggleButtonClick, onKeyUp: handleKeyUpOnLink, className: "components-quantityFormat-more-less", role: "link", "data-testid": "quantityFormat-less", tabIndex: 0 }, lessLabel.current))));
|
|
158
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MiscFormatOptions.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/quantityformat/MiscFormatOptions.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module QuantityFormat\r\n */\r\n\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { SpecialKey } from \"@itwin/appui-abstract\";\r\nimport { CommonProps } from \"@itwin/core-react\";\r\nimport { Checkbox } from \"@itwin/itwinui-react\";\r\nimport { Format, FormatProps, FormatTraits, FormatType, ScientificType, ShowSignOption } from \"@itwin/core-quantity\";\r\nimport { SignOptionSelector } from \"./misc/SignOption\";\r\nimport { ThousandsSeparator } from \"./misc/ThousandsSeparator\";\r\nimport { DecimalSeparatorSelector } from \"./misc/DecimalSeparator\";\r\nimport { ScientificTypeSelector } from \"./misc/ScientificType\";\r\nimport { StationSeparatorSelector } from \"./misc/StationSeparatorSelector\";\r\nimport { StationSizeSelector } from \"./misc/StationSizeSelector\";\r\nimport { UiIModelComponents } from \"../UiIModelComponents\";\r\n\r\n/** Properties of [[MiscFormatOptions]] component.\r\n * @alpha\r\n */\r\nexport interface MiscFormatOptionsProps extends CommonProps {\r\n formatProps: FormatProps;\r\n onChange?: (format: FormatProps) => void;\r\n enableMinimumProperties?: boolean;\r\n showOptions: boolean;\r\n onShowHideOptions: (show: boolean) => void;\r\n children?: React.ReactNode;\r\n}\r\n\r\n/** Component use to set miscellaneous properties is a Formatted Quantity.\r\n * @alpha\r\n */\r\nexport function MiscFormatOptions(props: MiscFormatOptionsProps) {\r\n const { formatProps, onChange, showOptions, onShowHideOptions, enableMinimumProperties } = props;\r\n\r\n const handleSetFormatProps = React.useCallback((newFormatProps: FormatProps) => {\r\n onChange && onChange(newFormatProps);\r\n }, [onChange]);\r\n\r\n const isFormatTraitSet = React.useCallback((trait: FormatTraits) => {\r\n return Format.isFormatTraitSetInProps(formatProps, trait);\r\n }, [formatProps]);\r\n\r\n const handleShowSignChange = React.useCallback((option: ShowSignOption) => {\r\n const newShowSignOption = Format.showSignOptionToString(option);\r\n const newFormatProps = { ...formatProps, showSignOption: newShowSignOption };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const setFormatTrait = React.useCallback((trait: FormatTraits, setActive: boolean) => {\r\n const traitStr = Format.getTraitString(trait);\r\n let formatTraits: string[] = [traitStr];\r\n if (setActive) {// setting trait\r\n // istanbul ignore else\r\n if (formatProps.formatTraits) {\r\n const traits = Array.isArray(formatProps.formatTraits) ? formatProps.formatTraits : /* istanbul ignore next */ formatProps.formatTraits.split(/,|;|\\|/);\r\n // istanbul ignore else\r\n if (!traits.find((traitEntry) => traitStr === traitEntry)) {\r\n formatTraits = [...traits, traitStr];\r\n }\r\n }\r\n } else {// clearing trait\r\n // istanbul ignore next\r\n if (!formatProps.formatTraits)\r\n return;\r\n const traits = Array.isArray(formatProps.formatTraits) ? formatProps.formatTraits : /* istanbul ignore next */ formatProps.formatTraits.split(/,|;|\\|/);\r\n formatTraits = traits.filter((traitEntry) => traitEntry !== traitStr);\r\n }\r\n const newFormatProps = { ...formatProps, formatTraits };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const handleShowTrailingZeroesChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.TrailZeroes, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const handleKeepDecimalPointChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.KeepDecimalPoint, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const handleKeepSingleZeroChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.KeepSingleZero, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const handleZeroEmptyChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.ZeroEmpty, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const handleUseFractionDashChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.FractionDash, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const handleDecimalSeparatorChange = React.useCallback((decimalSeparator: string) => {\r\n let thousandSeparator = formatProps.thousandSeparator;\r\n // make sure 1000 and decimal separator do not match\r\n // istanbul ignore else\r\n if (isFormatTraitSet(FormatTraits.Use1000Separator)) {\r\n switch (decimalSeparator) {\r\n case \".\":\r\n thousandSeparator = \",\";\r\n break;\r\n case \",\":\r\n thousandSeparator = \".\";\r\n break;\r\n }\r\n }\r\n const newFormatProps = { ...formatProps, thousandSeparator, decimalSeparator };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, isFormatTraitSet, handleSetFormatProps]);\r\n\r\n const handleScientificTypeChange = React.useCallback((type: ScientificType) => {\r\n const newFormatProps = { ...formatProps, scientificType: Format.scientificTypeToString(type) };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const handleFormatChange = React.useCallback((newFormatProps: FormatProps) => {\r\n handleSetFormatProps(newFormatProps);\r\n }, [handleSetFormatProps]);\r\n\r\n const formatType = React.useMemo(() => Format.parseFormatType(formatProps.type, \"format\"), [formatProps.type]);\r\n const showSignOption = React.useMemo(() => Format.parseShowSignOption(formatProps.showSignOption ?? \"onlyNegative\", \"format\"), [formatProps.showSignOption]);\r\n\r\n const handleToggleButtonClick = React.useCallback(() => {\r\n onShowHideOptions(!showOptions);\r\n }, [onShowHideOptions, showOptions]);\r\n\r\n const handleKeyUpOnLink = React.useCallback((e: React.KeyboardEvent<HTMLAnchorElement>) => {\r\n // istanbul ignore else\r\n if (e.key === SpecialKey.Enter || e.key === SpecialKey.Space) {\r\n onShowHideOptions(!showOptions);\r\n e.preventDefault();\r\n }\r\n }, [onShowHideOptions, showOptions]);\r\n\r\n const handleStationSeparatorChange = React.useCallback((value: string) => {\r\n const newFormatProps = { ...formatProps, stationSeparator: value };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const handleStationOffsetChange = React.useCallback((value: number) => {\r\n const newFormatProps = { ...formatProps, stationOffsetSize: value };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const signOptionLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.signOptionLabel\"));\r\n const stationOffsetLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.stationOffsetLabel\"));\r\n const stationSeparatorLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.stationSeparatorLabel\"));\r\n const decimalSeparatorLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.decimalSeparatorLabel\"));\r\n const showTrailZerosLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.showTrailZerosLabel\"));\r\n const keepSingleZeroLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.keepSingleZeroLabel\"));\r\n const zeroEmptyLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.zeroEmptyLabel\"));\r\n const moreLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.moreLabel\"));\r\n const lessLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.lessLabel\"));\r\n const keepDecimalPointLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.keepDecimalPointLabel\"));\r\n const fractionDashLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.fractionDashLabel\"));\r\n const scientificTypeLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.scientificTypeLabel\"));\r\n\r\n return (\r\n <>\r\n { // eslint-disable-next-line jsx-a11y/anchor-is-valid\r\n enableMinimumProperties && !showOptions && <a onClick={handleToggleButtonClick} onKeyUp={handleKeyUpOnLink}\r\n className={\"components-quantityFormat-more-less\"} role=\"link\" data-testid=\"quantityFormat-more\" tabIndex={0} >{moreLabel.current}</a>}\r\n {\r\n (!enableMinimumProperties || showOptions) &&\r\n <>\r\n <span className={\"uicore-label\"}>{signOptionLabel.current}</span>\r\n <SignOptionSelector data-testid=\"sign-option-selector\" signOption={showSignOption} onChange={handleShowSignChange} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType !== FormatType.Station && \"uicore-disabled\")}>{stationOffsetLabel.current}</span>\r\n <StationSizeSelector data-testid=\"station-size-selector\" value={(formatProps.stationOffsetSize ?? 2)}\r\n disabled={formatType !== FormatType.Station} onChange={handleStationOffsetChange} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType !== FormatType.Station && \"uicore-disabled\")}>{stationSeparatorLabel.current}</span>\r\n <StationSeparatorSelector data-testid=\"station-separator-selector\" separator={(undefined !== formatProps.stationSeparator ? formatProps.stationSeparator : \"+\")}\r\n disabled={formatType !== FormatType.Station} onChange={handleStationSeparatorChange} />\r\n\r\n <ThousandsSeparator formatProps={formatProps} onChange={handleFormatChange} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType === FormatType.Fractional && \"uicore-disabled\")}>{decimalSeparatorLabel.current}</span>\r\n <DecimalSeparatorSelector data-testid=\"decimal-separator-selector\" separator={formatProps.decimalSeparator ?? \".\"} onChange={handleDecimalSeparatorChange} disabled={formatType === FormatType.Fractional} />\r\n\r\n <span className={\"uicore-label\"}>{showTrailZerosLabel.current}</span>\r\n <Checkbox data-testid=\"show-trail-zeros\" checked={isFormatTraitSet(FormatTraits.TrailZeroes)} onChange={handleShowTrailingZeroesChange} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType === FormatType.Fractional && \"uicore-disabled\")}>{keepDecimalPointLabel.current}</span>\r\n <Checkbox data-testid=\"keep-decimal-point\" checked={isFormatTraitSet(FormatTraits.KeepDecimalPoint)} onChange={handleKeepDecimalPointChange} />\r\n\r\n <span className={\"uicore-label\"}>{keepSingleZeroLabel.current}</span>\r\n <Checkbox data-testid=\"keep-single-zero\" checked={isFormatTraitSet(FormatTraits.KeepSingleZero)} onChange={handleKeepSingleZeroChange} />\r\n\r\n <span className={\"uicore-label\"}>{zeroEmptyLabel.current}</span>\r\n <Checkbox data-testid=\"zero-empty\" checked={isFormatTraitSet(FormatTraits.ZeroEmpty)} onChange={handleZeroEmptyChange} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType !== FormatType.Fractional && \"uicore-disabled\")}>{fractionDashLabel.current}</span>\r\n <Checkbox data-testid=\"fraction-dash\" checked={isFormatTraitSet(FormatTraits.FractionDash)} onChange={handleUseFractionDashChange} disabled={formatType !== FormatType.Fractional} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType !== FormatType.Scientific && \"uicore-disabled\")}>{scientificTypeLabel.current}</span>\r\n <ScientificTypeSelector data-testid=\"scientific-type-selector\" type={(formatProps.scientificType && formatProps.scientificType.length > 0) ? Format.parseScientificType(formatProps.scientificType, \"custom\") : ScientificType.Normalized}\r\n disabled={formatType !== FormatType.Scientific} onChange={handleScientificTypeChange} />\r\n\r\n {props.children}\r\n\r\n { // eslint-disable-next-line jsx-a11y/anchor-is-valid\r\n enableMinimumProperties && showOptions && <a onClick={handleToggleButtonClick} onKeyUp={handleKeyUpOnLink}\r\n className={\"components-quantityFormat-more-less\"} role=\"link\" data-testid=\"quantityFormat-less\" tabIndex={0}>{lessLabel.current}</a>}\r\n </>\r\n }\r\n </>\r\n );\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"MiscFormatOptions.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/quantityformat/MiscFormatOptions.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module QuantityFormat\r\n */\r\n\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { SpecialKey } from \"@itwin/appui-abstract\";\r\nimport { CommonProps } from \"@itwin/core-react\";\r\nimport { Checkbox } from \"@itwin/itwinui-react\";\r\nimport { Format, FormatProps, FormatTraits, FormatType, getTraitString, parseFormatType, parseScientificType,\r\n parseShowSignOption, ScientificType, scientificTypeToString, ShowSignOption, showSignOptionToString,\r\n} from \"@itwin/core-quantity\";\r\nimport { SignOptionSelector } from \"./misc/SignOption\";\r\nimport { ThousandsSeparator } from \"./misc/ThousandsSeparator\";\r\nimport { DecimalSeparatorSelector } from \"./misc/DecimalSeparator\";\r\nimport { ScientificTypeSelector } from \"./misc/ScientificType\";\r\nimport { StationSeparatorSelector } from \"./misc/StationSeparatorSelector\";\r\nimport { StationSizeSelector } from \"./misc/StationSizeSelector\";\r\nimport { UiIModelComponents } from \"../UiIModelComponents\";\r\n\r\n/** Properties of [[MiscFormatOptions]] component.\r\n * @alpha\r\n */\r\nexport interface MiscFormatOptionsProps extends CommonProps {\r\n formatProps: FormatProps;\r\n onChange?: (format: FormatProps) => void;\r\n enableMinimumProperties?: boolean;\r\n showOptions: boolean;\r\n onShowHideOptions: (show: boolean) => void;\r\n children?: React.ReactNode;\r\n}\r\n\r\n/** Component use to set miscellaneous properties is a Formatted Quantity.\r\n * @alpha\r\n */\r\nexport function MiscFormatOptions(props: MiscFormatOptionsProps) {\r\n const { formatProps, onChange, showOptions, onShowHideOptions, enableMinimumProperties } = props;\r\n\r\n const handleSetFormatProps = React.useCallback((newFormatProps: FormatProps) => {\r\n onChange && onChange(newFormatProps);\r\n }, [onChange]);\r\n\r\n const isFormatTraitSet = React.useCallback((trait: FormatTraits) => {\r\n return Format.isFormatTraitSetInProps(formatProps, trait);\r\n }, [formatProps]);\r\n\r\n const handleShowSignChange = React.useCallback((option: ShowSignOption) => {\r\n const newShowSignOption = showSignOptionToString(option);\r\n const newFormatProps = { ...formatProps, showSignOption: newShowSignOption };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const setFormatTrait = React.useCallback((trait: FormatTraits, setActive: boolean) => {\r\n const traitStr = getTraitString(trait);\r\n let formatTraits: string[] = [traitStr];\r\n if (setActive) {// setting trait\r\n // istanbul ignore else\r\n if (formatProps.formatTraits) {\r\n const traits = Array.isArray(formatProps.formatTraits) ? formatProps.formatTraits : /* istanbul ignore next */ formatProps.formatTraits.split(/,|;|\\|/);\r\n // istanbul ignore else\r\n if (!traits.find((traitEntry) => traitStr === traitEntry)) {\r\n formatTraits = [...traits, traitStr];\r\n }\r\n }\r\n } else {// clearing trait\r\n // istanbul ignore next\r\n if (!formatProps.formatTraits)\r\n return;\r\n const traits = Array.isArray(formatProps.formatTraits) ? formatProps.formatTraits : /* istanbul ignore next */ formatProps.formatTraits.split(/,|;|\\|/);\r\n formatTraits = traits.filter((traitEntry) => traitEntry !== traitStr);\r\n }\r\n const newFormatProps = { ...formatProps, formatTraits };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const handleShowTrailingZeroesChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.TrailZeroes, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const handleKeepDecimalPointChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.KeepDecimalPoint, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const handleKeepSingleZeroChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.KeepSingleZero, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const handleZeroEmptyChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.ZeroEmpty, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const handleUseFractionDashChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.FractionDash, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const handleDecimalSeparatorChange = React.useCallback((decimalSeparator: string) => {\r\n let thousandSeparator = formatProps.thousandSeparator;\r\n // make sure 1000 and decimal separator do not match\r\n // istanbul ignore else\r\n if (isFormatTraitSet(FormatTraits.Use1000Separator)) {\r\n switch (decimalSeparator) {\r\n case \".\":\r\n thousandSeparator = \",\";\r\n break;\r\n case \",\":\r\n thousandSeparator = \".\";\r\n break;\r\n }\r\n }\r\n const newFormatProps = { ...formatProps, thousandSeparator, decimalSeparator };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, isFormatTraitSet, handleSetFormatProps]);\r\n\r\n const handleScientificTypeChange = React.useCallback((type: ScientificType) => {\r\n const newFormatProps = { ...formatProps, scientificType: scientificTypeToString(type) };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const handleFormatChange = React.useCallback((newFormatProps: FormatProps) => {\r\n handleSetFormatProps(newFormatProps);\r\n }, [handleSetFormatProps]);\r\n\r\n const formatType = React.useMemo(() => parseFormatType(formatProps.type, \"format\"), [formatProps.type]);\r\n const showSignOption = React.useMemo(() => parseShowSignOption(formatProps.showSignOption ?? \"onlyNegative\", \"format\"), [formatProps.showSignOption]);\r\n\r\n const handleToggleButtonClick = React.useCallback(() => {\r\n onShowHideOptions(!showOptions);\r\n }, [onShowHideOptions, showOptions]);\r\n\r\n const handleKeyUpOnLink = React.useCallback((e: React.KeyboardEvent<HTMLAnchorElement>) => {\r\n // istanbul ignore else\r\n if (e.key === SpecialKey.Enter || e.key === SpecialKey.Space) {\r\n onShowHideOptions(!showOptions);\r\n e.preventDefault();\r\n }\r\n }, [onShowHideOptions, showOptions]);\r\n\r\n const handleStationSeparatorChange = React.useCallback((value: string) => {\r\n const newFormatProps = { ...formatProps, stationSeparator: value };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const handleStationOffsetChange = React.useCallback((value: number) => {\r\n const newFormatProps = { ...formatProps, stationOffsetSize: value };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const signOptionLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.signOptionLabel\"));\r\n const stationOffsetLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.stationOffsetLabel\"));\r\n const stationSeparatorLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.stationSeparatorLabel\"));\r\n const decimalSeparatorLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.decimalSeparatorLabel\"));\r\n const showTrailZerosLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.showTrailZerosLabel\"));\r\n const keepSingleZeroLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.keepSingleZeroLabel\"));\r\n const zeroEmptyLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.zeroEmptyLabel\"));\r\n const moreLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.moreLabel\"));\r\n const lessLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.lessLabel\"));\r\n const keepDecimalPointLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.keepDecimalPointLabel\"));\r\n const fractionDashLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.fractionDashLabel\"));\r\n const scientificTypeLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.scientificTypeLabel\"));\r\n\r\n return (\r\n <>\r\n { // eslint-disable-next-line jsx-a11y/anchor-is-valid\r\n enableMinimumProperties && !showOptions && <a onClick={handleToggleButtonClick} onKeyUp={handleKeyUpOnLink}\r\n className={\"components-quantityFormat-more-less\"} role=\"link\" data-testid=\"quantityFormat-more\" tabIndex={0} >{moreLabel.current}</a>}\r\n {\r\n (!enableMinimumProperties || showOptions) &&\r\n <>\r\n <span className={\"uicore-label\"}>{signOptionLabel.current}</span>\r\n <SignOptionSelector data-testid=\"sign-option-selector\" signOption={showSignOption} onChange={handleShowSignChange} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType !== FormatType.Station && \"uicore-disabled\")}>{stationOffsetLabel.current}</span>\r\n <StationSizeSelector data-testid=\"station-size-selector\" value={(formatProps.stationOffsetSize ?? 2)}\r\n disabled={formatType !== FormatType.Station} onChange={handleStationOffsetChange} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType !== FormatType.Station && \"uicore-disabled\")}>{stationSeparatorLabel.current}</span>\r\n <StationSeparatorSelector data-testid=\"station-separator-selector\" separator={(undefined !== formatProps.stationSeparator ? formatProps.stationSeparator : \"+\")}\r\n disabled={formatType !== FormatType.Station} onChange={handleStationSeparatorChange} />\r\n\r\n <ThousandsSeparator formatProps={formatProps} onChange={handleFormatChange} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType === FormatType.Fractional && \"uicore-disabled\")}>{decimalSeparatorLabel.current}</span>\r\n <DecimalSeparatorSelector data-testid=\"decimal-separator-selector\" separator={formatProps.decimalSeparator ?? \".\"} onChange={handleDecimalSeparatorChange} disabled={formatType === FormatType.Fractional} />\r\n\r\n <span className={\"uicore-label\"}>{showTrailZerosLabel.current}</span>\r\n <Checkbox data-testid=\"show-trail-zeros\" checked={isFormatTraitSet(FormatTraits.TrailZeroes)} onChange={handleShowTrailingZeroesChange} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType === FormatType.Fractional && \"uicore-disabled\")}>{keepDecimalPointLabel.current}</span>\r\n <Checkbox data-testid=\"keep-decimal-point\" checked={isFormatTraitSet(FormatTraits.KeepDecimalPoint)} onChange={handleKeepDecimalPointChange} />\r\n\r\n <span className={\"uicore-label\"}>{keepSingleZeroLabel.current}</span>\r\n <Checkbox data-testid=\"keep-single-zero\" checked={isFormatTraitSet(FormatTraits.KeepSingleZero)} onChange={handleKeepSingleZeroChange} />\r\n\r\n <span className={\"uicore-label\"}>{zeroEmptyLabel.current}</span>\r\n <Checkbox data-testid=\"zero-empty\" checked={isFormatTraitSet(FormatTraits.ZeroEmpty)} onChange={handleZeroEmptyChange} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType !== FormatType.Fractional && \"uicore-disabled\")}>{fractionDashLabel.current}</span>\r\n <Checkbox data-testid=\"fraction-dash\" checked={isFormatTraitSet(FormatTraits.FractionDash)} onChange={handleUseFractionDashChange} disabled={formatType !== FormatType.Fractional} />\r\n\r\n <span className={classnames(\"uicore-label\", formatType !== FormatType.Scientific && \"uicore-disabled\")}>{scientificTypeLabel.current}</span>\r\n <ScientificTypeSelector data-testid=\"scientific-type-selector\" type={(formatProps.scientificType && formatProps.scientificType.length > 0) ? parseScientificType(formatProps.scientificType, \"custom\") : ScientificType.Normalized}\r\n disabled={formatType !== FormatType.Scientific} onChange={handleScientificTypeChange} />\r\n\r\n {props.children}\r\n\r\n { // eslint-disable-next-line jsx-a11y/anchor-is-valid\r\n enableMinimumProperties && showOptions && <a onClick={handleToggleButtonClick} onKeyUp={handleKeyUpOnLink}\r\n className={\"components-quantityFormat-more-less\"} role=\"link\" data-testid=\"quantityFormat-less\" tabIndex={0}>{lessLabel.current}</a>}\r\n </>\r\n }\r\n </>\r\n );\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThousandsSeparator.d.ts","sourceRoot":"","sources":["../../../../../src/imodel-components-react/quantityformat/misc/ThousandsSeparator.tsx"],"names":[],"mappings":"AAIA;;GAEG;;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAU,WAAW,
|
|
1
|
+
{"version":3,"file":"ThousandsSeparator.d.ts","sourceRoot":"","sources":["../../../../../src/imodel-components-react/quantityformat/misc/ThousandsSeparator.tsx"],"names":[],"mappings":"AAIA;;GAEG;;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAU,WAAW,EAAgC,MAAM,sBAAsB,CAAC;AAKzF;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,WAAW;IAC1D,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,eA4DhE"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import classnames from "classnames";
|
|
9
9
|
import * as React from "react";
|
|
10
|
-
import { Format, FormatTraits } from "@itwin/core-quantity";
|
|
10
|
+
import { Format, FormatTraits, getTraitString } from "@itwin/core-quantity";
|
|
11
11
|
import { Checkbox } from "@itwin/itwinui-react";
|
|
12
12
|
import { ThousandsSelector } from "./ThousandsSelector";
|
|
13
13
|
import { UiIModelComponents } from "../../UiIModelComponents";
|
|
@@ -21,7 +21,7 @@ export function ThousandsSeparator(props) {
|
|
|
21
21
|
onChange && onChange(newProps);
|
|
22
22
|
}, [onChange]);
|
|
23
23
|
const setFormatTrait = React.useCallback((trait, setActive) => {
|
|
24
|
-
const traitStr =
|
|
24
|
+
const traitStr = getTraitString(trait);
|
|
25
25
|
let formatTraits = [traitStr];
|
|
26
26
|
if (setActive) { // setting trait
|
|
27
27
|
// istanbul ignore else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThousandsSeparator.js","sourceRoot":"","sources":["../../../../../src/imodel-components-react/quantityformat/misc/ThousandsSeparator.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAe,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ThousandsSeparator.js","sourceRoot":"","sources":["../../../../../src/imodel-components-react/quantityformat/misc/ThousandsSeparator.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAe,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAU9D;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA8B;;IAC/D,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAExC,MAAM,oBAAoB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,QAAqB,EAAE,EAAE;QACvE,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAmB,EAAE,SAAkB,EAAE,EAAE;QACnF,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,YAAY,GAAa,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,SAAS,EAAE,EAAC,gBAAgB;YAC9B,uBAAuB;YACvB,IAAI,WAAW,CAAC,YAAY,EAAE;gBAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,0BAA0B,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACxJ,YAAY,GAAG,CAAC,GAAG,MAAM,EAAE,QAAQ,CAAC,CAAC;aACtC;SACF;aAAM,EAAE,iBAAiB;YACxB,uBAAuB;YACvB,IAAI,WAAW,CAAC,YAAY,EAAE;gBAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,0BAA0B,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACxJ,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC;aACvE;SACF;QACD,MAAM,cAAc,GAAG,EAAE,GAAG,WAAW,EAAE,YAAY,EAAE,CAAC;QACxD,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAExC,MAAM,iCAAiC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAsC,EAAE,EAAE;QACrG,cAAc,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAmB,EAAE,EAAE;QACjE,OAAO,MAAM,CAAC,uBAAuB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,6BAA6B,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,iBAAyB,EAAE,EAAE;QACpF,IAAI,gBAAgB,GAAG,WAAW,CAAC,gBAAgB,CAAC;QACpD,oDAAoD;QACpD,uBAAuB;QACvB,IAAI,gBAAgB,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE;YACnD,IAAI,iBAAiB,KAAK,GAAG;gBAC3B,gBAAgB,GAAG,GAAG,CAAC;iBACpB,4BAA4B;gBAC/B,gBAAgB,GAAG,GAAG,CAAC;SAC1B;QACD,MAAM,cAAc,GAAG,EAAE,GAAG,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;QAC/E,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAE1D,MAAM,yBAAyB,GAAG,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC,CAAC;IAChI,MAAM,sBAAsB,GAAG,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC,CAAC;IAE1H,OAAO,CACL;QACE,8BAAM,SAAS,EAAE,cAAc,IAAG,yBAAyB,CAAC,OAAO,CAAQ;QAC3E,oBAAC,QAAQ,mBAAa,yBAAyB,EAAC,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,iCAAiC,GAAI;QACzJ,8BAAM,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,IAAI,iBAAiB,CAAC,IAAG,sBAAsB,CAAC,OAAO,CAAQ;QAC7J,oBAAC,iBAAiB,mBAAa,8BAA8B,EAAC,SAAS,EAAE,MAAA,WAAW,CAAC,iBAAiB,mCAAI,GAAG,EAAE,QAAQ,EAAE,CAAC,gBAAgB,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,6BAA6B,GAAI,CACrN,CACJ,CAAC;AACJ,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module QuantityFormat\r\n */\r\n\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { CommonProps } from \"@itwin/core-react\";\r\nimport { Format, FormatProps, FormatTraits, getTraitString } from \"@itwin/core-quantity\";\r\nimport { Checkbox } from \"@itwin/itwinui-react\";\r\nimport { ThousandsSelector } from \"./ThousandsSelector\";\r\nimport { UiIModelComponents } from \"../../UiIModelComponents\";\r\n\r\n/** Properties of [[ThousandsSeparator]] component.\r\n * @internal\r\n */\r\nexport interface ThousandsSeparatorProps extends CommonProps {\r\n formatProps: FormatProps;\r\n onChange?: (format: FormatProps) => void;\r\n}\r\n\r\n/** Component use to set Quantity Format thousand group separator.\r\n * @internal\r\n */\r\nexport function ThousandsSeparator(props: ThousandsSeparatorProps) {\r\n const { formatProps, onChange } = props;\r\n\r\n const handleSetFormatProps = React.useCallback((newProps: FormatProps) => {\r\n onChange && onChange(newProps);\r\n }, [onChange]);\r\n\r\n const setFormatTrait = React.useCallback((trait: FormatTraits, setActive: boolean) => {\r\n const traitStr = getTraitString(trait);\r\n let formatTraits: string[] = [traitStr];\r\n if (setActive) {// setting trait\r\n // istanbul ignore else\r\n if (formatProps.formatTraits) {\r\n const traits = Array.isArray(formatProps.formatTraits) ? formatProps.formatTraits : /* istanbul ignore next */ formatProps.formatTraits.split(/,|;|\\|/);\r\n formatTraits = [...traits, traitStr];\r\n }\r\n } else { // clearing trait\r\n // istanbul ignore else\r\n if (formatProps.formatTraits) {\r\n const traits = Array.isArray(formatProps.formatTraits) ? formatProps.formatTraits : /* istanbul ignore next */ formatProps.formatTraits.split(/,|;|\\|/);\r\n formatTraits = traits.filter((traitEntry) => traitEntry !== traitStr);\r\n }\r\n }\r\n const newFormatProps = { ...formatProps, formatTraits };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, handleSetFormatProps]);\r\n\r\n const handleUseThousandsSeparatorChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormatTrait(FormatTraits.Use1000Separator, e.target.checked);\r\n }, [setFormatTrait]);\r\n\r\n const isFormatTraitSet = React.useCallback((trait: FormatTraits) => {\r\n return Format.isFormatTraitSetInProps(formatProps, trait);\r\n }, [formatProps]);\r\n\r\n const handleThousandSeparatorChange = React.useCallback((thousandSeparator: string) => {\r\n let decimalSeparator = formatProps.decimalSeparator;\r\n // make sure 1000 and decimal separator do not match\r\n // istanbul ignore else\r\n if (isFormatTraitSet(FormatTraits.Use1000Separator)) {\r\n if (thousandSeparator === \".\")\r\n decimalSeparator = \",\";\r\n else // thousandSeparator === \",\"\r\n decimalSeparator = \".\";\r\n }\r\n const newFormatProps = { ...formatProps, thousandSeparator, decimalSeparator };\r\n handleSetFormatProps(newFormatProps);\r\n }, [formatProps, isFormatTraitSet, handleSetFormatProps]);\r\n\r\n const useThousandSeparatorLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.useThousandSeparatorLabel\"));\r\n const thousandSeparatorLabel = React.useRef(UiIModelComponents.translate(\"QuantityFormat.labels.thousandSeparatorLabel\"));\r\n\r\n return (\r\n <>\r\n <span className={\"uicore-label\"}>{useThousandSeparatorLabel.current}</span>\r\n <Checkbox data-testid=\"use-thousands-separator\" checked={isFormatTraitSet(FormatTraits.Use1000Separator)} onChange={handleUseThousandsSeparatorChange} />\r\n <span className={classnames(\"uicore-label\", !(isFormatTraitSet(FormatTraits.Use1000Separator)) && \"uicore-disabled\")}>{thousandSeparatorLabel.current}</span>\r\n <ThousandsSelector data-testid=\"thousands-separator-selector\" separator={formatProps.thousandSeparator ?? \",\"} disabled={!isFormatTraitSet(FormatTraits.Use1000Separator)} onChange={handleThousandSeparatorChange} />\r\n </>\r\n );\r\n}\r\n"]}
|
|
@@ -76,8 +76,6 @@ export interface TimelineComponentProps {
|
|
|
76
76
|
}
|
|
77
77
|
/** @internal */
|
|
78
78
|
interface TimelineComponentState {
|
|
79
|
-
/** Settings popup is opened or closed */
|
|
80
|
-
isSettingsOpen: boolean;
|
|
81
79
|
/** True if timeline is currently playing, false if paused */
|
|
82
80
|
isPlaying: boolean;
|
|
83
81
|
/** Minimized mode (For future use. This will always be true) */
|
|
@@ -99,7 +97,6 @@ export declare class TimelineComponent extends React.Component<TimelineComponent
|
|
|
99
97
|
private _timeLastCycle;
|
|
100
98
|
private _requestFrame;
|
|
101
99
|
private _unmounted;
|
|
102
|
-
private _settings;
|
|
103
100
|
private _repeatLabel;
|
|
104
101
|
private _removeListener?;
|
|
105
102
|
private _standardTimelineMenuItems;
|
|
@@ -120,13 +117,10 @@ export declare class TimelineComponent extends React.Component<TimelineComponent
|
|
|
120
117
|
private _displayTime;
|
|
121
118
|
private _getMilliseconds;
|
|
122
119
|
private _onTotalDurationChange;
|
|
123
|
-
private _onSettingsClick;
|
|
124
|
-
private _onCloseSettings;
|
|
125
120
|
private _changeRepeatSetting;
|
|
126
121
|
private _onRepeatChanged;
|
|
127
122
|
private _currentDate;
|
|
128
123
|
private _onSetTotalDuration;
|
|
129
|
-
private _createMenuItemNodes;
|
|
130
124
|
private _createMenuItemNode;
|
|
131
125
|
private _renderSettings;
|
|
132
126
|
render(): JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineComponent.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/timeline/TimelineComponent.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,0BAA0B,CAAC;AAElC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TimelineComponent.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/timeline/TimelineComponent.tsx"],"names":[],"mappings":"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"}
|
|
@@ -9,13 +9,13 @@ import "./TimelineComponent.scss";
|
|
|
9
9
|
import classnames from "classnames";
|
|
10
10
|
import * as React from "react";
|
|
11
11
|
import { UiAdmin } from "@itwin/appui-abstract";
|
|
12
|
-
import { ContextMenu, ContextMenuDirection, ContextMenuItem } from "@itwin/core-react";
|
|
13
12
|
import { toDateString, toTimeString, UiComponents } from "@itwin/components-react";
|
|
14
13
|
import { UiIModelComponents } from "../UiIModelComponents";
|
|
15
14
|
import { InlineEdit } from "./InlineEdit";
|
|
16
15
|
import { TimelinePausePlayAction } from "./interfaces";
|
|
17
16
|
import { PlayButton, PlayerButton } from "./PlayerButton";
|
|
18
17
|
import { Scrubber } from "./Scrubber";
|
|
18
|
+
import { DropdownMenu, MenuDivider, MenuItem } from "@itwin/itwinui-react";
|
|
19
19
|
// cspell:ignore millisec
|
|
20
20
|
const slowSpeed = 60 * 1000;
|
|
21
21
|
const mediumSpeed = 20 * 1000;
|
|
@@ -30,7 +30,6 @@ export class TimelineComponent extends React.Component {
|
|
|
30
30
|
this._timeLastCycle = 0;
|
|
31
31
|
this._requestFrame = 0;
|
|
32
32
|
this._unmounted = false;
|
|
33
|
-
this._settings = null;
|
|
34
33
|
this._standardTimelineMenuItems = [
|
|
35
34
|
{ label: UiIModelComponents.translate("timeline.slow"), timelineDuration: slowSpeed },
|
|
36
35
|
{ label: UiIModelComponents.translate("timeline.medium"), timelineDuration: mediumSpeed },
|
|
@@ -155,16 +154,10 @@ export class TimelineComponent extends React.Component {
|
|
|
155
154
|
const milliseconds = this._getMilliseconds(value);
|
|
156
155
|
this._onSetTotalDuration(milliseconds);
|
|
157
156
|
};
|
|
158
|
-
this._onSettingsClick = () => {
|
|
159
|
-
this.setState((prevState) => ({ isSettingsOpen: !prevState.isSettingsOpen }));
|
|
160
|
-
};
|
|
161
|
-
this._onCloseSettings = () => {
|
|
162
|
-
this.setState({ isSettingsOpen: false });
|
|
163
|
-
};
|
|
164
157
|
this._changeRepeatSetting = (newValue) => {
|
|
165
158
|
// istanbul ignore else
|
|
166
159
|
if (newValue !== undefined) {
|
|
167
|
-
this.setState(() => ({ repeat: newValue
|
|
160
|
+
this.setState(() => ({ repeat: newValue }), () => {
|
|
168
161
|
// istanbul ignore else
|
|
169
162
|
if (this.props.onSettingsChange) {
|
|
170
163
|
this.props.onSettingsChange({ loop: this.state.repeat });
|
|
@@ -173,7 +166,7 @@ export class TimelineComponent extends React.Component {
|
|
|
173
166
|
}
|
|
174
167
|
};
|
|
175
168
|
this._onRepeatChanged = () => {
|
|
176
|
-
this.setState((prevState) => ({ repeat: !prevState.repeat
|
|
169
|
+
this.setState((prevState) => ({ repeat: !prevState.repeat }), () => {
|
|
177
170
|
// istanbul ignore else
|
|
178
171
|
if (this.props.onSettingsChange) {
|
|
179
172
|
this.props.onSettingsChange({ loop: this.state.repeat });
|
|
@@ -189,7 +182,7 @@ export class TimelineComponent extends React.Component {
|
|
|
189
182
|
return new Date();
|
|
190
183
|
};
|
|
191
184
|
this._onSetTotalDuration = (milliseconds) => {
|
|
192
|
-
this.setState({ totalDuration: milliseconds
|
|
185
|
+
this.setState({ totalDuration: milliseconds }, () => {
|
|
193
186
|
// istanbul ignore else
|
|
194
187
|
if (this.props.onSettingsChange) {
|
|
195
188
|
this.props.onSettingsChange({ duration: milliseconds });
|
|
@@ -197,31 +190,40 @@ export class TimelineComponent extends React.Component {
|
|
|
197
190
|
});
|
|
198
191
|
};
|
|
199
192
|
this._renderSettings = () => {
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
else {
|
|
206
|
-
if (this.props.appMenuItemOption === "append") {
|
|
207
|
-
contextMenuItems = this._standardTimelineMenuItems.concat(this.props.appMenuItems);
|
|
208
|
-
}
|
|
209
|
-
else if (this.props.appMenuItemOption === "prefix") {
|
|
210
|
-
contextMenuItems = this.props.appMenuItems.concat(this._standardTimelineMenuItems);
|
|
193
|
+
const createMenuItemNodes = (close) => {
|
|
194
|
+
const { totalDuration } = this.state;
|
|
195
|
+
let contextMenuItems = [];
|
|
196
|
+
if (!this.props.appMenuItems) {
|
|
197
|
+
contextMenuItems = this._standardTimelineMenuItems;
|
|
211
198
|
}
|
|
212
199
|
else {
|
|
213
|
-
|
|
200
|
+
if (this.props.appMenuItemOption === "append") {
|
|
201
|
+
contextMenuItems = this._standardTimelineMenuItems.concat(this.props.appMenuItems);
|
|
202
|
+
}
|
|
203
|
+
else if (this.props.appMenuItemOption === "prefix") {
|
|
204
|
+
contextMenuItems = this.props.appMenuItems.concat(this._standardTimelineMenuItems);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
contextMenuItems = this.props.appMenuItems;
|
|
208
|
+
}
|
|
214
209
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
210
|
+
const itemNodes = [];
|
|
211
|
+
let keyIndex = 0;
|
|
212
|
+
if (this.state.includeRepeat) {
|
|
213
|
+
const checked = this.state.repeat;
|
|
214
|
+
const icon = checked ? React.createElement("span", { className: "icon icon-checkmark" }) : React.createElement("span", null);
|
|
215
|
+
itemNodes.push(React.createElement(MenuItem, { key: ++keyIndex, onClick: () => { this._onRepeatChanged(); close(); }, icon: icon }, this._repeatLabel));
|
|
216
|
+
itemNodes.push(React.createElement(MenuDivider, { key: ++keyIndex }));
|
|
217
|
+
}
|
|
218
|
+
contextMenuItems.forEach((item, index) => {
|
|
219
|
+
itemNodes.push(this._createMenuItemNode(item, index + keyIndex + 1, totalDuration, close));
|
|
220
|
+
});
|
|
221
|
+
return itemNodes;
|
|
222
|
+
};
|
|
223
|
+
return (React.createElement(DropdownMenu, { menuItems: createMenuItemNodes },
|
|
224
|
+
React.createElement("span", { "data-testid": "timeline-settings", className: "timeline-settings icon icon-more-vertical-2", role: "button", tabIndex: -1, title: UiComponents.translate("button.label.settings") })));
|
|
222
225
|
};
|
|
223
226
|
this.state = {
|
|
224
|
-
isSettingsOpen: false,
|
|
225
227
|
isPlaying: false,
|
|
226
228
|
minimized: true,
|
|
227
229
|
currentDuration: props.initialDuration ? props.initialDuration : /* istanbul ignore next */ 0,
|
|
@@ -293,22 +295,11 @@ export class TimelineComponent extends React.Component {
|
|
|
293
295
|
return Number(time) * 1000;
|
|
294
296
|
}
|
|
295
297
|
}
|
|
296
|
-
|
|
297
|
-
const itemNodes = [];
|
|
298
|
-
itemList.forEach((item, index) => {
|
|
299
|
-
const reactItem = this._createMenuItemNode(item, index, currentTimelineDuration);
|
|
300
|
-
// istanbul ignore else
|
|
301
|
-
if (reactItem)
|
|
302
|
-
itemNodes.push(reactItem);
|
|
303
|
-
});
|
|
304
|
-
return itemNodes;
|
|
305
|
-
}
|
|
306
|
-
_createMenuItemNode(item, index, currentTimelineDuration) {
|
|
307
|
-
let node = null;
|
|
298
|
+
_createMenuItemNode(item, index, currentTimelineDuration, close) {
|
|
308
299
|
const label = item.label;
|
|
309
|
-
const
|
|
310
|
-
|
|
311
|
-
return
|
|
300
|
+
const checked = currentTimelineDuration === item.timelineDuration;
|
|
301
|
+
const icon = checked ? React.createElement("span", { className: "icon icon-checkmark" }) : React.createElement("span", null);
|
|
302
|
+
return (React.createElement(MenuItem, { key: index, icon: icon, onClick: () => { this._onSetTotalDuration(item.timelineDuration); close(); } }, label));
|
|
312
303
|
}
|
|
313
304
|
render() {
|
|
314
305
|
const { startDate, endDate, showDuration, timeZoneOffset } = this.props;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimelineComponent.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/timeline/TimelineComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Timeline\r\n */\r\n\r\nimport \"./TimelineComponent.scss\";\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { GenericUiEventArgs, UiAdmin } from \"@itwin/appui-abstract\";\r\nimport { ContextMenu, ContextMenuDirection, ContextMenuItem } from \"@itwin/core-react\";\r\nimport { toDateString, toTimeString, UiComponents } from \"@itwin/components-react\";\r\nimport { UiIModelComponents } from \"../UiIModelComponents\";\r\nimport { InlineEdit } from \"./InlineEdit\";\r\nimport { PlaybackSettings, TimelinePausePlayAction, TimelinePausePlayArgs } from \"./interfaces\";\r\nimport { PlayButton, PlayerButton } from \"./PlayerButton\";\r\nimport { Scrubber } from \"./Scrubber\";\r\n\r\n// cspell:ignore millisec\r\n\r\nconst slowSpeed = 60 * 1000;\r\nconst mediumSpeed = 20 * 1000;\r\nconst fastSpeed = 10 * 1000;\r\n/**\r\n * [[TimelineMenuItemOption]]: specifies how the app wants the timeline speeds to be installed on the TimelineComponent's ContextMenu\r\n * \"replace\" : use the app-supplied items in place of the standard items\r\n * \"append\" : add the app-supplied items following the standard items\r\n * \"prefix\" : add the app-supplied items before the standard items\r\n *\r\n * @public\r\n */\r\nexport type TimelineMenuItemOption = \"replace\" | \"append\" | \"prefix\";\r\n/**\r\n * [[TimelineMenuItemProps]] specifies playback speed entries in the Timeline's ContextMenu\r\n * @public\r\n */\r\nexport interface TimelineMenuItemProps {\r\n /** localized label for menu item */\r\n label: string;\r\n\r\n /** duration for the entire timeline to play */\r\n timelineDuration: number;\r\n}\r\n/** TimelineDateMarkerProps: Mark a date on the timeline with an indicator\r\n * @public\r\n */\r\nexport interface TimelineDateMarkerProps {\r\n /** Date to mark. If undefined, today's date will be used. */\r\n date?: Date;\r\n /** ReactNode to use as the marker on the timeline. If undefined, a short vertical bar will mark the date. */\r\n dateMarker?: React.ReactNode;\r\n}\r\n/**\r\n * [[TimelineComponentProps]] configure the timeline\r\n * @public\r\n */\r\nexport interface TimelineComponentProps {\r\n /** Start date: beginning of the date range of a date-based timeline. */\r\n startDate?: Date;\r\n /** End date: end of the date range of a date-based timeline. */\r\n endDate?: Date;\r\n /** Total duration: range of the timeline in milliseconds. */\r\n totalDuration: number;\r\n /** Initial value for the current duration (the location of the thumb) in milliseconds */\r\n initialDuration?: number;\r\n /** Show in minimized mode (For future use. This prop will always be treated as true.) */\r\n minimized?: boolean;\r\n /** When playing, repeat indefinitely */\r\n repeat?: boolean;\r\n /** Show duration instead of time */\r\n showDuration?: boolean;\r\n /** Callback with current duration value (as a fraction) */\r\n onChange?: (duration: number) => void;\r\n /** Callback triggered when play/pause button is pressed */\r\n onPlayPause?: (playing: boolean) => void;\r\n /** Callback triggered when backward/forward buttons are pressed */\r\n onJump?: (forward: boolean) => void;\r\n /** Callback triggered when a setting is changed */\r\n onSettingsChange?: (arg: PlaybackSettings) => void;\r\n /** Always display in miniMode with no expand menu (For future use. This prop will always be treated as true) */\r\n alwaysMinimized?: boolean;\r\n /** ComponentId -- must be set to use TimelineComponentEvents */\r\n componentId?: string;\r\n /** Include the repeat option on the Timeline Context Menu */\r\n includeRepeat?: boolean;\r\n /** App-supplied speed entries in the Timeline Context Menu */\r\n appMenuItems?: TimelineMenuItemProps[];\r\n /** How to include the supplied app menu items in the Timeline Context Menu (prefix, append, replace)*/\r\n appMenuItemOption?: TimelineMenuItemOption;\r\n /** Display date and time offset by the number of minutes specified. When undefined - local timezone will be used */\r\n timeZoneOffset?: number;\r\n /** Display a marker on the timeline rail to indicate current date - will only work if starDate and endDate are defined */\r\n markDate?: TimelineDateMarkerProps;\r\n\r\n}\r\n/** @internal */\r\ninterface TimelineComponentState {\r\n /** Settings popup is opened or closed */\r\n isSettingsOpen: boolean;\r\n /** True if timeline is currently playing, false if paused */\r\n isPlaying: boolean;\r\n /** Minimized mode (For future use. This will always be true) */\r\n minimized?: boolean;\r\n /** Current duration in milliseconds */\r\n currentDuration: number;\r\n /** Total duration in milliseconds */\r\n totalDuration: number;\r\n /** If true, automatically restart when the timeline is finished playing */\r\n repeat: boolean;\r\n /** If true, include the repeat option in the timeline context menu */\r\n includeRepeat: boolean;\r\n}\r\n\r\n/**\r\n * [[TimelineComponent]] is used to playback timeline data\r\n * @public\r\n */\r\nexport class TimelineComponent extends React.Component<TimelineComponentProps, TimelineComponentState> {\r\n private _timeLastCycle = 0;\r\n private _requestFrame = 0;\r\n private _unmounted = false;\r\n private _settings: HTMLElement | null = null;\r\n private _repeatLabel: string;\r\n private _removeListener?: () => void;\r\n private _standardTimelineMenuItems: TimelineMenuItemProps[] = [\r\n { label: UiIModelComponents.translate(\"timeline.slow\"), timelineDuration: slowSpeed },\r\n { label: UiIModelComponents.translate(\"timeline.medium\"), timelineDuration: mediumSpeed },\r\n { label: UiIModelComponents.translate(\"timeline.fast\"), timelineDuration: fastSpeed },\r\n ];\r\n\r\n constructor(props: TimelineComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isSettingsOpen: false,\r\n isPlaying: false,\r\n minimized: true,\r\n currentDuration: props.initialDuration ? props.initialDuration : /* istanbul ignore next */ 0,\r\n totalDuration: this.props.totalDuration,\r\n repeat: this.props.repeat ? true : false,\r\n includeRepeat: this.props.includeRepeat || this.props.includeRepeat === undefined ? true : false,\r\n };\r\n\r\n this._repeatLabel = UiIModelComponents.translate(\"timeline.repeat\");\r\n // istanbul ignore else\r\n if (this.props.componentId) { // can't handle an event if we have no id\r\n this._removeListener = UiAdmin.onGenericUiEvent.addListener(this._handleTimelinePausePlayEvent);\r\n }\r\n }\r\n\r\n public override componentWillUnmount() {\r\n if (this._removeListener)\r\n this._removeListener();\r\n window.cancelAnimationFrame(this._requestFrame);\r\n this._unmounted = true;\r\n }\r\n\r\n public override shouldComponentUpdate(nextProps: TimelineComponentProps, nextState: TimelineComponentState) {\r\n let result = false;\r\n\r\n // istanbul ignore next\r\n if (nextState !== this.state || nextProps !== this.props ||\r\n nextProps.startDate !== this.props.startDate ||\r\n nextProps.endDate !== this.props.endDate ||\r\n nextProps.initialDuration !== this.props.initialDuration ||\r\n nextProps.repeat !== this.props.repeat\r\n )\r\n result = true;\r\n\r\n return result;\r\n }\r\n\r\n public override componentDidUpdate(prevProps: TimelineComponentProps) {\r\n // istanbul ignore else\r\n if (this.props.initialDuration !== prevProps.initialDuration) {\r\n this._setDuration(this.props.initialDuration ? this.props.initialDuration : /* istanbul ignore next */ 0);\r\n }\r\n\r\n // istanbul ignore else\r\n if (this.props.repeat !== prevProps.repeat) {\r\n this._changeRepeatSetting(this.props.repeat);\r\n }\r\n\r\n // istanbul ignore else\r\n if (this.props.totalDuration !== prevProps.totalDuration) {\r\n this._onSetTotalDuration(this.props.totalDuration);\r\n }\r\n }\r\n private _handleTimelinePausePlayEvent = (args: GenericUiEventArgs): void => {\r\n const timelineArgs = args as TimelinePausePlayArgs;\r\n // istanbul ignore else\r\n if (!timelineArgs || this.props.componentId !== timelineArgs.uiComponentId || timelineArgs.timelineAction === undefined)\r\n return;\r\n\r\n let startPlaying: boolean;\r\n switch (timelineArgs.timelineAction) {\r\n case TimelinePausePlayAction.Play:\r\n startPlaying = true;\r\n break;\r\n case TimelinePausePlayAction.Pause:\r\n startPlaying = false;\r\n break;\r\n case TimelinePausePlayAction.Toggle:\r\n startPlaying = !this.state.isPlaying;\r\n break;\r\n // istanbul ignore next\r\n default:\r\n return; // throw error?\r\n }\r\n if (startPlaying)\r\n this._onPlay();\r\n else\r\n this._onPause();\r\n };\r\n\r\n // user clicked backward button\r\n private _onBackward = () => {\r\n // istanbul ignore else\r\n if (this.props.onJump)\r\n this.props.onJump(false);\r\n };\r\n\r\n // user clicked forward button\r\n private _onForward = () => {\r\n // istanbul ignore else\r\n if (this.props.onJump)\r\n this.props.onJump(true);\r\n };\r\n\r\n // user clicked play button\r\n private _onPlay = () => {\r\n // istanbul ignore if\r\n if (this.state.isPlaying)\r\n return;\r\n\r\n // timeline was complete, restart from the beginning\r\n if (this.state.currentDuration >= this.state.totalDuration) {\r\n this._replay();\r\n } else\r\n this._play();\r\n\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(true);\r\n };\r\n\r\n // user clicked pause button\r\n private _onPause = () => {\r\n // istanbul ignore if\r\n if (!this.state.isPlaying)\r\n return;\r\n\r\n // stop requesting frames\r\n window.cancelAnimationFrame(this._requestFrame);\r\n\r\n // stop playing\r\n this.setState({ isPlaying: false });\r\n\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(false);\r\n };\r\n\r\n // user clicked on timeline rail or dragged scrubber handle\r\n private _onTimelineChange = (values: ReadonlyArray<number>) => {\r\n const currentDuration = values[0];\r\n this._setDuration(currentDuration);\r\n };\r\n\r\n // set the current duration, which will call the OnChange callback\r\n private _setDuration = (currentDuration: number) => {\r\n this._timeLastCycle = new Date().getTime();\r\n // istanbul ignore else\r\n if (!this._unmounted)\r\n this.setState({ currentDuration });\r\n // istanbul ignore else\r\n if (this.props.onChange) {\r\n const fraction = currentDuration / this.state.totalDuration;\r\n this.props.onChange(fraction);\r\n }\r\n };\r\n\r\n // recursively update the animation until we hit the end or the pause button is clicked\r\n private _updateAnimation = (_timestamp: number) => {\r\n // istanbul ignore else\r\n if (!this.state.isPlaying && !this._unmounted) {\r\n return;\r\n }\r\n\r\n // update duration\r\n const currentTime = new Date().getTime();\r\n const millisecondsElapsed = currentTime - this._timeLastCycle;\r\n const duration = this.state.currentDuration + millisecondsElapsed;\r\n this._setDuration(duration);\r\n\r\n // stop the animation!\r\n if (duration >= this.state.totalDuration) {\r\n window.cancelAnimationFrame(this._requestFrame);\r\n this.setState({ isPlaying: false });\r\n if (this.state.repeat)\r\n this._replay();\r\n else {\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(false);\r\n }\r\n\r\n return;\r\n }\r\n\r\n // continue the animation - request the next frame\r\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\r\n };\r\n\r\n private _play() {\r\n // start playing\r\n this.setState({ isPlaying: true }, () => {\r\n // request the next frame\r\n this._timeLastCycle = new Date().getTime();\r\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\r\n });\r\n }\r\n\r\n private _replay = () => {\r\n // timeline was complete, restart from the beginning\r\n this.setState({ currentDuration: 0 }, (() => this._play()));\r\n };\r\n\r\n private _displayTime(millisec: number) {\r\n const addZero = (i: number) => {\r\n return (i < 10) ? `0${i}` : i;\r\n };\r\n\r\n const date = new Date(millisec);\r\n // const hours = date.getUTCHours();\r\n const minutes = date.getUTCMinutes();\r\n const seconds = date.getUTCSeconds();\r\n return `${addZero(minutes)}:${addZero(seconds)}`;\r\n }\r\n\r\n private _getMilliseconds(time: string) {\r\n // istanbul ignore else - WIP\r\n if (time.indexOf(\":\") !== -1) {\r\n return (Number(time.split(\":\")[0]) * 60 + Number(time.split(\":\")[1])) * 1000;\r\n } else {\r\n return Number(time) * 1000;\r\n }\r\n }\r\n\r\n // user changed the total duration\r\n private _onTotalDurationChange = (value: string) => {\r\n // NOTE: we should reset the current duration to 0\r\n const milliseconds = this._getMilliseconds(value);\r\n this._onSetTotalDuration(milliseconds);\r\n };\r\n\r\n private _onSettingsClick = () => {\r\n this.setState((prevState) => ({ isSettingsOpen: !prevState.isSettingsOpen }));\r\n };\r\n\r\n private _onCloseSettings = () => {\r\n this.setState({ isSettingsOpen: false });\r\n };\r\n\r\n private _changeRepeatSetting = (newValue?: boolean) => {\r\n // istanbul ignore else\r\n if (newValue !== undefined) {\r\n this.setState(\r\n () => ({ repeat: newValue, isSettingsOpen: false }),\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ loop: this.state.repeat });\r\n }\r\n });\r\n }\r\n };\r\n\r\n private _onRepeatChanged = () => {\r\n this.setState(\r\n (prevState) => ({ repeat: !prevState.repeat, isSettingsOpen: false }),\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ loop: this.state.repeat });\r\n }\r\n });\r\n };\r\n\r\n private _currentDate = (): Date => {\r\n const fraction = this.state.currentDuration / this.state.totalDuration;\r\n if (this.props.endDate && this.props.startDate) {\r\n const timeElapsed = (this.props.endDate.getTime() - this.props.startDate.getTime()) * fraction;\r\n return new Date(this.props.startDate.getTime() + timeElapsed);\r\n }\r\n return new Date();\r\n };\r\n\r\n private _onSetTotalDuration = (milliseconds: number) => {\r\n this.setState(\r\n { totalDuration: milliseconds, isSettingsOpen: false },\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ duration: milliseconds });\r\n }\r\n });\r\n };\r\n private _createMenuItemNodes(itemList: TimelineMenuItemProps[], currentTimelineDuration: number): React.ReactNode[] {\r\n const itemNodes: React.ReactNode[] = [];\r\n\r\n itemList.forEach((item: TimelineMenuItemProps, index: number) => {\r\n const reactItem = this._createMenuItemNode(item, index, currentTimelineDuration);\r\n // istanbul ignore else\r\n if (reactItem)\r\n itemNodes.push(reactItem);\r\n });\r\n\r\n return itemNodes;\r\n }\r\n\r\n private _createMenuItemNode(item: TimelineMenuItemProps, index: number, currentTimelineDuration: number): React.ReactNode {\r\n let node: React.ReactNode = null;\r\n const label = item.label;\r\n const iconSpec = currentTimelineDuration === item.timelineDuration ? \"icon icon-checkmark\" : undefined;\r\n\r\n node = (\r\n <ContextMenuItem key={index} onSelect={() => this._onSetTotalDuration(item.timelineDuration)} icon={iconSpec} >\r\n {label}\r\n </ContextMenuItem>\r\n );\r\n return node;\r\n }\r\n\r\n private _renderSettings = () => {\r\n const { totalDuration } = this.state;\r\n let contextMenuItems: Array<TimelineMenuItemProps> = [];\r\n\r\n if (!this.props.appMenuItems) {\r\n contextMenuItems = this._standardTimelineMenuItems;\r\n } else {\r\n if (this.props.appMenuItemOption === \"append\") {\r\n contextMenuItems = this._standardTimelineMenuItems.concat(this.props.appMenuItems);\r\n } else if (this.props.appMenuItemOption === \"prefix\") {\r\n contextMenuItems = this.props.appMenuItems.concat(this._standardTimelineMenuItems);\r\n } else {\r\n contextMenuItems = this.props.appMenuItems;\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\r\n <span data-testid=\"timeline-settings\" className=\"timeline-settings icon icon-more-vertical-2\" ref={(element) => this._settings = element} onClick={this._onSettingsClick}\r\n role=\"button\" tabIndex={-1} title={UiComponents.translate(\"button.label.settings\")}\r\n ></span>\r\n <ContextMenu opened={this.state.isSettingsOpen} onOutsideClick={this._onCloseSettings} direction={ContextMenuDirection.BottomRight} data-testid=\"timeline-contextmenu-div\">\r\n {this.state.includeRepeat && <ContextMenuItem icon={this.state.repeat && \"icon icon-checkmark\"} onSelect={this._onRepeatChanged}>{this._repeatLabel}</ContextMenuItem>}\r\n {this.state.includeRepeat && <div className=\"separator\" role=\"separator\" />}\r\n {this._createMenuItemNodes(contextMenuItems, totalDuration)}\r\n </ContextMenu>\r\n </>\r\n );\r\n };\r\n\r\n public override render() {\r\n const { startDate, endDate, showDuration, timeZoneOffset } = this.props;\r\n const { currentDuration, totalDuration, minimized } = this.state;\r\n const currentDate = this._currentDate();\r\n const durationString = this._displayTime(currentDuration);\r\n const totalDurationString = this._displayTime(totalDuration);\r\n const hasDates = !!startDate && !!endDate;\r\n\r\n return (\r\n <div data-testid=\"timeline-component\" className={classnames(\"timeline-component\", !!minimized && \"minimized\", hasDates && \"has-dates\")} >\r\n <div className=\"header\">\r\n <PlayButton className=\"play-button\" isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause} data-testid=\"timeline-play\" />\r\n <PlayerButton className=\"play-backward\" icon=\"icon-caret-left\" onClick={this._onBackward}\r\n title={UiIModelComponents.translate(\"timeline.backward\")} />\r\n <PlayerButton className=\"play-button-step\" icon=\"icon-media-controls-circular-play\"\r\n isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause}\r\n title={UiIModelComponents.translate(\"timeline.step\")} />\r\n <PlayerButton className=\"play-forward\" icon=\"icon-caret-right\" onClick={this._onForward}\r\n title={UiIModelComponents.translate(\"timeline.backward\")} />\r\n <span className=\"current-date\">{toDateString(currentDate, timeZoneOffset)}</span>\r\n </div>\r\n <div className=\"scrubber\">\r\n <PlayButton className=\"play-button\" isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause} />\r\n <div className=\"start-time-container\">\r\n {hasDates && <span data-testid=\"test-start-date\" className=\"start-date\">{toDateString(startDate, timeZoneOffset)}</span>}\r\n {hasDates && !showDuration && <span data-testid=\"test-start-time\" className=\"start-time\">{toTimeString(startDate, timeZoneOffset)}</span>}\r\n {showDuration && <span className=\"duration-start-time\">{durationString}</span>}\r\n </div>\r\n <Scrubber\r\n className=\"slider\"\r\n currentDuration={this.state.currentDuration}\r\n totalDuration={totalDuration}\r\n startDate={startDate}\r\n endDate={endDate}\r\n isPlaying={this.state.isPlaying}\r\n inMiniMode={!!minimized}\r\n showTime={!showDuration}\r\n onChange={this._onTimelineChange}\r\n onUpdate={this._onTimelineChange}\r\n timeZoneOffset={this.props.timeZoneOffset}\r\n markDate={this.props.markDate}\r\n />\r\n <div className=\"end-time-container\">\r\n {hasDates && <span className=\"end-date\">{toDateString(endDate, timeZoneOffset)}</span>}\r\n {hasDates && !showDuration && <span className=\"end-time\">{toTimeString(endDate, timeZoneOffset)}</span>}\r\n {showDuration && <InlineEdit className=\"duration-end-time\" defaultValue={totalDurationString} onChange={this._onTotalDurationChange} />}\r\n </div>\r\n {minimized && this._renderSettings()}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"TimelineComponent.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/timeline/TimelineComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Timeline\r\n */\r\n\r\nimport \"./TimelineComponent.scss\";\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { GenericUiEventArgs, UiAdmin } from \"@itwin/appui-abstract\";\r\nimport { toDateString, toTimeString, UiComponents } from \"@itwin/components-react\";\r\nimport { UiIModelComponents } from \"../UiIModelComponents\";\r\nimport { InlineEdit } from \"./InlineEdit\";\r\nimport { PlaybackSettings, TimelinePausePlayAction, TimelinePausePlayArgs } from \"./interfaces\";\r\nimport { PlayButton, PlayerButton } from \"./PlayerButton\";\r\nimport { Scrubber } from \"./Scrubber\";\r\nimport { DropdownMenu, MenuDivider, MenuItem } from \"@itwin/itwinui-react\";\r\n\r\n// cspell:ignore millisec\r\n\r\nconst slowSpeed = 60 * 1000;\r\nconst mediumSpeed = 20 * 1000;\r\nconst fastSpeed = 10 * 1000;\r\n/**\r\n * [[TimelineMenuItemOption]]: specifies how the app wants the timeline speeds to be installed on the TimelineComponent's ContextMenu\r\n * \"replace\" : use the app-supplied items in place of the standard items\r\n * \"append\" : add the app-supplied items following the standard items\r\n * \"prefix\" : add the app-supplied items before the standard items\r\n *\r\n * @public\r\n */\r\nexport type TimelineMenuItemOption = \"replace\" | \"append\" | \"prefix\";\r\n/**\r\n * [[TimelineMenuItemProps]] specifies playback speed entries in the Timeline's ContextMenu\r\n * @public\r\n */\r\nexport interface TimelineMenuItemProps {\r\n /** localized label for menu item */\r\n label: string;\r\n\r\n /** duration for the entire timeline to play */\r\n timelineDuration: number;\r\n}\r\n/** TimelineDateMarkerProps: Mark a date on the timeline with an indicator\r\n * @public\r\n */\r\nexport interface TimelineDateMarkerProps {\r\n /** Date to mark. If undefined, today's date will be used. */\r\n date?: Date;\r\n /** ReactNode to use as the marker on the timeline. If undefined, a short vertical bar will mark the date. */\r\n dateMarker?: React.ReactNode;\r\n}\r\n/**\r\n * [[TimelineComponentProps]] configure the timeline\r\n * @public\r\n */\r\nexport interface TimelineComponentProps {\r\n /** Start date: beginning of the date range of a date-based timeline. */\r\n startDate?: Date;\r\n /** End date: end of the date range of a date-based timeline. */\r\n endDate?: Date;\r\n /** Total duration: range of the timeline in milliseconds. */\r\n totalDuration: number;\r\n /** Initial value for the current duration (the location of the thumb) in milliseconds */\r\n initialDuration?: number;\r\n /** Show in minimized mode (For future use. This prop will always be treated as true.) */\r\n minimized?: boolean;\r\n /** When playing, repeat indefinitely */\r\n repeat?: boolean;\r\n /** Show duration instead of time */\r\n showDuration?: boolean;\r\n /** Callback with current duration value (as a fraction) */\r\n onChange?: (duration: number) => void;\r\n /** Callback triggered when play/pause button is pressed */\r\n onPlayPause?: (playing: boolean) => void;\r\n /** Callback triggered when backward/forward buttons are pressed */\r\n onJump?: (forward: boolean) => void;\r\n /** Callback triggered when a setting is changed */\r\n onSettingsChange?: (arg: PlaybackSettings) => void;\r\n /** Always display in miniMode with no expand menu (For future use. This prop will always be treated as true) */\r\n alwaysMinimized?: boolean;\r\n /** ComponentId -- must be set to use TimelineComponentEvents */\r\n componentId?: string;\r\n /** Include the repeat option on the Timeline Context Menu */\r\n includeRepeat?: boolean;\r\n /** App-supplied speed entries in the Timeline Context Menu */\r\n appMenuItems?: TimelineMenuItemProps[];\r\n /** How to include the supplied app menu items in the Timeline Context Menu (prefix, append, replace)*/\r\n appMenuItemOption?: TimelineMenuItemOption;\r\n /** Display date and time offset by the number of minutes specified. When undefined - local timezone will be used */\r\n timeZoneOffset?: number;\r\n /** Display a marker on the timeline rail to indicate current date - will only work if starDate and endDate are defined */\r\n markDate?: TimelineDateMarkerProps;\r\n\r\n}\r\n/** @internal */\r\ninterface TimelineComponentState {\r\n /** True if timeline is currently playing, false if paused */\r\n isPlaying: boolean;\r\n /** Minimized mode (For future use. This will always be true) */\r\n minimized?: boolean;\r\n /** Current duration in milliseconds */\r\n currentDuration: number;\r\n /** Total duration in milliseconds */\r\n totalDuration: number;\r\n /** If true, automatically restart when the timeline is finished playing */\r\n repeat: boolean;\r\n /** If true, include the repeat option in the timeline context menu */\r\n includeRepeat: boolean;\r\n}\r\n\r\n/**\r\n * [[TimelineComponent]] is used to playback timeline data\r\n * @public\r\n */\r\nexport class TimelineComponent extends React.Component<TimelineComponentProps, TimelineComponentState> {\r\n private _timeLastCycle = 0;\r\n private _requestFrame = 0;\r\n private _unmounted = false;\r\n private _repeatLabel: string;\r\n private _removeListener?: () => void;\r\n private _standardTimelineMenuItems: TimelineMenuItemProps[] = [\r\n { label: UiIModelComponents.translate(\"timeline.slow\"), timelineDuration: slowSpeed },\r\n { label: UiIModelComponents.translate(\"timeline.medium\"), timelineDuration: mediumSpeed },\r\n { label: UiIModelComponents.translate(\"timeline.fast\"), timelineDuration: fastSpeed },\r\n ];\r\n\r\n constructor(props: TimelineComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isPlaying: false,\r\n minimized: true,\r\n currentDuration: props.initialDuration ? props.initialDuration : /* istanbul ignore next */ 0,\r\n totalDuration: this.props.totalDuration,\r\n repeat: this.props.repeat ? true : false,\r\n includeRepeat: this.props.includeRepeat || this.props.includeRepeat === undefined ? true : false,\r\n };\r\n\r\n this._repeatLabel = UiIModelComponents.translate(\"timeline.repeat\");\r\n // istanbul ignore else\r\n if (this.props.componentId) { // can't handle an event if we have no id\r\n this._removeListener = UiAdmin.onGenericUiEvent.addListener(this._handleTimelinePausePlayEvent);\r\n }\r\n }\r\n\r\n public override componentWillUnmount() {\r\n if (this._removeListener)\r\n this._removeListener();\r\n window.cancelAnimationFrame(this._requestFrame);\r\n this._unmounted = true;\r\n }\r\n\r\n public override shouldComponentUpdate(nextProps: TimelineComponentProps, nextState: TimelineComponentState) {\r\n let result = false;\r\n\r\n // istanbul ignore next\r\n if (nextState !== this.state || nextProps !== this.props ||\r\n nextProps.startDate !== this.props.startDate ||\r\n nextProps.endDate !== this.props.endDate ||\r\n nextProps.initialDuration !== this.props.initialDuration ||\r\n nextProps.repeat !== this.props.repeat\r\n )\r\n result = true;\r\n\r\n return result;\r\n }\r\n\r\n public override componentDidUpdate(prevProps: TimelineComponentProps) {\r\n // istanbul ignore else\r\n if (this.props.initialDuration !== prevProps.initialDuration) {\r\n this._setDuration(this.props.initialDuration ? this.props.initialDuration : /* istanbul ignore next */ 0);\r\n }\r\n\r\n // istanbul ignore else\r\n if (this.props.repeat !== prevProps.repeat) {\r\n this._changeRepeatSetting(this.props.repeat);\r\n }\r\n\r\n // istanbul ignore else\r\n if (this.props.totalDuration !== prevProps.totalDuration) {\r\n this._onSetTotalDuration(this.props.totalDuration);\r\n }\r\n }\r\n private _handleTimelinePausePlayEvent = (args: GenericUiEventArgs): void => {\r\n const timelineArgs = args as TimelinePausePlayArgs;\r\n // istanbul ignore else\r\n if (!timelineArgs || this.props.componentId !== timelineArgs.uiComponentId || timelineArgs.timelineAction === undefined)\r\n return;\r\n\r\n let startPlaying: boolean;\r\n switch (timelineArgs.timelineAction) {\r\n case TimelinePausePlayAction.Play:\r\n startPlaying = true;\r\n break;\r\n case TimelinePausePlayAction.Pause:\r\n startPlaying = false;\r\n break;\r\n case TimelinePausePlayAction.Toggle:\r\n startPlaying = !this.state.isPlaying;\r\n break;\r\n // istanbul ignore next\r\n default:\r\n return; // throw error?\r\n }\r\n if (startPlaying)\r\n this._onPlay();\r\n else\r\n this._onPause();\r\n };\r\n\r\n // user clicked backward button\r\n private _onBackward = () => {\r\n // istanbul ignore else\r\n if (this.props.onJump)\r\n this.props.onJump(false);\r\n };\r\n\r\n // user clicked forward button\r\n private _onForward = () => {\r\n // istanbul ignore else\r\n if (this.props.onJump)\r\n this.props.onJump(true);\r\n };\r\n\r\n // user clicked play button\r\n private _onPlay = () => {\r\n // istanbul ignore if\r\n if (this.state.isPlaying)\r\n return;\r\n\r\n // timeline was complete, restart from the beginning\r\n if (this.state.currentDuration >= this.state.totalDuration) {\r\n this._replay();\r\n } else\r\n this._play();\r\n\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(true);\r\n };\r\n\r\n // user clicked pause button\r\n private _onPause = () => {\r\n // istanbul ignore if\r\n if (!this.state.isPlaying)\r\n return;\r\n\r\n // stop requesting frames\r\n window.cancelAnimationFrame(this._requestFrame);\r\n\r\n // stop playing\r\n this.setState({ isPlaying: false });\r\n\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(false);\r\n };\r\n\r\n // user clicked on timeline rail or dragged scrubber handle\r\n private _onTimelineChange = (values: ReadonlyArray<number>) => {\r\n const currentDuration = values[0];\r\n this._setDuration(currentDuration);\r\n };\r\n\r\n // set the current duration, which will call the OnChange callback\r\n private _setDuration = (currentDuration: number) => {\r\n this._timeLastCycle = new Date().getTime();\r\n // istanbul ignore else\r\n if (!this._unmounted)\r\n this.setState({ currentDuration });\r\n // istanbul ignore else\r\n if (this.props.onChange) {\r\n const fraction = currentDuration / this.state.totalDuration;\r\n this.props.onChange(fraction);\r\n }\r\n };\r\n\r\n // recursively update the animation until we hit the end or the pause button is clicked\r\n private _updateAnimation = (_timestamp: number) => {\r\n // istanbul ignore else\r\n if (!this.state.isPlaying && !this._unmounted) {\r\n return;\r\n }\r\n\r\n // update duration\r\n const currentTime = new Date().getTime();\r\n const millisecondsElapsed = currentTime - this._timeLastCycle;\r\n const duration = this.state.currentDuration + millisecondsElapsed;\r\n this._setDuration(duration);\r\n\r\n // stop the animation!\r\n if (duration >= this.state.totalDuration) {\r\n window.cancelAnimationFrame(this._requestFrame);\r\n this.setState({ isPlaying: false });\r\n if (this.state.repeat)\r\n this._replay();\r\n else {\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(false);\r\n }\r\n\r\n return;\r\n }\r\n\r\n // continue the animation - request the next frame\r\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\r\n };\r\n\r\n private _play() {\r\n // start playing\r\n this.setState({ isPlaying: true }, () => {\r\n // request the next frame\r\n this._timeLastCycle = new Date().getTime();\r\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\r\n });\r\n }\r\n\r\n private _replay = () => {\r\n // timeline was complete, restart from the beginning\r\n this.setState({ currentDuration: 0 }, (() => this._play()));\r\n };\r\n\r\n private _displayTime(millisec: number) {\r\n const addZero = (i: number) => {\r\n return (i < 10) ? `0${i}` : i;\r\n };\r\n\r\n const date = new Date(millisec);\r\n // const hours = date.getUTCHours();\r\n const minutes = date.getUTCMinutes();\r\n const seconds = date.getUTCSeconds();\r\n return `${addZero(minutes)}:${addZero(seconds)}`;\r\n }\r\n\r\n private _getMilliseconds(time: string) {\r\n // istanbul ignore else - WIP\r\n if (time.indexOf(\":\") !== -1) {\r\n return (Number(time.split(\":\")[0]) * 60 + Number(time.split(\":\")[1])) * 1000;\r\n } else {\r\n return Number(time) * 1000;\r\n }\r\n }\r\n\r\n // user changed the total duration\r\n private _onTotalDurationChange = (value: string) => {\r\n // NOTE: we should reset the current duration to 0\r\n const milliseconds = this._getMilliseconds(value);\r\n this._onSetTotalDuration(milliseconds);\r\n };\r\n\r\n private _changeRepeatSetting = (newValue?: boolean) => {\r\n // istanbul ignore else\r\n if (newValue !== undefined) {\r\n this.setState(\r\n () => ({ repeat: newValue}),\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ loop: this.state.repeat });\r\n }\r\n });\r\n }\r\n };\r\n\r\n private _onRepeatChanged = () => {\r\n this.setState(\r\n (prevState) => ({ repeat: !prevState.repeat}),\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ loop: this.state.repeat });\r\n }\r\n });\r\n };\r\n\r\n private _currentDate = (): Date => {\r\n const fraction = this.state.currentDuration / this.state.totalDuration;\r\n if (this.props.endDate && this.props.startDate) {\r\n const timeElapsed = (this.props.endDate.getTime() - this.props.startDate.getTime()) * fraction;\r\n return new Date(this.props.startDate.getTime() + timeElapsed);\r\n }\r\n return new Date();\r\n };\r\n\r\n private _onSetTotalDuration = (milliseconds: number) => {\r\n this.setState(\r\n { totalDuration: milliseconds},\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ duration: milliseconds });\r\n }\r\n });\r\n };\r\n\r\n private _createMenuItemNode(item: TimelineMenuItemProps, index: number, currentTimelineDuration: number, close: () => void): JSX.Element {\r\n const label = item.label;\r\n const checked = currentTimelineDuration === item.timelineDuration;\r\n const icon = checked ? <span className=\"icon icon-checkmark\" />:<span />;\r\n return (\r\n <MenuItem key={index} icon={icon}\r\n onClick={() => {this._onSetTotalDuration(item.timelineDuration); close();}} >\r\n {label}\r\n </MenuItem>\r\n );\r\n }\r\n\r\n private _renderSettings = () => {\r\n const createMenuItemNodes = (close: () => void): JSX.Element[] => {\r\n\r\n const { totalDuration } = this.state;\r\n let contextMenuItems: Array<TimelineMenuItemProps> = [];\r\n\r\n if (!this.props.appMenuItems) {\r\n contextMenuItems = this._standardTimelineMenuItems;\r\n } else {\r\n if (this.props.appMenuItemOption === \"append\") {\r\n contextMenuItems = this._standardTimelineMenuItems.concat(this.props.appMenuItems);\r\n } else if (this.props.appMenuItemOption === \"prefix\") {\r\n contextMenuItems = this.props.appMenuItems.concat(this._standardTimelineMenuItems);\r\n } else {\r\n contextMenuItems = this.props.appMenuItems;\r\n }\r\n }\r\n\r\n const itemNodes: JSX.Element[] = [];\r\n let keyIndex = 0;\r\n if (this.state.includeRepeat) {\r\n const checked = this.state.repeat;\r\n const icon = checked ? <span className=\"icon icon-checkmark\" />:<span />;\r\n itemNodes.push (<MenuItem key={++keyIndex} onClick={()=>{this._onRepeatChanged(); close();}} icon={icon}>\r\n {this._repeatLabel}\r\n </MenuItem>);\r\n itemNodes.push (<MenuDivider key={++keyIndex} />);\r\n }\r\n\r\n contextMenuItems.forEach((item: TimelineMenuItemProps, index: number) => {\r\n itemNodes.push(this._createMenuItemNode(item, index+keyIndex+1, totalDuration, close));\r\n });\r\n\r\n return itemNodes;\r\n };\r\n\r\n return (\r\n <DropdownMenu menuItems={createMenuItemNodes}>\r\n <span data-testid=\"timeline-settings\" className=\"timeline-settings icon icon-more-vertical-2\"\r\n role=\"button\" tabIndex={-1} title={UiComponents.translate(\"button.label.settings\")}\r\n ></span>\r\n </DropdownMenu>\r\n );\r\n };\r\n\r\n public override render() {\r\n const { startDate, endDate, showDuration, timeZoneOffset } = this.props;\r\n const { currentDuration, totalDuration, minimized } = this.state;\r\n const currentDate = this._currentDate();\r\n const durationString = this._displayTime(currentDuration);\r\n const totalDurationString = this._displayTime(totalDuration);\r\n const hasDates = !!startDate && !!endDate;\r\n\r\n return (\r\n <div data-testid=\"timeline-component\" className={classnames(\"timeline-component\", !!minimized && \"minimized\", hasDates && \"has-dates\")} >\r\n <div className=\"header\">\r\n <PlayButton className=\"play-button\" isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause} data-testid=\"timeline-play\" />\r\n <PlayerButton className=\"play-backward\" icon=\"icon-caret-left\" onClick={this._onBackward}\r\n title={UiIModelComponents.translate(\"timeline.backward\")} />\r\n <PlayerButton className=\"play-button-step\" icon=\"icon-media-controls-circular-play\"\r\n isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause}\r\n title={UiIModelComponents.translate(\"timeline.step\")} />\r\n <PlayerButton className=\"play-forward\" icon=\"icon-caret-right\" onClick={this._onForward}\r\n title={UiIModelComponents.translate(\"timeline.backward\")} />\r\n <span className=\"current-date\">{toDateString(currentDate, timeZoneOffset)}</span>\r\n </div>\r\n <div className=\"scrubber\">\r\n <PlayButton className=\"play-button\" isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause} />\r\n <div className=\"start-time-container\">\r\n {hasDates && <span data-testid=\"test-start-date\" className=\"start-date\">{toDateString(startDate, timeZoneOffset)}</span>}\r\n {hasDates && !showDuration && <span data-testid=\"test-start-time\" className=\"start-time\">{toTimeString(startDate, timeZoneOffset)}</span>}\r\n {showDuration && <span className=\"duration-start-time\">{durationString}</span>}\r\n </div>\r\n <Scrubber\r\n className=\"slider\"\r\n currentDuration={this.state.currentDuration}\r\n totalDuration={totalDuration}\r\n startDate={startDate}\r\n endDate={endDate}\r\n isPlaying={this.state.isPlaying}\r\n inMiniMode={!!minimized}\r\n showTime={!showDuration}\r\n onChange={this._onTimelineChange}\r\n onUpdate={this._onTimelineChange}\r\n timeZoneOffset={this.props.timeZoneOffset}\r\n markDate={this.props.markDate}\r\n />\r\n <div className=\"end-time-container\">\r\n {hasDates && <span className=\"end-date\">{toDateString(endDate, timeZoneOffset)}</span>}\r\n {hasDates && !showDuration && <span className=\"end-time\">{toTimeString(endDate, timeZoneOffset)}</span>}\r\n {showDuration && <InlineEdit className=\"duration-end-time\" defaultValue={totalDurationString} onChange={this._onTotalDurationChange} />}\r\n </div>\r\n {minimized && this._renderSettings()}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|