mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-07-30 18:27:45 -05:00
Feature: custom fields queries (#7761)
This commit is contained in:
127
src-ui/src/app/data/custom-field-query.ts
Normal file
127
src-ui/src/app/data/custom-field-query.ts
Normal file
@@ -0,0 +1,127 @@
|
||||
import { CustomFieldDataType } from './custom-field'
|
||||
|
||||
export enum CustomFieldQueryLogicalOperator {
|
||||
And = 'AND',
|
||||
Or = 'OR',
|
||||
Not = 'NOT',
|
||||
}
|
||||
|
||||
export enum CustomFieldQueryOperator {
|
||||
Exact = 'exact',
|
||||
In = 'in',
|
||||
IsNull = 'isnull',
|
||||
Exists = 'exists',
|
||||
Contains = 'contains',
|
||||
IContains = 'icontains',
|
||||
GreaterThan = 'gt',
|
||||
GreaterThanOrEqual = 'gte',
|
||||
LessThan = 'lt',
|
||||
LessThanOrEqual = 'lte',
|
||||
Range = 'range',
|
||||
}
|
||||
|
||||
export const CUSTOM_FIELD_QUERY_OPERATOR_LABELS = {
|
||||
[CustomFieldQueryOperator.Exact]: $localize`Equal to`,
|
||||
[CustomFieldQueryOperator.In]: $localize`In`,
|
||||
[CustomFieldQueryOperator.IsNull]: $localize`Is null`,
|
||||
[CustomFieldQueryOperator.Exists]: $localize`Exists`,
|
||||
[CustomFieldQueryOperator.Contains]: $localize`Contains`,
|
||||
[CustomFieldQueryOperator.IContains]: $localize`Contains (case-insensitive)`,
|
||||
[CustomFieldQueryOperator.GreaterThan]: $localize`Greater than`,
|
||||
[CustomFieldQueryOperator.GreaterThanOrEqual]: $localize`Greater than or equal to`,
|
||||
[CustomFieldQueryOperator.LessThan]: $localize`Less than`,
|
||||
[CustomFieldQueryOperator.LessThanOrEqual]: $localize`Less than or equal to`,
|
||||
[CustomFieldQueryOperator.Range]: $localize`Range`,
|
||||
}
|
||||
|
||||
export enum CustomFieldQueryOperatorGroups {
|
||||
Basic = 'basic',
|
||||
String = 'string',
|
||||
Arithmetic = 'arithmetic',
|
||||
Containment = 'containment',
|
||||
Subset = 'subset',
|
||||
Date = 'date',
|
||||
}
|
||||
|
||||
// Modified from filters.py > SUPPORTED_EXPR_OPERATORS
|
||||
export const CUSTOM_FIELD_QUERY_OPERATORS_BY_GROUP = {
|
||||
[CustomFieldQueryOperatorGroups.Basic]: [
|
||||
CustomFieldQueryOperator.Exists,
|
||||
CustomFieldQueryOperator.IsNull,
|
||||
CustomFieldQueryOperator.Exact,
|
||||
],
|
||||
[CustomFieldQueryOperatorGroups.String]: [CustomFieldQueryOperator.IContains],
|
||||
[CustomFieldQueryOperatorGroups.Arithmetic]: [
|
||||
CustomFieldQueryOperator.GreaterThan,
|
||||
CustomFieldQueryOperator.GreaterThanOrEqual,
|
||||
CustomFieldQueryOperator.LessThan,
|
||||
CustomFieldQueryOperator.LessThanOrEqual,
|
||||
],
|
||||
[CustomFieldQueryOperatorGroups.Containment]: [
|
||||
CustomFieldQueryOperator.Contains,
|
||||
],
|
||||
[CustomFieldQueryOperatorGroups.Subset]: [CustomFieldQueryOperator.In],
|
||||
[CustomFieldQueryOperatorGroups.Date]: [
|
||||
CustomFieldQueryOperator.GreaterThanOrEqual,
|
||||
CustomFieldQueryOperator.LessThanOrEqual,
|
||||
],
|
||||
}
|
||||
|
||||
// filters.py > SUPPORTED_EXPR_CATEGORIES
|
||||
export const CUSTOM_FIELD_QUERY_OPERATOR_GROUPS_BY_TYPE = {
|
||||
[CustomFieldDataType.String]: [
|
||||
CustomFieldQueryOperatorGroups.Basic,
|
||||
CustomFieldQueryOperatorGroups.String,
|
||||
],
|
||||
[CustomFieldDataType.Url]: [
|
||||
CustomFieldQueryOperatorGroups.Basic,
|
||||
CustomFieldQueryOperatorGroups.String,
|
||||
],
|
||||
[CustomFieldDataType.Date]: [
|
||||
CustomFieldQueryOperatorGroups.Basic,
|
||||
CustomFieldQueryOperatorGroups.Date,
|
||||
],
|
||||
[CustomFieldDataType.Boolean]: [CustomFieldQueryOperatorGroups.Basic],
|
||||
[CustomFieldDataType.Integer]: [
|
||||
CustomFieldQueryOperatorGroups.Basic,
|
||||
CustomFieldQueryOperatorGroups.Arithmetic,
|
||||
],
|
||||
[CustomFieldDataType.Float]: [
|
||||
CustomFieldQueryOperatorGroups.Basic,
|
||||
CustomFieldQueryOperatorGroups.Arithmetic,
|
||||
],
|
||||
[CustomFieldDataType.Monetary]: [
|
||||
CustomFieldQueryOperatorGroups.Basic,
|
||||
CustomFieldQueryOperatorGroups.String,
|
||||
CustomFieldQueryOperatorGroups.Arithmetic,
|
||||
],
|
||||
[CustomFieldDataType.DocumentLink]: [
|
||||
CustomFieldQueryOperatorGroups.Basic,
|
||||
CustomFieldQueryOperatorGroups.Containment,
|
||||
],
|
||||
[CustomFieldDataType.Select]: [
|
||||
CustomFieldQueryOperatorGroups.Basic,
|
||||
CustomFieldQueryOperatorGroups.Subset,
|
||||
],
|
||||
}
|
||||
|
||||
export const CUSTOM_FIELD_QUERY_VALUE_TYPES_BY_OPERATOR = {
|
||||
[CustomFieldQueryOperator.Exact]: 'string|boolean',
|
||||
[CustomFieldQueryOperator.IsNull]: 'boolean',
|
||||
[CustomFieldQueryOperator.Exists]: 'boolean',
|
||||
[CustomFieldQueryOperator.IContains]: 'string',
|
||||
[CustomFieldQueryOperator.GreaterThanOrEqual]: 'string|number',
|
||||
[CustomFieldQueryOperator.LessThanOrEqual]: 'string|number',
|
||||
[CustomFieldQueryOperator.GreaterThan]: 'number',
|
||||
[CustomFieldQueryOperator.LessThan]: 'number',
|
||||
[CustomFieldQueryOperator.Contains]: 'array',
|
||||
[CustomFieldQueryOperator.In]: 'array',
|
||||
}
|
||||
|
||||
export const CUSTOM_FIELD_QUERY_MAX_DEPTH = 4
|
||||
export const CUSTOM_FIELD_QUERY_MAX_ATOMS = 5
|
||||
|
||||
export enum CustomFieldQueryElementType {
|
||||
Atom = 'Atom',
|
||||
Expression = 'Expression',
|
||||
}
|
@@ -55,6 +55,8 @@ export const FILTER_HAS_CUSTOM_FIELDS_ANY = 39
|
||||
export const FILTER_DOES_NOT_HAVE_CUSTOM_FIELDS = 40
|
||||
export const FILTER_HAS_ANY_CUSTOM_FIELDS = 41
|
||||
|
||||
export const FILTER_CUSTOM_FIELDS_QUERY = 42
|
||||
|
||||
export const FILTER_RULE_TYPES: FilterRuleType[] = [
|
||||
{
|
||||
id: FILTER_TITLE,
|
||||
@@ -317,6 +319,12 @@ export const FILTER_RULE_TYPES: FilterRuleType[] = [
|
||||
multi: false,
|
||||
default: true,
|
||||
},
|
||||
{
|
||||
id: FILTER_CUSTOM_FIELDS_QUERY,
|
||||
filtervar: 'custom_field_query',
|
||||
datatype: 'string',
|
||||
multi: false,
|
||||
},
|
||||
]
|
||||
|
||||
export interface FilterRuleType {
|
||||
|
Reference in New Issue
Block a user