{"version":3,"file":"bootkit-ng1-data.mjs","sources":["../../../projects/ng1/data/data-request.ts","../../../projects/ng1/data/data-result.ts","../../../projects/ng1/data/data-source.ts","../../../projects/ng1/data/local-data-source.ts","../../../projects/ng1/data/remote-data-source.ts","../../../projects/ng1/data/data-source-attribute.ts","../../../projects/ng1/data/data-result-operator.ts","../../../projects/ng1/data/bootkit-ng1-data.ts"],"sourcesContent":["import { FilterPredicate } from \"@bootkit/ng1/common\";\n\n/**\n * DataRequest class represents a request for data with pagination, filtering, sorting, and field selection.\n * It is used to encapsulate the parameters needed to fetch data from a data source.\n * It can be used with various data sources such as HTTP services, in-memory arrays, etc.\n * \n */\nexport class DataRequest {\n    public page?: DataRequestPage;\n    public filters?: DataRequestFilter[];\n    public sort?: DataRequestSort;\n    public select?: string[];\n    public computeTotal?: boolean;\n\n    constructor(options?: {\n        page?: DataRequestPage,\n        filters?: DataRequestFilter[],\n        sort?: DataRequestSort,\n        select?: string[],\n        computeTotal?: boolean,\n    }) {\n        this.page = options?.page;\n        this.filters = options?.filters;\n        this.sort = options?.sort;\n        this.select = options?.select;\n        this.computeTotal = options?.computeTotal;\n    }\n}\n\n/**\n * Represents a data request page.\n */\nexport interface DataRequestPage {\n    /**\n     * Zero-based index of the page.\n     */\n    index: number;\n\n    /**\n     * Size of the page, i.e., number of items in each page.\n     */\n    size: number;\n}\n\n/**\n * Represents a sorting option in a DataRequest.\n * @property field The field to sort by.\n * @property asc Whether to sort in ascending order.\n */\nexport interface DataRequestSort {\n    field: string;\n    asc?: boolean\n}\n\n/**\n * Represents a filter in a DataRequest.\n */\nexport interface DataRequestFilter {\n    /**\n     * The field to filter by.\n     * It can be a string representing the property name of the data items.\n     */\n    field?: string;\n\n    /**\n     * The value to filter by.\n     * It can be a string, number, or any other type depending on the field.\n     */\n    value?: string;\n\n    /**\n     * The operator to use for filtering.\n     * It can be one of the standard filter operators like Contains, StartsWith, EndsWith, Equals, etc.\n     */\n    operator?: string;\n\n    /**\n     * Indicates if the filter is case-sensitive. only for text columns.\n     * Default is false.\n     */\n    caseSensitive?: boolean;\n\n    /**\n     * A custom filter function to apply for filtering.\n     */\n    filterBy?: FilterPredicate;\n}\n\n// export enum DataRequestFilterOperator {\n//     EQ = 0,\n//     NEQ = 1,\n//     LT = 2,\n//     LTE = 3,\n//     GT = 4,\n//     GTE = 5,\n//     LI = 6,\n//     SW = 7,\n// }\n","export class DataResult<T = any> {\n  constructor(\n    public readonly data: T[],\n    public readonly total?: number) {\n  }\n}\n","import { Observable } from \"rxjs\";\nimport { DataRequest } from \"./data-request\";\nimport { DataResult } from \"./data-result\";\nimport { signal } from \"@angular/core\";\n\n/**\n * DataLoader is a function that takes a DataRequest and returns an Observable of DataResult.\n * It is used by RemoteDataSource to load data asynchronously.\n */\nexport type DataLoader<T = any> = (request: DataRequest) => Observable<DataResult<T>>;\n\n\n/**\n * Abstract base class for data sources.\n * This class provides a common interface for loading data from various sources.\n */\nexport abstract class DataSource<T = any> {\n  public abstract readonly type: 'local' | 'remote';\n  protected _isLoading = signal(false);\n\n  /**\n   * Indicates whether the data source is currently loading data.\n   */\n  public isLoading = this._isLoading.asReadonly();\n\n  constructor() {\n  }\n\n  /**\n   * Loads data from the data source.\n   * @param request The data request object containing pagination, sorting, and filtering information.\n   */\n  abstract load(request: DataRequest): Observable<DataResult>;\n}\n\n/**\n * DataSourceLike is a type that can be used to represent any data source\n * that can be used with the table, autocomplete, dropdown and any component that requires data.\n * It can be an array of data, a function that returns an observable of data,\n * or an instance of DataSource.\n */\nexport type DataSourceLike<T = any> =\n  Array<any> |\n  DataLoader<T> |\n  DataSource<T> |\n  Record<string, string | number> | // enum: extract enum or object values\n  undefined |\n  null;\n","import { of } from \"rxjs\";\nimport { DataRequest, DataRequestFilter } from \"./data-request\";\nimport { DataResult } from \"./data-result\";\nimport { DataSource } from \"./data-source\";\nimport { getEnumValues } from \"@bootkit/ng1/common\";\n\n/**\n * An implementation of DataSource that uses an array as the data source.\n * This is useful for static data or when you want to manage the data manually.\n */\nexport class LocalDataSource extends DataSource {\n  readonly type = 'local';\n\n  /**\n   * Creates a new LocalDataSource.\n   * @param items The array of items to be used as the data source. \n   */\n  constructor(private items: any[]) {\n    super();\n  }\n\n  /**\n * Creates a LocalDataSource from enum values.\n * @param enumClass The enum class to extract values from.\n * @returns A LocalDataSource containing the enum values.\n */\n  public static fromEnum(enumClass: Record<string, string | number>): LocalDataSource {\n    return new LocalDataSource(getEnumValues(enumClass));\n  }\n\n  /**\n   * Loads data from the local array based on the provided DataRequest.\n   * @param request The DataRequest containing filtering, sorting, and pagination information.\n   * @returns An observable of DataResult containing the requested data. \n   */\n  load(request: DataRequest) {\n    let filteredValues = [...this.items];\n    let result: any[];\n\n    // Filtering\n    // if (Array.isArray(request.filters) && request.filters.length > 0) {\n    //   request.filters.forEach(filter => {\n    //     if (!filter.filterBy) {\n    //       throw Error('A filterBy function must be provided for LocalDataSource filters.');\n    //     }\n\n    //     let isPassedByFilter = getFilterFunction(filter);\n\n    //     for (let i = 0; i < filteredValues.length; i++) {\n    //       let row = filteredValues[i];\n    //       if (!isPassedByFilter(row[filter.field], filter.value)) {\n    //         filteredValues.splice(i, 1);\n    //         i--; // Adjust index after removal\n    //       }\n    //     }\n    //   });\n    // }\n\n    // Pagination\n    if (request.page) {\n      let startItemIndex = request.page.index * request.page.size;\n      result = filteredValues.slice(startItemIndex, startItemIndex + request.page.size);\n    } else {\n      result = filteredValues;\n    }\n\n    // Sorting\n    if (request.sort) {\n\n    }\n\n    let dataResult = new DataResult(result, filteredValues.length);\n\n    // this._loading = true;\n    // return of(result).pipe(\n    //   delay(5000),\n    //   tap(x => this._loading = false)\n    // );\n    return of(dataResult);\n  }\n}\n\nfunction getFilterFunction(requestfilter: DataRequestFilter): (cellValue: any, filterValue: any) => boolean {\n  let operator = requestfilter.operator || 'contains';\n  let caseSensitive = requestfilter.caseSensitive || false;\n\n  // if (requestfilter.value === undefined || requestfilter.value === null) {\n  //   return (item: any) => true; // No filter applied\n  // }\n\n  switch (requestfilter.operator) {\n    case 'contains':\n      return caseSensitive ?\n        (item: string, filter: string) => item.includes(filter) :\n        (item: string, filter: string) => item.toLowerCase().includes(filter.toLowerCase());\n\n    case 'startsWith':\n      return caseSensitive ?\n        (item: string, filter: string) => item.startsWith(filter) :\n        (item: string, filter: string) => item.toLowerCase().startsWith(filter.toLowerCase());\n\n    case 'endsWith':\n      return caseSensitive ?\n        (item: string, filter: string) => item.endsWith(filter) :\n        (item: string, filter: string) => item.toLowerCase().endsWith(filter.toLowerCase());\n\n    case 'eq':\n      if (typeof requestfilter.value === 'string') {\n        return caseSensitive ?\n          (item: string, filter: string) => item == filter :\n          (item: string, filter: string) => item.toString().toLowerCase() === filter.toLowerCase();\n      } else {\n        return (item: any, filter: any) => item === filter;\n      }\n\n    case 'lt':\n      return (item: any, filter: any) => item < filter;\n\n    case 'lte':\n      return (item: any, filter: any) => item <= filter;\n\n    case 'gt':\n      return (item: any, filter: any) => item > filter;\n\n    case 'gte':\n      return (item: any, filter: any) => item >= filter;\n\n    case 'ne':\n      return (item: any, filter: any) => item !== filter;\n\n    default:\n      throw new Error(`filter operator: ${operator} is not implemented in ArrayDataSource.`);\n  }\n}","import { catchError, Observable, tap } from \"rxjs\";\nimport { DataRequest } from \"./data-request\";\nimport { DataLoader, DataSource } from \"./data-source\";\n\n\n/**\n * RemoteDataSource is a DataSource that loads data asynchronously using a DataLoader function.\n * It is used to fetch data from a remote source, such as an API.\n */\nexport class RemoteDataSource extends DataSource {\n  readonly type = 'remote';\n\n  constructor(private readonly loader: DataLoader) {\n    super();\n\n    if (typeof loader !== 'function') {\n      throw 'Invalid data loader';\n    }\n  }\n\n  load(request: DataRequest) {\n    this._isLoading.set(true);\n\n    return this.loader(request).pipe(\n      catchError(err => {\n        this._isLoading.set(false);\n        throw err;\n      }),\n      tap(res => {\n        this._isLoading.set(false);\n      })\n    )\n  }\n}\n","import { LocalDataSource } from \"./local-data-source\";\nimport { RemoteDataSource } from \"./remote-data-source\";\nimport { DataSource, DataSourceLike } from \"./data-source\";\n\n/**\n * Converts a DataSourceLike to a DataSource instance.\n * @param source The data source to convert.\n * @returns A DataSource instance.\n */\nexport function dataSourceAttribute<T>(source: DataSourceLike): DataSource<T> {\n  if (Array.isArray(source)) {\n    return new LocalDataSource(source);\n  } else if (typeof source == 'function') {\n    return new RemoteDataSource(source);\n  } else if (source instanceof DataSource) {\n    return source;\n  } else if (source === undefined || source === null) {\n    return new LocalDataSource([]);\n  } else if (typeof source === 'object') {\n    return LocalDataSource.fromEnum(source);\n  } else {\n    throw new Error('Invalid data source.');\n  }\n}\n","import { Observable } from \"rxjs\";\nimport { DataResult } from \"./data-result\";\nimport { DataRequest } from \"./data-request\";\n\nexport function toDataResult<T=any>(dr: DataRequest) {\n  return function (source: Observable<any>): Observable<DataResult<T>> {\n    return new Observable(subscriber => {\n      source.subscribe({\n        next(event) {\n          subscriber.next(new DataResult(event));\n        },\n        error(error) {\n          subscriber.error(error);\n        },\n        complete() {\n          subscriber.complete();\n        }\n      });\n    });\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAEA;;;;;AAKG;MACU,WAAW,CAAA;AACb,IAAA,IAAI;AACJ,IAAA,OAAO;AACP,IAAA,IAAI;AACJ,IAAA,MAAM;AACN,IAAA,YAAY;AAEnB,IAAA,WAAA,CAAY,OAMX,EAAA;AACG,QAAA,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI;AACzB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO;AAC/B,QAAA,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI;AACzB,QAAA,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM;AAC7B,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY;IAC7C;AACH;AA6DD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;MClGa,UAAU,CAAA;AAEH,IAAA,IAAA;AACA,IAAA,KAAA;IAFlB,WAAA,CACkB,IAAS,EACT,KAAc,EAAA;QADd,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,KAAK,GAAL,KAAK;IACvB;AACD;;ACOD;;;AAGG;MACmB,UAAU,CAAA;AAEpB,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAEpC;;AAEG;AACI,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AAE/C,IAAA,WAAA,GAAA;IACA;AAOD;;AC3BD;;;AAGG;AACG,MAAO,eAAgB,SAAQ,UAAU,CAAA;AAOzB,IAAA,KAAA;IANX,IAAI,GAAG,OAAO;AAEvB;;;AAGG;AACH,IAAA,WAAA,CAAoB,KAAY,EAAA;AAC9B,QAAA,KAAK,EAAE;QADW,IAAA,CAAA,KAAK,GAAL,KAAK;IAEzB;AAEA;;;;AAIC;IACM,OAAO,QAAQ,CAAC,SAA0C,EAAA;QAC/D,OAAO,IAAI,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACtD;AAEA;;;;AAIG;AACH,IAAA,IAAI,CAAC,OAAoB,EAAA;QACvB,IAAI,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,MAAa;;;;;;;;;;;;;;;;;;AAsBjB,QAAA,IAAI,OAAO,CAAC,IAAI,EAAE;AAChB,YAAA,IAAI,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI;AAC3D,YAAA,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QACnF;aAAO;YACL,MAAM,GAAG,cAAc;QACzB;;AAGA,QAAA,IAAI,OAAO,CAAC,IAAI,EAAE;QAElB;QAEA,IAAI,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;;;;;;AAO9D,QAAA,OAAO,EAAE,CAAC,UAAU,CAAC;IACvB;AACD;AAED,SAAS,iBAAiB,CAAC,aAAgC,EAAA;AACzD,IAAA,IAAI,QAAQ,GAAG,aAAa,CAAC,QAAQ,IAAI,UAAU;AACnD,IAAA,IAAI,aAAa,GAAG,aAAa,CAAC,aAAa,IAAI,KAAK;;;;AAMxD,IAAA,QAAQ,aAAa,CAAC,QAAQ;AAC5B,QAAA,KAAK,UAAU;YACb,OAAO,aAAa;AAClB,gBAAA,CAAC,IAAY,EAAE,MAAc,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AACvD,gBAAA,CAAC,IAAY,EAAE,MAAc,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;AAEvF,QAAA,KAAK,YAAY;YACf,OAAO,aAAa;AAClB,gBAAA,CAAC,IAAY,EAAE,MAAc,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;AACzD,gBAAA,CAAC,IAAY,EAAE,MAAc,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;AAEzF,QAAA,KAAK,UAAU;YACb,OAAO,aAAa;AAClB,gBAAA,CAAC,IAAY,EAAE,MAAc,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AACvD,gBAAA,CAAC,IAAY,EAAE,MAAc,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;AAEvF,QAAA,KAAK,IAAI;AACP,YAAA,IAAI,OAAO,aAAa,CAAC,KAAK,KAAK,QAAQ,EAAE;gBAC3C,OAAO,aAAa;oBAClB,CAAC,IAAY,EAAE,MAAc,KAAK,IAAI,IAAI,MAAM;AAChD,oBAAA,CAAC,IAAY,EAAE,MAAc,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE;YAC5F;iBAAO;gBACL,OAAO,CAAC,IAAS,EAAE,MAAW,KAAK,IAAI,KAAK,MAAM;YACpD;AAEF,QAAA,KAAK,IAAI;YACP,OAAO,CAAC,IAAS,EAAE,MAAW,KAAK,IAAI,GAAG,MAAM;AAElD,QAAA,KAAK,KAAK;YACR,OAAO,CAAC,IAAS,EAAE,MAAW,KAAK,IAAI,IAAI,MAAM;AAEnD,QAAA,KAAK,IAAI;YACP,OAAO,CAAC,IAAS,EAAE,MAAW,KAAK,IAAI,GAAG,MAAM;AAElD,QAAA,KAAK,KAAK;YACR,OAAO,CAAC,IAAS,EAAE,MAAW,KAAK,IAAI,IAAI,MAAM;AAEnD,QAAA,KAAK,IAAI;YACP,OAAO,CAAC,IAAS,EAAE,MAAW,KAAK,IAAI,KAAK,MAAM;AAEpD,QAAA;AACE,YAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAA,uCAAA,CAAyC,CAAC;;AAE5F;;AChIA;;;AAGG;AACG,MAAO,gBAAiB,SAAQ,UAAU,CAAA;AAGjB,IAAA,MAAA;IAFpB,IAAI,GAAG,QAAQ;AAExB,IAAA,WAAA,CAA6B,MAAkB,EAAA;AAC7C,QAAA,KAAK,EAAE;QADoB,IAAA,CAAA,MAAM,GAAN,MAAM;AAGjC,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,YAAA,MAAM,qBAAqB;QAC7B;IACF;AAEA,IAAA,IAAI,CAAC,OAAoB,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AAEzB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAC9B,UAAU,CAAC,GAAG,IAAG;AACf,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,MAAM,GAAG;AACX,QAAA,CAAC,CAAC,EACF,GAAG,CAAC,GAAG,IAAG;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B,CAAC,CAAC,CACH;IACH;AACD;;AC7BD;;;;AAIG;AACG,SAAU,mBAAmB,CAAI,MAAsB,EAAA;AAC3D,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzB,QAAA,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC;IACpC;AAAO,SAAA,IAAI,OAAO,MAAM,IAAI,UAAU,EAAE;AACtC,QAAA,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC;IACrC;AAAO,SAAA,IAAI,MAAM,YAAY,UAAU,EAAE;AACvC,QAAA,OAAO,MAAM;IACf;SAAO,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE;AAClD,QAAA,OAAO,IAAI,eAAe,CAAC,EAAE,CAAC;IAChC;AAAO,SAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AACrC,QAAA,OAAO,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;IACzC;SAAO;AACL,QAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;IACzC;AACF;;ACnBM,SAAU,YAAY,CAAQ,EAAe,EAAA;AACjD,IAAA,OAAO,UAAU,MAAuB,EAAA;AACtC,QAAA,OAAO,IAAI,UAAU,CAAC,UAAU,IAAG;YACjC,MAAM,CAAC,SAAS,CAAC;AACf,gBAAA,IAAI,CAAC,KAAK,EAAA;oBACR,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxC,CAAC;AACD,gBAAA,KAAK,CAAC,KAAK,EAAA;AACT,oBAAA,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;gBACzB,CAAC;gBACD,QAAQ,GAAA;oBACN,UAAU,CAAC,QAAQ,EAAE;gBACvB;AACD,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AACH;;ACpBA;;AAEG;;;;"}