mirror of
https://github.com/OCA/web.git
synced 2025-02-22 13:21:25 +02:00
364 lines
13 KiB
JavaScript
364 lines
13 KiB
JavaScript
/** @odoo-module **/
|
|
import {
|
|
Many2ManyTagsField,
|
|
Many2ManyTagsFieldColorEditable,
|
|
many2ManyTagsField,
|
|
} from "@web/views/fields/many2many_tags/many2many_tags_field";
|
|
import {Many2OneField, many2OneField} from "@web/views/fields/many2one/many2one_field";
|
|
import {FormController} from "@web/views/form/form_controller";
|
|
import {Many2OneAvatarField} from "@web/views/fields/many2one_avatar/many2one_avatar_field";
|
|
import {Many2XAutocomplete} from "@web/views/fields/relational_utils";
|
|
import {evaluateBooleanExpr} from "@web/core/py_js/py";
|
|
import {isX2Many} from "@web/views/utils";
|
|
import {patch} from "@web/core/utils/patch";
|
|
import {session} from "@web/session";
|
|
|
|
Many2OneField.props = {
|
|
...Many2OneField.props,
|
|
noSearchMore: {type: Boolean, optional: true},
|
|
fieldColor: {type: String, optional: true},
|
|
fieldColorOptions: {type: Object, optional: true},
|
|
};
|
|
Many2XAutocomplete.props = {
|
|
...Many2XAutocomplete.props,
|
|
fieldColor: {type: String, optional: true},
|
|
fieldColorOptions: {type: Object, optional: true},
|
|
};
|
|
|
|
Many2OneAvatarField.props = {
|
|
...Many2OneAvatarField.props,
|
|
noSearchMore: {type: Boolean, optional: true},
|
|
fieldColor: {type: String, optional: true},
|
|
fieldColorOptions: {type: Object, optional: true},
|
|
};
|
|
|
|
Many2ManyTagsField.props = {
|
|
...Many2ManyTagsField.props,
|
|
searchLimit: {type: Number, optional: true},
|
|
fieldColor: {type: String, optional: true},
|
|
fieldColorOptions: {type: Object, optional: true},
|
|
};
|
|
|
|
Many2ManyTagsFieldColorEditable.props = {
|
|
...Many2ManyTagsFieldColorEditable.props,
|
|
searchLimit: {type: Number, optional: true},
|
|
fieldColor: {type: String, optional: true},
|
|
fieldColorOptions: {type: Object, optional: true},
|
|
};
|
|
|
|
patch(many2OneField, {
|
|
m2o_options_props_create(props, attrs, options) {
|
|
const ir_options = session.web_m2x_options;
|
|
if (options.create === false) {
|
|
props.canQuickCreate = false;
|
|
} else if (options.create) {
|
|
props.canQuickCreate = attrs.can_create
|
|
? evaluateBooleanExpr(attrs.can_create)
|
|
: true;
|
|
} else if (
|
|
ir_options["web_m2x_options.create"] === "False" &&
|
|
props.canQuickCreate
|
|
) {
|
|
props.canQuickCreate = false;
|
|
} else if (
|
|
ir_options["web_m2x_options.create"] === "True" &&
|
|
!props.canQuickCreate
|
|
) {
|
|
props.canQuickCreate = attrs.can_create
|
|
? evaluateBooleanExpr(attrs.can_create)
|
|
: true;
|
|
}
|
|
return props;
|
|
},
|
|
|
|
m2o_options_props_create_edit(props, attrs, options) {
|
|
const ir_options = session.web_m2x_options;
|
|
if (options.create_edit === false) {
|
|
props.canCreateEdit = false;
|
|
} else if (options.create_edit) {
|
|
// Same condition set in web/views/fields/many2one/many2one_field
|
|
props.canCreateEdit = attrs.can_create
|
|
? evaluateBooleanExpr(attrs.can_create)
|
|
: true;
|
|
} else if (
|
|
ir_options["web_m2x_options.create_edit"] === "False" &&
|
|
props.canCreateEdit
|
|
) {
|
|
props.canCreateEdit = false;
|
|
} else if (
|
|
ir_options["web_m2x_options.create_edit"] === "True" &&
|
|
!props.canCreateEdit
|
|
) {
|
|
// Same condition set in web/views/fields/many2one/many2one_field
|
|
props.canCreateEdit = attrs.can_create
|
|
? evaluateBooleanExpr(attrs.can_create)
|
|
: true;
|
|
}
|
|
return props;
|
|
},
|
|
|
|
m2o_options_props_limit(props, attrs, options) {
|
|
const ir_options = session.web_m2x_options;
|
|
if (Number(options.limit)) {
|
|
props.searchLimit = Number(options.limit);
|
|
} else if (Number(ir_options["web_m2x_options.limit"])) {
|
|
props.searchLimit = Number(ir_options["web_m2x_options.limit"]);
|
|
}
|
|
return props;
|
|
},
|
|
|
|
m2o_options_props_search_more(props, attrs, options) {
|
|
const ir_options = session.web_m2x_options;
|
|
if (options.search_more) {
|
|
props.noSearchMore = false;
|
|
} else if (options.search_more === false) {
|
|
props.noSearchMore = true;
|
|
} else if (
|
|
ir_options["web_m2x_options.search_more"] === "True" &&
|
|
props.noSearchMore
|
|
) {
|
|
props.noSearchMore = false;
|
|
} else if (ir_options["web_m2x_options.search_more"] === "False") {
|
|
props.noSearchMore = true;
|
|
}
|
|
return props;
|
|
},
|
|
|
|
m2o_options_props_open(props, attrs, options) {
|
|
const ir_options = session.web_m2x_options;
|
|
if (options.open) {
|
|
props.canOpen = true;
|
|
} else if (options.open === false) {
|
|
props.canOpen = false;
|
|
} else if (ir_options["web_m2x_options.open"] === "True") {
|
|
props.canOpen = true;
|
|
} else if (ir_options["web_m2x_options.open"] === "False") {
|
|
props.canOpen = false;
|
|
}
|
|
return props;
|
|
},
|
|
|
|
m2o_options_props(props, attrs, options) {
|
|
props = this.m2o_options_props_create(props, attrs, options);
|
|
props = this.m2o_options_props_create_edit(props, attrs, options);
|
|
props = this.m2o_options_props_limit(props, attrs, options);
|
|
props = this.m2o_options_props_search_more(props, attrs, options);
|
|
props = this.m2o_options_props_open(props, attrs, options);
|
|
props.fieldColor = options.field_color;
|
|
props.fieldColorOptions = options.colors;
|
|
return props;
|
|
},
|
|
extractProps({attrs, context, decorations, options, string}, dynamicInfo) {
|
|
const props = super.extractProps(
|
|
{attrs, context, decorations, options, string},
|
|
dynamicInfo
|
|
);
|
|
const new_props = this.m2o_options_props(props, attrs, options);
|
|
return new_props;
|
|
},
|
|
});
|
|
|
|
patch(Many2OneField.prototype, {
|
|
get Many2XAutocompleteProps() {
|
|
const search_limit = this.props.searchLimit;
|
|
const no_search_more = this.props.noSearchMore;
|
|
const field_color = this.props.fieldColor;
|
|
const field_color_options = this.props.fieldColorOptions;
|
|
const props = super.Many2XAutocompleteProps;
|
|
const ret_props = {...props};
|
|
if (Number(search_limit) && Number(search_limit) > 1) {
|
|
ret_props.searchLimit = search_limit - 1;
|
|
}
|
|
if (no_search_more) {
|
|
ret_props.noSearchMore = no_search_more;
|
|
}
|
|
if (field_color && field_color_options) {
|
|
ret_props.fieldColor = field_color;
|
|
ret_props.fieldColorOptions = field_color_options;
|
|
}
|
|
return ret_props;
|
|
},
|
|
});
|
|
|
|
patch(many2ManyTagsField, {
|
|
m2m_options_props_create(props, attrs, options) {
|
|
const ir_options = session.web_m2x_options;
|
|
// Create option already available for m2m fields
|
|
if (!options.create) {
|
|
if (
|
|
ir_options["web_m2x_options.create"] === "False" &&
|
|
props.canQuickCreate
|
|
) {
|
|
props.canQuickCreate = false;
|
|
} else if (
|
|
ir_options["web_m2x_options.create"] === "True" &&
|
|
!props.canQuickCreate
|
|
) {
|
|
props.canQuickCreate = attrs.can_create
|
|
? evaluateBooleanExpr(attrs.can_create)
|
|
: true;
|
|
}
|
|
}
|
|
return props;
|
|
},
|
|
|
|
m2m_options_props_create_edit(props, attrs, options) {
|
|
const ir_options = session.web_m2x_options;
|
|
if (options.create_edit === false) {
|
|
props.canCreateEdit = false;
|
|
} else if (options.create_edit) {
|
|
// Same condition set in web/views/fields/many2one/many2one_field
|
|
props.canCreateEdit = attrs.can_create
|
|
? evaluateBooleanExpr(attrs.can_create)
|
|
: true;
|
|
} else if (
|
|
ir_options["web_m2x_options.create_edit"] === "False" &&
|
|
props.canCreateEdit
|
|
) {
|
|
props.canCreateEdit = false;
|
|
} else if (
|
|
ir_options["web_m2x_options.create_edit"] === "True" &&
|
|
!props.canCreateEdit
|
|
) {
|
|
// Same condition set in web/views/fields/many2one/many2one_field
|
|
props.canCreateEdit = attrs.can_create
|
|
? evaluateBooleanExpr(attrs.can_create)
|
|
: true;
|
|
}
|
|
return props;
|
|
},
|
|
|
|
m2m_options_props_limit(props, attrs, options) {
|
|
const ir_options = session.web_m2x_options;
|
|
if (Number(options.limit) && options.limit > 1) {
|
|
props.searchLimit = Number(options.limit) - 1;
|
|
} else if (
|
|
Number(ir_options["web_m2x_options.limit"]) &&
|
|
ir_options["web_m2x_options.limit"] > 1
|
|
) {
|
|
props.searchLimit = Number(ir_options["web_m2x_options.limit"]) - 1;
|
|
}
|
|
return props;
|
|
},
|
|
|
|
m2m_options_props_search_more(props, attrs, options) {
|
|
const ir_options = session.web_m2x_options;
|
|
if (options.search_more) {
|
|
props.noSearchMore = false;
|
|
} else if (options.search_more === false) {
|
|
props.noSearchMore = true;
|
|
} else if (
|
|
ir_options["web_m2x_options.search_more"] === "True" &&
|
|
props.noSearchMore
|
|
) {
|
|
props.noSearchMore = false;
|
|
} else if (ir_options["web_m2x_options.search_more"] === "False") {
|
|
props.noSearchMore = true;
|
|
}
|
|
return props;
|
|
},
|
|
|
|
m2m_options_props(props, attrs, options) {
|
|
props = this.m2m_options_props_create(props, attrs, options);
|
|
props = this.m2m_options_props_create_edit(props, attrs, options);
|
|
props = this.m2m_options_props_limit(props, attrs, options);
|
|
props = this.m2m_options_props_search_more(props, attrs, options);
|
|
props.fieldColor = options.field_color;
|
|
props.fieldColorOptions = options.colors;
|
|
return props;
|
|
},
|
|
extractProps({attrs, options, string}, dynamicInfo) {
|
|
const props = super.extractProps({attrs, options, string}, dynamicInfo);
|
|
const new_props = this.m2m_options_props(props, attrs, options);
|
|
return new_props;
|
|
},
|
|
});
|
|
|
|
patch(Many2XAutocomplete.prototype, {
|
|
setup() {
|
|
super.setup();
|
|
this.ir_options = session.web_m2x_options;
|
|
},
|
|
async loadOptionsSource(request) {
|
|
var options = await super.loadOptionsSource(request);
|
|
this.field_color = this.props.fieldColor;
|
|
this.colors = this.props.fieldColorOptions;
|
|
if (this.colors && this.field_color) {
|
|
var value_ids = options.map((result) => result.value);
|
|
const objects = await this.orm.call(
|
|
this.props.resModel,
|
|
"search_read",
|
|
[],
|
|
{
|
|
domain: [["id", "in", value_ids]],
|
|
fields: [this.field_color],
|
|
}
|
|
);
|
|
for (var index in objects) {
|
|
for (var index_value in options) {
|
|
if (options[index_value].value === objects[index].id) {
|
|
// Find value in values by comparing ids
|
|
var option = options[index_value];
|
|
// Find color with field value as key
|
|
var color =
|
|
this.colors[objects[index][this.field_color]] || "black";
|
|
option.style = "color:" + color;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return options;
|
|
},
|
|
});
|
|
|
|
patch(FormController.prototype, {
|
|
/**
|
|
* @override
|
|
*/
|
|
setup() {
|
|
super.setup(...arguments);
|
|
this._setSubViewLimit();
|
|
},
|
|
/**
|
|
* @override
|
|
* add more method to add subview limit on formview
|
|
*/
|
|
async _setSubViewLimit() {
|
|
const ir_options = session.web_m2x_options;
|
|
const activeFields = this.archInfo.fieldNodes,
|
|
isSmall = this.user;
|
|
|
|
var limit = ir_options["web_m2x_options.field_limit_entries"];
|
|
if (!(typeof limit === "undefined")) {
|
|
limit = parseInt(limit, 10);
|
|
}
|
|
for (const fieldName in activeFields) {
|
|
const field = activeFields[fieldName];
|
|
if (!isX2Many(field)) {
|
|
// What follows only concerns x2many fields
|
|
continue;
|
|
}
|
|
// Const fieldInfo = activeFields[fieldName];
|
|
if (field.invisible) {
|
|
// No need to fetch the sub view if the field is always invisible
|
|
continue;
|
|
}
|
|
|
|
if (!field.field.useSubView) {
|
|
// The FieldComponent used to render the field doesn't need a sub view
|
|
continue;
|
|
}
|
|
let viewType = field.viewMode || "list,kanban";
|
|
viewType = viewType.replace("tree", "list");
|
|
if (viewType.includes(",")) {
|
|
viewType = isSmall ? "kanban" : "list";
|
|
}
|
|
field.viewMode = viewType;
|
|
if (field.views[viewType] && limit) {
|
|
field.views[viewType].limit = limit;
|
|
}
|
|
}
|
|
},
|
|
});
|