@shefing/quickfilter 1.0.13 → 1.0.17
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/LICENSE +201 -0
- package/README.md +53 -421
- package/dist/QuickFilter.d.ts.map +1 -1
- package/dist/QuickFilter.js +8 -1
- package/dist/QuickFilter.js.map +1 -1
- package/dist/filters/constants/date-filter-options.d.ts +2 -2
- package/dist/filters/constants/date-filter-options.d.ts.map +1 -1
- package/dist/filters/constants/date-filter-options.js +6 -2
- package/dist/filters/constants/date-filter-options.js.map +1 -1
- package/dist/filters/utils/date-helpers.d.ts.map +1 -1
- package/dist/filters/utils/date-helpers.js +30 -2
- package/dist/filters/utils/date-helpers.js.map +1 -1
- package/dist/labels.d.ts +72 -24
- package/dist/labels.d.ts.map +1 -1
- package/dist/labels.js +36 -12
- package/dist/labels.js.map +1 -1
- package/package.json +42 -35
package/dist/QuickFilter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/QuickFilter.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useConfig, useListQuery, useTranslation } from '@payloadcms/ui';\nimport type { ClientField, FieldAffectingData, OptionObject, SelectField } from 'payload';\nimport { getTranslation } from '@payloadcms/translations';\nimport FilterField from './FilterField';\nimport { getLabel, SupportedLocale } from './labels';\nimport type {\n CheckboxFilterState,\n DateFilterValue,\n FilterDetaild,\n FilterRow,\n SelectFilterValue,\n} from './filters/types/filters-type';\nimport { groupFiltersByRow, parseColumns } from './filters/utils/layout-helpers';\nimport { ChevronDown, ChevronUp, Filter, X } from 'lucide-react';\n\nimport { getDateRangeForOption } from './filters/utils/date-helpers';\nimport { isEqual } from 'lodash';\nimport {\n futureOptionKeys,\n getDateFilterOptions,\n pastOptionKeys,\n} from './filters/constants/date-filter-options';\nimport { Button } from './ui/button';\n\n// Recursive function to find fields by name\nfunction findFieldsByName(fields: ClientField[], fieldNames: string[]): ClientField[] {\n const results: ClientField[] = [];\n function recursiveSearch(currentFields: ClientField[]) {\n const filteredFields = currentFields.filter(\n (field) => 'name' in field && fieldNames.includes(field.name as string),\n );\n results.push(...filteredFields);\n currentFields.forEach((item) => {\n if (\n (item.type === 'array' || item.type === 'row' || item.type === 'collapsible') &&\n 'fields' in item &&\n Array.isArray(item.fields)\n ) {\n recursiveSearch(item.fields);\n } else if (item.type === 'tabs' && Array.isArray(item.tabs)) {\n item.tabs.forEach((tab) => {\n if ('fields' in tab && Array.isArray(tab.fields)) {\n recursiveSearch(tab.fields);\n }\n });\n } else if (item.type === 'blocks' && Array.isArray(item.blocks)) {\n item.blocks.forEach((block) => {\n if ('fields' in block && Array.isArray(block.fields)) {\n recursiveSearch(block.fields);\n }\n });\n }\n });\n }\n recursiveSearch(fields);\n return results;\n}\n\n// Builds an array of condition objects from the quick filter values\nconst 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};\n\n// Helper function to remove quick filter conditions from a 'where' clause\nconst cleanWhereClause = (clause: any, fieldsToClean: Set<string>): any => {\n if (!clause || typeof clause !== 'object' || Array.isArray(clause)) {\n return clause;\n }\n\n const newClause: Record<string, any> = {};\n\n for (const key in clause) {\n if (key === 'and' || key === 'or') {\n const cleanedSubClauses = clause[key]\n .map((subClause: any) => cleanWhereClause(subClause, fieldsToClean))\n .filter(Boolean);\n\n if (cleanedSubClauses.length > 0) {\n newClause[key] = cleanedSubClauses;\n }\n } else if (!fieldsToClean.has(key)) {\n newClause[key] = clause[key];\n }\n }\n\n if (Object.keys(newClause).length === 0) {\n return null;\n }\n\n if (newClause.and?.length === 1 && Object.keys(newClause).length === 1) {\n return newClause.and[0];\n }\n if (newClause.or?.length === 1 && Object.keys(newClause).length === 1) {\n return newClause.or[0];\n }\n\n return newClause;\n};\n\n// Translates URL query conditions to the quick filter's internal state\nconst 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 clause.or.forEach(recursiveParse);\n return;\n }\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 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\nconst QuickFilter = ({\n slug,\n filterList,\n}: {\n slug: string;\n filterList: (string | { name: string; width: string })[][];\n}) => {\n const localStorageKey = useMemo(() => `direct-filter-${slug}`, [slug]);\n\n const [fields, setFields] = useState<FilterDetaild[]>([]);\n const [filterRows, setFilterRows] = useState<FilterRow[]>([]);\n const [showFilters, setShowFilters] = useState(false);\n const { refineListData, query } = useListQuery();\n const { getEntityConfig } = useConfig();\n const { i18n } = useTranslation();\n const locale = i18n.language as SupportedLocale;\n const isSyncingFromQuery = useRef(false);\n\n const [filterValues, setFilterValues] = useState<Record<string, any>>(() => {\n if (typeof window == 'undefined') return {};\n try {\n const item = window.localStorage.getItem(localStorageKey);\n if (!item) return {};\n const dateTimeReviver = (key: string, value: any) => {\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$/;\n if (typeof value === 'string' && isoDateRegex.test(value)) {\n return new Date(value);\n }\n return value;\n };\n return JSON.parse(item, dateTimeReviver);\n } catch (error) {\n console.error('Error reading and parsing filters from localStorage.', error);\n return {};\n }\n });\n\n // Build the list of filter fields from config\n useEffect(() => {\n const collection = getEntityConfig({ collectionSlug: slug });\n const flattenedFieldConfigs = filterList.flatMap((row, rowIndex) =>\n row.map((field, fieldIndex) => ({\n field,\n rowIndex,\n fieldIndex,\n })),\n );\n const fieldNames = flattenedFieldConfigs.map(({ field }) =>\n typeof field === 'string' ? field : field.name,\n );\n const matchedFields = findFieldsByName(collection?.fields || [], fieldNames);\n const simplifiedFields: FilterDetaild[] = matchedFields.map((field) => {\n const label = (field as FieldAffectingData).label;\n const translatedLabel = getTranslation(label as string, i18n);\n const fieldName = (field as FieldAffectingData).name as string;\n const fieldConfig = flattenedFieldConfigs.find(({ field: f }) =>\n typeof f === 'string' ? f === fieldName : f.name === fieldName,\n );\n return {\n name: fieldName,\n label: translatedLabel as string,\n type: field.type,\n options: (field as SelectField).options as OptionObject[],\n row: fieldConfig ? fieldConfig.rowIndex : 0,\n width:\n typeof fieldConfig?.field === 'object' && 'width' in fieldConfig.field\n ? fieldConfig.field.width\n : undefined,\n };\n });\n const sortedFields = flattenedFieldConfigs\n .map(({ field }) => {\n const fieldName = typeof field === 'string' ? field : field.name;\n return simplifiedFields.find((f) => f.name === fieldName);\n })\n .filter((f): f is FilterDetaild => !!f);\n setFields(sortedFields);\n setFilterRows(groupFiltersByRow(sortedFields));\n }, [slug, filterList, getEntityConfig, i18n]);\n // Sync from URL (query.where) into internal state\n useEffect(() => {\n if (fields.length === 0) return;\n\n const valuesFromQuery: Record<string, any> = parseWhereClauseToFilterValues(\n query.where,\n fields,\n locale,\n );\n\n if (!isEqual(valuesFromQuery, filterValues)) {\n // Lock to prevent feedback loop when internal state changes\n isSyncingFromQuery.current = true;\n setFilterValues(valuesFromQuery);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query.where, fields]);\n\n // Sync internal state (filterValues) back into the URL\n useEffect(() => {\n // If the change originated from the first effect, skip to avoid infinite loop\n if (isSyncingFromQuery.current) {\n isSyncingFromQuery.current = false;\n return;\n }\n\n if (fields.length === 0) return;\n\n const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, locale);\n const quickFilterFieldNames = new Set(fields.map((f) => f.name));\n const otherFilters = cleanWhereClause(query.where, quickFilterFieldNames);\n\n const allConditions = [...quickFilterConditions];\n if (otherFilters) {\n if (otherFilters.and && Array.isArray(otherFilters.and)) {\n allConditions.push(...otherFilters.and);\n } else if (Object.keys(otherFilters).length > 0) {\n allConditions.push(otherFilters);\n }\n }\n\n let newWhere: Record<string, any> = {};\n if (allConditions.length > 1) {\n newWhere = { and: allConditions };\n } else if (allConditions.length === 1) {\n newWhere = allConditions[0];\n }\n\n // Only update if the query has actually changed to avoid unnecessary updates\n if (!isEqual(newWhere, query.where)) {\n refineListData({\n columns: parseColumns(query.columns),\n where: newWhere,\n page: '1',\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterValues, fields, i18n.language, refineListData]);\n // Effect for persisting to localStorage\n useEffect(() => {\n try {\n if (Object.keys(filterValues).length > 0) {\n localStorage.setItem(localStorageKey, JSON.stringify(filterValues));\n } else {\n localStorage.removeItem(localStorageKey);\n }\n } catch (error) {\n console.error('Failed to save filters to localStorage', error);\n }\n }, [filterValues, localStorageKey]);\n\n // Updates only the internal state\n const handleFilterChange = useCallback((fieldName: string, value: any) => {\n setFilterValues((prev) => {\n const newValues = { ...prev };\n if (\n value === undefined ||\n value === null ||\n value === 'indeterminate' ||\n (value && value.type === 'none')\n ) {\n delete newValues[fieldName];\n } else {\n newValues[fieldName] = value;\n }\n return newValues;\n });\n }, []);\n\n // This function remains largely the same.\n const getActiveFiltersDetails = () => {\n const activeFilters: string[] = [];\n const locale = i18n.language as SupportedLocale;\n Object.entries(filterValues).forEach(([fieldName, value]) => {\n const field = fields.find((f) => f.name === fieldName);\n if (!field) return;\n\n switch (field.type) {\n case 'date':\n if (value !== undefined) {\n const dateValue = value as DateFilterValue;\n let dateDescription = '';\n\n if (dateValue.type === 'predefined' && dateValue.predefinedValue) {\n const { pastOptions, futureOptions } = getDateFilterOptions(locale);\n const allOptions = [...pastOptions, ...futureOptions];\n const option = allOptions.find((opt) => opt.value === dateValue.predefinedValue);\n dateDescription = option ? option.label : getLabel('custom', locale);\n } else if (dateValue.type === 'custom' || dateValue.customRange) {\n dateDescription = getLabel('custom', locale);\n }\n\n if (dateDescription) {\n activeFilters.push(`${field.label} (${dateDescription})`);\n }\n }\n break;\n case 'select': {\n const selectValue = value as SelectFilterValue;\n if (selectValue && selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n const totalOptions = field.options?.length || 0;\n\n if (selectValue.selectedValues.length === totalOptions) {\n activeFilters.push(`${field.label} (${getLabel('all', locale)})`);\n } else if (selectValue.selectedValues.length === 1) {\n // Show the actual option name when only one is selected\n const selectedOption = field.options?.find(\n (opt: any) => opt.value === selectValue.selectedValues[0],\n );\n const optionLabel = selectedOption\n ? selectedOption.label\n : selectValue.selectedValues[0];\n activeFilters.push(`${field.label} (${optionLabel})`);\n } else {\n // Show count for multiple selections\n activeFilters.push(`${field.label} (${selectValue.selectedValues.length})`);\n }\n }\n break;\n }\n case 'checkbox':\n if (value !== 'indeterminate') {\n const checkboxValue =\n value === 'checked' ? getLabel('yes', locale) : getLabel('no', locale);\n activeFilters.push(`${field.label} (${checkboxValue})`);\n }\n break;\n }\n });\n\n return activeFilters;\n };\n\n const clearAllFilters = () => {\n setFilterValues({});\n };\n\n const memoizedFilterRows = useMemo(() => {\n return filterRows.map((row) => (\n <div key={row.rowNumber}>\n <div className='flex flex-wrap gap-6 mb-4'>\n {row.filters.map((field) => (\n <FilterField\n key={field.name}\n field={field}\n onFilterChange={handleFilterChange}\n value={filterValues[field.name]}\n />\n ))}\n </div>\n </div>\n ));\n }, [filterRows, handleFilterChange, filterValues]);\n\n const toggleFilters = () => {\n setShowFilters((prev) => !prev);\n };\n\n const activeFiltersDetails = getActiveFiltersDetails();\n const hasActiveFilters = activeFiltersDetails.length > 0;\n\n if (!fields.length) return null;\n\n return (\n <div className='filter-container useTw'>\n <div style={{ position: 'relative', top: '-24px', height: '0px' }}>\n <Button\n variant='outline'\n size='sm'\n onClick={toggleFilters}\n className={`flex items-center gap-2 bg-background border-muted-muted hover:bg-muted ${\n hasActiveFilters ? 'w-auto min-w-fit' : ''\n }`}\n >\n <Filter className={`h-4 w-4 ${hasActiveFilters ? 'fill-current' : ''}`} />\n\n {hasActiveFilters ? (\n <>\n <span className='text-sm truncate'>\n <strong>\n {`${activeFiltersDetails.length === 1 ? getLabel('activeFilterSingular', locale) : getLabel('activeFilterPlural', locale)}: `}\n </strong>{' '}\n {activeFiltersDetails.join(' • ')}\n </span>\n\n <span\n onClick={(e) => {\n e.stopPropagation();\n clearAllFilters();\n }}\n className='ml-1 p-0.5 hover:bg-muted rounded-sm transition-colors flex-shrink-0'\n >\n <X className='h-3 w-3 text-gray-500' />\n </span>\n </>\n ) : (\n <span className='text-sm truncate'>{getLabel('quickFilters', locale)}</span>\n )}\n\n {showFilters ? <ChevronUp className='h-4 w-4' /> : <ChevronDown className='h-4 w-4' />}\n </Button>\n </div>\n {showFilters && <div className={'p-4 pb-2 bg-muted'}>{memoizedFilterRows}</div>}\n </div>\n );\n};\n\nexport default QuickFilter;\n"],"names":["useCallback","useEffect","useMemo","useRef","useState","useConfig","useListQuery","useTranslation","getTranslation","FilterField","getLabel","groupFiltersByRow","parseColumns","ChevronDown","ChevronUp","Filter","X","getDateRangeForOption","isEqual","futureOptionKeys","getDateFilterOptions","pastOptionKeys","Button","findFieldsByName","fields","fieldNames","results","recursiveSearch","currentFields","filteredFields","filter","field","includes","name","push","forEach","item","type","Array","isArray","tabs","tab","blocks","block","buildQuickFilterConditions","values","fieldDefs","locale","conditions","Object","entries","fieldName","value","fieldDef","find","f","condition","dateValue","from","to","predefinedValue","range","customRange","Date","dateQuery","greater_than_equal","less_than_equal","keys","length","selectValue","selectedValues","equals","in","checkboxState","cleanWhereClause","clause","fieldsToClean","newClause","key","cleanedSubClauses","map","subClause","Boolean","has","and","or","parseWhereClauseToFilterValues","where","Set","recursiveParse","fromDate","toDate","allDateOptions","matchedOption","option","isFromMatch","toDateString","undefined","isToMatch","QuickFilter","slug","filterList","localStorageKey","setFields","filterRows","setFilterRows","showFilters","setShowFilters","refineListData","query","getEntityConfig","i18n","language","isSyncingFromQuery","filterValues","setFilterValues","window","localStorage","getItem","dateTimeReviver","isoDateRegex","test","JSON","parse","error","console","collection","collectionSlug","flattenedFieldConfigs","flatMap","row","rowIndex","fieldIndex","matchedFields","simplifiedFields","label","translatedLabel","fieldConfig","options","width","sortedFields","valuesFromQuery","current","quickFilterConditions","quickFilterFieldNames","otherFilters","allConditions","newWhere","columns","page","setItem","stringify","removeItem","handleFilterChange","prev","newValues","getActiveFiltersDetails","activeFilters","dateDescription","pastOptions","futureOptions","allOptions","opt","totalOptions","selectedOption","optionLabel","checkboxValue","clearAllFilters","memoizedFilterRows","div","className","filters","onFilterChange","rowNumber","toggleFilters","activeFiltersDetails","hasActiveFilters","style","position","top","height","variant","size","onClick","span","strong","join","e","stopPropagation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/QuickFilter.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useConfig, useListQuery, useTranslation } from '@payloadcms/ui';\nimport type { ClientField, FieldAffectingData, OptionObject, SelectField } from 'payload';\nimport { getTranslation } from '@payloadcms/translations';\nimport FilterField from './FilterField';\nimport { getLabel, SupportedLocale } from './labels';\nimport type {\n CheckboxFilterState,\n DateFilterValue,\n FilterDetaild,\n FilterRow,\n SelectFilterValue,\n} from './filters/types/filters-type';\nimport { groupFiltersByRow, parseColumns } from './filters/utils/layout-helpers';\nimport { ChevronDown, ChevronUp, Filter, X } from 'lucide-react';\n\nimport { getDateRangeForOption } from './filters/utils/date-helpers';\nimport { isEqual } from 'lodash';\nimport {\n futureOptionKeys,\n getDateFilterOptions,\n pastOptionKeys,\n} from './filters/constants/date-filter-options';\nimport { Button } from './ui/button';\n\n// Helper function to get localized label\nconst getLocalizedLabel = (label: any, locale: SupportedLocale): string => {\n if (typeof label === 'object' && label !== null) {\n return label[locale] || label['en'] || Object.values(label)[0] || ''\n }\n return label || ''\n}\n\n// Recursive function to find fields by name\nfunction findFieldsByName(fields: ClientField[], fieldNames: string[]): ClientField[] {\n const results: ClientField[] = [];\n function recursiveSearch(currentFields: ClientField[]) {\n const filteredFields = currentFields.filter(\n (field) => 'name' in field && fieldNames.includes(field.name as string),\n );\n results.push(...filteredFields);\n currentFields.forEach((item) => {\n if (\n (item.type === 'array' || item.type === 'row' || item.type === 'collapsible') &&\n 'fields' in item &&\n Array.isArray(item.fields)\n ) {\n recursiveSearch(item.fields);\n } else if (item.type === 'tabs' && Array.isArray(item.tabs)) {\n item.tabs.forEach((tab) => {\n if ('fields' in tab && Array.isArray(tab.fields)) {\n recursiveSearch(tab.fields);\n }\n });\n } else if (item.type === 'blocks' && Array.isArray(item.blocks)) {\n item.blocks.forEach((block) => {\n if ('fields' in block && Array.isArray(block.fields)) {\n recursiveSearch(block.fields);\n }\n });\n }\n });\n }\n recursiveSearch(fields);\n return results;\n}\n\n// Builds an array of condition objects from the quick filter values\nconst 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};\n\n// Helper function to remove quick filter conditions from a 'where' clause\nconst cleanWhereClause = (clause: any, fieldsToClean: Set<string>): any => {\n if (!clause || typeof clause !== 'object' || Array.isArray(clause)) {\n return clause;\n }\n\n const newClause: Record<string, any> = {};\n\n for (const key in clause) {\n if (key === 'and' || key === 'or') {\n const cleanedSubClauses = clause[key]\n .map((subClause: any) => cleanWhereClause(subClause, fieldsToClean))\n .filter(Boolean);\n\n if (cleanedSubClauses.length > 0) {\n newClause[key] = cleanedSubClauses;\n }\n } else if (!fieldsToClean.has(key)) {\n newClause[key] = clause[key];\n }\n }\n\n if (Object.keys(newClause).length === 0) {\n return null;\n }\n\n if (newClause.and?.length === 1 && Object.keys(newClause).length === 1) {\n return newClause.and[0];\n }\n if (newClause.or?.length === 1 && Object.keys(newClause).length === 1) {\n return newClause.or[0];\n }\n\n return newClause;\n};\n\n// Translates URL query conditions to the quick filter's internal state\nconst 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 clause.or.forEach(recursiveParse);\n return;\n }\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 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\nconst QuickFilter = ({\n slug,\n filterList,\n}: {\n slug: string;\n filterList: (string | { name: string; width: string })[][];\n}) => {\n const localStorageKey = useMemo(() => `direct-filter-${slug}`, [slug]);\n\n const [fields, setFields] = useState<FilterDetaild[]>([]);\n const [filterRows, setFilterRows] = useState<FilterRow[]>([]);\n const [showFilters, setShowFilters] = useState(false);\n const { refineListData, query } = useListQuery();\n const { getEntityConfig } = useConfig();\n const { i18n } = useTranslation();\n const locale = i18n.language as SupportedLocale;\n const isSyncingFromQuery = useRef(false);\n\n const [filterValues, setFilterValues] = useState<Record<string, any>>(() => {\n if (typeof window == 'undefined') return {};\n try {\n const item = window.localStorage.getItem(localStorageKey);\n if (!item) return {};\n const dateTimeReviver = (key: string, value: any) => {\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$/;\n if (typeof value === 'string' && isoDateRegex.test(value)) {\n return new Date(value);\n }\n return value;\n };\n return JSON.parse(item, dateTimeReviver);\n } catch (error) {\n console.error('Error reading and parsing filters from localStorage.', error);\n return {};\n }\n });\n\n // Build the list of filter fields from config\n useEffect(() => {\n const collection = getEntityConfig({ collectionSlug: slug });\n const flattenedFieldConfigs = filterList.flatMap((row, rowIndex) =>\n row.map((field, fieldIndex) => ({\n field,\n rowIndex,\n fieldIndex,\n })),\n );\n const fieldNames = flattenedFieldConfigs.map(({ field }) =>\n typeof field === 'string' ? field : field.name,\n );\n const matchedFields = findFieldsByName(collection?.fields || [], fieldNames);\n const simplifiedFields: FilterDetaild[] = matchedFields.map((field) => {\n const label = (field as FieldAffectingData).label;\n const translatedLabel = getTranslation(label as string, i18n);\n const fieldName = (field as FieldAffectingData).name as string;\n const fieldConfig = flattenedFieldConfigs.find(({ field: f }) =>\n typeof f === 'string' ? f === fieldName : f.name === fieldName,\n );\n return {\n name: fieldName,\n label: translatedLabel as string,\n type: field.type,\n options: (field as SelectField).options as OptionObject[],\n row: fieldConfig ? fieldConfig.rowIndex : 0,\n width:\n typeof fieldConfig?.field === 'object' && 'width' in fieldConfig.field\n ? fieldConfig.field.width\n : undefined,\n };\n });\n const sortedFields = flattenedFieldConfigs\n .map(({ field }) => {\n const fieldName = typeof field === 'string' ? field : field.name;\n return simplifiedFields.find((f) => f.name === fieldName);\n })\n .filter((f): f is FilterDetaild => !!f);\n setFields(sortedFields);\n setFilterRows(groupFiltersByRow(sortedFields));\n }, [slug, filterList, getEntityConfig, i18n]);\n // Sync from URL (query.where) into internal state\n useEffect(() => {\n if (fields.length === 0) return;\n\n const valuesFromQuery: Record<string, any> = parseWhereClauseToFilterValues(\n query.where,\n fields,\n locale,\n );\n\n if (!isEqual(valuesFromQuery, filterValues)) {\n // Lock to prevent feedback loop when internal state changes\n isSyncingFromQuery.current = true;\n setFilterValues(valuesFromQuery);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query.where, fields]);\n\n // Sync internal state (filterValues) back into the URL\n useEffect(() => {\n // If the change originated from the first effect, skip to avoid infinite loop\n if (isSyncingFromQuery.current) {\n isSyncingFromQuery.current = false;\n return;\n }\n\n if (fields.length === 0) return;\n\n const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, locale);\n const quickFilterFieldNames = new Set(fields.map((f) => f.name));\n const otherFilters = cleanWhereClause(query.where, quickFilterFieldNames);\n\n const allConditions = [...quickFilterConditions];\n if (otherFilters) {\n if (otherFilters.and && Array.isArray(otherFilters.and)) {\n allConditions.push(...otherFilters.and);\n } else if (Object.keys(otherFilters).length > 0) {\n allConditions.push(otherFilters);\n }\n }\n\n let newWhere: Record<string, any> = {};\n if (allConditions.length > 1) {\n newWhere = { and: allConditions };\n } else if (allConditions.length === 1) {\n newWhere = allConditions[0];\n }\n\n // Only update if the query has actually changed to avoid unnecessary updates\n if (!isEqual(newWhere, query.where)) {\n refineListData({\n columns: parseColumns(query.columns),\n where: newWhere,\n page: '1',\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterValues, fields, i18n.language, refineListData]);\n // Effect for persisting to localStorage\n useEffect(() => {\n try {\n if (Object.keys(filterValues).length > 0) {\n localStorage.setItem(localStorageKey, JSON.stringify(filterValues));\n } else {\n localStorage.removeItem(localStorageKey);\n }\n } catch (error) {\n console.error('Failed to save filters to localStorage', error);\n }\n }, [filterValues, localStorageKey]);\n\n // Updates only the internal state\n const handleFilterChange = useCallback((fieldName: string, value: any) => {\n setFilterValues((prev) => {\n const newValues = { ...prev };\n if (\n value === undefined ||\n value === null ||\n value === 'indeterminate' ||\n (value && value.type === 'none')\n ) {\n delete newValues[fieldName];\n } else {\n newValues[fieldName] = value;\n }\n return newValues;\n });\n }, []);\n\n // This function remains largely the same.\n const getActiveFiltersDetails = () => {\n const activeFilters: string[] = [];\n const locale = i18n.language as SupportedLocale;\n Object.entries(filterValues).forEach(([fieldName, value]) => {\n const field = fields.find((f) => f.name === fieldName);\n if (!field) return;\n\n switch (field.type) {\n case 'date':\n if (value !== undefined) {\n const dateValue = value as DateFilterValue;\n let dateDescription = '';\n\n if (dateValue.type === 'predefined' && dateValue.predefinedValue) {\n const { pastOptions, futureOptions } = getDateFilterOptions(locale);\n const allOptions = [...pastOptions, ...futureOptions];\n const option = allOptions.find((opt) => opt.value === dateValue.predefinedValue);\n dateDescription = option ? option.label : getLabel('custom', locale);\n } else if (dateValue.type === 'custom' || dateValue.customRange) {\n dateDescription = getLabel('custom', locale);\n }\n\n if (dateDescription) {\n activeFilters.push(`${field.label} (${dateDescription})`);\n }\n }\n break;\n case 'select': {\n const selectValue = value as SelectFilterValue;\n if (selectValue && selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n const totalOptions = field.options?.length || 0;\n\n if (selectValue.selectedValues.length === totalOptions) {\n activeFilters.push(`${field.label} (${getLabel('all', locale)})`);\n } else if (selectValue.selectedValues.length === 1) {\n // Show the actual option name when only one is selected\n const selectedOption = field.options?.find(\n (opt: any) => opt.value === selectValue.selectedValues[0],\n );\n const optionLabel = selectedOption\n ? getLocalizedLabel(selectedOption.label, locale)\n : selectValue.selectedValues[0];\n activeFilters.push(`${field.label} (${optionLabel})`);\n } else {\n // Show count for multiple selections\n activeFilters.push(`${field.label} (${selectValue.selectedValues.length})`);\n }\n }\n break;\n }\n case 'checkbox':\n if (value !== 'indeterminate') {\n const checkboxValue =\n value === 'checked' ? getLabel('yes', locale) : getLabel('no', locale);\n activeFilters.push(`${field.label} (${checkboxValue})`);\n }\n break;\n }\n });\n\n return activeFilters;\n };\n\n const clearAllFilters = () => {\n setFilterValues({});\n };\n\n const memoizedFilterRows = useMemo(() => {\n return filterRows.map((row) => (\n <div key={row.rowNumber}>\n <div className='flex flex-wrap gap-6 mb-4'>\n {row.filters.map((field) => (\n <FilterField\n key={field.name}\n field={field}\n onFilterChange={handleFilterChange}\n value={filterValues[field.name]}\n />\n ))}\n </div>\n </div>\n ));\n }, [filterRows, handleFilterChange, filterValues]);\n\n const toggleFilters = () => {\n setShowFilters((prev) => !prev);\n };\n\n const activeFiltersDetails = getActiveFiltersDetails();\n const hasActiveFilters = activeFiltersDetails.length > 0;\n\n if (!fields.length) return null;\n\n return (\n <div className='filter-container useTw'>\n <div style={{ position: 'relative', top: '-24px', height: '0px' }}>\n <Button\n variant='outline'\n size='sm'\n onClick={toggleFilters}\n className={`flex items-center gap-2 bg-background border-muted-muted hover:bg-muted ${\n hasActiveFilters ? 'w-auto min-w-fit' : ''\n }`}\n >\n <Filter className={`h-4 w-4 ${hasActiveFilters ? 'fill-current' : ''}`} />\n\n {hasActiveFilters ? (\n <>\n <span className='text-sm truncate'>\n <strong>\n {`${activeFiltersDetails.length === 1 ? getLabel('activeFilterSingular', locale) : getLabel('activeFilterPlural', locale)}: `}\n </strong>{' '}\n {activeFiltersDetails.join(' • ')}\n </span>\n\n <span\n onClick={(e) => {\n e.stopPropagation();\n clearAllFilters();\n }}\n className='ml-1 p-0.5 hover:bg-muted rounded-sm transition-colors flex-shrink-0'\n >\n <X className='h-3 w-3 text-gray-500' />\n </span>\n </>\n ) : (\n <span className='text-sm truncate'>{getLabel('quickFilters', locale)}</span>\n )}\n\n {showFilters ? <ChevronUp className='h-4 w-4' /> : <ChevronDown className='h-4 w-4' />}\n </Button>\n </div>\n {showFilters && <div className={'p-4 pb-2 bg-muted'}>{memoizedFilterRows}</div>}\n </div>\n );\n};\n\nexport default QuickFilter;\n"],"names":["useCallback","useEffect","useMemo","useRef","useState","useConfig","useListQuery","useTranslation","getTranslation","FilterField","getLabel","groupFiltersByRow","parseColumns","ChevronDown","ChevronUp","Filter","X","getDateRangeForOption","isEqual","futureOptionKeys","getDateFilterOptions","pastOptionKeys","Button","getLocalizedLabel","label","locale","Object","values","findFieldsByName","fields","fieldNames","results","recursiveSearch","currentFields","filteredFields","filter","field","includes","name","push","forEach","item","type","Array","isArray","tabs","tab","blocks","block","buildQuickFilterConditions","fieldDefs","conditions","entries","fieldName","value","fieldDef","find","f","condition","dateValue","from","to","predefinedValue","range","customRange","Date","dateQuery","greater_than_equal","less_than_equal","keys","length","selectValue","selectedValues","equals","in","checkboxState","cleanWhereClause","clause","fieldsToClean","newClause","key","cleanedSubClauses","map","subClause","Boolean","has","and","or","parseWhereClauseToFilterValues","where","Set","recursiveParse","fromDate","toDate","allDateOptions","matchedOption","option","isFromMatch","toDateString","undefined","isToMatch","QuickFilter","slug","filterList","localStorageKey","setFields","filterRows","setFilterRows","showFilters","setShowFilters","refineListData","query","getEntityConfig","i18n","language","isSyncingFromQuery","filterValues","setFilterValues","window","localStorage","getItem","dateTimeReviver","isoDateRegex","test","JSON","parse","error","console","collection","collectionSlug","flattenedFieldConfigs","flatMap","row","rowIndex","fieldIndex","matchedFields","simplifiedFields","translatedLabel","fieldConfig","options","width","sortedFields","valuesFromQuery","current","quickFilterConditions","quickFilterFieldNames","otherFilters","allConditions","newWhere","columns","page","setItem","stringify","removeItem","handleFilterChange","prev","newValues","getActiveFiltersDetails","activeFilters","dateDescription","pastOptions","futureOptions","allOptions","opt","totalOptions","selectedOption","optionLabel","checkboxValue","clearAllFilters","memoizedFilterRows","div","className","filters","onFilterChange","rowNumber","toggleFilters","activeFiltersDetails","hasActiveFilters","style","position","top","height","variant","size","onClick","span","strong","join","e","stopPropagation"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SupportedLocale } from '../../labels';
|
|
2
2
|
import { DateFilterOption } from '../types/filters-type';
|
|
3
|
-
export declare const pastOptionKeys: readonly ["yesterday", "lastWeek", "lastMonth", "allPast"];
|
|
4
|
-
export declare const futureOptionKeys: readonly ["today", "
|
|
3
|
+
export declare const pastOptionKeys: readonly ["yesterday", "last7Days", "lastWeek", "last30Days", "lastMonth", "allPast"];
|
|
4
|
+
export declare const futureOptionKeys: readonly ["today", "next7Days", "thisWeek", "next30Days", "thisMonth", "allFuture"];
|
|
5
5
|
export declare const getDateFilterOptions: (locale: SupportedLocale | string) => {
|
|
6
6
|
pastOptions: DateFilterOption[];
|
|
7
7
|
futureOptions: DateFilterOption[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-filter-options.d.ts","sourceRoot":"","sources":["../../../src/filters/constants/date-filter-options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"date-filter-options.d.ts","sourceRoot":"","sources":["../../../src/filters/constants/date-filter-options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,eAAO,MAAM,cAAc,uFAAwF,CAAC;AACpH,eAAO,MAAM,gBAAgB,qFAAsF,CAAC;AAapH,eAAO,MAAM,oBAAoB,WAAY,eAAe,GAAG,MAAM;;;CAKpE,CAAC"}
|
|
@@ -2,14 +2,18 @@ import { getLabel } from '../../labels';
|
|
|
2
2
|
// Define the option keys for past and future date filters
|
|
3
3
|
export const pastOptionKeys = [
|
|
4
4
|
'yesterday',
|
|
5
|
+
'last7Days',
|
|
5
6
|
'lastWeek',
|
|
7
|
+
'last30Days',
|
|
6
8
|
'lastMonth',
|
|
7
9
|
'allPast'
|
|
8
10
|
];
|
|
9
11
|
export const futureOptionKeys = [
|
|
10
12
|
'today',
|
|
11
|
-
'
|
|
12
|
-
'
|
|
13
|
+
'next7Days',
|
|
14
|
+
'thisWeek',
|
|
15
|
+
'next30Days',
|
|
16
|
+
'thisMonth',
|
|
13
17
|
'allFuture'
|
|
14
18
|
];
|
|
15
19
|
// Create date filter options dynamically based on locale
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/filters/constants/date-filter-options.ts"],"sourcesContent":["import { getLabel } from '../../labels';\nimport type { SupportedLocale } from '../../labels';\nimport { DateFilterOption } from '../types/filters-type';\n\n// Define the option keys for past and future date filters\nexport const pastOptionKeys = ['yesterday', 'lastWeek', 'lastMonth', 'allPast'] as const;\nexport const futureOptionKeys = ['today', '
|
|
1
|
+
{"version":3,"sources":["../../../src/filters/constants/date-filter-options.ts"],"sourcesContent":["import { getLabel } from '../../labels';\nimport type { LabelKey, SupportedLocale } from '../../labels';\nimport { DateFilterOption } from '../types/filters-type';\n\n// Define the option keys for past and future date filters\nexport const pastOptionKeys = ['yesterday', 'last7Days', 'lastWeek', 'last30Days', 'lastMonth', 'allPast'] as const;\nexport const futureOptionKeys = ['today', 'next7Days', 'thisWeek', 'next30Days', 'thisMonth', 'allFuture'] as const;\n\n// Create date filter options dynamically based on locale\nconst createDateFilterOptions = (\n keys: readonly string[],\n locale: SupportedLocale | string,\n): DateFilterOption[] => {\n return keys.map((key) => ({\n value: key,\n label: getLabel(key as LabelKey, locale as SupportedLocale),\n }));\n};\n\nexport const getDateFilterOptions = (locale: SupportedLocale | string) => {\n return {\n pastOptions: createDateFilterOptions(pastOptionKeys, locale),\n futureOptions: createDateFilterOptions(futureOptionKeys, locale),\n };\n};\n"],"names":["getLabel","pastOptionKeys","futureOptionKeys","createDateFilterOptions","keys","locale","map","key","value","label","getDateFilterOptions","pastOptions","futureOptions"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,eAAe;AAIxC,0DAA0D;AAC1D,OAAO,MAAMC,iBAAiB;IAAC;IAAa;IAAa;IAAY;IAAc;IAAa;CAAU,CAAU;AACpH,OAAO,MAAMC,mBAAmB;IAAC;IAAS;IAAa;IAAY;IAAc;IAAa;CAAY,CAAU;AAEpH,yDAAyD;AACzD,MAAMC,0BAA0B,CAC9BC,MACAC;IAEA,OAAOD,KAAKE,GAAG,CAAC,CAACC,MAAS,CAAA;YACxBC,OAAOD;YACPE,OAAOT,SAASO,KAAiBF;QACnC,CAAA;AACF;AAEA,OAAO,MAAMK,uBAAuB,CAACL;IACnC,OAAO;QACLM,aAAaR,wBAAwBF,gBAAgBI;QACrDO,eAAeT,wBAAwBD,kBAAkBG;IAC3D;AACF,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-helpers.d.ts","sourceRoot":"","sources":["../../../src/filters/utils/date-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAY,MAAM,cAAc,CAAC;AAEzD,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAItD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAExD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAExD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI1D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAI3C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAIzC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,IAAI,CAOrF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,IAAI,CAKnF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAI7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAI3C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAqBhE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,eAAsB,GAC7B;IAAE,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IAAC,EAAE,EAAE,IAAI,GAAG,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"date-helpers.d.ts","sourceRoot":"","sources":["../../../src/filters/utils/date-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAY,MAAM,cAAc,CAAC;AAEzD,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAItD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAExD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAExD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI1D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAI3C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAIzC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,IAAI,CAOrF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,IAAI,CAKnF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAI7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAI3C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAqBhE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,eAAsB,GAC7B;IAAE,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IAAC,EAAE,EAAE,IAAI,GAAG,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CA8GvE"}
|
|
@@ -109,6 +109,20 @@ export function getDateRangeForOption(option, locale = 'he') {
|
|
|
109
109
|
to: lastMonthEnd,
|
|
110
110
|
description: `(${formatDate(lastMonthStart, 'MM/yyyy')})`
|
|
111
111
|
};
|
|
112
|
+
case 'last7Days':
|
|
113
|
+
const last7DaysStart = startOfDay(subDays(now, 6));
|
|
114
|
+
return {
|
|
115
|
+
from: last7DaysStart,
|
|
116
|
+
to: endOfDay(now),
|
|
117
|
+
description: `(${formatDate(last7DaysStart, 'dd/MM')} - ${formatDate(now, 'dd/MM/yyyy')})`
|
|
118
|
+
};
|
|
119
|
+
case 'last30Days':
|
|
120
|
+
const last30DaysStart = startOfDay(subDays(now, 29));
|
|
121
|
+
return {
|
|
122
|
+
from: last30DaysStart,
|
|
123
|
+
to: endOfDay(now),
|
|
124
|
+
description: `(${formatDate(last30DaysStart, 'dd/MM')} - ${formatDate(now, 'dd/MM/yyyy')})`
|
|
125
|
+
};
|
|
112
126
|
case 'allPast':
|
|
113
127
|
{
|
|
114
128
|
const yesterday = subDays(now, 1);
|
|
@@ -124,7 +138,7 @@ export function getDateRangeForOption(option, locale = 'he') {
|
|
|
124
138
|
to: endOfDay(now),
|
|
125
139
|
description: `(${formatDate(now, 'dd/MM/yyyy')})`
|
|
126
140
|
};
|
|
127
|
-
case '
|
|
141
|
+
case 'thisWeek':
|
|
128
142
|
const thisWeekStart = startOfWeek(now, {
|
|
129
143
|
weekStartsOn: 0
|
|
130
144
|
});
|
|
@@ -136,7 +150,7 @@ export function getDateRangeForOption(option, locale = 'he') {
|
|
|
136
150
|
to: thisWeekEnd,
|
|
137
151
|
description: `(${formatDate(thisWeekStart, 'dd/MM')} - ${formatDate(thisWeekEnd, 'dd/MM/yyyy')})`
|
|
138
152
|
};
|
|
139
|
-
case '
|
|
153
|
+
case 'thisMonth':
|
|
140
154
|
const thisMonthStart = startOfMonth(now);
|
|
141
155
|
const thisMonthEnd = endOfMonth(now);
|
|
142
156
|
return {
|
|
@@ -144,6 +158,20 @@ export function getDateRangeForOption(option, locale = 'he') {
|
|
|
144
158
|
to: thisMonthEnd,
|
|
145
159
|
description: `(${formatDate(thisMonthStart, 'MM/yyyy')})`
|
|
146
160
|
};
|
|
161
|
+
case 'next7Days':
|
|
162
|
+
const next7DaysEnd = endOfDay(addDays(now, 6));
|
|
163
|
+
return {
|
|
164
|
+
from: startOfDay(now),
|
|
165
|
+
to: next7DaysEnd,
|
|
166
|
+
description: `(${formatDate(now, 'dd/MM')} - ${formatDate(next7DaysEnd, 'dd/MM/yyyy')})`
|
|
167
|
+
};
|
|
168
|
+
case 'next30Days':
|
|
169
|
+
const next30DaysEnd = endOfDay(addDays(now, 29));
|
|
170
|
+
return {
|
|
171
|
+
from: startOfDay(now),
|
|
172
|
+
to: next30DaysEnd,
|
|
173
|
+
description: `(${formatDate(now, 'dd/MM')} - ${formatDate(next30DaysEnd, 'dd/MM/yyyy')})`
|
|
174
|
+
};
|
|
147
175
|
case 'allFuture':
|
|
148
176
|
return {
|
|
149
177
|
from: startOfDay(now),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/filters/utils/date-helpers.ts"],"sourcesContent":["// Custom date utilities to replace date-fns\n\nimport { SupportedLocale, getLabel } from '../../labels';\n\nexport function addDays(date: Date, days: number): Date {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return result;\n}\n\nexport function subDays(date: Date, days: number): Date {\n return addDays(date, -days);\n}\n\nexport function addWeeks(date: Date, weeks: number): Date {\n return addDays(date, weeks * 7);\n}\n\nexport function subWeeks(date: Date, weeks: number): Date {\n return addWeeks(date, -weeks);\n}\n\nexport function addMonths(date: Date, months: number): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + months);\n return result;\n}\n\nexport function subMonths(date: Date, months: number): Date {\n return addMonths(date, -months);\n}\n\nexport function startOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\nexport function endOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(23, 59, 59, 999);\n return result;\n}\n\nexport function startOfWeek(date: Date, options: { weekStartsOn?: number } = {}): Date {\n const { weekStartsOn = 0 } = options;\n const result = new Date(date);\n const day = result.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n result.setDate(result.getDate() - diff);\n return startOfDay(result);\n}\n\nexport function endOfWeek(date: Date, options: { weekStartsOn?: number } = {}): Date {\n const { weekStartsOn = 0 } = options;\n const result = startOfWeek(date, { weekStartsOn });\n result.setDate(result.getDate() + 6);\n return endOfDay(result);\n}\n\nexport function startOfMonth(date: Date): Date {\n const result = new Date(date);\n result.setDate(1);\n return startOfDay(result);\n}\n\nexport function endOfMonth(date: Date): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + 1, 0);\n return endOfDay(result);\n}\n\nexport function formatDate(date: Date, formatStr: string): string {\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear().toString();\n\n switch (formatStr) {\n case 'dd/MM/yyyy':\n return `${day}/${month}/${year}`;\n case 'dd/MM':\n return `${day}/${month}`;\n case 'MM/yyyy':\n return `${month}/${year}`;\n case 'PPP':\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n default:\n return date.toLocaleDateString();\n }\n}\n\nexport function getDateRangeForOption(\n option: string,\n locale: SupportedLocale = 'he',\n): { from: Date | undefined; to: Date | undefined; description: string } {\n const now = new Date();\n\n switch (option) {\n case 'yesterday':\n const yesterday = subDays(now, 1);\n return {\n from: startOfDay(yesterday),\n to: endOfDay(yesterday),\n description: `(${formatDate(yesterday, 'dd/MM/yyyy')})`,\n };\n\n case 'lastWeek':\n const lastWeekStart = startOfWeek(subWeeks(now, 1), { weekStartsOn: 0 });\n const lastWeekEnd = endOfWeek(subWeeks(now, 1), { weekStartsOn: 0 });\n return {\n from: lastWeekStart,\n to: lastWeekEnd,\n description: `(${formatDate(lastWeekStart, 'dd/MM')} - ${formatDate(lastWeekEnd, 'dd/MM/yyyy')})`,\n };\n\n case 'lastMonth':\n const lastMonthStart = startOfMonth(subMonths(now, 1));\n const lastMonthEnd = endOfMonth(subMonths(now, 1));\n return {\n from: lastMonthStart,\n to: lastMonthEnd,\n description: `(${formatDate(lastMonthStart, 'MM/yyyy')})`,\n };\n\n case 'allPast': {\n const yesterday = subDays(now, 1);\n return {\n from: undefined,\n to: endOfDay(yesterday),\n description: `(${getLabel('allPast', locale)})`,\n };\n }\n\n case 'today':\n return {\n from: startOfDay(now),\n to: endOfDay(now),\n description: `(${formatDate(now, 'dd/MM/yyyy')})`,\n };\n\n case 'nextWeek':\n const thisWeekStart = startOfWeek(now, { weekStartsOn: 0 });\n const thisWeekEnd = endOfWeek(now, { weekStartsOn: 0 });\n return {\n from: thisWeekStart,\n to: thisWeekEnd,\n description: `(${formatDate(thisWeekStart, 'dd/MM')} - ${formatDate(thisWeekEnd, 'dd/MM/yyyy')})`,\n };\n\n case 'nextMonth':\n const thisMonthStart = startOfMonth(now);\n const thisMonthEnd = endOfMonth(now);\n return {\n from: thisMonthStart,\n to: thisMonthEnd,\n description: `(${formatDate(thisMonthStart, 'MM/yyyy')})`,\n };\n\n case 'allFuture':\n return {\n from: startOfDay(now),\n to: undefined,\n description: `(${getLabel('allFuture', locale)})`,\n };\n\n default:\n return {\n from: startOfDay(now),\n to: endOfDay(now),\n description: '',\n };\n }\n}\n"],"names":["getLabel","addDays","date","days","result","Date","setDate","getDate","subDays","addWeeks","weeks","subWeeks","addMonths","months","setMonth","getMonth","subMonths","startOfDay","setHours","endOfDay","startOfWeek","options","weekStartsOn","day","getDay","diff","endOfWeek","startOfMonth","endOfMonth","formatDate","formatStr","toString","padStart","month","year","getFullYear","toLocaleDateString","getDateRangeForOption","option","locale","now","yesterday","from","to","description","lastWeekStart","lastWeekEnd","lastMonthStart","lastMonthEnd","undefined","thisWeekStart","thisWeekEnd","thisMonthStart","thisMonthEnd"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/filters/utils/date-helpers.ts"],"sourcesContent":["// Custom date utilities to replace date-fns\n\nimport { SupportedLocale, getLabel } from '../../labels';\n\nexport function addDays(date: Date, days: number): Date {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return result;\n}\n\nexport function subDays(date: Date, days: number): Date {\n return addDays(date, -days);\n}\n\nexport function addWeeks(date: Date, weeks: number): Date {\n return addDays(date, weeks * 7);\n}\n\nexport function subWeeks(date: Date, weeks: number): Date {\n return addWeeks(date, -weeks);\n}\n\nexport function addMonths(date: Date, months: number): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + months);\n return result;\n}\n\nexport function subMonths(date: Date, months: number): Date {\n return addMonths(date, -months);\n}\n\nexport function startOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\nexport function endOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(23, 59, 59, 999);\n return result;\n}\n\nexport function startOfWeek(date: Date, options: { weekStartsOn?: number } = {}): Date {\n const { weekStartsOn = 0 } = options;\n const result = new Date(date);\n const day = result.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n result.setDate(result.getDate() - diff);\n return startOfDay(result);\n}\n\nexport function endOfWeek(date: Date, options: { weekStartsOn?: number } = {}): Date {\n const { weekStartsOn = 0 } = options;\n const result = startOfWeek(date, { weekStartsOn });\n result.setDate(result.getDate() + 6);\n return endOfDay(result);\n}\n\nexport function startOfMonth(date: Date): Date {\n const result = new Date(date);\n result.setDate(1);\n return startOfDay(result);\n}\n\nexport function endOfMonth(date: Date): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + 1, 0);\n return endOfDay(result);\n}\n\nexport function formatDate(date: Date, formatStr: string): string {\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear().toString();\n\n switch (formatStr) {\n case 'dd/MM/yyyy':\n return `${day}/${month}/${year}`;\n case 'dd/MM':\n return `${day}/${month}`;\n case 'MM/yyyy':\n return `${month}/${year}`;\n case 'PPP':\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n default:\n return date.toLocaleDateString();\n }\n}\n\nexport function getDateRangeForOption(\n option: string,\n locale: SupportedLocale = 'he',\n): { from: Date | undefined; to: Date | undefined; description: string } {\n const now = new Date();\n\n switch (option) {\n case 'yesterday':\n const yesterday = subDays(now, 1);\n return {\n from: startOfDay(yesterday),\n to: endOfDay(yesterday),\n description: `(${formatDate(yesterday, 'dd/MM/yyyy')})`,\n };\n\n case 'lastWeek':\n const lastWeekStart = startOfWeek(subWeeks(now, 1), { weekStartsOn: 0 });\n const lastWeekEnd = endOfWeek(subWeeks(now, 1), { weekStartsOn: 0 });\n return {\n from: lastWeekStart,\n to: lastWeekEnd,\n description: `(${formatDate(lastWeekStart, 'dd/MM')} - ${formatDate(lastWeekEnd, 'dd/MM/yyyy')})`,\n };\n\n case 'lastMonth':\n const lastMonthStart = startOfMonth(subMonths(now, 1));\n const lastMonthEnd = endOfMonth(subMonths(now, 1));\n return {\n from: lastMonthStart,\n to: lastMonthEnd,\n description: `(${formatDate(lastMonthStart, 'MM/yyyy')})`,\n };\n\n case 'last7Days':\n const last7DaysStart = startOfDay(subDays(now, 6));\n return {\n from: last7DaysStart,\n to: endOfDay(now),\n description: `(${formatDate(last7DaysStart, 'dd/MM')} - ${formatDate(now, 'dd/MM/yyyy')})`,\n };\n\n case 'last30Days':\n const last30DaysStart = startOfDay(subDays(now, 29));\n return {\n from: last30DaysStart,\n to: endOfDay(now),\n description: `(${formatDate(last30DaysStart, 'dd/MM')} - ${formatDate(now, 'dd/MM/yyyy')})`,\n };\n\n case 'allPast': {\n const yesterday = subDays(now, 1);\n return {\n from: undefined,\n to: endOfDay(yesterday),\n description: `(${getLabel('allPast', locale)})`,\n };\n }\n\n case 'today':\n return {\n from: startOfDay(now),\n to: endOfDay(now),\n description: `(${formatDate(now, 'dd/MM/yyyy')})`,\n };\n\n case 'thisWeek':\n const thisWeekStart = startOfWeek(now, { weekStartsOn: 0 });\n const thisWeekEnd = endOfWeek(now, { weekStartsOn: 0 });\n return {\n from: thisWeekStart,\n to: thisWeekEnd,\n description: `(${formatDate(thisWeekStart, 'dd/MM')} - ${formatDate(thisWeekEnd, 'dd/MM/yyyy')})`,\n };\n\n case 'thisMonth':\n const thisMonthStart = startOfMonth(now);\n const thisMonthEnd = endOfMonth(now);\n return {\n from: thisMonthStart,\n to: thisMonthEnd,\n description: `(${formatDate(thisMonthStart, 'MM/yyyy')})`,\n };\n\n case 'next7Days':\n const next7DaysEnd = endOfDay(addDays(now, 6));\n return {\n from: startOfDay(now),\n to: next7DaysEnd,\n description: `(${formatDate(now, 'dd/MM')} - ${formatDate(next7DaysEnd, 'dd/MM/yyyy')})`,\n };\n\n case 'next30Days':\n const next30DaysEnd = endOfDay(addDays(now, 29));\n return {\n from: startOfDay(now),\n to: next30DaysEnd,\n description: `(${formatDate(now, 'dd/MM')} - ${formatDate(next30DaysEnd, 'dd/MM/yyyy')})`,\n };\n\n case 'allFuture':\n return {\n from: startOfDay(now),\n to: undefined,\n description: `(${getLabel('allFuture', locale)})`,\n };\n\n default:\n return {\n from: startOfDay(now),\n to: endOfDay(now),\n description: '',\n };\n }\n}\n"],"names":["getLabel","addDays","date","days","result","Date","setDate","getDate","subDays","addWeeks","weeks","subWeeks","addMonths","months","setMonth","getMonth","subMonths","startOfDay","setHours","endOfDay","startOfWeek","options","weekStartsOn","day","getDay","diff","endOfWeek","startOfMonth","endOfMonth","formatDate","formatStr","toString","padStart","month","year","getFullYear","toLocaleDateString","getDateRangeForOption","option","locale","now","yesterday","from","to","description","lastWeekStart","lastWeekEnd","lastMonthStart","lastMonthEnd","last7DaysStart","last30DaysStart","undefined","thisWeekStart","thisWeekEnd","thisMonthStart","thisMonthEnd","next7DaysEnd","next30DaysEnd"],"mappings":"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"}
|
package/dist/labels.d.ts
CHANGED
|
@@ -21,10 +21,14 @@ export declare const PLUGIN_LABELS: {
|
|
|
21
21
|
readonly yesterday: "Yesterday";
|
|
22
22
|
readonly lastWeek: "Last Week";
|
|
23
23
|
readonly lastMonth: "Last Month";
|
|
24
|
+
readonly last7Days: "Last 7 Days";
|
|
25
|
+
readonly last30Days: "Last 30 Days";
|
|
24
26
|
readonly allPast: "All Past";
|
|
25
27
|
readonly today: "Today";
|
|
26
|
-
readonly
|
|
27
|
-
readonly
|
|
28
|
+
readonly thisWeek: "This Week";
|
|
29
|
+
readonly thisMonth: "This Month";
|
|
30
|
+
readonly next7Days: "Next 7 Days";
|
|
31
|
+
readonly next30Days: "Next 30 Days";
|
|
28
32
|
readonly allFuture: "All Future";
|
|
29
33
|
};
|
|
30
34
|
readonly ar: {
|
|
@@ -48,10 +52,14 @@ export declare const PLUGIN_LABELS: {
|
|
|
48
52
|
readonly yesterday: "أمس";
|
|
49
53
|
readonly lastWeek: "الأسبوع الماضي";
|
|
50
54
|
readonly lastMonth: "الشهر الماضي";
|
|
55
|
+
readonly last7Days: "آخر 7 أيام";
|
|
56
|
+
readonly last30Days: "آخر 30 يومًا";
|
|
51
57
|
readonly allPast: "كل الماضي";
|
|
52
58
|
readonly today: "اليوم";
|
|
53
|
-
readonly
|
|
54
|
-
readonly
|
|
59
|
+
readonly thisWeek: "هذا الأسبوع";
|
|
60
|
+
readonly thisMonth: "هذا الشهر";
|
|
61
|
+
readonly next7Days: "الـ 7 أيام القادمة";
|
|
62
|
+
readonly next30Days: "الـ 30 يومًا القادمة";
|
|
55
63
|
readonly allFuture: "كل المستقبل";
|
|
56
64
|
};
|
|
57
65
|
readonly fr: {
|
|
@@ -75,10 +83,14 @@ export declare const PLUGIN_LABELS: {
|
|
|
75
83
|
readonly yesterday: "Hier";
|
|
76
84
|
readonly lastWeek: "Semaine dernière";
|
|
77
85
|
readonly lastMonth: "Mois dernier";
|
|
86
|
+
readonly last7Days: "7 derniers jours";
|
|
87
|
+
readonly last30Days: "30 derniers jours";
|
|
78
88
|
readonly allPast: "Tout le passé";
|
|
79
89
|
readonly today: "Aujourd’hui";
|
|
80
|
-
readonly
|
|
81
|
-
readonly
|
|
90
|
+
readonly thisWeek: "Cette semaine";
|
|
91
|
+
readonly thisMonth: "Ce mois";
|
|
92
|
+
readonly next7Days: "7 prochains jours";
|
|
93
|
+
readonly next30Days: "30 prochains jours";
|
|
82
94
|
readonly allFuture: "Tout le futur";
|
|
83
95
|
};
|
|
84
96
|
readonly es: {
|
|
@@ -102,10 +114,14 @@ export declare const PLUGIN_LABELS: {
|
|
|
102
114
|
readonly yesterday: "Ayer";
|
|
103
115
|
readonly lastWeek: "Semana pasada";
|
|
104
116
|
readonly lastMonth: "Mes pasado";
|
|
117
|
+
readonly last7Days: "Últimos 7 días";
|
|
118
|
+
readonly last30Days: "Últimos 30 días";
|
|
105
119
|
readonly allPast: "Todo el pasado";
|
|
106
120
|
readonly today: "Hoy";
|
|
107
|
-
readonly
|
|
108
|
-
readonly
|
|
121
|
+
readonly thisWeek: "Esta semana";
|
|
122
|
+
readonly thisMonth: "Este mes";
|
|
123
|
+
readonly next7Days: "Próximos 7 días";
|
|
124
|
+
readonly next30Days: "Próximos 30 días";
|
|
109
125
|
readonly allFuture: "Todo el futuro";
|
|
110
126
|
};
|
|
111
127
|
readonly zh: {
|
|
@@ -129,10 +145,14 @@ export declare const PLUGIN_LABELS: {
|
|
|
129
145
|
readonly yesterday: "昨天";
|
|
130
146
|
readonly lastWeek: "上周";
|
|
131
147
|
readonly lastMonth: "上个月";
|
|
148
|
+
readonly last7Days: "过去7天";
|
|
149
|
+
readonly last30Days: "过去30天";
|
|
132
150
|
readonly allPast: "所有过去";
|
|
133
151
|
readonly today: "今天";
|
|
134
|
-
readonly
|
|
135
|
-
readonly
|
|
152
|
+
readonly thisWeek: "本周";
|
|
153
|
+
readonly thisMonth: "本月";
|
|
154
|
+
readonly next7Days: "未来7天";
|
|
155
|
+
readonly next30Days: "未来30天";
|
|
136
156
|
readonly allFuture: "所有未来";
|
|
137
157
|
};
|
|
138
158
|
readonly he: {
|
|
@@ -156,10 +176,14 @@ export declare const PLUGIN_LABELS: {
|
|
|
156
176
|
readonly yesterday: "אתמול";
|
|
157
177
|
readonly lastWeek: "שבוע שעבר";
|
|
158
178
|
readonly lastMonth: "חודש שעבר";
|
|
179
|
+
readonly last7Days: "7 ימים אחרונים";
|
|
180
|
+
readonly last30Days: "30 ימים אחרונים";
|
|
159
181
|
readonly allPast: "בעבר";
|
|
160
182
|
readonly today: "היום";
|
|
161
|
-
readonly
|
|
162
|
-
readonly
|
|
183
|
+
readonly thisWeek: "השבוע";
|
|
184
|
+
readonly thisMonth: "החודש";
|
|
185
|
+
readonly next7Days: "7 ימים הבאים";
|
|
186
|
+
readonly next30Days: "30 ימים הבאים";
|
|
163
187
|
readonly allFuture: "בעתיד";
|
|
164
188
|
};
|
|
165
189
|
};
|
|
@@ -186,10 +210,14 @@ export declare const getLabels: (locale?: SupportedLocale) => {
|
|
|
186
210
|
readonly yesterday: "Yesterday";
|
|
187
211
|
readonly lastWeek: "Last Week";
|
|
188
212
|
readonly lastMonth: "Last Month";
|
|
213
|
+
readonly last7Days: "Last 7 Days";
|
|
214
|
+
readonly last30Days: "Last 30 Days";
|
|
189
215
|
readonly allPast: "All Past";
|
|
190
216
|
readonly today: "Today";
|
|
191
|
-
readonly
|
|
192
|
-
readonly
|
|
217
|
+
readonly thisWeek: "This Week";
|
|
218
|
+
readonly thisMonth: "This Month";
|
|
219
|
+
readonly next7Days: "Next 7 Days";
|
|
220
|
+
readonly next30Days: "Next 30 Days";
|
|
193
221
|
readonly allFuture: "All Future";
|
|
194
222
|
} | {
|
|
195
223
|
readonly quickFilters: "فلاتر سريعة";
|
|
@@ -212,10 +240,14 @@ export declare const getLabels: (locale?: SupportedLocale) => {
|
|
|
212
240
|
readonly yesterday: "أمس";
|
|
213
241
|
readonly lastWeek: "الأسبوع الماضي";
|
|
214
242
|
readonly lastMonth: "الشهر الماضي";
|
|
243
|
+
readonly last7Days: "آخر 7 أيام";
|
|
244
|
+
readonly last30Days: "آخر 30 يومًا";
|
|
215
245
|
readonly allPast: "كل الماضي";
|
|
216
246
|
readonly today: "اليوم";
|
|
217
|
-
readonly
|
|
218
|
-
readonly
|
|
247
|
+
readonly thisWeek: "هذا الأسبوع";
|
|
248
|
+
readonly thisMonth: "هذا الشهر";
|
|
249
|
+
readonly next7Days: "الـ 7 أيام القادمة";
|
|
250
|
+
readonly next30Days: "الـ 30 يومًا القادمة";
|
|
219
251
|
readonly allFuture: "كل المستقبل";
|
|
220
252
|
} | {
|
|
221
253
|
readonly quickFilters: "Filtres rapides";
|
|
@@ -238,10 +270,14 @@ export declare const getLabels: (locale?: SupportedLocale) => {
|
|
|
238
270
|
readonly yesterday: "Hier";
|
|
239
271
|
readonly lastWeek: "Semaine dernière";
|
|
240
272
|
readonly lastMonth: "Mois dernier";
|
|
273
|
+
readonly last7Days: "7 derniers jours";
|
|
274
|
+
readonly last30Days: "30 derniers jours";
|
|
241
275
|
readonly allPast: "Tout le passé";
|
|
242
276
|
readonly today: "Aujourd’hui";
|
|
243
|
-
readonly
|
|
244
|
-
readonly
|
|
277
|
+
readonly thisWeek: "Cette semaine";
|
|
278
|
+
readonly thisMonth: "Ce mois";
|
|
279
|
+
readonly next7Days: "7 prochains jours";
|
|
280
|
+
readonly next30Days: "30 prochains jours";
|
|
245
281
|
readonly allFuture: "Tout le futur";
|
|
246
282
|
} | {
|
|
247
283
|
readonly quickFilters: "Filtros rápidos";
|
|
@@ -264,10 +300,14 @@ export declare const getLabels: (locale?: SupportedLocale) => {
|
|
|
264
300
|
readonly yesterday: "Ayer";
|
|
265
301
|
readonly lastWeek: "Semana pasada";
|
|
266
302
|
readonly lastMonth: "Mes pasado";
|
|
303
|
+
readonly last7Days: "Últimos 7 días";
|
|
304
|
+
readonly last30Days: "Últimos 30 días";
|
|
267
305
|
readonly allPast: "Todo el pasado";
|
|
268
306
|
readonly today: "Hoy";
|
|
269
|
-
readonly
|
|
270
|
-
readonly
|
|
307
|
+
readonly thisWeek: "Esta semana";
|
|
308
|
+
readonly thisMonth: "Este mes";
|
|
309
|
+
readonly next7Days: "Próximos 7 días";
|
|
310
|
+
readonly next30Days: "Próximos 30 días";
|
|
271
311
|
readonly allFuture: "Todo el futuro";
|
|
272
312
|
} | {
|
|
273
313
|
readonly quickFilters: "快速筛选";
|
|
@@ -290,10 +330,14 @@ export declare const getLabels: (locale?: SupportedLocale) => {
|
|
|
290
330
|
readonly yesterday: "昨天";
|
|
291
331
|
readonly lastWeek: "上周";
|
|
292
332
|
readonly lastMonth: "上个月";
|
|
333
|
+
readonly last7Days: "过去7天";
|
|
334
|
+
readonly last30Days: "过去30天";
|
|
293
335
|
readonly allPast: "所有过去";
|
|
294
336
|
readonly today: "今天";
|
|
295
|
-
readonly
|
|
296
|
-
readonly
|
|
337
|
+
readonly thisWeek: "本周";
|
|
338
|
+
readonly thisMonth: "本月";
|
|
339
|
+
readonly next7Days: "未来7天";
|
|
340
|
+
readonly next30Days: "未来30天";
|
|
297
341
|
readonly allFuture: "所有未来";
|
|
298
342
|
} | {
|
|
299
343
|
readonly quickFilters: "סינון מהיר";
|
|
@@ -316,10 +360,14 @@ export declare const getLabels: (locale?: SupportedLocale) => {
|
|
|
316
360
|
readonly yesterday: "אתמול";
|
|
317
361
|
readonly lastWeek: "שבוע שעבר";
|
|
318
362
|
readonly lastMonth: "חודש שעבר";
|
|
363
|
+
readonly last7Days: "7 ימים אחרונים";
|
|
364
|
+
readonly last30Days: "30 ימים אחרונים";
|
|
319
365
|
readonly allPast: "בעבר";
|
|
320
366
|
readonly today: "היום";
|
|
321
|
-
readonly
|
|
322
|
-
readonly
|
|
367
|
+
readonly thisWeek: "השבוע";
|
|
368
|
+
readonly thisMonth: "החודש";
|
|
369
|
+
readonly next7Days: "7 ימים הבאים";
|
|
370
|
+
readonly next30Days: "30 ימים הבאים";
|
|
323
371
|
readonly allFuture: "בעתיד";
|
|
324
372
|
};
|
|
325
373
|
export declare const getLabel: (key: LabelKey, locale?: SupportedLocale) => string;
|
package/dist/labels.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,UAAuC,CAAC;AAEtE,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,UAAuC,CAAC;AAEtE,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6LhB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,aAAa,CAAC;AACzD,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,aAAa,CAAC,EAAE,CAAC;AAGrD,eAAO,MAAM,SAAS,YAAY,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAEhD,CAAC;AAGF,eAAO,MAAM,QAAQ,QAAS,QAAQ,WAAU,eAAe,KAAU,MAaxE,CAAC"}
|