Client: Added lazy-loading for filter drop downs
This commit is contained in:
@@ -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: {
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user