@gpa-gemstone/react-interactive
Version: 
Interactive UI Components for GPA products
161 lines (160 loc) • 6.28 kB
TypeScript
import { AsyncThunk, Slice } from '@reduxjs/toolkit';
import { Application } from '@gpa-gemstone/application-typings';
import { Search } from './SearchBar';
import { WritableDraft } from 'immer/dist/types/types-external';
interface IOptions<T extends U> {
    /**
    * Optional function triggered on specific action dependencies.
    * @param state - The current state of type IState<T>.
    * @param action - The action triggering the dependency.
    * @param arg - Additional argument for the dependency.
    */
    ActionDependencies?: (state: IState<T>, action: string, arg: any) => void;
    /**
    * Optional function triggered on pending action dependencies.
    * @param state - The current state of type IState<T>.
    * @param action - The action triggering the dependency.
    * @param arg - Additional argument for the dependency.
    * @param requestID - The ID associated with the request.
    * */
    ActionPendingDependencies?: (state: IState<T>, action: string, arg: any, requestID: string) => void;
    /**
    * Optional function triggered on action error dependencies.
    * @param state - The current state of type IState<T>.
    * @param action - The action triggering the dependency.
    * @param arg - Additional argument for the dependency.
    * @param requestID - The ID associated with the request.
    */
    ActionErrorDependencies?: (state: IState<T>, action: string, arg: any, requestID: string) => void;
    /**
    * Optional function triggered on action fulfilled dependencies.
    * @param state - The current state of type IState<T>.
    * @param action - The action triggering the dependency.
    * @param arg - Additional argument for the dependency.
    * @param requestID - The ID associated with the request.
    */
    ActionFullfilledDependencies?: (state: IState<T>, action: string, arg: any, requestID: string) => void;
    /**
    * Array of additional thunks of type IAdditionalThunk<T>.
    */
    AddionalThunks?: IAdditionalThunk<T>[];
}
interface IAdditionalThunk<T extends U> {
    Name: string;
    Fetch: (state: IState<T>, args: any | void) => null | JQuery.jqXHR<any>;
    OnSuccess?: (state: WritableDraft<IState<T>>, requestId: string, data: any, args: any | void) => void;
    OnFailure?: (state: WritableDraft<IState<T>>, requestId: string, args: any | void, error: any) => void;
    OnPending?: (state: WritableDraft<IState<T>>, requestId: string, args: any | void) => void;
}
/**
* Common properties of an object type U with an ID of type number or string, including error message, verb, and time in string format.
*/
interface U {
    ID: number | string;
}
interface IError {
    Message: string;
    Verb: 'POST' | 'DELETE' | 'PATCH' | 'FETCH' | 'SEARCH' | 'PAGE';
    Time: string;
}
/**
* Represents the state of the application with generic type T extending U.
*/
export interface IState<T extends U> {
    Status: Application.Types.Status;
    ActiveFetchID: string[];
    SearchStatus: Application.Types.Status;
    ActiveSearchID: string[];
    Error: (IError | null);
    Data: T[];
    SortField: keyof T;
    Ascending: boolean;
    ParentID: (number | null | string);
    SearchResults: T[];
    Filter: Search.IFilter<T>[];
}
/**
 * Interface representing a state with paging capabilities, extending IState<T>.
 */
interface IPagedState<T extends U> extends IState<T> {
    PagedStatus: Application.Types.Status;
    ActivePagedID: string[];
    CurrentPage: number;
    TotalPages: number;
    TotalRecords: number;
    PagedData: T[];
    PagedSortField: keyof T;
    PagedAscending: boolean;
    PagedFilter: Search.IFilter<T>[];
}
/**
 * A generic class providing functionalities related to a slice of data.
 */
export default class GenericSlice<T extends U> {
    Name: string;
    APIPath: string;
    Slice: (Slice<IPagedState<T>>);
    Fetch: (AsyncThunk<any, void | number | string, {}>);
    SetChanged: (AsyncThunk<any, void, {}>);
    DBAction: (AsyncThunk<any, {
        verb: 'POST' | 'DELETE' | 'PATCH';
        record: T;
    }, {}>);
    DBSearch: (AsyncThunk<any, {
        filter: Search.IFilter<T>[];
        sortField?: keyof T;
        ascending?: boolean;
    }, {}>);
    PagedSearch: (AsyncThunk<any, {
        filter?: Search.IFilter<T>[];
        sortField?: keyof T;
        ascending?: boolean;
        page?: number;
    }, {}>);
    Sort: (AsyncThunk<any, {
        SortField: keyof T;
        Ascending: boolean;
    }, {}>);
    AdditionalThunk: {
        [key: string]: AsyncThunk<any, any, {}>;
    };
    Reducer: any;
    private fetchHandle;
    private searchHandle;
    private pageHandle;
    private controller;
    private actionDependency;
    private actionFullfilledDependency;
    private actionPendingDependency;
    private actionErrorDependency;
    /**
     * Creates a new GenericSlice of type T, which can be used to perform basic CRUD operations against
     * a specified web api.
     * @typeParam T - Model of Generic Slice
     * @param {string} name - string defining the name of the slice in the store
     * @param {string} apiPath - string containing relative path to web api
     * @param {keyof T} defaultSort - string showing default sort field
     * @param {boolean} ascending - (optional) default sort direction - defaults to true
     * @returns a new GenericSlice<T>
     */
    constructor(name: string, apiPath: string, defaultSort: keyof T, ascending?: boolean, options?: IOptions<T> | null);
    Data: (state: any) => T[];
    Error: (state: any) => IError;
    Datum: (state: any, id: number | string) => T;
    Status: (state: any) => Application.Types.Status;
    SortField: (state: any) => keyof T;
    Ascending: (state: any) => boolean;
    ParentID: (state: any) => number | string;
    SearchResults: (state: any) => T[];
    SearchStatus: (state: any) => Application.Types.Status;
    SearchFilters: (state: any) => Search.IFilter<T>[];
    PagedResults: (state: any) => T[];
    PagedStatus: (state: any) => Application.Types.Status;
    PagedFilters: (state: any) => Search.IFilter<T>[];
    PagedSortField: (state: any) => keyof T;
    PagedAscending: (state: any) => boolean;
    CurrentPage: (state: any) => number;
    TotalPages: (state: any) => number;
    TotalRecords: (state: any) => number;
}
export {};