@omegagrid/grid-core 0.11.32 → 0.11.34
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/calculations/context.d.ts.map +1 -1
- package/dist/calculations/context.js +6 -5
- package/dist/calculations/context.js.map +1 -1
- package/dist/calculations/functions/dates.d.ts.map +1 -1
- package/dist/calculations/functions/dates.js +4 -4
- package/dist/calculations/functions/dates.js.map +1 -1
- package/dist/calculations/functions/lookup.d.ts.map +1 -1
- package/dist/calculations/functions/lookup.js +2 -1
- package/dist/calculations/functions/lookup.js.map +1 -1
- package/dist/calculations/index.d.ts +1 -0
- package/dist/calculations/index.d.ts.map +1 -1
- package/dist/calculations/index.js +1 -0
- package/dist/calculations/index.js.map +1 -1
- package/dist/calculations/values.d.ts +6 -0
- package/dist/calculations/values.d.ts.map +1 -0
- package/dist/calculations/values.js +14 -0
- package/dist/calculations/values.js.map +1 -0
- package/dist/model/cellModel.d.ts +9 -0
- package/dist/model/cellModel.d.ts.map +1 -1
- package/dist/model/cellModel.js +81 -17
- package/dist/model/cellModel.js.map +1 -1
- package/dist/model/dateFilter.d.ts +28 -0
- package/dist/model/dateFilter.d.ts.map +1 -0
- package/dist/model/dateFilter.js +221 -0
- package/dist/model/dateFilter.js.map +1 -0
- package/dist/model/filterModel.d.ts +1 -4
- package/dist/model/filterModel.d.ts.map +1 -1
- package/dist/model/filterModel.js +8 -39
- package/dist/model/filterModel.js.map +1 -1
- package/dist/model/index.d.ts +1 -0
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/index.js +1 -0
- package/dist/model/index.js.map +1 -1
- package/dist/model/options.d.ts +15 -0
- package/dist/model/options.d.ts.map +1 -1
- package/dist/model/options.js +18 -0
- package/dist/model/options.js.map +1 -1
- package/dist/model/rowModel.d.ts.map +1 -1
- package/dist/model/rowModel.js +4 -3
- package/dist/model/rowModel.js.map +1 -1
- package/dist/model/validations.d.ts +3 -0
- package/dist/model/validations.d.ts.map +1 -1
- package/dist/model/validations.js +10 -5
- package/dist/model/validations.js.map +1 -1
- package/dist/types.d.ts +17 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cellModel.js","sourceRoot":"","sources":["../../src/model/cellModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { ComponentAdapter, dates, numbers, utils, ValueFormatter } from \"@omegagrid/core\";\nimport { hasQuotePrefix, isFormula, prefixFormula, stripQuotePrefix } from \"../calculations/formula\";\nimport { CellRange } from \"../common\";\n// import { cellTypeRendererMap } from \"../renderers\";\nimport { ColumnModel } from \"./columnModel\";\nimport { ElementModel, ElementSource } from \"./elementModel\";\nimport { GridModel } from \"./gridModel\";\nimport { RowModel } from \"./rowModel\";\nimport { Style, StylePropertyKey } from \"./style\";\nimport { CSSStyle, styleToCSStyle } from \"./cssStyle\";\nimport { CellSerializationOptions, CellType } from \"../types\";\nimport { CommentSource } from \"./commentModel\";\nimport { validateValue } from \"./validations\";\n\n/** Source object type for grid cell */\nexport type CellSource = {\n\t/** row index */\n\tr: number;\n\t/** col index */\n\tc: number;\n\t/** cell value */\n\tv?: unknown;\n\t/** cell display value */\n\tdv?: string;\n\t/** cell column span */\n\tcs?: number;\n\t/** cell row span */\n\trs?: number;\n\t/** hyperlink */\n\thl?: string;\n\t/** cell tooltip content */\n\ttooltip?: string|unknown;\n\t/** comment */\n\tcomment?: CommentSource;\n} & ElementSource;\n\n// an unknown cell type must not break value handling - fall back to the general type\nconst getCellValueHandler = (type: string) => cellValueHandler[type] ?? cellValueHandler['g'];\n\nconst cellValueHandler: Record<string, (v: unknown, cell: CellModel) => unknown> = {\n\t['n']: (v) => {\n\t\tconst value = utils.isString(v) ? parseFloat((v as string).replace(',', '.')) : v;\n\t\treturn Number.isNaN(value) ? v : value;\n\t},\n\t['t']: (v) => v,\n\t['d']: (v, cell) => {\n\t\tif (v == null || v === '') return null;\n\t\tif (utils.isString(v)) {\n\t\t\ttry {\n\t\t\t\treturn utils.isNumericString(v as string)\n\t\t\t\t\t? utils.strToNum(v as string)\n\t\t\t\t\t: dates.dateToSerialDate(dates.parse(v as string, cell.model.options.formatLocale));\n\t\t\t} catch (error) {\n\t\t\t\tcell.model.logger.error(`Invalid date value in cell ${cell.address}: ${v}`);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tif (v instanceof Date) return dates.dateToSerialDate(v);\n\t\treturn v;\n\t},\n\t// TODO: unfinnished implementation of time and datetime\n\t['tm']: (v) => utils.isString(v) ? new Date(v as string) : v,\n\t['dt']: (v) => utils.isString(v) ? new Date(v as string) : v,\n\t['b']: (v) => !!v && v !== '0' && v.toString().toLowerCase() !== 'false',\n\t['s']: (v) => v,\n\t['m']: (v) => v,\n\t['g']: (v) => {\n\t\tif (v == null || v === '') return null;\n\t\tconst f = parseFloat((v as string).toString().replace(',', '.'));\n\t\treturn isNaN(f) ? v : f;\n\t},\n\t['a']: (v) => utils.isString(v) && v !== '' ? JSON.parse(v as string) : v,\n\t['h']: (v) => v,\n};\n\n/** cell types whose values are entered as a free text, only those accept the quote prefix */\nconst quotePrefixTypes: CellType[] = ['t', 'n', 'g'];\n\nconst dropdownFormatters = new Map<{k: string, v: string}[], ValueFormatter<string>>();\nconst getDropdownFormatter = (content?: { k: string, v: string }[]) => {\n\tcontent = content || null;\n\tif (!dropdownFormatters.has(content)) {\n\t\tif (content) {\n\t\t\tconst items = content.reduce((map, e) => map.set(e.k, e.v), new Map<string, string>());\n\t\t\tdropdownFormatters.set(content, (k: string) => items.has(k) ? items.get(k) : k);\n\t\t} else {\n\t\t\tdropdownFormatters.set(content, (k: string) => k);\n\t\t}\n\t}\n\treturn dropdownFormatters.get(content);\n};\n\nexport type CellError = {\n\tmessage: string;\n\thandled?: boolean;\n\t/** the error stays until the cell value is invalidated, the cell is not evaluated meanwhile */\n\tpersistent?: boolean;\n}\n\nexport class CellModel extends ElementModel {\n\n\tpublic _content: HTMLDivElement;\n\n\tprivate _tooltip: string|unknown;\n\tget tooltip() { return this._tooltip }\n\tset tooltip(v: string|unknown) { this._tooltip = v }\n\tget hasTooltip() { return this._tooltip != null }\n\n\tget merge() { return this.model.merges.mergedCells.get(this.address) }\n\n\tprivate _row: RowModel;\n\tget row() { return this._row }\n\tset row(v: RowModel) { this._row = v }\n\tget r() { return this._row.index}\n\n\tprivate _column: ColumnModel;\n\tget column() { return this._column }\n\tset column(v: ColumnModel) { this._column = v }\n\tget c() { return this._column.index }\n\n\t/** tells if the entered value of the cell can be prefixed by the quote prefix */\n\tget quotePrefixable() { return quotePrefixTypes.includes(this.type) }\n\n\t/**\n\t * tells if the cell value is a quote prefixed plain text,\n\t * the prefix stays a part of the value, the display value holds the value without it\n\t */\n\tget quotePrefix() { return this.quotePrefixable && !this.hasFormula && hasQuotePrefix(this._value) }\n\n\t/** cell value without the quote prefix, used where the value is compared as a text (sorting, filtering) */\n\tget plainValue() { return this.quotePrefix ? stripQuotePrefix(this._value) : this.value }\n\n\tprivate _value: unknown;\n\tprivate _evaluated = true;\n\tget hasValue() { return this._value != null }\n\tget value() {\n\t\tif (!this._evaluated) this.evaluate();\n\t\treturn this._value\n\t}\n\tset value(v: unknown) {\n\t\tif (v && this.model.formulasEnabled && isFormula(v.toString())) {\n\t\t\tthis._value = undefined;\n\t\t\tthis.formula = v as string;\n\t\t} else {\n\t\t\tlet value = this.quotePrefixable && hasQuotePrefix(v) ? v : getCellValueHandler(this.type)(v, this);\n\n\t\t\tif (!validateValue(this, value)) value = undefined;\n\n\t\t\tif (value !== this._value) {\n\t\t\t\tthis._value = value;\n\t\t\t\tthis._displayValue = undefined;\n\t\t\t}\n\n\t\t\tif (this.row.data && this.column.data) {\n\t\t\t\tthis.row.data[this.column.data] = this._value;\n\t\t\t}\n\t\t}\n\t}\n\tevaluate() {\n\t\tthis._value = getCellValueHandler(this.type)(this.model.calculations.evaluate(this), this);\n\t\tthis._evaluated = true;\n\t\treturn this._value;\n\t}\n\n\tget value2() { return this.hasFormula ? prefixFormula(this.formula) : this.value }\n\n\tprivate _displayValue: string;\n\tget hasDisplayValue() { return this._displayValue != null }\n\tget displayValue() { return this._displayValue }\n\tset displayValue(v: string) { this._displayValue = v }\n\n\t/* tells if cell has type that prefers usage of display value */\n\tget prefersDisplayValue() { return ['s', 'm'].includes(this.type) }\n\n\tprivate _error: CellError;\n\tget error() { return this._error }\n\tset error(v: CellError) { this._error = v }\n\tget hasError() { return !!this._error }\n\tclearError() { this._error = undefined }\n\n\tprivate _spillRange: CellRange;\n\tprivate _prevSpillRange: CellRange;\n\tget spillRange() { return this._spillRange }\n\tget prevSpillRange() { return this._prevSpillRange }\n\tset spillRange(v: CellRange) {\n\t\tif (this._spillRange && (!v || !this._spillRange.equals(v))) {\n\t\t\tthis._prevSpillRange = this._spillRange;\n\t\t}\n\t\tthis._spillRange = v;\n\t}\n\tget isSpillSource() { return this._spillRange != null }\n\n\tprivate _spillSource: CellModel;\n\tget spillSource() { return this._spillSource }\n\tget isSpilled() { return this._spillSource != null }\n\tspillValue(v: unknown, source?: CellModel) {\n\t\tthis.value = v;\n\t\tthis._spillSource = source;\n\t}\n\tclearSpilledValue() {\n\t\tthis._spillSource = undefined;\n\t\tthis._value = undefined;\n\t}\n\n\tprivate _sparkline: boolean = null;\n\tget hasSparkline() {\n\t\treturn this._sparkline === null ? (this._sparkline = this.model.sparklines.has(this.address)) : this._sparkline;\n\t}\n\n\tprivate _hasComment?: boolean = null;\n\tget hasComment() {\n\t\treturn this._hasComment === null ? (\n\t\t\tthis._hasComment = (this.model.comments.get(this.address) ?? []).length > 0\n\t\t) : this._hasComment;\n\t}\n\tget comments() { return this.model.comments.get(this.address) }\n\n\tprivate _composedStyle: Style;\n\tprivate _cssStyle: CSSStyle;\n\tprivate _hasStyle?: boolean = null;\n\n\tget valueFormatter(): ValueFormatter<unknown> {\n\t\tconst formatter = super.valueFormatter ?? this.row.valueFormatter ?? this.column.valueFormatter;\n\t\tif (formatter) return formatter;\n\n\t\tconst type = this.type;\n\t\tconst format = this.format;\n\t\tconst { formatLocale, fixNumberFormat } = this.model.options;\n\t\tconst v = this.value;\n\n\t\tif (v == null || v === '') { // TODO: maybe allow DropdownFormatter for v === ''\n\t\t\treturn null;\n\t\t} else if (type == 'n') {\n\t\t\tif (format != null) return numbers.getNumberFormatter(formatLocale, format, fixNumberFormat);\n\t\t\telse return this.model.options.numberFormatter;\n\t\t} else if (type == 'g') {\n\t\t\tif (format != null) return numbers.getNumberFormatter(formatLocale, format, fixNumberFormat);\n\t\t\telse if (utils.isNumber(v)) return this.model.options.numberFormatter;\n\t\t} else if (type == 't') {\n\t\t\treturn format == null ? null : numbers.getNumberFormatter(formatLocale, format, false);\n\t\t} else if (type == 'd') {\n\t\t\treturn format ? dates.getDateFormatter(formatLocale, format) : this.model.options.dateFormatter;\n\t\t} else if (type == 's' && this.editorContent) {\n\t\t\treturn getDropdownFormatter(this.editorContent as {k: string, v: string}[]);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tget formattedValue(): string {\n\t\tif (this.value == null) return '';\n\t\tif (this.hasDisplayValue) return this.displayValue;\n\t\tif (this.quotePrefix) return stripQuotePrefix(this.value) as string;\n\t\treturn this.valueFormatter ? this.valueFormatter(this.value) : this.value.toString();\n\t}\n\n\tprivate get elm1() { return this.row.priority >= this.column.priority ? this.row : this.column }\n\tprivate get elm2() { return this.row.priority < this.column.priority ? this.row : this.column }\n\n\tget clickable() { return super.clickable ?? this.elm1.clickable ?? this.elm2.clickable }\n\tget type() { return super.type ?? this.elm1.type ?? this.elm2.type ?? 'g' }\n\tset type(value: CellType) { this._type = value }\n\tget editorContent() { return super.editorContent ?? this.elm1.editorContent ?? this.elm2.editorContent ?? null }\n\tget adapter() { return super.adapter ?? this.elm1.adapter ?? this.elm2.adapter }\n\tset adapter(value: ComponentAdapter) { this._adapter = value }\n\n\tget address() { return this.column.address + this.row.address }\n\tget range() { return CellRange.fromA1(this.address) }\n\tget validation() { return super.validation ?? this.elm1.validation ?? this.elm2.validation ?? this.model.options.cellValidation }\n\tget editable() { return super.editable ?? this.elm1.editable ?? this.elm2.editable ?? this.model.options.editable }\n\tset editable(v: boolean) { this._editable = v }\n\tget commentable() { return super.commentable ?? this.elm1.commentable ?? this.elm2.commentable ?? this.model.options.commentable }\n\tget renderer() { return super.renderer ?? this.elm1.renderer ?? this.elm2.renderer }\n\tget afterRenderer() { return super.afterRenderer ?? this.elm1.afterRenderer ?? this.elm2.afterRenderer ?? this.model.options.afterRenderer }\n\tget commentRenderer() { return super.commentRenderer ?? this.elm1.commentRenderer ?? this.elm2.commentRenderer ?? this.model.options.comments.renderer }\n\tget editorFactory() { return super.editorFactory ?? this.elm1.editorFactory ?? this.elm2.editorFactory }\n\tget format() { return super.format ?? this.elm1.format ?? this.elm2.format }\n\tset format(v: numbers.NumberFormatString) { super.format = v }\n\n\tprivate _hyperlink : string;\n\tget hyperlink() { return this._hyperlink }\n\tset hyperlink(v: string) { this._hyperlink = v }\n\n\tprivate _hasFormula: boolean;\n\n\tget hasOwnFormula() { return !!this._formula }\n\tget hasFormula() {\n\t\tif (this._hasFormula == null) this._hasFormula = !!this.formula;\n\t\treturn this._hasFormula;\n\t}\n\tget formula() { return this._formula ?? this.elm1.formula ?? this.elm2.formula }\n\tset formula(v: string) {\n\t\tsuper.formula = v;\n\t\tthis.refreshFormula();\n\t}\n\n\tgetProperty(key: string) { return super.getProperty(key) ?? this.elm1.getProperty(key) ?? this.elm2.getProperty(key) }\n\n\tinvalidateValue() {\n\t\tif (this.hasFormula) {\n\t\t\tthis._value = undefined;\n\t\t\tthis._evaluated = false;\n\t\t} else {\n\t\t\tthis._evaluated = true;\n\t\t}\n\t\tthis.clearError();\n\t}\n\n\trefreshFormula() {\n\t\tthis._hasFormula = null;\n\t\tthis.invalidateValue();\n\t}\n\n\tclearFormula() {\n\t\tthis._formula = null;\n\t\tthis._hasFormula = false;\n\t\tthis._evaluated = true;\n\t}\n\n\tconstructor(model: GridModel, source: CellSource) {\n\t\tsuper(model);\n\t\tthis.row = model.rows[source.r];\n\t\tthis.column = model.columns[source.c];\n\t\tthis.populate(source);\n\t}\n\n\tpopulate(source: CellSource) {\n\t\tsuper.populate(source);\n\t\tthis._tooltip = source.tooltip;\n\t\tthis._hyperlink = source.hl;\n\t\tif (this._formula != null && this._formula !== '') this._evaluated = false;\n\t\telse if (source.v != null) this.value = source.v; // load static value only if no formula is present\n\t\tthis._displayValue = source.dv; // display value must be set after value\n\t}\n\n\tupdate(source: Partial<CellSource>) {\n\t\tconst updatedProps = super.update(source) as CellSource;\n\t\tif ('tooltip' in source) { updatedProps.tooltip = this._tooltip; this._tooltip = source.tooltip; }\n\t\tif ('hl' in source) { updatedProps.hl = this._hyperlink; this._hyperlink = source.hl; }\n\t\tif ('f' in source && this.model.formulasEnabled) { this._evaluated = false; }\n\t\telse if ('v' in source) { updatedProps.v = this.value; this.value = source.v; }\n\t\tif ('dv' in source) { updatedProps.dv = this._displayValue; this._displayValue = source.dv; }\n\t\treturn updatedProps;\n\t}\n\n\tgetSourceData(options?: CellSerializationOptions) : CellSource {\n\t\tconst data = super.getSourceData() as CellSource;\n\n\t\tif (this.merge) {\n\t\t\tdata.cs = this.merge.cs;\n\t\t\tdata.rs = this.merge.rs;\n\t\t}\n\n\t\tif (this.value != null) data.v = this.value;\n\t\tif (this.hasTooltip) data.tooltip = this._tooltip;\n\t\tif (this._hyperlink) data.hl = this._hyperlink;\n\n\t\tif (options) {\n\t\t\tif (options.displayValue && this.hasDisplayValue) data.dv = this._displayValue;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tprivate createComposedStyle(columnStyle?: Style|number, rowStyle?: Style|number, extraStyle?: Style) {\n\t\tconst styles: (number|Style)[] = [];\n\n\t\tcolumnStyle = columnStyle || this.column.style;\n\t\trowStyle = rowStyle || this.row.style;\n\t\tif (columnStyle != null && rowStyle != null) {\n\t\t\tif (this.column.priority > this.row.priority) {\n\t\t\t\tstyles.push(rowStyle, columnStyle);\n\t\t\t} else {\n\t\t\t\tstyles.push(columnStyle, rowStyle);\n\t\t\t}\n\t\t}\n\t\telse if (columnStyle != null) styles.push(columnStyle);\n\t\telse if (rowStyle != null) styles.push(rowStyle);\n\n\t\tif (this.style != null) styles.push(this.style);\n\t\tif (extraStyle != null) styles.push(extraStyle);\n\n\t\treturn styles.length > 0 ? this.model.styles.merge(...styles) : null;\n\t}\n\n\tget composedStyle() : Style {\n\t\tif (this._hasStyle === null) {\n\t\t\tconst s = this.createComposedStyle(null, null, this.model.conditionalFormats.evaluate(this));\n\t\t\tthis._hasStyle = s != null;\n\t\t\tthis._composedStyle = s;\n\t\t}\n\t\treturn this._composedStyle;\n\t}\n\n\tget calculatedIndent(): number|null {\n\t\tconst s = this.composedStyle;\n\t\tif (s?.alignment?.indent) return s.alignment.indent;\n\n\t\t// calculates cell text indent based on row level\n\t\tif (this.column.levelIndent && this.row.level > 0) {\n\t\t\treturn this.row.level * this.model.options.levelIndentFactor;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tget cssStyle() : CSSStyle {\n\t\tif (this._hasStyle === false) return null;\n\t\tif (!this._cssStyle) {\n\t\t\tconst composedStyle = this.composedStyle;\n\t\t\tif (composedStyle) {\n\t\t\t\tthis._cssStyle = styleToCSStyle(composedStyle);\n\t\t\t}\n\t\t}\n\t\treturn this._cssStyle;\n\t}\n\n\tinvalidateStyle() {\n\t\tthis._hasComment = null;\n\t\tthis._hasStyle = null;\n\t\tthis._composedStyle = null;\n\t\tthis._cssStyle = null;\n\t\tthis._sparkline = null;\n\t}\n\n\tsetStyleProperties(props: Record<StylePropertyKey, unknown>) {\n\t\tsuper.setStyleProperties(props);\n\t\tthis.invalidateStyle();\n\t}\n\n\tremoveStyleProperties(props: string[]) {\n\t\tsuper.removeStyleProperties(props);\n\t\tthis.invalidateStyle();\n\t}\n\n\tpreviewStyleProperties(\n\t\tprops: Record<StylePropertyKey, unknown>,\n\t\ttype: 'cell'|'column'|'row' = 'cell'\n\t) {\n\t\tconst composedStyle = Object.assign({}, this.createComposedStyle(type == 'column' ? props : null, type == 'row' ? props : null) ?? {});\n\n\t\tif (type == 'cell') {\n\t\t\tfor (const k in props) composedStyle[k] = props[k];\n\t\t}\n\t\tthis._hasStyle = true;\n\t\tthis._cssStyle = styleToCSStyle(composedStyle);\n\t}\n\n\tvalidate() {\n\t\tif (!this.validation) return true;\n\t\treturn validateValue(this, this.value);\n\t}\n\n\ttoString() { return this.address }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cellModel.js","sourceRoot":"","sources":["../../src/model/cellModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { ComponentAdapter, dates, numbers, utils, ValueFormatter } from \"@omegagrid/core\";\nimport { hasQuotePrefix, isFormula, prefixFormula, stripQuotePrefix } from \"../calculations/formula\";\nimport { CellRange } from \"../common\";\n// import { cellTypeRendererMap } from \"../renderers\";\nimport { ColumnModel } from \"./columnModel\";\nimport { ElementModel, ElementSource } from \"./elementModel\";\nimport { GridModel } from \"./gridModel\";\nimport { RowModel } from \"./rowModel\";\nimport { Style, StylePropertyKey } from \"./style\";\nimport { CSSStyle, styleToCSStyle } from \"./cssStyle\";\nimport { CellSerializationOptions, CellType } from \"../types\";\nimport { CommentSource } from \"./commentModel\";\nimport { validateValue } from \"./validations\";\n\n/** Source object type for grid cell */\nexport type CellSource = {\n\t/** row index */\n\tr: number;\n\t/** col index */\n\tc: number;\n\t/** cell value */\n\tv?: unknown;\n\t/** cell display value */\n\tdv?: string;\n\t/** cell column span */\n\tcs?: number;\n\t/** cell row span */\n\trs?: number;\n\t/** hyperlink */\n\thl?: string;\n\t/** cell tooltip content */\n\ttooltip?: string|unknown;\n\t/** comment */\n\tcomment?: CommentSource;\n} & ElementSource;\n\n// an unknown cell type must not break value handling - fall back to the general type\nconst getCellValueHandler = (type: string) => cellValueHandler[type] ?? cellValueHandler['g'];\n\n/** Whether a value given for a cell is a cell source (an object with its properties); a Date is a value (of a date and time cell) */\nexport const isCellSource = (value: unknown): value is CellSource => utils.isObject(value) && !(value instanceof Date);\n\n/**\n * The Date of a value of a date and time or a time cell: a Date, a serial date (also in a text) or a text parsed by the\n * given function. Null when it is none of them or not a valid date (a separator alone, '.' or ',', is a numeric text\n * of NaN): an invalid Date would make the formatters throw.\n */\nfunction toDate(v: unknown, parseText: (text: string) => Date|null): Date|null {\n\tlet date: Date|null = null;\n\tif (v instanceof Date) date = v;\n\telse if (utils.isNumber(v)) date = dates.serialDateToDateTime(v as number);\n\telse if (utils.isString(v)) {\n\t\tdate = utils.isNumericString(v as string)\n\t\t\t? dates.serialDateToDateTime(utils.strToNum(v as string))\n\t\t\t: parseText(v as string);\n\t}\n\treturn date && !isNaN(date.getTime()) ? date : null;\n}\n\nconst cellValueHandler: Record<string, (v: unknown, cell: CellModel) => unknown> = {\n\t// a Date (the row data of a date column) is its serial date\n\t['n']: (v) => {\n\t\tif (v instanceof Date) return dates.dateToSerialDate(v);\n\t\tconst value = utils.isString(v) ? parseFloat((v as string).replace(',', '.')) : v;\n\t\treturn Number.isNaN(value) ? v : value;\n\t},\n\t// a Date stays a Date (the formulas read it as a serial date, see calculationValue)\n\t['t']: (v) => v,\n\t// a date cell holds a serial date; a separator alone ('.', ','), which isNumericString lets through, is not one\n\t['d']: (v, cell) => {\n\t\tif (v == null || v === '') return null;\n\t\tlet serial: unknown = v;\n\t\tif (utils.isString(v)) {\n\t\t\tconst date = utils.isNumericString(v as string) ? null : dates.parse(v as string, cell.model.options.formatLocale);\n\t\t\tserial = utils.isNumericString(v as string) ? utils.strToNum(v as string) : (date ? dates.dateToSerialDate(date) : NaN);\n\t\t} else if (v instanceof Date) {\n\t\t\tserial = dates.dateToSerialDate(v); // NaN for an invalid Date\n\t\t}\n\t\tif (!utils.isNumber(serial) || Number.isFinite(serial)) return serial;\n\t\tcell.model.logger?.error(`Invalid date value in cell ${cell.address}: ${v}`);\n\t\treturn null;\n\t},\n\t// a time cell holds a Date on the day of the serial date 0 (dates.timeOfDay): a text, a serial date or a date give their time of day\n\t['tm']: (v, cell) => {\n\t\tif (v == null || v === '') return null;\n\t\tconst date = toDate(v, text => dates.parseTime(text, cell.model.options.formatLocale));\n\t\tif (date) return dates.timeOfDay(date);\n\t\tcell.model.logger?.error(`Invalid time value in cell ${cell.address}: ${v}`);\n\t\treturn null;\n\t},\n\t// a date and time cell holds a Date: a serial date (with its day fraction) or a text is converted\n\t['dt']: (v, cell) => {\n\t\tif (v == null || v === '') return null;\n\t\tconst date = toDate(v, text => dates.parseDateTime(text, cell.model.options.formatLocale));\n\t\tif (date) return date;\n\t\tcell.model.logger?.error(`Invalid date time value in cell ${cell.address}: ${v}`);\n\t\treturn null;\n\t},\n\t['b']: (v) => !!v && v !== '0' && v.toString().toLowerCase() !== 'false',\n\t['s']: (v) => v,\n\t['m']: (v) => v,\n\t['g']: (v) => {\n\t\tif (v == null || v === '') return null;\n\t\tif (v instanceof Date) return v; // a Date stays a Date, a text of it would turn into its first number when evaluated again\n\t\tconst f = parseFloat((v as string).toString().replace(',', '.'));\n\t\treturn isNaN(f) ? v : f;\n\t},\n\t['a']: (v) => utils.isString(v) && v !== '' ? JSON.parse(v as string) : v,\n\t['h']: (v) => v,\n};\n\n/** cell types whose values are entered as a free text, only those accept the quote prefix */\nconst quotePrefixTypes: CellType[] = ['t', 'n', 'g'];\n\nconst dropdownFormatters = new Map<{k: string, v: string}[], ValueFormatter<string>>();\nconst getDropdownFormatter = (content?: { k: string, v: string }[]) => {\n\tcontent = content || null;\n\tif (!dropdownFormatters.has(content)) {\n\t\tif (content) {\n\t\t\tconst items = content.reduce((map, e) => map.set(e.k, e.v), new Map<string, string>());\n\t\t\tdropdownFormatters.set(content, (k: string) => items.has(k) ? items.get(k) : k);\n\t\t} else {\n\t\t\tdropdownFormatters.set(content, (k: string) => k);\n\t\t}\n\t}\n\treturn dropdownFormatters.get(content);\n};\n\nexport type CellError = {\n\tmessage: string;\n\thandled?: boolean;\n\t/** the error stays until the cell value is invalidated, the cell is not evaluated meanwhile */\n\tpersistent?: boolean;\n}\n\nexport class CellModel extends ElementModel {\n\n\tpublic _content: HTMLDivElement;\n\n\tprivate _tooltip: string|unknown;\n\tget tooltip() { return this._tooltip }\n\tset tooltip(v: string|unknown) { this._tooltip = v }\n\tget hasTooltip() { return this._tooltip != null }\n\n\tget merge() { return this.model.merges.mergedCells.get(this.address) }\n\n\tprivate _row: RowModel;\n\tget row() { return this._row }\n\tset row(v: RowModel) { this._row = v }\n\tget r() { return this._row.index}\n\n\tprivate _column: ColumnModel;\n\tget column() { return this._column }\n\tset column(v: ColumnModel) { this._column = v }\n\tget c() { return this._column.index }\n\n\t/** tells if the entered value of the cell can be prefixed by the quote prefix */\n\tget quotePrefixable() { return quotePrefixTypes.includes(this.type) }\n\n\t/**\n\t * tells if the cell value is a quote prefixed plain text,\n\t * the prefix stays a part of the value, the display value holds the value without it\n\t */\n\tget quotePrefix() { return this.quotePrefixable && !this.hasFormula && hasQuotePrefix(this._value) }\n\n\t/** cell value without the quote prefix, used where the value is compared as a text (sorting, filtering) */\n\tget plainValue() { return this.quotePrefix ? stripQuotePrefix(this._value) : this.value }\n\n\tprivate _value: unknown;\n\tprivate _evaluated = true;\n\tget hasValue() { return this._value != null }\n\tget value() {\n\t\tif (!this._evaluated) this.evaluate();\n\t\treturn this._value\n\t}\n\tset value(v: unknown) {\n\t\tif (v && this.model.formulasEnabled && isFormula(v.toString())) {\n\t\t\tthis._value = undefined;\n\t\t\tthis.formula = v as string;\n\t\t} else {\n\t\t\tlet value = this.quotePrefixable && hasQuotePrefix(v) ? v : getCellValueHandler(this.type)(v, this);\n\n\t\t\tif (!validateValue(this, value)) value = undefined;\n\n\t\t\tif (value !== this._value) {\n\t\t\t\tthis._value = value;\n\t\t\t\tthis._displayValue = undefined;\n\t\t\t}\n\n\t\t\tif (this.row.data && this.column.data) {\n\t\t\t\tthis.row.data[this.column.data] = this._value;\n\t\t\t}\n\t\t}\n\t}\n\tevaluate() {\n\t\tthis._value = getCellValueHandler(this.type)(this.model.calculations.evaluate(this), this);\n\t\tthis._evaluated = true;\n\t\treturn this._value;\n\t}\n\n\t/** the formula of the cell, or its value the way the source data carries it (see serializedValue) */\n\tget value2() { return this.hasFormula ? prefixFormula(this.formula) : this.serializedValue }\n\n\t/**\n\t * The value the way the source data carries it: the Date of a date and time or a time cell as a text of its local\n\t * date and time ('2026-11-02 13:45:10', '13:45:10'), which is the same in every time zone, unlike the UTC instant\n\t * JSON writes a Date as. A Date of a cell of any other type is given as it is.\n\t */\n\tget serializedValue() {\n\t\tconst value = this.value;\n\t\tif (!(value instanceof Date) || isNaN(value.getTime())) return value;\n\t\tif (this.type == 'tm') return dates.formatLocalTime(value);\n\t\tif (this.type == 'dt') return dates.formatLocalDateTime(value);\n\t\treturn value;\n\t}\n\n\tprivate _displayValue: string;\n\tget hasDisplayValue() { return this._displayValue != null }\n\tget displayValue() { return this._displayValue }\n\tset displayValue(v: string) { this._displayValue = v }\n\n\t/* tells if cell has type that prefers usage of display value */\n\tget prefersDisplayValue() { return ['s', 'm'].includes(this.type) }\n\n\tprivate _error: CellError;\n\tget error() { return this._error }\n\tset error(v: CellError) { this._error = v }\n\tget hasError() { return !!this._error }\n\tclearError() { this._error = undefined }\n\n\tprivate _spillRange: CellRange;\n\tprivate _prevSpillRange: CellRange;\n\tget spillRange() { return this._spillRange }\n\tget prevSpillRange() { return this._prevSpillRange }\n\tset spillRange(v: CellRange) {\n\t\tif (this._spillRange && (!v || !this._spillRange.equals(v))) {\n\t\t\tthis._prevSpillRange = this._spillRange;\n\t\t}\n\t\tthis._spillRange = v;\n\t}\n\tget isSpillSource() { return this._spillRange != null }\n\n\tprivate _spillSource: CellModel;\n\tget spillSource() { return this._spillSource }\n\tget isSpilled() { return this._spillSource != null }\n\tspillValue(v: unknown, source?: CellModel) {\n\t\tthis.value = v;\n\t\tthis._spillSource = source;\n\t}\n\tclearSpilledValue() {\n\t\tthis._spillSource = undefined;\n\t\tthis._value = undefined;\n\t}\n\n\tprivate _sparkline: boolean = null;\n\tget hasSparkline() {\n\t\treturn this._sparkline === null ? (this._sparkline = this.model.sparklines.has(this.address)) : this._sparkline;\n\t}\n\n\tprivate _hasComment?: boolean = null;\n\tget hasComment() {\n\t\treturn this._hasComment === null ? (\n\t\t\tthis._hasComment = (this.model.comments.get(this.address) ?? []).length > 0\n\t\t) : this._hasComment;\n\t}\n\tget comments() { return this.model.comments.get(this.address) }\n\n\tprivate _composedStyle: Style;\n\tprivate _cssStyle: CSSStyle;\n\tprivate _hasStyle?: boolean = null;\n\n\tget valueFormatter(): ValueFormatter<unknown> {\n\t\tconst formatter = super.valueFormatter ?? this.row.valueFormatter ?? this.column.valueFormatter;\n\t\tif (formatter) return formatter;\n\n\t\tconst type = this.type;\n\t\tconst format = this.format;\n\t\tconst { formatLocale, fixNumberFormat } = this.model.options;\n\t\tconst v = this.value;\n\n\t\tif (v == null || v === '') { // TODO: maybe allow DropdownFormatter for v === ''\n\t\t\treturn null;\n\t\t} else if (type == 'n') {\n\t\t\tif (format != null) return numbers.getNumberFormatter(formatLocale, format, fixNumberFormat);\n\t\t\telse return this.model.options.numberFormatter;\n\t\t} else if (type == 'g') {\n\t\t\tif (format != null) return numbers.getNumberFormatter(formatLocale, format, fixNumberFormat);\n\t\t\telse if (utils.isNumber(v)) return this.model.options.numberFormatter;\n\t\t} else if (type == 't') {\n\t\t\treturn format == null ? null : numbers.getNumberFormatter(formatLocale, format, false);\n\t\t} else if (type == 'd') {\n\t\t\treturn format ? dates.getDateFormatter(formatLocale, format) : this.model.options.dateFormatter;\n\t\t} else if (type == 'dt') {\n\t\t\treturn format ? dates.getDateFormatter(formatLocale, format) : this.model.options.dateTimeFormatter;\n\t\t} else if (type == 'tm') {\n\t\t\treturn format ? dates.getDateFormatter(formatLocale, format) : this.model.options.timeFormatter;\n\t\t} else if (type == 's' && this.editorContent) {\n\t\t\treturn getDropdownFormatter(this.editorContent as {k: string, v: string}[]);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tget formattedValue(): string {\n\t\tif (this.value == null) return '';\n\t\tif (this.hasDisplayValue) return this.displayValue;\n\t\tif (this.quotePrefix) return stripQuotePrefix(this.value) as string;\n\t\treturn this.valueFormatter ? this.valueFormatter(this.value) : this.value.toString();\n\t}\n\n\tprivate get elm1() { return this.row.priority >= this.column.priority ? this.row : this.column }\n\tprivate get elm2() { return this.row.priority < this.column.priority ? this.row : this.column }\n\n\tget clickable() { return super.clickable ?? this.elm1.clickable ?? this.elm2.clickable }\n\tget type() { return super.type ?? this.elm1.type ?? this.elm2.type ?? 'g' }\n\tset type(value: CellType) { this._type = value }\n\tget editorContent() { return super.editorContent ?? this.elm1.editorContent ?? this.elm2.editorContent ?? null }\n\tget adapter() { return super.adapter ?? this.elm1.adapter ?? this.elm2.adapter }\n\tset adapter(value: ComponentAdapter) { this._adapter = value }\n\n\tget address() { return this.column.address + this.row.address }\n\tget range() { return CellRange.fromA1(this.address) }\n\tget validation() { return super.validation ?? this.elm1.validation ?? this.elm2.validation ?? this.model.options.cellValidation }\n\tget editable() { return super.editable ?? this.elm1.editable ?? this.elm2.editable ?? this.model.options.editable }\n\tset editable(v: boolean) { this._editable = v }\n\tget commentable() { return super.commentable ?? this.elm1.commentable ?? this.elm2.commentable ?? this.model.options.commentable }\n\tget renderer() { return super.renderer ?? this.elm1.renderer ?? this.elm2.renderer }\n\tget afterRenderer() { return super.afterRenderer ?? this.elm1.afterRenderer ?? this.elm2.afterRenderer ?? this.model.options.afterRenderer }\n\tget commentRenderer() { return super.commentRenderer ?? this.elm1.commentRenderer ?? this.elm2.commentRenderer ?? this.model.options.comments.renderer }\n\tget editorFactory() { return super.editorFactory ?? this.elm1.editorFactory ?? this.elm2.editorFactory }\n\tget format() { return super.format ?? this.elm1.format ?? this.elm2.format }\n\tset format(v: numbers.NumberFormatString) { super.format = v }\n\n\tprivate _hyperlink : string;\n\tget hyperlink() { return this._hyperlink }\n\tset hyperlink(v: string) { this._hyperlink = v }\n\n\tprivate _hasFormula: boolean;\n\n\tget hasOwnFormula() { return !!this._formula }\n\tget hasFormula() {\n\t\tif (this._hasFormula == null) this._hasFormula = !!this.formula;\n\t\treturn this._hasFormula;\n\t}\n\tget formula() { return this._formula ?? this.elm1.formula ?? this.elm2.formula }\n\tset formula(v: string) {\n\t\tsuper.formula = v;\n\t\tthis.refreshFormula();\n\t}\n\n\tgetProperty(key: string) { return super.getProperty(key) ?? this.elm1.getProperty(key) ?? this.elm2.getProperty(key) }\n\n\tinvalidateValue() {\n\t\tif (this.hasFormula) {\n\t\t\tthis._value = undefined;\n\t\t\tthis._evaluated = false;\n\t\t} else {\n\t\t\tthis._evaluated = true;\n\t\t}\n\t\tthis.clearError();\n\t}\n\n\trefreshFormula() {\n\t\tthis._hasFormula = null;\n\t\tthis.invalidateValue();\n\t}\n\n\tclearFormula() {\n\t\tthis._formula = null;\n\t\tthis._hasFormula = false;\n\t\tthis._evaluated = true;\n\t}\n\n\tconstructor(model: GridModel, source: CellSource) {\n\t\tsuper(model);\n\t\tthis.row = model.rows[source.r];\n\t\tthis.column = model.columns[source.c];\n\t\tthis.populate(source);\n\t}\n\n\tpopulate(source: CellSource) {\n\t\tsuper.populate(source);\n\t\tthis._tooltip = source.tooltip;\n\t\tthis._hyperlink = source.hl;\n\t\tif (this._formula != null && this._formula !== '') this._evaluated = false;\n\t\telse if (source.v != null) this.value = source.v; // load static value only if no formula is present\n\t\tthis._displayValue = source.dv; // display value must be set after value\n\t}\n\n\tupdate(source: Partial<CellSource>) {\n\t\tconst updatedProps = super.update(source) as CellSource;\n\t\tif ('tooltip' in source) { updatedProps.tooltip = this._tooltip; this._tooltip = source.tooltip; }\n\t\tif ('hl' in source) { updatedProps.hl = this._hyperlink; this._hyperlink = source.hl; }\n\t\tif ('f' in source && this.model.formulasEnabled) { this._evaluated = false; }\n\t\telse if ('v' in source) { updatedProps.v = this.value; this.value = source.v; }\n\t\tif ('dv' in source) { updatedProps.dv = this._displayValue; this._displayValue = source.dv; }\n\t\treturn updatedProps;\n\t}\n\n\tgetSourceData(options?: CellSerializationOptions) : CellSource {\n\t\tconst data = super.getSourceData() as CellSource;\n\n\t\tif (this.merge) {\n\t\t\tdata.cs = this.merge.cs;\n\t\t\tdata.rs = this.merge.rs;\n\t\t}\n\n\t\tif (this.value != null) data.v = this.serializedValue;\n\t\tif (this.hasTooltip) data.tooltip = this._tooltip;\n\t\tif (this._hyperlink) data.hl = this._hyperlink;\n\n\t\tif (options) {\n\t\t\tif (options.displayValue && this.hasDisplayValue) data.dv = this._displayValue;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tprivate createComposedStyle(columnStyle?: Style|number, rowStyle?: Style|number, extraStyle?: Style) {\n\t\tconst styles: (number|Style)[] = [];\n\n\t\tcolumnStyle = columnStyle || this.column.style;\n\t\trowStyle = rowStyle || this.row.style;\n\t\tif (columnStyle != null && rowStyle != null) {\n\t\t\tif (this.column.priority > this.row.priority) {\n\t\t\t\tstyles.push(rowStyle, columnStyle);\n\t\t\t} else {\n\t\t\t\tstyles.push(columnStyle, rowStyle);\n\t\t\t}\n\t\t}\n\t\telse if (columnStyle != null) styles.push(columnStyle);\n\t\telse if (rowStyle != null) styles.push(rowStyle);\n\n\t\tif (this.style != null) styles.push(this.style);\n\t\tif (extraStyle != null) styles.push(extraStyle);\n\n\t\treturn styles.length > 0 ? this.model.styles.merge(...styles) : null;\n\t}\n\n\tget composedStyle() : Style {\n\t\tif (this._hasStyle === null) {\n\t\t\tconst s = this.createComposedStyle(null, null, this.model.conditionalFormats.evaluate(this));\n\t\t\tthis._hasStyle = s != null;\n\t\t\tthis._composedStyle = s;\n\t\t}\n\t\treturn this._composedStyle;\n\t}\n\n\tget calculatedIndent(): number|null {\n\t\tconst s = this.composedStyle;\n\t\tif (s?.alignment?.indent) return s.alignment.indent;\n\n\t\t// calculates cell text indent based on row level\n\t\tif (this.column.levelIndent && this.row.level > 0) {\n\t\t\treturn this.row.level * this.model.options.levelIndentFactor;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tget cssStyle() : CSSStyle {\n\t\tif (this._hasStyle === false) return null;\n\t\tif (!this._cssStyle) {\n\t\t\tconst composedStyle = this.composedStyle;\n\t\t\tif (composedStyle) {\n\t\t\t\tthis._cssStyle = styleToCSStyle(composedStyle);\n\t\t\t}\n\t\t}\n\t\treturn this._cssStyle;\n\t}\n\n\tinvalidateStyle() {\n\t\tthis._hasComment = null;\n\t\tthis._hasStyle = null;\n\t\tthis._composedStyle = null;\n\t\tthis._cssStyle = null;\n\t\tthis._sparkline = null;\n\t}\n\n\tsetStyleProperties(props: Record<StylePropertyKey, unknown>) {\n\t\tsuper.setStyleProperties(props);\n\t\tthis.invalidateStyle();\n\t}\n\n\tremoveStyleProperties(props: string[]) {\n\t\tsuper.removeStyleProperties(props);\n\t\tthis.invalidateStyle();\n\t}\n\n\tpreviewStyleProperties(\n\t\tprops: Record<StylePropertyKey, unknown>,\n\t\ttype: 'cell'|'column'|'row' = 'cell'\n\t) {\n\t\tconst composedStyle = Object.assign({}, this.createComposedStyle(type == 'column' ? props : null, type == 'row' ? props : null) ?? {});\n\n\t\tif (type == 'cell') {\n\t\t\tfor (const k in props) composedStyle[k] = props[k];\n\t\t}\n\t\tthis._hasStyle = true;\n\t\tthis._cssStyle = styleToCSStyle(composedStyle);\n\t}\n\n\tvalidate() {\n\t\tif (!this.validation) return true;\n\t\treturn validateValue(this, this.value);\n\t}\n\n\ttoString() { return this.address }\n\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DateFilterGroups, DateFilterType } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* The time a value of a date column compares by: a Date, a serial date (the value of a date cell) or a text (an ISO
|
|
4
|
+
* date, a typed time); a time (type tm) by its time of day on the day of the serial date 0. Null for no value or a
|
|
5
|
+
* text that is none.
|
|
6
|
+
*/
|
|
7
|
+
export declare const toDateFilterTime: (v: unknown, type: DateFilterType) => number | null;
|
|
8
|
+
/**
|
|
9
|
+
* Parses a date filter expression into a disjunction of conjunctions of bounds (OR groups, each an AND-combined
|
|
10
|
+
* list of `>=` and `<` bounds, see {@link DateFilterGroups}). A literal means the interval it names, to the precision
|
|
11
|
+
* it is written in: a day (`6.11.2026`), a month (`11.2026`, `2026-11`), a year (`2026`), a day with a time of day
|
|
12
|
+
* (`6.11.2026 14:00`, a minute; `6.11.2026 14:00:30`, a second), a time of day alone for a time column (`9:05`).
|
|
13
|
+
*
|
|
14
|
+
* Supported syntax:
|
|
15
|
+
* - a bare literal, matched as the whole interval: `6.11.2026` is the whole day
|
|
16
|
+
* - operators `>`, `>=`, `<`, `<=`, `=`/`==`, `!=`/`<>` followed by a literal: `> 6.11.2026` starts the day after,
|
|
17
|
+
* `<= 6.11.2026` reaches to the end of the day
|
|
18
|
+
* - a range `a..b`, from the start of `a` to the end of `b`: `6.11.2026..20.11.2026`, `9:00..17:00`
|
|
19
|
+
* - `and` / `or` connectors (case-insensitive); without one, two bare literals are an OR (a list of days), a
|
|
20
|
+
* comparison narrows (AND)
|
|
21
|
+
*
|
|
22
|
+
* The dates are read in the format of the current locale, an ISO date in any. A literal that is no date or time, or
|
|
23
|
+
* not one of the column type (a day in a time column), makes its unit match nothing. Null when the expression holds
|
|
24
|
+
* no unit at all: the text is no date expression.
|
|
25
|
+
*/
|
|
26
|
+
export declare const parseDateExpression: (input: string, type: DateFilterType) => DateFilterGroups | null;
|
|
27
|
+
export declare const createDateMatcher: <TItem>(groups: DateFilterGroups, property: keyof TItem, type: DateFilterType) => (item: TItem) => boolean;
|
|
28
|
+
//# sourceMappingURL=dateFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateFilter.d.ts","sourceRoot":"","sources":["../../src/model/dateFilter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE7E;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,GAAG,OAAO,EAAE,MAAM,cAAc,KAAG,MAAM,GAAG,IAQ5E,CAAC;AAgIF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,EAAE,MAAM,cAAc,KAAG,gBAAgB,GAAC,IAoD1F,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,KAAK,EAAE,QAAQ,gBAAgB,EAAE,UAAU,MAAM,KAAK,EAAE,MAAM,cAAc,MAGrG,MAAM,KAAK,YAKnB,CAAC"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { dates, utils } from "@omegagrid/core";
|
|
2
|
+
import { getLocale } from "@omegagrid/localize";
|
|
3
|
+
import { addDays, addMilliseconds, addMinutes, addMonths, addSeconds, addYears } from "date-fns";
|
|
4
|
+
/**
|
|
5
|
+
* The time a value of a date column compares by: a Date, a serial date (the value of a date cell) or a text (an ISO
|
|
6
|
+
* date, a typed time); a time (type tm) by its time of day on the day of the serial date 0. Null for no value or a
|
|
7
|
+
* text that is none.
|
|
8
|
+
*/
|
|
9
|
+
export const toDateFilterTime = (v, type) => {
|
|
10
|
+
if (v == null || v === '')
|
|
11
|
+
return null;
|
|
12
|
+
let date;
|
|
13
|
+
if (v instanceof Date)
|
|
14
|
+
date = v;
|
|
15
|
+
else if (utils.isNumber(v))
|
|
16
|
+
date = dates.serialDateToDateTime(v);
|
|
17
|
+
else
|
|
18
|
+
date = type === 'tm' ? dates.parseTime(String(v), getLocale()) : dates.parseDateTime(String(v), getLocale());
|
|
19
|
+
if (!date || Number.isNaN(date.getTime()))
|
|
20
|
+
return null;
|
|
21
|
+
return type === 'tm' ? dates.timeOfDay(date).getTime() : date.getTime();
|
|
22
|
+
};
|
|
23
|
+
// a date: two or three numbers with a dot, slash or dash between them ('6.11.2026', '6. 11. 2026', '11/6/2026',
|
|
24
|
+
// '2026-11-06', '11.2026', '2026-11'); the parts are read by their format later
|
|
25
|
+
const DATE_TOKEN = '\\d{1,4}\\s*[./-]\\s*\\d{1,4}(?:\\s*[./-]\\s*\\d{1,4})?';
|
|
26
|
+
// a time of day: hours and minutes, optional seconds with an optional fraction
|
|
27
|
+
const TIME_TOKEN = '\\d{1,2}:\\d{1,2}(?::\\d{1,2}(?:[.,]\\d+)?)?';
|
|
28
|
+
const tokenize = (input) => {
|
|
29
|
+
// the 'T' of an ISO date and time ('2026-11-06T14:00') separates them the way a space does
|
|
30
|
+
input = input.replace(/(\d)T(\d)/g, '$1 $2');
|
|
31
|
+
const re = new RegExp(`(\\.\\.)` + // 1 range
|
|
32
|
+
`|(>=|<=|<>|!=|==|=|>|<)` + // 2 comparison operator
|
|
33
|
+
`|\\b(and|or)\\b` + // 3 connector
|
|
34
|
+
`|(${DATE_TOKEN})` + // 4 date
|
|
35
|
+
`|(${TIME_TOKEN})` + // 5 time
|
|
36
|
+
`|(?<!\\d|\\d[.:/-])(\\d{4})(?!\\d|[.:/-]\\d)`, // 6 year (not a part of a date; '2026..2027' are two years)
|
|
37
|
+
'gi');
|
|
38
|
+
const tokens = [];
|
|
39
|
+
let m;
|
|
40
|
+
while ((m = re.exec(input)) !== null) {
|
|
41
|
+
if (m[1] != null)
|
|
42
|
+
tokens.push({ kind: 'range' });
|
|
43
|
+
else if (m[2] != null) {
|
|
44
|
+
const op = m[2] === '==' ? '=' : m[2] === '<>' ? '!=' : m[2];
|
|
45
|
+
tokens.push({ kind: 'op', op: op });
|
|
46
|
+
}
|
|
47
|
+
else if (m[3] != null)
|
|
48
|
+
tokens.push({ kind: 'connector', connector: m[3].toLowerCase() });
|
|
49
|
+
else if (m[4] != null)
|
|
50
|
+
tokens.push({ kind: 'literal', literal: { date: m[4] } });
|
|
51
|
+
else if (m[5] != null) {
|
|
52
|
+
// a time right after a date belongs to it ('6.11.2026 14:00')
|
|
53
|
+
const last = tokens[tokens.length - 1];
|
|
54
|
+
if (last?.kind === 'literal' && last.literal.date && !last.literal.time)
|
|
55
|
+
last.literal.time = m[5];
|
|
56
|
+
else
|
|
57
|
+
tokens.push({ kind: 'literal', literal: { time: m[5] } });
|
|
58
|
+
}
|
|
59
|
+
else if (m[6] != null)
|
|
60
|
+
tokens.push({ kind: 'literal', literal: { year: m[6] } });
|
|
61
|
+
}
|
|
62
|
+
return tokens;
|
|
63
|
+
};
|
|
64
|
+
const MONTH_FIRST = /^(\d{1,2})\s*[./]\s*(\d{4})$/; // '11.2026', '11/2026'
|
|
65
|
+
const YEAR_FIRST = /^(\d{4})\s*[-/.]\s*(\d{1,2})$/; // '2026-11', '2026/11'
|
|
66
|
+
const monthInterval = (year, month) => {
|
|
67
|
+
if (month < 1 || month > 12)
|
|
68
|
+
return null;
|
|
69
|
+
const start = new Date(year, month - 1, 1);
|
|
70
|
+
return { start, end: addMonths(start, 1) };
|
|
71
|
+
};
|
|
72
|
+
// the interval of a time of day by the precision it is written in: a minute, a second or a millisecond
|
|
73
|
+
const timePrecisionEnd = (start, time) => {
|
|
74
|
+
const parts = time.split(':');
|
|
75
|
+
if (parts.length < 3)
|
|
76
|
+
return addMinutes(start, 1);
|
|
77
|
+
return /[.,]/.test(parts[2]) ? addMilliseconds(start, 1) : addSeconds(start, 1);
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* The interval a literal names for a column type: a year, a month, a day, or a time of day to the precision it is
|
|
81
|
+
* written in. A time of day on its own counts for a time column only, a day or a longer span for a date column only.
|
|
82
|
+
* Null when the literal is no date or time, or not one of the type.
|
|
83
|
+
*/
|
|
84
|
+
const literalInterval = (literal, type) => {
|
|
85
|
+
const locale = getLocale();
|
|
86
|
+
if (type === 'tm') {
|
|
87
|
+
// a time of day, also the time of day of a date and time
|
|
88
|
+
const text = literal.time ? (literal.date ? `${literal.date} ${literal.time}` : literal.time) : null;
|
|
89
|
+
if (!text)
|
|
90
|
+
return null;
|
|
91
|
+
const start = dates.parseTime(text, locale);
|
|
92
|
+
return start ? { start, end: timePrecisionEnd(start, literal.time) } : null;
|
|
93
|
+
}
|
|
94
|
+
if (literal.year) {
|
|
95
|
+
const start = new Date(Number(literal.year), 0, 1);
|
|
96
|
+
return { start, end: addYears(start, 1) };
|
|
97
|
+
}
|
|
98
|
+
if (!literal.date)
|
|
99
|
+
return null;
|
|
100
|
+
const monthFirst = MONTH_FIRST.exec(literal.date);
|
|
101
|
+
if (monthFirst)
|
|
102
|
+
return monthInterval(Number(monthFirst[2]), Number(monthFirst[1]));
|
|
103
|
+
const yearFirst = YEAR_FIRST.exec(literal.date);
|
|
104
|
+
if (yearFirst)
|
|
105
|
+
return monthInterval(Number(yearFirst[1]), Number(yearFirst[2]));
|
|
106
|
+
const start = dates.parseDateTime(literal.time ? `${literal.date} ${literal.time}` : literal.date, locale);
|
|
107
|
+
if (!start)
|
|
108
|
+
return null;
|
|
109
|
+
return { start, end: literal.time ? timePrecisionEnd(start, literal.time) : addDays(start, 1) };
|
|
110
|
+
};
|
|
111
|
+
const NOTHING = [];
|
|
112
|
+
// a literal means the interval it names: '= day' is the whole day, '> day' starts the day after
|
|
113
|
+
const compareUnit = (op, interval) => {
|
|
114
|
+
const exact = op.op === '=';
|
|
115
|
+
if (!interval)
|
|
116
|
+
return { groups: NOTHING, exact };
|
|
117
|
+
const { start, end } = interval;
|
|
118
|
+
switch (op.op) {
|
|
119
|
+
case '=': return { groups: [[{ op: '>=', value: start }, { op: '<', value: end }]], exact };
|
|
120
|
+
case '!=': return { groups: [[{ op: '<', value: start }], [{ op: '>=', value: end }]], exact };
|
|
121
|
+
case '>': return { groups: [[{ op: '>=', value: end }]], exact };
|
|
122
|
+
case '>=': return { groups: [[{ op: '>=', value: start }]], exact };
|
|
123
|
+
case '<': return { groups: [[{ op: '<', value: start }]], exact };
|
|
124
|
+
case '<=': return { groups: [[{ op: '<', value: end }]], exact };
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
const rangeUnit = (from, to) => {
|
|
128
|
+
if (!from || !to)
|
|
129
|
+
return { groups: NOTHING, exact: false };
|
|
130
|
+
return { groups: [[{ op: '>=', value: from.start }, { op: '<', value: to.end }]], exact: false };
|
|
131
|
+
};
|
|
132
|
+
// the AND of two expressions in their OR groups: every group of one with every group of the other
|
|
133
|
+
const andGroups = (a, b) => {
|
|
134
|
+
const result = [];
|
|
135
|
+
a.forEach(ga => b.forEach(gb => result.push([...ga, ...gb])));
|
|
136
|
+
return result;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Parses a date filter expression into a disjunction of conjunctions of bounds (OR groups, each an AND-combined
|
|
140
|
+
* list of `>=` and `<` bounds, see {@link DateFilterGroups}). A literal means the interval it names, to the precision
|
|
141
|
+
* it is written in: a day (`6.11.2026`), a month (`11.2026`, `2026-11`), a year (`2026`), a day with a time of day
|
|
142
|
+
* (`6.11.2026 14:00`, a minute; `6.11.2026 14:00:30`, a second), a time of day alone for a time column (`9:05`).
|
|
143
|
+
*
|
|
144
|
+
* Supported syntax:
|
|
145
|
+
* - a bare literal, matched as the whole interval: `6.11.2026` is the whole day
|
|
146
|
+
* - operators `>`, `>=`, `<`, `<=`, `=`/`==`, `!=`/`<>` followed by a literal: `> 6.11.2026` starts the day after,
|
|
147
|
+
* `<= 6.11.2026` reaches to the end of the day
|
|
148
|
+
* - a range `a..b`, from the start of `a` to the end of `b`: `6.11.2026..20.11.2026`, `9:00..17:00`
|
|
149
|
+
* - `and` / `or` connectors (case-insensitive); without one, two bare literals are an OR (a list of days), a
|
|
150
|
+
* comparison narrows (AND)
|
|
151
|
+
*
|
|
152
|
+
* The dates are read in the format of the current locale, an ISO date in any. A literal that is no date or time, or
|
|
153
|
+
* not one of the column type (a day in a time column), makes its unit match nothing. Null when the expression holds
|
|
154
|
+
* no unit at all: the text is no date expression.
|
|
155
|
+
*/
|
|
156
|
+
export const parseDateExpression = (input, type) => {
|
|
157
|
+
const tokens = tokenize(input ?? '');
|
|
158
|
+
const units = [];
|
|
159
|
+
let pending = null;
|
|
160
|
+
const interval = (i) => {
|
|
161
|
+
const t = tokens[i];
|
|
162
|
+
return t?.kind === 'literal' ? literalInterval(t.literal, type) : null;
|
|
163
|
+
};
|
|
164
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
165
|
+
const t = tokens[i];
|
|
166
|
+
if (t.kind === 'connector') {
|
|
167
|
+
pending = t.connector;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
let unit = null;
|
|
171
|
+
if (t.kind === 'op') {
|
|
172
|
+
if (tokens[i + 1]?.kind !== 'literal')
|
|
173
|
+
continue; // an operator without a value is skipped
|
|
174
|
+
unit = compareUnit(t, interval(i + 1));
|
|
175
|
+
i += 1;
|
|
176
|
+
}
|
|
177
|
+
else if (t.kind === 'literal') {
|
|
178
|
+
if (tokens[i + 1]?.kind === 'range') {
|
|
179
|
+
unit = rangeUnit(interval(i), tokens[i + 2]?.kind === 'literal' ? interval(i + 2) : null);
|
|
180
|
+
i += 2;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
unit = compareUnit({ kind: 'op', op: '=' }, interval(i));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
continue; // a stray range operator
|
|
188
|
+
}
|
|
189
|
+
units.push({ unit, connector: pending });
|
|
190
|
+
pending = null;
|
|
191
|
+
}
|
|
192
|
+
if (units.length === 0)
|
|
193
|
+
return null;
|
|
194
|
+
// an explicit connector, otherwise OR between two bare literals (a list of days) and AND elsewhere
|
|
195
|
+
const groups = [];
|
|
196
|
+
let current = units[0].unit.groups;
|
|
197
|
+
for (let i = 1; i < units.length; i++) {
|
|
198
|
+
const { unit, connector } = units[i];
|
|
199
|
+
const implicit = units[i - 1].unit.exact && unit.exact ? 'or' : 'and';
|
|
200
|
+
if ((connector ?? implicit) === 'or') {
|
|
201
|
+
groups.push(...current);
|
|
202
|
+
current = unit.groups;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
current = andGroups(current, unit.groups);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
groups.push(...current);
|
|
209
|
+
return groups;
|
|
210
|
+
};
|
|
211
|
+
export const createDateMatcher = (groups, property, type) => {
|
|
212
|
+
// the bounds compare by their times: a time of day lies on the day of the serial date 0 the way the values do
|
|
213
|
+
const bounds = groups.map(group => group.map(b => ({ op: b.op, time: b.value.getTime() })));
|
|
214
|
+
return (item) => {
|
|
215
|
+
const v = toDateFilterTime(item[property], type);
|
|
216
|
+
if (v === null)
|
|
217
|
+
return false;
|
|
218
|
+
return bounds.some(group => group.every(b => b.op === '>=' ? v >= b.time : v < b.time));
|
|
219
|
+
};
|
|
220
|
+
};
|
|
221
|
+
//# sourceMappingURL=dateFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateFilter.js","sourceRoot":"","sources":["../../src/model/dateFilter.ts"],"names":[],"mappings":"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","sourcesContent":["import { dates, utils } from \"@omegagrid/core\";\nimport { getLocale } from \"@omegagrid/localize\";\nimport { addDays, addMilliseconds, addMinutes, addMonths, addSeconds, addYears } from \"date-fns\";\nimport { DateFilterBound, DateFilterGroups, DateFilterType } from \"../types\";\n\n/**\n * The time a value of a date column compares by: a Date, a serial date (the value of a date cell) or a text (an ISO\n * date, a typed time); a time (type tm) by its time of day on the day of the serial date 0. Null for no value or a\n * text that is none.\n */\nexport const toDateFilterTime = (v: unknown, type: DateFilterType): number | null => {\n\tif (v == null || v === '') return null;\n\tlet date: Date|null;\n\tif (v instanceof Date) date = v;\n\telse if (utils.isNumber(v)) date = dates.serialDateToDateTime(v as number);\n\telse date = type === 'tm' ? dates.parseTime(String(v), getLocale()) : dates.parseDateTime(String(v), getLocale());\n\tif (!date || Number.isNaN(date.getTime())) return null;\n\treturn type === 'tm' ? dates.timeOfDay(date).getTime() : date.getTime();\n};\n\n/** The interval a date literal names: from its start to its end, the end excluded */\ntype Interval = { start: Date, end: Date };\n\ntype Literal = { date?: string, time?: string, year?: string };\n\ntype Token =\n\t| { kind: 'range' }\n\t| { kind: 'op', op: '=' | '!=' | '<' | '<=' | '>' | '>=' }\n\t| { kind: 'connector', connector: 'and' | 'or' }\n\t| { kind: 'literal', literal: Literal };\n\n// a date: two or three numbers with a dot, slash or dash between them ('6.11.2026', '6. 11. 2026', '11/6/2026',\n// '2026-11-06', '11.2026', '2026-11'); the parts are read by their format later\nconst DATE_TOKEN = '\\\\d{1,4}\\\\s*[./-]\\\\s*\\\\d{1,4}(?:\\\\s*[./-]\\\\s*\\\\d{1,4})?';\n// a time of day: hours and minutes, optional seconds with an optional fraction\nconst TIME_TOKEN = '\\\\d{1,2}:\\\\d{1,2}(?::\\\\d{1,2}(?:[.,]\\\\d+)?)?';\n\nconst tokenize = (input: string): Token[] => {\n\t// the 'T' of an ISO date and time ('2026-11-06T14:00') separates them the way a space does\n\tinput = input.replace(/(\\d)T(\\d)/g, '$1 $2');\n\tconst re = new RegExp(\n\t\t`(\\\\.\\\\.)` + // 1 range\n\t\t`|(>=|<=|<>|!=|==|=|>|<)` + // 2 comparison operator\n\t\t`|\\\\b(and|or)\\\\b` + // 3 connector\n\t\t`|(${DATE_TOKEN})` + // 4 date\n\t\t`|(${TIME_TOKEN})` + // 5 time\n\t\t`|(?<!\\\\d|\\\\d[.:/-])(\\\\d{4})(?!\\\\d|[.:/-]\\\\d)`, // 6 year (not a part of a date; '2026..2027' are two years)\n\t\t'gi'\n\t);\n\tconst tokens: Token[] = [];\n\tlet m: RegExpExecArray | null;\n\twhile ((m = re.exec(input)) !== null) {\n\t\tif (m[1] != null) tokens.push({ kind: 'range' });\n\t\telse if (m[2] != null) {\n\t\t\tconst op = m[2] === '==' ? '=' : m[2] === '<>' ? '!=' : m[2];\n\t\t\ttokens.push({ kind: 'op', op: op as '=' | '!=' | '<' | '<=' | '>' | '>=' });\n\t\t}\n\t\telse if (m[3] != null) tokens.push({ kind: 'connector', connector: m[3].toLowerCase() as 'and' | 'or' });\n\t\telse if (m[4] != null) tokens.push({ kind: 'literal', literal: { date: m[4] } });\n\t\telse if (m[5] != null) {\n\t\t\t// a time right after a date belongs to it ('6.11.2026 14:00')\n\t\t\tconst last = tokens[tokens.length - 1];\n\t\t\tif (last?.kind === 'literal' && last.literal.date && !last.literal.time) last.literal.time = m[5];\n\t\t\telse tokens.push({ kind: 'literal', literal: { time: m[5] } });\n\t\t}\n\t\telse if (m[6] != null) tokens.push({ kind: 'literal', literal: { year: m[6] } });\n\t}\n\treturn tokens;\n};\n\nconst MONTH_FIRST = /^(\\d{1,2})\\s*[./]\\s*(\\d{4})$/; // '11.2026', '11/2026'\nconst YEAR_FIRST = /^(\\d{4})\\s*[-/.]\\s*(\\d{1,2})$/; // '2026-11', '2026/11'\n\nconst monthInterval = (year: number, month: number): Interval|null => {\n\tif (month < 1 || month > 12) return null;\n\tconst start = new Date(year, month - 1, 1);\n\treturn { start, end: addMonths(start, 1) };\n};\n\n// the interval of a time of day by the precision it is written in: a minute, a second or a millisecond\nconst timePrecisionEnd = (start: Date, time: string) => {\n\tconst parts = time.split(':');\n\tif (parts.length < 3) return addMinutes(start, 1);\n\treturn /[.,]/.test(parts[2]) ? addMilliseconds(start, 1) : addSeconds(start, 1);\n};\n\n/**\n * The interval a literal names for a column type: a year, a month, a day, or a time of day to the precision it is\n * written in. A time of day on its own counts for a time column only, a day or a longer span for a date column only.\n * Null when the literal is no date or time, or not one of the type.\n */\nconst literalInterval = (literal: Literal, type: DateFilterType): Interval|null => {\n\tconst locale = getLocale();\n\tif (type === 'tm') {\n\t\t// a time of day, also the time of day of a date and time\n\t\tconst text = literal.time ? (literal.date ? `${literal.date} ${literal.time}` : literal.time) : null;\n\t\tif (!text) return null;\n\t\tconst start = dates.parseTime(text, locale);\n\t\treturn start ? { start, end: timePrecisionEnd(start, literal.time) } : null;\n\t}\n\tif (literal.year) {\n\t\tconst start = new Date(Number(literal.year), 0, 1);\n\t\treturn { start, end: addYears(start, 1) };\n\t}\n\tif (!literal.date) return null;\n\tconst monthFirst = MONTH_FIRST.exec(literal.date);\n\tif (monthFirst) return monthInterval(Number(monthFirst[2]), Number(monthFirst[1]));\n\tconst yearFirst = YEAR_FIRST.exec(literal.date);\n\tif (yearFirst) return monthInterval(Number(yearFirst[1]), Number(yearFirst[2]));\n\tconst start = dates.parseDateTime(literal.time ? `${literal.date} ${literal.time}` : literal.date, locale);\n\tif (!start) return null;\n\treturn { start, end: literal.time ? timePrecisionEnd(start, literal.time) : addDays(start, 1) };\n};\n\n/** A unit of the expression: a comparison or a range, as OR groups of its bounds; no group matches nothing */\ntype Unit = { groups: DateFilterGroups, exact: boolean };\n\nconst NOTHING: DateFilterGroups = [];\n\n// a literal means the interval it names: '= day' is the whole day, '> day' starts the day after\nconst compareUnit = (op: Token & { kind: 'op' }, interval: Interval|null): Unit => {\n\tconst exact = op.op === '=';\n\tif (!interval) return { groups: NOTHING, exact };\n\tconst { start, end } = interval;\n\tswitch (op.op) {\n\t\tcase '=': return { groups: [[{ op: '>=', value: start }, { op: '<', value: end }]], exact };\n\t\tcase '!=': return { groups: [[{ op: '<', value: start }], [{ op: '>=', value: end }]], exact };\n\t\tcase '>': return { groups: [[{ op: '>=', value: end }]], exact };\n\t\tcase '>=': return { groups: [[{ op: '>=', value: start }]], exact };\n\t\tcase '<': return { groups: [[{ op: '<', value: start }]], exact };\n\t\tcase '<=': return { groups: [[{ op: '<', value: end }]], exact };\n\t}\n};\n\nconst rangeUnit = (from: Interval|null, to: Interval|null): Unit => {\n\tif (!from || !to) return { groups: NOTHING, exact: false };\n\treturn { groups: [[{ op: '>=', value: from.start }, { op: '<', value: to.end }]], exact: false };\n};\n\n// the AND of two expressions in their OR groups: every group of one with every group of the other\nconst andGroups = (a: DateFilterGroups, b: DateFilterGroups): DateFilterGroups => {\n\tconst result: DateFilterBound[][] = [];\n\ta.forEach(ga => b.forEach(gb => result.push([...ga, ...gb])));\n\treturn result;\n};\n\n/**\n * Parses a date filter expression into a disjunction of conjunctions of bounds (OR groups, each an AND-combined\n * list of `>=` and `<` bounds, see {@link DateFilterGroups}). A literal means the interval it names, to the precision\n * it is written in: a day (`6.11.2026`), a month (`11.2026`, `2026-11`), a year (`2026`), a day with a time of day\n * (`6.11.2026 14:00`, a minute; `6.11.2026 14:00:30`, a second), a time of day alone for a time column (`9:05`).\n *\n * Supported syntax:\n * - a bare literal, matched as the whole interval: `6.11.2026` is the whole day\n * - operators `>`, `>=`, `<`, `<=`, `=`/`==`, `!=`/`<>` followed by a literal: `> 6.11.2026` starts the day after,\n * `<= 6.11.2026` reaches to the end of the day\n * - a range `a..b`, from the start of `a` to the end of `b`: `6.11.2026..20.11.2026`, `9:00..17:00`\n * - `and` / `or` connectors (case-insensitive); without one, two bare literals are an OR (a list of days), a\n * comparison narrows (AND)\n *\n * The dates are read in the format of the current locale, an ISO date in any. A literal that is no date or time, or\n * not one of the column type (a day in a time column), makes its unit match nothing. Null when the expression holds\n * no unit at all: the text is no date expression.\n */\nexport const parseDateExpression = (input: string, type: DateFilterType): DateFilterGroups|null => {\n\tconst tokens = tokenize(input ?? '');\n\tconst units: { unit: Unit, connector: 'and' | 'or' | null }[] = [];\n\tlet pending: 'and' | 'or' | null = null;\n\n\tconst interval = (i: number) => {\n\t\tconst t = tokens[i];\n\t\treturn t?.kind === 'literal' ? literalInterval(t.literal, type) : null;\n\t};\n\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tconst t = tokens[i];\n\t\tif (t.kind === 'connector') {\n\t\t\tpending = t.connector;\n\t\t\tcontinue;\n\t\t}\n\t\tlet unit: Unit|null = null;\n\t\tif (t.kind === 'op') {\n\t\t\tif (tokens[i + 1]?.kind !== 'literal') continue; // an operator without a value is skipped\n\t\t\tunit = compareUnit(t, interval(i + 1));\n\t\t\ti += 1;\n\t\t} else if (t.kind === 'literal') {\n\t\t\tif (tokens[i + 1]?.kind === 'range') {\n\t\t\t\tunit = rangeUnit(interval(i), tokens[i + 2]?.kind === 'literal' ? interval(i + 2) : null);\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\tunit = compareUnit({ kind: 'op', op: '=' }, interval(i));\n\t\t\t}\n\t\t} else {\n\t\t\tcontinue; // a stray range operator\n\t\t}\n\t\tunits.push({ unit, connector: pending });\n\t\tpending = null;\n\t}\n\n\tif (units.length === 0) return null;\n\n\t// an explicit connector, otherwise OR between two bare literals (a list of days) and AND elsewhere\n\tconst groups: DateFilterGroups = [];\n\tlet current: DateFilterGroups = units[0].unit.groups;\n\tfor (let i = 1; i < units.length; i++) {\n\t\tconst { unit, connector } = units[i];\n\t\tconst implicit = units[i - 1].unit.exact && unit.exact ? 'or' : 'and';\n\t\tif ((connector ?? implicit) === 'or') {\n\t\t\tgroups.push(...current);\n\t\t\tcurrent = unit.groups;\n\t\t} else {\n\t\t\tcurrent = andGroups(current, unit.groups);\n\t\t}\n\t}\n\tgroups.push(...current);\n\treturn groups;\n};\n\nexport const createDateMatcher = <TItem>(groups: DateFilterGroups, property: keyof TItem, type: DateFilterType) => {\n\t// the bounds compare by their times: a time of day lies on the day of the serial date 0 the way the values do\n\tconst bounds = groups.map(group => group.map(b => ({ op: b.op, time: b.value.getTime() })));\n\treturn (item: TItem) => {\n\t\tconst v = toDateFilterTime(item[property], type);\n\t\tif (v === null) return false;\n\t\treturn bounds.some(group => group.every(b => b.op === '>=' ? v >= b.time : v < b.time));\n\t};\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { KeyValue } from "@omegagrid/core";
|
|
2
2
|
import { CellModel } from "./cellModel";
|
|
3
3
|
import { GridModel } from "./gridModel";
|
|
4
|
-
import { CellType,
|
|
4
|
+
import { CellType, FilterValue, NumericFilterGroups } from "../types";
|
|
5
5
|
export type FilterMatcher = (cell: CellModel) => boolean;
|
|
6
6
|
export type FilterSettings = {
|
|
7
7
|
c: number;
|
|
@@ -11,9 +11,6 @@ export declare const createTextMatcher: <TItem>(term: string, property: keyof TI
|
|
|
11
11
|
export declare const createBoolMatcher: <TItem>(term: boolean, property: keyof TItem) => (item: TItem) => boolean;
|
|
12
12
|
export declare const createMultiMatcher: <TItem>(term: KeyValue[], property: keyof TItem) => (item: TItem) => boolean;
|
|
13
13
|
export declare const createMultiMultiMatcher: <TItem>(_term: KeyValue[], _property: keyof TItem) => (_item: TItem) => boolean;
|
|
14
|
-
export declare const isFilterRange: (term: FilterValue) => term is FilterRange;
|
|
15
|
-
export declare const isFilterRangeEmpty: (term: FilterRange) => boolean;
|
|
16
|
-
export declare const createRangeMatcher: <TItem>(term: FilterRange, property: keyof TItem, type: "d" | "dt" | "tm") => (item: TItem) => boolean;
|
|
17
14
|
/** True when the whole (trimmed) input is a single bare number, e.g. `42`, `-3.5`, `1,5`. */
|
|
18
15
|
export declare const isSingleNumber: (input: string) => boolean;
|
|
19
16
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterModel.d.ts","sourceRoot":"","sources":["../../src/model/filterModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoB,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"filterModel.d.ts","sourceRoot":"","sources":["../../src/model/filterModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoB,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAuB,mBAAmB,EAAyB,MAAM,UAAU,CAAC;AAElH,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,WAAW,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,KAAK,EAAE,MAAM,MAAM,EAAE,UAAU,MAAM,KAAK,MAEnE,MAAM,KAAK,YAInB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,KAAK,EAAE,MAAM,OAAO,EAAE,UAAU,MAAM,KAAK,MACpE,MAAM,KAAK,YACnB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,KAAK,EAAE,MAAM,QAAQ,EAAE,EAAE,UAAU,MAAM,KAAK,MAExE,MAAM,KAAK,YAGnB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,KAAK,EAAE,OAAO,QAAQ,EAAE,EAAE,WAAW,MAAM,KAAK,MAC/E,OAAO,KAAK,YACpB,CAAC;AAMF,6FAA6F;AAC7F,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,YAAoD,CAAC;AAEjG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,MAAM,KAAG,mBA8CtD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,KAAK,EAAE,QAAQ,mBAAmB,EAAE,UAAU,MAAM,KAAK,MAWrF,MAAM,KAAK,YASnB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,QAAQ,EAAE,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,iCAsB7F,CAAA;AAED,qBAAa,WAAY,SAAQ,KAAK;;CAIrC;AAED,qBAAa,WAAY,SAAQ,WAAW;aAkB1B,KAAK,EAAE,SAAS;IAhB1B,MAAM,UAAS;IAEtB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,SAAS,CAAwB;IACzC,IAAI,QAAQ,IACI,cAAc,EAAE,GAAC,IAAI,CADG;IACxC,IAAI,QAAQ,CAAC,CAAC,EAAE,cAAc,EAAE,GAAC,IAAI,EAQpC;gBAGgB,KAAK,EAAE,SAAS,EAChC,QAAQ,GAAE,cAAc,EAAE,GAAC,IAAW;IAMvC;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,MAAM;IAIb;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,MAAM,UAAQ;IAUlD,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,UAAO;IA6BnD,WAAW,CAAC,aAAa,UAAO;IAoDhC,WAAW,CAAC,aAAa,UAAO;IAOhC,OAAO,CAAC,YAAY;CAKpB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { log, tree, utils } from "@omegagrid/core";
|
|
2
|
+
import { createDateMatcher, parseDateExpression } from "./dateFilter";
|
|
2
3
|
export const createTextMatcher = (term, property) => {
|
|
3
4
|
const regex = new RegExp(`${utils.escapeRegExp(utils.removeAccents(term))}`, 'ig');
|
|
4
5
|
return (item) => {
|
|
@@ -18,34 +19,6 @@ export const createMultiMatcher = (term, property) => {
|
|
|
18
19
|
export const createMultiMultiMatcher = (_term, _property) => {
|
|
19
20
|
return (_item) => false;
|
|
20
21
|
};
|
|
21
|
-
export const isFilterRange = (term) => !!term && typeof term === 'object' && !Array.isArray(term) && term.kind === 'range';
|
|
22
|
-
export const isFilterRangeEmpty = (term) => (term.from == null || term.from === '') && (term.to == null || term.to === '');
|
|
23
|
-
export const createRangeMatcher = (term, property, type) => {
|
|
24
|
-
const toNum = (v) => {
|
|
25
|
-
if (v == null || v === '')
|
|
26
|
-
return null;
|
|
27
|
-
if (v instanceof Date)
|
|
28
|
-
return v.getTime();
|
|
29
|
-
const t = new Date(v).getTime();
|
|
30
|
-
return Number.isNaN(t) ? null : t;
|
|
31
|
-
};
|
|
32
|
-
const from = toNum(term.from);
|
|
33
|
-
let to = toNum(term.to);
|
|
34
|
-
// move to the end of the day for date types
|
|
35
|
-
// TODO: remove dt, when time picker is implemented
|
|
36
|
-
if (to !== null && (type === 'd' || type === 'dt'))
|
|
37
|
-
to += 24 * 60 * 60 * 1000 - 1;
|
|
38
|
-
return (item) => {
|
|
39
|
-
const v = toNum(item[property]);
|
|
40
|
-
if (v === null)
|
|
41
|
-
return false;
|
|
42
|
-
if (from !== null && v < from)
|
|
43
|
-
return false;
|
|
44
|
-
if (to !== null && v > to)
|
|
45
|
-
return false;
|
|
46
|
-
return true;
|
|
47
|
-
};
|
|
48
|
-
};
|
|
49
22
|
// number token: optional sign, digits, optional decimal part using '.' or ',' as separator
|
|
50
23
|
const NUM_TOKEN = '[-+]?\\d+(?:[.,]\\d+)?';
|
|
51
24
|
const toClauseNumber = (t) => Number(t.replace(',', '.'));
|
|
@@ -145,9 +118,12 @@ export const createNumericMatcher = (groups, property) => {
|
|
|
145
118
|
};
|
|
146
119
|
export const createCellMatcher = (type, term, property) => {
|
|
147
120
|
property = property ?? 'value';
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
121
|
+
if (type === 'd' || type === 'dt' || type === 'tm') {
|
|
122
|
+
// a date expression ('6.11.2026', '6.11.2026..20.11.2026', '> 11.2026'), a text that is none searches the shown text
|
|
123
|
+
const groups = parseDateExpression((term?.toString()) ?? '', type);
|
|
124
|
+
if (groups)
|
|
125
|
+
return createDateMatcher(groups, property, type);
|
|
126
|
+
return createTextMatcher((term?.toString()), 'formattedValue');
|
|
151
127
|
}
|
|
152
128
|
if (type === 'n') {
|
|
153
129
|
const str = (term?.toString()) ?? '';
|
|
@@ -167,12 +143,6 @@ export const createCellMatcher = (type, term, property) => {
|
|
|
167
143
|
return createTextMatcher((term?.toString()), 'formattedValue');
|
|
168
144
|
else if (type === 'm' && Array.isArray(term))
|
|
169
145
|
return createMultiMultiMatcher(term, property);
|
|
170
|
-
else if (type === 'd')
|
|
171
|
-
return createTextMatcher((term?.toString()), 'formattedValue');
|
|
172
|
-
else if (type === 'dt')
|
|
173
|
-
return createTextMatcher((term?.toString()), 'formattedValue');
|
|
174
|
-
else if (type === 'tm')
|
|
175
|
-
return createTextMatcher((term?.toString()), 'formattedValue');
|
|
176
146
|
// text search in the value must not see the quote prefix, a custom property is kept as is
|
|
177
147
|
return createTextMatcher((term?.toString()), property === 'value' ? 'plainValue' : property);
|
|
178
148
|
};
|
|
@@ -225,8 +195,7 @@ export class FilterModel extends EventTarget {
|
|
|
225
195
|
}
|
|
226
196
|
filter(filter, dispatchEvent = true) {
|
|
227
197
|
const filterSetting = this.get(filter.c);
|
|
228
|
-
const empty = filter.term === null || filter.term === ''
|
|
229
|
-
|| (isFilterRange(filter.term) && isFilterRangeEmpty(filter.term));
|
|
198
|
+
const empty = filter.term === null || filter.term === '';
|
|
230
199
|
if (filterSetting && empty) {
|
|
231
200
|
// remove; splice shifts the following slots, so the map must be rebuilt
|
|
232
201
|
this.settings.splice(this.colMap.get(filter.c), 1);
|