mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-18 22:00:31 +00:00
feat: services quick search.
This commit is contained in:
@@ -1,5 +1,3 @@
|
||||
import { IModel, IFilterRole } from 'interfaces';
|
||||
import { FIELD_TYPE } from './constants';
|
||||
|
||||
export default class DynamicFilterAbstructor {
|
||||
/**
|
||||
@@ -25,6 +23,11 @@ export default class DynamicFilterAbstructor {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Builds join queries of fields.
|
||||
* @param builder -
|
||||
* @param {string[]} fieldsRelations -
|
||||
*/
|
||||
private buildFieldsJoinQueries = (builder, fieldsRelations: string[]) => {
|
||||
fieldsRelations.forEach((fieldRelation) => {
|
||||
const relation = this.model.relationMappings[fieldRelation];
|
||||
@@ -38,7 +41,10 @@ export default class DynamicFilterAbstructor {
|
||||
});
|
||||
};
|
||||
|
||||
getModel() {
|
||||
/**
|
||||
* Retrieve the dynamic filter mode.
|
||||
*/
|
||||
protected getModel() {
|
||||
return this.model;
|
||||
}
|
||||
}
|
||||
|
||||
27
server/src/lib/DynamicFilter/DynamicFilterAdvancedFilter.ts
Normal file
27
server/src/lib/DynamicFilter/DynamicFilterAdvancedFilter.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import { IFilterRole } from 'interfaces';
|
||||
import DynamicFilterFilterRoles from './DynamicFilterFilterRoles';
|
||||
|
||||
export default class DynamicFilterAdvancedFilter extends DynamicFilterFilterRoles {
|
||||
private filterRoles: IFilterRole[];
|
||||
|
||||
/**
|
||||
* Constructor method.
|
||||
* @param {Array} filterRoles -
|
||||
* @param {Array} resourceFields -
|
||||
*/
|
||||
constructor(filterRoles: IFilterRole[]) {
|
||||
super();
|
||||
|
||||
this.filterRoles = filterRoles;
|
||||
this.setResponseMeta();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets response meta.
|
||||
*/
|
||||
private setResponseMeta() {
|
||||
this.responseMeta = {
|
||||
filterRoles: this.filterRoles,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -5,19 +5,10 @@ export default class FilterRoles extends DynamicFilterRoleAbstructor {
|
||||
private filterRoles: IFilterRole[];
|
||||
|
||||
/**
|
||||
* Constructor method.
|
||||
* @param {Array} filterRoles -
|
||||
* @param {Array} resourceFields -
|
||||
* On initialize filter roles.
|
||||
*/
|
||||
constructor(filterRoles: IFilterRole[]) {
|
||||
super();
|
||||
|
||||
this.filterRoles = filterRoles;
|
||||
|
||||
this.setResponseMeta();
|
||||
}
|
||||
|
||||
public onInitialize() {
|
||||
super.onInitialize();
|
||||
this.setFilterRolesRelations();
|
||||
}
|
||||
|
||||
@@ -27,7 +18,7 @@ export default class FilterRoles extends DynamicFilterRoleAbstructor {
|
||||
*/
|
||||
private buildLogicExpression(): string {
|
||||
let expression = '';
|
||||
|
||||
|
||||
this.filterRoles.forEach((role, index) => {
|
||||
expression +=
|
||||
index === 0 ? `${role.index} ` : `${role.condition} ${role.index} `;
|
||||
@@ -50,15 +41,6 @@ export default class FilterRoles extends DynamicFilterRoleAbstructor {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets response meta.
|
||||
*/
|
||||
private setResponseMeta() {
|
||||
this.responseMeta = {
|
||||
filterRoles: this.filterRoles,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets filter roles relations if field was relation type.
|
||||
*/
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import moment from 'moment';
|
||||
import * as R from 'ramda';
|
||||
import { IFilterRole, IDynamicFilter, IModel } from 'interfaces';
|
||||
import { Lexer } from 'lib/LogicEvaluation/Lexer';
|
||||
import Parser from 'lib/LogicEvaluation/Parser';
|
||||
@@ -63,6 +64,18 @@ export default abstract class DynamicFilterAbstructor
|
||||
return queryParser.parse();
|
||||
};
|
||||
|
||||
/**
|
||||
* Parses the logic expression to base expression.
|
||||
* @param {string} logicExpression -
|
||||
* @return {string}
|
||||
*/
|
||||
private parseLogicExpression(logicExpression: string): string {
|
||||
return R.compose(
|
||||
R.replace(/or|OR/g, '||'),
|
||||
R.replace(/and|AND/g, '&&'),
|
||||
)(logicExpression);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds filter query for query builder.
|
||||
* @param {String} tableName - Table name.
|
||||
@@ -74,8 +87,10 @@ export default abstract class DynamicFilterAbstructor
|
||||
roles: IFilterRole[],
|
||||
logicExpression: string
|
||||
) => {
|
||||
const basicExpression = this.parseLogicExpression(logicExpression);
|
||||
|
||||
return (builder) => {
|
||||
this.buildFilterRolesQuery(model, roles, logicExpression)(builder);
|
||||
this.buildFilterRolesQuery(model, roles, basicExpression)(builder);
|
||||
};
|
||||
};
|
||||
|
||||
@@ -347,11 +362,15 @@ export default abstract class DynamicFilterAbstructor
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieve the model.
|
||||
*/
|
||||
getModel() {
|
||||
return this.model;
|
||||
}
|
||||
|
||||
onInitialize() {
|
||||
|
||||
}
|
||||
/**
|
||||
* On initialize the registered dynamic filter.
|
||||
*/
|
||||
onInitialize() {}
|
||||
}
|
||||
|
||||
48
server/src/lib/DynamicFilter/DynamicFilterSearch.ts
Normal file
48
server/src/lib/DynamicFilter/DynamicFilterSearch.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { IFilterRole } from 'interfaces';
|
||||
import DynamicFilterFilterRoles from './DynamicFilterFilterRoles';
|
||||
|
||||
export default class DynamicFilterSearch extends DynamicFilterFilterRoles {
|
||||
private searchKeyword: string;
|
||||
private filterRoles: IFilterRole[];
|
||||
|
||||
/**
|
||||
* Constructor method.
|
||||
* @param {string} searchKeyword - Search keyword.
|
||||
*/
|
||||
constructor(searchKeyword: string) {
|
||||
super();
|
||||
this.searchKeyword = searchKeyword;
|
||||
}
|
||||
|
||||
/**
|
||||
* On initialize the dynamic filter.
|
||||
*/
|
||||
public onInitialize() {
|
||||
super.onInitialize();
|
||||
this.filterRoles = this.getModelSearchFilterRoles(this.searchKeyword);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the filter roles from model search roles.
|
||||
* @param {string} searchKeyword
|
||||
* @returns {IFilterRole[]}
|
||||
*/
|
||||
private getModelSearchFilterRoles(searchKeyword: string): IFilterRole[] {
|
||||
const model = this.getModel();
|
||||
|
||||
return model.searchRoles.map((searchRole, index) => ({
|
||||
...searchRole,
|
||||
value: searchKeyword,
|
||||
index: index + 1,
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
setResponseMeta() {
|
||||
this.responseMeta = {
|
||||
searchKeyword: this.searchKeyword,
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user