diff --git a/packages/web/src/javascripts/Components/Icon/IconNameToSvgMapping.tsx b/packages/web/src/javascripts/Components/Icon/IconNameToSvgMapping.tsx index 93cec6fba88..3fc257a366a 100644 --- a/packages/web/src/javascripts/Components/Icon/IconNameToSvgMapping.tsx +++ b/packages/web/src/javascripts/Components/Icon/IconNameToSvgMapping.tsx @@ -1,6 +1,39 @@ import * as icons from '@standardnotes/icons' +import { SVGProps } from 'react' + +const CollapseAllIcon = (props: SVGProps) => ( + + + + +) + +const ExpandAllIcon = (props: SVGProps) => ( + + + + +) export const IconNameToSvgMapping = { + 'collapse-all': CollapseAllIcon, + 'expand-all': ExpandAllIcon, 'account-circle': icons.AccountCircleIcon, 'align-center': icons.FormatAlignCenterIcon, 'align-justify': icons.FormatAlignJustifyIcon, diff --git a/packages/web/src/javascripts/Components/Tags/TagsSection.tsx b/packages/web/src/javascripts/Components/Tags/TagsSection.tsx index c3b5b55124b..038de128316 100644 --- a/packages/web/src/javascripts/Components/Tags/TagsSection.tsx +++ b/packages/web/src/javascripts/Components/Tags/TagsSection.tsx @@ -1,3 +1,4 @@ +import IconButton from '@/Components/Button/IconButton' import TagsList from '@/Components/Tags/TagsList' import { observer } from 'mobx-react-lite' import { FunctionComponent } from 'react' @@ -27,7 +28,25 @@ const TagsSection: FunctionComponent = () => {
- {!application.navigationController.isSearching && } + {!application.navigationController.isSearching && ( +
+ application.navigationController.collapseAllTags()} + /> + application.navigationController.expandAllTags()} + /> + +
+ )}
diff --git a/packages/web/src/javascripts/Controllers/Navigation/NavigationController.ts b/packages/web/src/javascripts/Controllers/Navigation/NavigationController.ts index 467a34c73d0..91a5353d50f 100644 --- a/packages/web/src/javascripts/Controllers/Navigation/NavigationController.ts +++ b/packages/web/src/javascripts/Controllers/Navigation/NavigationController.ts @@ -687,6 +687,36 @@ export class NavigationController } } + public collapseAllTags() { + const tagsToCollapse = this.tags.filter((tag) => this.getChildren(tag).length > 0 && tag.expanded) + if (tagsToCollapse.length === 0) { + return + } + this.mutator + .changeItems(tagsToCollapse, (mutator) => { + mutator.expanded = false + }) + .then(() => { + this.sync.sync().catch(console.error) + }) + .catch(console.error) + } + + public expandAllTags() { + const tagsToExpand = this.tags.filter((tag) => this.getChildren(tag).length > 0 && !tag.expanded) + if (tagsToExpand.length === 0) { + return + } + this.mutator + .changeItems(tagsToExpand, (mutator) => { + mutator.expanded = true + }) + .then(() => { + this.sync.sync().catch(console.error) + }) + .catch(console.error) + } + private setDisplayOptionsAndReloadTags = () => { this.items.setTagsAndViewsDisplayOptions({ searchQuery: { diff --git a/packages/web/web.webpack.config.js b/packages/web/web.webpack.config.js index a2cf68aba4b..e90ab58dab8 100644 --- a/packages/web/web.webpack.config.js +++ b/packages/web/web.webpack.config.js @@ -107,7 +107,7 @@ module.exports = (env) => { * they may contain class properties and other ES6+ syntax. */ exclude: - /node_modules\/(?!(@standardnotes\/common|@standardnotes\/domain-core|webextension-polyfill|yoga-layout))/, + /node_modules[\\\/](?!(@standardnotes[\\\/]common|@standardnotes[\\\/]domain-core|webextension-polyfill|yoga-layout))/, use: [ 'babel-loader', {