Client: Added lazy-loading for filter drop downs

This commit is contained in:
Donkie
2023-09-16 11:11:48 +02:00
parent 58fdbb4d85
commit 91e4171ff8
2 changed files with 40 additions and 2 deletions

View File

@@ -1,4 +1,4 @@
import { Col, Row, Table } from "antd"; import { Col, Row, Spin, Table } from "antd";
import { ColumnProps as AntdColumnProps } from "antd/es/table"; import { ColumnProps as AntdColumnProps } from "antd/es/table";
import { ColumnFilterItem } from "antd/es/table/interface"; import { ColumnFilterItem } from "antd/es/table/interface";
import { getFiltersForField, typeFilters } from "../utils/filtering"; import { getFiltersForField, typeFilters } from "../utils/filtering";
@@ -16,6 +16,17 @@ import { UseQueryResult } from "@tanstack/react-query";
dayjs.extend(utc); dayjs.extend(utc);
const FilterDropdownLoading = () => {
return (
<Row justify="center">
<Col>
Loading...
<Spin style={{ margin: 10 }} />
</Col>
</Row>
);
};
interface BaseColumnProps<Obj> { interface BaseColumnProps<Obj> {
id: keyof Obj & string; id: keyof Obj & string;
dataId?: keyof Obj & string; dataId?: keyof Obj & string;
@@ -30,6 +41,8 @@ interface FilteredColumnProps {
filters?: ColumnFilterItem[]; filters?: ColumnFilterItem[];
filteredValue?: string[]; filteredValue?: string[];
allowMultipleFilters?: boolean; allowMultipleFilters?: boolean;
onFilterDropdownOpen?: () => void;
loadingFilters?: boolean;
} }
interface CustomColumnProps<Obj> { interface CustomColumnProps<Obj> {
@@ -61,6 +74,14 @@ function Column<Obj>(props: BaseColumnProps<Obj> & FilteredColumnProps & CustomC
if (props.filters && props.filteredValue) { if (props.filters && props.filteredValue) {
columnProps.filters = props.filters; columnProps.filters = props.filters;
columnProps.filteredValue = props.filteredValue; columnProps.filteredValue = props.filteredValue;
if (props.loadingFilters) {
columnProps.filterDropdown = <FilterDropdownLoading />;
}
columnProps.onFilterDropdownOpenChange = (open) => {
if (open && props.onFilterDropdownOpen) {
props.onFilterDropdownOpen();
}
};
if (props.dataId) { if (props.dataId) {
columnProps.key = props.dataId; columnProps.key = props.dataId;
} }
@@ -115,7 +136,11 @@ export function FilteredQueryColumn<Obj>(props: FilteredQueryColumnProps<Obj>) {
const typedFilters = typeFilters<Obj>(props.tableState.filters); const typedFilters = typeFilters<Obj>(props.tableState.filters);
const filteredValue = getFiltersForField(typedFilters, props.dataId ?? props.id); const filteredValue = getFiltersForField(typedFilters, props.dataId ?? props.id);
return Column({ ...props, filters, filteredValue }); const onFilterDropdownOpen = () => {
query.refetch();
};
return Column({ ...props, filters, filteredValue, onFilterDropdownOpen, loadingFilters: query.isLoading });
} }
interface NumberColumnProps<Obj> extends BaseColumnProps<Obj> { interface NumberColumnProps<Obj> extends BaseColumnProps<Obj> {
@@ -188,10 +213,16 @@ export function SpoolIconColumn<Obj>(props: SpoolIconColumnProps<Obj>) {
const typedFilters = typeFilters<Obj>(props.tableState.filters); const typedFilters = typeFilters<Obj>(props.tableState.filters);
const filteredValue = getFiltersForField(typedFilters, props.dataId ?? props.id); const filteredValue = getFiltersForField(typedFilters, props.dataId ?? props.id);
const onFilterDropdownOpen = () => {
query.refetch();
};
return Column({ return Column({
...props, ...props,
filters, filters,
filteredValue, filteredValue,
onFilterDropdownOpen,
loadingFilters: query.isLoading,
onCell: () => { onCell: () => {
return { return {
style: { style: {

View File

@@ -6,6 +6,7 @@ import { ColumnFilterItem } from "antd/es/table/interface";
export function useSpoolmanFilamentFilter() { export function useSpoolmanFilamentFilter() {
const apiEndpoint = import.meta.env.VITE_APIURL; const apiEndpoint = import.meta.env.VITE_APIURL;
return useQuery<IFilament[], unknown, ColumnFilterItem[]>({ return useQuery<IFilament[], unknown, ColumnFilterItem[]>({
enabled: false,
queryKey: ["filaments"], queryKey: ["filaments"],
queryFn: async () => { queryFn: async () => {
const response = await fetch(apiEndpoint + "/filament"); const response = await fetch(apiEndpoint + "/filament");
@@ -46,6 +47,7 @@ export function useSpoolmanFilamentFilter() {
export function useSpoolmanFilamentNames() { export function useSpoolmanFilamentNames() {
const apiEndpoint = import.meta.env.VITE_APIURL; const apiEndpoint = import.meta.env.VITE_APIURL;
return useQuery<IFilament[], unknown, string[]>({ return useQuery<IFilament[], unknown, string[]>({
enabled: false,
queryKey: ["filaments"], queryKey: ["filaments"],
queryFn: async () => { queryFn: async () => {
const response = await fetch(apiEndpoint + "/filament"); const response = await fetch(apiEndpoint + "/filament");
@@ -74,6 +76,7 @@ export function useSpoolmanFilamentNames() {
export function useSpoolmanVendors() { export function useSpoolmanVendors() {
const apiEndpoint = import.meta.env.VITE_APIURL; const apiEndpoint = import.meta.env.VITE_APIURL;
return useQuery<IVendor[], unknown, string[]>({ return useQuery<IVendor[], unknown, string[]>({
enabled: false,
queryKey: ["vendors"], queryKey: ["vendors"],
queryFn: async () => { queryFn: async () => {
const response = await fetch(apiEndpoint + "/vendor"); const response = await fetch(apiEndpoint + "/vendor");
@@ -95,6 +98,7 @@ export function useSpoolmanVendors() {
export function useSpoolmanMaterials() { export function useSpoolmanMaterials() {
const apiEndpoint = import.meta.env.VITE_APIURL; const apiEndpoint = import.meta.env.VITE_APIURL;
return useQuery<string[]>({ return useQuery<string[]>({
enabled: false,
queryKey: ["materials"], queryKey: ["materials"],
queryFn: async () => { queryFn: async () => {
const response = await fetch(apiEndpoint + "/material"); const response = await fetch(apiEndpoint + "/material");
@@ -112,6 +116,7 @@ export function useSpoolmanMaterials() {
export function useSpoolmanArticleNumbers() { export function useSpoolmanArticleNumbers() {
const apiEndpoint = import.meta.env.VITE_APIURL; const apiEndpoint = import.meta.env.VITE_APIURL;
return useQuery<string[]>({ return useQuery<string[]>({
enabled: false,
queryKey: ["articleNumbers"], queryKey: ["articleNumbers"],
queryFn: async () => { queryFn: async () => {
const response = await fetch(apiEndpoint + "/article-number"); const response = await fetch(apiEndpoint + "/article-number");
@@ -129,6 +134,7 @@ export function useSpoolmanArticleNumbers() {
export function useSpoolmanLotNumbers() { export function useSpoolmanLotNumbers() {
const apiEndpoint = import.meta.env.VITE_APIURL; const apiEndpoint = import.meta.env.VITE_APIURL;
return useQuery<string[]>({ return useQuery<string[]>({
enabled: false,
queryKey: ["lotNumbers"], queryKey: ["lotNumbers"],
queryFn: async () => { queryFn: async () => {
const response = await fetch(apiEndpoint + "/lot-number"); const response = await fetch(apiEndpoint + "/lot-number");
@@ -146,6 +152,7 @@ export function useSpoolmanLotNumbers() {
export function useSpoolmanLocations() { export function useSpoolmanLocations() {
const apiEndpoint = import.meta.env.VITE_APIURL; const apiEndpoint = import.meta.env.VITE_APIURL;
return useQuery<string[]>({ return useQuery<string[]>({
enabled: false,
queryKey: ["locations"], queryKey: ["locations"],
queryFn: async () => { queryFn: async () => {
const response = await fetch(apiEndpoint + "/location"); const response = await fetch(apiEndpoint + "/location");