Browse Source
Merge pull request #340 from ursais/12.0-imp-16335-dynamic-content
Merge pull request #340 from ursais/12.0-imp-16335-dynamic-content
[IMP] agreement_legal: Multi-level field selectorpull/344/head
Maxime Chambreuil
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 363 additions and 264 deletions
-
3agreement_legal/__manifest__.py
-
50agreement_legal/models/agreement.py
-
52agreement_legal/models/agreement_appendix.py
-
43agreement_legal/models/agreement_clause.py
-
72agreement_legal/models/agreement_recital.py
-
44agreement_legal/models/agreement_section.py
-
6agreement_legal/readme/USAGE.rst
-
2agreement_legal/report/agreement.xml
-
77agreement_legal/static/src/js/domain_widget_ext.js
-
179agreement_legal/static/src/xml/domain_widget_view.xml
-
25agreement_legal/views/agreement.xml
-
17agreement_legal/views/agreement_appendix.xml
-
17agreement_legal/views/agreement_clause.xml
-
23agreement_legal/views/agreement_recital.xml
-
17agreement_legal/views/agreement_section.xml
@ -0,0 +1,77 @@ |
|||||
|
odoo.define('agreement_legal.domain_widget_ext', function (require) { |
||||
|
'use strict'; |
||||
|
|
||||
|
var basic_fields = require('web.basic_fields'); |
||||
|
var DomainSelector = require('web.DomainSelector'); |
||||
|
var session = require('web.session'); |
||||
|
var core = require('web.core'); |
||||
|
var qweb = core.qweb; |
||||
|
var _t = core._t; |
||||
|
|
||||
|
basic_fields.FieldDomain.include({ |
||||
|
/** |
||||
|
* Init |
||||
|
*/ |
||||
|
init : function () { |
||||
|
this._super.apply(this, arguments); |
||||
|
// Add Additional options
|
||||
|
this.partialUse = this.nodeOptions.partial_use || false; |
||||
|
}, |
||||
|
|
||||
|
//--------------------------------------------------------------------------
|
||||
|
// Private
|
||||
|
//--------------------------------------------------------------------------
|
||||
|
|
||||
|
/** |
||||
|
* @private |
||||
|
* @override _render from AbstractField |
||||
|
* @returns {Deferred} |
||||
|
*/ |
||||
|
_render: function () { |
||||
|
// If there is no model, only change the non-domain-selector content
|
||||
|
if (!this._domainModel) { |
||||
|
this._replaceContent(); |
||||
|
return $.when(); |
||||
|
} |
||||
|
|
||||
|
// Convert char value to array value
|
||||
|
var value = this.value || "[]"; |
||||
|
|
||||
|
// Create the domain selector or change the value of the current one...
|
||||
|
var def; |
||||
|
if (!this.domainSelector) { |
||||
|
this.domainSelector = new DomainSelector(this, this._domainModel, value, { |
||||
|
readonly: this.mode === "readonly" || this.inDialog, |
||||
|
filters: this.fsFilters, |
||||
|
debugMode: session.debug, |
||||
|
partialUse: this.partialUse || false, |
||||
|
}); |
||||
|
def = this.domainSelector.prependTo(this.$el); |
||||
|
} else { |
||||
|
def = this.domainSelector.setDomain(value); |
||||
|
} |
||||
|
// ... then replace the other content (matched records, etc)
|
||||
|
return def.then(this._replaceContent.bind(this)); |
||||
|
}, |
||||
|
/** |
||||
|
* Render the field DOM except for the domain selector part. The full field |
||||
|
* DOM is composed of a DIV which contains the domain selector widget, |
||||
|
* followed by other content. This other content is handled by this method. |
||||
|
* |
||||
|
* @private |
||||
|
*/ |
||||
|
_replaceContent: function () { |
||||
|
if (this._$content) { |
||||
|
this._$content.remove(); |
||||
|
} |
||||
|
this._$content = $(qweb.render("FieldDomain.content", { |
||||
|
hasModel: !!this._domainModel, |
||||
|
isValid: !!this._isValidForModel, |
||||
|
nbRecords: this.record.specialData[this.name].nbRecords || 0, |
||||
|
inDialogEdit: this.inDialog && this.mode === "edit", |
||||
|
partialUse: this.partialUse || false, |
||||
|
})); |
||||
|
this._$content.appendTo(this.$el); |
||||
|
}, |
||||
|
}); |
||||
|
}); |
@ -0,0 +1,179 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<templates id="template" xml:space="preserve"> |
||||
|
<t t-name="FieldDomain.content"> |
||||
|
<t t-if="partialUse"> |
||||
|
<div t-if="hasModel" class="o_field_domain_panel"> |
||||
|
<!--<div t-if="hasModel" class="o_field_domain_panel"> |
||||
|
<i class="fa fa-arrow-right" role="img" aria-label="Domain" title="Domain"/> |
||||
|
|
||||
|
<button t-if="isValid" class="btn btn-sm btn-secondary o_domain_show_selection_button" type="button"> |
||||
|
<t t-esc="nbRecords"/> record(s) |
||||
|
</button> |
||||
|
<span t-else="" class="text-warning" role="alert"><i class="fa fa-exclamation-triangle" role="img" aria-label="Warning" title="Warning"/> Invalid domain</span> |
||||
|
|
||||
|
<button t-if="inDialogEdit" class="btn btn-sm btn-primary o_field_domain_dialog_button">Edit Domain</button> |
||||
|
</div> |
||||
|
<div t-else="">Select a model to add a filter.</div>--> |
||||
|
</div> |
||||
|
</t> |
||||
|
<t t-if="!partialUse"> |
||||
|
<div t-if="hasModel" class="o_field_domain_panel"> |
||||
|
<i class="fa fa-arrow-right" role="img" aria-label="Domain" title="Domain"/> |
||||
|
|
||||
|
<button t-if="isValid" class="btn btn-sm btn-secondary o_domain_show_selection_button" type="button"> |
||||
|
<t t-esc="nbRecords"/> record(s) |
||||
|
</button> |
||||
|
<span t-else="" class="text-warning" role="alert"><i class="fa fa-exclamation-triangle" role="img" aria-label="Warning" title="Warning"/> Invalid domain</span> |
||||
|
|
||||
|
<button t-if="inDialogEdit" class="btn btn-sm btn-primary o_field_domain_dialog_button">Edit Domain</button> |
||||
|
</div> |
||||
|
<div t-else="">Select a model to add a filter.</div> |
||||
|
</t> |
||||
|
</t> |
||||
|
|
||||
|
<div aria-atomic="true" t-name="DomainSelector" t-attf-class="o_domain_node o_domain_tree o_domain_selector #{widget.readonly ? 'o_read_mode' : 'o_edit_mode'}"> |
||||
|
<t t-if="widget.options.partialUse"> |
||||
|
<t t-if="widget.children.length === 0"> |
||||
|
<span>SMatch <strong>all records</strong></span> |
||||
|
<button t-if="!widget.readonly" class="btn btn-sm btn-primary o_domain_add_first_node_button"><i class="fa fa-plus"/> Add filter</button> |
||||
|
</t> |
||||
|
<t t-else=""> |
||||
|
<div class="o_domain_tree_header"> |
||||
|
<t t-if="widget.children.length === 1">Please navigate below and select field:</t> |
||||
|
<t t-else=""> |
||||
|
<span>SSMatch records with</span> |
||||
|
<t t-call="DomainTree.OperatorSelector"/> |
||||
|
<span>of the following rules:</span> |
||||
|
</t> |
||||
|
</div> |
||||
|
|
||||
|
<div class="o_domain_node_children_container"/> |
||||
|
</t> |
||||
|
</t> |
||||
|
<t t-if="!widget.options.partialUse"> |
||||
|
<t t-if="widget.children.length === 0"> |
||||
|
<span>Match <strong>all records</strong></span> |
||||
|
<button t-if="!widget.readonly" class="btn btn-sm btn-primary o_domain_add_first_node_button"><i class="fa fa-plus"/> Add filter</button> |
||||
|
</t> |
||||
|
<t t-else=""> |
||||
|
<div class="o_domain_tree_header"> |
||||
|
<t t-if="widget.children.length === 1">Match records with the following rule:</t> |
||||
|
<t t-else=""> |
||||
|
<span>Match records with</span> |
||||
|
<t t-call="DomainTree.OperatorSelector"/> |
||||
|
<span>of the following rules:</span> |
||||
|
</t> |
||||
|
</div> |
||||
|
|
||||
|
<div class="o_domain_node_children_container"/> |
||||
|
</t> |
||||
|
|
||||
|
<label t-if="widget.debug && !widget.readonly" class="o_domain_debug_container"> |
||||
|
<span class="small"># Code editor</span> |
||||
|
<input type="text" class="o_domain_debug_input"/> |
||||
|
</label> |
||||
|
</t> |
||||
|
</div> |
||||
|
<t t-name="DomainNode.ControlPanel"> |
||||
|
<t t-if="widget.options.partialUse"> |
||||
|
<div t-if="!widget.readonly && !widget.noControlPanel" class="o_domain_node_control_panel" role="toolbar" aria-label="Domain node"> |
||||
|
</div> |
||||
|
</t> |
||||
|
<t t-if="!widget.options.partialUse"> |
||||
|
<div t-if="!widget.readonly && !widget.noControlPanel" class="o_domain_node_control_panel" role="toolbar" aria-label="Domain node"> |
||||
|
<button class="btn o_domain_delete_node_button" title="Delete node" aria-label="Delete node"><i class="fa fa-times"/></button> |
||||
|
<button class="btn o_domain_add_node_button" title="Add node" aria-label="Add node"><i class="fa fa-plus-circle"/></button> |
||||
|
<button class="btn o_domain_add_node_button" title="Add branch" aria-label="Add branch" data-branch="1"><i class="fa fa-ellipsis-h"/></button> |
||||
|
</div> |
||||
|
</t> |
||||
|
</t> |
||||
|
<div t-name="DomainLeaf" t-attf-class="o_domain_node o_domain_leaf o_domain_selector_row #{widget.readonly ? 'o_read_mode' : 'o_edit_mode'}"> |
||||
|
<t t-call="DomainNode.ControlPanel"/> |
||||
|
|
||||
|
<div t-if="!widget.readonly" class="o_domain_leaf_edition"> |
||||
|
<!-- field selector will be instantiated here --> |
||||
|
<t t-if="!widget.options.partialUse"> |
||||
|
<div> <!-- used for flex stretching --> |
||||
|
<select class="o_domain_leaf_operator_select o_input"> |
||||
|
<option t-foreach="widget.operators" t-as="key" |
||||
|
t-att-value="key" |
||||
|
t-att-selected="widget.displayOperator === key ? 'selected' : None"> |
||||
|
<t t-esc="key_value"/> |
||||
|
</option> |
||||
|
</select> |
||||
|
</div> |
||||
|
<div t-attf-class="o_ds_value_cell#{_.contains(['set', 'not set'], widget.displayOperator) ? ' d-none' : ''}"> |
||||
|
<t t-if="widget.selectionChoices !== null"> |
||||
|
<select class="o_domain_leaf_value_input o_input"> |
||||
|
<option t-foreach="widget.selectionChoices" t-as="val" |
||||
|
t-att-value="val[0]" |
||||
|
t-att-selected="_.contains(val, widget.displayValue) ? 'selected' : None"> |
||||
|
<t t-esc="val[1]"/> |
||||
|
</option> |
||||
|
</select> |
||||
|
</t> |
||||
|
<t t-else=""> |
||||
|
<t t-if="_.contains(['in', 'not in'], widget.operator)"> |
||||
|
<div class="o_domain_leaf_value_input"> |
||||
|
<span class="badge badge-pill" t-foreach="widget.displayValue" t-as="val"> |
||||
|
<t t-esc="val"/> <i class="o_domain_leaf_value_remove_tag_button fa fa-times" t-att-data-value="val" role="img" aria-label="Remove tag" title="Remove tag"/> |
||||
|
</span> |
||||
|
</div> |
||||
|
<div class="o_domain_leaf_value_tags"> |
||||
|
<input placeholder="Add new value" type="text" class="o_input"/> |
||||
|
<button class="btn btn-sm btn-primary fa fa-plus o_domain_leaf_value_add_tag_button" aria-label="Add tag" title="Add tag"/> |
||||
|
</div> |
||||
|
</t> |
||||
|
<t t-else=""> |
||||
|
<input class="o_domain_leaf_value_input o_input" type="text" t-att-value="widget.displayValue"/> |
||||
|
</t> |
||||
|
</t> |
||||
|
</div> |
||||
|
</t> |
||||
|
</div> |
||||
|
<div t-else="" class="o_domain_leaf_info"> |
||||
|
<!-- field selector will be instantiated here --> |
||||
|
<t t-if="_.isString(widget.value)"> |
||||
|
<span class="o_domain_leaf_operator"><t t-esc="widget.operator_mapping[widget.operator]"/></span> |
||||
|
<span class="o_domain_leaf_value text-primary">"<t t-esc="widget.value"/>"</span> |
||||
|
</t> |
||||
|
<t t-if="_.isArray(widget.value)"> |
||||
|
<span class="o_domain_leaf_operator"><t t-esc="widget.operator_mapping[widget.operator]"/></span> |
||||
|
<t t-foreach="widget.value" t-as="v"> |
||||
|
<span class="o_domain_leaf_value text-primary">"<t t-esc="v"/>"</span> |
||||
|
<t t-if="!v_last"> or </t> |
||||
|
</t> |
||||
|
</t> |
||||
|
<t t-if="_.isNumber(widget.value)"> |
||||
|
<span class="o_domain_leaf_operator"><t t-esc="widget.operator_mapping[widget.operator]"/></span> |
||||
|
<span class="o_domain_leaf_value text-primary"><t t-esc="widget.value"></t></span> |
||||
|
</t> |
||||
|
<t t-if="_.isBoolean(widget.value)"> |
||||
|
is |
||||
|
<t t-if="widget.operator === '=' && widget.value === false || widget.operator === '!=' && widget.value === true">not</t> |
||||
|
set |
||||
|
</t> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div aria-atomic="true" t-name="ModelFieldSelector" t-attf-class="o_field_selector#{!widget.options.readonly ? ' o_edit_mode o_input' : ''}"> |
||||
|
<div class="o_field_selector_value" tabindex="0"/> |
||||
|
<t t-if="!widget.options.partialUse"> |
||||
|
<div class="o_field_selector_controls" tabindex="0"> |
||||
|
<i role="alert" class="fa fa-exclamation-triangle o_field_selector_warning d-none" title="Invalid field chain" aria-label="Invalid field chain"/> |
||||
|
</div> |
||||
|
</t> |
||||
|
<div t-if="!widget.options.readonly" class="o_field_selector_popover d-none" tabindex="0"> |
||||
|
<div class="o_field_selector_popover_header text-center"> |
||||
|
<i class="fa fa-arrow-left o_field_selector_popover_option o_field_selector_prev_page" title="Previous" role="img" aria-label="Previous"/> |
||||
|
<div class="o_field_selector_title"/> |
||||
|
<i class="fa fa-times o_field_selector_popover_option o_field_selector_close" title="Close" role="img" aria-label="Close"/> |
||||
|
</div> |
||||
|
<div class="o_field_selector_popover_body"> |
||||
|
<ul class="o_field_selector_page"/> |
||||
|
</div> |
||||
|
<div t-if="widget.options.debugMode" class="o_field_selector_popover_footer"> |
||||
|
<input type="text" class="o_input"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</templates> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue