mirror of
https://github.com/XFox111/TabsAsideExtension.git
synced 2026-04-22 07:58:01 +03:00
58d8e864e0
* feat: add ability to hide collections #211 (#213) * feat: add ability to hide collections #211 * fix: hide/unhide collection label is swapped * fix: missing useCallback dependency * fix: add selected tabs to existing collection adds all tabs in current window #215 (#216) * fix: add selected tabs to existing collection adds all tabs in current window #215 * fix: force selected tabs only for adding tabs to groups * feat: compact collection view (#214) * feat: compact collection view #201 * loc: compact view localization * fix(loc): missing "color" translation in edit dialog * feat: add ability to edit saved tabs (#218) * feat: adds option to edit saved tabs #217 * loc: translations for #217 * build(deps): Bump the react group with 2 updates (#221) Bumps the react group with 2 updates: [react](https://github.com/facebook/react/tree/HEAD/packages/react) and [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom). Updates `react` from 19.2.1 to 19.2.3 - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/v19.2.3/packages/react) Updates `react-dom` from 19.2.1 to 19.2.3 - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/v19.2.3/packages/react-dom) --- updated-dependencies: - dependency-name: react dependency-version: 19.2.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: react - dependency-name: react-dom dependency-version: 19.2.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: react ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): Bump the deps group with 4 updates (#220) Bumps the deps group with 4 updates: [@fluentui/react-components](https://github.com/microsoft/fluentui), [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint). Updates `@fluentui/react-components` from 9.72.8 to 9.72.9 - [Release notes](https://github.com/microsoft/fluentui/releases) - [Commits](https://github.com/microsoft/fluentui/compare/@fluentui/react-components_v9.72.8...@fluentui/react-components_v9.72.9) Updates `@eslint/js` from 9.39.1 to 9.39.2 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/commits/v9.39.2/packages/js) Updates `eslint` from 9.39.1 to 9.39.2 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/compare/v9.39.1...v9.39.2) Updates `typescript-eslint` from 8.49.0 to 8.51.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.51.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@fluentui/react-components" dependency-version: 9.72.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: deps - dependency-name: "@eslint/js" dependency-version: 9.39.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: deps - dependency-name: eslint dependency-version: 9.39.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: deps - dependency-name: typescript-eslint dependency-version: 8.51.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: deps ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: Bump version from 3.2.3 to 3.3.0 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
124 lines
4.4 KiB
TypeScript
124 lines
4.4 KiB
TypeScript
import GroupContext from "@/entrypoints/sidepanel/contexts/GroupContext";
|
|
import useDndItem from "@/entrypoints/sidepanel/hooks/useDndItem";
|
|
import { openGroup } from "@/entrypoints/sidepanel/utils/opener";
|
|
import { useGroupColors } from "@/hooks/useGroupColors";
|
|
import useSettings from "@/hooks/useSettings";
|
|
import { GroupItem } from "@/models/CollectionModels";
|
|
import { horizontalListSortingStrategy, SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable";
|
|
import { Caption1Strong, Link, mergeClasses, Tooltip } from "@fluentui/react-components";
|
|
import { Pin16Filled, WebAssetRegular } from "@fluentui/react-icons";
|
|
import { ReactElement } from "react";
|
|
import { useCollections } from "../contexts/CollectionsProvider";
|
|
import GroupDropZone from "./collections/GroupDropZone";
|
|
import GroupMoreMenu from "./collections/GroupMoreMenu";
|
|
import { useStyles_GroupView } from "./GroupView.styles";
|
|
import TabView from "./TabView";
|
|
|
|
export default function GroupView({ group, indices, dragOverlay, collectionId }: GroupViewProps): ReactElement
|
|
{
|
|
const [alwaysShowToolbars] = useSettings("alwaysShowToolbars");
|
|
const { tilesView } = useCollections();
|
|
|
|
const groupId: string = useMemo(() => indices.join("/"), [indices]);
|
|
|
|
const {
|
|
setNodeRef, nodeProps,
|
|
setActivatorNodeRef, activatorProps,
|
|
activeItem: active, isBeingDragged
|
|
} = useDndItem({ id: groupId, data: { indices, item: group }, disabled: group.pinned });
|
|
|
|
const disableDropZone: boolean = useMemo(
|
|
() => active !== null &&
|
|
(active.item.type !== "tab" || (active.indices[0] === indices[0] && active.indices[1] === indices[1])),
|
|
[active, indices]);
|
|
const disableSorting: boolean = useMemo(
|
|
() => active !== null && (active.item.type !== "tab" || active.indices[0] !== indices[0]),
|
|
[active, indices]);
|
|
|
|
const cls = useStyles_GroupView();
|
|
const colorCls = useGroupColors();
|
|
|
|
return (
|
|
<GroupContext.Provider value={ { group, indices } }>
|
|
<div
|
|
ref={ setNodeRef } { ...nodeProps }
|
|
className={ mergeClasses(
|
|
cls.root,
|
|
group.pinned === true ? cls.pinnedColor : colorCls[group.color],
|
|
isBeingDragged && cls.dragging,
|
|
dragOverlay && cls.dragOverlay
|
|
) }
|
|
>
|
|
<div className={ mergeClasses(cls.header, !tilesView && cls.verticalHeader) }>
|
|
|
|
<div
|
|
ref={ setActivatorNodeRef } { ...activatorProps }
|
|
className={ mergeClasses(cls.title, group.pinned && cls.pinned, !tilesView && cls.verticalTitle) }
|
|
>
|
|
{ group.pinned === true ?
|
|
<>
|
|
<Pin16Filled />
|
|
<Caption1Strong truncate wrap={ false }>{ i18n.t("groups.pinned") }</Caption1Strong>
|
|
</>
|
|
:
|
|
<Tooltip relationship="description" content={ group.title ?? "" }>
|
|
<Caption1Strong truncate wrap={ false }>{ group.title }</Caption1Strong>
|
|
</Tooltip>
|
|
}
|
|
</div>
|
|
|
|
<div className={ mergeClasses(cls.toolbar, "GroupView-toolbar", alwaysShowToolbars === true && cls.showToolbar) }>
|
|
{ group.items.length > 0 &&
|
|
<Link className={ cls.openAllLink } onClick={ () => openGroup(group, false) }>
|
|
{ i18n.t("groups.open") }
|
|
</Link>
|
|
}
|
|
|
|
<GroupMoreMenu />
|
|
</div>
|
|
</div>
|
|
|
|
<GroupDropZone
|
|
disabled={ disableDropZone }
|
|
className={ mergeClasses(cls.listContainer, !tilesView && cls.verticalListContainer) }
|
|
>
|
|
{ group.items.length < 1 ?
|
|
<div className={ mergeClasses(cls.empty, !tilesView && cls.verticalEmpty) }>
|
|
<WebAssetRegular fontSize={ 32 } />
|
|
<Caption1Strong>{ i18n.t("groups.empty") }</Caption1Strong>
|
|
</div>
|
|
:
|
|
<div
|
|
className={ mergeClasses(
|
|
cls.list,
|
|
!tilesView && cls.verticalList,
|
|
((active?.item.type === "group" && active?.indices[0] === indices[0]) || dragOverlay) && (tilesView ? cls.horizontalListCollapsed : cls.verticalListCollapsed)
|
|
) }
|
|
>
|
|
<SortableContext
|
|
items={ group.items.map((_, index) => [...indices, index].join("/")) }
|
|
disabled={ disableSorting }
|
|
strategy={ !tilesView ? verticalListSortingStrategy : horizontalListSortingStrategy }
|
|
>
|
|
{ group.items.map((i, index) =>
|
|
<TabView
|
|
key={ index } tab={ i } indices={ [...indices, index] }
|
|
collectionId={ collectionId } />
|
|
) }
|
|
</SortableContext>
|
|
</div>
|
|
}
|
|
</GroupDropZone>
|
|
</div>
|
|
</GroupContext.Provider>
|
|
);
|
|
}
|
|
|
|
export type GroupViewProps =
|
|
{
|
|
group: GroupItem;
|
|
indices: number[];
|
|
dragOverlay?: boolean;
|
|
collectionId: number;
|
|
};
|