2
0
mirror of https://github.com/frappe/books.git synced 2024-12-24 11:55:46 +00:00
books/model/meta.js

161 lines
4.7 KiB
JavaScript
Raw Normal View History

2018-01-24 11:52:05 +00:00
const BaseDocument = require('./document');
2018-01-16 06:09:17 +00:00
const frappe = require('frappejs');
const model = require('./index')
2018-01-12 12:25:07 +00:00
2018-01-24 11:52:05 +00:00
module.exports = class BaseMeta extends BaseDocument {
2018-01-12 12:25:07 +00:00
constructor(data) {
super(data);
this.list_options = {
fields: ['name', 'modified']
};
2018-02-08 12:28:51 +00:00
if (this.setupMeta) {
this.setupMeta();
2018-01-12 12:25:07 +00:00
}
}
2018-02-19 06:31:07 +00:00
hasField(fieldname) {
return this.getField(fieldname) ? true : false;
}
2018-02-08 11:45:32 +00:00
getField(fieldname) {
2018-01-31 12:56:21 +00:00
if (!this._field_map) {
this._field_map = {};
for (let field of this.fields) {
this._field_map[field.fieldname] = field;
2018-01-12 12:25:07 +00:00
}
}
2018-01-31 12:56:21 +00:00
return this._field_map[fieldname];
2018-01-31 13:04:46 +00:00
}
2018-01-31 12:56:21 +00:00
getTableFields() {
2018-02-08 11:45:32 +00:00
if (this._tableFields===undefined) {
this._tableFields = this.fields.filter(field => field.fieldtype === 'Table');
2018-01-31 13:04:46 +00:00
}
return this._tableFields;
2018-01-31 13:04:46 +00:00
}
2018-01-12 12:25:07 +00:00
2018-02-08 11:45:32 +00:00
getFormulaFields() {
if (this._formulaFields===undefined) {
this._formulaFields = this.fields.filter(field => field.formula);
}
return this._formulaFields;
}
hasFormula() {
if (this._hasFormula===undefined) {
this._hasFormula = false;
2018-02-09 12:55:55 +00:00
if (this.getFormulaFields().length) {
this._hasFormula = true;
2018-02-09 12:55:55 +00:00
} else {
for (let tablefield of this.getTableFields()) {
if (frappe.getMeta(tablefield.childtype).getFormulaFields().length) {
this._hasFormula = true;
2018-02-09 12:55:55 +00:00
break;
}
}
}
}
return this._hasFormula;
2018-02-09 12:55:55 +00:00
}
2018-01-12 12:25:07 +00:00
async set(fieldname, value) {
this[fieldname] = value;
await this.trigger(fieldname);
}
get(fieldname) {
return this[fieldname];
}
2018-02-12 12:01:31 +00:00
getValidFields({ withChildren = true } = {}) {
2018-01-12 12:25:07 +00:00
if (!this._valid_fields) {
2018-02-01 11:07:36 +00:00
2018-01-12 12:25:07 +00:00
this._valid_fields = [];
2018-02-12 12:01:31 +00:00
this._valid_fields_withChildren = [];
2018-02-01 11:07:36 +00:00
const _add = (field) => {
this._valid_fields.push(field);
2018-02-12 12:01:31 +00:00
this._valid_fields_withChildren.push(field);
2018-02-01 11:07:36 +00:00
}
2018-01-12 12:25:07 +00:00
2018-01-31 12:56:21 +00:00
const doctype_fields = this.fields.map((field) => field.fieldname);
2018-01-23 08:00:29 +00:00
2018-01-12 12:25:07 +00:00
// standard fields
for (let field of model.common_fields) {
2018-01-31 12:56:21 +00:00
if (frappe.db.type_map[field.fieldtype] && !doctype_fields.includes(field.fieldname)) {
2018-02-01 11:07:36 +00:00
_add(field);
2018-01-23 08:00:29 +00:00
}
2018-01-12 12:25:07 +00:00
}
2018-02-12 12:01:31 +00:00
if (this.isChild) {
2018-01-31 13:04:46 +00:00
// child fields
for (let field of model.child_fields) {
2018-01-31 12:56:21 +00:00
if (frappe.db.type_map[field.fieldtype] && !doctype_fields.includes(field.fieldname)) {
2018-02-01 11:07:36 +00:00
_add(field);
2018-01-23 08:00:29 +00:00
}
2018-01-12 12:25:07 +00:00
}
2018-01-31 12:56:21 +00:00
} else {
2018-01-31 13:04:46 +00:00
// parent fields
for (let field of model.parent_fields) {
2018-01-31 12:56:21 +00:00
if (frappe.db.type_map[field.fieldtype] && !doctype_fields.includes(field.fieldname)) {
2018-02-01 11:07:36 +00:00
_add(field);
2018-01-31 12:56:21 +00:00
}
}
2018-01-31 13:04:46 +00:00
}
2018-01-12 12:25:07 +00:00
// doctype fields
2018-01-31 12:56:21 +00:00
for (let field of this.fields) {
2018-01-31 13:04:46 +00:00
let include = frappe.db.type_map[field.fieldtype];
2018-01-31 12:56:21 +00:00
if (include) {
2018-02-01 11:07:36 +00:00
_add(field);
}
2018-02-12 12:01:31 +00:00
// include tables if (withChildren = True)
2018-02-01 11:07:36 +00:00
if (!include && field.fieldtype === 'Table') {
2018-02-12 12:01:31 +00:00
this._valid_fields_withChildren.push(field);
2018-01-12 12:25:07 +00:00
}
}
}
2018-02-12 12:01:31 +00:00
if (withChildren) {
return this._valid_fields_withChildren;
2018-02-01 11:07:36 +00:00
} else {
return this._valid_fields;
}
2018-01-12 12:25:07 +00:00
}
getKeywordFields() {
2018-02-12 12:01:31 +00:00
if (!this._keywordFields) {
this._keywordFields = this.keywordFields;
if (!(this._keywordFields && this._keywordFields.length && this.fields)) {
this._keywordFields = this.fields.filter(field => field.required).map(field => field.fieldname);
}
if (!(this._keywordFields && this._keywordFields.length)) {
this._keywordFields = ['name']
}
}
return this._keywordFields;
2018-01-12 12:25:07 +00:00
}
2018-02-13 11:54:57 +00:00
validateSelect(field, value) {
2018-01-31 12:56:21 +00:00
let options = field.options;
2018-01-12 12:25:07 +00:00
if (typeof options === 'string') {
// values given as string
2018-01-31 12:56:21 +00:00
options = field.options.split('\n');
2018-01-12 12:25:07 +00:00
}
if (!options.includes(value)) {
throw new frappe.errors.ValueError(`${value} must be one of ${options.join(", ")}`);
2018-01-12 12:25:07 +00:00
}
return value;
2018-01-12 12:25:07 +00:00
}
2018-02-13 11:54:57 +00:00
async trigger(event, params = {}) {
Object.assign(params, {
2018-01-12 12:25:07 +00:00
doc: this,
2018-02-13 11:54:57 +00:00
name: event
2018-01-12 12:25:07 +00:00
});
2018-02-13 11:54:57 +00:00
await super.trigger(event, params);
2018-01-12 12:25:07 +00:00
}
2018-01-24 11:52:05 +00:00
}