Skip to content

Commit 2332103

Browse files
committed
feat: add selection to gallery
1 parent b51e5a8 commit 2332103

File tree

14 files changed

+84
-17
lines changed

14 files changed

+84
-17
lines changed

packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -555,13 +555,13 @@ $root: ".widget-datagrid";
555555
align-items: center;
556556
}
557557

558-
:where(#{$root}-pb-left, #{$root}-pb-right, #{$root}-pb-middle) {
558+
:where(#{$root}-pb-start, #{$root}-pb-end, #{$root}-pb-middle) {
559559
flex-grow: 1;
560-
flex-basis: 33.3%;
560+
flex-basis: 33.33%;
561561
min-height: 20px;
562562
}
563563

564-
:where(#{$root}-pb-left) {
564+
:where(#{$root}-pb-start) {
565565
margin-block: var(--spacing-medium);
566566
padding-inline: var(--spacing-medium);
567567
}

packages/modules/data-widgets/src/themesource/datawidgets/web/_gallery.scss

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,28 @@ $gallery-screen-md: $screen-md;
8989
width: inherit;
9090
}
9191

92-
.widget-gallery-load-more {
92+
:where(.widget-gallery-footer-controls) {
9393
display: flex;
94-
justify-content: center;
94+
flex-flow: row nowrap;
95+
}
96+
97+
:where(.widget-gallery-fc-start) {
98+
margin-block: var(--spacing-medium);
99+
padding-inline: var(--spacing-medium);
100+
}
101+
102+
:where(.widget-gallery-fc-start, .widget-gallery-fc-middle, .widget-gallery-fc-end) {
103+
flex-grow: 1;
104+
flex-basis: 33.33%;
105+
min-height: 20px;
106+
}
107+
108+
.widget-gallery-clear-selection {
109+
cursor: pointer;
110+
background: transparent;
111+
border: none;
112+
text-decoration: underline;
113+
color: var(--link-color);
114+
padding: 0;
115+
display: inline-block;
95116
}

packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import { ColumnPreview } from "./helpers/ColumnPreview";
1818
import { DatagridContext } from "./helpers/root-context";
1919
import { useSelectActionHelper } from "./helpers/SelectActionHelper";
2020
import { GridBasicData } from "./helpers/state/GridBasicData";
21-
import { SelectionCountStore } from "./helpers/state/SelectionCountStore";
21+
22+
import { SelectionCountStore } from "@mendix/widget-plugin-grid/selection/stores/SelectionCountStore";
2223
import "./ui/DatagridPreview.scss";
2324

2425
// Fix type definition for Selectable

packages/pluggableWidgets/datagrid-web/src/components/WidgetFooter.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export function WidgetFooter(props: WidgetFooterProps): ReactElement | null {
1818
return (
1919
<div {...rest} className="widget-datagrid-footer table-footer">
2020
<div className="widget-datagrid-paging-bottom">
21-
<div className="widget-datagrid-pb-left">
21+
<div className="widget-datagrid-pb-start">
2222
<SelectionCounter />
2323
</div>
2424
{hasMoreItems && paginationType === "loadMore" && (
@@ -32,7 +32,7 @@ export function WidgetFooter(props: WidgetFooterProps): ReactElement | null {
3232
</button>
3333
</div>
3434
)}
35-
<div className="widget-datagrid-pb-right">
35+
<div className="widget-datagrid-pb-end">
3636
{(pagingPosition === "bottom" || pagingPosition === "both") && pagination}
3737
</div>
3838
</div>

packages/pluggableWidgets/datagrid-web/src/helpers/root-context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { FocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/FocusTargetController";
22
import { SelectionHelper } from "@mendix/widget-plugin-grid/selection";
3+
import { SelectionCountStore } from "@mendix/widget-plugin-grid/selection/stores/SelectionCountStore";
34
import { createContext, useContext } from "react";
45
import { GridBasicData } from "../helpers/state/GridBasicData";
56
import { EventsController } from "../typings/CellComponent";
67
import { SelectActionHelper } from "./SelectActionHelper";
7-
import { SelectionCountStore } from "./state/SelectionCountStore";
88

99
export interface DatagridRootScope {
1010
basicData: GridBasicData;

packages/pluggableWidgets/gallery-web/src/Gallery.editorPreview.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ function Preview(props: GalleryPreviewProps): ReactElement {
3434
desktopItems: props.desktopItems ?? 1,
3535
totalItems: items.length
3636
});
37+
3738
const getPositionCallback = useCallback(
3839
(index: number) => getColumnAndRowBasedOnIndex(numberOfColumns, items.length, index),
3940
[numberOfColumns, items.length]

packages/pluggableWidgets/gallery-web/src/Gallery.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ function useCreateGalleryScope(props: GalleryContainerProps): GalleryRootScope {
109109
return useConst<GalleryRootScope>({
110110
rootStore,
111111
selectionHelper,
112-
itemSelectHelper
112+
itemSelectHelper,
113+
selectionCountStore: rootStore.selectionCountStore
113114
});
114115
}
115116

packages/pluggableWidgets/gallery-web/src/Gallery.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,14 @@
186186
<caption>Item description</caption>
187187
<description>Assistive technology will read this upon reaching each gallery item.</description>
188188
</property>
189+
<property key="sCountFmtSingular" type="textTemplate" required="false">
190+
<caption>Row count singular</caption>
191+
<description>Must include '%d' to denote number position ('%d row selected')</description>
192+
</property>
193+
<property key="sCountFmtPlural" type="textTemplate" required="false">
194+
<caption>Row count plural</caption>
195+
<description>Must include '%d' to denote number position ('%d rows selected')</description>
196+
</property>
189197
</propertyGroup>
190198
</propertyGroup>
191199
</properties>

packages/pluggableWidgets/gallery-web/src/components/Gallery.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { ListItem } from "./ListItem";
1717
import { PaginationEnum, ShowPagingButtonsEnum } from "typings/GalleryProps";
1818
import { LoadMore, LoadMoreButton as LoadMorePreview } from "../components/LoadMore";
1919
import { ItemEventsController } from "../typings/ItemEventsController";
20+
import { SelectionCounter } from "./SelectionCounter";
2021

2122
export interface GalleryProps<T extends ObjectItem> {
2223
className?: string;
@@ -128,12 +129,15 @@ export function Gallery<T extends ObjectItem>(props: GalleryProps<T>): ReactElem
128129
</section>
129130
))}
130131
<GalleryFooter>
131-
{showBottomPagination && pagination}
132-
<div className="widget-gallery-load-more">
133-
{props.preview && props.paginationType === "loadMore" && (
134-
<LoadMorePreview>{loadMoreButtonCaption}</LoadMorePreview>
132+
<div className="widget-gallery-footer-controls">
133+
<div className="widget-gallery-fc-start">{!props.preview && <SelectionCounter />}</div>
134+
{props.paginationType === "loadMore" && (
135+
<div className="widget-gallery-fc-middle">
136+
{props.preview && <LoadMorePreview>{loadMoreButtonCaption}</LoadMorePreview>}{" "}
137+
{!props.preview && <LoadMore>{loadMoreButtonCaption}</LoadMore>}
138+
</div>
135139
)}
136-
{!props.preview && <LoadMore>{loadMoreButtonCaption}</LoadMore>}
140+
<div className="widget-gallery-fc-end">{showBottomPagination && pagination}</div>
137141
</div>
138142
</GalleryFooter>
139143
</GalleryRoot>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { If } from "@mendix/widget-plugin-component-kit/If";
2+
import { observer } from "mobx-react-lite";
3+
import { createElement } from "react";
4+
import { useGalleryRootScope } from "../helpers/root-context";
5+
6+
export const SelectionCounter = observer(function SelectionCounter() {
7+
const { selectionCountStore, itemSelectHelper } = useGalleryRootScope();
8+
9+
return (
10+
<If condition={selectionCountStore.displayCount !== ""}>
11+
<span className="widget-gallery-selection-count">{selectionCountStore.displayCount}</span>&nbsp;|&nbsp;
12+
<button className="widget-gallery-clear-selection" onClick={itemSelectHelper.onClearSelection}>
13+
Clear selection
14+
</button>
15+
</If>
16+
);
17+
});

0 commit comments

Comments
 (0)