+
-
+
+ -
+
+
+
+ -
+
+
+
+ -
+
+
+
+
-
-
- -
-
+
{pinned && (
<>
-
+ -
+
+
-
>
@@ -49,4 +136,5 @@ const PmsHeaderOption = ({ pinned, onPinLeft, onPinRight, onUnpin }) => {
);
};
+
export default PmsHeaderOption;
diff --git a/src/services/pmsGrid/pms-grid.css b/src/services/pmsGrid/pms-grid.css
index f918dada..0903a295 100644
--- a/src/services/pmsGrid/pms-grid.css
+++ b/src/services/pmsGrid/pms-grid.css
@@ -229,4 +229,21 @@
top: 0;
margin-left: 0;
}
-}
\ No newline at end of file
+}
+
+
+
+.dropdown-submenu {
+ position: relative;
+}
+
+.dropdown-submenu > .dropdown-menu {
+ top: 0;
+ left: 100%;
+ margin-left: 0.1rem;
+ display: none;
+}
+
+.dropdown-submenu > .dropdown-menu.show {
+ display: block;
+}
diff --git a/src/services/pmsGrid/useGridCore.js b/src/services/pmsGrid/useGridCore.js
index 58e92f10..6b9ad34f 100644
--- a/src/services/pmsGrid/useGridCore.js
+++ b/src/services/pmsGrid/useGridCore.js
@@ -19,6 +19,8 @@ export function useGridCore({
const [search, setSearch] = useState("");
const [debouncedSearch, setDebouncedSearch] = useState("");
const [groupBy, setGroupBy] = useState(null);
+ const [serverGroupRows, setServerGroupRows] = useState(null);
+
const [sortBy, setSortBy] = useState({ key: null, dir: "asc" });
const [selected, setSelected] = useState(new Set());
const [expanded, setExpanded] = useState(new Set());
@@ -72,6 +74,20 @@ export function useGridCore({
// server-side fetch
const fetchServer = useCallback(async () => {
+ const sortFilters = sortBy.key
+ ? [
+ {
+ column: sortBy.key,
+ sortDescending: sortBy.dir === "desc",
+ },
+ ]
+ : [];
+
+ const filterPayload = JSON.stringify({
+ sortFilters,
+ groupByColumn: groupBy || null,
+ });
+
if (!serverMode || typeof fetcher !== "function") return;
setLoading(true);
try {
@@ -80,6 +96,7 @@ export function useGridCore({
pageSize,
sortBy,
search: debouncedSearch,
+ filter: filterPayload,
});
// expected: { rows: [], total }
setServerRows(resp.rows || []);
@@ -87,7 +104,7 @@ export function useGridCore({
} finally {
setLoading(false);
}
- }, [serverMode, fetcher, page, pageSize, sortBy, debouncedSearch]);
+ }, [serverMode, fetcher, page, pageSize, sortBy, debouncedSearch, groupBy]);
useEffect(() => {
if (serverMode) fetchServer();
@@ -133,11 +150,21 @@ export function useGridCore({
}, []);
const changeSort = useCallback((key) => {
- setSortBy((prev) =>
- prev.key === key
- ? { key, dir: prev.dir === "asc" ? "desc" : "asc" }
- : { key, dir: "asc" }
- );
+ setSortBy((prev) => {
+ // first click = asc
+ if (prev.key !== key) {
+ return { key, dir: "asc" };
+ }
+
+ // second click = desc
+ if (prev.dir === "asc") {
+ return { key, dir: "desc" };
+ }
+
+ // third click = remove sort
+ return { key: null, dir: "asc" };
+ });
+
setPage(1);
}, []);