import { injectable } from '@servicetitan/react-ioc'; import { InMemoryDataSource, TableState, AsyncSelectFilterDataFetcher, SelectFilterDataFetcher, } from '../..'; import { products } from '../overview/products'; import { categories, Category } from './categories'; @injectable() export class TableStore { tableState = new TableState({ dataSource: this.getDataSource(), pageSize: 5, }); get madeInOptions() { return Array.from(new Set(products.map(p => p.MadeIn))); } get packageOptions() { const map = products.reduce( (out, product) => ({ ...out, ...(product.Package ? { [product.Package.PackageId]: product.Package.PackageName } : {}), }), {} as Record ); return Object.keys(map) .map(Number) .map(id => ({ Id: id, Name: map[id] })); } categoryFetcher: AsyncSelectFilterDataFetcher = async opts => { await new Promise(resolve => setTimeout(resolve, 1500)); const sv = opts.search?.trim().toLowerCase(); return { data: categories .filter(cat => (sv ? cat.CategoryName.toLowerCase().includes(sv) : true)) .map(cat => ({ value: cat.CategoryID, text: cat.CategoryName })), }; }; madeInFetcher: AsyncSelectFilterDataFetcher = async opts => { await new Promise(resolve => setTimeout(resolve, 1500)); const sv = opts.search?.trim().toLowerCase(); return { data: this.madeInOptions .filter(opt => (sv ? opt.toLowerCase().includes(sv) : true)) .map(opt => ({ value: opt, text: opt })), }; }; categoryFetcherClean: SelectFilterDataFetcher = async opts => { await new Promise(resolve => setTimeout(resolve, 1500)); const sv = opts.search?.trim().toLowerCase(); return { data: categories.filter(cat => sv ? cat.CategoryName.toLowerCase().includes(sv) : true ), }; }; madeInFetcherClean: SelectFilterDataFetcher = async opts => { await new Promise(resolve => setTimeout(resolve, 1500)); const sv = opts.search?.trim().toLowerCase(); return { data: this.madeInOptions.filter(opt => (sv ? opt.toLowerCase().includes(sv) : true)), }; }; private getDataSource() { return new InMemoryDataSource(products, row => row.ProductID); } }