dinocollab-core 2.2.40 → 2.2.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/data-surface/view-list/helpers.js +1 -1
- package/dist/src/data-surface/view-list/helpers.js.map +1 -1
- package/dist/src/data-surface/view-list/index.js +1 -1
- package/dist/src/data-surface/view-list/index.js.map +1 -1
- package/dist/src/data-surface/view-list/styled.js.map +1 -1
- package/dist/src/filter-bar/components/filter-summary.js +1 -1
- package/dist/src/filter-bar/components/filter-summary.js.map +1 -1
- package/dist/src/filter-bar/convert-to-graphql.js +1 -1
- package/dist/src/filter-bar/convert-to-graphql.js.map +1 -1
- package/dist/src/filter-bar/helpers.js.map +1 -1
- package/dist/src/filter-bar/hooks.js +1 -1
- package/dist/src/filter-bar/hooks.js.map +1 -1
- package/dist/src/filter-bar/index.create.js.map +1 -1
- package/dist/src/filter-bar/index.dino.js +1 -1
- package/dist/src/filter-bar/index.dino.js.map +1 -1
- package/dist/src/filter-bar/menu/create-form-field-boolean.js +2 -0
- package/dist/src/filter-bar/menu/create-form-field-boolean.js.map +1 -0
- package/dist/src/filter-bar/menu/create-form-field-datetime.js +1 -1
- package/dist/src/filter-bar/menu/create-form-field-datetime.js.map +1 -1
- package/dist/src/filter-bar/menu/create-form-field-number.js +1 -1
- package/dist/src/filter-bar/menu/create-form-field-number.js.map +1 -1
- package/dist/src/filter-bar/menu/create-form-field-select-multiple.js +1 -1
- package/dist/src/filter-bar/menu/create-form-field-select-multiple.js.map +1 -1
- package/dist/src/filter-bar/menu/create-form-field-select.js +1 -1
- package/dist/src/filter-bar/menu/create-form-field-select.js.map +1 -1
- package/dist/src/filter-bar/menu/create-form-field-string.js +1 -1
- package/dist/src/filter-bar/menu/create-form-field-string.js.map +1 -1
- package/dist/src/filter-bar/menu/create.js +1 -1
- package/dist/src/filter-bar/menu/create.js.map +1 -1
- package/dist/src/filter-bar/menu/ui.units.js.map +1 -1
- package/dist/src/form/helpers.js +1 -1
- package/dist/src/form/helpers.js.map +1 -1
- package/dist/src/http-service/graphql/request-param.js +1 -1
- package/dist/src/http-service/graphql/request-param.js.map +1 -1
- package/dist/src/utils/helpers.js +1 -1
- package/dist/src/utils/helpers.js.map +1 -1
- package/dist/types/filter-bar/convert-to-graphql.d.ts +2 -1
- package/dist/types/filter-bar/helpers.d.ts +8 -24
- package/dist/types/filter-bar/index.dino.d.ts +3 -0
- package/dist/types/filter-bar/menu/create-form-field-boolean.d.ts +55 -0
- package/dist/types/filter-bar/menu/types.d.ts +1 -1
- package/dist/types/http-service/graphql/request-param.d.ts +9 -3
- package/dist/types/utils/helpers.d.ts +30 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-param.js","sources":["../../../../src/http-service/graphql/request-param.ts"],"sourcesContent":["export type IVariable<T extends object> = keyof T\r\n\r\nexport type ILogic = 'Or' | 'And'\r\n\r\nexport type ISortDirection = 'ASC' | 'DESC'\r\n\r\nexport interface ISeedModel<T> {\r\n key: string\r\n field: keyof T\r\n}\r\n\r\nexport interface IFilterOption {\r\n logic: ILogic\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface IRequestParamOption {\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface ISortOption {\r\n direction: ISortDirection\r\n}\r\n\r\nexport type ISortStore<T extends object> = { [key in keyof T]?: ISortDirection }\r\n\r\nexport type IAllOptions = IFilterOption & IRequestParamOption & ISortOption\r\n\r\nexport type IRequestParamResult<T extends object, U extends object = {}> = {\r\n sort?: ISortStore<T>[]\r\n skip?: number\r\n take?: number\r\n filter?: string\r\n noTotal?: boolean\r\n seedKey?: string\r\n seedField?: string\r\n} & U\r\n\r\nexport class RequestParam<T extends object = any, U extends object = {}> {\r\n private readonly _option?: Partial<IRequestParamOption>\r\n constructor(option?: Partial<IRequestParamOption>) {\r\n this._option = option\r\n }\r\n\r\n private mergeOptions = (...p: any[]): Partial<IAllOptions> => {\r\n return p.reduce((a, b) => {\r\n return Object.assign(a, b ?? {})\r\n }, {})\r\n }\r\n\r\n private ignoreEmpty = (field2: string, option?: Partial<IFilterOption>) => {\r\n const mOption = this.mergeOptions(this._option, option)\r\n return !field2 && mOption?.ignoreEmpty === true\r\n }\r\n\r\n private _filter: string[] = []\r\n private _filterBase = (field1: IVariable<T>, operation: string, field2: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}${operation}${field2 as string}`)\r\n return this\r\n }\r\n filter = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? `\"${field2}\"` : field2.toString(), option)\r\n }\r\n filterEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', `\"${field2}\"`, option)\r\n }\r\n filterNotEquals = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '!=', typeof field2 === 'string' ? `\"${field2}\"` : field2.toString(), option)\r\n }\r\n filterEnum = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? field2 : field2.toString(), option)\r\n }\r\n filterStartsWith = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.startsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterContains = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.Contains(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterLast = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.endsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterNumber = (field1: IVariable<T>, operator: string, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, ` ${operator} ` + (field2 as string), '', option)\r\n }\r\n\r\n filterGreater = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" > '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterGreaterEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" >= '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLess = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" < '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLessEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" <= '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterCustom = (field1: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}`)\r\n return this\r\n }\r\n\r\n scope = (action: (crd: RequestParam<T>) => RequestParam<T>, option?: Partial<IFilterOption>) => {\r\n const crd = action(new RequestParam(this._option))\r\n const temp = crd.buildFilter()\r\n if (temp) {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}(${crd.buildFilter()})`)\r\n }\r\n this.mergeExtendData(crd.extendData as U)\r\n return this\r\n }\r\n\r\n private seedStore?: ISeedModel<T>\r\n seed = (field: keyof T, key: string) => {\r\n this.seedStore = { field, key }\r\n return this\r\n }\r\n\r\n private _skip?: number\r\n skip = (skip: number) => {\r\n this._skip = skip\r\n return this\r\n }\r\n\r\n private _take?: number\r\n take = (take: number) => {\r\n this._take = take\r\n return this\r\n }\r\n\r\n private sortStore: ISortStore<T>[] = []\r\n private sortBase = (field1: IVariable<T>, direction: ISortDirection, option?: Partial<ISortOption>) => {\r\n const temp = {} as ISortStore<T>\r\n temp[field1] = direction\r\n if (!this.sortStore.some((item) => Object.keys(item)[0] === Object.keys(temp)[0])) {\r\n this.sortStore.push(temp)\r\n }\r\n return this\r\n }\r\n sort = (field1: IVariable<T>, option?: Partial<ISortOption>) => {\r\n this.sortBase(field1, option?.direction ? option.direction : 'ASC')\r\n return this\r\n }\r\n private _noTotal?: boolean\r\n noTotal = (value: boolean = true) => {\r\n this._noTotal = value\r\n return this\r\n }\r\n\r\n private buildFilter = () => {\r\n return this._filter.join('')\r\n }\r\n\r\n private buildPage = () => {\r\n const temp = {} as any\r\n if (this._skip) {\r\n temp.skip = this._skip\r\n }\r\n if (this._take) {\r\n temp.take = this._take\r\n }\r\n return temp as { skip: number; take: number }\r\n }\r\n\r\n private buildRandomWithSeedKey = (): Partial<ISeedModel<T>> => {\r\n if (this.seedStore?.field && !this.seedStore?.key) {\r\n console.warn('RandomWithSeedKey missing seedKey.')\r\n }\r\n if (this.seedStore?.key && !this.seedStore?.field) {\r\n console.warn('RandomWithSeedKey missing seedField.')\r\n }\r\n if (!this.seedStore?.key && !this.seedStore?.field) {\r\n return {}\r\n }\r\n return this.seedStore\r\n }\r\n\r\n private _extendData: U = {} as U\r\n private get extendData(): U {\r\n return this._extendData\r\n }\r\n private mergeExtendData = (source: U) => {\r\n for (const key in source) {\r\n this._extendData[key] = source[key]\r\n }\r\n }\r\n extendResult = (customKey: keyof U, value: U[keyof U]) => {\r\n if (!this._extendData) {\r\n this._extendData = {} as U\r\n }\r\n this._extendData[customKey] = value\r\n return this\r\n }\r\n\r\n build = (): IRequestParamResult<T, U> => {\r\n const obj: IRequestParamResult<T, U> = { ...this.buildPage() } as IRequestParamResult<T, U>\r\n if (this._extendData) {\r\n for (const key in this._extendData) {\r\n obj[key] = this._extendData[key]\r\n }\r\n }\r\n if (this.sortStore.length > 0) obj.sort = this.sortStore\r\n const filter = this.buildFilter()\r\n if (filter) obj.filter = filter\r\n if (this._noTotal) obj.noTotal = this._noTotal\r\n const seedInfo = this.buildRandomWithSeedKey()\r\n if (!!seedInfo.key && !!seedInfo.field) {\r\n obj.seedField = seedInfo.field.toString()\r\n obj.seedKey = seedInfo.key\r\n }\r\n return obj\r\n }\r\n}\r\n\r\nexport const createRequestBuilder = <T extends object, U extends object = {}>(option?: Partial<IRequestParamOption>) => {\r\n return new RequestParam<T, U>(option)\r\n}\r\n"],"names":["RequestParam","_createClass","option","_this","this","_classCallCheck","_defineProperty","_len","arguments","length","p","Array","_key","reduce","a","b","Object","assign","field2","mOption","mergeOptions","_option","ignoreEmpty","field1","operation","logicStr","_filter","logic","push","concat","_filterBase","toString","operator","action","crd","buildFilter","mergeExtendData","extendData","field","key","seedStore","skip","_skip","take","_take","direction","temp","sortStore","some","item","keys","sortBase","value","undefined","_noTotal","join","_this$seedStore","_this$seedStore2","_this$seedStore3","_this$seedStore4","_this$seedStore5","_this$seedStore6","console","warn","source","_extendData","customKey","obj","_objectSpread","buildPage","sort","filter","noTotal","seedInfo","buildRandomWithSeedKey","seedField","seedKey","get","createRequestBuilder"],"mappings":"wIAsCA,IAAaA,EAAY,WAItB,OAAAC,EAFD,SAAAD,EAAYE,GAAqC,IAAAC,EAAAC,KAAAC,OAAAL,GAAAM,sBAI1B,WAAsC,IAAA,IAAAC,EAAAC,UAAAC,OAAlCC,EAAQC,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAARF,EAAQE,GAAAJ,UAAAI,GACjC,OAAOF,EAAEG,OAAO,SAACC,EAAGC,GAClB,OAAOC,OAAOC,OAAOH,EAAGC,QAAAA,EAAK,GAC9B,EAAE,MACJT,EAEqBF,KAAA,cAAA,SAACc,EAAgBhB,GACrC,IAAMiB,EAAUhB,EAAKiB,aAAajB,EAAKkB,QAASnB,GAChD,OAAQgB,IAAmC,KAAzBC,aAAO,EAAPA,EAASG,eAC5BhB,iBAE2B,IAAEA,EAAAF,KAAA,cACR,SAACmB,EAAsBC,EAAmBN,EAAgBhB,GAC9E,IAAMuB,EAAWtB,EAAKuB,QAAQjB,OAAS,KAAyB,SAAlBP,aAAAA,EAAAA,EAAQyB,OAAkB,KAAO,MAAQ,IAAM,GAE7F,OADAxB,EAAKuB,QAAQE,QAAIC,OAAIJ,GAAQI,OAAGN,GAAgBM,OAAGL,GAASK,OAAGX,IACxDf,IACRG,gBACQ,SAACiB,EAAsBL,EAAyBhB,GACvD,MAAsB,iBAAXgB,GAAuBf,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACpEA,EAAK2B,YAAYP,EAAQ,KAAwB,iBAAXL,MAAmBW,OAAOX,EAAM,KAAMA,EAAOa,WAAY7B,KACvGI,qBACa,SAACiB,EAAsBL,EAAgBhB,GACnD,OAAIC,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACtCA,EAAK2B,YAAYP,EAAQ,KAAI,IAAAM,OAAMX,EAAM,KAAKhB,KACtDI,yBACiB,SAACiB,EAAsBL,EAAyBhB,GAChE,MAAsB,iBAAXgB,GAAuBf,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACpEA,EAAK2B,YAAYP,EAAQ,KAAwB,iBAAXL,MAAmBW,OAAOX,EAAM,KAAMA,EAAOa,WAAY7B,KACvGI,oBACY,SAACiB,EAAsBL,EAAyBhB,GAC3D,MAAsB,iBAAXgB,GAAuBf,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACpEA,EAAK2B,YAAYP,EAAQ,KAAwB,iBAAXL,EAAsBA,EAASA,EAAOa,WAAY7B,KAChGI,0BACkB,SAACiB,EAAsBL,EAAgBhB,GACxD,OAAIC,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACtCA,EAAK2B,YAAYP,EAAQ,gBAAmBL,EAAoB,KAAM,GAAIhB,KAClFI,wBACgB,SAACiB,EAAsBL,EAAgBhB,GACtD,OAAIC,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACtCA,EAAK2B,YAAYP,EAAQ,cAAiBL,EAAoB,KAAM,GAAIhB,KAChFI,oBACY,SAACiB,EAAsBL,EAAgBhB,GAClD,OAAIC,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACtCA,EAAK2B,YAAYP,EAAQ,cAAiBL,EAAoB,KAAM,GAAIhB,KAChFI,EAAAF,KAAA,eACc,SAACmB,EAAsBS,EAAkBd,EAAgBhB,GACtE,OAAIC,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACtCA,EAAK2B,YAAYP,EAAQ,IAAAM,OAAIG,OAAed,EAAmB,GAAIhB,KAC3EI,uBAEe,SAACiB,EAAsBL,EAAgBhB,GACrD,OAAIC,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACtCA,EAAK2B,YAAYP,EAAQ,OAAUL,EAAoB,IAAK,GAAIhB,KACxEI,4BACoB,SAACiB,EAAsBL,EAAgBhB,GAC1D,OAAIC,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACtCA,EAAK2B,YAAYP,EAAQ,QAAWL,EAAoB,IAAK,GAAIhB,KACzEI,oBACY,SAACiB,EAAsBL,EAAgBhB,GAClD,OAAIC,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACtCA,EAAK2B,YAAYP,EAAQ,OAAUL,EAAoB,IAAK,GAAIhB,KACxEI,yBACiB,SAACiB,EAAsBL,EAAgBhB,GACvD,OAAIC,EAAKmB,YAAYJ,EAAQhB,GAAgBC,EACtCA,EAAK2B,YAAYP,EAAQ,QAAWL,EAAoB,IAAK,GAAIhB,KACzEI,EACcF,KAAA,eAAA,SAACmB,EAAgBrB,GAC9B,IAAMuB,EAAWtB,EAAKuB,QAAQjB,OAAS,KAAyB,SAAlBP,aAAAA,EAAAA,EAAQyB,OAAkB,KAAO,MAAQ,IAAM,GAE7F,OADAxB,EAAKuB,QAAQE,KAAIC,GAAAA,OAAIJ,GAAQI,OAAGN,IACzBpB,IACRG,EAEOF,KAAA,QAAA,SAAC6B,EAAmD/B,GAC1D,IAAMgC,EAAMD,EAAO,IAAIjC,EAAaG,EAAKkB,UAEzC,GADaa,EAAIC,cACP,CACR,IAAMV,EAAWtB,EAAKuB,QAAQjB,OAAS,KAAyB,SAAlBP,aAAAA,EAAAA,EAAQyB,OAAkB,KAAO,MAAQ,IAAM,GAC7FxB,EAAKuB,QAAQE,KAAI,GAAAC,OAAIJ,EAAQI,KAAAA,OAAIK,EAAIC,mBACtC,CAED,OADAhC,EAAKiC,gBAAgBF,EAAIG,YAClBlC,IACRG,EAGMF,KAAA,OAAA,SAACkC,EAAgBC,GAEtB,OADApC,EAAKqC,UAAY,CAAEF,MAAAA,EAAOC,IAAAA,GACnBpC,IACRG,EAAAF,KAAA,OAGM,SAACqC,GAEN,OADAtC,EAAKuC,MAAQD,EACNtC,IACRG,EAAAF,KAAA,OAGM,SAACuC,GAEN,OADAxC,EAAKyC,MAAQD,EACNxC,IACRG,mBAEoC,IAAEA,kBACpB,SAACiB,EAAsBsB,EAA2B3C,GACnE,IAAM4C,EAAO,CAAmB,EAKhC,OAJAA,EAAKvB,GAAUsB,EACV1C,EAAK4C,UAAUC,KAAK,SAACC,GAAI,OAAKjC,OAAOkC,KAAKD,GAAM,KAAOjC,OAAOkC,KAAKJ,GAAM,EAAE,IAC9E3C,EAAK4C,UAAUnB,KAAKkB,GAEf3C,IACRG,EACMF,KAAA,OAAA,SAACmB,EAAsBrB,GAE5B,OADAC,EAAKgD,SAAS5B,EAAQrB,SAAAA,EAAQ2C,UAAY3C,EAAO2C,UAAY,OACtD1C,IACRG,iBAES,WAA0B,IAAzB8C,IAAiB5C,UAAAC,OAAA,QAAA4C,IAAA7C,UAAA,KAAAA,UAAA,GAE1B,OADAL,EAAKmD,SAAWF,EACTjD,IACRG,qBAEqB,WACpB,OAAOH,EAAKuB,QAAQ6B,KAAK,MAC1BjD,mBAEmB,WAClB,IAAMwC,EAAO,CAAS,EAOtB,OANI3C,EAAKuC,QACPI,EAAKL,KAAOtC,EAAKuC,OAEfvC,EAAKyC,QACPE,EAAKH,KAAOxC,EAAKyC,OAEZE,IACRxC,gCAEgC,WAA6B,IAAAkD,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAO5D,OANkBL,QAAdA,EAAArD,EAAKqC,iBAALgB,IAAcA,IAAdA,EAAgBlB,OAAwBmB,QAAfA,EAACtD,EAAKqC,iBAALiB,IAAcA,GAAdA,EAAgBlB,KAC5CuB,QAAQC,KAAK,sCAEGL,QAAdA,EAAAvD,EAAKqC,iBAALkB,IAAcA,IAAdA,EAAgBnB,KAAsBoB,QAAfA,EAACxD,EAAKqC,iBAALmB,IAAcA,GAAdA,EAAgBrB,OAC1CwB,QAAQC,KAAK,wCAEIH,QAAfA,EAACzD,EAAKqC,iBAALoB,IAAcA,GAAdA,EAAgBrB,KAAsBsB,QAAfA,EAAC1D,EAAKqC,iBAALqB,IAAcA,GAAdA,EAAgBvB,MAGtCnC,EAAKqC,UAFH,CAAE,IAGZlC,EAAAF,KAAA,cAEwB,IAAOE,EAAAF,KAAA,kBAIN,SAAC4D,GACzB,IAAK,IAAMzB,KAAOyB,EAChB7D,EAAK8D,YAAY1B,GAAOyB,EAAOzB,KAElCjC,EACcF,KAAA,eAAA,SAAC8D,EAAoBd,GAKlC,OAJKjD,EAAK8D,cACR9D,EAAK8D,YAAc,CAAO,GAE5B9D,EAAK8D,YAAYC,GAAad,EACvBjD,IACRG,eAEO,WACN,IAAM6D,EAAGC,EAAA,CAAA,EAAmCjE,EAAKkE,aACjD,GAAIlE,EAAK8D,YACP,IAAK,IAAM1B,KAAOpC,EAAK8D,YACrBE,EAAI5B,GAAOpC,EAAK8D,YAAY1B,GAG5BpC,EAAK4C,UAAUtC,OAAS,IAAG0D,EAAIG,KAAOnE,EAAK4C,WAC/C,IAAMwB,EAASpE,EAAKgC,cAChBoC,IAAQJ,EAAII,OAASA,GACrBpE,EAAKmD,WAAUa,EAAIK,QAAUrE,EAAKmD,UACtC,IAAMmB,EAAWtE,EAAKuE,yBAKtB,OAJMD,EAASlC,KAASkC,EAASnC,QAC/B6B,EAAIQ,UAAYF,EAASnC,MAAMP,WAC/BoC,EAAIS,QAAUH,EAASlC,KAElB4B,IAxLP/D,KAAKiB,QAAUnB,CACjB,EAAC,CAAA,CAAAqC,IAAA,aAAAsC,IAuJD,WACE,OAAOzE,KAAK6D,WACd,IAAC,CA7JsB,GA+LZa,EAAuB,SAA0C5E,GAC5E,OAAO,IAAIF,EAAmBE,EAChC"}
|
|
1
|
+
{"version":3,"file":"request-param.js","sources":["../../../../src/http-service/graphql/request-param.ts"],"sourcesContent":["export type IVariable<T extends object> = keyof T\r\n\r\nexport type ILogic = 'Or' | 'And'\r\n\r\nexport type ISortDirection = 'ASC' | 'DESC'\r\n\r\nexport interface ISeedModel<T> {\r\n key: string\r\n field: keyof T\r\n}\r\n\r\nexport interface IFilterOption {\r\n logic: ILogic\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface IRequestParamOption {\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface ISortOption {\r\n direction: ISortDirection\r\n}\r\n\r\nexport type ISortStore<T extends object> = { [key in keyof T]?: ISortDirection }\r\n\r\nexport type IAllOptions = IFilterOption & IRequestParamOption & ISortOption\r\n\r\nexport type IRequestParamResult<T extends object, U extends object = {}> = {\r\n sort?: ISortStore<T>[]\r\n skip?: number\r\n take?: number\r\n filter?: string\r\n noTotal?: boolean\r\n seedKey?: string\r\n seedField?: string\r\n} & U\r\n\r\nexport class RequestParam<T extends object = any, U extends object = {}> {\r\n private readonly _option?: Partial<IRequestParamOption>\r\n constructor(option?: Partial<IRequestParamOption>) {\r\n this._option = option\r\n }\r\n\r\n private mergeOptions = (...p: any[]): Partial<IAllOptions> => {\r\n return p.reduce((a, b) => {\r\n return Object.assign(a, b ?? {})\r\n }, {})\r\n }\r\n\r\n private ignoreEmpty = (field2: string, option?: Partial<IFilterOption>) => {\r\n const mOption = this.mergeOptions(this._option, option)\r\n return !field2 && mOption?.ignoreEmpty === true\r\n }\r\n\r\n private _filter: string[] = []\r\n private _filterBase = (field1: IVariable<T>, operation: string, field2: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}${operation}${field2 as string}`)\r\n return this\r\n }\r\n filter = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption> & { noQuote?: boolean }) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? (option?.noQuote ? field2 : `\"${field2}\"`) : field2.toString(), option)\r\n }\r\n filterEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption> & { noQuote?: boolean }) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', option?.noQuote ? field2 : `\"${field2}\"`, option)\r\n }\r\n filterNotEquals = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption> & { noQuote?: boolean }) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n const valueStr = typeof field2 === 'string' ? (option?.noQuote ? field2 : `\"${field2}\"`) : field2.toString()\r\n return this._filterBase(field1, '!=', valueStr, option)\r\n }\r\n filterEnum = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? field2 : field2.toString(), option)\r\n }\r\n filterStartsWith = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.startsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterContains = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.Contains(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterLast = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.endsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterNumber = (field1: IVariable<T>, operator: string, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, ` ${operator} ` + (field2 as string), '', option)\r\n }\r\n filterGreater = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" > '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterGreaterEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" >= '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLess = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" < '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLessEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" <= '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterCustom = (field1: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}`)\r\n return this\r\n }\r\n\r\n scope = (action: (crd: RequestParam<T>) => RequestParam<T>, option?: Partial<IFilterOption>) => {\r\n const crd = action(new RequestParam(this._option))\r\n const temp = crd.buildFilter()\r\n if (temp) {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}(${crd.buildFilter()})`)\r\n }\r\n this.mergeExtendData(crd.extendData as U)\r\n return this\r\n }\r\n\r\n private seedStore?: ISeedModel<T>\r\n seed = (field: keyof T, key: string) => {\r\n this.seedStore = { field, key }\r\n return this\r\n }\r\n\r\n private _skip?: number\r\n skip = (skip: number) => {\r\n this._skip = skip\r\n return this\r\n }\r\n\r\n private _take?: number\r\n take = (take: number) => {\r\n this._take = take\r\n return this\r\n }\r\n\r\n private sortStore: ISortStore<T>[] = []\r\n private sortBase = (field1: IVariable<T>, direction: ISortDirection, option?: Partial<ISortOption>) => {\r\n const temp = {} as ISortStore<T>\r\n temp[field1] = direction\r\n if (!this.sortStore.some((item) => Object.keys(item)[0] === Object.keys(temp)[0])) {\r\n this.sortStore.push(temp)\r\n }\r\n return this\r\n }\r\n sort = (field1: IVariable<T>, option?: Partial<ISortOption>) => {\r\n this.sortBase(field1, option?.direction ? option.direction : 'ASC')\r\n return this\r\n }\r\n private _noTotal?: boolean\r\n noTotal = (value: boolean = true) => {\r\n this._noTotal = value\r\n return this\r\n }\r\n\r\n private buildFilter = () => {\r\n return this._filter.join('')\r\n }\r\n\r\n private buildPage = () => {\r\n const temp = {} as any\r\n if (this._skip) {\r\n temp.skip = this._skip\r\n }\r\n if (this._take) {\r\n temp.take = this._take\r\n }\r\n return temp as { skip: number; take: number }\r\n }\r\n\r\n private buildRandomWithSeedKey = (): Partial<ISeedModel<T>> => {\r\n if (this.seedStore?.field && !this.seedStore?.key) {\r\n console.warn('RandomWithSeedKey missing seedKey.')\r\n }\r\n if (this.seedStore?.key && !this.seedStore?.field) {\r\n console.warn('RandomWithSeedKey missing seedField.')\r\n }\r\n if (!this.seedStore?.key && !this.seedStore?.field) {\r\n return {}\r\n }\r\n return this.seedStore\r\n }\r\n\r\n private _extendData: U = {} as U\r\n private get extendData(): U {\r\n return this._extendData\r\n }\r\n private mergeExtendData = (source: U) => {\r\n for (const key in source) {\r\n this._extendData[key] = source[key]\r\n }\r\n }\r\n extendResult = (customKey: keyof U, value: U[keyof U]) => {\r\n if (!this._extendData) {\r\n this._extendData = {} as U\r\n }\r\n this._extendData[customKey] = value\r\n return this\r\n }\r\n\r\n build = (): IRequestParamResult<T, U> => {\r\n const obj: IRequestParamResult<T, U> = { ...this.buildPage() } as IRequestParamResult<T, U>\r\n if (this._extendData) {\r\n for (const key in this._extendData) {\r\n obj[key] = this._extendData[key]\r\n }\r\n }\r\n if (this.sortStore.length > 0) obj.sort = this.sortStore\r\n const filter = this.buildFilter()\r\n if (filter) obj.filter = filter\r\n if (this._noTotal) obj.noTotal = this._noTotal\r\n const seedInfo = this.buildRandomWithSeedKey()\r\n if (!!seedInfo.key && !!seedInfo.field) {\r\n obj.seedField = seedInfo.field.toString()\r\n obj.seedKey = seedInfo.key\r\n }\r\n return obj\r\n }\r\n}\r\n\r\nexport const createRequestBuilder = <T extends object, U extends object = {}>(option?: Partial<IRequestParamOption>) => {\r\n return new RequestParam<T, U>(option)\r\n}\r\n"],"names":["RequestParam","_createClass","option","_this","this","_classCallCheck","_defineProperty","_len","arguments","length","p","Array","_key","reduce","a","b","Object","assign","field2","mOption","mergeOptions","_option","ignoreEmpty","field1","operation","logicStr","_filter","logic","push","concat","_filterBase","noQuote","toString","valueStr","operator","action","crd","buildFilter","mergeExtendData","extendData","field","key","seedStore","skip","_skip","take","_take","direction","temp","sortStore","some","item","keys","sortBase","value","undefined","_noTotal","join","_this$seedStore","_this$seedStore2","_this$seedStore3","_this$seedStore4","_this$seedStore5","_this$seedStore6","console","warn","source","_extendData","customKey","obj","_objectSpread","buildPage","sort","filter","noTotal","seedInfo","buildRandomWithSeedKey","seedField","seedKey","get","createRequestBuilder"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{slicedToArray as r,
|
|
1
|
+
import{slicedToArray as r,toArray as t,arrayLikeToArray as n,createForOfIteratorHelper as e,asyncToGenerator as o,typeof as a,regenerator as i,objectSpread2 as c}from"../../_virtual/_rollupPluginBabelHelpers.js";import u from"dayjs";var f=function(r){return new Promise(function(t){return setTimeout(t,r)})},s=function(){var t=o(i().m(function t(n,e){var o,a,c;return i().w(function(t){for(;;)switch(t.n){case 0:return t.n=1,Promise.all([n(),f(e)]);case 1:return o=t.v,a=r(o,1),c=a[0],t.a(2,c)}},t)}));return function(r,n){return t.apply(this,arguments)}}(),l=function(r){return/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(r)},d=function(r){return/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(r)},v=function(r){return/^(\+?\d{1,4}[\s-]?)?((\(\d{1,4}\))|\d{1,4})[\s-]?\d{1,4}[\s-]?\d{1,9}$/.test((null!=r?r:"").trim())},y=function(r){return/^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i.test(r)},h=function(r,t){setTimeout(function(){window.scrollTo(c({top:0,left:0,behavior:"smooth"},r))},t||50)},p=function(){for(var r=arguments.length,t=new Array(r),n=0;n<r;n++)t[n]=arguments[n];return t.join(" ")},g=function(r){return null!=r&&"object"===a(r)&&!Array.isArray(r)},A=function(){for(var r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];var i=o.filter(function(r){return null!=r});if(0===i.length)return{};var c,u=t(i),f=u[0],s=n(u).slice(1),l=Object.assign({},f),d=e(s);try{for(d.s();!(c=d.n()).done;)for(var v=c.value,y=0,h=Object.keys(v);y<h.length;y++){var p=h[y],m=v[p];if(void 0!==m){var b=l[p];g(b)&&g(m)?l[p]=A(b,m):l[p]=m}}}catch(r){d.e(r)}finally{d.f()}return l},m=function(t){try{return t?Object.entries(t).reduce(function(t,n){var e=r(n,2),o=e[0],a=e[1];return void 0!==a&&(t[o]=a),t},{}):{}}catch(r){return{}}},b=function(t){if("object"!==a(t)||null===t)return t;var n=Array.isArray(t)?[]:{};return Object.entries(t).forEach(function(t){var e=r(t,2),o=e[0],i=e[1];if(null==i||"string"==typeof i&&""===i.trim()||"number"==typeof i&&isNaN(i)||Array.isArray(i)&&0===i.length||"object"===a(i)&&!Array.isArray(i)&&0===Object.keys(b(i)).length);else if("object"!==a(i)||Array.isArray(i))n[o]=i;else{var c=b(i);Object.keys(c).length>0&&(n[o]=c)}}),n},j=function(r){try{var t=(new TextEncoder).encode(r),n="";return t.forEach(function(r){n+=String.fromCharCode(r)}),btoa(n)}catch(r){return console.error("Error encoding to base64",r),""}},w=function(r){try{for(var t=atob(r),n=new Uint8Array(t.length),e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return(new TextDecoder).decode(n)}catch(r){return void console.error("Error decoding base64",r)}},F=function(r,t){try{return r?JSON.parse(r):t}catch(r){return t}},M=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];try{if(!r)return[];var n=JSON.parse(r);return Array.isArray(n)?n:[]}catch(r){return t}},S=function(r,t){try{return r?parseInt(r):t}catch(r){return t}},Y=function(r){return new Promise(function(t,n){var e=new FileReader;e.onload=function(){try{var r=e.result.split(/\r?\n/).filter(Boolean);if(r.length<1)return t([]);var n=r[0].split(",").map(function(r){return r.trim()}),o=r.slice(1).map(function(r){var t=r.split(",").map(function(r){return r.trim()}),e={};return n.forEach(function(r,n){var o;e[r]=null!==(o=t[n])&&void 0!==o?o:""}),e});t(o)}catch(r){t([])}},e.onerror=function(){n(new Error("Error reading file"))},e.readAsText(r)})},E=function(r){return r<1024?r.toFixed(2)+" Kb":r<1048576?(r/1024).toFixed(2)+" Mb":r<1073741824?(r/1048576).toFixed(2)+" Gb":(r/1073741824).toFixed(2)+" Tb"},O=function(r){var t=null==r,n="string"==typeof r&&isNaN(Number(r));if(t||n)return"00:00:00";var e=Math.round(r),o=Math.floor(e/3600),a=Math.floor(e%3600/60),i=e%60,c=String(o).padStart(2,"0"),u=String(a).padStart(2,"0"),f=String(i).padStart(2,"0");return"".concat(c,":").concat(u,":").concat(f)},T=function(t){var n,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"$ ",o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";try{n=parseFloat(t),isNaN(n)&&(n=0)}catch(r){n=0}var a=n.toFixed(2).split("."),i=r(a,2),c=i[0],u=i[1],f=c.replace(/\B(?=(\d{3})+(?!\d))/g," "),s=f;return"00"!==u&&(s="".concat(f,".").concat(u)),"".concat(e).concat(s).concat(o)},x=function(r){return r.toLocaleString("en-US")},N=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(!r)return r;var e=Array.from(r),o=t(e),a=o[0],i=n(o).slice(1);return"".concat(a.toUpperCase()).concat(i.join(""))},D={style1:"DD/MM/YYYY HH:mm",style2:"MMMM D, YYYY",style3:"MM-DD-YYYY"},$=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"style1";try{var n;if(!r)throw new Error;var e=null!==(n=D[t])&&void 0!==n?n:t;return u(r).format(e)}catch(r){return"unknown"}};export{m as cleanObject,w as decodeBase64,b as deepRemoveEmptyFields,j as encodeBase64,s as fetchDelay,N as formatCapitalizeFirstText,T as formatCurrency,$ as formatDatetime,D as formatDatetimeStyles,O as formatDuration,E as formatFileSize,x as formatNumberWithCommas,l as isGuid,d as isValidEmail,v as isValidPhoneNumber,y as isValidURL,p as mergeClasses,A as mergeObjects,f as sleep,M as tryParseArray,Y as tryParseCsvFileToArray,S as tryParseIntRequired,F as tryParseObject,h as windowScrollToTop};
|
|
2
2
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../../src/utils/helpers.ts"],"sourcesContent":["import dayjs from 'dayjs'\r\n\r\nexport const sleep = (sec: number) => new Promise((res) => setTimeout(res, sec))\r\n\r\nexport const fetchDelay = async function <TModel>(action: () => Promise<TModel>, sec: number) {\r\n const [res] = await Promise.all([action(), sleep(sec)])\r\n return res\r\n}\r\n\r\nexport const isGuid = (value: string): boolean => {\r\n const guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/\r\n return guidRegex.test(value)\r\n}\r\n\r\nexport const isValidEmail = (value: string) => {\r\n const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\r\n return regex.test(value)\r\n}\r\n\r\nexport const isValidPhoneNumber = (phoneNumber?: string): boolean => {\r\n const phoneRegex = /^(\\+?\\d{1,4}[\\s-]?)?((\\(\\d{1,4}\\))|\\d{1,4})[\\s-]?\\d{1,4}[\\s-]?\\d{1,9}$/\r\n return phoneRegex.test((phoneNumber ?? '').trim())\r\n}\r\n\r\nexport const isValidURL = (url: string): boolean => {\r\n const regex = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i\r\n return regex.test(url)\r\n}\r\n\r\nexport const windowScrollToTop = (options?: ScrollToOptions, delay?: number) => {\r\n setTimeout(() => {\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth', ...options })\r\n }, delay || 50)\r\n}\r\n\r\nexport const mergeClasses = (...classes: string[]) => {\r\n return classes.join(' ')\r\n}\r\n\r\n//#region Object\r\n/**\r\n * Simple object check.\r\n * @param item\r\n * @returns {boolean}\r\n */\r\nconst isObject = (obj: any) => {\r\n return obj && typeof obj === 'object' && !Array.isArray(obj)\r\n}\r\n\r\ntype DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P] } | undefined\r\n\r\nexport const mergeObjects = <T>(...objects: DeepPartial<T>[]): T => {\r\n return objects.reduce((prev, obj) => {\r\n if (!obj) return prev\r\n Object.keys(obj).forEach((key) => {\r\n if (isObject((prev as any)[key]) && isObject((obj as any)[key])) {\r\n ;(prev as any)[key] = mergeObjects((prev as any)[key], (obj as any)[key])\r\n } else {\r\n ;(prev as any)[key] = (obj as any)[key]\r\n }\r\n })\r\n return prev\r\n }, {} as T) as any\r\n}\r\n\r\nexport const cleanObject = <T extends object>(obj: T): Partial<T> => {\r\n try {\r\n if (!obj) return {}\r\n return Object.entries(obj).reduce((acc, [key, value]) => {\r\n if (value !== undefined) {\r\n ;(acc as any)[key] = value\r\n }\r\n return acc\r\n }, {} as Partial<T>)\r\n } catch (error) {\r\n return {}\r\n }\r\n}\r\n\r\nexport const deepRemoveEmptyFields = <T extends object>(obj: T): T => {\r\n if (typeof obj !== 'object' || obj === null) return obj\r\n const result: any = Array.isArray(obj) ? [] : {}\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'string' && value.trim() === '') ||\r\n (typeof value === 'number' && isNaN(value)) ||\r\n (Array.isArray(value) && value.length === 0) ||\r\n (typeof value === 'object' && !Array.isArray(value) && Object.keys(deepRemoveEmptyFields(value)).length === 0)\r\n ) {\r\n // skip\r\n } else if (typeof value === 'object' && !Array.isArray(value)) {\r\n const cleaned = deepRemoveEmptyFields(value)\r\n if (Object.keys(cleaned).length > 0) result[key] = cleaned\r\n } else {\r\n result[key] = value\r\n }\r\n })\r\n return result\r\n}\r\n//#endregion\r\n\r\nexport const encodeBase64 = (input: string): string => {\r\n try {\r\n const utf8Bytes = new TextEncoder().encode(input)\r\n let binaryString = ''\r\n utf8Bytes.forEach((byte) => {\r\n binaryString += String.fromCharCode(byte)\r\n })\r\n return btoa(binaryString)\r\n } catch (error) {\r\n console.error('Error encoding to base64', error)\r\n return ''\r\n }\r\n}\r\n\r\nexport const decodeBase64 = (encoded: string): string | undefined => {\r\n try {\r\n const binaryString = atob(encoded)\r\n const utf8Bytes = new Uint8Array(binaryString.length)\r\n for (let i = 0; i < binaryString.length; i++) {\r\n utf8Bytes[i] = binaryString.charCodeAt(i)\r\n }\r\n return new TextDecoder().decode(utf8Bytes)\r\n } catch (error) {\r\n console.error('Error decoding base64', error)\r\n return\r\n }\r\n}\r\n\r\n//#region Try Parse\r\nexport const tryParseObject = function <T>(value: any, defaultValue: T): T {\r\n try {\r\n if (!value) return defaultValue\r\n return JSON.parse(value)\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseArray = function <T>(value: any, defaultValue: T[] = []): T[] {\r\n try {\r\n if (!value) return []\r\n const parseValue = JSON.parse(value)\r\n return Array.isArray(parseValue) ? parseValue : []\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseIntRequired = function (value: any, defaultValue: number): number {\r\n try {\r\n if (!value) return defaultValue\r\n return parseInt(value)\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseCsvFileToArray = (file: File): Promise<Record<string, string>[]> => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n\r\n reader.onload = () => {\r\n try {\r\n const text = reader.result as string\r\n const rows = text.split(/\\r?\\n/).filter(Boolean)\r\n\r\n if (rows.length < 1) return resolve([])\r\n\r\n const headers = rows[0].split(',').map((h) => h.trim())\r\n\r\n const data = rows.slice(1).map((row) => {\r\n const values = row.split(',').map((v) => v.trim())\r\n const item: Record<string, string> = {}\r\n\r\n headers.forEach((header, index) => {\r\n item[header] = values[index] ?? ''\r\n })\r\n\r\n return item\r\n })\r\n\r\n resolve(data)\r\n } catch (error) {\r\n resolve([])\r\n }\r\n }\r\n\r\n reader.onerror = () => {\r\n reject(new Error('Error reading file'))\r\n }\r\n\r\n reader.readAsText(file)\r\n })\r\n}\r\n//#endregion\r\n\r\n//#region Format\r\nexport const formatFileSize = (sizeInKb: number) => {\r\n if (sizeInKb < 1024) {\r\n return sizeInKb.toFixed(2) + ' Kb'\r\n } else if (sizeInKb < 1024 * 1024) {\r\n return (sizeInKb / 1024).toFixed(2) + ' Mb'\r\n } else if (sizeInKb < 1024 * 1024 * 1024) {\r\n return (sizeInKb / (1024 * 1024)).toFixed(2) + ' Gb'\r\n } else {\r\n return (sizeInKb / (1024 * 1024 * 1024)).toFixed(2) + ' Tb'\r\n }\r\n}\r\n\r\nexport const formatDuration = (duration?: number): string => {\r\n const isNotValidDuration = duration === undefined || duration === null\r\n const isNotNumber = typeof duration === 'string' && isNaN(Number(duration))\r\n if (isNotValidDuration || isNotNumber) return '00:00:00'\r\n\r\n // Round the duration to the nearest second\r\n const totalSeconds = Math.round(duration)\r\n\r\n // Calculate hours, minutes, and seconds\r\n const hours = Math.floor(totalSeconds / 3600)\r\n const minutes = Math.floor((totalSeconds % 3600) / 60)\r\n const seconds = totalSeconds % 60\r\n\r\n // Format each component to ensure it has two digits\r\n const hoursString = String(hours).padStart(2, '0')\r\n const minutesString = String(minutes).padStart(2, '0')\r\n const secondsString = String(seconds).padStart(2, '0')\r\n\r\n // Combine the components into a single string\r\n return `${hoursString}:${minutesString}:${secondsString}`\r\n}\r\n\r\nexport const formatCurrency = (value?: any, prefix = '$ ', suffix = ''): string => {\r\n let parsedValue\r\n try {\r\n parsedValue = parseFloat(value)\r\n if (isNaN(parsedValue)) parsedValue = 0\r\n } catch (e) {\r\n parsedValue = 0\r\n }\r\n const roundedValue = parsedValue.toFixed(2)\r\n const [integerPart, decimalPart] = roundedValue.split('.')\r\n const formattedIntegerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ')\r\n\r\n let formattedValue = formattedIntegerPart\r\n if (decimalPart !== '00') {\r\n formattedValue = `${formattedIntegerPart}.${decimalPart}`\r\n }\r\n return `${prefix}${formattedValue}${suffix}`\r\n}\r\n\r\nexport const formatNumberWithCommas = (number: number): string => {\r\n return number.toLocaleString('en-US')\r\n}\r\n\r\nexport const formatCapitalizeFirstText = (value: string = '') => {\r\n if (!value) return value\r\n const [first, ...data] = Array.from(value)\r\n return `${first.toUpperCase()}${data.join('')}`\r\n}\r\n\r\nexport type FormatDatetimeStyle = 'style1' | 'style2' | 'style3'\r\n\r\nexport const formatDatetimeStyles: Record<FormatDatetimeStyle, string> = {\r\n style1: 'DD/MM/YYYY HH:mm',\r\n style2: 'MMMM D, YYYY',\r\n style3: 'MM-DD-YYYY'\r\n}\r\n\r\n/**\r\n * Formats a datetime string using one of the predefined styles or a custom format string.\r\n *\r\n * Available format styles:\r\n * - style1: DD/MM/YYYY HH:mm → e.g., '25/04/2025 14:30'\r\n * - style2: MMMM D, YYYY → e.g., 'April 25, 2025'\r\n * - style3: MM-DD-YYYY → e.g., '04-25-2025'\r\n * - Or any custom dayjs format string → e.g., 'YYYY-MM-DD', 'HH:mm:ss'\r\n *\r\n * @param value - A datetime string (ISO format or any format parsable by dayjs).\r\n * @param format - Format style key ('style1', 'style2', 'style3') or custom dayjs format string. Defaults to 'style1'.\r\n * @returns A formatted datetime string, or 'unknown' if the input is invalid or unparsable.\r\n */\r\nexport const formatDatetime = (value: string, format: FormatDatetimeStyle | (string & {}) = 'style1'): string => {\r\n try {\r\n if (!value) throw new Error()\r\n const finalFormat = formatDatetimeStyles[format as FormatDatetimeStyle] ?? format\r\n return dayjs(value).format(finalFormat)\r\n } catch (error) {\r\n return 'unknown'\r\n }\r\n}\r\n//#endregion\r\n"],"names":["sleep","sec","Promise","res","setTimeout","fetchDelay","_ref","_asyncToGenerator","_regenerator","m","_callee","action","_yield$Promise$all","_yield$Promise$all2","w","_context","n","all","v","_slicedToArray","a","_x","_x2","apply","this","arguments","isGuid","value","test","isValidEmail","isValidPhoneNumber","phoneNumber","trim","isValidURL","url","windowScrollToTop","options","delay","window","scrollTo","_objectSpread","top","left","behavior","mergeClasses","_len","length","classes","Array","_key","join","isObject","obj","_typeof","isArray","mergeObjects","_len2","objects","_key2","reduce","prev","Object","keys","forEach","key","cleanObject","entries","acc","_ref2","_ref3","undefined","error","deepRemoveEmptyFields","result","_ref4","_ref5","isNaN","cleaned","encodeBase64","input","utf8Bytes","TextEncoder","encode","binaryString","byte","String","fromCharCode","btoa","console","decodeBase64","encoded","atob","Uint8Array","i","charCodeAt","TextDecoder","decode","tryParseObject","defaultValue","JSON","parse","_unused","tryParseArray","parseValue","_unused2","tryParseIntRequired","parseInt","_unused3","tryParseCsvFileToArray","file","resolve","reject","reader","FileReader","onload","rows","split","filter","Boolean","headers","map","h","data","slice","row","values","item","header","index","_values$index","onerror","Error","readAsText","formatFileSize","sizeInKb","toFixed","formatDuration","duration","isNotValidDuration","isNotNumber","Number","totalSeconds","Math","round","hours","floor","minutes","seconds","hoursString","padStart","minutesString","secondsString","concat","formatCurrency","parsedValue","prefix","suffix","parseFloat","e","_roundedValue$split","_roundedValue$split2","integerPart","decimalPart","formattedIntegerPart","replace","formattedValue","formatNumberWithCommas","number","toLocaleString","formatCapitalizeFirstText","_Array$from","from","_Array$from2","_toArray","first","_arrayLikeToArray","toUpperCase","formatDatetimeStyles","style1","style2","style3","formatDatetime","format","_formatDatetimeStyles","finalFormat","dayjs"],"mappings":"8MAEaA,EAAQ,SAACC,GAAW,OAAK,IAAIC,QAAQ,SAACC,GAAG,OAAKC,WAAWD,EAAKF,IAAK,EAEnEI,EAAU,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,EAAG,SAAAC,EAAwBC,EAA+BV,GAAW,IAAAW,EAAAC,EAAAV,EAAA,OAAAK,IAAAM,EAAA,SAAAC,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,OAAAD,EAAAC,EAAA,EACtEd,QAAQe,IAAI,CAACN,IAAUX,EAAMC,KAAM,KAAA,EAA7C,OAA6CW,EAAAG,EAAAG,EAAAL,EAAAM,EAAAP,EAAA,GAAhDT,EAAGU,EAAA,GAAAE,EAAAK,EAAA,EACHjB,GAAG,EAAAO,MACX,OAAA,SAHsBW,EAAAC,GAAA,OAAAhB,EAAAiB,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAKVC,EAAS,SAACC,GAErB,MADkB,gFACDC,KAAKD,EACxB,EAEaE,EAAe,SAACF,GAE3B,MADc,mDACDC,KAAKD,EACpB,EAEaG,EAAqB,SAACC,GAEjC,MADmB,yEACDH,MAAMG,QAAAA,EAAe,IAAIC,OAC7C,EAEaC,EAAa,SAACC,GAEzB,MADc,wCACDN,KAAKM,EACpB,EAEaC,EAAoB,SAACC,EAA2BC,GAC3DjC,WAAW,WACTkC,OAAOC,SAAQC,EAAA,CAAGC,IAAK,EAAGC,KAAM,EAAGC,SAAU,UAAaP,GAC5D,EAAGC,GAAS,GACd,EAEaO,EAAe,WAAyB,IAAA,IAAAC,EAAApB,UAAAqB,OAArBC,EAAiBC,IAAAA,MAAAH,GAAAI,EAAA,EAAAA,EAAAJ,EAAAI,IAAjBF,EAAiBE,GAAAxB,UAAAwB,GAC/C,OAAOF,EAAQG,KAAK,IACtB,EAQMC,EAAW,SAACC,GAChB,OAAOA,GAAsB,WAAfC,EAAOD,KAAqBJ,MAAMM,QAAQF,EAC1D,EAIaG,EAAe,WAAuC,IAAA,IAAAC,EAAA/B,UAAAqB,OAAhCW,EAAyBT,IAAAA,MAAAQ,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAzBD,EAAyBC,GAAAjC,UAAAiC,GAC1D,OAAOD,EAAQE,OAAO,SAACC,EAAMR,GAC3B,OAAKA,GACLS,OAAOC,KAAKV,GAAKW,QAAQ,SAACC,GACpBb,EAAUS,EAAaI,KAASb,EAAUC,EAAYY,IACtDJ,EAAaI,GAAOT,EAAcK,EAAaI,GAAOZ,EAAYY,IAElEJ,EAAaI,GAAQZ,EAAYY,EAEvC,GACOJ,GARUA,CASlB,EAAE,GACL,EAEaK,EAAc,SAAmBb,GAC5C,IACE,OAAKA,EACES,OAAOK,QAAQd,GAAKO,OAAO,SAACQ,EAAGC,GAAkB,IAAAC,EAAAlD,EAAAiD,EAAA,GAAfJ,EAAGK,EAAA,GAAE1C,EAAK0C,EAAA,GAIjD,YAHcC,IAAV3C,IACAwC,EAAYH,GAAOrC,GAEhBwC,CACR,EAAE,IANc,CAAE,CAOpB,CAAC,MAAOI,GACP,MAAO,CAAE,CACV,CACH,EAEaC,EAAwB,SAAmBpB,GACtD,GAAmB,WAAfC,EAAOD,IAA4B,OAARA,EAAc,OAAOA,EACpD,IAAMqB,EAAczB,MAAMM,QAAQF,GAAO,GAAK,CAAE,EAkBhD,OAjBAS,OAAOK,QAAQd,GAAKW,QAAQ,SAAAW,GAAiB,IAAAC,EAAAxD,EAAAuD,EAAA,GAAfV,EAAGW,EAAA,GAAEhD,EAAKgD,EAAA,GACtC,GACEhD,SAEkB,iBAAVA,GAAuC,KAAjBA,EAAMK,QAClB,iBAAVL,GAAsBiD,MAAMjD,IACnCqB,MAAMM,QAAQ3B,IAA2B,IAAjBA,EAAMmB,QACb,WAAjBO,EAAO1B,KAAuBqB,MAAMM,QAAQ3B,IAA+D,IAArDkC,OAAOC,KAAKU,EAAsB7C,IAAQmB,aAG5F,GAAqB,WAAjBO,EAAO1B,IAAuBqB,MAAMM,QAAQ3B,GAIrD8C,EAAOT,GAAOrC,MAJ+C,CAC7D,IAAMkD,EAAUL,EAAsB7C,GAClCkC,OAAOC,KAAKe,GAAS/B,OAAS,IAAG2B,EAAOT,GAAOa,EACpD,CAGH,GACOJ,CACT,EAGaK,EAAe,SAACC,GAC3B,IACE,IAAMC,GAAY,IAAIC,aAAcC,OAAOH,GACvCI,EAAe,GAInB,OAHAH,EAAUjB,QAAQ,SAACqB,GACjBD,GAAgBE,OAAOC,aAAaF,EACtC,GACOG,KAAKJ,EACb,CAAC,MAAOZ,GAEP,OADAiB,QAAQjB,MAAM,2BAA4BA,GACnC,EACR,CACH,EAEakB,EAAe,SAACC,GAC3B,IAGE,IAFA,IAAMP,EAAeQ,KAAKD,GACpBV,EAAY,IAAIY,WAAWT,EAAarC,QACrC+C,EAAI,EAAGA,EAAIV,EAAarC,OAAQ+C,IACvCb,EAAUa,GAAKV,EAAaW,WAAWD,GAEzC,OAAO,IAAIE,aAAcC,OAAOhB,EACjC,CAAC,MAAOT,GAEP,YADAiB,QAAQjB,MAAM,wBAAyBA,EAExC,CACH,EAGa0B,EAAiB,SAAatE,EAAYuE,GACrD,IACE,OAAKvE,EACEwE,KAAKC,MAAMzE,GADCuE,CAEpB,CAAC,MAAAG,GACA,OAAOH,CACR,CACH,EAEaI,EAAgB,SAAa3E,GAAkC,IAAtBuE,yDAAoB,GACxE,IACE,IAAKvE,EAAO,MAAO,GACnB,IAAM4E,EAAaJ,KAAKC,MAAMzE,GAC9B,OAAOqB,MAAMM,QAAQiD,GAAcA,EAAa,EACjD,CAAC,MAAAC,GACA,OAAON,CACR,CACH,EAEaO,EAAsB,SAAU9E,EAAYuE,GACvD,IACE,OAAKvE,EACE+E,SAAS/E,GADGuE,CAEpB,CAAC,MAAAS,GACA,OAAOT,CACR,CACH,EAEaU,EAAyB,SAACC,GACrC,OAAO,IAAI3G,QAAQ,SAAC4G,EAASC,GAC3B,IAAMC,EAAS,IAAIC,WAEnBD,EAAOE,OAAS,WACd,IACE,IACMC,EADOH,EAAOvC,OACF2C,MAAM,SAASC,OAAOC,SAExC,GAAIH,EAAKrE,OAAS,EAAG,OAAOgE,EAAQ,IAEpC,IAAMS,EAAUJ,EAAK,GAAGC,MAAM,KAAKI,IAAI,SAACC,GAAC,OAAKA,EAAEzF,SAE1C0F,EAAOP,EAAKQ,MAAM,GAAGH,IAAI,SAACI,GAC9B,IAAMC,EAASD,EAAIR,MAAM,KAAKI,IAAI,SAACtG,GAAC,OAAKA,EAAEc,SACrC8F,EAA+B,CAAE,EAMvC,OAJAP,EAAQxD,QAAQ,SAACgE,EAAQC,GAAS,IAAAC,EAChCH,EAAKC,GAAuBE,QAAhBA,EAAGJ,EAAOG,UAAMC,IAAAA,EAAAA,EAAI,EAClC,GAEOH,CACT,GAEAhB,EAAQY,EACT,CAAC,MAAOnD,GACPuC,EAAQ,GACT,CACF,EAEDE,EAAOkB,QAAU,WACfnB,EAAO,IAAIoB,MAAM,sBAClB,EAEDnB,EAAOoB,WAAWvB,EACpB,EACF,EAIawB,EAAiB,SAACC,GAC7B,OAAIA,EAAW,KACNA,EAASC,QAAQ,GAAK,MACpBD,EAAW,SACZA,EAAW,MAAMC,QAAQ,GAAK,MAC7BD,EAAW,YACZA,EAAQ,SAAkBC,QAAQ,GAAK,OAEvCD,EAAY,YAAqBC,QAAQ,GAAK,KAE1D,EAEaC,EAAiB,SAACC,GAC7B,IAAMC,EAAqBD,QACrBE,EAAkC,iBAAbF,GAAyB7D,MAAMgE,OAAOH,IACjE,GAAIC,GAAsBC,EAAa,MAAO,WAG9C,IAAME,EAAeC,KAAKC,MAAMN,GAG1BO,EAAQF,KAAKG,MAAMJ,EAAe,MAClCK,EAAUJ,KAAKG,MAAOJ,EAAe,KAAQ,IAC7CM,EAAUN,EAAe,GAGzBO,EAAc/D,OAAO2D,GAAOK,SAAS,EAAG,KACxCC,EAAgBjE,OAAO6D,GAASG,SAAS,EAAG,KAC5CE,EAAgBlE,OAAO8D,GAASE,SAAS,EAAG,KAGlD,MAAAG,GAAAA,OAAUJ,EAAWI,KAAAA,OAAIF,EAAa,KAAAE,OAAID,EAC5C,EAEaE,EAAiB,SAAC9H,GAAmD,IAC5E+H,EADsCC,EAAMlI,UAAAqB,OAAA,QAAAwB,IAAA7C,UAAA,GAAAA,UAAA,GAAG,KAAMmI,EAAMnI,UAAAqB,OAAA,QAAAwB,IAAA7C,UAAA,GAAAA,UAAA,GAAG,GAElE,IACEiI,EAAcG,WAAWlI,GACrBiD,MAAM8E,KAAcA,EAAc,EACvC,CAAC,MAAOI,GACPJ,EAAc,CACf,CACD,IACAK,EADqBL,EAAYnB,QAAQ,GACOnB,MAAM,KAAI4C,EAAA7I,EAAA4I,EAAA,GAAnDE,EAAWD,EAAA,GAAEE,EAAWF,EAAA,GACzBG,EAAuBF,EAAYG,QAAQ,wBAAyB,KAEtEC,EAAiBF,EAIrB,MAHoB,OAAhBD,IACFG,EAAc,GAAAb,OAAMW,OAAoBX,OAAIU,IAE9CV,GAAAA,OAAUG,GAAMH,OAAGa,GAAcb,OAAGI,EACtC,EAEaU,EAAyB,SAACC,GACrC,OAAOA,EAAOC,eAAe,QAC/B,EAEaC,EAA4B,WAAuB,IAAtB9I,EAAgBF,UAAAqB,OAAA,QAAAwB,IAAA7C,UAAA,GAAAA,UAAA,GAAA,GACxD,IAAKE,EAAO,OAAOA,EACnB,IAAA+I,EAAyB1H,MAAM2H,KAAKhJ,GAAMiJ,EAAAC,EAAAH,GAAnCI,EAAKF,EAAA,GAAKlD,EAAIqD,EAAAH,GAAAjD,MAAA,GACrB,MAAA,GAAA6B,OAAUsB,EAAME,eAAaxB,OAAG9B,EAAKxE,KAAK,IAC5C,EAIa+H,EAA4D,CACvEC,OAAQ,mBACRC,OAAQ,eACRC,OAAQ,cAgBGC,EAAiB,SAAC1J,GAAiF,IAAlE2J,EAAA7J,UAAAqB,OAAA,QAAAwB,IAAA7C,UAAA,GAAAA,UAAA,GAA8C,SAC1F,IAAI,IAAA8J,EACF,IAAK5J,EAAO,MAAM,IAAIwG,MACtB,IAAMqD,EAAiED,QAAtDA,EAAGN,EAAqBK,UAA8BC,IAAAA,EAAAA,EAAID,EAC3E,OAAOG,EAAM9J,GAAO2J,OAAOE,EAC5B,CAAC,MAAOjH,GACP,MAAO,SACR,CACH"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../src/utils/helpers.ts"],"sourcesContent":["import dayjs from 'dayjs'\r\n\r\nexport const sleep = (sec: number) => new Promise((res) => setTimeout(res, sec))\r\n\r\nexport const fetchDelay = async function <TModel>(action: () => Promise<TModel>, sec: number) {\r\n const [res] = await Promise.all([action(), sleep(sec)])\r\n return res\r\n}\r\n\r\nexport const isGuid = (value: string): boolean => {\r\n const guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/\r\n return guidRegex.test(value)\r\n}\r\n\r\nexport const isValidEmail = (value: string) => {\r\n const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\r\n return regex.test(value)\r\n}\r\n\r\nexport const isValidPhoneNumber = (phoneNumber?: string): boolean => {\r\n const phoneRegex = /^(\\+?\\d{1,4}[\\s-]?)?((\\(\\d{1,4}\\))|\\d{1,4})[\\s-]?\\d{1,4}[\\s-]?\\d{1,9}$/\r\n return phoneRegex.test((phoneNumber ?? '').trim())\r\n}\r\n\r\nexport const isValidURL = (url: string): boolean => {\r\n const regex = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i\r\n return regex.test(url)\r\n}\r\n\r\nexport const windowScrollToTop = (options?: ScrollToOptions, delay?: number) => {\r\n setTimeout(() => {\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth', ...options })\r\n }, delay || 50)\r\n}\r\n\r\nexport const mergeClasses = (...classes: string[]) => {\r\n return classes.join(' ')\r\n}\r\n\r\n//#region Object\r\nconst isObject = (obj: any) => obj != null && typeof obj === 'object' && !Array.isArray(obj)\r\n\r\ntype DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P] } | undefined\r\n\r\n/**\r\n * mergeObjects: merge objects deeply, later sources always override earlier values for the same key.\r\n *\r\n * Rules:\r\n * - undefined → skip, keep previous value\r\n * - null → explicitly remove the field\r\n * - plain obj → recurse (deep merge)\r\n * - everything else (primitive, array, false, 0) → source wins\r\n *\r\n * @example\r\n * // undefined is skipped — previous value kept\r\n * mergeObjects({ a: 1 }, { a: undefined })\r\n * // → { a: 1 }\r\n *\r\n * // null removes the field\r\n * mergeObjects({ a: { x: 1 } }, { a: null })\r\n * // → { a: null }\r\n *\r\n * // Primitive override — source wins\r\n * mergeObjects({ a: 1, b: true }, { b: false })\r\n * // → { a: 1, b: false }\r\n *\r\n * // Nested deep merge — both sides are plain objects → recurse\r\n * mergeObjects({ a: { x: 1, y: 2 } }, { a: { x: 10, z: 3 } })\r\n * // → { a: { x: 10, y: 2, z: 3 } }\r\n *\r\n * // Multiple sources — last non-undefined source wins on conflict\r\n * mergeObjects({ a: 1 }, { a: 2 }, { a: 3 })\r\n * // → { a: 3 }\r\n */\r\nexport const mergeObjects = <T>(...objects: DeepPartial<T>[]): T => {\r\n const validObjects = objects.filter((x): x is Exclude<DeepPartial<T>, undefined> => x != null)\r\n if (validObjects.length === 0) return {} as T\r\n\r\n const [first, ...rest] = validObjects\r\n const target = Object.assign({}, first) as any\r\n\r\n for (const obj of rest) {\r\n for (const key of Object.keys(obj)) {\r\n const srcVal = (obj as any)[key]\r\n\r\n // undefined → skip, keep current value\r\n if (srcVal === undefined) continue\r\n\r\n const tgtVal = target[key]\r\n if (isObject(tgtVal) && isObject(srcVal)) {\r\n // both plain objects → recurse\r\n target[key] = mergeObjects(tgtVal, srcVal)\r\n } else {\r\n // null, false, 0, array, primitive → source wins\r\n target[key] = srcVal\r\n }\r\n }\r\n }\r\n\r\n return target\r\n}\r\n\r\nexport const cleanObject = <T extends object>(obj: T): Partial<T> => {\r\n try {\r\n if (!obj) return {}\r\n return Object.entries(obj).reduce((acc, [key, value]) => {\r\n if (value !== undefined) {\r\n ;(acc as any)[key] = value\r\n }\r\n return acc\r\n }, {} as Partial<T>)\r\n } catch (error) {\r\n return {}\r\n }\r\n}\r\n\r\nexport const deepRemoveEmptyFields = <T extends object>(obj: T): T => {\r\n if (typeof obj !== 'object' || obj === null) return obj\r\n const result: any = Array.isArray(obj) ? [] : {}\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'string' && value.trim() === '') ||\r\n (typeof value === 'number' && isNaN(value)) ||\r\n (Array.isArray(value) && value.length === 0) ||\r\n (typeof value === 'object' && !Array.isArray(value) && Object.keys(deepRemoveEmptyFields(value)).length === 0)\r\n ) {\r\n // skip\r\n } else if (typeof value === 'object' && !Array.isArray(value)) {\r\n const cleaned = deepRemoveEmptyFields(value)\r\n if (Object.keys(cleaned).length > 0) result[key] = cleaned\r\n } else {\r\n result[key] = value\r\n }\r\n })\r\n return result\r\n}\r\n//#endregion\r\n\r\nexport const encodeBase64 = (input: string): string => {\r\n try {\r\n const utf8Bytes = new TextEncoder().encode(input)\r\n let binaryString = ''\r\n utf8Bytes.forEach((byte) => {\r\n binaryString += String.fromCharCode(byte)\r\n })\r\n return btoa(binaryString)\r\n } catch (error) {\r\n console.error('Error encoding to base64', error)\r\n return ''\r\n }\r\n}\r\n\r\nexport const decodeBase64 = (encoded: string): string | undefined => {\r\n try {\r\n const binaryString = atob(encoded)\r\n const utf8Bytes = new Uint8Array(binaryString.length)\r\n for (let i = 0; i < binaryString.length; i++) {\r\n utf8Bytes[i] = binaryString.charCodeAt(i)\r\n }\r\n return new TextDecoder().decode(utf8Bytes)\r\n } catch (error) {\r\n console.error('Error decoding base64', error)\r\n return\r\n }\r\n}\r\n\r\n//#region Try Parse\r\nexport const tryParseObject = function <T>(value: any, defaultValue: T): T {\r\n try {\r\n if (!value) return defaultValue\r\n return JSON.parse(value)\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseArray = function <T>(value: any, defaultValue: T[] = []): T[] {\r\n try {\r\n if (!value) return []\r\n const parseValue = JSON.parse(value)\r\n return Array.isArray(parseValue) ? parseValue : []\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseIntRequired = function (value: any, defaultValue: number): number {\r\n try {\r\n if (!value) return defaultValue\r\n return parseInt(value)\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\nexport const tryParseCsvFileToArray = (file: File): Promise<Record<string, string>[]> => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n\r\n reader.onload = () => {\r\n try {\r\n const text = reader.result as string\r\n const rows = text.split(/\\r?\\n/).filter(Boolean)\r\n\r\n if (rows.length < 1) return resolve([])\r\n\r\n const headers = rows[0].split(',').map((h) => h.trim())\r\n\r\n const data = rows.slice(1).map((row) => {\r\n const values = row.split(',').map((v) => v.trim())\r\n const item: Record<string, string> = {}\r\n\r\n headers.forEach((header, index) => {\r\n item[header] = values[index] ?? ''\r\n })\r\n\r\n return item\r\n })\r\n\r\n resolve(data)\r\n } catch (error) {\r\n resolve([])\r\n }\r\n }\r\n\r\n reader.onerror = () => {\r\n reject(new Error('Error reading file'))\r\n }\r\n\r\n reader.readAsText(file)\r\n })\r\n}\r\n//#endregion\r\n\r\n//#region Format\r\nexport const formatFileSize = (sizeInKb: number) => {\r\n if (sizeInKb < 1024) {\r\n return sizeInKb.toFixed(2) + ' Kb'\r\n } else if (sizeInKb < 1024 * 1024) {\r\n return (sizeInKb / 1024).toFixed(2) + ' Mb'\r\n } else if (sizeInKb < 1024 * 1024 * 1024) {\r\n return (sizeInKb / (1024 * 1024)).toFixed(2) + ' Gb'\r\n } else {\r\n return (sizeInKb / (1024 * 1024 * 1024)).toFixed(2) + ' Tb'\r\n }\r\n}\r\n\r\nexport const formatDuration = (duration?: number): string => {\r\n const isNotValidDuration = duration === undefined || duration === null\r\n const isNotNumber = typeof duration === 'string' && isNaN(Number(duration))\r\n if (isNotValidDuration || isNotNumber) return '00:00:00'\r\n\r\n // Round the duration to the nearest second\r\n const totalSeconds = Math.round(duration)\r\n\r\n // Calculate hours, minutes, and seconds\r\n const hours = Math.floor(totalSeconds / 3600)\r\n const minutes = Math.floor((totalSeconds % 3600) / 60)\r\n const seconds = totalSeconds % 60\r\n\r\n // Format each component to ensure it has two digits\r\n const hoursString = String(hours).padStart(2, '0')\r\n const minutesString = String(minutes).padStart(2, '0')\r\n const secondsString = String(seconds).padStart(2, '0')\r\n\r\n // Combine the components into a single string\r\n return `${hoursString}:${minutesString}:${secondsString}`\r\n}\r\n\r\nexport const formatCurrency = (value?: any, prefix = '$ ', suffix = ''): string => {\r\n let parsedValue\r\n try {\r\n parsedValue = parseFloat(value)\r\n if (isNaN(parsedValue)) parsedValue = 0\r\n } catch (e) {\r\n parsedValue = 0\r\n }\r\n const roundedValue = parsedValue.toFixed(2)\r\n const [integerPart, decimalPart] = roundedValue.split('.')\r\n const formattedIntegerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ')\r\n\r\n let formattedValue = formattedIntegerPart\r\n if (decimalPart !== '00') {\r\n formattedValue = `${formattedIntegerPart}.${decimalPart}`\r\n }\r\n return `${prefix}${formattedValue}${suffix}`\r\n}\r\n\r\nexport const formatNumberWithCommas = (number: number): string => {\r\n return number.toLocaleString('en-US')\r\n}\r\n\r\nexport const formatCapitalizeFirstText = (value: string = '') => {\r\n if (!value) return value\r\n const [first, ...data] = Array.from(value)\r\n return `${first.toUpperCase()}${data.join('')}`\r\n}\r\n\r\nexport type FormatDatetimeStyle = 'style1' | 'style2' | 'style3'\r\n\r\nexport const formatDatetimeStyles: Record<FormatDatetimeStyle, string> = {\r\n style1: 'DD/MM/YYYY HH:mm',\r\n style2: 'MMMM D, YYYY',\r\n style3: 'MM-DD-YYYY'\r\n}\r\n\r\n/**\r\n * Formats a datetime string using one of the predefined styles or a custom format string.\r\n *\r\n * Available format styles:\r\n * - style1: DD/MM/YYYY HH:mm → e.g., '25/04/2025 14:30'\r\n * - style2: MMMM D, YYYY → e.g., 'April 25, 2025'\r\n * - style3: MM-DD-YYYY → e.g., '04-25-2025'\r\n * - Or any custom dayjs format string → e.g., 'YYYY-MM-DD', 'HH:mm:ss'\r\n *\r\n * @param value - A datetime string (ISO format or any format parsable by dayjs).\r\n * @param format - Format style key ('style1', 'style2', 'style3') or custom dayjs format string. Defaults to 'style1'.\r\n * @returns A formatted datetime string, or 'unknown' if the input is invalid or unparsable.\r\n */\r\nexport const formatDatetime = (value: string, format: FormatDatetimeStyle | (string & {}) = 'style1'): string => {\r\n try {\r\n if (!value) throw new Error()\r\n const finalFormat = formatDatetimeStyles[format as FormatDatetimeStyle] ?? format\r\n return dayjs(value).format(finalFormat)\r\n } catch (error) {\r\n return 'unknown'\r\n }\r\n}\r\n//#endregion\r\n"],"names":["sleep","sec","Promise","res","setTimeout","fetchDelay","_ref","_asyncToGenerator","_regenerator","m","_callee","action","_yield$Promise$all","_yield$Promise$all2","w","_context","n","all","v","_slicedToArray","a","_x","_x2","apply","this","arguments","isGuid","value","test","isValidEmail","isValidPhoneNumber","phoneNumber","trim","isValidURL","url","windowScrollToTop","options","delay","window","scrollTo","_objectSpread","top","left","behavior","mergeClasses","_len","length","classes","Array","_key","join","isObject","obj","_typeof","isArray","mergeObjects","_len2","objects","_key2","validObjects","filter","x","_step","_validObjects","_toArray","first","rest","_arrayLikeToArray","slice","target","Object","assign","_iterator","_createForOfIteratorHelper","s","done","_i","_Object$keys","keys","key","srcVal","undefined","tgtVal","err","e","f","cleanObject","entries","reduce","acc","_ref2","_ref3","error","deepRemoveEmptyFields","result","forEach","_ref4","_ref5","isNaN","cleaned","encodeBase64","input","utf8Bytes","TextEncoder","encode","binaryString","byte","String","fromCharCode","btoa","console","decodeBase64","encoded","atob","Uint8Array","i","charCodeAt","TextDecoder","decode","tryParseObject","defaultValue","JSON","parse","_unused","tryParseArray","parseValue","_unused2","tryParseIntRequired","parseInt","_unused3","tryParseCsvFileToArray","file","resolve","reject","reader","FileReader","onload","rows","split","Boolean","headers","map","h","data","row","values","item","header","index","_values$index","onerror","Error","readAsText","formatFileSize","sizeInKb","toFixed","formatDuration","duration","isNotValidDuration","isNotNumber","Number","totalSeconds","Math","round","hours","floor","minutes","seconds","hoursString","padStart","minutesString","secondsString","concat","formatCurrency","parsedValue","prefix","suffix","parseFloat","_roundedValue$split","_roundedValue$split2","integerPart","decimalPart","formattedIntegerPart","replace","formattedValue","formatNumberWithCommas","number","toLocaleString","formatCapitalizeFirstText","_Array$from","from","_Array$from2","toUpperCase","formatDatetimeStyles","style1","style2","style3","formatDatetime","format","_formatDatetimeStyles","finalFormat","dayjs"],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ type TAutoMapConfig<TSource, TTarget extends object, U extends object = {}> = {
|
|
|
20
20
|
* @en The operation to apply for the filter field. @default 'contains'
|
|
21
21
|
* @vi Thao tác áp dụng cho trường filter. @default 'contains'
|
|
22
22
|
*/
|
|
23
|
-
operation?: 'equal' | 'equalAndAny' | 'contains' | 'datetime' | 'number';
|
|
23
|
+
operation?: 'equal' | 'equalAndAny' | 'contains' | 'datetime' | 'number' | 'boolean';
|
|
24
24
|
/**
|
|
25
25
|
* @en
|
|
26
26
|
* - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.
|
|
@@ -49,6 +49,7 @@ export declare class TableFileterConverter<TSource extends Record<string, any>,
|
|
|
49
49
|
}): this;
|
|
50
50
|
filterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
|
|
51
51
|
filterDatetime(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
|
|
52
|
+
filterBoolean(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
|
|
52
53
|
filterNumber(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
|
|
53
54
|
sort(param?: {
|
|
54
55
|
seed: {
|
|
@@ -6,51 +6,35 @@ export declare const mapSpecialLabel: Record<KeySpecial, string>;
|
|
|
6
6
|
export interface IFilterStateQueryParams {
|
|
7
7
|
filter?: string;
|
|
8
8
|
}
|
|
9
|
-
/**
|
|
10
|
-
* @en Remove null/undefined values from object recursively for accurate comparison.
|
|
11
|
-
* @vi Loai bo cac gia tri null/undefined khoi object mot cach de quy de so sanh chinh xac.
|
|
12
|
-
*/
|
|
9
|
+
/** Remove null/undefined values from object recursively for accurate comparison. */
|
|
13
10
|
export declare function removeNullValues<T = any>(obj: T): T | undefined;
|
|
14
|
-
/**
|
|
15
|
-
* @en Check if filter state is empty (no filters applied). Null/undefined values are ignored in this check.
|
|
16
|
-
* @vi Kiem tra xem filter state co rong khong (khong co filter nao duoc ap dung). Gia tri null/undefined se duoc bo qua trong kiem tra nay.
|
|
17
|
-
*/
|
|
11
|
+
/** Check if filter state is empty (no filters applied). Null/undefined values are ignored in this check. */
|
|
18
12
|
export declare function isEmptyFilterState<T>(state?: TFilterState<T>): boolean;
|
|
19
|
-
/**
|
|
20
|
-
* @en Deep comparison of two filter states to check if they are equal.
|
|
21
|
-
* @vi So sanh sau hai filter state de kiem tra xem chung co bang nhau khong.
|
|
22
|
-
*/
|
|
13
|
+
/** Deep comparison of two filter states to check if they are equal. */
|
|
23
14
|
export declare function isFilterStateEqual<T>(state1?: TFilterState<T>, state2?: TFilterState<T>): boolean;
|
|
24
15
|
/**
|
|
25
|
-
*
|
|
26
|
-
* @vi Dong bo filter state vao URL query parameters. Neu state bang defaultState, xoa khoi URL de giu URL sach.
|
|
27
|
-
*
|
|
16
|
+
* Synchronize filter state to URL query parameters. If state equals defaultState, remove from URL to keep it clean.
|
|
28
17
|
* @param state - Current filter state to sync
|
|
29
18
|
* @param defaultState - Default filter state (if current equals this, don't save to URL)
|
|
30
19
|
*/
|
|
31
20
|
export declare function setFilterToURL<T>(state?: TFilterState<T>, defaultState?: TFilterState<T>): void;
|
|
32
21
|
/**
|
|
33
|
-
*
|
|
34
|
-
* @vi Lay filter state tu URL query parameters.
|
|
35
|
-
*
|
|
22
|
+
* Retrieve filter state from URL query parameters.
|
|
36
23
|
* @param defaultState - Default filter state to return if URL has no filter state
|
|
37
24
|
* @returns Filter state from URL or defaultState
|
|
38
25
|
*/
|
|
39
26
|
export declare function getFilterFromURL<T>(defaultState?: TFilterState<T>): TFilterState<T> | undefined;
|
|
40
27
|
/**
|
|
41
|
-
*
|
|
42
|
-
* @vi Dat gia tri seed vao URL de sap xep shuffle. Neu seed khong xac dinh, xoa khoi URL.
|
|
28
|
+
* Set seed value to URL for shuffle sorting. If seed is undefined, remove from URL.
|
|
43
29
|
* @param seed - Seed value for shuffle sorting
|
|
44
30
|
*/
|
|
45
31
|
export declare const setSeedToURL: (seed?: string) => void;
|
|
46
32
|
/**
|
|
47
|
-
*
|
|
48
|
-
* @vi Lay gia tri seed tu URL de sap xep shuffle. Tra ve undefined neu khong duoc dat hoac co loi.
|
|
33
|
+
* Get seed value from URL for shuffle sorting. Returns undefined if not set or on error.
|
|
49
34
|
* @returns Seed value from URL or undefined
|
|
50
35
|
*/
|
|
51
36
|
export declare const getSeedFromURL: () => string | undefined;
|
|
52
37
|
/**
|
|
53
|
-
*
|
|
54
|
-
* @vi Xoa gia tri seed khoi URL.
|
|
38
|
+
* Remove seed value from URL.
|
|
55
39
|
*/
|
|
56
40
|
export declare const removeSeedFromURL: () => void;
|
|
@@ -5,6 +5,7 @@ import createFormFieldNumber, { formatterNumber } from './menu/create-form-field
|
|
|
5
5
|
import createFormFieldDateTime, { formatterDateTime } from './menu/create-form-field-datetime';
|
|
6
6
|
import createFormFieldString from './menu/create-form-field-string';
|
|
7
7
|
import createFormFieldSelect from './menu/create-form-field-select';
|
|
8
|
+
import createFormFieldBoolean, { formatterBoolean } from './menu/create-form-field-boolean';
|
|
8
9
|
import createFormFieldSelectMultiple from './menu/create-form-field-select-multiple';
|
|
9
10
|
export declare class DinoFilterBar {
|
|
10
11
|
createFilterBar: typeof createFilterBar;
|
|
@@ -13,6 +14,7 @@ export declare class DinoFilterBar {
|
|
|
13
14
|
createFormFieldString: typeof createFormFieldString;
|
|
14
15
|
createFormFieldNumber: typeof createFormFieldNumber;
|
|
15
16
|
createFormFieldDateTime: typeof createFormFieldDateTime;
|
|
17
|
+
createFormFieldBoolean: typeof createFormFieldBoolean;
|
|
16
18
|
createFormFieldSelect: typeof createFormFieldSelect;
|
|
17
19
|
createFormFieldSelectWithFallback: typeof createFormFieldSelectWithFallback;
|
|
18
20
|
createFormFieldSelectMultiple: typeof createFormFieldSelectMultiple;
|
|
@@ -21,6 +23,7 @@ export declare class DinoFilterBar {
|
|
|
21
23
|
mapDirection: (direction?: import("./types").TDirection | undefined) => "ASC" | "DESC";
|
|
22
24
|
formatterDateTime: typeof formatterDateTime;
|
|
23
25
|
formatterNumber: typeof formatterNumber;
|
|
26
|
+
formatterBoolean: typeof formatterBoolean;
|
|
24
27
|
isEmptyFilterState: typeof isEmptyFilterState;
|
|
25
28
|
removeNullValues: typeof removeNullValues;
|
|
26
29
|
isFilterStateEqual: typeof isFilterStateEqual;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { FC, ReactNode } from 'react';
|
|
2
|
+
import type { TFieldValid } from '../types';
|
|
3
|
+
import type { IFieldMenuConfig, IFilterMenuFormProps } from './types';
|
|
4
|
+
/** Props for the `FormFieldBoolean` component returned by `createFormFieldBoolean`. Extends the base filter-menu form props. */
|
|
5
|
+
export interface IFormFieldBooleanProps<T> extends IFilterMenuFormProps<T> {
|
|
6
|
+
/** Optional content to render at the top of the form */
|
|
7
|
+
top?: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
/** Parameters passed to `createFormFieldBoolean` to configure the generated component. */
|
|
10
|
+
export interface IFormFieldBooleanParam<T> {
|
|
11
|
+
/** Optional configuration for the form field */
|
|
12
|
+
config?: IFieldMenuConfig<T>;
|
|
13
|
+
/** Label for the `true` option. @default "Yes" */
|
|
14
|
+
trueLabel?: string;
|
|
15
|
+
/** Label for the `false` option. @default "No" */
|
|
16
|
+
falseLabel?: string;
|
|
17
|
+
/** Optional content to render at the top of the form */
|
|
18
|
+
top?: ReactNode;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Factory function that creates a `FormFieldBoolean` filter-menu component.
|
|
22
|
+
*
|
|
23
|
+
* The generated component renders two radio buttons (true / false) inside a
|
|
24
|
+
* popper/menu panel. It is designed for boolean fields such as `is_active`,
|
|
25
|
+
* `is_deleted`, `is_verified`, etc. It supports:
|
|
26
|
+
* - Configurable labels for the true/false options (e.g. "Yes / No", "Active / Inactive")
|
|
27
|
+
* - Chip viewers showing the currently applied value
|
|
28
|
+
* - Single-value mode by default (only one boolean can be applied at a time)
|
|
29
|
+
* - A loading overlay that disables interaction while `isLoading` is true
|
|
30
|
+
*
|
|
31
|
+
* @param params - Static configuration (optional label overrides, optional field config override)
|
|
32
|
+
* @returns A React FC ready to be used as a boolean filter-menu field component
|
|
33
|
+
*/
|
|
34
|
+
declare function createFormFieldBoolean<T>(params?: IFormFieldBooleanParam<T>): FC<IFormFieldBooleanProps<T>>;
|
|
35
|
+
export default createFormFieldBoolean;
|
|
36
|
+
/**
|
|
37
|
+
* Creates a `labelFormatter` for use in `summaryConfig`.
|
|
38
|
+
* Converts boolean values (`true` / `false`) to human-readable labels in the filter summary chips.
|
|
39
|
+
*
|
|
40
|
+
* @param trueLabel - Label shown for `true`. @default "Yes"
|
|
41
|
+
* @param falseLabel - Label shown for `false`. @default "No"
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* createFilterSummary({
|
|
46
|
+
* fields: {
|
|
47
|
+
* active: { label: 'Active', labelFormatter: formatterBoolean({ trueLabel: 'Active', falseLabel: 'Inactive' }) }
|
|
48
|
+
* }
|
|
49
|
+
* })
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function formatterBoolean(param?: {
|
|
53
|
+
trueLabel?: string;
|
|
54
|
+
falseLabel?: string;
|
|
55
|
+
}): (value: TFieldValid) => string | undefined;
|
|
@@ -40,7 +40,7 @@ export interface IFilterMenuFormProps<T> {
|
|
|
40
40
|
onClose: () => void;
|
|
41
41
|
onSubmit: (key: TFieldType<T>, value?: TFieldValue, config?: IFieldMenuConfig<T>) => void;
|
|
42
42
|
onRemove?: (key: TFieldType<T>, value: TFieldValid) => void;
|
|
43
|
-
onRemoveField?: (key: TFieldType<T>) => void;
|
|
43
|
+
onRemoveField?: (key: TFieldType<T>, config?: IFieldMenuConfig<T>) => void;
|
|
44
44
|
}
|
|
45
45
|
export interface IFilterMenuSlots {
|
|
46
46
|
popperProps?: Partial<PopperProps>;
|
|
@@ -35,9 +35,15 @@ export declare class RequestParam<T extends object = any, U extends object = {}>
|
|
|
35
35
|
private ignoreEmpty;
|
|
36
36
|
private _filter;
|
|
37
37
|
private _filterBase;
|
|
38
|
-
filter: (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
filter: (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption> & {
|
|
39
|
+
noQuote?: boolean;
|
|
40
|
+
}) => this;
|
|
41
|
+
filterEqual: (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption> & {
|
|
42
|
+
noQuote?: boolean;
|
|
43
|
+
}) => this;
|
|
44
|
+
filterNotEquals: (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption> & {
|
|
45
|
+
noQuote?: boolean;
|
|
46
|
+
}) => this;
|
|
41
47
|
filterEnum: (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => this;
|
|
42
48
|
filterStartsWith: (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => this;
|
|
43
49
|
filterContains: (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => this;
|
|
@@ -9,6 +9,36 @@ export declare const mergeClasses: (...classes: string[]) => string;
|
|
|
9
9
|
type DeepPartial<T> = {
|
|
10
10
|
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
11
11
|
} | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* mergeObjects: merge objects deeply, later sources always override earlier values for the same key.
|
|
14
|
+
*
|
|
15
|
+
* Rules:
|
|
16
|
+
* - undefined → skip, keep previous value
|
|
17
|
+
* - null → explicitly remove the field
|
|
18
|
+
* - plain obj → recurse (deep merge)
|
|
19
|
+
* - everything else (primitive, array, false, 0) → source wins
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // undefined is skipped — previous value kept
|
|
23
|
+
* mergeObjects({ a: 1 }, { a: undefined })
|
|
24
|
+
* // → { a: 1 }
|
|
25
|
+
*
|
|
26
|
+
* // null removes the field
|
|
27
|
+
* mergeObjects({ a: { x: 1 } }, { a: null })
|
|
28
|
+
* // → { a: null }
|
|
29
|
+
*
|
|
30
|
+
* // Primitive override — source wins
|
|
31
|
+
* mergeObjects({ a: 1, b: true }, { b: false })
|
|
32
|
+
* // → { a: 1, b: false }
|
|
33
|
+
*
|
|
34
|
+
* // Nested deep merge — both sides are plain objects → recurse
|
|
35
|
+
* mergeObjects({ a: { x: 1, y: 2 } }, { a: { x: 10, z: 3 } })
|
|
36
|
+
* // → { a: { x: 10, y: 2, z: 3 } }
|
|
37
|
+
*
|
|
38
|
+
* // Multiple sources — last non-undefined source wins on conflict
|
|
39
|
+
* mergeObjects({ a: 1 }, { a: 2 }, { a: 3 })
|
|
40
|
+
* // → { a: 3 }
|
|
41
|
+
*/
|
|
12
42
|
export declare const mergeObjects: <T>(...objects: DeepPartial<T>[]) => T;
|
|
13
43
|
export declare const cleanObject: <T extends object>(obj: T) => Partial<T>;
|
|
14
44
|
export declare const deepRemoveEmptyFields: <T extends object>(obj: T) => T;
|