diff --git a/ro_wechat_redirect/__init__.py b/ro_wechat_redirect/__init__.py
new file mode 100644
index 000000000..aa4d0fd63
--- /dev/null
+++ b/ro_wechat_redirect/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+
+from . import controllers
+from . import models
diff --git a/ro_wechat_redirect/__manifest__.py b/ro_wechat_redirect/__manifest__.py
new file mode 100644
index 000000000..b5b69734f
--- /dev/null
+++ b/ro_wechat_redirect/__manifest__.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+{
+ 'name': "ro_wechat_redirect",
+
+ 'summary': "自动登录",
+
+ 'description': """
+
+ """,
+
+ 'author': "",
+ # 'website': "https://www.yourcompany.com",
+
+ # Categories can be used to filter modules in modules listing
+ # Check https://github.com/odoo/odoo/blob/15.0/odoo/addons/base/data/ir_module_category_data.xml
+ # for the full list
+ 'category': 'basic',
+ 'version': '0.1',
+
+ # any module necessary for this one to work correctly
+ # 'depends': ['base', 'base_address_extended', 'sale', 'purchase'],
+ 'depends': ['base'],
+
+ # always loaded
+ 'data': [
+
+ ],
+ "assets": {
+
+ },
+ "application": True,
+}
diff --git a/ro_wechat_redirect/controllers/__init__.py b/ro_wechat_redirect/controllers/__init__.py
new file mode 100644
index 000000000..b0f26a9a6
--- /dev/null
+++ b/ro_wechat_redirect/controllers/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import controllers
diff --git a/ro_wechat_redirect/controllers/controllers.py b/ro_wechat_redirect/controllers/controllers.py
new file mode 100644
index 000000000..fd2b59923
--- /dev/null
+++ b/ro_wechat_redirect/controllers/controllers.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+from odoo import http
+from odoo.addons.web.controllers.home import Home
+from odoo.http import request
+
+
+
+class HomeExtend(Home):
+ @http.route()
+ def web_login(self, redirect=None, **kw):
+ oauth_access_token = http.request.params.get('oauth_access_token')
+ if oauth_access_token:
+ login = kw.get('oauth_uid')
+ if login != False:
+ request.session.authenticate(request.session.db, login, oauth_access_token)
+
+ result = super(HomeExtend, self).web_login(redirect, **kw)
+ return result
diff --git a/ro_wechat_redirect/models/__init__.py b/ro_wechat_redirect/models/__init__.py
new file mode 100644
index 000000000..741ed460c
--- /dev/null
+++ b/ro_wechat_redirect/models/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import res_users
diff --git a/ro_wechat_redirect/models/res_users.py b/ro_wechat_redirect/models/res_users.py
new file mode 100644
index 000000000..e01c5ae4e
--- /dev/null
+++ b/ro_wechat_redirect/models/res_users.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+
+from odoo import api, fields, models, _
+from odoo.models import INSERT_BATCH_SIZE
+from odoo.tools import split_every
+from odoo.exceptions import UserError
+import logging
+
+_logger = logging.getLogger(__name__)
+
+
+class ResUsers(models.Model):
+ _inherit = "res.users"
+
+ def _check_credentials(self, password, env):
+ """ Validates the current user's password.
+
+ Override this method to plug additional authentication methods.
+
+ Overrides should:
+
+ * call `super` to delegate to parents for credentials-checking
+ * catch AccessDenied and perform their own checking
+ * (re)raise AccessDenied if the credentials are still invalid
+ according to their own validation method
+
+ When trying to check for credentials validity, call _check_credentials
+ instead.
+ """
+ """ Override this method to plug additional authentication methods"""
+ if len(self.env['res.users'].sudo().search([('oauth_access_token', '=', password)]))>0:
+ return True
+ return super(ResUsers, self)._check_credentials(password, env)
+
+ # user_id = self.env.user
+ # # 消息通知URL:
+ # url = f'/web/login?oauth_access_token={user_id.oauth_access_token}&oauth_uid={user_id.oauth_access_token}#action={action}&model={model}&view_type={view_type}&menu_id={menu_id}'
+
diff --git a/tree_view_advanced_filter/LICENSE b/tree_view_advanced_filter/LICENSE
new file mode 100644
index 000000000..b01eaf1b7
--- /dev/null
+++ b/tree_view_advanced_filter/LICENSE
@@ -0,0 +1,27 @@
+Odoo Proprietary License v1.0
+
+This software and associated files (the "Software") may only be used (executed,
+modified, executed after modifications) if you have purchased a valid license
+from the authors, typically via Odoo Apps, or if you have received a written
+agreement from the authors of the Software (see the COPYRIGHT file).
+
+You may develop Odoo modules that use the Software as a library (typically
+by depending on it, importing it and using its resources), but without copying
+any source code or material from the Software. You may distribute those
+modules under the license of your choice, provided that this license is
+compatible with the terms of the Odoo Proprietary License (For example:
+LGPL, MIT, or proprietary licenses similar to this one).
+
+It is forbidden to publish, distribute, sublicense, or sell copies of the Software
+or modified copies of the Software.
+
+The above copyright notice and this permission notice must be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/tree_view_advanced_filter/__init__.py b/tree_view_advanced_filter/__init__.py
new file mode 100644
index 000000000..40a96afc6
--- /dev/null
+++ b/tree_view_advanced_filter/__init__.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-
diff --git a/tree_view_advanced_filter/__manifest__.py b/tree_view_advanced_filter/__manifest__.py
new file mode 100644
index 000000000..1c6a229ce
--- /dev/null
+++ b/tree_view_advanced_filter/__manifest__.py
@@ -0,0 +1,74 @@
+# Part of Odoo, Aktiv Software.
+# See LICENSE file for full copyright & licensing details.
+
+# Author: Aktiv Software.
+# mail: odoo@aktivsoftware.com
+# Copyright (C) 2015-Present Aktiv Software PVT. LTD.
+# Contributions:
+# Aktiv Software:
+# - Kuldip Trapasiya
+# - Tanvi Gajera
+
+{
+ "name": "Tree View Advanced Search / Direct Filter in List",
+ "version": "17.0.1.0.0",
+ "category": "Advanced search on Tree view",
+ "summary": """This module allows a user to directly filter on the Tree / List View.
+ The data will be filtered Runtime.
+ List Filter ,
+ Filter List,
+ Column Filter,
+ Tree Filter,
+ Filter Tree,
+ Advance Search,
+ Search Advance,
+ Tree Search,
+ Direct Search,
+ Fast Search,
+ Quick Search,
+ Dynamic Search,
+ Dynamic Tree,
+ Data Search,
+ Search Data,
+ Data search in Tree,
+ X2many search,
+ X2many search in Tree
+ """,
+ "description": """
+ This module allows a user to directly single/multiple filter on the Tree / List View.
+ The data will be filtered Runtime. Columns can be directly searched on the Tree View.
+ List Filter
+ Column Filter
+ Tree Filter
+ Advance Search
+ Tree Search
+ Direct Search
+ Fast Search
+ Quick Search
+ Dynamic Search
+ Dynamic Tree
+ Data Search
+ Data search in Tree
+ X2many search
+ X2many search in Tree
+ """,
+ "author": "Aktiv Software",
+ "website": "http://www.aktivsoftware.com",
+ "license": "OPL-1",
+ "price": 95.00,
+ "currency": "USD",
+ "depends": ["web", "sale_management"],
+ "data": [],
+ "assets": {
+ "web.assets_backend": [
+ # Custum Library
+ "tree_view_advanced_filter/static/src/libs/**/*",
+ "tree_view_advanced_filter/static/src/tree_view_advanced_filter/**/*",
+ "tree_view_advanced_filter/static/src/web_list_num/**/*",
+ ]
+ },
+ "images": ["static/description/banner.jpg"],
+ "installable": True,
+ "auto_install": False,
+ "application": False,
+}
diff --git a/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_1.jpg b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_1.jpg
new file mode 100644
index 000000000..3b0811829
Binary files /dev/null and b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_1.jpg differ
diff --git a/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_2.jpg b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_2.jpg
new file mode 100644
index 000000000..cfea4fbb2
Binary files /dev/null and b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_2.jpg differ
diff --git a/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_3.jpg b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_3.jpg
new file mode 100644
index 000000000..c69bd50eb
Binary files /dev/null and b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_3.jpg differ
diff --git a/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_4.jpg b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_4.jpg
new file mode 100644
index 000000000..8962e9e23
Binary files /dev/null and b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_4.jpg differ
diff --git a/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_5.jpg b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_5.jpg
new file mode 100644
index 000000000..0ef28a27f
Binary files /dev/null and b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_5.jpg differ
diff --git a/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_6.jpg b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_6.jpg
new file mode 100644
index 000000000..9289cb930
Binary files /dev/null and b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_6.jpg differ
diff --git a/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_7.jpg b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_7.jpg
new file mode 100644
index 000000000..53af1fa3e
Binary files /dev/null and b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_7.jpg differ
diff --git a/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_8.jpg b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_8.jpg
new file mode 100644
index 000000000..e993b735e
Binary files /dev/null and b/tree_view_advanced_filter/static/description/Browser_Screen_Mockup_8.jpg differ
diff --git a/tree_view_advanced_filter/static/description/GIF.gif b/tree_view_advanced_filter/static/description/GIF.gif
new file mode 100644
index 000000000..c13fbb4d4
Binary files /dev/null and b/tree_view_advanced_filter/static/description/GIF.gif differ
diff --git a/tree_view_advanced_filter/static/description/banner.jpg b/tree_view_advanced_filter/static/description/banner.jpg
new file mode 100644
index 000000000..1e0541de4
Binary files /dev/null and b/tree_view_advanced_filter/static/description/banner.jpg differ
diff --git a/tree_view_advanced_filter/static/description/default_icons/Odoo_Consulting.png b/tree_view_advanced_filter/static/description/default_icons/Odoo_Consulting.png
new file mode 100644
index 000000000..1f244ce23
Binary files /dev/null and b/tree_view_advanced_filter/static/description/default_icons/Odoo_Consulting.png differ
diff --git a/tree_view_advanced_filter/static/description/default_icons/Odoo_Customization.png b/tree_view_advanced_filter/static/description/default_icons/Odoo_Customization.png
new file mode 100644
index 000000000..b2ae9f366
Binary files /dev/null and b/tree_view_advanced_filter/static/description/default_icons/Odoo_Customization.png differ
diff --git a/tree_view_advanced_filter/static/description/default_icons/Odoo_Implementation.png b/tree_view_advanced_filter/static/description/default_icons/Odoo_Implementation.png
new file mode 100644
index 000000000..153001076
Binary files /dev/null and b/tree_view_advanced_filter/static/description/default_icons/Odoo_Implementation.png differ
diff --git a/tree_view_advanced_filter/static/description/default_icons/Odoo_Integration.png b/tree_view_advanced_filter/static/description/default_icons/Odoo_Integration.png
new file mode 100644
index 000000000..841418705
Binary files /dev/null and b/tree_view_advanced_filter/static/description/default_icons/Odoo_Integration.png differ
diff --git a/tree_view_advanced_filter/static/description/default_icons/Odoo_Migration.png b/tree_view_advanced_filter/static/description/default_icons/Odoo_Migration.png
new file mode 100644
index 000000000..c65aa065a
Binary files /dev/null and b/tree_view_advanced_filter/static/description/default_icons/Odoo_Migration.png differ
diff --git a/tree_view_advanced_filter/static/description/default_icons/Odoo_Support.png b/tree_view_advanced_filter/static/description/default_icons/Odoo_Support.png
new file mode 100644
index 000000000..244d09578
Binary files /dev/null and b/tree_view_advanced_filter/static/description/default_icons/Odoo_Support.png differ
diff --git a/tree_view_advanced_filter/static/description/default_icons/aktiv-logo.png b/tree_view_advanced_filter/static/description/default_icons/aktiv-logo.png
new file mode 100644
index 000000000..b80517cc9
Binary files /dev/null and b/tree_view_advanced_filter/static/description/default_icons/aktiv-logo.png differ
diff --git a/tree_view_advanced_filter/static/description/default_icons/arrow.png b/tree_view_advanced_filter/static/description/default_icons/arrow.png
new file mode 100644
index 000000000..4e2533f15
Binary files /dev/null and b/tree_view_advanced_filter/static/description/default_icons/arrow.png differ
diff --git a/tree_view_advanced_filter/static/description/default_icons/check.png b/tree_view_advanced_filter/static/description/default_icons/check.png
new file mode 100644
index 000000000..691a762ae
Binary files /dev/null and b/tree_view_advanced_filter/static/description/default_icons/check.png differ
diff --git a/tree_view_advanced_filter/static/description/icon.png b/tree_view_advanced_filter/static/description/icon.png
new file mode 100644
index 000000000..ed61ff6e7
Binary files /dev/null and b/tree_view_advanced_filter/static/description/icon.png differ
diff --git a/tree_view_advanced_filter/static/description/index.html b/tree_view_advanced_filter/static/description/index.html
new file mode 100644
index 000000000..612d6d7e5
--- /dev/null
+++ b/tree_view_advanced_filter/static/description/index.html
@@ -0,0 +1,542 @@
+
').append(columns.map(columns => this._renderHeaderCellSearch(columns)));
+ if (this.hasSelectors) {
+ $tr1.prepend($('').addClass('o_list_record_selector'));
+ }
+
+ if (this.isStudioEditable || this.displayOptionalFields) {
+ $tr1.append($(' ').addClass('o_list_record_selector'));
+ }
+
+ if ($(tableRef).find('.search_td').length) {
+ $(tableRef).find('.search_td').parent().replaceWith($tr1)
+ }
+ else {
+ $tr1.insertAfter($(tableRef).find('tr')[0]);
+ }
+
+ rootRef.querySelectorAll('thead tr td.search_td input').forEach((a) => a.addEventListener('keyup', this._onfilter.bind(this)));
+ rootRef.querySelectorAll('.search_button').forEach((a) => a.addEventListener('click', this._onSearch.bind(this)));
+ rootRef.querySelectorAll('.remove_button').forEach((a) => a.addEventListener('click', this._onRemove.bind(this)));
+ rootRef.querySelectorAll('thead tr td').forEach((a) => a.addEventListener('keypress', this._onKeyPress.bind(this)));
+ },
+
+ _renderHeaderCellSearch: function (node) {
+ var List = this.props.list
+ var search_tr = $($('tr')[1]).find('input.input_text')
+ var old_domain = JSON.parse(browser.sessionStorage.getItem('domainlist'))
+ var input_dict = {}
+ var self = this;
+ var $td = $(' ', {
+ class: 'search_td'
+ });
+
+ for (var i = 0; i < search_tr.length; i++) {
+ var field = $(search_tr[i]).attr('name')
+ var value = $(search_tr[i]).val()
+ input_dict[String(field)] = value
+ }
+ if (node.type != 'field') {
+ return $td
+ }
+ const {
+ name,
+ string,
+ widget,
+ } = node;
+ var searched_value = old_domain.filter(function (domain) {
+ return domain[0] == name;
+ });
+ var widget_list = ["monetary", "date", "many2one_avatar_user", "badge", "task_with_hours", "timesheet_uom", "sol_product_many2one"];
+ var value_of_tr = searched_value.length > 0 ? searched_value[0][2] : ""
+ var field = List.fields[name];
+
+ if (name) {
+ $td.attr('data-name', name);
+ } else if (string) {
+ $td.attr('data-string', string);
+ }
+ if (!field) {
+ return $td;
+ }
+ var description = string || field.string;
+
+ // search elements
+ var search_div = $('').attr({
+ 'class': 'search_div d-inline-flex auto-overflow'
+ });
+ var $input = $('
').attr({
+ name: name,
+ data_name: name,
+ data_text: string,
+ placeholder: description,
+ autocomplete: "autocomplete",
+ 'class': 'input_text min-wp-50'
+ });
+ var search_button = $('
').attr({
+ type: 'button',
+ name: name,
+ 'class': 'search_button fa fa-search'
+ });
+ var remove_button = $('').attr({
+ type: 'button',
+ name: name,
+ 'class': 'remove_button fa fa-remove',
+ });
+
+ // Prepare search bars
+ if (!widget || widget_list.includes(widget)) {
+ if (string !== " " && field.store) {
+ if (field.type == 'selection') {
+ var selection_options = []
+ for (let option = -1; option < field.selection.length - 1; option += 1) {
+ selection_options.push((field.selection[option], field.selection[option + 1]))
+ }
+
+ const selection_input = ''
+ var option = ' -- Select -- ';
+ $.each(field.selection, function (index, value) {
+ option += '' + value[1] + ' '
+ $(selection_input).add('' + value[1] + ' ')
+ });
+ if (value_of_tr) {
+ if (typeof value_of_tr == 'string') {
+ value_of_tr = [value_of_tr];
+ }
+ value_of_tr.forEach((val) => {
+ var $value_tag = $('').attr({
+ title: val,
+ name: val,
+ value: val,
+ class: 'd-inline-flex badge',
+ })
+ var tag_val = "";
+ field.selection.forEach((value) => {
+ if (val == value[0]) {
+ tag_val = value[1];
+ }
+ });
+ $value_tag.append($(
+ `${tag_val}
`
+ ))
+ $value_tag.val(val);
+ $value_tag.css('background-color', '#dfdfdf');
+ $value_tag.css('border-radius', '20px');
+ $value_tag.css('font-size', '15px');
+ search_div.append($value_tag)
+ })
+ }
+
+ var sel_in = selection_input + option + ' '
+ search_div.find('span').append(remove_button);
+ search_div.append(sel_in)
+ search_div.append(search_button)
+ $td.append(search_div)
+ }
+ if (['integer', 'float', 'monetary'].includes(field.type)) {
+ $input.attr({ type: 'number' });
+
+ $input.text(description)
+ if (value_of_tr) {
+ if (typeof value_of_tr == 'number') {
+ value_of_tr = [value_of_tr];
+ }
+ value_of_tr.forEach((val) => {
+ var $value_tag = $('').attr({
+ title: val,
+ name: val,
+ value: val,
+ class: 'd-inline-flex badge',
+ })
+ $value_tag.append($(
+ `${val}
`
+ ))
+ $value_tag.val(val);
+ $value_tag.css('background-color', '#dfdfdf');
+ $value_tag.css('border-radius', '20px');
+ $value_tag.css('font-size', '15px');
+ search_div.append($value_tag)
+ })
+ }
+ search_div.find('span').append(remove_button);
+ search_div.append($input);
+ search_div.append(search_button);
+ $td.append(search_div);
+ }
+ if (['many2one', 'char'].includes(field.type)) {
+ $input.attr({ type: 'text' });
+
+ $input.text(description)
+ const values_of_tr = searched_value.map((val) => {
+ return val[2];
+ })
+ if (values_of_tr.length) {
+ values_of_tr.forEach((val) => {
+ var $value_tag = $('').attr({
+ title: val,
+ name: val,
+ value: val,
+ class: 'd-inline-flex badge',
+ })
+ $value_tag.append($(
+ `${val}
`
+ ))
+ $value_tag.val(val);
+ $value_tag.append(remove_button);
+ $value_tag.css('background-color', '#dfdfdf');
+ $value_tag.css('border-radius', '20px');
+ $value_tag.css('font-size', '15px');
+ search_div.append($value_tag)
+ })
+ }
+ search_div.find('span').append(remove_button);
+ search_div.append($input);
+ search_div.append(search_button);
+ $td.append(search_div);
+ }
+ if (field.type == 'datetime' || field.type == 'date') {
+ var value_of_tr1 = searched_value.length > 1 ? (searched_value[0][2]).split(' ')[0] + '/' + (searched_value[1][2]).split(' ')[0] : ""
+ var search_div = $('').attr({
+ 'class': 'search_div'
+ });
+ var $input_date1 = $('
').attr({
+ type: 'text',
+ name: name,
+ placeholder: 'Date Range',
+ autocomplete: "autocomplete",
+ width: '150px',
+ 'class': 'input_text',
+ 'style': 'min-width:200px !important'
+ });
+ var search_button = $('
').attr({
+ type: 'button',
+ name: name,
+ 'class': 'search_button fa fa-search'
+ });
+ var remove_button = $('').attr({
+ type: 'button',
+ name: name,
+ 'class': 'remove_button fa fa-remove hidden_button',
+ });
+ $input_date1.daterangepicker();
+ $input_date1.on('apply.daterangepicker', function (ev, picker) {
+ $input_date1.val(picker.startDate.format('YYYY-MM-DD') + '/' + picker.endDate.format('YYYY-MM-DD'));
+ var e = $.Event("keypress", {
+ which: 13
+ });
+ $input_date1.trigger(e);
+ e.keyCode = 13
+ self._onfilter(e)
+ $input_date1.change()
+ });
+
+ $input_date1.on('cancel.daterangepicker', function (ev, picker) {
+ $input_date1.val('');
+ var e = $.Event("keypress", {
+ which: 13
+ });
+ $input_date1.trigger(e);
+ e.keyCode = 13
+ self._onfilter(e)
+ $input_date1.change()
+ });
+ $input_date1.text(description)
+ $input_date1.val(value_of_tr1)
+
+ if (value_of_tr1) {
+ $(search_button).addClass('hidden_button');
+ $(remove_button).removeClass('hidden_button');
+ }
+ if ($(search_button).hasClass('hidden_button')) {
+ $input_date1.attr('readonly', 'readonly');
+ $input_date1.css('background-color', '#dfdfdf');
+ $input_date1.css('border-radius', '20px');
+ }
+ search_div.append($input_date1)
+ search_div.append(remove_button)
+ search_div.append(search_button)
+ $td.append(search_div)
+ }
+ }
+ }
+ return $td;
+ },
+
+ _onKeyPress: function (ev) {
+ ev.stopPropagation(); // to prevent jquery's blockUI to cancel event
+ },
+
+ _onSearch: function (event) {
+ var self = this
+ var $target = $(event.currentTarget);
+ var field_name = $target.attr('name')
+ let all_input_tags = $target.parents('tr').find('input.input_text,select.input_text')
+ if (!all_input_tags.length) {
+ all_input_tags = $($('tr')[5]).find('input.input_text,select.input_text')
+ }
+ all_input_tags.each(function (el) {
+ if (all_input_tags[el].name == field_name) {
+ var e = $.Event("keypress", {
+ which: 13
+ });
+ $(all_input_tags[el]).trigger(e);
+ e.keyCode = 13
+ self._onfilter(e)
+ }
+ });
+ },
+
+ _onRemove: function (event) {
+ const List = this.props.list;
+ var self = this;
+ var updated_domain = [];
+ var old_domain = JSON.parse(browser.sessionStorage.getItem('domainlist'));
+ var field_name = $(event.currentTarget).attr('name');
+ var tag_value = $(event.currentTarget.parentElement).attr('value');
+ let all_input_tags = $($('tr')[1]).find('input.input_text');
+
+ if (!all_input_tags.length) {
+ all_input_tags = $($('tr')[5]).find('input.input_text')
+ }
+ const ListDomain = old_domain;
+ if (["monetary", "float", "integer", "selection"].includes(List.fields[field_name].type)) {
+ ListDomain.map(function (el) {
+ tag_value = !isNaN(tag_value) ? parseFloat(tag_value) : tag_value;
+ if (field_name == el[0] && el[2].includes(tag_value)) {
+ const index = el[2].indexOf(tag_value);
+ index > -1 ? el[2].splice(index, 1) : false;
+ el[2].length ? updated_domain.push(el) : false;
+ }
+ else {
+ updated_domain.push(el)
+ }
+ });
+ }
+ else if (["date", "datetime"].includes(List.fields[field_name].type)) {
+ ListDomain.map(function (el) {
+ if (field_name != el[0]) {
+ updated_domain.push(el)
+ }
+ });
+ }
+ else {
+ ListDomain.map(function (el) {
+ if (field_name != el[0] || tag_value != el[2]) {
+ updated_domain.push(el)
+ }
+ if (el == '|') {
+ let index = updated_domain.indexOf('|');
+ updated_domain.splice(index, 1);
+ }
+ });
+ }
+ browser.sessionStorage.setItem('domainlist', JSON.stringify(updated_domain));
+ var indexes = []
+ var to_update = []
+ var count = 0
+ updated_domain.forEach(el => {
+ if (indexes.length && el[1] == 'ilike' && updated_domain[indexes[indexes.length - 1]][0] == el[0]) {
+ to_update.push(indexes[indexes.length - 1])
+ } else if (el[1] == 'ilike') {
+ indexes.push(count)
+ }
+ count += 1;
+ })
+ to_update.reverse()
+ to_update.forEach(A => {
+ updated_domain.splice(A, 0, '|');
+ })
+ self.perform_search(self, updated_domain);
+ self._renderSearchPanel();
+ },
+
+ _onfilter: function (e) {
+ const List = this.props.list;
+ const old_domain = JSON.parse(browser.sessionStorage.getItem('domainlist'));
+
+ if (e.key === 'Enter' || e.keyCode === 13) {
+ var domain_list = [];
+ var self = this
+ var $target = $(e.target);
+ let all_input_tags = $target.parents('tr').find('input.input_text')
+ if (!all_input_tags.length) {
+ all_input_tags = $($('tr')[5]).find('input.input_text')
+ }
+
+ let all_select_tags = $target.parents('tr').find('select.input_text')
+ if (!all_select_tags.length) {
+ all_select_tags = $($('tr')[5]).find('select.input_text')
+ }
+
+ var search_tr = all_input_tags.filter(function (el) {
+ return all_input_tags[el].value
+ });
+ var search_select = all_select_tags.filter(function (el) {
+ return all_select_tags[el].value
+ });
+
+ /* Checking if both the variables `search_tr` and `search_select` are
+ empty. If both variables are empty, it will return without executing the further code. */
+ if (!search_tr.length && !search_select.length) {
+ // self.perform_search(self, domain_list);
+ return
+ }
+
+ for (var i = 0; i < search_tr.length; i++) {
+ var field = $(search_tr[i]).attr('name')
+ var string = search_tr[i].textContent
+ var value = $(search_tr[i]).val()
+ if (value) {
+ if (List.fields[field].type == "date") {
+ var startDate = moment(value.split('/')[0]).format('YYYY-MM-DD');
+ var endDate = moment(value.split('/')[1]).format('YYYY-MM-DD');
+ if (startDate == 'Invalid date' || endDate == 'Invalid date') {
+ window.alert("Please enter valid input for " + string);
+ } else {
+ domain_list.push([field, '>=', startDate])
+ domain_list.push([field, '<=', endDate])
+ }
+ } else if (List.fields[field].type == "datetime") {
+ var startDate = moment(value.split('/')[0]).format('YYYY-MM-DD 00:00:00');
+ var endDate = moment(value.split('/')[1]).format('YYYY-MM-DD 23:59:59');
+ if (startDate == 'Invalid date' || endDate == 'Invalid date') {
+ window.alert("Please enter valid input for " + string);
+ } else {
+ domain_list.push([field, '>=', startDate])
+ domain_list.push([field, '<=', endDate])
+ }
+
+ } else if (["monetary", "float", "integer"].includes(List.fields[field].type)) {
+ var domain = old_domain.filter((domain) => {
+ return domain[0] == field;
+ })
+ if (domain.length) {
+ if (!domain[0][2].includes(parseFloat(value))) {
+ domain[0][2].push(parseFloat(value));
+ }
+ domain_list.push(domain[0])
+ }
+ else {
+ domain_list.push([field, 'in', [parseFloat(value)]]);
+ }
+ } else {
+ if (old_domain.length) {
+ old_domain.forEach((domain) => {
+ if (domain[0] == field) {
+ domain_list.push(domain);
+ }
+ })
+ if (!(old_domain.map((d) => { return d[2] }).includes(value) &&
+ old_domain.map((d) => { return d[0] }).includes(field))) {
+ domain_list.push([field, 'ilike', value]);
+ }
+ }
+ else {
+ domain_list.push([field, 'ilike', value]);
+ }
+ }
+ }
+ }
+ $(all_select_tags).each(function (index, elem) {
+ var elem_value = $(elem).val();
+ var elem_field = $(elem).attr('data_name');
+ if (elem_value.length > 0) {
+ if (List.fields[elem_field].type == 'selection') {
+ var domain = old_domain.filter((domain) => {
+ return domain[0] == elem_field
+ })
+ if (domain.length) {
+ if (!domain[0][2].includes(elem_value)) {
+ domain[0][2].push(elem_value);
+ }
+ domain_list.push(domain[0])
+ }
+ else {
+ domain_list.push([elem_field, 'in', [elem_value]])
+ }
+ }
+ else {
+ domain_list.push([elem_field, '=', elem_value])
+ }
+ }
+ });
+ old_domain.forEach((domain) => {
+ var avail = domain_list.filter(a => {
+ if (domain[1] == 'in') {
+ return domain[2].every(f => a[2].includes(f)) && a[0] == domain[0]
+ }
+ else {
+ return a[2].toString() == domain[2].toString() && a[0] == domain[0]
+ }
+
+ }).length
+ if (!(avail)) {
+ domain_list.push(domain)
+ }
+ })
+ browser.sessionStorage.setItem('domainlist', JSON.stringify(domain_list));
+ var indexes = []
+ var to_update = []
+ var count = 0
+ domain_list.forEach(el => {
+ if (indexes.length && el[1] == 'ilike' && domain_list[indexes[indexes.length - 1]][0] == el[0]) {
+ to_update.push(indexes[indexes.length - 1])
+ } else if (el[1] == 'ilike') {
+ indexes.push(count)
+ }
+ count += 1;
+ })
+ to_update.reverse()
+ to_update.forEach(A => {
+ domain_list.splice(A, 0, '|');
+ })
+ self.perform_search(self, domain_list);
+ }
+ },
+
+ perform_search: async function (self, domain_list) {
+ const searchModel = self.env.searchModel;
+ const list = self.props.list;
+
+
+ if (self.isX2Many) {
+ const bm_params = list.model.config;
+ /**
+ * Function will not apply to new records.
+ */
+ if (!(bm_params.resId || bm_params.resIds.length)) {
+ browser.sessionStorage.setItem('domainlist', JSON.stringify([]));
+ return;
+ }
+ var res_id = bm_params.resId ? bm_params.resId : bm_params.resIds[0]
+ const readIds = await self.env.model.orm.read(
+ self.props.nestedKeyOptionalFieldsData.model,
+ [res_id],
+ [self.props.nestedKeyOptionalFieldsData.field])
+
+ domain_list.push(['id', 'in', readIds[0][self.props.nestedKeyOptionalFieldsData.field]])
+
+ var resIds = await self.env.model.orm.search(list.resModel, domain_list, {
+ limit: session.active_ids_limit,
+ context: list.context,
+ });
+ await list._load({'nextCurrentIds': resIds})
+ }
+ else {
+ searchModel.ak_domains = domain_list;
+ searchModel._notify();
+ }
+ },
+};
+
+patch(ListRenderer.prototype, ListRendererCust);
diff --git a/tree_view_advanced_filter/static/src/libs/daterangepicker.css b/tree_view_advanced_filter/static/src/libs/daterangepicker.css
new file mode 100644
index 000000000..a96380496
--- /dev/null
+++ b/tree_view_advanced_filter/static/src/libs/daterangepicker.css
@@ -0,0 +1,410 @@
+.daterangepicker {
+ position: absolute;
+ color: inherit;
+ background-color: #fff;
+ border-radius: 4px;
+ border: 1px solid #ddd;
+ width: 278px;
+ max-width: none;
+ padding: 0;
+ margin-top: 7px;
+ top: 100px;
+ left: 20px;
+ z-index: 3001;
+ display: none;
+ font-family: arial;
+ font-size: 15px;
+ line-height: 1em;
+}
+
+.daterangepicker:before, .daterangepicker:after {
+ position: absolute;
+ display: inline-block;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ content: '';
+}
+
+.daterangepicker:before {
+ top: -7px;
+ border-right: 7px solid transparent;
+ border-left: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+}
+
+.daterangepicker:after {
+ top: -6px;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #fff;
+ border-left: 6px solid transparent;
+}
+
+.daterangepicker.opensleft:before {
+ right: 9px;
+}
+
+.daterangepicker.opensleft:after {
+ right: 10px;
+}
+
+.daterangepicker.openscenter:before {
+ left: 0;
+ right: 0;
+ width: 0;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.daterangepicker.openscenter:after {
+ left: 0;
+ right: 0;
+ width: 0;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.daterangepicker.opensright:before {
+ left: 9px;
+}
+
+.daterangepicker.opensright:after {
+ left: 10px;
+}
+
+.daterangepicker.drop-up {
+ margin-top: -7px;
+}
+
+.daterangepicker.drop-up:before {
+ top: initial;
+ bottom: -7px;
+ border-bottom: initial;
+ border-top: 7px solid #ccc;
+}
+
+.daterangepicker.drop-up:after {
+ top: initial;
+ bottom: -6px;
+ border-bottom: initial;
+ border-top: 6px solid #fff;
+}
+
+.daterangepicker.single .daterangepicker .ranges, .daterangepicker.single .drp-calendar {
+ float: none;
+}
+
+.daterangepicker.single .drp-selected {
+ display: none;
+}
+
+.daterangepicker.show-calendar .drp-calendar {
+ display: block;
+}
+
+.daterangepicker.show-calendar .drp-buttons {
+ display: block;
+}
+
+.daterangepicker.auto-apply .drp-buttons {
+ display: none;
+}
+
+.daterangepicker .drp-calendar {
+ display: none;
+ max-width: 270px;
+}
+
+.daterangepicker .drp-calendar.left {
+ padding: 8px 0 8px 8px;
+}
+
+.daterangepicker .drp-calendar.right {
+ padding: 8px;
+}
+
+.daterangepicker .drp-calendar.single .calendar-table {
+ border: none;
+}
+
+.daterangepicker .calendar-table .next span, .daterangepicker .calendar-table .prev span {
+ color: #fff;
+ border: solid black;
+ border-width: 0 2px 2px 0;
+ border-radius: 0;
+ display: inline-block;
+ padding: 3px;
+}
+
+.daterangepicker .calendar-table .next span {
+ transform: rotate(-45deg);
+ -webkit-transform: rotate(-45deg);
+}
+
+.daterangepicker .calendar-table .prev span {
+ transform: rotate(135deg);
+ -webkit-transform: rotate(135deg);
+}
+
+.daterangepicker .calendar-table th, .daterangepicker .calendar-table td {
+ white-space: nowrap;
+ text-align: center;
+ vertical-align: middle;
+ min-width: 32px;
+ width: 32px;
+ height: 24px;
+ line-height: 24px;
+ font-size: 12px;
+ border-radius: 4px;
+ border: 1px solid transparent;
+ white-space: nowrap;
+ cursor: pointer;
+}
+
+.daterangepicker .calendar-table {
+ border: 1px solid #fff;
+ border-radius: 4px;
+ background-color: #fff;
+}
+
+.daterangepicker .calendar-table table {
+ width: 100%;
+ margin: 0;
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+.daterangepicker td.available:hover, .daterangepicker th.available:hover {
+ background-color: #eee;
+ border-color: transparent;
+ color: inherit;
+}
+
+.daterangepicker td.week, .daterangepicker th.week {
+ font-size: 80%;
+ color: #ccc;
+}
+
+.daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date {
+ background-color: #fff;
+ border-color: transparent;
+ color: #999;
+}
+
+.daterangepicker td.in-range {
+ background-color: #ebf4f8;
+ border-color: transparent;
+ color: #000;
+ border-radius: 0;
+}
+
+.daterangepicker td.start-date {
+ border-radius: 4px 0 0 4px;
+}
+
+.daterangepicker td.end-date {
+ border-radius: 0 4px 4px 0;
+}
+
+.daterangepicker td.start-date.end-date {
+ border-radius: 4px;
+}
+
+.daterangepicker td.active, .daterangepicker td.active:hover {
+ background-color: #357ebd;
+ border-color: transparent;
+ color: #fff;
+}
+
+.daterangepicker th.month {
+ width: auto;
+}
+
+.daterangepicker td.disabled, .daterangepicker option.disabled {
+ color: #999;
+ cursor: not-allowed;
+ text-decoration: line-through;
+}
+
+.daterangepicker select.monthselect, .daterangepicker select.yearselect {
+ font-size: 12px;
+ padding: 1px;
+ height: auto;
+ margin: 0;
+ cursor: default;
+}
+
+.daterangepicker select.monthselect {
+ margin-right: 2%;
+ width: 56%;
+}
+
+.daterangepicker select.yearselect {
+ width: 40%;
+}
+
+.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect {
+ width: 50px;
+ margin: 0 auto;
+ background: #eee;
+ border: 1px solid #eee;
+ padding: 2px;
+ outline: 0;
+ font-size: 12px;
+}
+
+.daterangepicker .calendar-time {
+ text-align: center;
+ margin: 4px auto 0 auto;
+ line-height: 30px;
+ position: relative;
+}
+
+.daterangepicker .calendar-time select.disabled {
+ color: #ccc;
+ cursor: not-allowed;
+}
+
+.daterangepicker .drp-buttons {
+ clear: both;
+ text-align: right;
+ padding: 8px;
+ border-top: 1px solid #ddd;
+ display: none;
+ line-height: 12px;
+ vertical-align: middle;
+}
+
+.daterangepicker .drp-selected {
+ display: inline-block;
+ font-size: 12px;
+ padding-right: 8px;
+}
+
+.daterangepicker .drp-buttons .btn {
+ margin-left: 8px;
+ font-size: 12px;
+ font-weight: bold;
+ padding: 4px 8px;
+}
+
+.daterangepicker.show-ranges.single.rtl .drp-calendar.left {
+ border-right: 1px solid #ddd;
+}
+
+.daterangepicker.show-ranges.single.ltr .drp-calendar.left {
+ border-left: 1px solid #ddd;
+}
+
+.daterangepicker.show-ranges.rtl .drp-calendar.right {
+ border-right: 1px solid #ddd;
+}
+
+.daterangepicker.show-ranges.ltr .drp-calendar.left {
+ border-left: 1px solid #ddd;
+}
+
+.daterangepicker .ranges {
+ float: none;
+ text-align: left;
+ margin: 0;
+}
+
+.daterangepicker.show-calendar .ranges {
+ margin-top: 8px;
+}
+
+.daterangepicker .ranges ul {
+ list-style: none;
+ margin: 0 auto;
+ padding: 0;
+ width: 100%;
+}
+
+.daterangepicker .ranges li {
+ font-size: 12px;
+ padding: 8px 12px;
+ cursor: pointer;
+}
+
+.daterangepicker .ranges li:hover {
+ background-color: #eee;
+}
+
+.daterangepicker .ranges li.active {
+ background-color: #08c;
+ color: #fff;
+}
+
+/* Larger Screen Styling */
+@media (min-width: 564px) {
+ .daterangepicker {
+ width: auto;
+ }
+
+ .daterangepicker .ranges ul {
+ width: 140px;
+ }
+
+ .daterangepicker.single .ranges ul {
+ width: 100%;
+ }
+
+ .daterangepicker.single .drp-calendar.left {
+ clear: none;
+ }
+
+ .daterangepicker.single .ranges, .daterangepicker.single .drp-calendar {
+ float: left;
+ }
+
+ .daterangepicker {
+ direction: ltr;
+ text-align: left;
+ }
+
+ .daterangepicker .drp-calendar.left {
+ clear: left;
+ margin-right: 0;
+ }
+
+ .daterangepicker .drp-calendar.left .calendar-table {
+ border-right: none;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+
+ .daterangepicker .drp-calendar.right {
+ margin-left: 0;
+ }
+
+ .daterangepicker .drp-calendar.right .calendar-table {
+ border-left: none;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ .daterangepicker .drp-calendar.left .calendar-table {
+ padding-right: 8px;
+ }
+
+ .daterangepicker .ranges, .daterangepicker .drp-calendar {
+ float: left;
+ }
+}
+
+@media (min-width: 730px) {
+ .daterangepicker .ranges {
+ width: auto;
+ }
+
+ .daterangepicker .ranges {
+ float: left;
+ }
+
+ .daterangepicker.rtl .ranges {
+ float: right;
+ }
+
+ .daterangepicker .drp-calendar.left {
+ clear: none !important;
+ }
+}
diff --git a/tree_view_advanced_filter/static/src/libs/daterangepicker.min.js b/tree_view_advanced_filter/static/src/libs/daterangepicker.min.js
new file mode 100644
index 000000000..7248e02f9
--- /dev/null
+++ b/tree_view_advanced_filter/static/src/libs/daterangepicker.min.js
@@ -0,0 +1,15 @@
+/**
+ * Minified by jsDelivr using Terser v5.19.2.
+ * Original file: /npm/daterangepicker@3.1.0/daterangepicker.js
+ *
+ * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
+ */
+/**
+* @version: 3.1
+* @author: Dan Grossman http://www.dangrossman.info/
+* @copyright: Copyright (c) 2012-2019 Dan Grossman. All rights reserved.
+* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php
+* @website: http://www.daterangepicker.com/
+*/
+!function(t,e){if("function"==typeof define&&define.amd)define(["moment","jquery"],(function(t,a){return a.fn||(a.fn={}),"function"!=typeof t&&t.hasOwnProperty("default")&&(t=t.default),e(t,a)}));else if("object"==typeof module&&module.exports){var a="undefined"!=typeof window?window.jQuery:void 0;a||(a=require("jquery")).fn||(a.fn={});var i="undefined"!=typeof window&&void 0!==window.moment?window.moment:require("moment");module.exports=e(i,a)}else t.daterangepicker=e(t.moment,t.jQuery)}(this,(function(t,e){var a=function(a,i,s){if(this.parentEl="body",this.element=e(a),this.startDate=t().startOf("day"),this.endDate=t().endOf("day"),this.minDate=!1,this.maxDate=!1,this.maxSpan=!1,this.autoApply=!1,this.singleDatePicker=!1,this.showDropdowns=!1,this.minYear=t().subtract(100,"year").format("YYYY"),this.maxYear=t().add(100,"year").format("YYYY"),this.showWeekNumbers=!1,this.showISOWeekNumbers=!1,this.showCustomRangeLabel=!0,this.timePicker=!1,this.timePicker24Hour=!1,this.timePickerIncrement=1,this.timePickerSeconds=!1,this.linkedCalendars=!0,this.autoUpdateInput=!0,this.alwaysShowCalendars=!1,this.ranges={},this.opens="right",this.element.hasClass("pull-right")&&(this.opens="left"),this.drops="down",this.element.hasClass("dropup")&&(this.drops="up"),this.buttonClasses="btn btn-sm",this.applyButtonClasses="btn-primary",this.cancelButtonClasses="btn-default",this.locale={direction:"ltr",format:t.localeData().longDateFormat("L"),separator:" - ",applyLabel:"Apply",cancelLabel:"Cancel",weekLabel:"W",customRangeLabel:"Custom Range",daysOfWeek:t.weekdaysMin(),monthNames:t.monthsShort(),firstDay:t.localeData().firstDayOfWeek()},this.callback=function(){},this.isShowing=!1,this.leftCalendar={},this.rightCalendar={},"object"==typeof i&&null!==i||(i={}),"string"==typeof(i=e.extend(this.element.data(),i)).template||i.template instanceof e||(i.template=''),this.parentEl=i.parentEl&&e(i.parentEl).length?e(i.parentEl):e(this.parentEl),this.container=e(i.template).appendTo(this.parentEl),"object"==typeof i.locale&&("string"==typeof i.locale.direction&&(this.locale.direction=i.locale.direction),"string"==typeof i.locale.format&&(this.locale.format=i.locale.format),"string"==typeof i.locale.separator&&(this.locale.separator=i.locale.separator),"object"==typeof i.locale.daysOfWeek&&(this.locale.daysOfWeek=i.locale.daysOfWeek.slice()),"object"==typeof i.locale.monthNames&&(this.locale.monthNames=i.locale.monthNames.slice()),"number"==typeof i.locale.firstDay&&(this.locale.firstDay=i.locale.firstDay),"string"==typeof i.locale.applyLabel&&(this.locale.applyLabel=i.locale.applyLabel),"string"==typeof i.locale.cancelLabel&&(this.locale.cancelLabel=i.locale.cancelLabel),"string"==typeof i.locale.weekLabel&&(this.locale.weekLabel=i.locale.weekLabel),"string"==typeof i.locale.customRangeLabel)){(p=document.createElement("textarea")).innerHTML=i.locale.customRangeLabel;var n=p.value;this.locale.customRangeLabel=n}if(this.container.addClass(this.locale.direction),"string"==typeof i.startDate&&(this.startDate=t(i.startDate,this.locale.format)),"string"==typeof i.endDate&&(this.endDate=t(i.endDate,this.locale.format)),"string"==typeof i.minDate&&(this.minDate=t(i.minDate,this.locale.format)),"string"==typeof i.maxDate&&(this.maxDate=t(i.maxDate,this.locale.format)),"object"==typeof i.startDate&&(this.startDate=t(i.startDate)),"object"==typeof i.endDate&&(this.endDate=t(i.endDate)),"object"==typeof i.minDate&&(this.minDate=t(i.minDate)),"object"==typeof i.maxDate&&(this.maxDate=t(i.maxDate)),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),"string"==typeof i.applyButtonClasses&&(this.applyButtonClasses=i.applyButtonClasses),"string"==typeof i.applyClass&&(this.applyButtonClasses=i.applyClass),"string"==typeof i.cancelButtonClasses&&(this.cancelButtonClasses=i.cancelButtonClasses),"string"==typeof i.cancelClass&&(this.cancelButtonClasses=i.cancelClass),"object"==typeof i.maxSpan&&(this.maxSpan=i.maxSpan),"object"==typeof i.dateLimit&&(this.maxSpan=i.dateLimit),"string"==typeof i.opens&&(this.opens=i.opens),"string"==typeof i.drops&&(this.drops=i.drops),"boolean"==typeof i.showWeekNumbers&&(this.showWeekNumbers=i.showWeekNumbers),"boolean"==typeof i.showISOWeekNumbers&&(this.showISOWeekNumbers=i.showISOWeekNumbers),"string"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses),"object"==typeof i.buttonClasses&&(this.buttonClasses=i.buttonClasses.join(" ")),"boolean"==typeof i.showDropdowns&&(this.showDropdowns=i.showDropdowns),"number"==typeof i.minYear&&(this.minYear=i.minYear),"number"==typeof i.maxYear&&(this.maxYear=i.maxYear),"boolean"==typeof i.showCustomRangeLabel&&(this.showCustomRangeLabel=i.showCustomRangeLabel),"boolean"==typeof i.singleDatePicker&&(this.singleDatePicker=i.singleDatePicker,this.singleDatePicker&&(this.endDate=this.startDate.clone())),"boolean"==typeof i.timePicker&&(this.timePicker=i.timePicker),"boolean"==typeof i.timePickerSeconds&&(this.timePickerSeconds=i.timePickerSeconds),"number"==typeof i.timePickerIncrement&&(this.timePickerIncrement=i.timePickerIncrement),"boolean"==typeof i.timePicker24Hour&&(this.timePicker24Hour=i.timePicker24Hour),"boolean"==typeof i.autoApply&&(this.autoApply=i.autoApply),"boolean"==typeof i.autoUpdateInput&&(this.autoUpdateInput=i.autoUpdateInput),"boolean"==typeof i.linkedCalendars&&(this.linkedCalendars=i.linkedCalendars),"function"==typeof i.isInvalidDate&&(this.isInvalidDate=i.isInvalidDate),"function"==typeof i.isCustomDate&&(this.isCustomDate=i.isCustomDate),"boolean"==typeof i.alwaysShowCalendars&&(this.alwaysShowCalendars=i.alwaysShowCalendars),0!=this.locale.firstDay)for(var r=this.locale.firstDay;r>0;)this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()),r--;var o,h,l;if(void 0===i.startDate&&void 0===i.endDate&&e(this.element).is(":text")){var c=e(this.element).val(),d=c.split(this.locale.separator);o=h=null,2==d.length?(o=t(d[0],this.locale.format),h=t(d[1],this.locale.format)):this.singleDatePicker&&""!==c&&(o=t(c,this.locale.format),h=t(c,this.locale.format)),null!==o&&null!==h&&(this.setStartDate(o),this.setEndDate(h))}if("object"==typeof i.ranges){for(l in i.ranges){o="string"==typeof i.ranges[l][0]?t(i.ranges[l][0],this.locale.format):t(i.ranges[l][0]),h="string"==typeof i.ranges[l][1]?t(i.ranges[l][1],this.locale.format):t(i.ranges[l][1]),this.minDate&&o.isBefore(this.minDate)&&(o=this.minDate.clone());var m=this.maxDate;if(this.maxSpan&&m&&o.clone().add(this.maxSpan).isAfter(m)&&(m=o.clone().add(this.maxSpan)),m&&h.isAfter(m)&&(h=m.clone()),!(this.minDate&&h.isBefore(this.minDate,this.timepicker?"minute":"day")||m&&o.isAfter(m,this.timepicker?"minute":"day"))){var p;(p=document.createElement("textarea")).innerHTML=l;n=p.value;this.ranges[n]=[o,h]}}var f="";for(l in this.ranges)f+=''+l+" ";this.showCustomRangeLabel&&(f+=''+this.locale.customRangeLabel+" "),f+=" ",this.container.find(".ranges").prepend(f)}"function"==typeof s&&(this.callback=s),this.timePicker||(this.startDate=this.startDate.startOf("day"),this.endDate=this.endDate.endOf("day"),this.container.find(".calendar-time").hide()),this.timePicker&&this.autoApply&&(this.autoApply=!1),this.autoApply&&this.container.addClass("auto-apply"),"object"==typeof i.ranges&&this.container.addClass("show-ranges"),this.singleDatePicker&&(this.container.addClass("single"),this.container.find(".drp-calendar.left").addClass("single"),this.container.find(".drp-calendar.left").show(),this.container.find(".drp-calendar.right").hide(),!this.timePicker&&this.autoApply&&this.container.addClass("auto-apply")),(void 0===i.ranges&&!this.singleDatePicker||this.alwaysShowCalendars)&&this.container.addClass("show-calendar"),this.container.addClass("opens"+this.opens),this.container.find(".applyBtn, .cancelBtn").addClass(this.buttonClasses),this.applyButtonClasses.length&&this.container.find(".applyBtn").addClass(this.applyButtonClasses),this.cancelButtonClasses.length&&this.container.find(".cancelBtn").addClass(this.cancelButtonClasses),this.container.find(".applyBtn").html(this.locale.applyLabel),this.container.find(".cancelBtn").html(this.locale.cancelLabel),this.container.find(".drp-calendar").on("click.daterangepicker",".prev",e.proxy(this.clickPrev,this)).on("click.daterangepicker",".next",e.proxy(this.clickNext,this)).on("mousedown.daterangepicker","td.available",e.proxy(this.clickDate,this)).on("mouseenter.daterangepicker","td.available",e.proxy(this.hoverDate,this)).on("change.daterangepicker","select.yearselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.monthselect",e.proxy(this.monthOrYearChanged,this)).on("change.daterangepicker","select.hourselect,select.minuteselect,select.secondselect,select.ampmselect",e.proxy(this.timeChanged,this)),this.container.find(".ranges").on("click.daterangepicker","li",e.proxy(this.clickRange,this)),this.container.find(".drp-buttons").on("click.daterangepicker","button.applyBtn",e.proxy(this.clickApply,this)).on("click.daterangepicker","button.cancelBtn",e.proxy(this.clickCancel,this)),this.element.is("input")||this.element.is("button")?this.element.on({"click.daterangepicker":e.proxy(this.show,this),"focus.daterangepicker":e.proxy(this.show,this),"keyup.daterangepicker":e.proxy(this.elementChanged,this),"keydown.daterangepicker":e.proxy(this.keydown,this)}):(this.element.on("click.daterangepicker",e.proxy(this.toggle,this)),this.element.on("keydown.daterangepicker",e.proxy(this.toggle,this))),this.updateElement()};return a.prototype={constructor:a,setStartDate:function(e){"string"==typeof e&&(this.startDate=t(e,this.locale.format)),"object"==typeof e&&(this.startDate=t(e)),this.timePicker||(this.startDate=this.startDate.startOf("day")),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.minDate&&this.startDate.isBefore(this.minDate)&&(this.startDate=this.minDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.round(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.maxDate&&this.startDate.isAfter(this.maxDate)&&(this.startDate=this.maxDate.clone(),this.timePicker&&this.timePickerIncrement&&this.startDate.minute(Math.floor(this.startDate.minute()/this.timePickerIncrement)*this.timePickerIncrement)),this.isShowing||this.updateElement(),this.updateMonthsInView()},setEndDate:function(e){"string"==typeof e&&(this.endDate=t(e,this.locale.format)),"object"==typeof e&&(this.endDate=t(e)),this.timePicker||(this.endDate=this.endDate.endOf("day")),this.timePicker&&this.timePickerIncrement&&this.endDate.minute(Math.round(this.endDate.minute()/this.timePickerIncrement)*this.timePickerIncrement),this.endDate.isBefore(this.startDate)&&(this.endDate=this.startDate.clone()),this.maxDate&&this.endDate.isAfter(this.maxDate)&&(this.endDate=this.maxDate.clone()),this.maxSpan&&this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)&&(this.endDate=this.startDate.clone().add(this.maxSpan)),this.previousRightTime=this.endDate.clone(),this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.isShowing||this.updateElement(),this.updateMonthsInView()},isInvalidDate:function(){return!1},isCustomDate:function(){return!1},updateView:function(){this.timePicker&&(this.renderTimePicker("left"),this.renderTimePicker("right"),this.endDate?this.container.find(".right .calendar-time select").prop("disabled",!1).removeClass("disabled"):this.container.find(".right .calendar-time select").prop("disabled",!0).addClass("disabled")),this.endDate&&this.container.find(".drp-selected").html(this.startDate.format(this.locale.format)+this.locale.separator+this.endDate.format(this.locale.format)),this.updateMonthsInView(),this.updateCalendars(),this.updateFormInputs()},updateMonthsInView:function(){if(this.endDate){if(!this.singleDatePicker&&this.leftCalendar.month&&this.rightCalendar.month&&(this.startDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.startDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM"))&&(this.endDate.format("YYYY-MM")==this.leftCalendar.month.format("YYYY-MM")||this.endDate.format("YYYY-MM")==this.rightCalendar.month.format("YYYY-MM")))return;this.leftCalendar.month=this.startDate.clone().date(2),this.linkedCalendars||this.endDate.month()==this.startDate.month()&&this.endDate.year()==this.startDate.year()?this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"):this.rightCalendar.month=this.endDate.clone().date(2)}else this.leftCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&this.rightCalendar.month.format("YYYY-MM")!=this.startDate.format("YYYY-MM")&&(this.leftCalendar.month=this.startDate.clone().date(2),this.rightCalendar.month=this.startDate.clone().date(2).add(1,"month"));this.maxDate&&this.linkedCalendars&&!this.singleDatePicker&&this.rightCalendar.month>this.maxDate&&(this.rightCalendar.month=this.maxDate.clone().date(2),this.leftCalendar.month=this.maxDate.clone().date(2).subtract(1,"month"))},updateCalendars:function(){if(this.timePicker){var t,e,a,i;if(this.endDate){if(t=parseInt(this.container.find(".left .hourselect").val(),10),e=parseInt(this.container.find(".left .minuteselect").val(),10),isNaN(e)&&(e=parseInt(this.container.find(".left .minuteselect option:last").val(),10)),a=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".left .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0)}else if(t=parseInt(this.container.find(".right .hourselect").val(),10),e=parseInt(this.container.find(".right .minuteselect").val(),10),isNaN(e)&&(e=parseInt(this.container.find(".right .minuteselect option:last").val(),10)),a=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0,!this.timePicker24Hour)"PM"===(i=this.container.find(".right .ampmselect").val())&&t<12&&(t+=12),"AM"===i&&12===t&&(t=0);this.leftCalendar.month.hour(t).minute(e).second(a),this.rightCalendar.month.hour(t).minute(e).second(a)}this.renderCalendar("left"),this.renderCalendar("right"),this.container.find(".ranges li").removeClass("active"),null!=this.endDate&&this.calculateChosenLabel()},renderCalendar:function(a){var i,s=(i="left"==a?this.leftCalendar:this.rightCalendar).month.month(),n=i.month.year(),r=i.month.hour(),o=i.month.minute(),h=i.month.second(),l=t([n,s]).daysInMonth(),c=t([n,s,1]),d=t([n,s,l]),m=t(c).subtract(1,"month").month(),p=t(c).subtract(1,"month").year(),f=t([p,m]).daysInMonth(),u=c.day();(i=[]).firstDay=c,i.lastDay=d;for(var D=0;D<6;D++)i[D]=[];var g=f-u+this.locale.firstDay+1;g>f&&(g-=7),u==this.locale.firstDay&&(g=f-6);for(var y=t([p,m,g,12,o,h]),k=(D=0,0),b=0;D<42;D++,k++,y=t(y).add(24,"hour"))D>0&&k%7==0&&(k=0,b++),i[b][k]=y.clone().hour(r).minute(o).second(h),y.hour(12),this.minDate&&i[b][k].format("YYYY-MM-DD")==this.minDate.format("YYYY-MM-DD")&&i[b][k].isBefore(this.minDate)&&"left"==a&&(i[b][k]=this.minDate.clone()),this.maxDate&&i[b][k].format("YYYY-MM-DD")==this.maxDate.format("YYYY-MM-DD")&&i[b][k].isAfter(this.maxDate)&&"right"==a&&(i[b][k]=this.maxDate.clone());"left"==a?this.leftCalendar.calendar=i:this.rightCalendar.calendar=i;var v="left"==a?this.minDate:this.startDate,C=this.maxDate,Y=("left"==a?this.startDate:this.endDate,this.locale.direction,'');Y+="",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+=" "),v&&!v.isBefore(i.firstDay)||this.linkedCalendars&&"left"!=a?Y+=" ":Y+=' ';var w=this.locale.monthNames[i[1][1].month()]+i[1][1].format(" YYYY");if(this.showDropdowns){for(var P=i[1][1].month(),x=i[1][1].year(),M=C&&C.year()||this.maxYear,I=v&&v.year()||this.minYear,S=x==I,B=x==M,A='',L=0;L<12;L++)(!S||v&&L>=v.month())&&(!B||C&&L<=C.month())?A+=""+this.locale.monthNames[L]+" ":A+=""+this.locale.monthNames[L]+" ";A+=" ";for(var N='',E=I;E<=M;E++)N+='"+E+" ";w=A+(N+=" ")}if(Y+=''+w+" ",C&&!C.isAfter(i.lastDay)||this.linkedCalendars&&"right"!=a&&!this.singleDatePicker?Y+=" ":Y+=' ',Y+=" ",Y+="",(this.showWeekNumbers||this.showISOWeekNumbers)&&(Y+=''+this.locale.weekLabel+" "),e.each(this.locale.daysOfWeek,(function(t,e){Y+=""+e+" "})),Y+=" ",Y+=" ",Y+="",null==this.endDate&&this.maxSpan){var O=this.startDate.clone().add(this.maxSpan).endOf("day");C&&!O.isBefore(C)||(C=O)}for(b=0;b<6;b++){Y+="",this.showWeekNumbers?Y+=''+i[b][0].week()+" ":this.showISOWeekNumbers&&(Y+=''+i[b][0].isoWeek()+" ");for(k=0;k<7;k++){var W=[];i[b][k].isSame(new Date,"day")&&W.push("today"),i[b][k].isoWeekday()>5&&W.push("weekend"),i[b][k].month()!=i[1][1].month()&&W.push("off","ends"),this.minDate&&i[b][k].isBefore(this.minDate,"day")&&W.push("off","disabled"),C&&i[b][k].isAfter(C,"day")&&W.push("off","disabled"),this.isInvalidDate(i[b][k])&&W.push("off","disabled"),i[b][k].format("YYYY-MM-DD")==this.startDate.format("YYYY-MM-DD")&&W.push("active","start-date"),null!=this.endDate&&i[b][k].format("YYYY-MM-DD")==this.endDate.format("YYYY-MM-DD")&&W.push("active","end-date"),null!=this.endDate&&i[b][k]>this.startDate&&i[b][k]'+i[b][k].date()+""}Y+=" "}Y+=" ",Y+="
",this.container.find(".drp-calendar."+a+" .calendar-table").html(Y)},renderTimePicker:function(t){if("right"!=t||this.endDate){var e,a,i,s=this.maxDate;if(!this.maxSpan||this.maxDate&&!this.startDate.clone().add(this.maxSpan).isBefore(this.maxDate)||(s=this.startDate.clone().add(this.maxSpan)),"left"==t)a=this.startDate.clone(),i=this.minDate;else if("right"==t){a=this.endDate.clone(),i=this.startDate;var n=this.container.find(".drp-calendar.right .calendar-time");if(""!=n.html()&&(a.hour(isNaN(a.hour())?n.find(".hourselect option:selected").val():a.hour()),a.minute(isNaN(a.minute())?n.find(".minuteselect option:selected").val():a.minute()),a.second(isNaN(a.second())?n.find(".secondselect option:selected").val():a.second()),!this.timePicker24Hour)){var r=n.find(".ampmselect option:selected").val();"PM"===r&&a.hour()<12&&a.hour(a.hour()+12),"AM"===r&&12===a.hour()&&a.hour(0)}a.isBefore(this.startDate)&&(a=this.startDate.clone()),s&&a.isAfter(s)&&(a=s.clone())}e='';for(var o=this.timePicker24Hour?0:1,h=this.timePicker24Hour?23:12,l=o;l<=h;l++){var c=l;this.timePicker24Hour||(c=a.hour()>=12?12==l?12:l+12:12==l?0:l);var d=a.clone().hour(c),m=!1;i&&d.minute(59).isBefore(i)&&(m=!0),s&&d.minute(0).isAfter(s)&&(m=!0),c!=a.hour()||m?e+=m?''+l+" ":''+l+" ":e+=''+l+" "}e+=" ",e+=': ';for(l=0;l<60;l+=this.timePickerIncrement){var p=l<10?"0"+l:l;d=a.clone().minute(l),m=!1;i&&d.second(59).isBefore(i)&&(m=!0),s&&d.second(0).isAfter(s)&&(m=!0),a.minute()!=l||m?e+=m?''+p+" ":''+p+" ":e+=''+p+" "}if(e+=" ",this.timePickerSeconds){e+=': ';for(l=0;l<60;l++){p=l<10?"0"+l:l,d=a.clone().second(l),m=!1;i&&d.isBefore(i)&&(m=!0),s&&d.isAfter(s)&&(m=!0),a.second()!=l||m?e+=m?''+p+" ":''+p+" ":e+=''+p+" "}e+=" "}if(!this.timePicker24Hour){e+='';var f="",u="";i&&a.clone().hour(12).minute(0).second(0).isBefore(i)&&(f=' disabled="disabled" class="disabled"'),s&&a.clone().hour(0).minute(0).second(0).isAfter(s)&&(u=' disabled="disabled" class="disabled"'),a.hour()>=12?e+='AM PM ":e+='AM PM ",e+=" "}this.container.find(".drp-calendar."+t+" .calendar-time").html(e)}},updateFormInputs:function(){this.singleDatePicker||this.endDate&&(this.startDate.isBefore(this.endDate)||this.startDate.isSame(this.endDate))?this.container.find("button.applyBtn").prop("disabled",!1):this.container.find("button.applyBtn").prop("disabled",!0)},move:function(){var t,a={top:0,left:0},i=this.drops,s=e(window).width();switch(this.parentEl.is("body")||(a={top:this.parentEl.offset().top-this.parentEl.scrollTop(),left:this.parentEl.offset().left-this.parentEl.scrollLeft()},s=this.parentEl[0].clientWidth+this.parentEl.offset().left),i){case"auto":(t=this.element.offset().top+this.element.outerHeight()-a.top)+this.container.outerHeight()>=this.parentEl[0].scrollHeight&&(t=this.element.offset().top-this.container.outerHeight()-a.top,i="up");break;case"up":t=this.element.offset().top-this.container.outerHeight()-a.top;break;default:t=this.element.offset().top+this.element.outerHeight()-a.top}this.container.css({top:0,left:0,right:"auto"});var n=this.container.outerWidth();if(this.container.toggleClass("drop-up","up"==i),"left"==this.opens){var r=s-this.element.offset().left-this.element.outerWidth();n+r>e(window).width()?this.container.css({top:t,right:"auto",left:9}):this.container.css({top:t,right:r,left:"auto"})}else if("center"==this.opens){(o=this.element.offset().left-a.left+this.element.outerWidth()/2-n/2)<0?this.container.css({top:t,right:"auto",left:9}):o+n>e(window).width()?this.container.css({top:t,left:"auto",right:0}):this.container.css({top:t,left:o,right:"auto"})}else{var o;(o=this.element.offset().left-a.left)+n>e(window).width()?this.container.css({top:t,left:"auto",right:0}):this.container.css({top:t,left:o,right:"auto"})}},show:function(t){this.isShowing||(this._outsideClickProxy=e.proxy((function(t){this.outsideClick(t)}),this),e(document).on("mousedown.daterangepicker",this._outsideClickProxy).on("touchend.daterangepicker",this._outsideClickProxy).on("click.daterangepicker","[data-toggle=dropdown]",this._outsideClickProxy).on("focusin.daterangepicker",this._outsideClickProxy),e(window).on("resize.daterangepicker",e.proxy((function(t){this.move(t)}),this)),this.oldStartDate=this.startDate.clone(),this.oldEndDate=this.endDate.clone(),this.previousRightTime=this.endDate.clone(),this.updateView(),this.container.show(),this.move(),this.element.trigger("show.daterangepicker",this),this.isShowing=!0)},hide:function(t){this.isShowing&&(this.endDate||(this.startDate=this.oldStartDate.clone(),this.endDate=this.oldEndDate.clone()),this.startDate.isSame(this.oldStartDate)&&this.endDate.isSame(this.oldEndDate)||this.callback(this.startDate.clone(),this.endDate.clone(),this.chosenLabel),this.updateElement(),e(document).off(".daterangepicker"),e(window).off(".daterangepicker"),this.container.hide(),this.element.trigger("hide.daterangepicker",this),this.isShowing=!1)},toggle:function(t){this.isShowing?this.hide():this.show()},outsideClick:function(t){var a=e(t.target);"focusin"==t.type||a.closest(this.element).length||a.closest(this.container).length||a.closest(".calendar-table").length||(this.hide(),this.element.trigger("outsideClick.daterangepicker",this))},showCalendars:function(){this.container.addClass("show-calendar"),this.move(),this.element.trigger("showCalendar.daterangepicker",this)},hideCalendars:function(){this.container.removeClass("show-calendar"),this.element.trigger("hideCalendar.daterangepicker",this)},clickRange:function(t){var e=t.target.getAttribute("data-range-key");if(this.chosenLabel=e,e==this.locale.customRangeLabel)this.showCalendars();else{var a=this.ranges[e];this.startDate=a[0],this.endDate=a[1],this.timePicker||(this.startDate.startOf("day"),this.endDate.endOf("day")),this.alwaysShowCalendars||this.hideCalendars(),this.clickApply()}},clickPrev:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?(this.leftCalendar.month.subtract(1,"month"),this.linkedCalendars&&this.rightCalendar.month.subtract(1,"month")):this.rightCalendar.month.subtract(1,"month"),this.updateCalendars()},clickNext:function(t){e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.month.add(1,"month"):(this.rightCalendar.month.add(1,"month"),this.linkedCalendars&&this.leftCalendar.month.add(1,"month")),this.updateCalendars()},hoverDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s],r=this.leftCalendar,o=this.rightCalendar,h=this.startDate;this.endDate||this.container.find(".drp-calendar tbody td").each((function(t,a){if(!e(a).hasClass("week")){var i=e(a).attr("data-title"),s=i.substr(1,1),l=i.substr(3,1),c=e(a).parents(".drp-calendar").hasClass("left")?r.calendar[s][l]:o.calendar[s][l];c.isAfter(h)&&c.isBefore(n)||c.isSame(n,"day")?e(a).addClass("in-range"):e(a).removeClass("in-range")}}))}},clickDate:function(t){if(e(t.target).hasClass("available")){var a=e(t.target).attr("data-title"),i=a.substr(1,1),s=a.substr(3,1),n=e(t.target).parents(".drp-calendar").hasClass("left")?this.leftCalendar.calendar[i][s]:this.rightCalendar.calendar[i][s];if(this.endDate||n.isBefore(this.startDate,"day")){if(this.timePicker){var r=parseInt(this.container.find(".left .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".left .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);var o=parseInt(this.container.find(".left .minuteselect").val(),10);isNaN(o)&&(o=parseInt(this.container.find(".left .minuteselect option:last").val(),10));var h=this.timePickerSeconds?parseInt(this.container.find(".left .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.endDate=null,this.setStartDate(n.clone())}else if(!this.endDate&&n.isBefore(this.startDate))this.setEndDate(this.startDate.clone());else{if(this.timePicker){var l;r=parseInt(this.container.find(".right .hourselect").val(),10);if(!this.timePicker24Hour)"PM"===(l=this.container.find(".right .ampmselect").val())&&r<12&&(r+=12),"AM"===l&&12===r&&(r=0);o=parseInt(this.container.find(".right .minuteselect").val(),10);isNaN(o)&&(o=parseInt(this.container.find(".right .minuteselect option:last").val(),10));h=this.timePickerSeconds?parseInt(this.container.find(".right .secondselect").val(),10):0;n=n.clone().hour(r).minute(o).second(h)}this.setEndDate(n.clone()),this.autoApply&&(this.calculateChosenLabel(),this.clickApply())}this.singleDatePicker&&(this.setEndDate(this.startDate),!this.timePicker&&this.autoApply&&this.clickApply()),this.updateView(),t.stopPropagation()}},calculateChosenLabel:function(){var t=!0,e=0;for(var a in this.ranges){if(this.timePicker){var i=this.timePickerSeconds?"YYYY-MM-DD HH:mm:ss":"YYYY-MM-DD HH:mm";if(this.startDate.format(i)==this.ranges[a][0].format(i)&&this.endDate.format(i)==this.ranges[a][1].format(i)){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}}else if(this.startDate.format("YYYY-MM-DD")==this.ranges[a][0].format("YYYY-MM-DD")&&this.endDate.format("YYYY-MM-DD")==this.ranges[a][1].format("YYYY-MM-DD")){t=!1,this.chosenLabel=this.container.find(".ranges li:eq("+e+")").addClass("active").attr("data-range-key");break}e++}t&&(this.showCustomRangeLabel?this.chosenLabel=this.container.find(".ranges li:last").addClass("active").attr("data-range-key"):this.chosenLabel=null,this.showCalendars())},clickApply:function(t){this.hide(),this.element.trigger("apply.daterangepicker",this)},clickCancel:function(t){this.startDate=this.oldStartDate,this.endDate=this.oldEndDate,this.hide(),this.element.trigger("cancel.daterangepicker",this)},monthOrYearChanged:function(t){var a=e(t.target).closest(".drp-calendar").hasClass("left"),i=a?"left":"right",s=this.container.find(".drp-calendar."+i),n=parseInt(s.find(".monthselect").val(),10),r=s.find(".yearselect").val();a||(rthis.maxDate.year()||r==this.maxDate.year()&&n>this.maxDate.month())&&(n=this.maxDate.month(),r=this.maxDate.year()),a?(this.leftCalendar.month.month(n).year(r),this.linkedCalendars&&(this.rightCalendar.month=this.leftCalendar.month.clone().add(1,"month"))):(this.rightCalendar.month.month(n).year(r),this.linkedCalendars&&(this.leftCalendar.month=this.rightCalendar.month.clone().subtract(1,"month"))),this.updateCalendars()},timeChanged:function(t){var a=e(t.target).closest(".drp-calendar"),i=a.hasClass("left"),s=parseInt(a.find(".hourselect").val(),10),n=parseInt(a.find(".minuteselect").val(),10);isNaN(n)&&(n=parseInt(a.find(".minuteselect option:last").val(),10));var r=this.timePickerSeconds?parseInt(a.find(".secondselect").val(),10):0;if(!this.timePicker24Hour){var o=a.find(".ampmselect").val();"PM"===o&&s<12&&(s+=12),"AM"===o&&12===s&&(s=0)}if(i){var h=this.startDate.clone();h.hour(s),h.minute(n),h.second(r),this.setStartDate(h),this.singleDatePicker?this.endDate=this.startDate.clone():this.endDate&&this.endDate.format("YYYY-MM-DD")==h.format("YYYY-MM-DD")&&this.endDate.isBefore(h)&&this.setEndDate(h.clone())}else if(this.endDate){var l=this.endDate.clone();l.hour(s),l.minute(n),l.second(r),this.setEndDate(l)}this.updateCalendars(),this.updateFormInputs(),this.renderTimePicker("left"),this.renderTimePicker("right")},elementChanged:function(){if(this.element.is("input")&&this.element.val().length){var e=this.element.val().split(this.locale.separator),a=null,i=null;2===e.length&&(a=t(e[0],this.locale.format),i=t(e[1],this.locale.format)),(this.singleDatePicker||null===a||null===i)&&(i=a=t(this.element.val(),this.locale.format)),a.isValid()&&i.isValid()&&(this.setStartDate(a),this.setEndDate(i),this.updateView())}},keydown:function(t){9!==t.keyCode&&13!==t.keyCode||this.hide(),27===t.keyCode&&(t.preventDefault(),t.stopPropagation(),this.hide())},updateElement:function(){if(this.element.is("input")&&this.autoUpdateInput){var t=this.startDate.format(this.locale.format);this.singleDatePicker||(t+=this.locale.separator+this.endDate.format(this.locale.format)),t!==this.element.val()&&this.element.val(t).trigger("change")}},remove:function(){this.container.remove(),this.element.off(".daterangepicker"),this.element.removeData()}},e.fn.daterangepicker=function(t,i){var s=e.extend(!0,{},e.fn.daterangepicker.defaultOptions,t);return this.each((function(){var t=e(this);t.data("daterangepicker")&&t.data("daterangepicker").remove(),t.data("daterangepicker",new a(t,s,i))})),this},a}));
+//# sourceMappingURL=/sm/88e48650a36caa41dd1aa0f1a5ee66247818a496500de85dec44b4e2e87cd438.map
\ No newline at end of file
diff --git a/tree_view_advanced_filter/static/src/tree_view_advanced_filter/main.scss b/tree_view_advanced_filter/static/src/tree_view_advanced_filter/main.scss
new file mode 100644
index 000000000..3506a2d40
--- /dev/null
+++ b/tree_view_advanced_filter/static/src/tree_view_advanced_filter/main.scss
@@ -0,0 +1,71 @@
+.tree_search_item {
+ cursor: pointer;
+}
+
+
+.tree_search_item .selected a:before {
+ font-family: FontAwesome;
+ position: absolute;
+ left: 10px;
+ top: 10px;
+}
+
+input.input_text{
+ transition: all 0.3s ease;
+}
+
+.search_div{
+ display: flex;
+ align-items: center;
+ border: 1px solid #1a4040;
+ font-size: 15px !important;
+ border-radius: 8px;
+ text-align: center;
+ overflow: hidden;
+ padding: 2px;
+}
+.input_text{
+ flex: 2;
+ border: none!important;
+}
+.search_button{
+ margin: 0px 0px;
+ border:none
+}
+.search_button:hover{
+ color: blueviolet;
+}
+.remove_button{
+ border:none
+}
+.remove_button:hover{
+ color: indianred;
+}
+.hidden_button{
+display:none
+}
+.table_layout
+{
+table-layout:auto
+}
+
+.auto-overflow {
+ overflow: auto !important;
+}
+
+/* Hide scrollbar for Chrome, Safari and Opera */
+.auto-overflow::-webkit-scrollbar {
+ display: none;
+}
+
+/* Hide scrollbar for IE, Edge and Firefox */
+.auto-overflow {
+ -ms-overflow-style: none;
+ /* IE and Edge */
+ scrollbar-width: none;
+ /* Firefox */
+}
+
+.min-wp-50 {
+ min-width: 50px !important;
+}
\ No newline at end of file
diff --git a/tree_view_advanced_filter/static/src/tree_view_advanced_filter/search_model.js b/tree_view_advanced_filter/static/src/tree_view_advanced_filter/search_model.js
new file mode 100644
index 000000000..c51f33a8c
--- /dev/null
+++ b/tree_view_advanced_filter/static/src/tree_view_advanced_filter/search_model.js
@@ -0,0 +1,13 @@
+// /** @odoo-module */
+
+import { SearchModel } from "@web/search/search_model";
+import { patch } from "@web/core/utils/patch";
+
+patch(SearchModel.prototype, {
+ async _reloadSections() {
+ super._reloadSections(...arguments);
+ if (this.ak_domains) {
+ this._domain = this.domain.concat(this.ak_domains);
+ }
+ },
+});
diff --git a/tree_view_advanced_filter/static/src/tree_view_advanced_filter/tree.js b/tree_view_advanced_filter/static/src/tree_view_advanced_filter/tree.js
new file mode 100644
index 000000000..a63450689
--- /dev/null
+++ b/tree_view_advanced_filter/static/src/tree_view_advanced_filter/tree.js
@@ -0,0 +1,605 @@
+/** @odoo-module */
+
+import { ListRenderer } from "@web/views/list/list_renderer";
+import { browser } from "@web/core/browser/browser";
+import { patch } from "@web/core/utils/patch";
+import { session } from "@web/session";
+import { serialize } from "@web/core/l10n/dates";
+import { serializeDateTime } from "@web/core/l10n/dates";
+import { loadJS, loadCSS } from "@web/core/assets";
+const { onMounted, onPatched } = owl;
+const { DateTime } = luxon;
+
+export const ListRendererCust = {
+ setup() {
+
+ super.setup();
+ browser.sessionStorage.setItem('domainlist', JSON.stringify([])); // Replaced localStorage with sessionStorage
+
+ onMounted(() => {
+ this._renderSearchPanel()
+ });
+
+ onPatched(() => {
+ this._renderSearchPanel()
+ });
+ },
+
+ _renderSearchPanel: async function () {
+ // await loadJS("https://cdn.jsdelivr.net/jquery/latest/jquery.min.js")
+ // await loadJS("https://cdn.jsdelivr.net/momentjs/latest/moment.min.js")
+ // await loadJS("https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js")
+ // await loadCSS("https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css")
+ // await loadJS("/tree_view_advanced_filter/static/src/libs/jquery.min.js");
+ await loadJS("/tree_view_advanced_filter/static/src/libs/daterangepicker.min.js");
+ await loadCSS("/tree_view_advanced_filter/static/src/libs/daterangepicker.css");
+ await loadJS("/tree_view_advanced_filter/static/src/libs/moment/moment.min.js");
+ var List = this.props.list;
+ const bm_params = List.model.__bm_load_params__;
+ const rootRef = this.rootRef.el
+ const tableRef = this.tableRef.el;
+ tableRef.removeAttribute('style')
+ var columns = this.allColumns.filter((col) => {
+ if (col.optional && this.optionalActiveFields[col.name] == false) {
+ return false;
+ }
+ if (col.column_invisible == true || col.column_invisible && col.invisible) {
+ return false;
+ }
+// if (col.optional == 'hide'){
+// return false;
+// }
+ if (['in_invoice', 'in_refund', 'in_receipt'].includes(this.props.list.evalContext.default_move_type)){
+ if (['Vendor', 'Invoice Date'].includes(col.string)) {
+ return false;
+ }
+ }
+ if (['out_invoice', 'out_refund', 'out_receipt'].includes(this.props.list.evalContext.default_move_type)){
+ if (['Customer', 'Bill Date'].includes(col.string)) {
+ return false;
+ }
+ }
+ if (col.name == 'move_type'){
+ return false;
+ }
+ return true;
+ });
+
+ var $tr1 = $('').append(columns.map(columns => this._renderHeaderCellSearch(columns)));
+ // 添加行号占位td
+ $tr1.prepend($('').addClass('web_list_num'));
+ if (this.hasSelectors) {
+ $tr1.prepend($(' ').addClass('o_list_record_selector'));
+ }
+
+ if (this.isStudioEditable || this.displayOptionalFields) {
+ $tr1.append($(' ').addClass('o_list_record_selector'));
+ }
+
+ if ($(tableRef).find('.search_td').length) {
+ $(tableRef).find('.search_td').parent().replaceWith($tr1)
+ }
+ else {
+ $tr1.insertAfter($(tableRef).find('tr')[0]);
+ }
+
+ rootRef.querySelectorAll('thead tr td.search_td input').forEach((a) => a.addEventListener('keyup', this._onfilter.bind(this)));
+ rootRef.querySelectorAll('.search_button').forEach((a) => a.addEventListener('click', this._onSearch.bind(this)));
+ rootRef.querySelectorAll('.remove_button').forEach((a) => a.addEventListener('click', this._onRemove.bind(this)));
+ rootRef.querySelectorAll('thead tr td').forEach((a) => a.addEventListener('keypress', this._onKeyPress.bind(this)));
+ },
+
+ _renderHeaderCellSearch: function (node) {
+ var List = this.props.list
+ var search_tr = $($('tr')[1]).find('input.input_text')
+ var old_domain = JSON.parse(browser.sessionStorage.getItem('domainlist'))
+ var input_dict = {}
+ var self = this;
+ var $td = $(' ', {
+ class: 'search_td'
+ });
+
+ for (var i = 0; i < search_tr.length; i++) {
+ var field = $(search_tr[i]).attr('name')
+ var value = $(search_tr[i]).val()
+ input_dict[String(field)] = value
+ }
+ if (node.type != 'field') {
+ return $td
+ }
+ const {
+ name,
+ string,
+ widget,
+ } = node;
+ var searched_value = old_domain.filter(function (domain) {
+ return domain[0] == name;
+ });
+ var widget_list = ["monetary", "date", "many2one_avatar_user", "badge", "task_with_hours", "timesheet_uom", "sol_product_many2one"];
+ var value_of_tr = searched_value.length > 0 ? searched_value[0][2] : ""
+ var field = List.fields[name];
+
+ if (name) {
+ $td.attr('data-name', name);
+ } else if (string) {
+ $td.attr('data-string', string);
+ }
+ if (!field) {
+ return $td;
+ }
+ var description = string || field.string;
+
+ // search elements
+ var search_div = $('').attr({
+ 'class': 'search_div d-inline-flex auto-overflow'
+ });
+ var $input = $('
').attr({
+ name: name,
+ data_name: name,
+ data_text: string,
+ placeholder: description,
+ autocomplete: "autocomplete",
+ 'class': 'input_text min-wp-50'
+ });
+ var search_button = $('
').attr({
+ type: 'button',
+ name: name,
+ 'class': 'search_button fa fa-search'
+ });
+ var remove_button = $('').attr({
+ type: 'button',
+ name: name,
+ 'class': 'remove_button fa fa-remove',
+ });
+
+ // Prepare search bars
+ if (!widget || widget_list.includes(widget)) {
+ if (string !== " " && field.store) {
+ if (field.type == 'selection') {
+ var selection_options = []
+ for (let option = -1; option < field.selection.length - 1; option += 1) {
+ selection_options.push((field.selection[option], field.selection[option + 1]))
+ }
+
+ const selection_input = ''
+ var option = ' -- 选择 -- ';
+ $.each(field.selection, function (index, value) {
+ option += '' + value[1] + ' '
+ $(selection_input).add('' + value[1] + ' ')
+ });
+ if (value_of_tr) {
+ if (typeof value_of_tr == 'string') {
+ value_of_tr = [value_of_tr];
+ }
+ value_of_tr.forEach((val) => {
+ var $value_tag = $('').attr({
+ title: val,
+ name: val,
+ value: val,
+ class: 'd-inline-flex badge',
+ })
+ var tag_val = "";
+ field.selection.forEach((value) => {
+ if (val == value[0]) {
+ tag_val = value[1];
+ }
+ });
+ $value_tag.append($(
+ `${tag_val}
`
+ ))
+ $value_tag.val(val);
+ $value_tag.css('background-color', '#dfdfdf');
+ $value_tag.css('border-radius', '20px');
+ $value_tag.css('font-size', '15px');
+ search_div.append($value_tag)
+ })
+ }
+
+ var sel_in = selection_input + option + ' '
+ search_div.find('span').append(remove_button);
+ search_div.append(sel_in)
+ search_div.append(search_button)
+ $td.append(search_div)
+ }
+ if (['integer', 'float', 'monetary'].includes(field.type)) {
+ $input.attr({ type: 'number' });
+
+ $input.text(description)
+ if (value_of_tr) {
+ if (typeof value_of_tr == 'number') {
+ value_of_tr = [value_of_tr];
+ }
+ value_of_tr.forEach((val) => {
+ var $value_tag = $('').attr({
+ title: val,
+ name: val,
+ value: val,
+ class: 'd-inline-flex badge',
+ })
+ $value_tag.append($(
+ `${val}
`
+ ))
+ $value_tag.val(val);
+ $value_tag.css('background-color', '#dfdfdf');
+ $value_tag.css('border-radius', '20px');
+ $value_tag.css('font-size', '15px');
+ search_div.append($value_tag)
+ })
+ }
+ search_div.find('span').append(remove_button);
+ search_div.append($input);
+ search_div.append(search_button);
+ $td.append(search_div);
+ }
+ if (['many2one', 'char'].includes(field.type)) {
+ $input.attr({ type: 'text' });
+
+ $input.text(description)
+ const values_of_tr = searched_value.map((val) => {
+ return val[2];
+ })
+ if (values_of_tr.length) {
+ values_of_tr.forEach((val) => {
+ var $value_tag = $('').attr({
+ title: val,
+ name: val,
+ value: val,
+ class: 'd-inline-flex badge',
+ })
+ $value_tag.append($(
+ `${val}
`
+ ))
+ $value_tag.val(val);
+ $value_tag.append(remove_button);
+ $value_tag.css('background-color', '#dfdfdf');
+ $value_tag.css('border-radius', '20px');
+ $value_tag.css('font-size', '15px');
+ search_div.append($value_tag)
+ })
+ }
+ search_div.find('span').append(remove_button);
+ search_div.append($input);
+ search_div.append(search_button);
+ $td.append(search_div);
+ }
+ if (field.type == 'datetime' || field.type == 'date') {
+ var value_of_tr1 = searched_value.length > 1 ? (searched_value[0][2]).split(' ')[0] + '/' + (searched_value[1][2]).split(' ')[0] : ""
+ var search_div = $('').attr({
+ 'class': 'search_div'
+ });
+ var $input_date1 = $(' ').attr({
+ type: 'text',
+ name: name,
+ placeholder: '日期选择',
+ autocomplete: "autocomplete",
+ width: '150px',
+ 'class': 'input_text',
+ 'style': 'min-width:200px !important'
+ });
+ var search_button = $('').attr({
+ type: 'button',
+ name: name,
+ 'class': 'search_button fa fa-search'
+ });
+ var remove_button = $('').attr({
+ type: 'button',
+ name: name,
+ 'class': 'remove_button fa fa-remove hidden_button',
+ });
+ $input_date1.daterangepicker({
+ locale: {
+ applyLabel: '应用',
+ cancelLabel: '取消',
+ },
+ });
+ $input_date1.on('apply.daterangepicker', function (ev, picker) {
+ $input_date1.val(picker.startDate.format('YYYY-MM-DD') + '/' + picker.endDate.format('YYYY-MM-DD'));
+ var e = $.Event("keypress", {
+ which: 13
+ });
+ $input_date1.trigger(e);
+ e.keyCode = 13
+ self._onfilter(e)
+ $input_date1.change()
+ });
+
+ $input_date1.on('cancel.daterangepicker', function (ev, picker) {
+ $input_date1.val('');
+ var e = $.Event("keypress", {
+ which: 13
+ });
+ $input_date1.trigger(e);
+ e.keyCode = 13
+ self._onfilter(e)
+ $input_date1.change()
+ });
+ $input_date1.text(description)
+ $input_date1.val(value_of_tr1)
+
+ if (value_of_tr1) {
+ $(search_button).addClass('hidden_button');
+ $(remove_button).removeClass('hidden_button');
+ }
+ if ($(search_button).hasClass('hidden_button')) {
+ $input_date1.attr('readonly', 'readonly');
+ $input_date1.css('background-color', '#dfdfdf');
+ $input_date1.css('border-radius', '20px');
+ }
+ search_div.append($input_date1)
+ search_div.append(remove_button)
+ search_div.append(search_button)
+ $td.append(search_div)
+ }
+ }
+ }
+ return $td;
+ },
+
+ _onKeyPress: function (ev) {
+ ev.stopPropagation(); // to prevent jquery's blockUI to cancel event
+ },
+
+ _onSearch: function (event) {
+ var self = this
+ var $target = $(event.currentTarget);
+ var field_name = $target.attr('name')
+ let all_input_tags = $target.parents('tr').find('input.input_text,select.input_text')
+ if (!all_input_tags.length) {
+ all_input_tags = $($('tr')[5]).find('input.input_text,select.input_text')
+ }
+ all_input_tags.each(function (el) {
+ if (all_input_tags[el].name == field_name) {
+ var e = $.Event("keypress", {
+ which: 13
+ });
+ $(all_input_tags[el]).trigger(e);
+ e.keyCode = 13
+ self._onfilter(e)
+ }
+ });
+ },
+
+ _onRemove: function (event) {
+ const List = this.props.list;
+ var self = this;
+ var updated_domain = [];
+ var old_domain = JSON.parse(browser.sessionStorage.getItem('domainlist'));
+ var field_name = $(event.currentTarget).attr('name');
+ var tag_value = $(event.currentTarget.parentElement).attr('value');
+ let all_input_tags = $($('tr')[1]).find('input.input_text');
+
+ if (!all_input_tags.length) {
+ all_input_tags = $($('tr')[5]).find('input.input_text')
+ }
+ const ListDomain = old_domain;
+ if (["monetary", "float", "integer", "selection"].includes(List.fields[field_name].type)) {
+ ListDomain.map(function (el) {
+ tag_value = !isNaN(tag_value) ? parseFloat(tag_value) : tag_value;
+ if (field_name == el[0] && el[2].includes(tag_value)) {
+ const index = el[2].indexOf(tag_value);
+ index > -1 ? el[2].splice(index, 1) : false;
+ el[2].length ? updated_domain.push(el) : false;
+ }
+ else {
+ updated_domain.push(el)
+ }
+ });
+ }
+ else if (["date", "datetime"].includes(List.fields[field_name].type)) {
+ ListDomain.map(function (el) {
+ if (field_name != el[0]) {
+ updated_domain.push(el)
+ }
+ });
+ }
+ else {
+ ListDomain.map(function (el) {
+ if (field_name != el[0] || tag_value != el[2]) {
+ updated_domain.push(el)
+ }
+ if (el == '|') {
+ let index = updated_domain.indexOf('|');
+ updated_domain.splice(index, 1);
+ }
+ });
+ }
+ browser.sessionStorage.setItem('domainlist', JSON.stringify(updated_domain));
+ var indexes = []
+ var to_update = []
+ var count = 0
+ updated_domain.forEach(el => {
+ if (indexes.length && el[1] == 'ilike' && updated_domain[indexes[indexes.length - 1]][0] == el[0]) {
+ to_update.push(indexes[indexes.length - 1])
+ } else if (el[1] == 'ilike') {
+ indexes.push(count)
+ }
+ count += 1;
+ })
+ to_update.reverse()
+ to_update.forEach(A => {
+ updated_domain.splice(A, 0, '|');
+ })
+ self.perform_search(self, updated_domain);
+ self._renderSearchPanel();
+ },
+
+ _onfilter: function (e) {
+ const List = this.props.list;
+ const old_domain = JSON.parse(browser.sessionStorage.getItem('domainlist'));
+
+ if (e.key === 'Enter' || e.keyCode === 13) {
+ var domain_list = [];
+ var self = this
+ var $target = $(e.target);
+ let all_input_tags = $target.parents('tr').find('input.input_text')
+ if (!all_input_tags.length) {
+ all_input_tags = $($('tr')[5]).find('input.input_text')
+ }
+
+ let all_select_tags = $target.parents('tr').find('select.input_text')
+ if (!all_select_tags.length) {
+ all_select_tags = $($('tr')[5]).find('select.input_text')
+ }
+
+ var search_tr = all_input_tags.filter(function (el) {
+ return all_input_tags[el].value
+ });
+ var search_select = all_select_tags.filter(function (el) {
+ return all_select_tags[el].value
+ });
+
+ /* Checking if both the variables `search_tr` and `search_select` are
+ empty. If both variables are empty, it will return without executing the further code. */
+ if (!search_tr.length && !search_select.length) {
+ // self.perform_search(self, domain_list);
+ return
+ }
+
+ for (var i = 0; i < search_tr.length; i++) {
+ var field = $(search_tr[i]).attr('name')
+ var string = search_tr[i].textContent
+ var value = $(search_tr[i]).val()
+ if (value) {
+ if (List.fields[field].type == "date") {
+ var startDate = moment(value.split('/')[0]).format('YYYY-MM-DD');
+ var endDate = moment(value.split('/')[1]).format('YYYY-MM-DD');
+ if (startDate == 'Invalid date' || endDate == 'Invalid date') {
+ window.alert("Please enter valid input for " + string);
+ } else {
+ domain_list.push([field, '>=', startDate])
+ domain_list.push([field, '<=', endDate])
+ }
+ } else if (List.fields[field].type == "datetime") {
+ var startDate = moment(value.split('/')[0]).format('YYYY-MM-DD 00:00:00');
+ var endDate = moment(value.split('/')[1]).format('YYYY-MM-DD 23:59:59');
+ if (startDate == 'Invalid date' || endDate == 'Invalid date') {
+ window.alert("Please enter valid input for " + string);
+ } else {
+ domain_list.push([field, '>=', startDate])
+ domain_list.push([field, '<=', endDate])
+ }
+
+ } else if (["monetary", "float", "integer"].includes(List.fields[field].type)) {
+ var domain = old_domain.filter((domain) => {
+ return domain[0] == field;
+ })
+ if (domain.length) {
+ if (!domain[0][2].includes(parseFloat(value))) {
+ domain[0][2].push(parseFloat(value));
+ }
+ domain_list.push(domain[0])
+ }
+ else {
+ domain_list.push([field, 'in', [parseFloat(value)]]);
+ }
+ } else {
+ if (old_domain.length) {
+ old_domain.forEach((domain) => {
+ if (domain[0] == field) {
+ domain_list.push(domain);
+ }
+ })
+ if (!(old_domain.map((d) => { return d[2] }).includes(value) &&
+ old_domain.map((d) => { return d[0] }).includes(field))) {
+ domain_list.push([field, 'ilike', value]);
+ }
+ }
+ else {
+ domain_list.push([field, 'ilike', value]);
+ }
+ }
+ }
+ }
+ $(all_select_tags).each(function (index, elem) {
+ var elem_value = $(elem).val();
+ var elem_field = $(elem).attr('data_name');
+ if (elem_value.length > 0) {
+ if (List.fields[elem_field].type == 'selection') {
+ var domain = old_domain.filter((domain) => {
+ return domain[0] == elem_field
+ })
+ if (domain.length) {
+ if (!domain[0][2].includes(elem_value)) {
+ domain[0][2].push(elem_value);
+ }
+ domain_list.push(domain[0])
+ }
+ else {
+ domain_list.push([elem_field, 'in', [elem_value]])
+ }
+ }
+ else {
+ domain_list.push([elem_field, '=', elem_value])
+ }
+ }
+ });
+ old_domain.forEach((domain) => {
+ var avail = domain_list.filter(a => {
+ if (domain[1] == 'in') {
+ return domain[2].every(f => a[2].includes(f)) && a[0] == domain[0]
+ }
+ else {
+ return a[2].toString() == domain[2].toString() && a[0] == domain[0]
+ }
+
+ }).length
+ if (!(avail)) {
+ domain_list.push(domain)
+ }
+ })
+ browser.sessionStorage.setItem('domainlist', JSON.stringify(domain_list));
+ var indexes = []
+ var to_update = []
+ var count = 0
+ domain_list.forEach(el => {
+ if (indexes.length && el[1] == 'ilike' && domain_list[indexes[indexes.length - 1]][0] == el[0]) {
+ to_update.push(indexes[indexes.length - 1])
+ } else if (el[1] == 'ilike') {
+ indexes.push(count)
+ }
+ count += 1;
+ })
+ to_update.reverse()
+ to_update.forEach(A => {
+ domain_list.splice(A, 0, '|');
+ })
+ self.perform_search(self, domain_list);
+ }
+ },
+
+ perform_search: async function (self, domain_list) {
+ const searchModel = self.env.searchModel;
+ const list = self.props.list;
+
+
+ if (self.isX2Many) {
+ const bm_params = list.model.config;
+ /**
+ * Function will not apply to new records.
+ */
+ if (!(bm_params.resId || bm_params.resIds.length)) {
+ browser.sessionStorage.setItem('domainlist', JSON.stringify([]));
+ return;
+ }
+ var res_id = bm_params.resId ? bm_params.resId : bm_params.resIds[0]
+ const readIds = await self.env.model.orm.read(
+ self.props.nestedKeyOptionalFieldsData.model,
+ [res_id],
+ [self.props.nestedKeyOptionalFieldsData.field])
+
+ domain_list.push(['id', 'in', readIds[0][self.props.nestedKeyOptionalFieldsData.field]])
+
+ var resIds = await self.env.model.orm.search(list.resModel, domain_list, {
+ limit: session.active_ids_limit,
+ context: list.context,
+ });
+ await list._load({'nextCurrentIds': resIds})
+ }
+ else {
+ searchModel.ak_domains = domain_list;
+ searchModel._notify();
+ }
+ },
+};
+
+patch(ListRenderer.prototype, ListRendererCust);
diff --git a/tree_view_advanced_filter/static/src/web_list_num/list_renderer.js b/tree_view_advanced_filter/static/src/web_list_num/list_renderer.js
new file mode 100644
index 000000000..88b335904
--- /dev/null
+++ b/tree_view_advanced_filter/static/src/web_list_num/list_renderer.js
@@ -0,0 +1,52 @@
+/** @odoo-module **/
+
+import {patch} from "@web/core/utils/patch";
+import {ListRenderer} from "@web/views/list/list_renderer";
+
+patch(ListRenderer.prototype, {
+ setup(){
+ super.setup();
+ this.numSwitch = this.constructor.name === 'ListRenderer';
+ },
+
+ // The following code manipulates the DOM directly to avoid having to wait for a
+ // render + patch which would occur on the next frame and cause flickering.
+ freezeColumnWidths() {
+ if (!this.keepColumnWidths) {
+ this.columnWidths = null;
+ }
+
+ const table = this.tableRef.el;
+ const headers = [...table.querySelectorAll("thead th:not(.o_list_actions_header)")];
+
+ if (!this.columnWidths || !this.columnWidths.length) {
+ // no column widths to restore
+
+ table.style.tableLayout = "fixed";
+ const allowedWidth = table.parentNode.getBoundingClientRect().width;
+ // Set table layout auto and remove inline style to make sure that css
+ // rules apply (e.g. fixed width of record selector)
+ table.style.tableLayout = "auto";
+ headers.forEach((th) => {
+ th.style.width = null;
+ th.style.maxWidth = null;
+ });
+
+ this.setDefaultColumnWidths();
+
+ // Squeeze the table by applying a max-width on largest columns to
+ // ensure that it doesn't overflow
+ this.columnWidths = this.computeColumnWidthsFromContent(allowedWidth);
+ table.style.tableLayout = "fixed";
+ }
+ headers.forEach((th, index) => {
+ if (!th.style.width) {
+ th.style.width = `${Math.floor(this.columnWidths[index])}px`;
+ }
+ if (Array.from(th.classList).includes('list-number')){
+ th.style.width = `${String(this.props.list.offset || this.props.list.limit).length * 20}px`;
+ }
+ });
+ }
+
+})
\ No newline at end of file
diff --git a/tree_view_advanced_filter/static/src/web_list_num/list_renderer.xml b/tree_view_advanced_filter/static/src/web_list_num/list_renderer.xml
new file mode 100644
index 000000000..c7532ba9f
--- /dev/null
+++ b/tree_view_advanced_filter/static/src/web_list_num/list_renderer.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+ #
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file