diff --git a/package.json b/package.json
index 660b569..8d987fc 100644
--- a/package.json
+++ b/package.json
@@ -34,6 +34,7 @@
"flatpickr": "4.6.9",
"formik": "2.2.9",
"html-react-parser": "1.4.8",
+ "http-proxy-middleware": "2.0.6",
"react": "17.0.2",
"react-chartjs-2": "3.0.4",
"react-dom": "17.0.2",
diff --git a/src/page.routes.tsx b/src/page.routes.tsx
index 3974ada..93ca6ce 100644
--- a/src/page.routes.tsx
+++ b/src/page.routes.tsx
@@ -76,9 +76,9 @@ const pageRoutes = [
name: "pricing page",
route: "/pages/pricing-page",
},
- { name: "RTL", route: "/pages/rtl" },
- { name: "widgets", route: "/pages/widgets" },
- { name: "charts", route: "/pages/charts" },
+ {name: "RTL", route: "/pages/rtl"},
+ {name: "widgets", route: "/pages/widgets"},
+ {name: "charts", route: "/pages/charts"},
{
name: "notfications",
route: "/pages/notifications",
diff --git a/src/qqq/pages/entity-list/index.tsx b/src/qqq/pages/entity-list/index.tsx
index 876fb81..11303d9 100644
--- a/src/qqq/pages/entity-list/index.tsx
+++ b/src/qqq/pages/entity-list/index.tsx
@@ -20,7 +20,7 @@ import Icon from "@mui/material/Icon";
import Menu from "@mui/material/Menu";
import MenuItem from "@mui/material/MenuItem";
import Link from "@mui/material/Link";
-import {Alert} from "@mui/material";
+import {Alert, tableFooterClasses} from "@mui/material";
import {
DataGridPro,
GridCallbackDetails,
@@ -38,7 +38,9 @@ import {
GridToolbarContainer,
GridToolbarDensitySelector,
GridToolbarExport,
+ GridToolbarExportContainer,
GridToolbarFilterButton,
+ GridExportMenuItemProps,
} from "@mui/x-data-grid-pro";
// Material Dashboard 2 PRO React TS components
@@ -96,6 +98,7 @@ function EntityList({table}: Props): JSX.Element
const [buttonText, setButtonText] = useState("");
const [tableState, setTableState] = useState("");
+ const [tableMetaData, setTableMetaData] = useState(null as QTableMetaData);
const [, setFiltersMenu] = useState(null);
const [actionsMenu, setActionsMenu] = useState(null);
const [tableProcesses, setTableProcesses] = useState([] as QProcessMetaData[]);
@@ -189,11 +192,12 @@ function EntityList({table}: Props): JSX.Element
{
(async () =>
{
- const tableMetaData = await QClient.loadTableMetaData(tableName);
+ const newTableMetaData = await QClient.loadTableMetaData(tableName);
+ setTableMetaData(newTableMetaData);
if (columnSortModel.length === 0)
{
columnSortModel.push({
- field: tableMetaData.primaryKeyField,
+ field: newTableMetaData.primaryKeyField,
sort: "desc",
});
setColumnSortModel(columnSortModel);
@@ -203,8 +207,8 @@ function EntityList({table}: Props): JSX.Element
const count = await QClient.count(tableName, qFilter);
setTotalRecords(count);
- setButtonText(`new ${tableMetaData.label}`);
- setTableLabel(tableMetaData.label);
+ setButtonText(`new ${newTableMetaData.label}`);
+ setTableLabel(newTableMetaData.label);
const columns = [] as GridColDef[];
@@ -233,10 +237,10 @@ function EntityList({table}: Props): JSX.Element
rows.push(Object.fromEntries(record.values.entries()));
});
- const sortedKeys = [...tableMetaData.fields.keys()].sort();
+ const sortedKeys = [...newTableMetaData.fields.keys()].sort();
sortedKeys.forEach((key) =>
{
- const field = tableMetaData.fields.get(key);
+ const field = newTableMetaData.fields.get(key);
let columnType = "string";
switch (field.type)
@@ -265,7 +269,7 @@ function EntityList({table}: Props): JSX.Element
width: 200,
};
- if (key === tableMetaData.primaryKeyField)
+ if (key === newTableMetaData.primaryKeyField)
{
column.width = 75;
columns.splice(0, 0, column);
@@ -366,6 +370,67 @@ function EntityList({table}: Props): JSX.Element
})();
}
+ interface QExportMenuItemProps extends GridExportMenuItemProps<{}>
+ {
+ format: string;
+ }
+
+ function ExportMenuItem(props: QExportMenuItemProps)
+ {
+ const {format, hideMenu} = props;
+
+ return (
+
+ );
+ }
+
function CustomToolbar()
{
return (
@@ -373,7 +438,10 @@ function EntityList({table}: Props): JSX.Element