mantine-entity
Version:
A library combining Mantine, TanStack Query, and Mantine React Table for efficient entity management
122 lines (121 loc) • 4.01 kB
TypeScript
import { MRT_RowData, type MRT_ColumnDef } from "mantine-react-table";
import { TField } from "../form-builder/model";
import { FieldPath, UseFormProps } from "react-hook-form";
import { JSX } from "react";
import { Collection, FilterOperator } from "../../models/collection-query";
export type QueryType = "GET" | "POST" | "PUT" | "DELETE";
export type ActionType = "list" | "view" | "create" | "update" | "delete";
export type QueryBuilder<T extends MRT_RowData> = {
[K in ActionType]?: ActionQuery<T>;
};
export type ActionQuery<T extends MRT_RowData> = {
url: (data?: Partial<T>) => string;
method: QueryType;
queryKey?: string;
collectionQuery?: Collection<FieldPath<T>>;
dataType?: "paginated" | "un-paginated";
};
export type RootConfig = {
feat: string;
title: string;
metadata: any;
img?: string;
path: string;
icon?: JSX.Element;
mainQueryKey?: string;
};
export type RenderTableProps<T extends MRT_RowData> = {
feat: string;
columns?: MRT_ColumnDef<T>[];
filters?: RenderFilterColumn<T>[];
renderCustomActions?: (data: T) => React.ReactNode;
queryBuilder?: QueryBuilder<T>;
accessorKey?: string;
rootConfig?: RootConfig;
q?: string;
requestParams: RequestParams;
searchParams: URLSearchParams;
LinkComponent: any;
currentPermissions?: any;
appMainPath: string;
renderActionToolBar?: React.ReactNode;
};
export type RenderTable<T extends MRT_RowData> = {
columns?: MRT_ColumnDef<T>[];
filters?: RenderFilterColumn<T>[];
accessorKey?: string;
renderCustomActions?: (data: T) => React.ReactNode;
appMainPath?: string;
};
export type RenderFormProps<T extends MRT_RowData> = {
feat: string;
fields: TField<T>[];
defaultValues?: UseFormProps<T>["defaultValues"];
queryBuilder?: QueryBuilder<T>;
rootConfig?: RootConfig;
mapDefaultValue?: (data: T | undefined) => T | undefined;
disableOn?: {
create?: TField<T>["name"][];
update?: TField<T>["name"][];
};
hiddenOn?: {
create?: TField<T>["name"][];
update?: TField<T>["name"][];
};
requestParams: RequestParams;
navigator: (href: string) => void;
searchParams: URLSearchParams;
appMainPath: string;
};
export type RenderForm<T extends MRT_RowData> = {
fields: TField<T>[];
defaultValues?: UseFormProps<T>["defaultValues"];
queryBuilder?: QueryBuilder<T>;
mapDefaultValue?: (data: T | undefined) => T | undefined;
disableOn?: {
create?: TField<T>["name"][];
update?: TField<T>["name"][];
};
hiddenOn?: {
create?: TField<T>["name"][];
update?: TField<T>["name"][];
};
};
export type RenderDetailViewProps<T extends MRT_RowData> = {
feat: string;
queryBuilder?: QueryBuilder<T>;
rootConfig?: RootConfig;
requestParams: RequestParams;
searchParams: URLSearchParams;
appMainPath: string;
};
export interface RenderFilterColumn<T extends MRT_RowData> extends Omit<TField<T>, "name"> {
name: FieldPath<T>;
operators?: FilterOperator[];
}
export type EntityConfig<T extends MRT_RowData> = {
rootConfig?: RootConfig;
queryBuilder?: QueryBuilder<T>;
table?: RenderTable<T>;
form?: RenderForm<T>;
};
export interface EntityProviderProps<T extends MRT_RowData> extends EntityConfig<T> {
params: {
feat: string;
method: string;
};
q?: string;
LinkComponent: any;
currentPermissions?: any;
requestParams: RequestParams;
navigator: (href: string) => void;
searchParams: URLSearchParams;
appMainPath: string;
}
export type RequestParams = {
getBaseUrl: (path: string) => string;
httpGet<TResponse>(url: string): Promise<TResponse>;
httpPost<TResponse, TArgs>(url: string, options?: TArgs | undefined): Promise<TResponse>;
httpPut<TResponse, TArgs>(url: string, options?: TArgs | undefined): Promise<TResponse>;
httpDelete<TResponse>(url: string): Promise<TResponse>;
};