@itwin/tree-widget-react 0.7.0 → 0.7.2

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.
@@ -25,8 +25,6 @@ export interface SearchBarProps extends CommonProps {
25
25
  /** Filtering is cleared after everything's loaded */
26
26
  onFilterStart: (newFilter: string) => void;
27
27
  /** Filtering is cleared after everything's loaded */
28
- onFilterCancel?: () => void;
29
- /** Filtering is cleared after everything's loaded */
30
28
  onFilterClear?: () => void;
31
29
  /** Total number of results/entries */
32
30
  resultCount: number;
@@ -74,7 +74,7 @@ class SearchBar extends React.PureComponent {
74
74
  React.createElement(itwinui_react_1.IconButton, { styleType: "borderless", size: "small" },
75
75
  React.createElement(itwinui_icons_react_1.SvgMore, null)))) }, this.props.children)),
76
76
  showSearch ? (React.createElement("div", { className: "search-bar-search-container" },
77
- React.createElement(SearchBox_1.SearchBox, { ref: this._searchBox, className: searchBoxClassName, searchText: value, valueChangedDelay: valueChangedDelay, placeholder: placeholder, onFilterCancel: this.props.onFilterCancel, onFilterClear: this.props.onFilterClear, onFilterStart: this.props.onFilterStart, resultCount: this.props.resultCount, onIconClick: this._onToggleSearch, onSelectedChanged: this.props.onSelectedChanged }))) : (React.createElement(itwinui_react_1.IconButton, { className: searchIconClassName, onClick: this._onToggleSearch, title: title, styleType: "borderless", size: "small" },
77
+ React.createElement(SearchBox_1.SearchBox, { ref: this._searchBox, className: searchBoxClassName, searchText: value, valueChangedDelay: valueChangedDelay, placeholder: placeholder, onClear: this.props.onFilterClear, onFilterStart: this.props.onFilterStart, resultCount: this.props.resultCount, onIconClick: this._onToggleSearch, onSelectedChanged: this.props.onSelectedChanged }))) : (React.createElement(itwinui_react_1.IconButton, { className: searchIconClassName, onClick: this._onToggleSearch, title: title, styleType: "borderless", size: "small" },
78
78
  React.createElement(itwinui_icons_react_1.SvgSearch, null)))));
79
79
  }
80
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SearchBar.js","sourceRoot":"","sources":["../../../../src/components/search-bar/SearchBar.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport * as React from \"react\";\nimport classnames from \"classnames\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { SearchBox } from \"./SearchBox\";\nimport \"./SearchBar.scss\";\nimport {\n ButtonGroup,\n DropdownMenu,\n IconButton,\n MenuItem,\n} from \"@itwin/itwinui-react\";\nimport { SvgMore, SvgSearch } from \"@itwin/itwinui-icons-react\";\n\nexport enum Alignment {\n Left = 0,\n Right = 1,\n}\n\nexport interface SearchBarProps extends CommonProps {\n /** value to set SearchBox */\n value?: string;\n /** Enable or disable dropdown functionality. If disabled, searchbox simply expands without displaying the group button */\n enableGrouping: boolean;\n /** show the search box in the open (expanded) state */\n showSearch?: boolean;\n /** alignment content to the left or right of the search bar */\n alignment?: Alignment;\n /** searchbox frequency to poll for changes in value (milliseconds) */\n valueChangedDelay?: number;\n /** searchbox placeholder value to show in gray before anything is entered in */\n placeholder?: string;\n /** title (tooltip) */\n title?: string;\n /** Tells the component if parent component is still handling the filtering */\n filteringInProgress?: boolean;\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** Filtering is cleared after everything's loaded */\n onFilterCancel?: () => void;\n /** Filtering is cleared after everything's loaded */\n onFilterClear?: () => void;\n /** Total number of results/entries */\n resultCount: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged: (index: number) => void;\n}\n\ninterface SearchBarState {\n showSearch: boolean;\n showDropdown: boolean;\n}\n\n/** SearchBox with expanding search box capability */\nexport class SearchBar extends React.PureComponent<\nSearchBarProps,\nSearchBarState\n> {\n private _searchBox = React.createRef<SearchBox>();\n\n public static defaultProps: Partial<SearchBarProps> = {\n alignment: Alignment.Right,\n enableGrouping: true,\n };\n\n constructor(props: any) {\n super(props);\n\n this.state = { showSearch: props.showSearch, showDropdown: false };\n }\n\n public async componentDidUpdate(prevProps: SearchBarProps) {\n if (prevProps.value !== this.props.value) {\n }\n }\n\n private _onToggleSearch = (\n _event?: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => {\n const showSearch = !this.state.showSearch;\n this.setState({ showSearch }, () => {\n if (showSearch && this._searchBox.current)\n setTimeout(() => {\n if (this._searchBox.current) this._searchBox.current.focus();\n }, 100); // timeout allows the search bar animation to complete!\n });\n };\n\n public render() {\n const {\n value,\n alignment,\n valueChangedDelay,\n placeholder,\n enableGrouping,\n title,\n } = this.props;\n const { showSearch } = this.state;\n\n const classes = classnames(\"tree-widget-search-bar\", this.props.className);\n const searchBoxClassName = classnames(\n \"search-bar-search-box\",\n showSearch && \"show\"\n );\n const searchIconClassName = classnames(\n \"search-bar-search-icon\",\n showSearch ? \"hide\" : \"show\"\n );\n const contentClassName = classnames(\n \"search-bar-button-container\",\n showSearch && \"contracted\",\n alignment === Alignment.Right && \"right\"\n );\n\n return (\n <div className={classes}>\n {enableGrouping && <div className={contentClassName}>\n <ButtonGroup\n overflowButton={(overflowStart) => (\n <DropdownMenu\n menuItems={() =>\n React.Children.toArray(this.props.children)\n .slice(overflowStart === 0 ? 0 : overflowStart - 1)\n .map((btn, index) => <MenuItem key={index}>{btn}</MenuItem>)\n }\n className=\"search-bar-dropdown-container\"\n >\n <IconButton styleType=\"borderless\" size=\"small\">\n <SvgMore />\n </IconButton>\n </DropdownMenu>\n )}\n >\n {this.props.children}\n </ButtonGroup>\n </div>}\n {showSearch ? (\n <div className=\"search-bar-search-container\">\n <SearchBox\n ref={this._searchBox}\n className={searchBoxClassName}\n searchText={value}\n valueChangedDelay={valueChangedDelay}\n placeholder={placeholder}\n onFilterCancel={this.props.onFilterCancel}\n onFilterClear={this.props.onFilterClear}\n onFilterStart={this.props.onFilterStart}\n resultCount={this.props.resultCount}\n onIconClick={this._onToggleSearch}\n onSelectedChanged={this.props.onSelectedChanged}\n />\n </div>\n ) : (\n <IconButton\n className={searchIconClassName}\n onClick={this._onToggleSearch}\n title={title}\n styleType=\"borderless\"\n size=\"small\"\n >\n <SvgSearch />\n </IconButton>\n )}\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"SearchBar.js","sourceRoot":"","sources":["../../../../src/components/search-bar/SearchBar.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport * as React from \"react\";\nimport classnames from \"classnames\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { SearchBox } from \"./SearchBox\";\nimport \"./SearchBar.scss\";\nimport {\n ButtonGroup,\n DropdownMenu,\n IconButton,\n MenuItem,\n} from \"@itwin/itwinui-react\";\nimport { SvgMore, SvgSearch } from \"@itwin/itwinui-icons-react\";\n\nexport enum Alignment {\n Left = 0,\n Right = 1,\n}\n\nexport interface SearchBarProps extends CommonProps {\n /** value to set SearchBox */\n value?: string;\n /** Enable or disable dropdown functionality. If disabled, searchbox simply expands without displaying the group button */\n enableGrouping: boolean;\n /** show the search box in the open (expanded) state */\n showSearch?: boolean;\n /** alignment content to the left or right of the search bar */\n alignment?: Alignment;\n /** searchbox frequency to poll for changes in value (milliseconds) */\n valueChangedDelay?: number;\n /** searchbox placeholder value to show in gray before anything is entered in */\n placeholder?: string;\n /** title (tooltip) */\n title?: string;\n /** Tells the component if parent component is still handling the filtering */\n filteringInProgress?: boolean;\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** Filtering is cleared after everything's loaded */\n onFilterClear?: () => void;\n /** Total number of results/entries */\n resultCount: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged: (index: number) => void;\n}\n\ninterface SearchBarState {\n showSearch: boolean;\n showDropdown: boolean;\n}\n\n/** SearchBox with expanding search box capability */\nexport class SearchBar extends React.PureComponent<\nSearchBarProps,\nSearchBarState\n> {\n private _searchBox = React.createRef<SearchBox>();\n\n public static defaultProps: Partial<SearchBarProps> = {\n alignment: Alignment.Right,\n enableGrouping: true,\n };\n\n constructor(props: any) {\n super(props);\n\n this.state = { showSearch: props.showSearch, showDropdown: false };\n }\n\n public async componentDidUpdate(prevProps: SearchBarProps) {\n if (prevProps.value !== this.props.value) {\n }\n }\n\n private _onToggleSearch = (\n _event?: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => {\n const showSearch = !this.state.showSearch;\n this.setState({ showSearch }, () => {\n if (showSearch && this._searchBox.current)\n setTimeout(() => {\n if (this._searchBox.current) this._searchBox.current.focus();\n }, 100); // timeout allows the search bar animation to complete!\n });\n };\n\n public render() {\n const {\n value,\n alignment,\n valueChangedDelay,\n placeholder,\n enableGrouping,\n title,\n } = this.props;\n const { showSearch } = this.state;\n\n const classes = classnames(\"tree-widget-search-bar\", this.props.className);\n const searchBoxClassName = classnames(\n \"search-bar-search-box\",\n showSearch && \"show\"\n );\n const searchIconClassName = classnames(\n \"search-bar-search-icon\",\n showSearch ? \"hide\" : \"show\"\n );\n const contentClassName = classnames(\n \"search-bar-button-container\",\n showSearch && \"contracted\",\n alignment === Alignment.Right && \"right\"\n );\n\n return (\n <div className={classes}>\n {enableGrouping && <div className={contentClassName}>\n <ButtonGroup\n overflowButton={(overflowStart) => (\n <DropdownMenu\n menuItems={() =>\n React.Children.toArray(this.props.children)\n .slice(overflowStart === 0 ? 0 : overflowStart - 1)\n .map((btn, index) => <MenuItem key={index}>{btn}</MenuItem>)\n }\n className=\"search-bar-dropdown-container\"\n >\n <IconButton styleType=\"borderless\" size=\"small\">\n <SvgMore />\n </IconButton>\n </DropdownMenu>\n )}\n >\n {this.props.children}\n </ButtonGroup>\n </div>}\n {showSearch ? (\n <div className=\"search-bar-search-container\">\n <SearchBox\n ref={this._searchBox}\n className={searchBoxClassName}\n searchText={value}\n valueChangedDelay={valueChangedDelay}\n placeholder={placeholder}\n onClear={this.props.onFilterClear}\n onFilterStart={this.props.onFilterStart}\n resultCount={this.props.resultCount}\n onIconClick={this._onToggleSearch}\n onSelectedChanged={this.props.onSelectedChanged}\n />\n </div>\n ) : (\n <IconButton\n className={searchIconClassName}\n onClick={this._onToggleSearch}\n title={title}\n styleType=\"borderless\"\n size=\"small\"\n >\n <SvgSearch />\n </IconButton>\n )}\n </div>\n );\n }\n}\n"]}
@@ -19,10 +19,6 @@ export interface SearchBoxProps extends CommonProps {
19
19
  onIconClick?: () => void;
20
20
  /** Filtering is cleared after everything's loaded */
21
21
  onFilterStart: (newFilter: string) => void;
22
- /** Filtering is cleared after everything's loaded */
23
- onFilterClear?: () => void;
24
- /** Filtering is cleared after everything's loaded */
25
- onFilterCancel?: () => void;
26
22
  /** Tells the component if parent component is still handling the filtering */
27
23
  filteringInProgress?: boolean;
28
24
  /** Total number of results/entries */
@@ -1 +1 @@
1
- {"version":3,"file":"SearchBox.js","sourceRoot":"","sources":["../../../../src/components/search-bar/SearchBox.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @module SearchBox */\n\nimport * as React from \"react\";\nimport classnames from \"classnames\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { IconButton } from \"../IconButton\";\nimport \"./SearchBox.scss\";\nimport { TreeWidget } from \"../../TreeWidget\";\n\nexport interface SearchBoxProps extends CommonProps {\n /** value to set SearchBox */\n searchText?: string;\n /** placeholder value to show in gray before anything is entered in */\n placeholder?: string;\n /** frequency to poll for changes in value */\n valueChangedDelay?: number;\n /** listens for <Enter> keypress */\n onEnterPressed?: () => void;\n /** listens for <Esc> keypress */\n onEscPressed?: () => void;\n /** listens for onClick event for Clear (x) icon */\n onClear?: () => void;\n /** Search or clear icon click */\n onIconClick?: () => void;\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** Filtering is cleared after everything's loaded */\n onFilterClear?: () => void;\n /** Filtering is cleared after everything's loaded */\n onFilterCancel?: () => void;\n /** Tells the component if parent component is still handling the filtering */\n filteringInProgress?: boolean;\n /** Total number of results/entries */\n resultCount: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged: (index: number) => void;\n}\n\n/**\n * Enumeration of possible component contexts\n * @internal\n */\nexport enum InputContext {\n /** Component is ready to filter */\n ReadyToFilter,\n /** Component's parent is currently filtering */\n FilteringInProgress,\n /** Component's parent has finished filtering */\n FilteringFinished,\n /** Component's parent has finished filtering, but ResultSelector(stepping through results) is not enabled */\n FilteringFinishedWithNoStepping,\n}\n\ninterface SearchBoxState {\n searchText?: string;\n /** @internal */\n context: InputContext;\n /** Currently selected index */\n selectedIndex: number;\n}\n\nexport class SearchBox extends React.PureComponent<\nSearchBoxProps,\nSearchBoxState\n> {\n private _inputElement: HTMLInputElement | null = null;\n private _timeoutId: number = 0;\n\n constructor(props: SearchBoxProps) {\n super(props);\n\n this.state = {\n searchText: this.props.searchText,\n context: InputContext.ReadyToFilter,\n selectedIndex: 0,\n };\n }\n\n public focus() {\n // istanbul ignore else\n if (this._inputElement) {\n this._inputElement.focus();\n }\n }\n\n private _trackChange = (_event?: any): void => {\n let searchText = \"\";\n\n // istanbul ignore else\n if (this._inputElement) searchText = this._inputElement.value;\n\n this.setState(\n (_prevState) => {\n return { searchText };\n },\n () => {\n if (this.props.valueChangedDelay) {\n this._unsetTimeout();\n this._timeoutId = window.setTimeout(() => {\n this.setState({\n context: InputContext.ReadyToFilter,\n selectedIndex: 0,\n });\n this.props.onSelectedChanged(0);\n this.props.onFilterStart(this.state.searchText!);\n }, this.props.valueChangedDelay);\n } else {\n this.setState({ context: InputContext.ReadyToFilter });\n this.props.onFilterStart(this.state.searchText!);\n }\n }\n );\n };\n\n private _handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"Escape\":\n // istanbul ignore else\n if (this.props.onEscPressed) this.props.onEscPressed();\n break;\n case \"Enter\":\n // istanbul ignore else\n if (this.props.onEnterPressed) this.props.onEnterPressed();\n break;\n }\n };\n\n private _handleIconClick = (): void => {\n // istanbul ignore else\n if (this._inputElement) {\n const clear = this.state.searchText !== \"\";\n this._inputElement.value = \"\";\n // istanbul ignore else\n if (clear && this.props.onClear) this.props.onClear();\n this._inputElement.focus();\n }\n this._trackChange();\n if (this.props.onIconClick) this.props.onIconClick();\n };\n\n private _unsetTimeout = (): void => {\n if (this._timeoutId) {\n window.clearTimeout(this._timeoutId);\n this._timeoutId = 0;\n }\n };\n\n public async componentDidUpdate(prevProps: SearchBoxProps) {\n if (prevProps.searchText !== this.props.searchText) {\n const searchText = this.props.searchText;\n this.setState({ searchText });\n }\n\n this.focus();\n }\n\n public componentWillUnmount() {\n this._unsetTimeout();\n }\n\n /** @internal */\n public static getDerivedStateFromProps(\n props: SearchBoxProps,\n state: SearchBoxState\n ) {\n if (\n state.context === InputContext.FilteringInProgress &&\n !props.filteringInProgress\n ) {\n if (state.searchText) return { context: InputContext.FilteringFinished };\n else return { context: InputContext.FilteringFinishedWithNoStepping };\n } else if (\n state.context === InputContext.ReadyToFilter &&\n props.filteringInProgress\n ) {\n return { context: InputContext.FilteringInProgress };\n }\n return null;\n }\n\n private _onPrevClick = () => {\n if (this.state.selectedIndex > 1) {\n this.props.onSelectedChanged(this.state.selectedIndex - 1);\n this.setState((state) => ({ selectedIndex: state.selectedIndex - 1 }));\n }\n };\n\n private _onNextClick = () => {\n if (this.state.selectedIndex < this.props.resultCount) {\n this.props.onSelectedChanged(this.state.selectedIndex + 1);\n this.setState((state) => ({ selectedIndex: state.selectedIndex + 1 }));\n }\n };\n\n public render() {\n const {\n className,\n style,\n resultCount,\n placeholder,\n } = this.props;\n const { searchText, selectedIndex } = this.state;\n const searchClassName = classnames(\"tree-widget-searchbox\", className);\n const showCount = resultCount > 0;\n const isPrevEnabled = selectedIndex > 1;\n const isNextEnabled = selectedIndex < resultCount;\n\n return (\n <div className={searchClassName} style={style}>\n <input\n value={searchText}\n ref={(el) => {\n this._inputElement = el;\n }}\n onChange={this._trackChange}\n onKeyDown={this._handleKeyDown}\n onPaste={this._trackChange}\n onCut={this._trackChange}\n placeholder={\n placeholder ? placeholder : TreeWidget.translate(\"searchbox.search\")\n }\n />\n <div className=\"searchbox-stepping-container\">\n {showCount && (\n <span className=\"searchbox-stepping-count\">{`${selectedIndex}/${resultCount}`}</span>\n )}\n <div className=\"searchbox-separator\" />\n <IconButton\n className=\"searchbox-step-button\"\n icon=\"icon-chevron-up\"\n disabled={!isPrevEnabled}\n onClick={this._onPrevClick}\n title=\"Previous\"\n />\n <IconButton\n className=\"searchbox-step-button\"\n icon=\"icon-chevron-down\"\n disabled={!isNextEnabled}\n onClick={this._onNextClick}\n title=\"Next\"\n />\n </div>\n <span\n className=\"searchbox-step-button icon icon-close searchbox-close-button\"\n onClick={this._handleIconClick}\n onKeyDown={this._handleIconClick}\n role=\"button\"\n tabIndex={0}\n />\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"SearchBox.js","sourceRoot":"","sources":["../../../../src/components/search-bar/SearchBox.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @module SearchBox */\n\nimport * as React from \"react\";\nimport classnames from \"classnames\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { IconButton } from \"../IconButton\";\nimport \"./SearchBox.scss\";\nimport { TreeWidget } from \"../../TreeWidget\";\n\nexport interface SearchBoxProps extends CommonProps {\n /** value to set SearchBox */\n searchText?: string;\n /** placeholder value to show in gray before anything is entered in */\n placeholder?: string;\n /** frequency to poll for changes in value */\n valueChangedDelay?: number;\n /** listens for <Enter> keypress */\n onEnterPressed?: () => void;\n /** listens for <Esc> keypress */\n onEscPressed?: () => void;\n /** listens for onClick event for Clear (x) icon */\n onClear?: () => void;\n /** Search or clear icon click */\n onIconClick?: () => void;\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** Tells the component if parent component is still handling the filtering */\n filteringInProgress?: boolean;\n /** Total number of results/entries */\n resultCount: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged: (index: number) => void;\n}\n\n/**\n * Enumeration of possible component contexts\n * @internal\n */\nexport enum InputContext {\n /** Component is ready to filter */\n ReadyToFilter,\n /** Component's parent is currently filtering */\n FilteringInProgress,\n /** Component's parent has finished filtering */\n FilteringFinished,\n /** Component's parent has finished filtering, but ResultSelector(stepping through results) is not enabled */\n FilteringFinishedWithNoStepping,\n}\n\ninterface SearchBoxState {\n searchText?: string;\n /** @internal */\n context: InputContext;\n /** Currently selected index */\n selectedIndex: number;\n}\n\nexport class SearchBox extends React.PureComponent<\nSearchBoxProps,\nSearchBoxState\n> {\n private _inputElement: HTMLInputElement | null = null;\n private _timeoutId: number = 0;\n\n constructor(props: SearchBoxProps) {\n super(props);\n\n this.state = {\n searchText: this.props.searchText,\n context: InputContext.ReadyToFilter,\n selectedIndex: 0,\n };\n }\n\n public focus() {\n // istanbul ignore else\n if (this._inputElement) {\n this._inputElement.focus();\n }\n }\n\n private _trackChange = (_event?: any): void => {\n let searchText = \"\";\n\n // istanbul ignore else\n if (this._inputElement) searchText = this._inputElement.value;\n\n this.setState(\n (_prevState) => {\n return { searchText };\n },\n () => {\n if (this.props.valueChangedDelay) {\n this._unsetTimeout();\n this._timeoutId = window.setTimeout(() => {\n this.setState({\n context: InputContext.ReadyToFilter,\n selectedIndex: 0,\n });\n this.props.onSelectedChanged(0);\n this.props.onFilterStart(this.state.searchText!);\n }, this.props.valueChangedDelay);\n } else {\n this.setState({ context: InputContext.ReadyToFilter });\n this.props.onFilterStart(this.state.searchText!);\n }\n }\n );\n };\n\n private _handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"Escape\":\n // istanbul ignore else\n if (this.props.onEscPressed) this.props.onEscPressed();\n break;\n case \"Enter\":\n // istanbul ignore else\n if (this.props.onEnterPressed) this.props.onEnterPressed();\n break;\n }\n };\n\n private _handleIconClick = (): void => {\n // istanbul ignore else\n if (this._inputElement) {\n const clear = this.state.searchText !== \"\";\n this._inputElement.value = \"\";\n // istanbul ignore else\n if (clear && this.props.onClear) this.props.onClear();\n this._inputElement.focus();\n }\n this._trackChange();\n if (this.props.onIconClick) this.props.onIconClick();\n };\n\n private _unsetTimeout = (): void => {\n if (this._timeoutId) {\n window.clearTimeout(this._timeoutId);\n this._timeoutId = 0;\n }\n };\n\n public async componentDidUpdate(prevProps: SearchBoxProps) {\n if (prevProps.searchText !== this.props.searchText) {\n const searchText = this.props.searchText;\n this.setState({ searchText });\n }\n\n this.focus();\n }\n\n public componentWillUnmount() {\n this._unsetTimeout();\n }\n\n /** @internal */\n public static getDerivedStateFromProps(\n props: SearchBoxProps,\n state: SearchBoxState\n ) {\n if (\n state.context === InputContext.FilteringInProgress &&\n !props.filteringInProgress\n ) {\n if (state.searchText) return { context: InputContext.FilteringFinished };\n else return { context: InputContext.FilteringFinishedWithNoStepping };\n } else if (\n state.context === InputContext.ReadyToFilter &&\n props.filteringInProgress\n ) {\n return { context: InputContext.FilteringInProgress };\n }\n return null;\n }\n\n private _onPrevClick = () => {\n if (this.state.selectedIndex > 1) {\n this.props.onSelectedChanged(this.state.selectedIndex - 1);\n this.setState((state) => ({ selectedIndex: state.selectedIndex - 1 }));\n }\n };\n\n private _onNextClick = () => {\n if (this.state.selectedIndex < this.props.resultCount) {\n this.props.onSelectedChanged(this.state.selectedIndex + 1);\n this.setState((state) => ({ selectedIndex: state.selectedIndex + 1 }));\n }\n };\n\n public render() {\n const {\n className,\n style,\n resultCount,\n placeholder,\n } = this.props;\n const { searchText, selectedIndex } = this.state;\n const searchClassName = classnames(\"tree-widget-searchbox\", className);\n const showCount = resultCount > 0;\n const isPrevEnabled = selectedIndex > 1;\n const isNextEnabled = selectedIndex < resultCount;\n\n return (\n <div className={searchClassName} style={style}>\n <input\n value={searchText}\n ref={(el) => {\n this._inputElement = el;\n }}\n onChange={this._trackChange}\n onKeyDown={this._handleKeyDown}\n onPaste={this._trackChange}\n onCut={this._trackChange}\n placeholder={\n placeholder ? placeholder : TreeWidget.translate(\"searchbox.search\")\n }\n />\n <div className=\"searchbox-stepping-container\">\n {showCount && (\n <span className=\"searchbox-stepping-count\">{`${selectedIndex}/${resultCount}`}</span>\n )}\n <div className=\"searchbox-separator\" />\n <IconButton\n className=\"searchbox-step-button\"\n icon=\"icon-chevron-up\"\n disabled={!isPrevEnabled}\n onClick={this._onPrevClick}\n title=\"Previous\"\n />\n <IconButton\n className=\"searchbox-step-button\"\n icon=\"icon-chevron-down\"\n disabled={!isNextEnabled}\n onClick={this._onNextClick}\n title=\"Next\"\n />\n </div>\n <span\n className=\"searchbox-step-button icon icon-close searchbox-close-button\"\n onClick={this._handleIconClick}\n onKeyDown={this._handleIconClick}\n role=\"button\"\n tabIndex={0}\n />\n </div>\n );\n }\n}\n"]}
@@ -62,7 +62,7 @@ function CategoriesTreeComponentImpl(props) {
62
62
  })();
63
63
  }, [filteredProvider]);
64
64
  return (react_1.default.createElement(react_1.default.Fragment, null,
65
- react_1.default.createElement(SearchBar_1.SearchBar, { value: "", valueChangedDelay: 500, placeholder: TreeWidget_1.TreeWidget.translate("search"), title: TreeWidget_1.TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterCancel: searchOptions.onFilterCancel, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: (_a = searchOptions.matchedResultCount) !== null && _a !== void 0 ? _a : 0 }, props.headerButtons
65
+ react_1.default.createElement(SearchBar_1.SearchBar, { value: "", valueChangedDelay: 500, placeholder: TreeWidget_1.TreeWidget.translate("search"), title: TreeWidget_1.TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: (_a = searchOptions.matchedResultCount) !== null && _a !== void 0 ? _a : 0 }, props.headerButtons
66
66
  ? props.headerButtons.map((btn, index) => react_1.default.createElement(react_1.default.Fragment, { key: index }, btn({ viewport: props.viewport, categories, filteredCategories })))
67
67
  : [
68
68
  react_1.default.createElement(ShowAllButton, { viewport: props.viewport, categories: categories, filteredCategories: filteredCategories, key: "show-all-btn" }),
@@ -1 +1 @@
1
- {"version":3,"file":"CategoriesTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/category-tree/CategoriesTreeComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport \"./CategoriesTree.scss\";\nimport React, { useEffect, useState } from \"react\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { IModelApp, IModelConnection, ScreenViewport } from \"@itwin/core-frontend\";\nimport { CategoryTree } from \"./CategoriesTree\";\nimport { CategoryInfo, CategoryVisibilityHandler, useCategories } from \"./CategoryVisibilityHandler\";\nimport { enableCategory } from \"../CategoriesVisibilityUtils\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport type { CategoriesTreeHeaderButtonProps, CategoriesTreeProps } from \"../../../types\";\nimport type { IPresentationTreeDataProvider } from \"@itwin/presentation-components\";\nimport { IconButton } from \"../../IconButton\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { SearchBar } from \"../../search-bar/SearchBar\";\n\nexport function CategoriesTreeComponent(props: CategoriesTreeProps) {\n const iModel = useActiveIModelConnection();\n const viewport = useActiveViewport();\n\n if (!iModel || !viewport) {\n return null;\n }\n\n return (\n <CategoriesTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />\n );\n}\n\nCategoriesTreeComponent.ShowAllButton = ShowAllButton;\nCategoriesTreeComponent.HideAllButton = HideAllButton;\nCategoriesTreeComponent.InvertButton = InvertButton;\n\nfunction CategoriesTreeComponentImpl(props: CategoriesTreeProps & { iModel: IModelConnection, viewport: ScreenViewport }) {\n const categories = useCategories(IModelApp.viewManager, props.iModel, props.viewport);\n const [filteredCategories, setFilteredCategories] = useState<CategoryInfo[]>();\n const {\n searchOptions,\n filterString,\n activeMatchIndex,\n onFilterApplied,\n filteredProvider,\n } = useTreeFilteringState();\n\n useEffect(() => {\n (async () => {\n if (filteredProvider)\n setFilteredCategories((await getFilteredCategories(filteredProvider)).map((category) => ({ categoryId: category })));\n else\n setFilteredCategories(undefined);\n })();\n }, [filteredProvider]);\n\n return (\n <>\n <SearchBar\n value=\"\"\n valueChangedDelay={500}\n placeholder={TreeWidget.translate(\"search\")}\n title={TreeWidget.translate(\"searchForSomething\")}\n filteringInProgress={searchOptions.isFiltering}\n onFilterCancel={searchOptions.onFilterCancel}\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount ?? 0}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) =>\n <React.Fragment key={index}>\n {btn({ viewport: props.viewport, categories, filteredCategories })}\n </React.Fragment>)\n : [\n <ShowAllButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"show-all-btn\" />,\n <HideAllButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"hide-all-btn\" />,\n <InvertButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"invert-all-btn\" />,\n ]\n }\n </SearchBar>\n <AutoSizer>\n {({ width, height }) => (\n <CategoryTree\n {...props}\n categories={categories}\n width={width}\n height={height}\n filterInfo={{ filter: filterString, activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </>\n );\n}\n\nasync function getFilteredCategories(filteredProvider: IPresentationTreeDataProvider) {\n const nodes = await filteredProvider.getNodes();\n return nodes.map((node) => CategoryVisibilityHandler.getInstanceIdFromTreeNodeKey(filteredProvider.getNodeKey(node)));\n}\n\nfunction ShowAllButton(props: CategoriesTreeHeaderButtonProps) {\n const showAll = () => {\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n (props.filteredCategories ?? props.categories).map((category) => category.categoryId),\n true,\n true,\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n />\n );\n}\n\nfunction HideAllButton(props: CategoriesTreeHeaderButtonProps) {\n const hideAll = () => {\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n (props.filteredCategories ?? props.categories).map((category) => category.categoryId),\n false,\n true,\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility-hide-2\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n />\n );\n}\n\nfunction InvertButton(props: CategoriesTreeHeaderButtonProps) {\n const invert = () => {\n const ids = (props.filteredCategories ?? props.categories).map((category) => category.categoryId);\n\n const enabled: string[] = [];\n const disabled: string[] = [];\n for (const id of ids) {\n if (props.viewport.view.viewsCategory(id)) {\n enabled.push(id);\n } else {\n disabled.push(id);\n }\n }\n // Disable enabled\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n enabled,\n false,\n true\n );\n\n // Enable disabled\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n disabled,\n true,\n true\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n title={TreeWidget.translate(\"invert\")}\n icon=\"icon-visibility-invert\"\n onClick={invert}\n />\n );\n}\n"]}
1
+ {"version":3,"file":"CategoriesTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/category-tree/CategoriesTreeComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport \"./CategoriesTree.scss\";\nimport React, { useEffect, useState } from \"react\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { IModelApp, IModelConnection, ScreenViewport } from \"@itwin/core-frontend\";\nimport { CategoryTree } from \"./CategoriesTree\";\nimport { CategoryInfo, CategoryVisibilityHandler, useCategories } from \"./CategoryVisibilityHandler\";\nimport { enableCategory } from \"../CategoriesVisibilityUtils\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport type { CategoriesTreeHeaderButtonProps, CategoriesTreeProps } from \"../../../types\";\nimport type { IPresentationTreeDataProvider } from \"@itwin/presentation-components\";\nimport { IconButton } from \"../../IconButton\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { SearchBar } from \"../../search-bar/SearchBar\";\n\nexport function CategoriesTreeComponent(props: CategoriesTreeProps) {\n const iModel = useActiveIModelConnection();\n const viewport = useActiveViewport();\n\n if (!iModel || !viewport) {\n return null;\n }\n\n return (\n <CategoriesTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />\n );\n}\n\nCategoriesTreeComponent.ShowAllButton = ShowAllButton;\nCategoriesTreeComponent.HideAllButton = HideAllButton;\nCategoriesTreeComponent.InvertButton = InvertButton;\n\nfunction CategoriesTreeComponentImpl(props: CategoriesTreeProps & { iModel: IModelConnection, viewport: ScreenViewport }) {\n const categories = useCategories(IModelApp.viewManager, props.iModel, props.viewport);\n const [filteredCategories, setFilteredCategories] = useState<CategoryInfo[]>();\n const {\n searchOptions,\n filterString,\n activeMatchIndex,\n onFilterApplied,\n filteredProvider,\n } = useTreeFilteringState();\n\n useEffect(() => {\n (async () => {\n if (filteredProvider)\n setFilteredCategories((await getFilteredCategories(filteredProvider)).map((category) => ({ categoryId: category })));\n else\n setFilteredCategories(undefined);\n })();\n }, [filteredProvider]);\n\n return (\n <>\n <SearchBar\n value=\"\"\n valueChangedDelay={500}\n placeholder={TreeWidget.translate(\"search\")}\n title={TreeWidget.translate(\"searchForSomething\")}\n filteringInProgress={searchOptions.isFiltering}\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount ?? 0}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) =>\n <React.Fragment key={index}>\n {btn({ viewport: props.viewport, categories, filteredCategories })}\n </React.Fragment>)\n : [\n <ShowAllButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"show-all-btn\" />,\n <HideAllButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"hide-all-btn\" />,\n <InvertButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"invert-all-btn\" />,\n ]\n }\n </SearchBar>\n <AutoSizer>\n {({ width, height }) => (\n <CategoryTree\n {...props}\n categories={categories}\n width={width}\n height={height}\n filterInfo={{ filter: filterString, activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </>\n );\n}\n\nasync function getFilteredCategories(filteredProvider: IPresentationTreeDataProvider) {\n const nodes = await filteredProvider.getNodes();\n return nodes.map((node) => CategoryVisibilityHandler.getInstanceIdFromTreeNodeKey(filteredProvider.getNodeKey(node)));\n}\n\nfunction ShowAllButton(props: CategoriesTreeHeaderButtonProps) {\n const showAll = () => {\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n (props.filteredCategories ?? props.categories).map((category) => category.categoryId),\n true,\n true,\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n />\n );\n}\n\nfunction HideAllButton(props: CategoriesTreeHeaderButtonProps) {\n const hideAll = () => {\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n (props.filteredCategories ?? props.categories).map((category) => category.categoryId),\n false,\n true,\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility-hide-2\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n />\n );\n}\n\nfunction InvertButton(props: CategoriesTreeHeaderButtonProps) {\n const invert = () => {\n const ids = (props.filteredCategories ?? props.categories).map((category) => category.categoryId);\n\n const enabled: string[] = [];\n const disabled: string[] = [];\n for (const id of ids) {\n if (props.viewport.view.viewsCategory(id)) {\n enabled.push(id);\n } else {\n disabled.push(id);\n }\n }\n // Disable enabled\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n enabled,\n false,\n true\n );\n\n // Enable disabled\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n disabled,\n true,\n true\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n title={TreeWidget.translate(\"invert\")}\n icon=\"icon-visibility-invert\"\n onClick={invert}\n />\n );\n}\n"]}
@@ -76,7 +76,7 @@ function ModelsTreeComponentImpl(props) {
76
76
  });
77
77
  }, [queryModels, viewport]);
78
78
  return (react_1.default.createElement(react_1.default.Fragment, null,
79
- react_1.default.createElement(SearchBar_1.SearchBar, { value: "", valueChangedDelay: 500, placeholder: TreeWidget_1.TreeWidget.translate("search"), title: TreeWidget_1.TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterCancel: searchOptions.onFilterCancel, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: (_a = searchOptions.matchedResultCount) !== null && _a !== void 0 ? _a : 0 }, props.headerButtons
79
+ react_1.default.createElement(SearchBar_1.SearchBar, { value: "", valueChangedDelay: 500, placeholder: TreeWidget_1.TreeWidget.translate("search"), title: TreeWidget_1.TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: (_a = searchOptions.matchedResultCount) !== null && _a !== void 0 ? _a : 0 }, props.headerButtons
80
80
  ? props.headerButtons.map((btn, index) => react_1.default.createElement(react_1.default.Fragment, { key: index }, btn({ viewport, models: availableModels })))
81
81
  : [
82
82
  react_1.default.createElement(ShowAllButton, { viewport: viewport, models: availableModels, key: "show-all-btn" }),
@@ -104,10 +104,6 @@ function ShowAllButton(props) {
104
104
  function HideAllButton(props) {
105
105
  const hideAll = async () => {
106
106
  props.viewport.changeModelDisplay(props.models.map((model) => model.id), false);
107
- props.viewport.clearAlwaysDrawn();
108
- if (props.viewport.iModel) {
109
- await (0, CategoriesVisibilityUtils_1.toggleAllCategories)(core_frontend_1.IModelApp.viewManager, props.viewport.iModel, false, props.viewport, false);
110
- }
111
107
  props.viewport.invalidateScene();
112
108
  };
113
109
  return (react_1.default.createElement(IconButton_1.IconButton, { className: "tree-widget-header-tree-toolbar-icon", icon: "icon-visibility-hide-2", title: TreeWidget_1.TreeWidget.translate("hideAll"), onClick: hideAll }));
@@ -1 +1 @@
1
- {"version":3,"file":"ModelsTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTreeComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport \"./ModelsTree.scss\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { GeometricModel3dProps, ModelQueryParams } from \"@itwin/core-common\";\nimport { IModelApp, IModelConnection, ScreenViewport, Viewport } from \"@itwin/core-frontend\";\nimport { ModelsTreeHeaderButtonProps, ModelTreeProps } from \"../../../types\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { toggleAllCategories } from \"../CategoriesVisibilityUtils\";\nimport { ModelsTree } from \"./ModelsTree\";\nimport { IconButton } from \"../../IconButton\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { SearchBar } from \"../../search-bar/SearchBar\";\n\nexport interface ModelInfo {\n id: string;\n isPlanProjection?: boolean;\n}\n\nexport const ModelsTreeComponent = (props: ModelTreeProps) => {\n const iModel = useActiveIModelConnection();\n const viewport = useActiveViewport();\n\n if (!iModel || !viewport)\n return null;\n\n return (\n <ModelsTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />\n );\n};\n\nModelsTreeComponent.ShowAllButton = ShowAllButton;\nModelsTreeComponent.HideAllButton = HideAllButton;\nModelsTreeComponent.InvertButton = InvertButton;\nModelsTreeComponent.View2DButton = View2DButton;\nModelsTreeComponent.View3DButton = View3DButton;\n\nfunction ModelsTreeComponentImpl(props: ModelTreeProps & { iModel: IModelConnection, viewport: ScreenViewport }) {\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([]);\n\n const { viewport, iModel } = props;\n\n const { searchOptions, filterString, activeMatchIndex, onFilterApplied } =\n useTreeFilteringState();\n\n const queryModels = useCallback(async (\n vp: Viewport | undefined\n ): Promise<ModelInfo[]> => {\n if (vp === undefined) return [];\n\n const queryParams: ModelQueryParams = {\n from: \"BisCore.GeometricModel3d\",\n wantPrivate: false,\n };\n const modelProps = await iModel.models.queryProps(queryParams) ?? [];\n return modelProps\n .map(({ id, isPlanProjection }: GeometricModel3dProps) => ({ id, isPlanProjection }))\n .filter(({ id }) => id) as ModelInfo[];\n }, [iModel]);\n\n useEffect(() => {\n queryModels(viewport)\n .then((modelInfos: ModelInfo[]) => {\n setAvailableModels(modelInfos);\n })\n .catch((_e) => {\n setAvailableModels([]);\n });\n }, [queryModels, viewport]);\n\n return (\n <>\n <SearchBar\n value=\"\"\n valueChangedDelay={500}\n placeholder={TreeWidget.translate(\"search\")}\n title={TreeWidget.translate(\"searchForSomething\")}\n filteringInProgress={searchOptions.isFiltering}\n onFilterCancel={searchOptions.onFilterCancel}\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount ?? 0}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) =>\n <React.Fragment key={index}>\n {btn({ viewport, models: availableModels })}\n </React.Fragment>)\n : [\n <ShowAllButton viewport={viewport} models={availableModels} key=\"show-all-btn\" />,\n <HideAllButton viewport={viewport} models={availableModels} key=\"hide-all-btn\" />,\n <InvertButton viewport={viewport} models={availableModels} key=\"invert-all-btn\" />,\n <View2DButton viewport={viewport} models={availableModels} key=\"view-2d-btn\" />,\n <View3DButton viewport={viewport} models={availableModels} key=\"view-3d-btn\" />,\n ]\n }\n </SearchBar>\n <AutoSizer>\n {({ width, height }) => (\n <ModelsTree\n {...props}\n iModel={iModel}\n activeView={viewport}\n width={width}\n height={height}\n filterInfo={{ filter: filterString, activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </>\n );\n}\n\nfunction ShowAllButton(props: ModelsTreeHeaderButtonProps) {\n const showAll = async () => {\n if (!props.viewport)\n return;\n\n await props.viewport.addViewedModels(props.models.map((model) => model.id));\n props.viewport.clearNeverDrawn();\n props.viewport.clearAlwaysDrawn();\n if (props.viewport.iModel) {\n await toggleAllCategories(\n IModelApp.viewManager,\n props.viewport.iModel,\n true,\n props.viewport,\n false\n );\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n />\n );\n}\n\nfunction HideAllButton(props: ModelsTreeHeaderButtonProps) {\n const hideAll = async () => {\n props.viewport.changeModelDisplay(props.models.map((model) => model.id), false);\n props.viewport.clearAlwaysDrawn();\n if (props.viewport.iModel) {\n await toggleAllCategories(\n IModelApp.viewManager,\n props.viewport.iModel,\n false,\n props.viewport,\n false\n );\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility-hide-2\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n />\n );\n}\n\nfunction InvertButton(props: ModelsTreeHeaderButtonProps) {\n const invert = async () => {\n const notViewedModels: string[] = [];\n const models: string[] = [];\n props.models.forEach((model) => {\n if (props.viewport.viewsModel(model.id)) models.push(model.id);\n else notViewedModels.push(model.id);\n });\n await props.viewport.addViewedModels(notViewedModels);\n props.viewport.changeModelDisplay(models, false);\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n title={TreeWidget.translate(\"invert\")}\n icon=\"icon-visibility-invert\"\n onClick={invert}\n />\n );\n}\n\nfunction View2DButton(props: ModelsTreeHeaderButtonProps) {\n const models2d = useMemo(() => {\n return props.models.filter((model) => model.isPlanProjection).map((model) => model.id);\n }, [props.models]);\n\n const [is2dToggleActive, setIs2dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models2d));\n\n useEffect(() => {\n return props.viewport.onViewedModelsChanged.addListener(() => setIs2dToggleActive(areAllModelsVisible(props.viewport, models2d)));\n }, [models2d, props.viewport]);\n const viewToggle2D = async () => {\n if (!models2d)\n return;\n\n if (is2dToggleActive) {\n props.viewport.changeModelDisplay(models2d, false);\n } else {\n await props.viewport.addViewedModels(models2d);\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon={is2dToggleActive ? \"icon-visibility\" : \"icon-visibility-hide-2\"}\n title={TreeWidget.translate(\"toggle2DViews\")}\n onClick={viewToggle2D}\n label={TreeWidget.translate(\"label2D\")}\n disabled={models2d.length === 0}\n />\n );\n}\n\nfunction View3DButton(props: ModelsTreeHeaderButtonProps) {\n const models3d = useMemo(() => {\n return props.models.filter((model) => !model.isPlanProjection).map((model) => model.id);\n }, [props.models]);\n\n const [is3dToggleActive, setIs3dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models3d));\n\n useEffect(() => {\n return props.viewport.onViewedModelsChanged.addListener(() => setIs3dToggleActive(areAllModelsVisible(props.viewport, models3d)));\n }, [models3d, props.viewport]);\n\n const viewToggle3D = async () => {\n if (!models3d)\n return;\n\n if (is3dToggleActive) {\n props.viewport.changeModelDisplay(models3d, false);\n } else {\n await props.viewport.addViewedModels(models3d);\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon={is3dToggleActive ? \"icon-visibility\" : \"icon-visibility-hide-2\"}\n title={TreeWidget.translate(\"toggle3DViews\")}\n onClick={viewToggle3D}\n label={TreeWidget.translate(\"label3D\")}\n disabled={models3d.length === 0}\n />\n );\n}\n\nfunction areAllModelsVisible(viewport: Viewport, models: string[]): boolean {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n"]}
1
+ {"version":3,"file":"ModelsTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTreeComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport \"./ModelsTree.scss\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { GeometricModel3dProps, ModelQueryParams } from \"@itwin/core-common\";\nimport { IModelApp, IModelConnection, ScreenViewport, Viewport } from \"@itwin/core-frontend\";\nimport { ModelsTreeHeaderButtonProps, ModelTreeProps } from \"../../../types\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { toggleAllCategories } from \"../CategoriesVisibilityUtils\";\nimport { ModelsTree } from \"./ModelsTree\";\nimport { IconButton } from \"../../IconButton\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { SearchBar } from \"../../search-bar/SearchBar\";\n\nexport interface ModelInfo {\n id: string;\n isPlanProjection?: boolean;\n}\n\nexport const ModelsTreeComponent = (props: ModelTreeProps) => {\n const iModel = useActiveIModelConnection();\n const viewport = useActiveViewport();\n\n if (!iModel || !viewport)\n return null;\n\n return (\n <ModelsTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />\n );\n};\n\nModelsTreeComponent.ShowAllButton = ShowAllButton;\nModelsTreeComponent.HideAllButton = HideAllButton;\nModelsTreeComponent.InvertButton = InvertButton;\nModelsTreeComponent.View2DButton = View2DButton;\nModelsTreeComponent.View3DButton = View3DButton;\n\nfunction ModelsTreeComponentImpl(props: ModelTreeProps & { iModel: IModelConnection, viewport: ScreenViewport }) {\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([]);\n\n const { viewport, iModel } = props;\n\n const { searchOptions, filterString, activeMatchIndex, onFilterApplied } =\n useTreeFilteringState();\n\n const queryModels = useCallback(async (\n vp: Viewport | undefined\n ): Promise<ModelInfo[]> => {\n if (vp === undefined) return [];\n\n const queryParams: ModelQueryParams = {\n from: \"BisCore.GeometricModel3d\",\n wantPrivate: false,\n };\n const modelProps = await iModel.models.queryProps(queryParams) ?? [];\n return modelProps\n .map(({ id, isPlanProjection }: GeometricModel3dProps) => ({ id, isPlanProjection }))\n .filter(({ id }) => id) as ModelInfo[];\n }, [iModel]);\n\n useEffect(() => {\n queryModels(viewport)\n .then((modelInfos: ModelInfo[]) => {\n setAvailableModels(modelInfos);\n })\n .catch((_e) => {\n setAvailableModels([]);\n });\n }, [queryModels, viewport]);\n\n return (\n <>\n <SearchBar\n value=\"\"\n valueChangedDelay={500}\n placeholder={TreeWidget.translate(\"search\")}\n title={TreeWidget.translate(\"searchForSomething\")}\n filteringInProgress={searchOptions.isFiltering}\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount ?? 0}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) =>\n <React.Fragment key={index}>\n {btn({ viewport, models: availableModels })}\n </React.Fragment>)\n : [\n <ShowAllButton viewport={viewport} models={availableModels} key=\"show-all-btn\" />,\n <HideAllButton viewport={viewport} models={availableModels} key=\"hide-all-btn\" />,\n <InvertButton viewport={viewport} models={availableModels} key=\"invert-all-btn\" />,\n <View2DButton viewport={viewport} models={availableModels} key=\"view-2d-btn\" />,\n <View3DButton viewport={viewport} models={availableModels} key=\"view-3d-btn\" />,\n ]\n }\n </SearchBar>\n <AutoSizer>\n {({ width, height }) => (\n <ModelsTree\n {...props}\n iModel={iModel}\n activeView={viewport}\n width={width}\n height={height}\n filterInfo={{ filter: filterString, activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </>\n );\n}\n\nfunction ShowAllButton(props: ModelsTreeHeaderButtonProps) {\n const showAll = async () => {\n if (!props.viewport)\n return;\n\n await props.viewport.addViewedModels(props.models.map((model) => model.id));\n props.viewport.clearNeverDrawn();\n props.viewport.clearAlwaysDrawn();\n if (props.viewport.iModel) {\n await toggleAllCategories(\n IModelApp.viewManager,\n props.viewport.iModel,\n true,\n props.viewport,\n false\n );\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n />\n );\n}\n\nfunction HideAllButton(props: ModelsTreeHeaderButtonProps) {\n const hideAll = async () => {\n props.viewport.changeModelDisplay(props.models.map((model) => model.id), false);\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility-hide-2\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n />\n );\n}\n\nfunction InvertButton(props: ModelsTreeHeaderButtonProps) {\n const invert = async () => {\n const notViewedModels: string[] = [];\n const models: string[] = [];\n props.models.forEach((model) => {\n if (props.viewport.viewsModel(model.id)) models.push(model.id);\n else notViewedModels.push(model.id);\n });\n await props.viewport.addViewedModels(notViewedModels);\n props.viewport.changeModelDisplay(models, false);\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n title={TreeWidget.translate(\"invert\")}\n icon=\"icon-visibility-invert\"\n onClick={invert}\n />\n );\n}\n\nfunction View2DButton(props: ModelsTreeHeaderButtonProps) {\n const models2d = useMemo(() => {\n return props.models.filter((model) => model.isPlanProjection).map((model) => model.id);\n }, [props.models]);\n\n const [is2dToggleActive, setIs2dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models2d));\n\n useEffect(() => {\n return props.viewport.onViewedModelsChanged.addListener(() => setIs2dToggleActive(areAllModelsVisible(props.viewport, models2d)));\n }, [models2d, props.viewport]);\n const viewToggle2D = async () => {\n if (!models2d)\n return;\n\n if (is2dToggleActive) {\n props.viewport.changeModelDisplay(models2d, false);\n } else {\n await props.viewport.addViewedModels(models2d);\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon={is2dToggleActive ? \"icon-visibility\" : \"icon-visibility-hide-2\"}\n title={TreeWidget.translate(\"toggle2DViews\")}\n onClick={viewToggle2D}\n label={TreeWidget.translate(\"label2D\")}\n disabled={models2d.length === 0}\n />\n );\n}\n\nfunction View3DButton(props: ModelsTreeHeaderButtonProps) {\n const models3d = useMemo(() => {\n return props.models.filter((model) => !model.isPlanProjection).map((model) => model.id);\n }, [props.models]);\n\n const [is3dToggleActive, setIs3dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models3d));\n\n useEffect(() => {\n return props.viewport.onViewedModelsChanged.addListener(() => setIs3dToggleActive(areAllModelsVisible(props.viewport, models3d)));\n }, [models3d, props.viewport]);\n\n const viewToggle3D = async () => {\n if (!models3d)\n return;\n\n if (is3dToggleActive) {\n props.viewport.changeModelDisplay(models3d, false);\n } else {\n await props.viewport.addViewedModels(models3d);\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon={is3dToggleActive ? \"icon-visibility\" : \"icon-visibility-hide-2\"}\n title={TreeWidget.translate(\"toggle3DViews\")}\n onClick={viewToggle3D}\n label={TreeWidget.translate(\"label3D\")}\n disabled={models3d.length === 0}\n />\n );\n}\n\nfunction areAllModelsVisible(viewport: Viewport, models: string[]): boolean {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n"]}
@@ -25,8 +25,6 @@ export interface SearchBarProps extends CommonProps {
25
25
  /** Filtering is cleared after everything's loaded */
26
26
  onFilterStart: (newFilter: string) => void;
27
27
  /** Filtering is cleared after everything's loaded */
28
- onFilterCancel?: () => void;
29
- /** Filtering is cleared after everything's loaded */
30
28
  onFilterClear?: () => void;
31
29
  /** Total number of results/entries */
32
30
  resultCount: number;
@@ -49,7 +49,7 @@ export class SearchBar extends React.PureComponent {
49
49
  React.createElement(IconButton, { styleType: "borderless", size: "small" },
50
50
  React.createElement(SvgMore, null)))) }, this.props.children)),
51
51
  showSearch ? (React.createElement("div", { className: "search-bar-search-container" },
52
- React.createElement(SearchBox, { ref: this._searchBox, className: searchBoxClassName, searchText: value, valueChangedDelay: valueChangedDelay, placeholder: placeholder, onFilterCancel: this.props.onFilterCancel, onFilterClear: this.props.onFilterClear, onFilterStart: this.props.onFilterStart, resultCount: this.props.resultCount, onIconClick: this._onToggleSearch, onSelectedChanged: this.props.onSelectedChanged }))) : (React.createElement(IconButton, { className: searchIconClassName, onClick: this._onToggleSearch, title: title, styleType: "borderless", size: "small" },
52
+ React.createElement(SearchBox, { ref: this._searchBox, className: searchBoxClassName, searchText: value, valueChangedDelay: valueChangedDelay, placeholder: placeholder, onClear: this.props.onFilterClear, onFilterStart: this.props.onFilterStart, resultCount: this.props.resultCount, onIconClick: this._onToggleSearch, onSelectedChanged: this.props.onSelectedChanged }))) : (React.createElement(IconButton, { className: searchIconClassName, onClick: this._onToggleSearch, title: title, styleType: "borderless", size: "small" },
53
53
  React.createElement(SvgSearch, null)))));
54
54
  }
55
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SearchBar.js","sourceRoot":"","sources":["../../../../src/components/search-bar/SearchBar.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport * as React from \"react\";\nimport classnames from \"classnames\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { SearchBox } from \"./SearchBox\";\nimport \"./SearchBar.scss\";\nimport {\n ButtonGroup,\n DropdownMenu,\n IconButton,\n MenuItem,\n} from \"@itwin/itwinui-react\";\nimport { SvgMore, SvgSearch } from \"@itwin/itwinui-icons-react\";\n\nexport enum Alignment {\n Left = 0,\n Right = 1,\n}\n\nexport interface SearchBarProps extends CommonProps {\n /** value to set SearchBox */\n value?: string;\n /** Enable or disable dropdown functionality. If disabled, searchbox simply expands without displaying the group button */\n enableGrouping: boolean;\n /** show the search box in the open (expanded) state */\n showSearch?: boolean;\n /** alignment content to the left or right of the search bar */\n alignment?: Alignment;\n /** searchbox frequency to poll for changes in value (milliseconds) */\n valueChangedDelay?: number;\n /** searchbox placeholder value to show in gray before anything is entered in */\n placeholder?: string;\n /** title (tooltip) */\n title?: string;\n /** Tells the component if parent component is still handling the filtering */\n filteringInProgress?: boolean;\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** Filtering is cleared after everything's loaded */\n onFilterCancel?: () => void;\n /** Filtering is cleared after everything's loaded */\n onFilterClear?: () => void;\n /** Total number of results/entries */\n resultCount: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged: (index: number) => void;\n}\n\ninterface SearchBarState {\n showSearch: boolean;\n showDropdown: boolean;\n}\n\n/** SearchBox with expanding search box capability */\nexport class SearchBar extends React.PureComponent<\nSearchBarProps,\nSearchBarState\n> {\n private _searchBox = React.createRef<SearchBox>();\n\n public static defaultProps: Partial<SearchBarProps> = {\n alignment: Alignment.Right,\n enableGrouping: true,\n };\n\n constructor(props: any) {\n super(props);\n\n this.state = { showSearch: props.showSearch, showDropdown: false };\n }\n\n public async componentDidUpdate(prevProps: SearchBarProps) {\n if (prevProps.value !== this.props.value) {\n }\n }\n\n private _onToggleSearch = (\n _event?: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => {\n const showSearch = !this.state.showSearch;\n this.setState({ showSearch }, () => {\n if (showSearch && this._searchBox.current)\n setTimeout(() => {\n if (this._searchBox.current) this._searchBox.current.focus();\n }, 100); // timeout allows the search bar animation to complete!\n });\n };\n\n public render() {\n const {\n value,\n alignment,\n valueChangedDelay,\n placeholder,\n enableGrouping,\n title,\n } = this.props;\n const { showSearch } = this.state;\n\n const classes = classnames(\"tree-widget-search-bar\", this.props.className);\n const searchBoxClassName = classnames(\n \"search-bar-search-box\",\n showSearch && \"show\"\n );\n const searchIconClassName = classnames(\n \"search-bar-search-icon\",\n showSearch ? \"hide\" : \"show\"\n );\n const contentClassName = classnames(\n \"search-bar-button-container\",\n showSearch && \"contracted\",\n alignment === Alignment.Right && \"right\"\n );\n\n return (\n <div className={classes}>\n {enableGrouping && <div className={contentClassName}>\n <ButtonGroup\n overflowButton={(overflowStart) => (\n <DropdownMenu\n menuItems={() =>\n React.Children.toArray(this.props.children)\n .slice(overflowStart === 0 ? 0 : overflowStart - 1)\n .map((btn, index) => <MenuItem key={index}>{btn}</MenuItem>)\n }\n className=\"search-bar-dropdown-container\"\n >\n <IconButton styleType=\"borderless\" size=\"small\">\n <SvgMore />\n </IconButton>\n </DropdownMenu>\n )}\n >\n {this.props.children}\n </ButtonGroup>\n </div>}\n {showSearch ? (\n <div className=\"search-bar-search-container\">\n <SearchBox\n ref={this._searchBox}\n className={searchBoxClassName}\n searchText={value}\n valueChangedDelay={valueChangedDelay}\n placeholder={placeholder}\n onFilterCancel={this.props.onFilterCancel}\n onFilterClear={this.props.onFilterClear}\n onFilterStart={this.props.onFilterStart}\n resultCount={this.props.resultCount}\n onIconClick={this._onToggleSearch}\n onSelectedChanged={this.props.onSelectedChanged}\n />\n </div>\n ) : (\n <IconButton\n className={searchIconClassName}\n onClick={this._onToggleSearch}\n title={title}\n styleType=\"borderless\"\n size=\"small\"\n >\n <SvgSearch />\n </IconButton>\n )}\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"SearchBar.js","sourceRoot":"","sources":["../../../../src/components/search-bar/SearchBar.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport * as React from \"react\";\nimport classnames from \"classnames\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { SearchBox } from \"./SearchBox\";\nimport \"./SearchBar.scss\";\nimport {\n ButtonGroup,\n DropdownMenu,\n IconButton,\n MenuItem,\n} from \"@itwin/itwinui-react\";\nimport { SvgMore, SvgSearch } from \"@itwin/itwinui-icons-react\";\n\nexport enum Alignment {\n Left = 0,\n Right = 1,\n}\n\nexport interface SearchBarProps extends CommonProps {\n /** value to set SearchBox */\n value?: string;\n /** Enable or disable dropdown functionality. If disabled, searchbox simply expands without displaying the group button */\n enableGrouping: boolean;\n /** show the search box in the open (expanded) state */\n showSearch?: boolean;\n /** alignment content to the left or right of the search bar */\n alignment?: Alignment;\n /** searchbox frequency to poll for changes in value (milliseconds) */\n valueChangedDelay?: number;\n /** searchbox placeholder value to show in gray before anything is entered in */\n placeholder?: string;\n /** title (tooltip) */\n title?: string;\n /** Tells the component if parent component is still handling the filtering */\n filteringInProgress?: boolean;\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** Filtering is cleared after everything's loaded */\n onFilterClear?: () => void;\n /** Total number of results/entries */\n resultCount: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged: (index: number) => void;\n}\n\ninterface SearchBarState {\n showSearch: boolean;\n showDropdown: boolean;\n}\n\n/** SearchBox with expanding search box capability */\nexport class SearchBar extends React.PureComponent<\nSearchBarProps,\nSearchBarState\n> {\n private _searchBox = React.createRef<SearchBox>();\n\n public static defaultProps: Partial<SearchBarProps> = {\n alignment: Alignment.Right,\n enableGrouping: true,\n };\n\n constructor(props: any) {\n super(props);\n\n this.state = { showSearch: props.showSearch, showDropdown: false };\n }\n\n public async componentDidUpdate(prevProps: SearchBarProps) {\n if (prevProps.value !== this.props.value) {\n }\n }\n\n private _onToggleSearch = (\n _event?: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => {\n const showSearch = !this.state.showSearch;\n this.setState({ showSearch }, () => {\n if (showSearch && this._searchBox.current)\n setTimeout(() => {\n if (this._searchBox.current) this._searchBox.current.focus();\n }, 100); // timeout allows the search bar animation to complete!\n });\n };\n\n public render() {\n const {\n value,\n alignment,\n valueChangedDelay,\n placeholder,\n enableGrouping,\n title,\n } = this.props;\n const { showSearch } = this.state;\n\n const classes = classnames(\"tree-widget-search-bar\", this.props.className);\n const searchBoxClassName = classnames(\n \"search-bar-search-box\",\n showSearch && \"show\"\n );\n const searchIconClassName = classnames(\n \"search-bar-search-icon\",\n showSearch ? \"hide\" : \"show\"\n );\n const contentClassName = classnames(\n \"search-bar-button-container\",\n showSearch && \"contracted\",\n alignment === Alignment.Right && \"right\"\n );\n\n return (\n <div className={classes}>\n {enableGrouping && <div className={contentClassName}>\n <ButtonGroup\n overflowButton={(overflowStart) => (\n <DropdownMenu\n menuItems={() =>\n React.Children.toArray(this.props.children)\n .slice(overflowStart === 0 ? 0 : overflowStart - 1)\n .map((btn, index) => <MenuItem key={index}>{btn}</MenuItem>)\n }\n className=\"search-bar-dropdown-container\"\n >\n <IconButton styleType=\"borderless\" size=\"small\">\n <SvgMore />\n </IconButton>\n </DropdownMenu>\n )}\n >\n {this.props.children}\n </ButtonGroup>\n </div>}\n {showSearch ? (\n <div className=\"search-bar-search-container\">\n <SearchBox\n ref={this._searchBox}\n className={searchBoxClassName}\n searchText={value}\n valueChangedDelay={valueChangedDelay}\n placeholder={placeholder}\n onClear={this.props.onFilterClear}\n onFilterStart={this.props.onFilterStart}\n resultCount={this.props.resultCount}\n onIconClick={this._onToggleSearch}\n onSelectedChanged={this.props.onSelectedChanged}\n />\n </div>\n ) : (\n <IconButton\n className={searchIconClassName}\n onClick={this._onToggleSearch}\n title={title}\n styleType=\"borderless\"\n size=\"small\"\n >\n <SvgSearch />\n </IconButton>\n )}\n </div>\n );\n }\n}\n"]}
@@ -19,10 +19,6 @@ export interface SearchBoxProps extends CommonProps {
19
19
  onIconClick?: () => void;
20
20
  /** Filtering is cleared after everything's loaded */
21
21
  onFilterStart: (newFilter: string) => void;
22
- /** Filtering is cleared after everything's loaded */
23
- onFilterClear?: () => void;
24
- /** Filtering is cleared after everything's loaded */
25
- onFilterCancel?: () => void;
26
22
  /** Tells the component if parent component is still handling the filtering */
27
23
  filteringInProgress?: boolean;
28
24
  /** Total number of results/entries */
@@ -1 +1 @@
1
- {"version":3,"file":"SearchBox.js","sourceRoot":"","sources":["../../../../src/components/search-bar/SearchBox.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @module SearchBox */\n\nimport * as React from \"react\";\nimport classnames from \"classnames\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { IconButton } from \"../IconButton\";\nimport \"./SearchBox.scss\";\nimport { TreeWidget } from \"../../TreeWidget\";\n\nexport interface SearchBoxProps extends CommonProps {\n /** value to set SearchBox */\n searchText?: string;\n /** placeholder value to show in gray before anything is entered in */\n placeholder?: string;\n /** frequency to poll for changes in value */\n valueChangedDelay?: number;\n /** listens for <Enter> keypress */\n onEnterPressed?: () => void;\n /** listens for <Esc> keypress */\n onEscPressed?: () => void;\n /** listens for onClick event for Clear (x) icon */\n onClear?: () => void;\n /** Search or clear icon click */\n onIconClick?: () => void;\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** Filtering is cleared after everything's loaded */\n onFilterClear?: () => void;\n /** Filtering is cleared after everything's loaded */\n onFilterCancel?: () => void;\n /** Tells the component if parent component is still handling the filtering */\n filteringInProgress?: boolean;\n /** Total number of results/entries */\n resultCount: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged: (index: number) => void;\n}\n\n/**\n * Enumeration of possible component contexts\n * @internal\n */\nexport enum InputContext {\n /** Component is ready to filter */\n ReadyToFilter,\n /** Component's parent is currently filtering */\n FilteringInProgress,\n /** Component's parent has finished filtering */\n FilteringFinished,\n /** Component's parent has finished filtering, but ResultSelector(stepping through results) is not enabled */\n FilteringFinishedWithNoStepping,\n}\n\ninterface SearchBoxState {\n searchText?: string;\n /** @internal */\n context: InputContext;\n /** Currently selected index */\n selectedIndex: number;\n}\n\nexport class SearchBox extends React.PureComponent<\nSearchBoxProps,\nSearchBoxState\n> {\n private _inputElement: HTMLInputElement | null = null;\n private _timeoutId: number = 0;\n\n constructor(props: SearchBoxProps) {\n super(props);\n\n this.state = {\n searchText: this.props.searchText,\n context: InputContext.ReadyToFilter,\n selectedIndex: 0,\n };\n }\n\n public focus() {\n // istanbul ignore else\n if (this._inputElement) {\n this._inputElement.focus();\n }\n }\n\n private _trackChange = (_event?: any): void => {\n let searchText = \"\";\n\n // istanbul ignore else\n if (this._inputElement) searchText = this._inputElement.value;\n\n this.setState(\n (_prevState) => {\n return { searchText };\n },\n () => {\n if (this.props.valueChangedDelay) {\n this._unsetTimeout();\n this._timeoutId = window.setTimeout(() => {\n this.setState({\n context: InputContext.ReadyToFilter,\n selectedIndex: 0,\n });\n this.props.onSelectedChanged(0);\n this.props.onFilterStart(this.state.searchText!);\n }, this.props.valueChangedDelay);\n } else {\n this.setState({ context: InputContext.ReadyToFilter });\n this.props.onFilterStart(this.state.searchText!);\n }\n }\n );\n };\n\n private _handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"Escape\":\n // istanbul ignore else\n if (this.props.onEscPressed) this.props.onEscPressed();\n break;\n case \"Enter\":\n // istanbul ignore else\n if (this.props.onEnterPressed) this.props.onEnterPressed();\n break;\n }\n };\n\n private _handleIconClick = (): void => {\n // istanbul ignore else\n if (this._inputElement) {\n const clear = this.state.searchText !== \"\";\n this._inputElement.value = \"\";\n // istanbul ignore else\n if (clear && this.props.onClear) this.props.onClear();\n this._inputElement.focus();\n }\n this._trackChange();\n if (this.props.onIconClick) this.props.onIconClick();\n };\n\n private _unsetTimeout = (): void => {\n if (this._timeoutId) {\n window.clearTimeout(this._timeoutId);\n this._timeoutId = 0;\n }\n };\n\n public async componentDidUpdate(prevProps: SearchBoxProps) {\n if (prevProps.searchText !== this.props.searchText) {\n const searchText = this.props.searchText;\n this.setState({ searchText });\n }\n\n this.focus();\n }\n\n public componentWillUnmount() {\n this._unsetTimeout();\n }\n\n /** @internal */\n public static getDerivedStateFromProps(\n props: SearchBoxProps,\n state: SearchBoxState\n ) {\n if (\n state.context === InputContext.FilteringInProgress &&\n !props.filteringInProgress\n ) {\n if (state.searchText) return { context: InputContext.FilteringFinished };\n else return { context: InputContext.FilteringFinishedWithNoStepping };\n } else if (\n state.context === InputContext.ReadyToFilter &&\n props.filteringInProgress\n ) {\n return { context: InputContext.FilteringInProgress };\n }\n return null;\n }\n\n private _onPrevClick = () => {\n if (this.state.selectedIndex > 1) {\n this.props.onSelectedChanged(this.state.selectedIndex - 1);\n this.setState((state) => ({ selectedIndex: state.selectedIndex - 1 }));\n }\n };\n\n private _onNextClick = () => {\n if (this.state.selectedIndex < this.props.resultCount) {\n this.props.onSelectedChanged(this.state.selectedIndex + 1);\n this.setState((state) => ({ selectedIndex: state.selectedIndex + 1 }));\n }\n };\n\n public render() {\n const {\n className,\n style,\n resultCount,\n placeholder,\n } = this.props;\n const { searchText, selectedIndex } = this.state;\n const searchClassName = classnames(\"tree-widget-searchbox\", className);\n const showCount = resultCount > 0;\n const isPrevEnabled = selectedIndex > 1;\n const isNextEnabled = selectedIndex < resultCount;\n\n return (\n <div className={searchClassName} style={style}>\n <input\n value={searchText}\n ref={(el) => {\n this._inputElement = el;\n }}\n onChange={this._trackChange}\n onKeyDown={this._handleKeyDown}\n onPaste={this._trackChange}\n onCut={this._trackChange}\n placeholder={\n placeholder ? placeholder : TreeWidget.translate(\"searchbox.search\")\n }\n />\n <div className=\"searchbox-stepping-container\">\n {showCount && (\n <span className=\"searchbox-stepping-count\">{`${selectedIndex}/${resultCount}`}</span>\n )}\n <div className=\"searchbox-separator\" />\n <IconButton\n className=\"searchbox-step-button\"\n icon=\"icon-chevron-up\"\n disabled={!isPrevEnabled}\n onClick={this._onPrevClick}\n title=\"Previous\"\n />\n <IconButton\n className=\"searchbox-step-button\"\n icon=\"icon-chevron-down\"\n disabled={!isNextEnabled}\n onClick={this._onNextClick}\n title=\"Next\"\n />\n </div>\n <span\n className=\"searchbox-step-button icon icon-close searchbox-close-button\"\n onClick={this._handleIconClick}\n onKeyDown={this._handleIconClick}\n role=\"button\"\n tabIndex={0}\n />\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"SearchBox.js","sourceRoot":"","sources":["../../../../src/components/search-bar/SearchBox.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @module SearchBox */\n\nimport * as React from \"react\";\nimport classnames from \"classnames\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { IconButton } from \"../IconButton\";\nimport \"./SearchBox.scss\";\nimport { TreeWidget } from \"../../TreeWidget\";\n\nexport interface SearchBoxProps extends CommonProps {\n /** value to set SearchBox */\n searchText?: string;\n /** placeholder value to show in gray before anything is entered in */\n placeholder?: string;\n /** frequency to poll for changes in value */\n valueChangedDelay?: number;\n /** listens for <Enter> keypress */\n onEnterPressed?: () => void;\n /** listens for <Esc> keypress */\n onEscPressed?: () => void;\n /** listens for onClick event for Clear (x) icon */\n onClear?: () => void;\n /** Search or clear icon click */\n onIconClick?: () => void;\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** Tells the component if parent component is still handling the filtering */\n filteringInProgress?: boolean;\n /** Total number of results/entries */\n resultCount: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged: (index: number) => void;\n}\n\n/**\n * Enumeration of possible component contexts\n * @internal\n */\nexport enum InputContext {\n /** Component is ready to filter */\n ReadyToFilter,\n /** Component's parent is currently filtering */\n FilteringInProgress,\n /** Component's parent has finished filtering */\n FilteringFinished,\n /** Component's parent has finished filtering, but ResultSelector(stepping through results) is not enabled */\n FilteringFinishedWithNoStepping,\n}\n\ninterface SearchBoxState {\n searchText?: string;\n /** @internal */\n context: InputContext;\n /** Currently selected index */\n selectedIndex: number;\n}\n\nexport class SearchBox extends React.PureComponent<\nSearchBoxProps,\nSearchBoxState\n> {\n private _inputElement: HTMLInputElement | null = null;\n private _timeoutId: number = 0;\n\n constructor(props: SearchBoxProps) {\n super(props);\n\n this.state = {\n searchText: this.props.searchText,\n context: InputContext.ReadyToFilter,\n selectedIndex: 0,\n };\n }\n\n public focus() {\n // istanbul ignore else\n if (this._inputElement) {\n this._inputElement.focus();\n }\n }\n\n private _trackChange = (_event?: any): void => {\n let searchText = \"\";\n\n // istanbul ignore else\n if (this._inputElement) searchText = this._inputElement.value;\n\n this.setState(\n (_prevState) => {\n return { searchText };\n },\n () => {\n if (this.props.valueChangedDelay) {\n this._unsetTimeout();\n this._timeoutId = window.setTimeout(() => {\n this.setState({\n context: InputContext.ReadyToFilter,\n selectedIndex: 0,\n });\n this.props.onSelectedChanged(0);\n this.props.onFilterStart(this.state.searchText!);\n }, this.props.valueChangedDelay);\n } else {\n this.setState({ context: InputContext.ReadyToFilter });\n this.props.onFilterStart(this.state.searchText!);\n }\n }\n );\n };\n\n private _handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"Escape\":\n // istanbul ignore else\n if (this.props.onEscPressed) this.props.onEscPressed();\n break;\n case \"Enter\":\n // istanbul ignore else\n if (this.props.onEnterPressed) this.props.onEnterPressed();\n break;\n }\n };\n\n private _handleIconClick = (): void => {\n // istanbul ignore else\n if (this._inputElement) {\n const clear = this.state.searchText !== \"\";\n this._inputElement.value = \"\";\n // istanbul ignore else\n if (clear && this.props.onClear) this.props.onClear();\n this._inputElement.focus();\n }\n this._trackChange();\n if (this.props.onIconClick) this.props.onIconClick();\n };\n\n private _unsetTimeout = (): void => {\n if (this._timeoutId) {\n window.clearTimeout(this._timeoutId);\n this._timeoutId = 0;\n }\n };\n\n public async componentDidUpdate(prevProps: SearchBoxProps) {\n if (prevProps.searchText !== this.props.searchText) {\n const searchText = this.props.searchText;\n this.setState({ searchText });\n }\n\n this.focus();\n }\n\n public componentWillUnmount() {\n this._unsetTimeout();\n }\n\n /** @internal */\n public static getDerivedStateFromProps(\n props: SearchBoxProps,\n state: SearchBoxState\n ) {\n if (\n state.context === InputContext.FilteringInProgress &&\n !props.filteringInProgress\n ) {\n if (state.searchText) return { context: InputContext.FilteringFinished };\n else return { context: InputContext.FilteringFinishedWithNoStepping };\n } else if (\n state.context === InputContext.ReadyToFilter &&\n props.filteringInProgress\n ) {\n return { context: InputContext.FilteringInProgress };\n }\n return null;\n }\n\n private _onPrevClick = () => {\n if (this.state.selectedIndex > 1) {\n this.props.onSelectedChanged(this.state.selectedIndex - 1);\n this.setState((state) => ({ selectedIndex: state.selectedIndex - 1 }));\n }\n };\n\n private _onNextClick = () => {\n if (this.state.selectedIndex < this.props.resultCount) {\n this.props.onSelectedChanged(this.state.selectedIndex + 1);\n this.setState((state) => ({ selectedIndex: state.selectedIndex + 1 }));\n }\n };\n\n public render() {\n const {\n className,\n style,\n resultCount,\n placeholder,\n } = this.props;\n const { searchText, selectedIndex } = this.state;\n const searchClassName = classnames(\"tree-widget-searchbox\", className);\n const showCount = resultCount > 0;\n const isPrevEnabled = selectedIndex > 1;\n const isNextEnabled = selectedIndex < resultCount;\n\n return (\n <div className={searchClassName} style={style}>\n <input\n value={searchText}\n ref={(el) => {\n this._inputElement = el;\n }}\n onChange={this._trackChange}\n onKeyDown={this._handleKeyDown}\n onPaste={this._trackChange}\n onCut={this._trackChange}\n placeholder={\n placeholder ? placeholder : TreeWidget.translate(\"searchbox.search\")\n }\n />\n <div className=\"searchbox-stepping-container\">\n {showCount && (\n <span className=\"searchbox-stepping-count\">{`${selectedIndex}/${resultCount}`}</span>\n )}\n <div className=\"searchbox-separator\" />\n <IconButton\n className=\"searchbox-step-button\"\n icon=\"icon-chevron-up\"\n disabled={!isPrevEnabled}\n onClick={this._onPrevClick}\n title=\"Previous\"\n />\n <IconButton\n className=\"searchbox-step-button\"\n icon=\"icon-chevron-down\"\n disabled={!isNextEnabled}\n onClick={this._onNextClick}\n title=\"Next\"\n />\n </div>\n <span\n className=\"searchbox-step-button icon icon-close searchbox-close-button\"\n onClick={this._handleIconClick}\n onKeyDown={this._handleIconClick}\n role=\"button\"\n tabIndex={0}\n />\n </div>\n );\n }\n}\n"]}
@@ -39,7 +39,7 @@ function CategoriesTreeComponentImpl(props) {
39
39
  })();
40
40
  }, [filteredProvider]);
41
41
  return (React.createElement(React.Fragment, null,
42
- React.createElement(SearchBar, { value: "", valueChangedDelay: 500, placeholder: TreeWidget.translate("search"), title: TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterCancel: searchOptions.onFilterCancel, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: (_a = searchOptions.matchedResultCount) !== null && _a !== void 0 ? _a : 0 }, props.headerButtons
42
+ React.createElement(SearchBar, { value: "", valueChangedDelay: 500, placeholder: TreeWidget.translate("search"), title: TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: (_a = searchOptions.matchedResultCount) !== null && _a !== void 0 ? _a : 0 }, props.headerButtons
43
43
  ? props.headerButtons.map((btn, index) => React.createElement(React.Fragment, { key: index }, btn({ viewport: props.viewport, categories, filteredCategories })))
44
44
  : [
45
45
  React.createElement(ShowAllButton, { viewport: props.viewport, categories: categories, filteredCategories: filteredCategories, key: "show-all-btn" }),
@@ -1 +1 @@
1
- {"version":3,"file":"CategoriesTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/category-tree/CategoriesTreeComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport \"./CategoriesTree.scss\";\nimport React, { useEffect, useState } from \"react\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { IModelApp, IModelConnection, ScreenViewport } from \"@itwin/core-frontend\";\nimport { CategoryTree } from \"./CategoriesTree\";\nimport { CategoryInfo, CategoryVisibilityHandler, useCategories } from \"./CategoryVisibilityHandler\";\nimport { enableCategory } from \"../CategoriesVisibilityUtils\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport type { CategoriesTreeHeaderButtonProps, CategoriesTreeProps } from \"../../../types\";\nimport type { IPresentationTreeDataProvider } from \"@itwin/presentation-components\";\nimport { IconButton } from \"../../IconButton\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { SearchBar } from \"../../search-bar/SearchBar\";\n\nexport function CategoriesTreeComponent(props: CategoriesTreeProps) {\n const iModel = useActiveIModelConnection();\n const viewport = useActiveViewport();\n\n if (!iModel || !viewport) {\n return null;\n }\n\n return (\n <CategoriesTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />\n );\n}\n\nCategoriesTreeComponent.ShowAllButton = ShowAllButton;\nCategoriesTreeComponent.HideAllButton = HideAllButton;\nCategoriesTreeComponent.InvertButton = InvertButton;\n\nfunction CategoriesTreeComponentImpl(props: CategoriesTreeProps & { iModel: IModelConnection, viewport: ScreenViewport }) {\n const categories = useCategories(IModelApp.viewManager, props.iModel, props.viewport);\n const [filteredCategories, setFilteredCategories] = useState<CategoryInfo[]>();\n const {\n searchOptions,\n filterString,\n activeMatchIndex,\n onFilterApplied,\n filteredProvider,\n } = useTreeFilteringState();\n\n useEffect(() => {\n (async () => {\n if (filteredProvider)\n setFilteredCategories((await getFilteredCategories(filteredProvider)).map((category) => ({ categoryId: category })));\n else\n setFilteredCategories(undefined);\n })();\n }, [filteredProvider]);\n\n return (\n <>\n <SearchBar\n value=\"\"\n valueChangedDelay={500}\n placeholder={TreeWidget.translate(\"search\")}\n title={TreeWidget.translate(\"searchForSomething\")}\n filteringInProgress={searchOptions.isFiltering}\n onFilterCancel={searchOptions.onFilterCancel}\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount ?? 0}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) =>\n <React.Fragment key={index}>\n {btn({ viewport: props.viewport, categories, filteredCategories })}\n </React.Fragment>)\n : [\n <ShowAllButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"show-all-btn\" />,\n <HideAllButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"hide-all-btn\" />,\n <InvertButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"invert-all-btn\" />,\n ]\n }\n </SearchBar>\n <AutoSizer>\n {({ width, height }) => (\n <CategoryTree\n {...props}\n categories={categories}\n width={width}\n height={height}\n filterInfo={{ filter: filterString, activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </>\n );\n}\n\nasync function getFilteredCategories(filteredProvider: IPresentationTreeDataProvider) {\n const nodes = await filteredProvider.getNodes();\n return nodes.map((node) => CategoryVisibilityHandler.getInstanceIdFromTreeNodeKey(filteredProvider.getNodeKey(node)));\n}\n\nfunction ShowAllButton(props: CategoriesTreeHeaderButtonProps) {\n const showAll = () => {\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n (props.filteredCategories ?? props.categories).map((category) => category.categoryId),\n true,\n true,\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n />\n );\n}\n\nfunction HideAllButton(props: CategoriesTreeHeaderButtonProps) {\n const hideAll = () => {\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n (props.filteredCategories ?? props.categories).map((category) => category.categoryId),\n false,\n true,\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility-hide-2\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n />\n );\n}\n\nfunction InvertButton(props: CategoriesTreeHeaderButtonProps) {\n const invert = () => {\n const ids = (props.filteredCategories ?? props.categories).map((category) => category.categoryId);\n\n const enabled: string[] = [];\n const disabled: string[] = [];\n for (const id of ids) {\n if (props.viewport.view.viewsCategory(id)) {\n enabled.push(id);\n } else {\n disabled.push(id);\n }\n }\n // Disable enabled\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n enabled,\n false,\n true\n );\n\n // Enable disabled\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n disabled,\n true,\n true\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n title={TreeWidget.translate(\"invert\")}\n icon=\"icon-visibility-invert\"\n onClick={invert}\n />\n );\n}\n"]}
1
+ {"version":3,"file":"CategoriesTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/category-tree/CategoriesTreeComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport \"./CategoriesTree.scss\";\nimport React, { useEffect, useState } from \"react\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { IModelApp, IModelConnection, ScreenViewport } from \"@itwin/core-frontend\";\nimport { CategoryTree } from \"./CategoriesTree\";\nimport { CategoryInfo, CategoryVisibilityHandler, useCategories } from \"./CategoryVisibilityHandler\";\nimport { enableCategory } from \"../CategoriesVisibilityUtils\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport type { CategoriesTreeHeaderButtonProps, CategoriesTreeProps } from \"../../../types\";\nimport type { IPresentationTreeDataProvider } from \"@itwin/presentation-components\";\nimport { IconButton } from \"../../IconButton\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { SearchBar } from \"../../search-bar/SearchBar\";\n\nexport function CategoriesTreeComponent(props: CategoriesTreeProps) {\n const iModel = useActiveIModelConnection();\n const viewport = useActiveViewport();\n\n if (!iModel || !viewport) {\n return null;\n }\n\n return (\n <CategoriesTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />\n );\n}\n\nCategoriesTreeComponent.ShowAllButton = ShowAllButton;\nCategoriesTreeComponent.HideAllButton = HideAllButton;\nCategoriesTreeComponent.InvertButton = InvertButton;\n\nfunction CategoriesTreeComponentImpl(props: CategoriesTreeProps & { iModel: IModelConnection, viewport: ScreenViewport }) {\n const categories = useCategories(IModelApp.viewManager, props.iModel, props.viewport);\n const [filteredCategories, setFilteredCategories] = useState<CategoryInfo[]>();\n const {\n searchOptions,\n filterString,\n activeMatchIndex,\n onFilterApplied,\n filteredProvider,\n } = useTreeFilteringState();\n\n useEffect(() => {\n (async () => {\n if (filteredProvider)\n setFilteredCategories((await getFilteredCategories(filteredProvider)).map((category) => ({ categoryId: category })));\n else\n setFilteredCategories(undefined);\n })();\n }, [filteredProvider]);\n\n return (\n <>\n <SearchBar\n value=\"\"\n valueChangedDelay={500}\n placeholder={TreeWidget.translate(\"search\")}\n title={TreeWidget.translate(\"searchForSomething\")}\n filteringInProgress={searchOptions.isFiltering}\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount ?? 0}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) =>\n <React.Fragment key={index}>\n {btn({ viewport: props.viewport, categories, filteredCategories })}\n </React.Fragment>)\n : [\n <ShowAllButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"show-all-btn\" />,\n <HideAllButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"hide-all-btn\" />,\n <InvertButton viewport={props.viewport} categories={categories} filteredCategories={filteredCategories} key=\"invert-all-btn\" />,\n ]\n }\n </SearchBar>\n <AutoSizer>\n {({ width, height }) => (\n <CategoryTree\n {...props}\n categories={categories}\n width={width}\n height={height}\n filterInfo={{ filter: filterString, activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </>\n );\n}\n\nasync function getFilteredCategories(filteredProvider: IPresentationTreeDataProvider) {\n const nodes = await filteredProvider.getNodes();\n return nodes.map((node) => CategoryVisibilityHandler.getInstanceIdFromTreeNodeKey(filteredProvider.getNodeKey(node)));\n}\n\nfunction ShowAllButton(props: CategoriesTreeHeaderButtonProps) {\n const showAll = () => {\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n (props.filteredCategories ?? props.categories).map((category) => category.categoryId),\n true,\n true,\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n />\n );\n}\n\nfunction HideAllButton(props: CategoriesTreeHeaderButtonProps) {\n const hideAll = () => {\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n (props.filteredCategories ?? props.categories).map((category) => category.categoryId),\n false,\n true,\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility-hide-2\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n />\n );\n}\n\nfunction InvertButton(props: CategoriesTreeHeaderButtonProps) {\n const invert = () => {\n const ids = (props.filteredCategories ?? props.categories).map((category) => category.categoryId);\n\n const enabled: string[] = [];\n const disabled: string[] = [];\n for (const id of ids) {\n if (props.viewport.view.viewsCategory(id)) {\n enabled.push(id);\n } else {\n disabled.push(id);\n }\n }\n // Disable enabled\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n enabled,\n false,\n true\n );\n\n // Enable disabled\n enableCategory(\n IModelApp.viewManager,\n props.viewport.iModel,\n disabled,\n true,\n true\n );\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n title={TreeWidget.translate(\"invert\")}\n icon=\"icon-visibility-invert\"\n onClick={invert}\n />\n );\n}\n"]}
@@ -53,7 +53,7 @@ function ModelsTreeComponentImpl(props) {
53
53
  });
54
54
  }, [queryModels, viewport]);
55
55
  return (React.createElement(React.Fragment, null,
56
- React.createElement(SearchBar, { value: "", valueChangedDelay: 500, placeholder: TreeWidget.translate("search"), title: TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterCancel: searchOptions.onFilterCancel, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: (_a = searchOptions.matchedResultCount) !== null && _a !== void 0 ? _a : 0 }, props.headerButtons
56
+ React.createElement(SearchBar, { value: "", valueChangedDelay: 500, placeholder: TreeWidget.translate("search"), title: TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: (_a = searchOptions.matchedResultCount) !== null && _a !== void 0 ? _a : 0 }, props.headerButtons
57
57
  ? props.headerButtons.map((btn, index) => React.createElement(React.Fragment, { key: index }, btn({ viewport, models: availableModels })))
58
58
  : [
59
59
  React.createElement(ShowAllButton, { viewport: viewport, models: availableModels, key: "show-all-btn" }),
@@ -81,10 +81,6 @@ function ShowAllButton(props) {
81
81
  function HideAllButton(props) {
82
82
  const hideAll = async () => {
83
83
  props.viewport.changeModelDisplay(props.models.map((model) => model.id), false);
84
- props.viewport.clearAlwaysDrawn();
85
- if (props.viewport.iModel) {
86
- await toggleAllCategories(IModelApp.viewManager, props.viewport.iModel, false, props.viewport, false);
87
- }
88
84
  props.viewport.invalidateScene();
89
85
  };
90
86
  return (React.createElement(IconButton, { className: "tree-widget-header-tree-toolbar-icon", icon: "icon-visibility-hide-2", title: TreeWidget.translate("hideAll"), onClick: hideAll }));
@@ -1 +1 @@
1
- {"version":3,"file":"ModelsTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTreeComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport \"./ModelsTree.scss\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { GeometricModel3dProps, ModelQueryParams } from \"@itwin/core-common\";\nimport { IModelApp, IModelConnection, ScreenViewport, Viewport } from \"@itwin/core-frontend\";\nimport { ModelsTreeHeaderButtonProps, ModelTreeProps } from \"../../../types\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { toggleAllCategories } from \"../CategoriesVisibilityUtils\";\nimport { ModelsTree } from \"./ModelsTree\";\nimport { IconButton } from \"../../IconButton\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { SearchBar } from \"../../search-bar/SearchBar\";\n\nexport interface ModelInfo {\n id: string;\n isPlanProjection?: boolean;\n}\n\nexport const ModelsTreeComponent = (props: ModelTreeProps) => {\n const iModel = useActiveIModelConnection();\n const viewport = useActiveViewport();\n\n if (!iModel || !viewport)\n return null;\n\n return (\n <ModelsTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />\n );\n};\n\nModelsTreeComponent.ShowAllButton = ShowAllButton;\nModelsTreeComponent.HideAllButton = HideAllButton;\nModelsTreeComponent.InvertButton = InvertButton;\nModelsTreeComponent.View2DButton = View2DButton;\nModelsTreeComponent.View3DButton = View3DButton;\n\nfunction ModelsTreeComponentImpl(props: ModelTreeProps & { iModel: IModelConnection, viewport: ScreenViewport }) {\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([]);\n\n const { viewport, iModel } = props;\n\n const { searchOptions, filterString, activeMatchIndex, onFilterApplied } =\n useTreeFilteringState();\n\n const queryModels = useCallback(async (\n vp: Viewport | undefined\n ): Promise<ModelInfo[]> => {\n if (vp === undefined) return [];\n\n const queryParams: ModelQueryParams = {\n from: \"BisCore.GeometricModel3d\",\n wantPrivate: false,\n };\n const modelProps = await iModel.models.queryProps(queryParams) ?? [];\n return modelProps\n .map(({ id, isPlanProjection }: GeometricModel3dProps) => ({ id, isPlanProjection }))\n .filter(({ id }) => id) as ModelInfo[];\n }, [iModel]);\n\n useEffect(() => {\n queryModels(viewport)\n .then((modelInfos: ModelInfo[]) => {\n setAvailableModels(modelInfos);\n })\n .catch((_e) => {\n setAvailableModels([]);\n });\n }, [queryModels, viewport]);\n\n return (\n <>\n <SearchBar\n value=\"\"\n valueChangedDelay={500}\n placeholder={TreeWidget.translate(\"search\")}\n title={TreeWidget.translate(\"searchForSomething\")}\n filteringInProgress={searchOptions.isFiltering}\n onFilterCancel={searchOptions.onFilterCancel}\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount ?? 0}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) =>\n <React.Fragment key={index}>\n {btn({ viewport, models: availableModels })}\n </React.Fragment>)\n : [\n <ShowAllButton viewport={viewport} models={availableModels} key=\"show-all-btn\" />,\n <HideAllButton viewport={viewport} models={availableModels} key=\"hide-all-btn\" />,\n <InvertButton viewport={viewport} models={availableModels} key=\"invert-all-btn\" />,\n <View2DButton viewport={viewport} models={availableModels} key=\"view-2d-btn\" />,\n <View3DButton viewport={viewport} models={availableModels} key=\"view-3d-btn\" />,\n ]\n }\n </SearchBar>\n <AutoSizer>\n {({ width, height }) => (\n <ModelsTree\n {...props}\n iModel={iModel}\n activeView={viewport}\n width={width}\n height={height}\n filterInfo={{ filter: filterString, activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </>\n );\n}\n\nfunction ShowAllButton(props: ModelsTreeHeaderButtonProps) {\n const showAll = async () => {\n if (!props.viewport)\n return;\n\n await props.viewport.addViewedModels(props.models.map((model) => model.id));\n props.viewport.clearNeverDrawn();\n props.viewport.clearAlwaysDrawn();\n if (props.viewport.iModel) {\n await toggleAllCategories(\n IModelApp.viewManager,\n props.viewport.iModel,\n true,\n props.viewport,\n false\n );\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n />\n );\n}\n\nfunction HideAllButton(props: ModelsTreeHeaderButtonProps) {\n const hideAll = async () => {\n props.viewport.changeModelDisplay(props.models.map((model) => model.id), false);\n props.viewport.clearAlwaysDrawn();\n if (props.viewport.iModel) {\n await toggleAllCategories(\n IModelApp.viewManager,\n props.viewport.iModel,\n false,\n props.viewport,\n false\n );\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility-hide-2\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n />\n );\n}\n\nfunction InvertButton(props: ModelsTreeHeaderButtonProps) {\n const invert = async () => {\n const notViewedModels: string[] = [];\n const models: string[] = [];\n props.models.forEach((model) => {\n if (props.viewport.viewsModel(model.id)) models.push(model.id);\n else notViewedModels.push(model.id);\n });\n await props.viewport.addViewedModels(notViewedModels);\n props.viewport.changeModelDisplay(models, false);\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n title={TreeWidget.translate(\"invert\")}\n icon=\"icon-visibility-invert\"\n onClick={invert}\n />\n );\n}\n\nfunction View2DButton(props: ModelsTreeHeaderButtonProps) {\n const models2d = useMemo(() => {\n return props.models.filter((model) => model.isPlanProjection).map((model) => model.id);\n }, [props.models]);\n\n const [is2dToggleActive, setIs2dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models2d));\n\n useEffect(() => {\n return props.viewport.onViewedModelsChanged.addListener(() => setIs2dToggleActive(areAllModelsVisible(props.viewport, models2d)));\n }, [models2d, props.viewport]);\n const viewToggle2D = async () => {\n if (!models2d)\n return;\n\n if (is2dToggleActive) {\n props.viewport.changeModelDisplay(models2d, false);\n } else {\n await props.viewport.addViewedModels(models2d);\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon={is2dToggleActive ? \"icon-visibility\" : \"icon-visibility-hide-2\"}\n title={TreeWidget.translate(\"toggle2DViews\")}\n onClick={viewToggle2D}\n label={TreeWidget.translate(\"label2D\")}\n disabled={models2d.length === 0}\n />\n );\n}\n\nfunction View3DButton(props: ModelsTreeHeaderButtonProps) {\n const models3d = useMemo(() => {\n return props.models.filter((model) => !model.isPlanProjection).map((model) => model.id);\n }, [props.models]);\n\n const [is3dToggleActive, setIs3dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models3d));\n\n useEffect(() => {\n return props.viewport.onViewedModelsChanged.addListener(() => setIs3dToggleActive(areAllModelsVisible(props.viewport, models3d)));\n }, [models3d, props.viewport]);\n\n const viewToggle3D = async () => {\n if (!models3d)\n return;\n\n if (is3dToggleActive) {\n props.viewport.changeModelDisplay(models3d, false);\n } else {\n await props.viewport.addViewedModels(models3d);\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon={is3dToggleActive ? \"icon-visibility\" : \"icon-visibility-hide-2\"}\n title={TreeWidget.translate(\"toggle3DViews\")}\n onClick={viewToggle3D}\n label={TreeWidget.translate(\"label3D\")}\n disabled={models3d.length === 0}\n />\n );\n}\n\nfunction areAllModelsVisible(viewport: Viewport, models: string[]): boolean {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n"]}
1
+ {"version":3,"file":"ModelsTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTreeComponent.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport \"./ModelsTree.scss\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { GeometricModel3dProps, ModelQueryParams } from \"@itwin/core-common\";\nimport { IModelApp, IModelConnection, ScreenViewport, Viewport } from \"@itwin/core-frontend\";\nimport { ModelsTreeHeaderButtonProps, ModelTreeProps } from \"../../../types\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { toggleAllCategories } from \"../CategoriesVisibilityUtils\";\nimport { ModelsTree } from \"./ModelsTree\";\nimport { IconButton } from \"../../IconButton\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { SearchBar } from \"../../search-bar/SearchBar\";\n\nexport interface ModelInfo {\n id: string;\n isPlanProjection?: boolean;\n}\n\nexport const ModelsTreeComponent = (props: ModelTreeProps) => {\n const iModel = useActiveIModelConnection();\n const viewport = useActiveViewport();\n\n if (!iModel || !viewport)\n return null;\n\n return (\n <ModelsTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />\n );\n};\n\nModelsTreeComponent.ShowAllButton = ShowAllButton;\nModelsTreeComponent.HideAllButton = HideAllButton;\nModelsTreeComponent.InvertButton = InvertButton;\nModelsTreeComponent.View2DButton = View2DButton;\nModelsTreeComponent.View3DButton = View3DButton;\n\nfunction ModelsTreeComponentImpl(props: ModelTreeProps & { iModel: IModelConnection, viewport: ScreenViewport }) {\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([]);\n\n const { viewport, iModel } = props;\n\n const { searchOptions, filterString, activeMatchIndex, onFilterApplied } =\n useTreeFilteringState();\n\n const queryModels = useCallback(async (\n vp: Viewport | undefined\n ): Promise<ModelInfo[]> => {\n if (vp === undefined) return [];\n\n const queryParams: ModelQueryParams = {\n from: \"BisCore.GeometricModel3d\",\n wantPrivate: false,\n };\n const modelProps = await iModel.models.queryProps(queryParams) ?? [];\n return modelProps\n .map(({ id, isPlanProjection }: GeometricModel3dProps) => ({ id, isPlanProjection }))\n .filter(({ id }) => id) as ModelInfo[];\n }, [iModel]);\n\n useEffect(() => {\n queryModels(viewport)\n .then((modelInfos: ModelInfo[]) => {\n setAvailableModels(modelInfos);\n })\n .catch((_e) => {\n setAvailableModels([]);\n });\n }, [queryModels, viewport]);\n\n return (\n <>\n <SearchBar\n value=\"\"\n valueChangedDelay={500}\n placeholder={TreeWidget.translate(\"search\")}\n title={TreeWidget.translate(\"searchForSomething\")}\n filteringInProgress={searchOptions.isFiltering}\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount ?? 0}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) =>\n <React.Fragment key={index}>\n {btn({ viewport, models: availableModels })}\n </React.Fragment>)\n : [\n <ShowAllButton viewport={viewport} models={availableModels} key=\"show-all-btn\" />,\n <HideAllButton viewport={viewport} models={availableModels} key=\"hide-all-btn\" />,\n <InvertButton viewport={viewport} models={availableModels} key=\"invert-all-btn\" />,\n <View2DButton viewport={viewport} models={availableModels} key=\"view-2d-btn\" />,\n <View3DButton viewport={viewport} models={availableModels} key=\"view-3d-btn\" />,\n ]\n }\n </SearchBar>\n <AutoSizer>\n {({ width, height }) => (\n <ModelsTree\n {...props}\n iModel={iModel}\n activeView={viewport}\n width={width}\n height={height}\n filterInfo={{ filter: filterString, activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </>\n );\n}\n\nfunction ShowAllButton(props: ModelsTreeHeaderButtonProps) {\n const showAll = async () => {\n if (!props.viewport)\n return;\n\n await props.viewport.addViewedModels(props.models.map((model) => model.id));\n props.viewport.clearNeverDrawn();\n props.viewport.clearAlwaysDrawn();\n if (props.viewport.iModel) {\n await toggleAllCategories(\n IModelApp.viewManager,\n props.viewport.iModel,\n true,\n props.viewport,\n false\n );\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n />\n );\n}\n\nfunction HideAllButton(props: ModelsTreeHeaderButtonProps) {\n const hideAll = async () => {\n props.viewport.changeModelDisplay(props.models.map((model) => model.id), false);\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility-hide-2\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n />\n );\n}\n\nfunction InvertButton(props: ModelsTreeHeaderButtonProps) {\n const invert = async () => {\n const notViewedModels: string[] = [];\n const models: string[] = [];\n props.models.forEach((model) => {\n if (props.viewport.viewsModel(model.id)) models.push(model.id);\n else notViewedModels.push(model.id);\n });\n await props.viewport.addViewedModels(notViewedModels);\n props.viewport.changeModelDisplay(models, false);\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n title={TreeWidget.translate(\"invert\")}\n icon=\"icon-visibility-invert\"\n onClick={invert}\n />\n );\n}\n\nfunction View2DButton(props: ModelsTreeHeaderButtonProps) {\n const models2d = useMemo(() => {\n return props.models.filter((model) => model.isPlanProjection).map((model) => model.id);\n }, [props.models]);\n\n const [is2dToggleActive, setIs2dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models2d));\n\n useEffect(() => {\n return props.viewport.onViewedModelsChanged.addListener(() => setIs2dToggleActive(areAllModelsVisible(props.viewport, models2d)));\n }, [models2d, props.viewport]);\n const viewToggle2D = async () => {\n if (!models2d)\n return;\n\n if (is2dToggleActive) {\n props.viewport.changeModelDisplay(models2d, false);\n } else {\n await props.viewport.addViewedModels(models2d);\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon={is2dToggleActive ? \"icon-visibility\" : \"icon-visibility-hide-2\"}\n title={TreeWidget.translate(\"toggle2DViews\")}\n onClick={viewToggle2D}\n label={TreeWidget.translate(\"label2D\")}\n disabled={models2d.length === 0}\n />\n );\n}\n\nfunction View3DButton(props: ModelsTreeHeaderButtonProps) {\n const models3d = useMemo(() => {\n return props.models.filter((model) => !model.isPlanProjection).map((model) => model.id);\n }, [props.models]);\n\n const [is3dToggleActive, setIs3dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models3d));\n\n useEffect(() => {\n return props.viewport.onViewedModelsChanged.addListener(() => setIs3dToggleActive(areAllModelsVisible(props.viewport, models3d)));\n }, [models3d, props.viewport]);\n\n const viewToggle3D = async () => {\n if (!models3d)\n return;\n\n if (is3dToggleActive) {\n props.viewport.changeModelDisplay(models3d, false);\n } else {\n await props.viewport.addViewedModels(models3d);\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon={is3dToggleActive ? \"icon-visibility\" : \"icon-visibility-hide-2\"}\n title={TreeWidget.translate(\"toggle3DViews\")}\n onClick={viewToggle3D}\n label={TreeWidget.translate(\"label3D\")}\n disabled={models3d.length === 0}\n />\n );\n}\n\nfunction areAllModelsVisible(viewport: Viewport, models: string[]): boolean {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/tree-widget-react",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "Tree Widget React",
5
5
  "keywords": [
6
6
  "Bentley",