@shefing/quickfilter 1.0.36 → 1.0.38
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/lib/utils.js +1 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/nav/index.d.ts.map +1 -1
- package/dist/nav/index.js +2 -4
- package/dist/nav/index.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/utils.js
CHANGED
|
@@ -54,7 +54,7 @@ export const parseWhereClauseToFilterValues = (where, fields, locale)=>{
|
|
|
54
54
|
if (fieldDef && condition && typeof condition === 'object') {
|
|
55
55
|
if ('equals' in condition) {
|
|
56
56
|
if (fieldDef.type === 'checkbox') {
|
|
57
|
-
values[fieldName] = condition.equals == 'true' ? 'checked' : 'unchecked';
|
|
57
|
+
values[fieldName] = condition.equals == 'true' || condition.equals === true ? 'checked' : 'unchecked';
|
|
58
58
|
} else if (fieldDef.type === 'select') {
|
|
59
59
|
values[fieldName] = {
|
|
60
60
|
selectedValues: [
|
package/dist/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\nimport { AppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime'\nimport type {\n CheckboxFilterState,\n DateFilterValue,\n FilterDetaild,\n SelectFilterValue,\n} from '../filters/types/filters-type'\nimport { SupportedLocale } from '../labels'\nimport {\n futureOptionKeys,\n pastOptionKeys,\n} from '../filters/constants/date-filter-options'\nimport { getDateRangeForOption } from '../filters/utils/date-helpers'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function handleNavigation(\n href: string,\n e: React.MouseEvent,\n pathname: string,\n router: AppRouterInstance,\n) {\n // Check if we're on holdings page and there's a navigation handler\n if (\n pathname === '/holdings' &&\n typeof window !== 'undefined' &&\n (window as unknown as Record<string, unknown>).holdingsNavigationHandler\n ) {\n const canNavigate = (\n (window as unknown as Record<string, unknown>).holdingsNavigationHandler as (\n href: string,\n ) => boolean\n )(href)\n if (!canNavigate) {\n e.preventDefault()\n return\n }\n }\n router.push(href)\n}\n\n// Translates URL query conditions to the quick filter's internal state\nexport const parseWhereClauseToFilterValues = (\n where: any,\n fields: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any> => {\n const values: Record<string, any> = {}\n const fieldNames = new Set(fields.map((f) => f.name))\n\n const recursiveParse = (clause: any) => {\n if (!clause || typeof clause !== 'object') return\n\n if (clause.and) {\n clause.and.forEach(recursiveParse)\n return\n }\n if (clause.or) {\n if (clause.or.length > 1) {\n return\n }\n clause.or.forEach(recursiveParse)\n return\n }\n for (const fieldName in clause) {\n if (fieldNames.has(fieldName)) {\n const fieldDef = fields.find((f) => f.name === fieldName)\n const condition = clause[fieldName]\n\n // Handle string values for date fields (e.g., 'todayAndFuture')\n if (fieldDef && fieldDef.type === 'date' && typeof condition === 'string') {\n const predefinedValue = condition\n if ([...pastOptionKeys, ...futureOptionKeys].includes(predefinedValue as any)) {\n values[fieldName] = {\n type: 'predefined',\n predefinedValue,\n }\n continue\n }\n }\n\n if (fieldDef && condition && typeof condition === 'object') {\n if ('equals' in condition) {\n if (fieldDef.type === 'checkbox') {\n values[fieldName] = condition.equals == 'true' ? 'checked' : 'unchecked'\n } else if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: [condition.equals] }\n }\n } else if ('in' in condition && Array.isArray(condition.in)) {\n if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: condition.in }\n }\n } else if ('greater_than_equal' in condition || 'less_than_equal' in condition) {\n if (fieldDef.type === 'date') {\n const fromDate = condition.greater_than_equal\n ? new Date(condition.greater_than_equal)\n : null\n const toDate = condition.less_than_equal ? new Date(condition.less_than_equal) : null\n const allDateOptions = [...pastOptionKeys, ...futureOptionKeys]\n let matchedOption = null\n\n for (const option of allDateOptions) {\n const range = getDateRangeForOption(option, locale)\n let isFromMatch\n if (fromDate) {\n isFromMatch = range.from?.toDateString() === fromDate.toDateString()\n } else if (fromDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isFromMatch = true\n }\n let isToMatch\n if (toDate) {\n isToMatch = range.to?.toDateString() === toDate.toDateString()\n } else if (toDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isToMatch = true\n }\n\n if (isFromMatch && isToMatch) {\n matchedOption = option\n break\n }\n }\n\n if (matchedOption) {\n values[fieldName] = {\n type: 'predefined',\n predefinedValue: matchedOption,\n }\n } else {\n values[fieldName] = {\n type: 'custom',\n customRange: {\n from: fromDate,\n to: toDate,\n },\n }\n }\n }\n }\n }\n }\n }\n }\n\n recursiveParse(where)\n return values\n}\n// Builds an array of condition objects from the quick filter values\nexport const buildQuickFilterConditions = (\n values: Record<string, any>,\n fieldDefs: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any>[] => {\n const conditions: Record<string, any>[] = []\n\n Object.entries(values).forEach(([fieldName, value]) => {\n if (!value) return\n const fieldDef = fieldDefs.find((f) => f.name === fieldName)\n if (!fieldDef) return\n\n let condition: Record<string, any> | null = null\n\n switch (fieldDef.type) {\n case 'date': {\n const dateValue = value as DateFilterValue\n let from: Date | undefined\n let to: Date | undefined\n\n if (dateValue.predefinedValue) {\n const range = getDateRangeForOption(dateValue.predefinedValue, locale)\n from = range.from\n to = range.to\n } else if (dateValue.customRange) {\n if (dateValue.customRange.from) from = new Date(dateValue.customRange.from)\n if (dateValue.customRange.to) to = new Date(dateValue.customRange.to)\n }\n\n if (from || to) {\n const dateQuery: any = {}\n if (from) dateQuery.greater_than_equal = from\n if (to) dateQuery.less_than_equal = to\n if (Object.keys(dateQuery).length > 0) {\n condition = { [fieldName]: dateQuery }\n }\n }\n break\n }\n case 'select': {\n const selectValue = value as SelectFilterValue\n if (selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n if (selectValue.selectedValues.length === 1) {\n condition = { [fieldName]: { equals: selectValue.selectedValues[0] } }\n } else {\n condition = { [fieldName]: { in: selectValue.selectedValues } }\n }\n }\n break\n }\n case 'checkbox': {\n const checkboxState = value as CheckboxFilterState\n if (checkboxState === 'checked') {\n condition = { [fieldName]: { equals: 'true' } }\n } else if (checkboxState === 'unchecked') {\n condition = { [fieldName]: { equals: 'false' } }\n }\n break\n }\n }\n if (condition) {\n conditions.push(condition)\n }\n })\n return conditions\n}"],"names":["clsx","twMerge","futureOptionKeys","pastOptionKeys","getDateRangeForOption","cn","inputs","handleNavigation","href","e","pathname","router","window","holdingsNavigationHandler","canNavigate","preventDefault","push","parseWhereClauseToFilterValues","where","fields","locale","values","fieldNames","Set","map","f","name","recursiveParse","clause","and","forEach","or","length","fieldName","has","fieldDef","find","condition","type","predefinedValue","includes","equals","selectedValues","Array","isArray","in","fromDate","greater_than_equal","Date","toDate","less_than_equal","allDateOptions","matchedOption","option","range","isFromMatch","from","toDateString","to","undefined","isToMatch","customRange","buildQuickFilterConditions","fieldDefs","conditions","Object","entries","value","dateValue","dateQuery","keys","selectValue","checkboxState"],"mappings":"AAAA,SAA0BA,IAAI,QAAQ,OAAM;AAC5C,SAASC,OAAO,QAAQ,iBAAgB;AASxC,SACEC,gBAAgB,EAChBC,cAAc,QACT,2CAA0C;AACjD,SAASC,qBAAqB,QAAQ,gCAA+B;AAErE,OAAO,SAASC,GAAG,GAAGC,MAAoB;IACxC,OAAOL,QAAQD,KAAKM;AACtB;AAEA,OAAO,SAASC,iBACdC,IAAY,EACZC,CAAmB,EACnBC,QAAgB,EAChBC,MAAyB;IAEzB,mEAAmE;IACnE,IACED,aAAa,eACb,OAAOE,WAAW,eAClB,AAACA,OAA8CC,yBAAyB,EACxE;QACA,MAAMC,cAAc,AAClB,AAACF,OAA8CC,yBAAyB,CAGxEL;QACF,IAAI,CAACM,aAAa;YAChBL,EAAEM,cAAc;YAChB;QACF;IACF;IACAJ,OAAOK,IAAI,CAACR;AACd;AAEA,uEAAuE;AACvE,OAAO,MAAMS,iCAAiC,CAC5CC,OACAC,QACAC;IAEA,MAAMC,SAA8B,CAAC;IACrC,MAAMC,aAAa,IAAIC,IAAIJ,OAAOK,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI;IAEnD,MAAMC,iBAAiB,CAACC;QACtB,IAAI,CAACA,UAAU,OAAOA,WAAW,UAAU;QAE3C,IAAIA,OAAOC,GAAG,EAAE;YACdD,OAAOC,GAAG,CAACC,OAAO,CAACH;YACnB;QACF;QACA,IAAIC,OAAOG,EAAE,EAAE;YACb,IAAIH,OAAOG,EAAE,CAACC,MAAM,GAAG,GAAG;gBACxB;YACF;YACAJ,OAAOG,EAAE,CAACD,OAAO,CAACH;YAClB;QACF;QACA,IAAK,MAAMM,aAAaL,OAAQ;YAC9B,IAAIN,WAAWY,GAAG,CAACD,YAAY;gBAC7B,MAAME,WAAWhB,OAAOiB,IAAI,CAAC,CAACX,IAAMA,EAAEC,IAAI,KAAKO;gBAC/C,MAAMI,YAAYT,MAAM,CAACK,UAAU;gBAEnC,gEAAgE;gBAChE,IAAIE,YAAYA,SAASG,IAAI,KAAK,UAAU,OAAOD,cAAc,UAAU;oBACzE,MAAME,kBAAkBF;oBACxB,IAAI;2BAAIlC;2BAAmBD;qBAAiB,CAACsC,QAAQ,CAACD,kBAAyB;wBAC7ElB,MAAM,CAACY,UAAU,GAAG;4BAClBK,MAAM;4BACNC;wBACF;wBACA;oBACF;gBACF;gBAEA,IAAIJ,YAAYE,aAAa,OAAOA,cAAc,UAAU;oBAC1D,IAAI,YAAYA,WAAW;wBACzB,IAAIF,SAASG,IAAI,KAAK,YAAY;4BAChCjB,MAAM,CAACY,UAAU,GAAGI,UAAUI,MAAM,IAAI,SAAS,YAAY;wBAC/D,OAAO,IAAIN,SAASG,IAAI,KAAK,UAAU;4BACrCjB,MAAM,CAACY,UAAU,GAAG;gCAAES,gBAAgB;oCAACL,UAAUI,MAAM;iCAAC;4BAAC;wBAC3D;oBACF,OAAO,IAAI,QAAQJ,aAAaM,MAAMC,OAAO,CAACP,UAAUQ,EAAE,GAAG;wBAC3D,IAAIV,SAASG,IAAI,KAAK,UAAU;4BAC9BjB,MAAM,CAACY,UAAU,GAAG;gCAAES,gBAAgBL,UAAUQ,EAAE;4BAAC;wBACrD;oBACF,OAAO,IAAI,wBAAwBR,aAAa,qBAAqBA,WAAW;wBAC9E,IAAIF,SAASG,IAAI,KAAK,QAAQ;4BAC5B,MAAMQ,WAAWT,UAAUU,kBAAkB,GACzC,IAAIC,KAAKX,UAAUU,kBAAkB,IACrC;4BACJ,MAAME,SAASZ,UAAUa,eAAe,GAAG,IAAIF,KAAKX,UAAUa,eAAe,IAAI;4BACjF,MAAMC,iBAAiB;mCAAIhD;mCAAmBD;6BAAiB;4BAC/D,IAAIkD,gBAAgB;4BAEpB,KAAK,MAAMC,UAAUF,eAAgB;gCACnC,MAAMG,QAAQlD,sBAAsBiD,QAAQjC;gCAC5C,IAAImC;gCACJ,IAAIT,UAAU;oCACZS,cAAcD,MAAME,IAAI,EAAEC,mBAAmBX,SAASW,YAAY;gCACpE,OAAO,IAAIX,YAAY,QAAQQ,MAAMI,EAAE,IAAIC,WAAW;oCACpD,uDAAuD;oCACvDJ,cAAc;gCAChB;gCACA,IAAIK;gCACJ,IAAIX,QAAQ;oCACVW,YAAYN,MAAMI,EAAE,EAAED,mBAAmBR,OAAOQ,YAAY;gCAC9D,OAAO,IAAIR,UAAU,QAAQK,MAAMI,EAAE,IAAIC,WAAW;oCAClD,uDAAuD;oCACvDC,YAAY;gCACd;gCAEA,IAAIL,eAAeK,WAAW;oCAC5BR,gBAAgBC;oCAChB;gCACF;4BACF;4BAEA,IAAID,eAAe;gCACjB/B,MAAM,CAACY,UAAU,GAAG;oCAClBK,MAAM;oCACNC,iBAAiBa;gCACnB;4BACF,OAAO;gCACL/B,MAAM,CAACY,UAAU,GAAG;oCAClBK,MAAM;oCACNuB,aAAa;wCACXL,MAAMV;wCACNY,IAAIT;oCACN;gCACF;4BACF;wBACF;oBACF;gBACF;YACF;QACF;IACF;IAEAtB,eAAeT;IACf,OAAOG;AACT,EAAC;AACD,oEAAoE;AACpE,OAAO,MAAMyC,6BAA6B,CACxCzC,QACA0C,WACA3C;IAEA,MAAM4C,aAAoC,EAAE;IAE5CC,OAAOC,OAAO,CAAC7C,QAAQS,OAAO,CAAC,CAAC,CAACG,WAAWkC,MAAM;QAChD,IAAI,CAACA,OAAO;QACZ,MAAMhC,WAAW4B,UAAU3B,IAAI,CAAC,CAACX,IAAMA,EAAEC,IAAI,KAAKO;QAClD,IAAI,CAACE,UAAU;QAEf,IAAIE,YAAwC;QAE5C,OAAQF,SAASG,IAAI;YACnB,KAAK;gBAAQ;oBACX,MAAM8B,YAAYD;oBAClB,IAAIX;oBACJ,IAAIE;oBAEJ,IAAIU,UAAU7B,eAAe,EAAE;wBAC7B,MAAMe,QAAQlD,sBAAsBgE,UAAU7B,eAAe,EAAEnB;wBAC/DoC,OAAOF,MAAME,IAAI;wBACjBE,KAAKJ,MAAMI,EAAE;oBACf,OAAO,IAAIU,UAAUP,WAAW,EAAE;wBAChC,IAAIO,UAAUP,WAAW,CAACL,IAAI,EAAEA,OAAO,IAAIR,KAAKoB,UAAUP,WAAW,CAACL,IAAI;wBAC1E,IAAIY,UAAUP,WAAW,CAACH,EAAE,EAAEA,KAAK,IAAIV,KAAKoB,UAAUP,WAAW,CAACH,EAAE;oBACtE;oBAEA,IAAIF,QAAQE,IAAI;wBACd,MAAMW,YAAiB,CAAC;wBACxB,IAAIb,MAAMa,UAAUtB,kBAAkB,GAAGS;wBACzC,IAAIE,IAAIW,UAAUnB,eAAe,GAAGQ;wBACpC,IAAIO,OAAOK,IAAI,CAACD,WAAWrC,MAAM,GAAG,GAAG;4BACrCK,YAAY;gCAAE,CAACJ,UAAU,EAAEoC;4BAAU;wBACvC;oBACF;oBACA;gBACF;YACA,KAAK;gBAAU;oBACb,MAAME,cAAcJ;oBACpB,IAAII,YAAY7B,cAAc,IAAI6B,YAAY7B,cAAc,CAACV,MAAM,GAAG,GAAG;wBACvE,IAAIuC,YAAY7B,cAAc,CAACV,MAAM,KAAK,GAAG;4BAC3CK,YAAY;gCAAE,CAACJ,UAAU,EAAE;oCAAEQ,QAAQ8B,YAAY7B,cAAc,CAAC,EAAE;gCAAC;4BAAE;wBACvE,OAAO;4BACLL,YAAY;gCAAE,CAACJ,UAAU,EAAE;oCAAEY,IAAI0B,YAAY7B,cAAc;gCAAC;4BAAE;wBAChE;oBACF;oBACA;gBACF;YACA,KAAK;gBAAY;oBACf,MAAM8B,gBAAgBL;oBACtB,IAAIK,kBAAkB,WAAW;wBAC/BnC,YAAY;4BAAE,CAACJ,UAAU,EAAE;gCAAEQ,QAAQ;4BAAO;wBAAE;oBAChD,OAAO,IAAI+B,kBAAkB,aAAa;wBACxCnC,YAAY;4BAAE,CAACJ,UAAU,EAAE;gCAAEQ,QAAQ;4BAAQ;wBAAE;oBACjD;oBACA;gBACF;QACF;QACA,IAAIJ,WAAW;YACb2B,WAAWhD,IAAI,CAACqB;QAClB;IACF;IACA,OAAO2B;AACT,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\nimport { AppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime'\nimport type {\n CheckboxFilterState,\n DateFilterValue,\n FilterDetaild,\n SelectFilterValue,\n} from '../filters/types/filters-type'\nimport { SupportedLocale } from '../labels'\nimport {\n futureOptionKeys,\n pastOptionKeys,\n} from '../filters/constants/date-filter-options'\nimport { getDateRangeForOption } from '../filters/utils/date-helpers'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function handleNavigation(\n href: string,\n e: React.MouseEvent,\n pathname: string,\n router: AppRouterInstance,\n) {\n // Check if we're on holdings page and there's a navigation handler\n if (\n pathname === '/holdings' &&\n typeof window !== 'undefined' &&\n (window as unknown as Record<string, unknown>).holdingsNavigationHandler\n ) {\n const canNavigate = (\n (window as unknown as Record<string, unknown>).holdingsNavigationHandler as (\n href: string,\n ) => boolean\n )(href)\n if (!canNavigate) {\n e.preventDefault()\n return\n }\n }\n router.push(href)\n}\n\n// Translates URL query conditions to the quick filter's internal state\nexport const parseWhereClauseToFilterValues = (\n where: any,\n fields: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any> => {\n const values: Record<string, any> = {}\n const fieldNames = new Set(fields.map((f) => f.name))\n\n const recursiveParse = (clause: any) => {\n if (!clause || typeof clause !== 'object') return\n\n if (clause.and) {\n clause.and.forEach(recursiveParse)\n return\n }\n if (clause.or) {\n if (clause.or.length > 1) {\n return\n }\n clause.or.forEach(recursiveParse)\n return\n }\n for (const fieldName in clause) {\n if (fieldNames.has(fieldName)) {\n const fieldDef = fields.find((f) => f.name === fieldName)\n const condition = clause[fieldName]\n\n // Handle string values for date fields (e.g., 'todayAndFuture')\n if (fieldDef && fieldDef.type === 'date' && typeof condition === 'string') {\n const predefinedValue = condition\n if ([...pastOptionKeys, ...futureOptionKeys].includes(predefinedValue as any)) {\n values[fieldName] = {\n type: 'predefined',\n predefinedValue,\n }\n continue\n }\n }\n\n if (fieldDef && condition && typeof condition === 'object') {\n if ('equals' in condition) {\n if (fieldDef.type === 'checkbox') {\n values[fieldName] = (condition.equals == 'true' || condition.equals === true) ? 'checked' : 'unchecked'\n } else if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: [condition.equals] }\n }\n } else if ('in' in condition && Array.isArray(condition.in)) {\n if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: condition.in }\n }\n } else if ('greater_than_equal' in condition || 'less_than_equal' in condition) {\n if (fieldDef.type === 'date') {\n const fromDate = condition.greater_than_equal\n ? new Date(condition.greater_than_equal)\n : null\n const toDate = condition.less_than_equal ? new Date(condition.less_than_equal) : null\n const allDateOptions = [...pastOptionKeys, ...futureOptionKeys]\n let matchedOption = null\n\n for (const option of allDateOptions) {\n const range = getDateRangeForOption(option, locale)\n let isFromMatch\n if (fromDate) {\n isFromMatch = range.from?.toDateString() === fromDate.toDateString()\n } else if (fromDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isFromMatch = true\n }\n let isToMatch\n if (toDate) {\n isToMatch = range.to?.toDateString() === toDate.toDateString()\n } else if (toDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isToMatch = true\n }\n\n if (isFromMatch && isToMatch) {\n matchedOption = option\n break\n }\n }\n\n if (matchedOption) {\n values[fieldName] = {\n type: 'predefined',\n predefinedValue: matchedOption,\n }\n } else {\n values[fieldName] = {\n type: 'custom',\n customRange: {\n from: fromDate,\n to: toDate,\n },\n }\n }\n }\n }\n }\n }\n }\n }\n\n recursiveParse(where)\n return values\n}\n// Builds an array of condition objects from the quick filter values\nexport const buildQuickFilterConditions = (\n values: Record<string, any>,\n fieldDefs: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any>[] => {\n const conditions: Record<string, any>[] = []\n\n Object.entries(values).forEach(([fieldName, value]) => {\n if (!value) return\n const fieldDef = fieldDefs.find((f) => f.name === fieldName)\n if (!fieldDef) return\n\n let condition: Record<string, any> | null = null\n\n switch (fieldDef.type) {\n case 'date': {\n const dateValue = value as DateFilterValue\n let from: Date | undefined\n let to: Date | undefined\n\n if (dateValue.predefinedValue) {\n const range = getDateRangeForOption(dateValue.predefinedValue, locale)\n from = range.from\n to = range.to\n } else if (dateValue.customRange) {\n if (dateValue.customRange.from) from = new Date(dateValue.customRange.from)\n if (dateValue.customRange.to) to = new Date(dateValue.customRange.to)\n }\n\n if (from || to) {\n const dateQuery: any = {}\n if (from) dateQuery.greater_than_equal = from\n if (to) dateQuery.less_than_equal = to\n if (Object.keys(dateQuery).length > 0) {\n condition = { [fieldName]: dateQuery }\n }\n }\n break\n }\n case 'select': {\n const selectValue = value as SelectFilterValue\n if (selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n if (selectValue.selectedValues.length === 1) {\n condition = { [fieldName]: { equals: selectValue.selectedValues[0] } }\n } else {\n condition = { [fieldName]: { in: selectValue.selectedValues } }\n }\n }\n break\n }\n case 'checkbox': {\n const checkboxState = value as CheckboxFilterState\n if (checkboxState === 'checked') {\n condition = { [fieldName]: { equals: 'true' } }\n } else if (checkboxState === 'unchecked') {\n condition = { [fieldName]: { equals: 'false' } }\n }\n break\n }\n }\n if (condition) {\n conditions.push(condition)\n }\n })\n return conditions\n}"],"names":["clsx","twMerge","futureOptionKeys","pastOptionKeys","getDateRangeForOption","cn","inputs","handleNavigation","href","e","pathname","router","window","holdingsNavigationHandler","canNavigate","preventDefault","push","parseWhereClauseToFilterValues","where","fields","locale","values","fieldNames","Set","map","f","name","recursiveParse","clause","and","forEach","or","length","fieldName","has","fieldDef","find","condition","type","predefinedValue","includes","equals","selectedValues","Array","isArray","in","fromDate","greater_than_equal","Date","toDate","less_than_equal","allDateOptions","matchedOption","option","range","isFromMatch","from","toDateString","to","undefined","isToMatch","customRange","buildQuickFilterConditions","fieldDefs","conditions","Object","entries","value","dateValue","dateQuery","keys","selectValue","checkboxState"],"mappings":"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"}
|
package/dist/nav/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nav/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,cAAc,EAGd,WAAW,EAEZ,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,MAAM,OAAO,CAAA;AAmEzB,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,CAAC,EAAE,cAAc,CAAA;CACrB,GAAG,WAAW,CAAA;AAEf,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nav/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,cAAc,EAGd,WAAW,EAEZ,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,MAAM,OAAO,CAAA;AAmEzB,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,CAAC,EAAE,cAAc,CAAA;CACrB,GAAG,WAAW,CAAA;AAEf,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAyL/C,CAAA;AACD,eAAe,gBAAgB,CAAC"}
|
package/dist/nav/index.js
CHANGED
|
@@ -80,16 +80,14 @@ export const NavDefaultFilter = async (props)=>{
|
|
|
80
80
|
path: `/collections/${entity.slug}`
|
|
81
81
|
});
|
|
82
82
|
// Get the fields from the collection for parsing the where clause
|
|
83
|
-
const fields = collection.custom.
|
|
84
|
-
const fieldName = field.name;
|
|
83
|
+
const fields = Object.keys(collection.custom.defaultFilter)?.flat().map((fieldName)=>{
|
|
85
84
|
const fieldConfig = findFieldByName(collection.fields, fieldName);
|
|
86
85
|
return {
|
|
87
86
|
name: fieldName,
|
|
88
87
|
type: fieldConfig?.type,
|
|
89
88
|
options: fieldConfig?.options,
|
|
90
89
|
label: fieldConfig?.label || fieldName,
|
|
91
|
-
row: 0
|
|
92
|
-
width: typeof field === 'object' && 'width' in field ? field.width : undefined
|
|
90
|
+
row: 0
|
|
93
91
|
};
|
|
94
92
|
}).filter(Boolean) || [];
|
|
95
93
|
// If we have fields and a defaultFilter, calculate the URL with where clause
|
package/dist/nav/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/nav/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type {\n Field,\n NavPreferences,\n PayloadRequest,\n SanitizedPermissions,\n SelectField,\n ServerProps,\n UIField,\n} from 'payload'\n\nimport { Logout } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport React from 'react'\nimport { formatAdminURL } from 'payload/shared'\nimport { parseWhereClauseToFilterValues, buildQuickFilterConditions } from '../lib/utils'\nimport type { FilterDetaild } from '../filters/types/filters-type'\nimport type { SupportedLocale } from '../labels'\nimport { stringify } from 'qs-esm'\n\nimport { NavHamburger } from './NavHamburger'\nimport { NavWrapper } from './NavWrapper'\n// Import SCSS only in browser environment\n// This prevents Node.js from trying to import SCSS directly\n// which causes ERR_UNKNOWN_FILE_EXTENSION error\nif (typeof window !== 'undefined') {\n // @ts-ignore\n import('./index.scss').catch(err => {\n console.warn('Failed to load SCSS file:', err);\n });\n}\n\nconst baseClass = 'nav'\n\nimport { getNavPrefs } from './getNavPrefs'\nimport { DefaultNavClient } from './index.client'\nimport { FieldAffectingData } from 'payload'\n\n// Recursive function to find a field by name\nfunction findFieldByName(fields: Field[], fieldName: string): Field {\n // First check at the current level\n const directMatch = fields.find(\n (f) => (f as FieldAffectingData).name === fieldName,\n )\n if (directMatch) return directMatch\n\n // If not found, search recursively in nested structures\n for (const item of fields) {\n // Check in array, row, or collapsible fields\n if (\n (item.type === 'array' || item.type === 'row' || item.type === 'collapsible') &&\n 'fields' in item &&\n Array.isArray(item.fields)\n ) {\n const nestedMatch = findFieldByName(item.fields, fieldName)\n if (nestedMatch) return nestedMatch\n } \n // Check in tabs\n else if (item.type === 'tabs' && Array.isArray(item.tabs)) {\n for (const tab of item.tabs) {\n if ('fields' in tab && Array.isArray(tab.fields)) {\n const tabMatch = findFieldByName(tab.fields, fieldName)\n if (tabMatch) return tabMatch\n }\n }\n } \n // Check in blocks\n else if (item.type === 'blocks' && Array.isArray(item.blocks)) {\n for (const block of item.blocks) {\n if ('fields' in block && Array.isArray(block.fields)) {\n const blockMatch = findFieldByName(block.fields, fieldName)\n if (blockMatch) return blockMatch\n }\n }\n }\n }\n\n return null\n}\n\nexport type NavProps = {\n req?: PayloadRequest\n} & ServerProps\n\nexport const NavDefaultFilter: React.FC<NavProps> = async (props) => {\n const {\n documentSubViewType,\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n user,\n viewType,\n visibleEntities,\n } = props\n\n if (!payload?.config) {\n return null\n }\n\n const {\n admin: {\n components: { afterNavLinks, beforeNavLinks, logout },\n },\n collections,\n globals,\n } = payload.config\n\n const groups = groupNavItems(\n [\n ...collections\n .filter(({ slug }) => visibleEntities?.collections.includes(slug))\n .map(\n (collection) =>\n ({\n type: EntityType.collection,\n entity: collection,\n }) satisfies EntityToGroup,\n ),\n ...globals\n .filter(({ slug }) => visibleEntities?.globals.includes(slug))\n .map(\n (global) =>\n ({\n type: EntityType.global,\n entity: global,\n }) satisfies EntityToGroup,\n ),\n ],\n permissions as SanitizedPermissions,\n i18n,\n )\n\n const navPreferences = await getNavPrefs(req as PayloadRequest)\n\n // Process collections to calculate URLs with defaultFilter\n const processedGroups = groups.map(group => {\n const processedEntities = group.entities.map(entity => {\n if (entity.type === EntityType.collection) {\n const collection = collections.find(c => c.slug === entity.slug);\n debugger\n // Check if collection has defaultFilter in custom props\n if (collection?.custom?.defaultFilter) {\n // Base URL without query parameters\n const baseHref = formatAdminURL({ \n adminRoute: payload.config.routes.admin, \n path: `/collections/${entity.slug}` \n });\n\n // Get the fields from the collection for parsing the where clause\n const fields: FilterDetaild[] =\n collection.custom.filterList\n ?.flat()\n .map((field: { name: string; width: string | undefined }) => {\n const fieldName = field.name\n const fieldConfig = findFieldByName(collection.fields, fieldName)\n return {\n name: fieldName,\n type: fieldConfig?.type,\n options: (fieldConfig as SelectField )?.options,\n label: (fieldConfig as UIField)?.label || fieldName,\n row: 0,\n width: typeof field === 'object' && 'width' in field ? field.width : undefined,\n } as FilterDetaild\n })\n .filter(Boolean) || []\n\n // If we have fields and a defaultFilter, calculate the URL with where clause\n if (fields.length > 0) {\n // Parse the defaultFilter to get filter values\n const filterValues = parseWhereClauseToFilterValues(\n collection.custom.defaultFilter,\n fields,\n i18n.language as SupportedLocale\n );\n // If we have filter values, add them to the URL\n if (Object.keys(filterValues).length > 0) {\n const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, i18n.language as SupportedLocale)\n\n\n const whereCondition = quickFilterConditions.length === 1 ? quickFilterConditions[0] : { and: quickFilterConditions };\n const query = {\n where: whereCondition,\n };\n const stringifiedQuery = stringify(query, { addQueryPrefix: true });\n return {\n ...entity,\n href: `${baseHref}${stringifiedQuery}`\n };\n }\n }\n }\n }\n return entity;\n });\n\n return {\n ...group,\n entities: processedEntities\n };\n });\n\n const LogoutComponent = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: logout?.Button,\n Fallback: Logout,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n return (\n <NavWrapper baseClass={baseClass}>\n <nav className={`${baseClass}__wrap`}>\n {RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: beforeNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })}\n <DefaultNavClient groups={processedGroups} navPreferences={navPreferences as NavPreferences} />\n {RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: afterNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })}\n <div className={`${baseClass}__controls`}>{LogoutComponent}</div>\n </nav>\n <div className={`${baseClass}__header`}>\n <div className={`${baseClass}__header-content`}>\n <NavHamburger baseClass={baseClass} />\n </div>\n </div>\n </NavWrapper>\n )\n}\nexport default NavDefaultFilter;\n"],"names":["Logout","RenderServerComponent","EntityType","groupNavItems","React","formatAdminURL","parseWhereClauseToFilterValues","buildQuickFilterConditions","stringify","NavHamburger","NavWrapper","window","catch","err","console","warn","baseClass","getNavPrefs","DefaultNavClient","findFieldByName","fields","fieldName","directMatch","find","f","name","item","type","Array","isArray","nestedMatch","tabs","tab","tabMatch","blocks","block","blockMatch","NavDefaultFilter","props","documentSubViewType","i18n","locale","params","payload","permissions","req","searchParams","user","viewType","visibleEntities","config","admin","components","afterNavLinks","beforeNavLinks","logout","collections","globals","groups","filter","slug","includes","map","collection","entity","global","navPreferences","processedGroups","group","processedEntities","entities","c","custom","defaultFilter","baseHref","adminRoute","routes","path","filterList","flat","field","fieldConfig","options","label","row","width","undefined","Boolean","length","filterValues","language","Object","keys","quickFilterConditions","whereCondition","and","query","where","stringifiedQuery","addQueryPrefix","href","LogoutComponent","clientProps","Component","Button","Fallback","importMap","serverProps","nav","className","div"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/nav/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type {\n Field,\n NavPreferences,\n PayloadRequest,\n SanitizedPermissions,\n SelectField,\n ServerProps,\n UIField,\n} from 'payload'\n\nimport { Logout } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport React from 'react'\nimport { formatAdminURL } from 'payload/shared'\nimport { parseWhereClauseToFilterValues, buildQuickFilterConditions } from '../lib/utils'\nimport type { FilterDetaild } from '../filters/types/filters-type'\nimport type { SupportedLocale } from '../labels'\nimport { stringify } from 'qs-esm'\n\nimport { NavHamburger } from './NavHamburger'\nimport { NavWrapper } from './NavWrapper'\n// Import SCSS only in browser environment\n// This prevents Node.js from trying to import SCSS directly\n// which causes ERR_UNKNOWN_FILE_EXTENSION error\nif (typeof window !== 'undefined') {\n // @ts-ignore\n import('./index.scss').catch(err => {\n console.warn('Failed to load SCSS file:', err);\n });\n}\n\nconst baseClass = 'nav'\n\nimport { getNavPrefs } from './getNavPrefs'\nimport { DefaultNavClient } from './index.client'\nimport { FieldAffectingData } from 'payload'\n\n// Recursive function to find a field by name\nfunction findFieldByName(fields: Field[], fieldName: string): Field {\n // First check at the current level\n const directMatch = fields.find(\n (f) => (f as FieldAffectingData).name === fieldName,\n )\n if (directMatch) return directMatch\n\n // If not found, search recursively in nested structures\n for (const item of fields) {\n // Check in array, row, or collapsible fields\n if (\n (item.type === 'array' || item.type === 'row' || item.type === 'collapsible') &&\n 'fields' in item &&\n Array.isArray(item.fields)\n ) {\n const nestedMatch = findFieldByName(item.fields, fieldName)\n if (nestedMatch) return nestedMatch\n } \n // Check in tabs\n else if (item.type === 'tabs' && Array.isArray(item.tabs)) {\n for (const tab of item.tabs) {\n if ('fields' in tab && Array.isArray(tab.fields)) {\n const tabMatch = findFieldByName(tab.fields, fieldName)\n if (tabMatch) return tabMatch\n }\n }\n } \n // Check in blocks\n else if (item.type === 'blocks' && Array.isArray(item.blocks)) {\n for (const block of item.blocks) {\n if ('fields' in block && Array.isArray(block.fields)) {\n const blockMatch = findFieldByName(block.fields, fieldName)\n if (blockMatch) return blockMatch\n }\n }\n }\n }\n\n return null\n}\n\nexport type NavProps = {\n req?: PayloadRequest\n} & ServerProps\n\nexport const NavDefaultFilter: React.FC<NavProps> = async (props) => {\n const {\n documentSubViewType,\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n user,\n viewType,\n visibleEntities,\n } = props\n\n if (!payload?.config) {\n return null\n }\n\n const {\n admin: {\n components: { afterNavLinks, beforeNavLinks, logout },\n },\n collections,\n globals,\n } = payload.config\n\n const groups = groupNavItems(\n [\n ...collections\n .filter(({ slug }) => visibleEntities?.collections.includes(slug))\n .map(\n (collection) =>\n ({\n type: EntityType.collection,\n entity: collection,\n }) satisfies EntityToGroup,\n ),\n ...globals\n .filter(({ slug }) => visibleEntities?.globals.includes(slug))\n .map(\n (global) =>\n ({\n type: EntityType.global,\n entity: global,\n }) satisfies EntityToGroup,\n ),\n ],\n permissions as SanitizedPermissions,\n i18n,\n )\n\n const navPreferences = await getNavPrefs(req as PayloadRequest)\n\n // Process collections to calculate URLs with defaultFilter\n const processedGroups = groups.map(group => {\n const processedEntities = group.entities.map(entity => {\n if (entity.type === EntityType.collection) {\n const collection = collections.find(c => c.slug === entity.slug);\n debugger\n // Check if collection has defaultFilter in custom props\n if (collection?.custom?.defaultFilter) {\n // Base URL without query parameters\n const baseHref = formatAdminURL({ \n adminRoute: payload.config.routes.admin, \n path: `/collections/${entity.slug}` \n });\n\n // Get the fields from the collection for parsing the where clause\n const fields: FilterDetaild[] =\n Object.keys(collection.custom.defaultFilter)\n ?.flat()\n .map((fieldName: string) => {\n const fieldConfig = findFieldByName(collection.fields, fieldName)\n return {\n name: fieldName,\n type: fieldConfig?.type,\n options: (fieldConfig as SelectField )?.options,\n label: (fieldConfig as UIField)?.label || fieldName,\n row: 0,\n } as FilterDetaild\n })\n .filter(Boolean) || []\n\n // If we have fields and a defaultFilter, calculate the URL with where clause\n if (fields.length > 0) {\n // Parse the defaultFilter to get filter values\n const filterValues = parseWhereClauseToFilterValues(\n collection.custom.defaultFilter,\n fields,\n i18n.language as SupportedLocale\n );\n // If we have filter values, add them to the URL\n if (Object.keys(filterValues).length > 0) {\n const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, i18n.language as SupportedLocale)\n\n\n const whereCondition = quickFilterConditions.length === 1 ? quickFilterConditions[0] : { and: quickFilterConditions };\n const query = {\n where: whereCondition,\n };\n const stringifiedQuery = stringify(query, { addQueryPrefix: true });\n return {\n ...entity,\n href: `${baseHref}${stringifiedQuery}`\n };\n }\n }\n }\n }\n return entity;\n });\n\n return {\n ...group,\n entities: processedEntities\n };\n });\n\n const LogoutComponent = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: logout?.Button,\n Fallback: Logout,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n return (\n <NavWrapper baseClass={baseClass}>\n <nav className={`${baseClass}__wrap`}>\n {RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: beforeNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })}\n <DefaultNavClient groups={processedGroups} navPreferences={navPreferences as NavPreferences} />\n {RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: afterNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })}\n <div className={`${baseClass}__controls`}>{LogoutComponent}</div>\n </nav>\n <div className={`${baseClass}__header`}>\n <div className={`${baseClass}__header-content`}>\n <NavHamburger baseClass={baseClass} />\n </div>\n </div>\n </NavWrapper>\n )\n}\nexport default NavDefaultFilter;\n"],"names":["Logout","RenderServerComponent","EntityType","groupNavItems","React","formatAdminURL","parseWhereClauseToFilterValues","buildQuickFilterConditions","stringify","NavHamburger","NavWrapper","window","catch","err","console","warn","baseClass","getNavPrefs","DefaultNavClient","findFieldByName","fields","fieldName","directMatch","find","f","name","item","type","Array","isArray","nestedMatch","tabs","tab","tabMatch","blocks","block","blockMatch","NavDefaultFilter","props","documentSubViewType","i18n","locale","params","payload","permissions","req","searchParams","user","viewType","visibleEntities","config","admin","components","afterNavLinks","beforeNavLinks","logout","collections","globals","groups","filter","slug","includes","map","collection","entity","global","navPreferences","processedGroups","group","processedEntities","entities","c","custom","defaultFilter","baseHref","adminRoute","routes","path","Object","keys","flat","fieldConfig","options","label","row","Boolean","length","filterValues","language","quickFilterConditions","whereCondition","and","query","where","stringifiedQuery","addQueryPrefix","href","LogoutComponent","clientProps","Component","Button","Fallback","importMap","serverProps","nav","className","div"],"mappings":"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"}
|