mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-17 05:10:31 +00:00
feat: custom view dynamic filter.
This commit is contained in:
@@ -9,8 +9,13 @@ import AccountTypesUtils from 'lib/AccountTypes';
|
||||
import AccountSettings from './Account.Settings';
|
||||
import ModelSettings from './ModelSetting';
|
||||
import { ACCOUNT_TYPES } from 'data/AccountTypes';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from 'services/Accounts/constants';
|
||||
|
||||
export default class Account extends mixin(TenantModel, [ModelSettings]) {
|
||||
export default class Account extends mixin(TenantModel, [
|
||||
ModelSettings,
|
||||
CustomViewBaseModel,
|
||||
]) {
|
||||
/**
|
||||
* Table name.
|
||||
*/
|
||||
@@ -135,7 +140,7 @@ export default class Account extends mixin(TenantModel, [ModelSettings]) {
|
||||
*/
|
||||
filterByAccountNormal(query, accountNormal) {
|
||||
const filterTypes = ACCOUNT_TYPES.filter(
|
||||
(accountType) => accountType.normal === accountNormal,
|
||||
(accountType) => accountType.normal === accountNormal
|
||||
).map((accountType) => accountType.key);
|
||||
|
||||
query.whereIn('account_type', filterTypes);
|
||||
@@ -248,4 +253,11 @@ export default class Account extends mixin(TenantModel, [ModelSettings]) {
|
||||
static get meta() {
|
||||
return AccountSettings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default custom views, roles and columns.
|
||||
*/
|
||||
static get defaultViews() {
|
||||
return DEFAULT_VIEWS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,8 +4,13 @@ import { difference } from 'lodash';
|
||||
import TenantModel from 'models/TenantModel';
|
||||
import BillSettings from './Bill.Settings';
|
||||
import ModelSetting from './ModelSetting';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from 'services/Purchases/constants';
|
||||
|
||||
export default class Bill extends mixin(TenantModel, [ModelSetting]) {
|
||||
export default class Bill extends mixin(TenantModel, [
|
||||
ModelSetting,
|
||||
CustomViewBaseModel,
|
||||
]) {
|
||||
/**
|
||||
* Table name
|
||||
*/
|
||||
@@ -303,4 +308,11 @@ export default class Bill extends mixin(TenantModel, [ModelSetting]) {
|
||||
.where('id', billId)
|
||||
[changeMethod]('payment_amount', Math.abs(amount));
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default custom views, roles and columns.
|
||||
*/
|
||||
static get defaultViews() {
|
||||
return DEFAULT_VIEWS;
|
||||
}
|
||||
}
|
||||
|
||||
16
server/src/models/CustomViewBaseModel.js
Normal file
16
server/src/models/CustomViewBaseModel.js
Normal file
@@ -0,0 +1,16 @@
|
||||
export default (Model) =>
|
||||
class CustomViewBaseModel extends Model {
|
||||
/**
|
||||
* Retrieve the default custom views, roles and columns.
|
||||
*/
|
||||
static get defaultViews() {
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default view by the given slug.
|
||||
*/
|
||||
static getDefaultViewBySlug(viewSlug) {
|
||||
return this.defaultViews.find((view) => view.slug === viewSlug) || null;
|
||||
}
|
||||
};
|
||||
@@ -75,19 +75,13 @@ export default {
|
||||
{ key: 'unpaid', label: 'Unpaid' },
|
||||
],
|
||||
columnable: true,
|
||||
filterQuery: statusFieldFilterQuery,
|
||||
filterCustomQuery: statusFieldFilterQuery,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
function statusFieldFilterQuery(query, role) {
|
||||
switch (role.value) {
|
||||
case 'active':
|
||||
query.modify('active');
|
||||
break;
|
||||
case 'inactive':
|
||||
query.modify('inactive');
|
||||
break;
|
||||
case 'overdue':
|
||||
query.modify('overdue');
|
||||
break;
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { Model, mixin } from 'objection';
|
||||
import TenantModel from 'models/TenantModel';
|
||||
import PaginationQueryBuilder from './Pagination';
|
||||
import QueryParser from 'lib/LogicEvaluation/QueryParser';
|
||||
import ModelSetting from './ModelSetting';
|
||||
import CustomerSettings from './Customer.Settings';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from 'services/Contacts/Customers/constants';
|
||||
|
||||
class CustomerQueryBuilder extends PaginationQueryBuilder {
|
||||
constructor(...args) {
|
||||
@@ -17,7 +18,10 @@ class CustomerQueryBuilder extends PaginationQueryBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
export default class Customer extends mixin(TenantModel, [ModelSetting]) {
|
||||
export default class Customer extends mixin(TenantModel, [
|
||||
ModelSetting,
|
||||
CustomViewBaseModel,
|
||||
]) {
|
||||
/**
|
||||
* Query builder.
|
||||
*/
|
||||
@@ -138,4 +142,11 @@ export default class Customer extends mixin(TenantModel, [ModelSetting]) {
|
||||
static get meta() {
|
||||
return CustomerSettings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default custom views, roles and columns.
|
||||
*/
|
||||
static get defaultViews() {
|
||||
return DEFAULT_VIEWS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,13 @@ import TenantModel from 'models/TenantModel';
|
||||
import { viewRolesBuilder } from 'lib/ViewRolesBuilder';
|
||||
import ModelSetting from './ModelSetting';
|
||||
import ExpenseSettings from './Expense.Settings';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from 'services/Expenses/constants';
|
||||
|
||||
export default class Expense extends mixin(TenantModel, [ModelSetting]) {
|
||||
export default class Expense extends mixin(TenantModel, [
|
||||
ModelSetting,
|
||||
CustomViewBaseModel,
|
||||
]) {
|
||||
/**
|
||||
* Table name
|
||||
*/
|
||||
@@ -148,4 +153,11 @@ export default class Expense extends mixin(TenantModel, [ModelSetting]) {
|
||||
static get meta() {
|
||||
return ExpenseSettings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default custom views, roles and columns.
|
||||
*/
|
||||
static get defaultViews() {
|
||||
return DEFAULT_VIEWS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,13 @@ import TenantModel from 'models/TenantModel';
|
||||
import { buildFilterQuery } from 'lib/ViewRolesBuilder';
|
||||
import ItemSettings from './Item.Settings';
|
||||
import ModelSetting from './ModelSetting';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from 'services/Items/constants';
|
||||
|
||||
export default class Item extends mixin(TenantModel, [ModelSetting]) {
|
||||
export default class Item extends mixin(TenantModel, [
|
||||
ModelSetting,
|
||||
CustomViewBaseModel,
|
||||
]) {
|
||||
/**
|
||||
* Table name
|
||||
*/
|
||||
@@ -116,4 +121,11 @@ export default class Item extends mixin(TenantModel, [ModelSetting]) {
|
||||
static get meta() {
|
||||
return ItemSettings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default custom views, roles and columns.
|
||||
*/
|
||||
static get defaultViews() {
|
||||
return DEFAULT_VIEWS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,8 +4,13 @@ import TenantModel from 'models/TenantModel';
|
||||
import { defaultToTransform } from 'utils';
|
||||
import SaleEstimateSettings from './SaleEstimate.Settings';
|
||||
import ModelSetting from './ModelSetting';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from 'services/Sales/Estimates/constants';
|
||||
|
||||
export default class SaleEstimate extends mixin(TenantModel, [ModelSetting]) {
|
||||
export default class SaleEstimate extends mixin(TenantModel, [
|
||||
ModelSetting,
|
||||
CustomViewBaseModel,
|
||||
]) {
|
||||
/**
|
||||
* Table name
|
||||
*/
|
||||
@@ -155,7 +160,7 @@ export default class SaleEstimate extends mixin(TenantModel, [ModelSetting]) {
|
||||
query.modify('expired');
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -198,4 +203,11 @@ export default class SaleEstimate extends mixin(TenantModel, [ModelSetting]) {
|
||||
static get meta() {
|
||||
return SaleEstimateSettings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default custom views, roles and columns.
|
||||
*/
|
||||
static get defaultViews() {
|
||||
return DEFAULT_VIEWS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,13 @@ import moment from 'moment';
|
||||
import TenantModel from 'models/TenantModel';
|
||||
import ModelSetting from './ModelSetting';
|
||||
import SaleInvoiceMeta from './SaleInvoice.Settings';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from 'services/Sales/constants';
|
||||
|
||||
export default class SaleInvoice extends mixin(TenantModel, [ModelSetting]) {
|
||||
export default class SaleInvoice extends mixin(TenantModel, [
|
||||
ModelSetting,
|
||||
CustomViewBaseModel,
|
||||
]) {
|
||||
/**
|
||||
* Table name
|
||||
*/
|
||||
@@ -359,4 +364,11 @@ export default class SaleInvoice extends mixin(TenantModel, [ModelSetting]) {
|
||||
static dueAmountFieldSortQuery(query, role) {
|
||||
query.modify('sortByDueAmount', role.order);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default custom views, roles and columns.
|
||||
*/
|
||||
static get defaultViews() {
|
||||
return DEFAULT_VIEWS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,13 @@ import { Model, mixin } from 'objection';
|
||||
import TenantModel from 'models/TenantModel';
|
||||
import ModelSetting from './ModelSetting';
|
||||
import SaleReceiptSettings from './SaleReceipt.Settings';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from 'services/Sales/Receipts/constants';
|
||||
|
||||
export default class SaleReceipt extends mixin(TenantModel, [ModelSetting]) {
|
||||
export default class SaleReceipt extends mixin(TenantModel, [
|
||||
ModelSetting,
|
||||
CustomViewBaseModel,
|
||||
]) {
|
||||
/**
|
||||
* Table name
|
||||
*/
|
||||
@@ -80,7 +85,7 @@ export default class SaleReceipt extends mixin(TenantModel, [ModelSetting]) {
|
||||
query.modify('closed');
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -147,4 +152,11 @@ export default class SaleReceipt extends mixin(TenantModel, [ModelSetting]) {
|
||||
static get meta() {
|
||||
return SaleReceiptSettings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default custom views, roles and columns.
|
||||
*/
|
||||
static get defaultViews() {
|
||||
return DEFAULT_VIEWS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,19 +63,11 @@ export default {
|
||||
'status': {
|
||||
label: 'Status',
|
||||
options: [
|
||||
{ key: 'active', label: 'Active' },
|
||||
{ key: 'inactive', label: 'Inactive' },
|
||||
{ key: 'overdue', label: 'Overdue' },
|
||||
{ key: 'unpaid', label: 'Unpaid' },
|
||||
],
|
||||
query: (query, role) => {
|
||||
filterCustomQuery: (query, role) => {
|
||||
switch (role.value) {
|
||||
case 'active':
|
||||
query.modify('active');
|
||||
break;
|
||||
case 'inactive':
|
||||
query.modify('inactive');
|
||||
break;
|
||||
case 'overdue':
|
||||
query.modify('overdue');
|
||||
break;
|
||||
|
||||
@@ -3,6 +3,8 @@ import TenantModel from 'models/TenantModel';
|
||||
import PaginationQueryBuilder from './Pagination';
|
||||
import ModelSetting from './ModelSetting';
|
||||
import VendorSettings from './Vendor.Settings';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from 'services/Contacts/Vendors/constants';
|
||||
|
||||
class VendorQueryBuilder extends PaginationQueryBuilder {
|
||||
constructor(...args) {
|
||||
@@ -16,7 +18,10 @@ class VendorQueryBuilder extends PaginationQueryBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
export default class Vendor extends mixin(TenantModel, [ModelSetting]) {
|
||||
export default class Vendor extends mixin(TenantModel, [
|
||||
ModelSetting,
|
||||
CustomViewBaseModel,
|
||||
]) {
|
||||
/**
|
||||
* Query builder.
|
||||
*/
|
||||
@@ -67,7 +72,7 @@ export default class Vendor extends mixin(TenantModel, [ModelSetting]) {
|
||||
/**
|
||||
* Inactive/Active mode.
|
||||
*/
|
||||
inactiveMode(query, active = false) {
|
||||
inactiveMode(query, active = false) {
|
||||
query.where('active', !active);
|
||||
},
|
||||
|
||||
@@ -89,10 +94,9 @@ export default class Vendor extends mixin(TenantModel, [ModelSetting]) {
|
||||
overdue(query) {
|
||||
query.select(
|
||||
'*',
|
||||
Vendor
|
||||
.relatedQuery('overdueBills', query.knex())
|
||||
Vendor.relatedQuery('overdueBills', query.knex())
|
||||
.count()
|
||||
.as('countOverdue'),
|
||||
.as('countOverdue')
|
||||
);
|
||||
query.having('countOverdue', '>', 0);
|
||||
},
|
||||
@@ -101,7 +105,7 @@ export default class Vendor extends mixin(TenantModel, [ModelSetting]) {
|
||||
*/
|
||||
unpaid(query) {
|
||||
query.whereRaw('`BALANCE` + `OPENING_BALANCE` <> 0');
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -129,12 +133,19 @@ export default class Vendor extends mixin(TenantModel, [ModelSetting]) {
|
||||
},
|
||||
filter: (query) => {
|
||||
query.modify('overdue');
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
static get meta() {
|
||||
return VendorSettings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default custom views, roles and columns.
|
||||
*/
|
||||
static get defaultViews() {
|
||||
return DEFAULT_VIEWS;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user