Skip to content

Commit 2118219

Browse files
authored
feat: compact collection view (#214)
* feat: compact collection view #201 * loc: compact view localization
1 parent 3e79964 commit 2118219

File tree

14 files changed

+60
-11
lines changed

14 files changed

+60
-11
lines changed

entrypoints/sidepanel/components/CollectionView.styles.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ export const useStyles_CollectionView = makeStyles({
1919
"&:hover":
2020
{
2121
boxShadow: tokens.shadow4
22+
},
23+
24+
"&:not(:focus-within) .compact":
25+
{
26+
display: "none"
2227
}
2328
},
2429
color:

entrypoints/sidepanel/components/CollectionView.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ import { useStyles_CollectionView } from "./CollectionView.styles";
1212
import GroupView from "./GroupView";
1313
import TabView from "./TabView";
1414

15-
export default function CollectionView({ collection, index: collectionIndex, dragOverlay }: CollectionViewProps): ReactElement
15+
export default function CollectionView({
16+
collection,
17+
index: collectionIndex,
18+
dragOverlay,
19+
compact
20+
}: CollectionViewProps): ReactElement
1621
{
1722
const { tilesView } = useCollections();
1823
const {
@@ -53,12 +58,12 @@ export default function CollectionView({ collection, index: collectionIndex, dra
5358
{ (!activeItem || activeItem.item.type !== "collection") && !dragOverlay &&
5459
<>
5560
{ collection.items.length < 1 ?
56-
<div className={ cls.empty }>
61+
<div className={ mergeClasses(cls.empty, compact === true && "compact") }>
5762
<CollectionsRegular fontSize={ 32 } />
5863
<Body1Strong>{ i18n.t("collections.empty") }</Body1Strong>
5964
</div>
6065
:
61-
<div className={ mergeClasses(cls.list, !tilesView && cls.verticalList) }>
66+
<div className={ mergeClasses(cls.list, !tilesView && cls.verticalList, compact === true && "compact") }>
6267
<SortableContext
6368
items={ collection.items.map((_, index) => [collectionIndex, index].join("/")) }
6469
strategy={ tilesView ? horizontalListSortingStrategy : verticalListSortingStrategy }
@@ -85,4 +90,5 @@ export type CollectionViewProps =
8590
collection: CollectionItem;
8691
index: number;
8792
dragOverlay?: boolean;
93+
compact?: boolean | null;
8894
};

entrypoints/sidepanel/layouts/collections/CollectionListView.styles.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,9 @@ export const useStyles_CollectionListView = makeStyles({
5151
{
5252
gridTemplateColumns: "repeat(auto-fit, minmax(360px, 1fr))"
5353
}
54+
},
55+
compactList:
56+
{
57+
alignItems: "baseline"
5458
}
5559
});

entrypoints/sidepanel/layouts/collections/CollectionListView.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ import CollectionContext from "../../contexts/CollectionContext";
1818
import { useCollections } from "../../contexts/CollectionsProvider";
1919
import applyReorder from "../../utils/dnd/applyReorder";
2020
import { collisionDetector } from "../../utils/dnd/collisionDetector";
21+
import { snapHandleToCursor } from "../../utils/dnd/snapHandleToCursor";
2122
import { useStyles_CollectionListView } from "./CollectionListView.styles";
2223
import SearchBar from "./SearchBar";
2324
import StorageCapacityIssueMessage from "./messages/StorageCapacityIssueMessage";
24-
import { snapHandleToCursor } from "../../utils/dnd/snapHandleToCursor";
2525

2626
export default function CollectionListView(): ReactElement
2727
{
@@ -31,11 +31,12 @@ export default function CollectionListView(): ReactElement
3131
const [query, setQuery] = useState<string>("");
3232
const [colors, setColors] = useState<CollectionFilterType["colors"]>([]);
3333
const [showHidden, setShowHidden] = useState<boolean>(false);
34+
const [compactView] = useSettings("compactView");
3435

3536
const [active, setActive] = useState<DndItem | null>(null);
3637

3738
const sensors = useSensors(
38-
useSensor(MouseSensor, { activationConstraint: { delay: 10, tolerance: 20 } }),
39+
useSensor(MouseSensor, { activationConstraint: { delay: 150, tolerance: 20 } }),
3940
useSensor(TouchSensor, { activationConstraint: { delay: 300, tolerance: 20 } })
4041
);
4142

@@ -114,7 +115,7 @@ export default function CollectionListView(): ReactElement
114115
</Button>
115116
</div>
116117
:
117-
<section className={ mergeClasses(cls.collectionList, !tilesView && cls.listView) }>
118+
<section className={ mergeClasses(cls.collectionList, !tilesView && cls.listView, !!(!tilesView && compactView) && cls.compactList) }>
118119
<DndContext
119120
sensors={ sensors }
120121
collisionDetection={ collisionDetector(!tilesView) }
@@ -127,7 +128,7 @@ export default function CollectionListView(): ReactElement
127128
strategy={ tilesView ? verticalListSortingStrategy : rectSortingStrategy }
128129
>
129130
{ resultList.map((collection, index) =>
130-
<CollectionView key={ index } collection={ collection } index={ index } />
131+
<CollectionView key={ index } collection={ collection } index={ index } compact={ compactView } />
131132
) }
132133
</SortableContext>
133134

entrypoints/sidepanel/layouts/header/MoreButton.tsx

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,32 @@ import { ReactElement } from "react";
1111
export default function MoreButton(): ReactElement
1212
{
1313
const [tilesView, setTilesView] = useSettings("tilesView");
14+
const [compactView, setCompactView] = useSettings("compactView");
1415

1516
const SettingsIcon: ic.FluentIcon = ic.bundleIcon(ic.Settings20Filled, ic.Settings20Regular);
16-
const ViewIcon: ic.FluentIcon = ic.bundleIcon(ic.GridKanban20Filled, ic.GridKanban20Regular);
17+
const GridIcon: ic.FluentIcon = ic.bundleIcon(ic.GridKanban20Filled, ic.GridKanban20Regular);
18+
const CompactIcon: ic.FluentIcon = ic.bundleIcon(ic.ArrowMinimizeVerticalFilled, ic.ArrowMinimizeVerticalRegular);
1719
const FeedbackIcon: ic.FluentIcon = ic.bundleIcon(ic.PersonFeedback20Filled, ic.PersonFeedback20Regular);
1820
const LearnIcon: ic.FluentIcon = ic.bundleIcon(ic.QuestionCircle20Filled, ic.QuestionCircle20Regular);
1921
const BmcIcon: ic.FluentIcon = ic.bundleIcon(BuyMeACoffee20Filled, BuyMeACoffee20Regular);
2022

23+
const checkedValues = useMemo(() => ({
24+
view: [
25+
tilesView ? "tiles" : "",
26+
compactView ? "compact" : ""
27+
]
28+
}), [tilesView, compactView]);
29+
30+
const onCheckedValueChange = (_: unknown, e: fui.MenuCheckedValueChangeData) =>
31+
{
32+
setTilesView(e.checkedItems.includes("tiles"));
33+
setCompactView(e.checkedItems.includes("compact"));
34+
};
35+
2136
return (
2237
<fui.Menu
2338
hasIcons hasCheckmarks
24-
checkedValues={ { tilesView: tilesView ? ["true"] : [] } }
25-
onCheckedValueChange={ (_, e) => setTilesView(e.checkedItems.length > 0) }
39+
checkedValues={ checkedValues } onCheckedValueChange={ onCheckedValueChange }
2640
>
2741
<fui.Tooltip relationship="label" content={ i18n.t("common.tooltips.more") }>
2842
<fui.MenuTrigger disableButtonEnhancement>
@@ -36,9 +50,12 @@ export default function MoreButton(): ReactElement
3650
<fui.MenuItem icon={ <SettingsIcon /> } onClick={ () => browser.runtime.openOptionsPage() }>
3751
{ i18n.t("options_page.title") }
3852
</fui.MenuItem>
39-
<fui.MenuItemCheckbox name="tilesView" value="true" icon={ <ViewIcon /> }>
53+
<fui.MenuItemCheckbox name="view" value="tiles" icon={ <GridIcon /> }>
4054
{ i18n.t("main.header.menu.tiles_view") }
4155
</fui.MenuItemCheckbox>
56+
<fui.MenuItemCheckbox name="view" value="compact" icon={ <CompactIcon /> }>
57+
{ i18n.t("main.header.menu.compact_view") }
58+
</fui.MenuItemCheckbox>
4259

4360
<fui.MenuDivider />
4461

locales/en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ main:
231231
create_collection: "Create new collection"
232232
menu:
233233
tiles_view: "Tiles view"
234+
compact_view: "Compact view"
234235
changelog: "What's new?"
235236
list:
236237
searchbar:

locales/es.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ main:
231231
create_collection: "Crear nueva colección"
232232
menu:
233233
tiles_view: "Vista de mosaicos"
234+
compact_view: "Vista compacta"
234235
changelog: "¿Qué hay de nuevo?"
235236
list:
236237
searchbar:

locales/it.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ main:
231231
create_collection: "Crea nuova collezione"
232232
menu:
233233
tiles_view: "Vista a riquadri"
234+
compact_view: "Vista compatta"
234235
changelog: "Cosa c'è di nuovo?"
235236
list:
236237
searchbar:

locales/pl.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ main:
231231
create_collection: "Utwórz nową kolekcję"
232232
menu:
233233
tiles_view: "Kafelki"
234+
compact_view: "Widok kompaktowy"
234235
changelog: "Co nowego?"
235236
list:
236237
searchbar:

locales/pt_BR.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ main:
231231
create_collection: "Criar nova coleção"
232232
menu:
233233
tiles_view: "Visualização em blocos"
234+
compact_view: "Visualização compacta"
234235
changelog: "O que há de novo?"
235236
list:
236237
searchbar:

0 commit comments

Comments
 (0)