tryton-sao 5.0.63 → 5.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG +5 -0
- package/dist/tryton-sao.js +5 -5
- package/dist/tryton-sao.min.js +2 -2
- package/package.json +1 -1
- package/src/model.js +5 -5
package/CHANGELOG
CHANGED
package/dist/tryton-sao.js
CHANGED
|
@@ -2846,18 +2846,18 @@ var Sao = {};
|
|
|
2846
2846
|
record.group = this;
|
|
2847
2847
|
}
|
|
2848
2848
|
this.splice(position, 0, record);
|
|
2849
|
-
|
|
2849
|
+
this.record_removed.forEach(function(record_rm) {
|
|
2850
2850
|
if (record_rm.id == record.id) {
|
|
2851
2851
|
this.record_removed.splice(
|
|
2852
2852
|
this.record_removed.indexOf(record_rm), 1);
|
|
2853
2853
|
}
|
|
2854
|
-
}
|
|
2855
|
-
|
|
2854
|
+
});
|
|
2855
|
+
this.record_deleted.forEach(function(record_del) {
|
|
2856
2856
|
if (record_del.id == record.id) {
|
|
2857
2857
|
this.record_deleted.splice(
|
|
2858
2858
|
this.record_deleted.indexOf(record_del), 1);
|
|
2859
2859
|
}
|
|
2860
|
-
}
|
|
2860
|
+
});
|
|
2861
2861
|
record._changed.id = true;
|
|
2862
2862
|
if (changed) {
|
|
2863
2863
|
this.changed();
|
|
@@ -3665,7 +3665,7 @@ var Sao = {};
|
|
|
3665
3665
|
get_eval: function() {
|
|
3666
3666
|
var value = {};
|
|
3667
3667
|
for (var key in this.model.fields) {
|
|
3668
|
-
if (!this.
|
|
3668
|
+
if (!this._loaded.hasOwnProperty(key) && this.id >= 0)
|
|
3669
3669
|
continue;
|
|
3670
3670
|
value[key] = this.model.fields[key].get_eval(this);
|
|
3671
3671
|
}
|
package/dist/tryton-sao.min.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
/*! tryton-sao-5.0.
|
|
1
|
+
/*! tryton-sao-5.0.64 | GPL-3
|
|
2
2
|
This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
3
3
|
this repository contains the full copyright notices and license terms. */
|
|
4
4
|
function eval_pyson(value){with(Sao.PYSON.eval)return eval("("+value+")")}var Sao={};!function(){"use strict";function a(){return[{shortcut:"alt+n",label:Sao.i18n.gettext("New"),id:"new_"},{shortcut:"ctrl+s",label:Sao.i18n.gettext("Save"),id:"save"},{shortcut:"ctrl+l",label:Sao.i18n.gettext("Switch"),id:"switch_"},{shortcut:"ctrl+r",label:Sao.i18n.gettext("Reload/Undo"),id:"reload"},{shortcut:"ctrl+shift+d",label:Sao.i18n.gettext("Duplicate"),id:"copy"},{shortcut:"ctrl+d",label:Sao.i18n.gettext("Delete"),id:"delete_"},{shortcut:"ctrl+up",label:Sao.i18n.gettext("Previous"),id:"previous"},{shortcut:"ctrl+down",label:Sao.i18n.gettext("Next"),id:"next"},{shortcut:"ctrl+f",label:Sao.i18n.gettext("Search"),id:"search"},{shortcut:"alt+w",label:Sao.i18n.gettext("Close Tab"),id:"close"},{shortcut:"ctrl+shift+t",label:Sao.i18n.gettext("Attachment"),id:"attach"},{shortcut:"ctrl+shift+o",label:Sao.i18n.gettext("Note"),id:"note"},{shortcut:"ctrl+e",label:Sao.i18n.gettext("Action"),id:"action"},{shortcut:"ctrl+shift+r",label:Sao.i18n.gettext("Relate"),id:"relate"},{shortcut:"ctrl+p",label:Sao.i18n.gettext("Print"),id:"print"},{shortcut:"ctrl+left",label:Sao.i18n.gettext("Previous tab"),callback:function(){Sao.Tab.previous_tab()}},{shortcut:"ctrl+right",label:Sao.i18n.gettext("Next tab"),callback:function(){Sao.Tab.next_tab()}},{shortcut:"ctrl+k",label:Sao.i18n.gettext("Global search"),callback:function(){jQuery("#global-search-entry").focus()}},{shortcut:"f1",label:Sao.i18n.gettext("Show this help"),callback:function(){c()}}]}function b(){"undefined"!=typeof Mousetrap&&a().forEach(function(a){Mousetrap.bind(a.shortcut,function(){if(a.id){var b=Sao.Tab.tabs.get_current();if(b){var c=$(":focus");c.blur(),b.el.find('a[id="'+a.id+'"]').click(),c.focus()}}else a.callback&&jQuery.when().then(a.callback);return!1})})}function c(){var b=new Sao.Dialog(Sao.i18n.gettext("Keyboard shortcuts"),"shortcut-dialog","m");jQuery("<button>",{class:"close","data-dismiss":"modal","aria-label":Sao.i18n.gettext("Close")}).append(jQuery("<span>",{"aria-hidden":!0}).append("×")).prependTo(b.header);var c=jQuery("<div/>",{class:"row"}).appendTo(b.body),d=jQuery("<dl/>",{class:"dl-horizontal col-md-6"}).append(jQuery("<h5/>").text(Sao.i18n.gettext("Global shortcuts"))).appendTo(c),e=jQuery("<dl/>",{class:"dl-horizontal col-md-6"}).append(jQuery("<h5/>").text(Sao.i18n.gettext("Tab shortcuts"))).appendTo(c);return a().forEach(function(a){var b,c=jQuery("<dt/>").text(a.label),f=jQuery("<dd/>").append(jQuery("<kbd>").text(a.shortcut));b=a.id?e:d,c.appendTo(b),f.appendTo(b)}),b.modal.on("hidden.bs.modal",function(){jQuery(this).remove()}),b.modal.modal("show"),!1}function d(){var a=1040;jQuery(".modal.in").each(function(b){var c=jQuery(this);a++,c.css("zIndex",a),c.next(".modal-backdrop.in").addClass("hidden").css("zIndex",a-1)}),jQuery(".modal.in:visible:last").focus().next(".modal-backdrop.in").removeClass("hidden")}"contains"in String.prototype||(String.prototype.contains=function(a,b){return-1!==String.prototype.indexOf.call(this,a,b)}),String.prototype.startsWith||Object.defineProperty(String.prototype,"startsWith",{enumerable:!1,configurable:!1,writable:!1,value:function(a,b){return b=b||0,this.indexOf(a,b)===b}}),String.prototype.endsWith||Object.defineProperty(String.prototype,"endsWith",{enumerable:!1,configurable:!1,writable:!1,value:function(a,b){b=b||this.length,b-=a.length;var c=this.lastIndexOf(a);return-1!==c&&c===b}}),String.prototype.padEnd||(String.prototype.padEnd=function(a,b){return a>>=0,b=String(void 0!==b?b:" "),this.length>a?String(this):(a-=this.length,a>b.length&&(b+=b.repeat(a/b.length)),String(this)+b.slice(0,a))}),String.prototype.padStart||(String.prototype.padStart=function(a,b){return a>>=0,b=String(void 0!==b?b:" "),this.length>a?String(this):(a-=this.length,a>b.length&&(b+=b.repeat(a/b.length)),b.slice(0,a)+String(this))}),Array.prototype.some||(Array.prototype.some=function(a){if(null===this)throw new TypeError;var b,c,d=Object(this),e=d.length>>>0;if("function"!=typeof a)throw new TypeError;for(b=arguments[1],c=0;c<e;c++)if(c in d&&a.call(b,d[c],c,d))return!0;return!1}),Array.from||(Array.from=function(a){var b=[];return a.forEach(function(a){b.push(a)}),b});try{document.execCommand("styleWithCSS",!1,!1)}catch(g){}try{document.execCommand("useCSS",!1,!0)}catch(g){}jQuery.fn.extend({uniqueId:function(){var a=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++a)})}}()}),window.onbeforeunload=function(a){if(Sao.main_menu_screen&&Sao.main_menu_screen.save_tree_state(!0),Sao.Tab.tabs.length){var b=Sao.i18n.gettext("Are your sure to leave?");return a.returnValue=b,b}},Sao.class_=function(a,b){var c=function(){if(!(this instanceof c))throw new Error("Constructor function requires new operator");this.Class=c,this.init&&this.init.apply(this,arguments)};if(c.prototype=Object.create(a.prototype),c._super=a.prototype,b)for(var d in b)c.prototype[d]=b[d];return c},Sao.Decimal=Number;var e=moment.prototype.toString;moment.prototype.toString=function(){return this.isDate?this.format("YYYY-MM-DD"):this.isDateTime?this.milliseconds()?this.format("YYYY-MM-DD HH:mm:ss.SSSSSS"):this.format("YYYY-MM-DD HH:mm:ss"):this.isTime?this.milliseconds()?this.format("HH:mm:ss.SSSSSS"):this.format("HH:mm:ss"):e.call(this)},Sao.Date=function(a,b,c){var d;return void 0===b?(d=moment(a),a=void 0):d=moment(),d.year(a),d.month(b),d.date(c),d.set({hour:0,minute:0,second:0,millisecond:0}),d.isDate=!0,d},Sao.Date.min=moment(new Date(864e5*(1-1e8))),Sao.Date.min.set({hour:0,minute:0,second:0,millisecond:0}),Sao.Date.min.isDate=!0,Sao.Date.max=moment(new Date(864e13)),Sao.Date.max.set({hour:0,minute:0,second:0,millisecond:0}),Sao.Date.max.isDate=!0,Sao.DateTime=function(a,b,c,d,e,f,g,h){var i;return void 0===b?(i=moment(a),a=void 0):(void 0===d&&(d=0),void 0===e&&(e=0),void 0===f&&(f=0),void 0===g&&(g=0),i=moment()),h&&i.utc(),i.year(a),i.month(b),i.date(c),void 0!==b&&(i.hour(d),i.minute(e),i.second(f),i.milliseconds(g)),i.isDateTime=!0,i.local(),i},Sao.DateTime.combine=function(a,b){var c=a.clone();return c.set({hour:b.hour(),minute:b.minute(),second:b.second(),millisecond:b.millisecond()}),c.isDateTime=!0,c},Sao.DateTime.min=moment(new Date(-864e13)).local(),Sao.DateTime.min.isDateTime=!0,Sao.DateTime.max=moment(new Date(864e13)).local(),Sao.DateTime.max.isDateTime=!0,Sao.Time=function(a,b,c,d){var e=moment({hour:a,minute:b,second:c,millisecond:d||0});return e.isTime=!0,e},Sao.TimeDelta=function(a,b,c,d,e,f){var g=moment.duration({days:a,seconds:b,milliseconds:c,minutes:d,hours:e,weeks:f});return g.isTimeDelta=!0,g},Sao.config={},Sao.config.limit=1e3,Sao.config.display_size=20,Sao.config.roundup={},Sao.config.roundup.url="http://bugs.tryton.org/roundup/",Sao.config.title="Tryton",Sao.config.icon_color="#3465a4",Sao.config.bus_timeout=6e5,Sao.i18n=i18n(),Sao.i18n.setlang=function(a){return a||(a=(navigator.language||navigator.browserLanguage||navigator.userLanguage||"en").replace("-","_")),jQuery("html").attr("lang",a),Sao.i18n.setLocale(a),moment.locale(a.slice(0,2)),jQuery.getJSON("locale/"+a+".json").then(function(b){b[""].language||(b[""].language=a),b[""]["plural-forms"]||(b[""]["plural-forms"]="nplurals=2; plural=(n!=1);");for(var c in b)""!==c&&(b[c]=2==b[c].length?b[c][1]:b[c].slice(1));Sao.i18n.loadJSON(b)},function(){if(~a.indexOf("_"))return Sao.i18n.setlang(a.split("_").slice(0,-1).join("_"))})},Sao.i18n.getlang=function(){return Sao.i18n.getLocale()},Sao.i18n.BC47=function(a){return a.replace("_","-")},Sao.i18n.set_direction=function(a){Sao.i18n.rtl="rtl"===a,jQuery("html").attr("dir",a),jQuery(".row-offcanvas").removeClass("row-offcanvas-left row-offcanvas-right").addClass(Sao.i18n.rtl?"row-offcanvas-right":"row-offcanvas-left")},Sao.i18n.locale={},Sao.get_preferences=function(){var a=Sao.Session.current_session;return a.reload_context().then(function(){return Sao.rpc({method:"model.res.user.get_preferences",params:[!1,{}]},a).then(function(a){var b=[];return b.push(Sao.common.MODELACCESS.load_models()),b.push(Sao.common.ICONFACTORY.load_icons()),b.push(Sao.common.MODELHISTORY.load_history()),b.push(Sao.common.VIEW_SEARCH.load_searches()),jQuery.when.apply(jQuery,b).then(function(){(a.actions||[]).forEach(function(a){Sao.Action.execute(a,{},null,{})}),Sao.set_title(),Sao.common.ICONFACTORY.get_icon_url("tryton-menu").then(function(a){jQuery(".navbar-brand > img").attr("src",a)});var b=a.language!=Sao.i18n.getLocale(),c=jQuery.Deferred();return Sao.i18n.setlang(a.language).always(function(){b&&Sao.user_menu(a),c.resolve(a)}),Sao.i18n.set_direction(a.language_direction),Sao.i18n.locale=a.locale,c})})})},Sao.set_title=function(a){var b=[a,Sao.config.title];document.title=b.filter(function(a){return a}).join(" - "),jQuery("#title").text(Sao.config.title)},Sao.set_url=function(a,b){var c=Sao.Session.current_session;if(c){var d="#"+c.database;a&&(d+="/"+a),window.location=d}Sao.set_title(b)},window.onhashchange=function(){var a=Sao.Session.current_session;if(a){var b,c="#"+a.database;if(window.location.hash==c)b="";else{if(!window.location.hash.startsWith(c+"/"))return;b=window.location.hash.substr(c.length+1)}var d;if(b){b=decodeURIComponent(b);for(var e=0;e<Sao.Tab.tabs.length;e++)if(d=Sao.Tab.tabs[e],decodeURIComponent(d.get_url())==b)return void d.show();Sao.open_url()}else(d=Sao.Tab.tabs.get_current())&&Sao.set_url(d.get_url(),d.name)}},Sao.open_url=function(a){function b(a){return Sao.rpc.convertJSONObject(jQuery.parseJSON(a))}function c(a){var c={};if(c.model=a.shift(),c.model){try{c.view_ids=b(i.views||"[]"),void 0!==i.limit&&(c.limit=b(i.limit||"null")),c.name=b(i.name||'""'),c.search_value=b(i.search_value||"[]"),c.domain=b(i.domain||"[]"),c.context=b(i.context||"{}"),c.context_model=i.context_model}catch(g){return}var d=a.shift();if(d){if(d=Number(d),isNaN(d))return;c.res_id=d,c.mode=["form","tree"]}try{Sao.Tab.create(c)}catch(g){return}}}function d(a){var c={};if(c.action=a[0],c.action){try{c.data=b(i.data||"{}"),c.direct_print=b(i.direct_print||"false"),c.email_print=b(i.email_print||"false"),c.email=b(i.email||"null"),c.name=b(i.name||'""'),c.window=b(i.window||"false"),c.context=b(i.context||"{}")}catch(g){return}try{Sao.Wizard.create(c)}catch(g){return}}}function e(a){var c={};if(c.name=a[0],c.name){try{c.data=b(i.data||"{}"),c.direct_print=b(i.direct_print||"false"),c.email_print=b(i.email_print||"false"),c.email=b(i.email||"null"),c.context=b(i.context||"{}")}catch(g){return}try{Sao.Action.exec_report(c)}catch(g){return}}}function f(){var a;try{a=b(i.url||"false")}catch(g){return}a&&window.open(a,"_blank","noreferrer,noopener")}void 0===a&&(a=window.location.hash.substr(1));var g,h=a.indexOf(";"),i={};switch(h>=0?(g=a.substring(0,h),a.substring(h+1).split("&").forEach(function(a){if(a){var b=a.split("=").map(decodeURIComponent);i[b[0]]=b[1]}})):g=a,g=g.split("/").slice(1),g.shift()){case"model":c(g);break;case"wizard":d(g);break;case"report":e(g);break;case"url":f()}},Sao.login=function(){Sao.set_title(),Sao.i18n.setlang().always(function(){Sao.Session.get_credentials().then(function(a){return Sao.Session.current_session=a,a.reload_context()}).then(Sao.get_preferences).then(function(a){Sao.menu(a),Sao.user_menu(a),Sao.open_url(),Sao.Bus.listen()})})},Sao.logout=function(){var a=Sao.Session.current_session;Sao.Tab.tabs.close(!0).done(function(){jQuery("#user-preferences").children().remove(),jQuery("#user-logout").children().remove(),jQuery("#user-favorites").children().remove(),jQuery("#global-search").children().remove(),jQuery("#menu").children().remove(),a.do_logout().always(Sao.login),Sao.set_title()})},Sao.preferences=function(){Sao.Tab.tabs.close(!0).done(function(){jQuery("#user-preferences").children().remove(),jQuery("#user-favorites").children().remove(),jQuery("#user-logout").children().remove(),jQuery("#menu").children().remove(),new Sao.Window.Preferences(function(){Sao.get_preferences().then(function(a){Sao.menu(a),Sao.user_menu(a)})})})},Sao.favorites_menu=function(){if(jQuery(window).click(function(){Sao.favorites_menu_clear()}),!jQuery("#user-favorites").children(".dropdown-menu").length){var a=Sao.main_menu_screen.model_name+".favorite",b=Sao.Session.current_session,c={method:"model."+a+".get"},d=jQuery("<ul/>",{class:"dropdown-menu","aria-expanded":"false","aria-labelledby":"user-favorites"});jQuery("#user-favorites").append(d),Sao.rpc(c,b).then(function(a){a.forEach(function(a){var b=jQuery("<a/>",{href:"#"}),c=a[0],e=jQuery("<li/>",{role:"presentation"}),f=Sao.common.ICONFACTORY.get_icon_img(a[2],{class:"favorite-icon"});b.append(f),e.append(b),b.append(a[1]),b.click(function(a){a.preventDefault(),Sao.favorites_menu_clear(),Sao.Action.exec_keyword("tree_open",{model:Sao.main_menu_screen.model_name,id:c})}),d.append(e)}),d.append(jQuery("<li/>",{class:"divider"})),jQuery("<li/>",{role:"presentation"}).append(jQuery("<a/>",{href:"#"}).click(function(a){a.preventDefault(),Sao.favorites_menu_clear(),Sao.Tab.create({model:Sao.main_menu_screen.model_name+".favorite",mode:["tree","form"],name:Sao.i18n.gettext("Favorites")})}).text(Sao.i18n.gettext("Manage..."))).appendTo(d)})}},Sao.favorites_menu_clear=function(){jQuery("#user-favorites").children(".dropdown-menu").remove()},Sao.user_menu=function(a){jQuery("#user-preferences").children().remove(),jQuery("#user-favorites").children().remove(),jQuery("#user-logout").children().remove(),jQuery("#user-preferences").append(jQuery("<a/>",{href:"#",title:a.status_bar}).click(function(a){a.preventDefault(),Sao.preferences()}).text(a.status_bar));var b=Sao.i18n.gettext("Logout");jQuery("#user-logout").append(jQuery("<a/>",{href:"#",title:b,"aria-label":b}).click(Sao.logout).append(Sao.common.ICONFACTORY.get_icon_img("tryton-exit",{class:"icon hidden-xs","aria-hidden":!0})).append(jQuery("<span/>",{class:"visible-xs"}).text(b)))},Sao.main_menu_row_activate=function(){var a=Sao.main_menu_screen;return Sao.Action.exec_keyword("tree_open",{model:a.model_name,id:a.get_id()},null,!1)},Sao.menu=function(a){if(!a){var b=Sao.Session.current_session;return void Sao.rpc({method:"model.res.user.get_preferences",params:[!1,{}]},b).then(Sao.menu)}var c=new Sao.PYSON.Decoder,d=c.decode(a.pyson_menu),e=!1;jQuery.isEmptyObject(d.views)?d.view_id&&(e=[d.view_id[0]]):e=d.views.map(function(a){return a[0]}),c=new Sao.PYSON.Decoder(Sao.Session.current_session.context);var g=c.decode(d.pyson_context||"{}"),h=c.decode(d.pyson_domain),i=new Sao.Tab.Form(d.res_model,{mode:["tree"],view_ids:e,domain:h,context:g,selection_mode:Sao.common.SELECTION_NONE,limit:null,row_activate:Sao.main_menu_row_activate});Sao.main_menu_screen=i.screen,Sao.main_menu_screen.switch_callback=null,Sao.Tab.tabs.splice(Sao.Tab.tabs.indexOf(i),1),i.view_prm.done(function(){var a=i.screen.current_view;a.table.removeClass("table table-bordered table-striped"),a.table.addClass("no-responsive"),a.table.find("thead").hide();var b=new Sao.GlobalSearch;jQuery("#global-search").children().remove(),jQuery("#global-search").append(b.el),jQuery("#menu").children().remove(),jQuery("#menu").append(i.screen.screen_container.content_box.detach());var c=new f(i.screen.model.fields.favorite);i.screen.views[0].table.find("> colgroup").append(c.col),i.screen.views[0].table.find("> thead > tr").append(c.header),i.screen.views[0].columns.push(c)})},Sao.main_menu_screen=null;var f=Sao.class_(Object,{init:function(a){this.field=a,this.col=jQuery("<col/>",{class:"favorite"}),this.header=jQuery("<th/>"),this.footers=[],this.attributes=jQuery.extend({},this.field.description),this.attributes.name=this.field.name},get_cell:function(){return jQuery("<img/>",{class:"column-affix",tabindex:0})},render:function(a,b){return b||(b=this.get_cell()),a.load(this.field.name).done(function(){if(null!==a._values.favorite){var c="tryton-star";a._values.favorite||(c+="-border"),b.data("star",Boolean(a._values.favorite)),Sao.common.ICONFACTORY.get_icon_url(c).then(function(a){b.attr("src",a)}),b.click({record:a,button:b},this.favorite_click)}}.bind(this)),b},favorite_click:function(a){a.stopImmediatePropagation();var b,c,d=a.data.button,e=d.data("star");e?(c="tryton-star-border",b="unset"):(c="tryton-star",b="set"),d.data("star",!e),Sao.common.ICONFACTORY.get_icon_url(c).then(function(a){d.attr("src",a)});var f=Sao.main_menu_screen.model_name+".favorite",g=Sao.Session.current_session,h={method:"model."+f+"."+b,params:[a.data.record.id,g.context]};Sao.rpc(h,g),Sao.favorites_menu_clear()}});Sao.Dialog=Sao.class_(Object,{init:function(a,b,c,d){c=c||"sm",void 0===d&&(d=!0),this.modal=jQuery("<div/>",{class:b+" modal fade",role:"dialog","data-backdrop":"static","data-keyboard":d}),this.content=jQuery("<form/>",{class:"modal-content"}).appendTo(jQuery("<div/>",{class:"modal-dialog modal-"+c}).appendTo(this.modal)),this.header=jQuery("<div/>",{class:"modal-header"}).appendTo(this.content),a&&this.add_title(a),this.body=jQuery("<div/>",{class:"modal-body"}).appendTo(this.content),this.footer=jQuery("<div/>",{class:"modal-footer"}).appendTo(this.content),this.modal.on("shown.bs.modal",function(){jQuery(document.activeElement).closest(this.el)>0||jQuery(this).find(':input:visible:not([readonly]):not([tabindex^="-"]):first').focus()})},add_title:function(a){this.header.append(jQuery("<h4/>",{class:"modal-title"}).text(a))}}),Sao.GlobalSearch=Sao.class_(Object,{init:function(){this.el=jQuery("<div/>",{class:"global-search-container"});var a=jQuery("<div/>",{class:"input-group input-group-sm"}).appendTo(this.el);jQuery("<div/>",{id:"user-favorites",class:"input-group-btn"}).append(jQuery("<button/>",{class:"btn btn-default dropdown-toggle","data-toggle":"dropdown","aria-haspopup":!0,"aria-expanded":!1,title:Sao.i18n.gettext("Favorites"),"aria-label":Sao.i18n.gettext("Favorites")}).click(Sao.favorites_menu).append(Sao.common.ICONFACTORY.get_icon_img("tryton-bookmarks"))).appendTo(a),this.search_entry=jQuery("<input>",{id:"global-search-entry",class:"form-control mousetrap",placeholder:Sao.i18n.gettext("Action")}).appendTo(a);var b=new Sao.common.InputCompletion(this.el,this.update.bind(this),this.match_selected.bind(this),this.format.bind(this));b.input.keydown(function(a){a.which==Sao.common.RETURN_KEYCODE&&(b.dropdown.hasClass("open")||(a.preventDefault(),b.menu.dropdown("toggle")))})},format:function(a){var b=jQuery("<div/>");return Sao.common.ICONFACTORY.get_icon_img(a.icon,{class:"global_search-icon"}).appendTo(b),jQuery("<span/>",{class:"global-search-text"}).text(a.record_name).appendTo(b),b},update:function(a){var b=new Sao.Model("ir.model");return a?b.execute("global_search",[a,Sao.config.limit,Sao.main_menu_screen.model_name],Sao.main_menu_screen.context()).then(function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push({model:a[c][1],model_name:a[c][2],record_id:a[c][3],record_name:a[c][4],icon:a[c][5]});return b}.bind(this)):jQuery.when([])},match_selected:function(a){if(a.model==Sao.main_menu_screen.model_name)Sao.Action.exec_keyword("tree_open",{model:a.model,id:a.record_id});else{var b={model:a.model,res_id:a.record_id,mode:["form","tree"],name:a.model_name};Sao.Tab.create(b)}this.search_entry.val("")}}),jQuery(document).ready(function(){b();try{Notification.requestPermission()}catch(g){(console.error||console.log).call(console,g,g.stack)}Sao.login()}),jQuery(document).on("show.bs.modal",".modal",function(a){jQuery(this).appendTo(jQuery("body"))}).on("shown.bs.modal",".modal.in",function(a){d()}).on("hidden.bs.modal",".modal",function(a){d(),jQuery(".modal:visible").length&&$(document.body).addClass("modal-open")})}(),function(){"use strict";Sao.rpc=function(a,b,c){var d,e=jQuery.Deferred();b||(b=new Sao.Session),void 0===c&&(c=!0);var f=jQuery.extend([],a.params);f.push(jQuery.extend({},b.context,f.pop()));var g=Sao.common.processing.show(),h=function(f){if(null===f)Sao.common.warning.run("",Sao.i18n.gettext("Unable to reach the server")).always(e.reject);else if(f.error){var g,h,i;if("UserWarning"==f.error[0])g=f.error[1][0],h=f.error[1][1],i=f.error[1][2],Sao.common.userwarning.run(i,h).then(function(d){if(!~["always","ok"].indexOf(d))return void e.reject();Sao.rpc({method:"model.res.user.warning.create",params:[[{user:b.user_id,name:g,always:"always"==d}],{}]},b).done(function(){c?Sao.rpc(a,b).then(e.resolve,e.reject):e.resolve()})},e.reject);else if("UserError"==f.error[0])h=f.error[1][0],i=f.error[1][1],Sao.common.warning.run(i,h).always(e.reject);else if("ConcurrencyException"==f.error[0])if(c&&a.method.startsWith("model.")&&(a.method.endsWith(".write")||a.method.endsWith(".delete"))){var j=a.method.split(".").slice(1,-1).join(".");Sao.common.concurrency.run(j,a.params[0][0],a.params.slice(-1)[0]).then(function(){delete a.params.slice(-1)[0]._timestamp,Sao.rpc(a,b).then(e.resolve,e.reject)},e.reject)}else Sao.common.message.run("Concurrency Exception","tryton-warning").always(e.reject);else Sao.common.error.run(f.error[0],f.error[1]).always(e.reject)}else e.resolve(f.result),d=f.result},i=function(d,f,g){401==d.status?Sao.Session.renew(b).then(function(){c?Sao.rpc(a,b).then(e.resolve,e.reject):e.resolve()},e.reject):Sao.common.error.run(f,g).always(e.reject)};if(jQuery.ajax({async:c,headers:{Authorization:"Session "+b.get_auth()},contentType:"application/json",data:JSON.stringify(Sao.rpc.prepareObject({id:Sao.rpc.id++,method:a.method,params:f})),dataType:"json",url:"/"+(b.database||"")+"/",type:"post",complete:[function(){Sao.common.processing.hide(g)}],success:h,error:i}),c)return e.promise();if(void 0===d)throw e;return d},Sao.rpc.id=0,Sao.rpc.convertJSONObject=function(a,b,c){if(a instanceof Array)for(var d=0,e=a.length;d<e;d++)Sao.rpc.convertJSONObject(a[d],d,a);else if("string"!=typeof a&&"number"!=typeof a&&null!==a)if(a&&a.__class__){switch(a.__class__){case"datetime":a=Sao.DateTime(a.year,a.month-1,a.day,a.hour,a.minute,a.second,Math.ceil(a.microsecond/1e3),!0);break;case"date":a=Sao.Date(a.year,a.month-1,a.day);break;case"time":a=Sao.Time(a.hour,a.minute,a.second,Math.ceil(a.microsecond/1e3));break;case"timedelta":a=Sao.TimeDelta(null,a.seconds);break;case"bytes":for(var f=atob(a.base64.replace(/\s/g,"")),g=new ArrayBuffer(f.length),h=new Uint8Array(g),i=0;i<f.length;i++)h[i]=f.charCodeAt(i);a=h;break;case"Decimal":a=new Sao.Decimal(a.decimal)}c&&(c[b]=a)}else for(var j in a)Sao.rpc.convertJSONObject(a[j],j,a);return c||a},Sao.rpc.prepareObject=function(a,b,c){if(a instanceof Array){a=jQuery.extend([],a);for(var d=0,e=a.length;d<e;d++)Sao.rpc.prepareObject(a[d],d,a)}else if("string"!=typeof a&&"number"!=typeof a&&"boolean"!=typeof a&&null!==a&&void 0!==a)if(a.isDate)a={__class__:"date",year:a.year(),month:a.month()+1,day:a.date()};else if(a.isDateTime)a=a.clone(),a={__class__:"datetime",year:a.utc().year(),month:a.utc().month()+1,day:a.utc().date(),hour:a.utc().hour(),minute:a.utc().minute(),second:a.utc().second(),microsecond:1e3*a.utc().millisecond()};else if(a.isTime)a={__class__:"time",hour:a.hour(),minute:a.minute(),second:a.second(),microsecond:1e3*a.millisecond()};else if(a.isTimeDelta)a={__class__:"timedelta",seconds:a.asSeconds()};else if(a instanceof Sao.Decimal)a={__class__:"Decimal",decimal:a.toString()};else if(a instanceof Uint8Array){for(var f=[],g=65535,h=0;h*g<a.length;h++)f.push(String.fromCharCode.apply(null,a.subarray(h*g,(h+1)*g)));a={__class__:"bytes",base64:btoa(f.join(""))}}else{a=jQuery.extend({},a);for(var i in a)Sao.rpc.prepareObject(a[i],i,a)}return c&&(c[b]=a),c||a},jQuery.ajaxSetup({converters:{"text json":function(a){return Sao.rpc.convertJSONObject(jQuery.parseJSON(a))}}})}(),function(){"use strict";Sao.PYSON={},Sao.PYSON.eval={},Sao.PYSON.toString=function(a){return a instanceof Sao.PYSON.PYSON?a.toString():a instanceof Array?"["+a.map(Sao.PYSON.toString).join(", ")+"]":a instanceof Object?"{"+Object.keys(a).map(function(b){return Sao.PYSON.toString(b)+": "+Sao.PYSON.toString(a[b])}).join(", ")+"}":JSON.stringify(a)},Sao.PYSON.PYSON=Sao.class_(Object,{init:function(){},pyson:function(){throw"NotImplementedError"},types:function(){throw"NotImplementedError"},toString:function(){return this.pyson().__class__+"("+this.__string_params__().map(Sao.PYSON.toString).join(", ")+")"},__string_params__:function(){throw"NotImplementedError"}}),Sao.PYSON.PYSON.eval_=function(a,b){throw"NotImplementedError"},Sao.PYSON.PYSON.init_from_object=function(a){throw"NotImplementedError"},Sao.PYSON.Encoder=Sao.class_(Object,{prepare:function(a,b,c){if(null!==a&&void 0!==a)if(a instanceof Array){a=jQuery.extend([],a);for(var d=0,e=a.length;d<e;d++)this.prepare(a[d],d,a)}else if(a._isAMomentObject)a=a.isDate?new Sao.PYSON.Date(a.year(),a.month()+1,a.date()).pyson():new Sao.PYSON.DateTime(a.year(),a.month()+1,a.date(),a.hours(),a.minutes(),a.seconds(),1e3*a.milliseconds()).pyson();else if(a instanceof Sao.Decimal)a=a.valueOf();else if(a instanceof Object&&!(a instanceof Sao.PYSON.PYSON)){a=jQuery.extend({},a);for(var f in a)this.prepare(a[f],f,a)}return c&&(c[b]=a),c||a},encode:function(a){return a=this.prepare(a),JSON.stringify(a,function(a,b){return b instanceof Sao.PYSON.PYSON?this.prepare(b.pyson()):null===b||void 0===b?null:b}.bind(this))}}),Sao.PYSON.Decoder=Sao.class_(Object,{init:function(a,b){this.__context=a||{},this.noeval=b||!1},decode:function(a){var b=function(a,b){if("object"==typeof b&&null!==b){var c=Sao.PYSON[b.__class__];if(c){if(this.noeval){var d=jQuery.extend({},b);return delete d.__class__,Sao.PYSON[b.__class__].init_from_object(d)}return c.eval_(b,this.__context)}}return b};return JSON.parse(a,b.bind(this))}}),Sao.PYSON.eval.Eval=function(a,b){return new Sao.PYSON.Eval(a,b)},Sao.PYSON.Eval=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b){void 0===b&&(b=""),Sao.PYSON.Eval._super.init.call(this),this._value=a,this._default=b},pyson:function(){return{__class__:"Eval",v:this._value,d:this._default}},types:function(){return this._default instanceof Sao.PYSON.PYSON?this._default.types():[typeof this._default]},__string_params__:function(){return[this._value,this._default]}}),Sao.PYSON.Eval.eval_=function(a,b){return a.v in b?b[a.v]:a.d},Sao.PYSON.Eval.init_from_object=function(a){return new Sao.PYSON.Eval(a.v,a.d)},Sao.PYSON.eval.Not=function(a){return new Sao.PYSON.Not(a)},Sao.PYSON.Not=Sao.class_(Sao.PYSON.PYSON,{init:function(a){Sao.PYSON.Not._super.init.call(this),a instanceof Sao.PYSON.PYSON?(jQuery(a.types()).not(["boolean","object"]).length||jQuery(["boolean"]).not(a.types()).length)&&(a=new Sao.PYSON.Bool(a)):"boolean"!=typeof a&&(a=Sao.PYSON.Bool(a)),this._value=a},pyson:function(){return{__class__:"Not",v:this._value}},types:function(){return["boolean"]},__string_params__:function(){return[this._value]}}),Sao.PYSON.Not.eval_=function(a,b){return!a.v},Sao.PYSON.Not.init_from_object=function(a){return new Sao.PYSON.Not(a.v)},Sao.PYSON.eval.Bool=function(a){return new Sao.PYSON.Bool(a)},Sao.PYSON.Bool=Sao.class_(Sao.PYSON.PYSON,{init:function(a){Sao.PYSON.Bool._super.init.call(this),this._value=a},pyson:function(){return{__class__:"Bool",v:this._value}},types:function(){return["boolean"]},__string_params__:function(){return[this._value]}}),Sao.PYSON.Bool.eval_=function(a,b){return moment.isMoment(a.v)&&a.v.isTime?Boolean(a.v.hour()||a.v.minute()||a.v.second()||a.v.millisecond()):moment.isDuration(a.v)?Boolean(a.v.valueOf()):a.v instanceof Number?Boolean(a.v.valueOf()):a.v instanceof Object?!jQuery.isEmptyObject(a.v):Boolean(a.v)},Sao.PYSON.Bool.init_from_object=function(a){return new Sao.PYSON.Bool(a.v)},Sao.PYSON.eval.And=function(a){return new Sao.PYSON.And(a)},Sao.PYSON.And=Sao.class_(Sao.PYSON.PYSON,{init:function(a){void 0===a&&(a=[]),Sao.PYSON.And._super.init.call(this);for(var b=0,c=a.length;b<c;b++){var d=a[b];d instanceof Sao.PYSON.PYSON?(jQuery(d.types()).not(["boolean"]).length||jQuery(["boolean"]).not(d.types()).length)&&(a[b]=new Sao.PYSON.Bool(d)):"boolean"!=typeof d&&(a[b]=new Sao.PYSON.Bool(d))}if(a.length<2)throw"must have at least 2 statements";this._statements=a},pyson:function(){return{__class__:"And",s:this._statements}},types:function(){return["boolean"]},__string_params__:function(){return[this._statements]}}),Sao.PYSON.And.eval_=function(a,b){for(var c=!0,d=0,e=a.s.length;d<e;d++){var f=a.s[d];c=c&&f}return c},Sao.PYSON.And.init_from_object=function(a){return new Sao.PYSON.And(a.s)},Sao.PYSON.eval.Or=function(a){return new Sao.PYSON.Or(a)},Sao.PYSON.Or=Sao.class_(Sao.PYSON.And,{pyson:function(){var a=Sao.PYSON.Or._super.pyson.call(this);return a.__class__="Or",a}}),Sao.PYSON.Or.eval_=function(a,b){for(var c=!1,d=0,e=a.s.length;d<e;d++){var f=a.s[d];c=c||f}return c},Sao.PYSON.Or.init_from_object=function(a){return new Sao.PYSON.Or(a.s)},Sao.PYSON.eval.Equal=function(a,b){return new Sao.PYSON.Equal(a,b)},Sao.PYSON.Equal=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b){Sao.PYSON.Equal._super.init.call(this);var c,d;if(c=a instanceof Sao.PYSON.PYSON?a.types():[typeof a],d=b instanceof Sao.PYSON.PYSON?b.types():[typeof b],jQuery(c).not(d).length||jQuery(d).not(c).length)throw"statements must have the same type";this._statement1=a,this._statement2=b},pyson:function(){return{__class__:"Equal",s1:this._statement1,s2:this._statement2}},types:function(){return["boolean"]},__string_params__:function(){return[this._statement1,this._statement2]}}),Sao.PYSON.Equal.eval_=function(a,b){return a.s1 instanceof Array&&a.s2 instanceof Array?Sao.common.compare(a.s1,a.s2):moment.isMoment(a.s1)&&moment.isMoment(a.s2)?a.s1.isDate==a.s2.isDate&&a.s1.isDateTime==a.s2.isDateTime&&a.s1.valueOf()==a.s2.valueOf():a.s1==a.s2},Sao.PYSON.Equal.init_from_object=function(a){return new Sao.PYSON.Equal(a.s1,a.s2)},Sao.PYSON.eval.Greater=function(a,b,c){return new Sao.PYSON.Greater(a,b,c)},Sao.PYSON.Greater=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b,c){Sao.PYSON.Greater._super.init.call(this);for(var d=[a,b],e=0;e<2;e++){var f=d[e];if(f instanceof Sao.PYSON.PYSON){if(jQuery(f.types()).not(["number"]).length)throw"statement must be an integer or a float"}else if(!~["number","object"].indexOf(typeof f))throw"statement must be an integer or a float"}void 0===c&&(c=!1),c instanceof Sao.PYSON.PYSON?(jQuery(c.types()).not(["boolean"]).length||jQuery(["boolean"]).not(c.types()).length)&&(c=new Sao.PYSON.Bool(c)):"boolean"!=typeof c&&(c=new Sao.PYSON.Bool(c)),this._statement1=a,this._statement2=b,this._equal=c},pyson:function(){return{__class__:"Greater",s1:this._statement1,s2:this._statement2,e:this._equal}},types:function(){return["boolean"]},__string_params__:function(){return[this._statement1,this._statement2,this._equal]}}),Sao.PYSON.Greater._convert=function(a){return a=jQuery.extend({},a),a.s1=Number(a.s1),a.s2=Number(a.s2),a},Sao.PYSON.Greater.eval_=function(a,b){return a=Sao.PYSON.Greater._convert(a),a.e?a.s1>=a.s2:a.s1>a.s2},Sao.PYSON.Greater.init_from_object=function(a){return new Sao.PYSON.Greater(a.s1,a.s2,a.e)},Sao.PYSON.eval.Less=function(a,b,c){return new Sao.PYSON.Less(a,b,c)},Sao.PYSON.Less=Sao.class_(Sao.PYSON.Greater,{pyson:function(){var a=Sao.PYSON.Less._super.pyson.call(this);return a.__class__="Less",a}}),Sao.PYSON.Less._convert=Sao.PYSON.Greater._convert,Sao.PYSON.Less.eval_=function(a,b){return a=Sao.PYSON.Less._convert(a),a.e?a.s1<=a.s2:a.s1<a.s2},Sao.PYSON.Less.init_from_object=function(a){return new Sao.PYSON.Less(a.s1,a.s2,a.e)},Sao.PYSON.eval.If=function(a,b,c){return new Sao.PYSON.If(a,b,c)},Sao.PYSON.If=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b,c){Sao.PYSON.If._super.init.call(this),a instanceof Sao.PYSON.PYSON?(jQuery(a.types()).not(["boolean"]).length||jQuery(["boolean"]).not(a.types()).length)&&(a=new Sao.PYSON.Bool(a)):"boolean"!=typeof a&&(a=new Sao.PYSON.Bool(a));var d,e;if(d=b instanceof Sao.PYSON.PYSON?b.types():[typeof b],void 0===c&&(c=null),e=c instanceof Sao.PYSON.PYSON?c.types():[typeof c],jQuery(d).not(e).length||jQuery(e).not(d).length)throw"then and else statements must be the same type";this._condition=a,this._then_statement=b,this._else_statement=c},pyson:function(){return{__class__:"If",c:this._condition,t:this._then_statement,
|
|
5
|
-
e:this._else_statement}},types:function(){return this._then_statement instanceof Sao.PYSON.PYSON?this._then_statement.types():[typeof this._then_statement]},__string_params__:function(){return[this._condition,this._then_statement,this._else_statement]}}),Sao.PYSON.If.eval_=function(a,b){return a.c?a.t:a.e},Sao.PYSON.If.init_from_object=function(a){return new Sao.PYSON.If(a.c,a.t,a.e)},Sao.PYSON.eval.Get=function(a,b,c){return new Sao.PYSON.Get(a,b,c)},Sao.PYSON.Get=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b,c){if(Sao.PYSON.Get._super.init.call(this),void 0===c&&(c=null),a instanceof Sao.PYSON.PYSON){if(jQuery(a.types()).not(["object"]).length||jQuery(["object"]).not(a.types()).length)throw"obj must be a dict"}else if(!(a instanceof Object))throw"obj must be a dict";if(this._obj=a,b instanceof Sao.PYSON.PYSON){if(jQuery(b.types()).not(["string"]).length||jQuery(["string"]).not(b.types()).length)throw"key must be a string"}else if("string"!=typeof b)throw"key must be a string";this._key=b,this._default=c},pyson:function(){return{__class__:"Get",v:this._obj,k:this._key,d:this._default}},types:function(){return this._default instanceof Sao.PYSON.PYSON?this._default.types():[typeof this._default]},__string_params__:function(){return[this._obj,this._key,this._default]}}),Sao.PYSON.Get.eval_=function(a,b){return a.k in a.v?a.v[a.k]:a.d},Sao.PYSON.Get.init_from_object=function(a){return new Sao.PYSON.Get(a.v,a.k,a.d)},Sao.PYSON.eval.In=function(a,b){return new Sao.PYSON.In(a,b)},Sao.PYSON.In=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b){if(Sao.PYSON.In._super.init.call(this),a instanceof Sao.PYSON.PYSON){if(jQuery(a.types()).not(["string","number"]).length)throw"key must be a string or a number"}else if(!~["string","number"].indexOf(typeof a))throw"key must be a string or a number";if(b instanceof Sao.PYSON.PYSON){if(jQuery(b.types()).not(["object"]).length||jQuery(["object"]).not(b.types()).length)throw"obj must be a dict or a list"}else if(!(b instanceof Object))throw"obj must be a dict or a list";this._key=a,this._obj=b},pyson:function(){return{__class__:"In",k:this._key,v:this._obj}},types:function(){return["boolean"]},__string_params__:function(){return[this._key,this._obj]}}),Sao.PYSON.In.eval_=function(a,b){return!!a.v&&(a.v.indexOf?Boolean(~a.v.indexOf(a.k)):!!a.v[a.k])},Sao.PYSON.In.init_from_object=function(a){return new Sao.PYSON.In(a.k,a.v)},Sao.PYSON.eval.Date=function(a,b,c,d,e,f){return new Sao.PYSON.Date(a,b,c,d,e,f)},Sao.PYSON.Date=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b,c,d,e,f){Sao.PYSON.Date._super.init.call(this),void 0===a&&(a=null),void 0===b&&(b=null),void 0===c&&(c=null),void 0===d&&(d=0),void 0===e&&(e=0),void 0===f&&(f=0),this._test(a,"year"),this._test(b,"month"),this._test(c,"day"),this._test(d,"delta_years"),this._test(f,"delta_days"),this._test(e,"delta_months"),this._year=a,this._month=b,this._day=c,this._delta_years=d,this._delta_months=e,this._delta_days=f},pyson:function(){return{__class__:"Date",y:this._year,M:this._month,d:this._day,dy:this._delta_years,dM:this._delta_months,dd:this._delta_days}},types:function(){return["object"]},_test:function(a,b){if(a instanceof Sao.PYSON.PYSON){if(jQuery(a.types()).not(["number","object"]).length)throw b+" must be an integer or None"}else if("number"!=typeof a&&null!==a)throw b+" must be an integer or None"},__string_params__:function(){return[this._year,this._month,this._day,this._delta_years,this._delta_months,this._delta_days]}}),Sao.PYSON.Date.eval_=function(a,b){var c=Sao.Date(a.y,a.M&&a.M-1,a.d);return a.dy&&c.add(a.dy,"y"),a.dM&&c.add(a.dM,"M"),a.dd&&c.add(a.dd,"d"),c},Sao.PYSON.Date.init_from_object=function(a){return new Sao.PYSON.Date(a.y,a.M,a.d,a.dy,a.dM,a.dd)},Sao.PYSON.eval.DateTime=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){return new Sao.PYSON.DateTime(a,b,c,d,e,f,g,h,i,j,k,l,m,n)},Sao.PYSON.DateTime=Sao.class_(Sao.PYSON.Date,{init:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){Sao.PYSON.DateTime._super.init.call(this,a,b,c,h,i,j),void 0===d&&(d=null),void 0===e&&(e=null),void 0===f&&(f=null),void 0===g&&(g=null),void 0===k&&(k=0),void 0===l&&(l=0),void 0===m&&(m=0),void 0===n&&(n=0),this._test(d,"hour"),this._test(e,"minute"),this._test(f,"second"),this._test(g,"microsecond"),this._test(k,"delta_hours"),this._test(l,"delta_minutes"),this._test(m,"delta_seconds"),this._test(n,"delta_microseconds"),this._hour=d,this._minute=e,this._second=f,this._microsecond=g,this._delta_hours=k,this._delta_minutes=l,this._delta_seconds=m,this._delta_microseconds=n},pyson:function(){var a=Sao.PYSON.DateTime._super.pyson.call(this);return a.__class__="DateTime",a.h=this._hour,a.m=this._minute,a.s=this._second,a.ms=this._microsecond,a.dh=this._delta_hours,a.dm=this._delta_minutes,a.ds=this._delta_seconds,a.dms=this._delta_microseconds,a},__string_params__:function(){var a=Sao.PYSON.DateTime._super.__string_params__.call(this);return[a[0],a[1],a[2],this._hour,this._minute,this._second,this._microsecond,a[3],a[4],a[5],this._delta_hours,this._delta_minutes,this._delta_seconds,this._delta_microseconds]}}),Sao.PYSON.DateTime.eval_=function(a,b){var c=Sao.DateTime(a.y,a.M&&a.M-1,a.d,a.h,a.m,a.s,a.ms&&a.ms/1e3,!0);return a.dy&&c.add(a.dy,"y"),a.dM&&c.add(a.dM,"M"),a.dd&&c.add(a.dd,"d"),a.dh&&c.add(a.dh,"h"),a.dm&&c.add(a.dm,"m"),a.ds&&c.add(a.ds,"s"),a.dms&&c.add(a.dms/1e3,"ms"),c},Sao.PYSON.DateTime.init_from_object=function(a){return new Sao.PYSON.DateTime(a.y,a.M,a.d,a.h,a.m,a.s,a.ms,a.dy,a.dM,a.dd,a.dh,a.dm,a.ds,a.dms)},Sao.PYSON.eval.TimeDelta=function(a,b,c){return new Sao.PYSON.TimeDelta(a,b,c)},Sao.PYSON.TimeDelta=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b,c){function d(a,b){if(a instanceof Sao.PYSON.TimeDelta){if(jQuery(a.types()).not(["number"]).length)throw b+" must be an integer"}else if("number"!=typeof a)throw b+" must be an integer";return a}Sao.PYSON.TimeDelta._super.init.call(this),void 0===a&&(a=0),void 0===b&&(b=0),void 0===c&&(c=0),this._days=d(a,"days"),this._seconds=d(b,"seconds"),this._microseconds=d(c,"microseconds")},pyson:function(){return{__class__:"TimeDelta",d:this._days,s:this._seconds,m:this._microseconds}},types:function(){return["object"]},__string_params__:function(){return[this._days,this._seconds,this._microseconds]}}),Sao.PYSON.TimeDelta.eval_=function(a,b){return Sao.TimeDelta(a.d,a.s,a.m/1e3)},Sao.PYSON.TimeDelta.init_from_object=function(a){return new Sao.PYSON.TimeDelta(a.d,a.s,a.microseconds)},Sao.PYSON.eval.Len=function(a){return new Sao.PYSON.Len(a)},Sao.PYSON.Len=Sao.class_(Sao.PYSON.PYSON,{init:function(a){if(Sao.PYSON.Len._super.init.call(this),a instanceof Sao.PYSON.PYSON){if(jQuery(a.types()).not(["object","string"]).length||jQuery(["object","string"]).not(a.types()).length)throw"value must be an object or a string"}else if("object"!=typeof a&&"string"!=typeof a)throw"value must be an object or a string";this._value=a},pyson:function(){return{__class__:"Len",v:this._value}},types:function(){return["integer"]},__string_params__:function(){return[this._value]}}),Sao.PYSON.Len.eval_=function(a,b){return"object"==typeof a.v?Object.keys(a.v).length:a.v.length},Sao.PYSON.Len.init_from_object=function(a){return new Sao.PYSON.Len(a.v)}}(),function(){"use strict";function a(a){return window.btoa(unescape(encodeURIComponent(a)))}Sao.Session=Sao.class_(Object,{init:function(a,b){if(this.user_id=null,this.session=null,this.prm=jQuery.when(),this.database=a,this.login=b,this.database){var c=localStorage.getItem("sao_session_"+a);null!==c&&(c=JSON.parse(c),this.login&&this.login!=c.login||(this.login=c.login,this.user_id=c.user_id,this.session=c.session))}this.context={client:Sao.Bus.id},Sao.Session.current_session||(Sao.Session.current_session=this)},get_auth:function(){return a(this.login+":"+this.user_id+":"+this.session)},do_login:function(a,b){var c=jQuery.Deferred(),d=function(b){return{method:"common.db.login",params:[a,b,Sao.i18n.getlang()]}};return new Sao.Login(d,this).run().then(function(b){this.login=a,this.user_id=b[0],this.session=b[1],this.store(),c.resolve()}.bind(this),function(){this.user_id=null,this.session=null,this.store(),c.reject()}.bind(this)),c.promise()},do_logout:function(){if(!this.user_id||!this.session)return jQuery.when();var a={id:0,method:"common.db.logout",params:[]},b=jQuery.ajax({headers:{Authorization:"Session "+this.get_auth()},contentType:"application/json",data:JSON.stringify(a),dataType:"json",url:"/"+this.database+"/",type:"post"});return this.unstore(),this.database=null,this.login=null,this.user_id=null,this.session=null,Sao.Session.current_session===this&&(Sao.Session.current_session=null),b},reload_context:function(){var a={method:"model.res.user.get_preferences",params:[!0,{}]};return this.context={client:Sao.Bus.id},Sao.rpc(a,this).then(function(a){jQuery.extend(this.context,a)}.bind(this))},store:function(){var a={login:this.login,user_id:this.user_id,session:this.session};a=JSON.stringify(a),localStorage.setItem("sao_session_"+this.database,a)},unstore:function(){localStorage.removeItem("sao_session_"+this.database)}}),Sao.Session.login_dialog=function(){var a=new Sao.Dialog(Sao.i18n.gettext("Login"),"lg");return a.database_select=jQuery("<select/>",{class:"form-control",id:"login-database"}).hide(),a.database_input=jQuery("<input/>",{class:"form-control",id:"login-database"}).hide(),a.login_input=jQuery("<input/>",{class:"form-control",id:"login-login",placeholder:Sao.i18n.gettext("User name")}),a.body.append(jQuery("<div/>",{class:"form-group"}).append(jQuery("<label/>",{class:"control-label",for:"login-database"}).text(Sao.i18n.gettext("Database"))).append(a.database_select).append(a.database_input)).append(jQuery("<div/>",{class:"form-group"}).append(jQuery("<label/>",{class:"control-label",for:"login-login"}).text(Sao.i18n.gettext("User name"))).append(a.login_input)),a.button=jQuery("<button/>",{class:"btn btn-primary",type:"submit"}).text(" "+Sao.i18n.gettext("Login")).appendTo(a.footer),a},Sao.Session.get_credentials=function(){var a=function(){return window.location.hash.replace(/^(#(!|))/,"").split("/",1)[0]||null},b=jQuery.Deferred(),c=a(),d=new Sao.Session(c,null);if(d.session)return b.resolve(d),b;var e=Sao.Session.login_dialog(),f=function(){return e.modal.find("input,select").filter(":visible:not([readonly])").filter(function(){return!jQuery(this).val()})},g=function(){var c=e.login_input.val(),g=g||e.database_select.val()||e.database_input.val();if(e.modal.find(".has-error").removeClass("has-error"),!c||!g)return void f().closest(".form-group").addClass("has-error");e.button.focus(),e.button.prop("disabled",!0),e.modal.modal("hide"),d.database=g,d.do_login(c).then(function(){b.resolve(d),e.modal.remove(),a()!=g&&(window.location="#"+g)},function(){e.button.prop("disabled",!1),e.modal.modal("show"),f().closest(".form-group").addClass("has-error"),f().first().focus()})};return e.modal.modal({backdrop:!1,keyboard:!1}),e.modal.find("form").unbind().submit(function(a){g(),a.preventDefault()}),e.modal.on("shown.bs.modal",function(){f().first().focus()}),jQuery.when(Sao.DB.list()).then(function(a){var b;a=a||[],1==a.length?(c=a[0],b=e.database_input):(b=e.database_select,a.forEach(function(a){b.append(jQuery("<option/>",{value:a,text:a}))})),b.prop("readonly",1==a.length),b.show(),b.val(c||"")},function(){e.database_input.show()}),b.promise()},Sao.Session.renew=function(a){if("pending"==a.prm.state())return a.prm;var b=jQuery.Deferred();return a.prm=b.promise(),a.do_login(a.login).then(b.resolve,function(){Sao.logout(),b.reject()}).done(function(){Sao.Bus.listen()}),a.prm},Sao.Session.current_session=null,Sao.Login=Sao.class_(Object,{init:function(a,b){this.func=a,this.session=b||Sao.Session.current_session},run:function(a){void 0===a&&(a={});var b=jQuery.Deferred(),c=Sao.common.processing.show(),d=this.func(a);d.id=0;var e={contentType:"application/json",data:JSON.stringify(d),dataType:"json",url:"/"+this.session.database+"/",type:"post",complete:[function(){Sao.common.processing.hide(c)}]};this.session.user_id&&this.session.session&&(e.headers={Authorization:"Session "+this.session.get_auth()});var f=jQuery.ajax(e),g=function(c){if(null===c)Sao.common.warning.run("",Sao.i18n.gettext("Unable to reach the server.")),b.reject();else if(c.error){if(c.error[0].startsWith("401"))return this.run({}).then(b.resolve,b.reject);if(c.error[0].startsWith("404"))b.reject();else if("LoginException"!=c.error[0])Sao.common.error.run(c.error[0],c.error[1]),b.reject();else{var d=c.error[1],e=d[0],f=d[1],g=d[2];this["get_"+g](f).then(function(c){return a[e]=c,this.run(a).then(b.resolve,b.reject)}.bind(this),b.reject)}}else b.resolve(c.result)},h=function(a,c,d){401==a.status?this.run({}).then(b.resolve,b.reject):(Sao.common.error.run(c,d),b.reject())};return f.done(g.bind(this)),f.fail(h.bind(this)),b.promise()},get_char:function(a){return Sao.common.ask.run(a)},get_password:function(a){return Sao.common.ask.run(a,!1)}}),Sao.DB={},Sao.DB.list=function(){var a=Sao.common.processing.show();return jQuery.ajax({contentType:"application/json",data:JSON.stringify({id:0,method:"common.db.list",params:[]}),dataType:"json",url:"/",type:"post",complete:[function(){Sao.common.processing.hide(a)}]}).then(function(a){return a.result})}}(),function(){"use strict";Sao.Model=Sao.class_(Object,{init:function(a,b){b=b||{},this.name=a,this.session=Sao.Session.current_session,this.fields={}},add_fields:function(a){var b=[];for(var c in a){var d=a[c];if(c in this.fields)jQuery.extend(this.fields[c].description,d);else{var e=Sao.field.get(d.type);this.fields[c]=new e(d),b.push(c)}}return b},execute:function(a,b,c,d){void 0===c&&(c={});var e={method:"model."+this.name+"."+a,params:b.concat(c)};return Sao.rpc(e,this.session,d)},copy:function(a,b){if(jQuery.isEmptyObject(a))return jQuery.when();var c=a.map(function(a){return a.id});return this.execute("copy",[c,{}],b)}}),Sao.Group=function(a,b,c){return c.prm=jQuery.when(),c.model=a,c._context=b,c.on_write=[],c.parent=void 0,c.screens=[],c.parent_name="",c.children=[],c.child_name="",c.parent_datetime_field=void 0,c.record_removed=[],c.record_deleted=[],c.__readonly=!1,c.exclude_field=null,c.skip_model_access=!1,c.forEach(function(a,b,c){a.group=c}),c.get_readonly=function(){var a=Sao.common.MODELACCESS.get(this.model.name);return!(!this.context()._datetime&&(a.write||a.create||this.skip_model_access))||this.__readonly},c.set_readonly=function(a){this.__readonly=a},c.load=function(a,b){var c,d,e=[];for(c=0,d=a.length;c<d;c++){var f=a[c],g=this.get(f);g||(g=new Sao.Record(this.model,f),g.group=this,this.push(g)),e.push(g)}var h,i=[];for(c=0,d=this.record_removed.length;c<d;c++)h=this.record_removed[c],~a.indexOf(h.id)||i.push(h);this.record_removed=i;var j=[];for(c=0,d=this.record_deleted.length;c<d;c++)h=this.record_deleted[c],~a.indexOf(h.id)||j.push(h);if(this.record_deleted=j,e.length&&b){e.forEach(function(a){a._changed.id=!0});var k=this.root_group();this.changed().then(function(){k.screens.forEach(function(a){a.display()})})}},c.get=function(a){for(var b=0,c=this.length;b<c;b++){var d=this[b];if(d.id==a)return d}},c.new_=function(a,b,c){var d=new Sao.Record(this.model,b);return d.group=this,a&&d.default_get(c),d},c.add=function(a,b,c){void 0!==b&&-1!=b||(b=this.length),b=Math.min(b,this.length),void 0===c&&(c=!0),a.group!=this&&(a.group=this),this.splice(b,0,a);for(var d in this.record_removed)d.id==a.id&&this.record_removed.splice(this.record_removed.indexOf(d),1);for(var e in this.record_deleted)e.id==a.id&&this.record_deleted.splice(this.record_deleted.indexOf(e),1);if(a._changed.id=!0,c&&(this.changed(),this.parent&&this.model.fields[this.parent_name])){var f=this.model.fields[this.parent_name];if(f instanceof Sao.field.Many2One||f instanceof Sao.field.Reference){var g=[this.parent.id,""];f instanceof Sao.field.Reference&&(g=[this.parent.model.name,g]),f.set_client(a,g)}}return a},c.remove=function(a,b,c,d,e){void 0===c&&(c=!0),void 0===e&&(e=!0);this.indexOf(a);a.id>=0&&(b?(~this.record_deleted.indexOf(a)&&this.record_deleted.splice(this.record_deleted.indexOf(a),1),~this.record_removed.indexOf(a)||this.record_removed.push(a)):(~this.record_removed.indexOf(a)&&this.record_removed.splice(this.record_removed.indexOf(a),1),~this.record_deleted.indexOf(a)||this.record_deleted.push(a))),a.group.parent&&(a.group.parent._changed.id=!0),c&&(a._changed.id=!0),(a.id<0||d)&&this._remove(a),e&&a.group.changed()},c._remove=function(a){var b=this.indexOf(a);this.splice(b,1)},c.unremove=function(a){this.record_removed.splice(this.record_removed.indexOf(a),1),this.record_deleted.splice(this.record_deleted.indexOf(a),1),a.group.changed()},c.clear=function(){this.splice(0,this.length),this.record_removed=[],this.record_deleted=[]},c.changed=function(){if(!this.parent)return jQuery.when.apply(jQuery,this.screens.map(function(a){return a.display()}));this.parent._changed[this.child_name]=!0;var a=this.parent.model.fields[this.child_name].changed(this.parent);return a||(a=jQuery.when()),a.then(function(){this.parent.validate(null,!0).done(function(){return this.parent.group.changed()}.bind(this))}.bind(this))},c.delete_=function(a){if(jQuery.isEmptyObject(a))return jQuery.when();var b=this.root_group();console.assert(a.every(function(a){return a.model.name==this.model.name}.bind(this)),"records not from the same model"),console.assert(a.every(function(a){return a.group.root_group()==b}),"records not from the same root group"),a=a.filter(function(a){return a.id>=0});var c=this.context();c._timestamp={},a.forEach(function(a){jQuery.extend(c._timestamp,a.get_timestamp()),a.destroy()});var d=a.map(function(a){return a.id});return b.on_write_ids(d).then(function(a){return a=a.filter(function(a){return!~d.indexOf(a)}),this.model.execute("delete",[d],c).then(function(){b.reload(a)})}.bind(this))},c.root_group=function(){for(var a=this,b=this.parent;b;)a=b.group,b=b.parent;return a},c.save=function(){var a=[];return this.forEach(function(b){a.push(b.save())}),jQuery.isEmptyObject(this.record_deleted)||(this.record_deleted.forEach(function(a){this._remove(a)}.bind(this)),a.push(this.delete_(this.record_deleted)),this.record_deleted.splice(0,this.record_deleted.length)),jQuery.when.apply(jQuery,a)},c.written=function(a){return"number"==typeof a&&(a=[a]),this.on_write_ids(a).then(function(b){b=b.filter(function(b){return!~a.indexOf(b)}),this.root_group().reload(b)}.bind(this))},c.reload=function(a){this.children.forEach(function(b){b.reload(a)}),a.forEach(function(a){var b=this.get(a);b&&jQuery.isEmptyObject(b._changed)&&b.cancel()}.bind(this))},c.on_write_ids=function(a){var b=[],c=[];return this.on_write.forEach(function(d){var e=this.model.execute(d,[a],this._context).then(function(a){jQuery.extend(c,a)});b.push(e)}.bind(this)),jQuery.when.apply(jQuery,b).then(function(){return c.filter(function(a,b,c){return b==c.indexOf(a)})})},c.set_parent=function(a){this.parent=a,a&&a.model.name==this.model.name&&this.parent.group.children.push(this)},c.add_fields=function(a){var b=this.model.add_fields(a);if(!jQuery.isEmptyObject(this)){var c=[];this.forEach(function(a){a.id<0&&c.push(a)}),c.length&&b.length&&this.model.execute("default_get",[b,this.context()]).then(function(a){c.forEach(function(b){b.set_default(a,!0,!1)}),this.root_group().screens.forEach(function(a){return a.display()})}.bind(this))}},c.destroy=function(){if(this.parent){var a=this.parent.group.children.indexOf(this);~a&&this.parent.group.children.splice(a,1)}this.parent=null},c.domain=function(){var a=[];if(this.screens.forEach(function(b){b.attributes.domain&&a.push(b.attributes.domain)}),this.parent&&this.child_name){var b=this.parent.model.fields[this.child_name];return[a,b.get_domain(this.parent)]}return a},c.context=function(){return this._get_context()},c.set_context=function(a){this._context=jQuery.extend({},a)},c.local_context=function(){return this._get_context(!0)},c._get_context=function(a){var b;if(b=a?{}:jQuery.extend({},this.model.session.context),this.parent){var c=this.parent.get_context(a);if(jQuery.extend(b,c),this.child_name in this.parent.model.fields){var d=this.parent.model.fields[this.child_name];jQuery.extend(b,d.get_context(this.parent,c,a))}}return jQuery.extend(b,this._context),this.parent_datetime_field&&(b._datetime=this.parent.get_eval()[this.parent_datetime_field]),b},c.clean4inversion=function(a){if(jQuery.isEmptyObject(a))return[];var b=new Sao.common.DomainInversion,c=a[0],d=a.slice(1);if(~["AND","OR"].indexOf(c));else if(b.is_leaf(c)){var e=c[0];e in this.model.fields&&this.model.fields[e].description.readonly&&(c=[])}else c=this.clean4inversion(c);return[c].concat(this.clean4inversion(d))},c.domain4inversion=function(){var a=this.domain();return this.__domain4inversion&&Sao.common.compare(this.__domain4inversion[0],a)||(this.__domain4inversion=[a,this.clean4inversion(a)]),this.__domain4inversion[1]},c.get_by_path=function(a){a=jQuery.extend([],a);var b=null,c=this,d=function(){if(jQuery.isEmptyObject(a))return b;var e=a[0][0],f=a[0][1];return a.splice(0,1),b=c.get(f),b?e?b.load(e).then(function(){return c=b._values[e],c?d():null}):d():null};return jQuery.when().then(d)},c},Sao.Record=Sao.class_(Object,{id_counter:-1,init:function(a,b){this.model=a,this.group=Sao.Group(a,{},[]),this.id=void 0===b||null===b?Sao.Record.prototype.id_counter:b,this.id<0&&Sao.Record.prototype.id_counter--,this._values={},this._changed={},this._loaded={},this.fields={},this._timestamp=null,this.attachment_count=-1,this.unread_note=-1,this.button_clicks={},this.state_attrs={},this.autocompletion={},this.exception=!1,this.destroyed=!1},has_changed:function(){return!jQuery.isEmptyObject(this._changed)},save:function(a){void 0===a&&(a=!1);var b=this.get_context(),c=jQuery.when();if(this.id<0||this.has_changed()){var d=this.get();if(this.id<0)try{this.id=this.model.execute("create",[[d]],b,!1)[0]}catch(e){return e.promise?e.then(function(){return this.save(a)}.bind(this)):jQuery.Deferred().reject()}else jQuery.isEmptyObject(d)||(b._timestamp=this.get_timestamp(),c=this.model.execute("write",[[this.id],d],b));c=c.done(function(){if(this.cancel(),a)return this.reload()}.bind(this)),this.group&&(c=c.done(function(){return this.group.written(this.id)}.bind(this)))}return this.group.parent&&(delete this.group.parent._changed[this.group.child_name],c=c.done(function(){return this.group.parent.save(a)}.bind(this))),c},reload:function(a){if(this.id<0)return jQuery.when();if(a){var b=a.map(function(a){return this.load(a)}.bind(this));return jQuery.when.apply(jQuery,b)}return this.load("*")},load:function(a){var b,c;if(this.destroyed||this.id<0||a in this._loaded)return jQuery.when();if("pending"==this.group.prm.state())return this.group.prm.then(function(){return this.load(a)}.bind(this));var d={};d[this.id]=this;var e,f,g;if("*"==a){e="eager",f=new Set;var h=function(a){f.add(a)};for(b in this.model.fields)g=this.model.fields[b],"lazy"==(g.description.loading||"eager")&&(e="lazy"),g.views.forEach(h)}else e=this.model.fields[a].description.loading||"eager",f=this.model.fields[a].views;var i={};if("eager"==e)for(b in this.model.fields)g=this.model.fields[b],"eager"==(g.description.loading||"eager")&&(i[b]=g);else i=this.model.fields;var j=[];for(b in i)g=i[b],b in this._loaded||f.size&&!Sao.common.intersect(Array.from(f).sort(),Array.from(g.views).sort())||j.push(b);var k=j.slice(),l=["many2one","one2one","reference"];for(var m in j){b=j[m];var n=this.model.fields[b].description;~l.indexOf(n.type)&&k.push(b+".rec_name")}~j.indexOf("rec_name")||k.push("rec_name"),k.push("_timestamp");var o=jQuery.extend({},this.get_context());if("eager"==e){var p,q,r=parseInt(Sao.config.limit/k.length,10),s=function(b){return!b.destroyed&&b.id>=0&&!(a in b._loaded)},t=function(a){return s(a)&&void 0===d[a.id]&&(a.group===this.group||JSON.stringify(a.get_context())===JSON.stringify(o))}.bind(this);this.group.parent&&this.group.parent.model.name==this.model.name?(p=[],p=p.concat.apply(p,this.group.parent.group.children),q=t):(p=this.group,q=s);var u=p.indexOf(this);if(~u)for(var v=p.length,w=1;Object.keys(d).length<r&&(u-w>=0||u+w<v)&&w<2*r;){var x;u-w>=0&&(x=p[u-w],q(x)&&(d[x.id]=x)),u+w<v&&(x=p[u+w],q(x)&&(d[x.id]=x)),w++}}for(b in this.model.fields)this.model.fields.hasOwnProperty(b)&&"binary"==this.model.fields[b].description.type&&~k.indexOf(b,k)&&(o[this.model.name+"."+b]="size");c=this.model.execute("read",[Object.keys(d).map(function(a){return parseInt(a,10)}),k],o);var y=function(a,b){void 0===b&&(b=!1);var c={},e=[];a.forEach(function(a,b,d){c[a.id]=a});for(var f in d)if(d.hasOwnProperty(f)){var g=d[f];g.exception||(g.exception=b);var h=c[f];if(g&&h){for(var i in this._changed)this._changed.hasOwnProperty(i)&&delete h[i];e.push(g.set(h))}}return jQuery.when.apply(jQuery,e)}.bind(this),z=function(){var a,b=[];for(var c in d){a={id:c};for(var e in k)a[k[e]]=null;b.push(a)}return y(b,!0)};return this.group.prm=c.then(y,z),this.group.prm},set:function(a,b){void 0===b&&(b=!0);var c,d,e=[],f={},g=[];for(c in a)if(a.hasOwnProperty(c))if(d=a[c],"_timestamp"!=c)if(c in this.model.fields){if(this.model.fields[c]instanceof Sao.field.One2Many&&(f[c]=d),this.model.fields[c]instanceof Sao.field.Many2One||this.model.fields[c]instanceof Sao.field.Reference){var h=c+".rec_name";a.hasOwnProperty(h)?this._values[h]=a[h]:this._values.hasOwnProperty(h)&&delete this._values[h]}e.push(this.model.fields[c].set(this,d)),g.push(c)}else"rec_name"==c&&(this._values[c]=d);else this._timestamp||(this._timestamp=d);for(c in f)d=f[c],e.push(this.model.fields[c].set(this,d));return jQuery.when.apply(jQuery,e.filter(Boolean)).then(function(){for(var a=0;a<g.length;a++)this._loaded[g[a]]=!0;if(b)return this.validate(g,!0)}.bind(this))},get:function(){var a={};for(var b in this.model.fields)if(this.model.fields.hasOwnProperty(b)){var c=this.model.fields[b];(!c.description.readonly||c instanceof Sao.field.One2Many)&&(void 0===this._changed[b]&&this.id>=0||(a[b]=c.get(this),c instanceof Sao.field.One2Many&&0===a[b].length&&delete a[b]))}return a},invalid_fields:function(){var a={};for(var b in this.model.fields){var c=this.model.fields[b],d=c.get_state_attrs(this).invalid;d&&(a[b]=d)}return a},get_context:function(a){return a?this.group.local_context():this.group.context()},field_get:function(a){return this.model.fields[a].get(this)},field_set:function(a,b){this.model.fields[a].set(this,b)},field_get_client:function(a){return this.model.fields[a].get_client(this)},field_set_client:function(a,b,c){this.model.fields[a].set_client(this,b,c)},default_get:function(a){if(!jQuery.isEmptyObject(this.model.fields)){var b=this.get_context();void 0===b.default_rec_name&&(b.default_rec_name=a);return this.model.execute("default_get",[Object.keys(this.model.fields)],b).then(function(a){if(this.group.parent&&this.group.parent_name in this.group.model.fields){var b=this.group.model.fields[this.group.parent_name];b instanceof Sao.field.Reference?a[this.group.parent_name]=[this.group.parent.model.name,this.group.parent.id]:b.description.relation==this.group.parent.model.name&&(a[this.group.parent_name]=this.group.parent.id)}return this.set_default(a)}.bind(this))}return jQuery.when()},set_default:function(a,b,c){void 0===b&&(b=!0),void 0===c&&(c=!0);var d=[],e=[];for(var f in a)if(a.hasOwnProperty(f)){var g=a[f];if(f in this.model.fields&&f!=this.group.exclude_field){if(this.model.fields[f]instanceof Sao.field.Many2One||this.model.fields[f]instanceof Sao.field.Reference){var h=f+".rec_name";a.hasOwnProperty(h)?this._values[h]=a[h]:this._values.hasOwnProperty(h)&&delete this._values[h]}d.push(this.model.fields[f].set_default(this,g)),this._loaded[f]=!0,e.push(f)}}return jQuery.when.apply(jQuery,d).then(function(){return this.on_change(e).then(function(){return this.on_change_with(e).then(function(){var a=function(){if(c)return this.group.root_group().screens.forEach(function(a){return a.display()})}.bind(this);return b?this.validate(null,!0).then(a):a()}.bind(this))}.bind(this))}.bind(this))},get_timestamp:function(){var a={};a[this.model.name+","+this.id]=this._timestamp;for(var b in this.model.fields)this.model.fields.hasOwnProperty(b)&&b in this._loaded&&jQuery.extend(a,this.model.fields[b].get_timestamp(this));return a},get_eval:function(){var a={};for(var b in this.model.fields)!this.model.fields.hasOwnProperty(b)&&this.id>=0||(a[b]=this.model.fields[b].get_eval(this));return a.id=this.id,a},get_on_change_value:function(a){var b={};for(var c in this.model.fields)a&&~a.indexOf(c)||(!(this.id>=0)||this._loaded[c]&&this._changed[c])&&(b[c]=this.model.fields[c].get_on_change_value(this));return b.id=this.id,b},_get_on_change_args:function(a){var b={},c=Sao.common.EvalEnvironment(this,"on_change");return a.forEach(function(a){var d=c;a.split(".").forEach(function(a){void 0!==d&&(d=d[a])}),b[a]=d}),b.id=this.id,b},on_change:function(a){var b={};return a.forEach(function(a){var c=this.model.fields[a].description.on_change;jQuery.isEmptyObject(c)||(b=jQuery.extend(b,this._get_on_change_args(c)))}.bind(this)),jQuery.isEmptyObject(b)?jQuery.when():this.model.execute("on_change",[b,a],this.get_context()).then(function(a){return jQuery.when.apply(jQuery,a.map(this.set_on_change.bind(this)))}.bind(this))},on_change_with:function(a){var b,c,d={},e={},f={};for(b in this.model.fields)if(this.model.fields.hasOwnProperty(b)&&(c=this.model.fields[b].description.on_change_with,!jQuery.isEmptyObject(c))){for(var g=0;g<a.length&&!~c.indexOf(a[g]);g++);g>=a.length||(jQuery.isEmptyObject(Sao.common.intersect(Object.keys(d).sort(),c.sort()))?(d[b]=!0,e=jQuery.extend(e,this._get_on_change_args(c)),(this.model.fields[b]instanceof Sao.field.Many2One||this.model.fields[b]instanceof Sao.field.Reference)&&delete this._values[b+".rec_name"]):f[b]=!0)}var h,i=[];jQuery.isEmptyObject(d)||(h=this.model.execute("on_change_with",[e,Object.keys(d)],this.get_context()),i.push(h.then(this.set_on_change.bind(this))));var j=function(a){return function(b){return this.model.fields[a].set_on_change(this,b)}};for(b in f)f.hasOwnProperty(b)&&(c=this.model.fields[b].description.on_change_with,e=this._get_on_change_args(c),h=this.model.execute("on_change_with_"+b,[e],this.get_context()),i.push(h.then(j(b).bind(this))));return jQuery.when.apply(jQuery,i)},set_on_change:function(a){var b,c,d=[];for(b in a)if(a.hasOwnProperty(b)&&(c=a[b],b in this.model.fields)){if(this.model.fields[b]instanceof Sao.field.Many2One||this.model.fields[b]instanceof Sao.field.Reference){var e=b+".rec_name";a.hasOwnProperty(e)?this._values[e]=a[e]:this._values.hasOwnProperty(e)&&delete this._values[e]}d.push(this.model.fields[b].set_on_change(this,c))}return jQuery.when.apply(jQuery,d)},autocomplete_with:function(a){var b=[];for(var c in this.model.fields){~(this.model.fields[c].description.autocomplete||[]).indexOf(a)&&b.push(this.do_autocomplete(c))}return jQuery.when.apply(jQuery,b)},do_autocomplete:function(a){this.autocompletion[a]=[];var b=this.model.fields[a],c=b.description.autocomplete,d=this._get_on_change_args(c);return this.model.execute("autocomplete_"+a,[d],this.get_context()).then(function(b){this.autocompletion[a]=b}.bind(this))},reset:function(a){return this.cancel(),this.set(a,!0).then(function(){var a=[];return this.group.parent&&(a.push(this.group.parent.on_change([this.group.child_name])),a.push(this.group.parent.on_change_with([this.group.child_name]))),jQuery.when.apply(jQuery,a)}.bind(this))},expr_eval:function(a){if("string"!=typeof a)return a;if(a){if("[]"==a)return[];if("{}"==a)return{};var b=this.get_eval();if(b.context=this.get_context(),b.active_model=this.model.name,b.active_id=this.id,this.group.parent&&this.group.parent_name){var c=Sao.common.EvalEnvironment(this.group.parent);b["_parent_"+this.group.parent_name]=c}return new Sao.PYSON.Decoder(b).decode(a)}},rec_name:function(){return this.model.execute("read",[[this.id],["rec_name"]],this.get_context()).then(function(a){return a[0].rec_name})},validate:function(a,b,c,d){var e=function(){var e=!0
|
|
5
|
+
e:this._else_statement}},types:function(){return this._then_statement instanceof Sao.PYSON.PYSON?this._then_statement.types():[typeof this._then_statement]},__string_params__:function(){return[this._condition,this._then_statement,this._else_statement]}}),Sao.PYSON.If.eval_=function(a,b){return a.c?a.t:a.e},Sao.PYSON.If.init_from_object=function(a){return new Sao.PYSON.If(a.c,a.t,a.e)},Sao.PYSON.eval.Get=function(a,b,c){return new Sao.PYSON.Get(a,b,c)},Sao.PYSON.Get=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b,c){if(Sao.PYSON.Get._super.init.call(this),void 0===c&&(c=null),a instanceof Sao.PYSON.PYSON){if(jQuery(a.types()).not(["object"]).length||jQuery(["object"]).not(a.types()).length)throw"obj must be a dict"}else if(!(a instanceof Object))throw"obj must be a dict";if(this._obj=a,b instanceof Sao.PYSON.PYSON){if(jQuery(b.types()).not(["string"]).length||jQuery(["string"]).not(b.types()).length)throw"key must be a string"}else if("string"!=typeof b)throw"key must be a string";this._key=b,this._default=c},pyson:function(){return{__class__:"Get",v:this._obj,k:this._key,d:this._default}},types:function(){return this._default instanceof Sao.PYSON.PYSON?this._default.types():[typeof this._default]},__string_params__:function(){return[this._obj,this._key,this._default]}}),Sao.PYSON.Get.eval_=function(a,b){return a.k in a.v?a.v[a.k]:a.d},Sao.PYSON.Get.init_from_object=function(a){return new Sao.PYSON.Get(a.v,a.k,a.d)},Sao.PYSON.eval.In=function(a,b){return new Sao.PYSON.In(a,b)},Sao.PYSON.In=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b){if(Sao.PYSON.In._super.init.call(this),a instanceof Sao.PYSON.PYSON){if(jQuery(a.types()).not(["string","number"]).length)throw"key must be a string or a number"}else if(!~["string","number"].indexOf(typeof a))throw"key must be a string or a number";if(b instanceof Sao.PYSON.PYSON){if(jQuery(b.types()).not(["object"]).length||jQuery(["object"]).not(b.types()).length)throw"obj must be a dict or a list"}else if(!(b instanceof Object))throw"obj must be a dict or a list";this._key=a,this._obj=b},pyson:function(){return{__class__:"In",k:this._key,v:this._obj}},types:function(){return["boolean"]},__string_params__:function(){return[this._key,this._obj]}}),Sao.PYSON.In.eval_=function(a,b){return!!a.v&&(a.v.indexOf?Boolean(~a.v.indexOf(a.k)):!!a.v[a.k])},Sao.PYSON.In.init_from_object=function(a){return new Sao.PYSON.In(a.k,a.v)},Sao.PYSON.eval.Date=function(a,b,c,d,e,f){return new Sao.PYSON.Date(a,b,c,d,e,f)},Sao.PYSON.Date=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b,c,d,e,f){Sao.PYSON.Date._super.init.call(this),void 0===a&&(a=null),void 0===b&&(b=null),void 0===c&&(c=null),void 0===d&&(d=0),void 0===e&&(e=0),void 0===f&&(f=0),this._test(a,"year"),this._test(b,"month"),this._test(c,"day"),this._test(d,"delta_years"),this._test(f,"delta_days"),this._test(e,"delta_months"),this._year=a,this._month=b,this._day=c,this._delta_years=d,this._delta_months=e,this._delta_days=f},pyson:function(){return{__class__:"Date",y:this._year,M:this._month,d:this._day,dy:this._delta_years,dM:this._delta_months,dd:this._delta_days}},types:function(){return["object"]},_test:function(a,b){if(a instanceof Sao.PYSON.PYSON){if(jQuery(a.types()).not(["number","object"]).length)throw b+" must be an integer or None"}else if("number"!=typeof a&&null!==a)throw b+" must be an integer or None"},__string_params__:function(){return[this._year,this._month,this._day,this._delta_years,this._delta_months,this._delta_days]}}),Sao.PYSON.Date.eval_=function(a,b){var c=Sao.Date(a.y,a.M&&a.M-1,a.d);return a.dy&&c.add(a.dy,"y"),a.dM&&c.add(a.dM,"M"),a.dd&&c.add(a.dd,"d"),c},Sao.PYSON.Date.init_from_object=function(a){return new Sao.PYSON.Date(a.y,a.M,a.d,a.dy,a.dM,a.dd)},Sao.PYSON.eval.DateTime=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){return new Sao.PYSON.DateTime(a,b,c,d,e,f,g,h,i,j,k,l,m,n)},Sao.PYSON.DateTime=Sao.class_(Sao.PYSON.Date,{init:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){Sao.PYSON.DateTime._super.init.call(this,a,b,c,h,i,j),void 0===d&&(d=null),void 0===e&&(e=null),void 0===f&&(f=null),void 0===g&&(g=null),void 0===k&&(k=0),void 0===l&&(l=0),void 0===m&&(m=0),void 0===n&&(n=0),this._test(d,"hour"),this._test(e,"minute"),this._test(f,"second"),this._test(g,"microsecond"),this._test(k,"delta_hours"),this._test(l,"delta_minutes"),this._test(m,"delta_seconds"),this._test(n,"delta_microseconds"),this._hour=d,this._minute=e,this._second=f,this._microsecond=g,this._delta_hours=k,this._delta_minutes=l,this._delta_seconds=m,this._delta_microseconds=n},pyson:function(){var a=Sao.PYSON.DateTime._super.pyson.call(this);return a.__class__="DateTime",a.h=this._hour,a.m=this._minute,a.s=this._second,a.ms=this._microsecond,a.dh=this._delta_hours,a.dm=this._delta_minutes,a.ds=this._delta_seconds,a.dms=this._delta_microseconds,a},__string_params__:function(){var a=Sao.PYSON.DateTime._super.__string_params__.call(this);return[a[0],a[1],a[2],this._hour,this._minute,this._second,this._microsecond,a[3],a[4],a[5],this._delta_hours,this._delta_minutes,this._delta_seconds,this._delta_microseconds]}}),Sao.PYSON.DateTime.eval_=function(a,b){var c=Sao.DateTime(a.y,a.M&&a.M-1,a.d,a.h,a.m,a.s,a.ms&&a.ms/1e3,!0);return a.dy&&c.add(a.dy,"y"),a.dM&&c.add(a.dM,"M"),a.dd&&c.add(a.dd,"d"),a.dh&&c.add(a.dh,"h"),a.dm&&c.add(a.dm,"m"),a.ds&&c.add(a.ds,"s"),a.dms&&c.add(a.dms/1e3,"ms"),c},Sao.PYSON.DateTime.init_from_object=function(a){return new Sao.PYSON.DateTime(a.y,a.M,a.d,a.h,a.m,a.s,a.ms,a.dy,a.dM,a.dd,a.dh,a.dm,a.ds,a.dms)},Sao.PYSON.eval.TimeDelta=function(a,b,c){return new Sao.PYSON.TimeDelta(a,b,c)},Sao.PYSON.TimeDelta=Sao.class_(Sao.PYSON.PYSON,{init:function(a,b,c){function d(a,b){if(a instanceof Sao.PYSON.TimeDelta){if(jQuery(a.types()).not(["number"]).length)throw b+" must be an integer"}else if("number"!=typeof a)throw b+" must be an integer";return a}Sao.PYSON.TimeDelta._super.init.call(this),void 0===a&&(a=0),void 0===b&&(b=0),void 0===c&&(c=0),this._days=d(a,"days"),this._seconds=d(b,"seconds"),this._microseconds=d(c,"microseconds")},pyson:function(){return{__class__:"TimeDelta",d:this._days,s:this._seconds,m:this._microseconds}},types:function(){return["object"]},__string_params__:function(){return[this._days,this._seconds,this._microseconds]}}),Sao.PYSON.TimeDelta.eval_=function(a,b){return Sao.TimeDelta(a.d,a.s,a.m/1e3)},Sao.PYSON.TimeDelta.init_from_object=function(a){return new Sao.PYSON.TimeDelta(a.d,a.s,a.microseconds)},Sao.PYSON.eval.Len=function(a){return new Sao.PYSON.Len(a)},Sao.PYSON.Len=Sao.class_(Sao.PYSON.PYSON,{init:function(a){if(Sao.PYSON.Len._super.init.call(this),a instanceof Sao.PYSON.PYSON){if(jQuery(a.types()).not(["object","string"]).length||jQuery(["object","string"]).not(a.types()).length)throw"value must be an object or a string"}else if("object"!=typeof a&&"string"!=typeof a)throw"value must be an object or a string";this._value=a},pyson:function(){return{__class__:"Len",v:this._value}},types:function(){return["integer"]},__string_params__:function(){return[this._value]}}),Sao.PYSON.Len.eval_=function(a,b){return"object"==typeof a.v?Object.keys(a.v).length:a.v.length},Sao.PYSON.Len.init_from_object=function(a){return new Sao.PYSON.Len(a.v)}}(),function(){"use strict";function a(a){return window.btoa(unescape(encodeURIComponent(a)))}Sao.Session=Sao.class_(Object,{init:function(a,b){if(this.user_id=null,this.session=null,this.prm=jQuery.when(),this.database=a,this.login=b,this.database){var c=localStorage.getItem("sao_session_"+a);null!==c&&(c=JSON.parse(c),this.login&&this.login!=c.login||(this.login=c.login,this.user_id=c.user_id,this.session=c.session))}this.context={client:Sao.Bus.id},Sao.Session.current_session||(Sao.Session.current_session=this)},get_auth:function(){return a(this.login+":"+this.user_id+":"+this.session)},do_login:function(a,b){var c=jQuery.Deferred(),d=function(b){return{method:"common.db.login",params:[a,b,Sao.i18n.getlang()]}};return new Sao.Login(d,this).run().then(function(b){this.login=a,this.user_id=b[0],this.session=b[1],this.store(),c.resolve()}.bind(this),function(){this.user_id=null,this.session=null,this.store(),c.reject()}.bind(this)),c.promise()},do_logout:function(){if(!this.user_id||!this.session)return jQuery.when();var a={id:0,method:"common.db.logout",params:[]},b=jQuery.ajax({headers:{Authorization:"Session "+this.get_auth()},contentType:"application/json",data:JSON.stringify(a),dataType:"json",url:"/"+this.database+"/",type:"post"});return this.unstore(),this.database=null,this.login=null,this.user_id=null,this.session=null,Sao.Session.current_session===this&&(Sao.Session.current_session=null),b},reload_context:function(){var a={method:"model.res.user.get_preferences",params:[!0,{}]};return this.context={client:Sao.Bus.id},Sao.rpc(a,this).then(function(a){jQuery.extend(this.context,a)}.bind(this))},store:function(){var a={login:this.login,user_id:this.user_id,session:this.session};a=JSON.stringify(a),localStorage.setItem("sao_session_"+this.database,a)},unstore:function(){localStorage.removeItem("sao_session_"+this.database)}}),Sao.Session.login_dialog=function(){var a=new Sao.Dialog(Sao.i18n.gettext("Login"),"lg");return a.database_select=jQuery("<select/>",{class:"form-control",id:"login-database"}).hide(),a.database_input=jQuery("<input/>",{class:"form-control",id:"login-database"}).hide(),a.login_input=jQuery("<input/>",{class:"form-control",id:"login-login",placeholder:Sao.i18n.gettext("User name")}),a.body.append(jQuery("<div/>",{class:"form-group"}).append(jQuery("<label/>",{class:"control-label",for:"login-database"}).text(Sao.i18n.gettext("Database"))).append(a.database_select).append(a.database_input)).append(jQuery("<div/>",{class:"form-group"}).append(jQuery("<label/>",{class:"control-label",for:"login-login"}).text(Sao.i18n.gettext("User name"))).append(a.login_input)),a.button=jQuery("<button/>",{class:"btn btn-primary",type:"submit"}).text(" "+Sao.i18n.gettext("Login")).appendTo(a.footer),a},Sao.Session.get_credentials=function(){var a=function(){return window.location.hash.replace(/^(#(!|))/,"").split("/",1)[0]||null},b=jQuery.Deferred(),c=a(),d=new Sao.Session(c,null);if(d.session)return b.resolve(d),b;var e=Sao.Session.login_dialog(),f=function(){return e.modal.find("input,select").filter(":visible:not([readonly])").filter(function(){return!jQuery(this).val()})},g=function(){var c=e.login_input.val(),g=g||e.database_select.val()||e.database_input.val();if(e.modal.find(".has-error").removeClass("has-error"),!c||!g)return void f().closest(".form-group").addClass("has-error");e.button.focus(),e.button.prop("disabled",!0),e.modal.modal("hide"),d.database=g,d.do_login(c).then(function(){b.resolve(d),e.modal.remove(),a()!=g&&(window.location="#"+g)},function(){e.button.prop("disabled",!1),e.modal.modal("show"),f().closest(".form-group").addClass("has-error"),f().first().focus()})};return e.modal.modal({backdrop:!1,keyboard:!1}),e.modal.find("form").unbind().submit(function(a){g(),a.preventDefault()}),e.modal.on("shown.bs.modal",function(){f().first().focus()}),jQuery.when(Sao.DB.list()).then(function(a){var b;a=a||[],1==a.length?(c=a[0],b=e.database_input):(b=e.database_select,a.forEach(function(a){b.append(jQuery("<option/>",{value:a,text:a}))})),b.prop("readonly",1==a.length),b.show(),b.val(c||"")},function(){e.database_input.show()}),b.promise()},Sao.Session.renew=function(a){if("pending"==a.prm.state())return a.prm;var b=jQuery.Deferred();return a.prm=b.promise(),a.do_login(a.login).then(b.resolve,function(){Sao.logout(),b.reject()}).done(function(){Sao.Bus.listen()}),a.prm},Sao.Session.current_session=null,Sao.Login=Sao.class_(Object,{init:function(a,b){this.func=a,this.session=b||Sao.Session.current_session},run:function(a){void 0===a&&(a={});var b=jQuery.Deferred(),c=Sao.common.processing.show(),d=this.func(a);d.id=0;var e={contentType:"application/json",data:JSON.stringify(d),dataType:"json",url:"/"+this.session.database+"/",type:"post",complete:[function(){Sao.common.processing.hide(c)}]};this.session.user_id&&this.session.session&&(e.headers={Authorization:"Session "+this.session.get_auth()});var f=jQuery.ajax(e),g=function(c){if(null===c)Sao.common.warning.run("",Sao.i18n.gettext("Unable to reach the server.")),b.reject();else if(c.error){if(c.error[0].startsWith("401"))return this.run({}).then(b.resolve,b.reject);if(c.error[0].startsWith("404"))b.reject();else if("LoginException"!=c.error[0])Sao.common.error.run(c.error[0],c.error[1]),b.reject();else{var d=c.error[1],e=d[0],f=d[1],g=d[2];this["get_"+g](f).then(function(c){return a[e]=c,this.run(a).then(b.resolve,b.reject)}.bind(this),b.reject)}}else b.resolve(c.result)},h=function(a,c,d){401==a.status?this.run({}).then(b.resolve,b.reject):(Sao.common.error.run(c,d),b.reject())};return f.done(g.bind(this)),f.fail(h.bind(this)),b.promise()},get_char:function(a){return Sao.common.ask.run(a)},get_password:function(a){return Sao.common.ask.run(a,!1)}}),Sao.DB={},Sao.DB.list=function(){var a=Sao.common.processing.show();return jQuery.ajax({contentType:"application/json",data:JSON.stringify({id:0,method:"common.db.list",params:[]}),dataType:"json",url:"/",type:"post",complete:[function(){Sao.common.processing.hide(a)}]}).then(function(a){return a.result})}}(),function(){"use strict";Sao.Model=Sao.class_(Object,{init:function(a,b){b=b||{},this.name=a,this.session=Sao.Session.current_session,this.fields={}},add_fields:function(a){var b=[];for(var c in a){var d=a[c];if(c in this.fields)jQuery.extend(this.fields[c].description,d);else{var e=Sao.field.get(d.type);this.fields[c]=new e(d),b.push(c)}}return b},execute:function(a,b,c,d){void 0===c&&(c={});var e={method:"model."+this.name+"."+a,params:b.concat(c)};return Sao.rpc(e,this.session,d)},copy:function(a,b){if(jQuery.isEmptyObject(a))return jQuery.when();var c=a.map(function(a){return a.id});return this.execute("copy",[c,{}],b)}}),Sao.Group=function(a,b,c){return c.prm=jQuery.when(),c.model=a,c._context=b,c.on_write=[],c.parent=void 0,c.screens=[],c.parent_name="",c.children=[],c.child_name="",c.parent_datetime_field=void 0,c.record_removed=[],c.record_deleted=[],c.__readonly=!1,c.exclude_field=null,c.skip_model_access=!1,c.forEach(function(a,b,c){a.group=c}),c.get_readonly=function(){var a=Sao.common.MODELACCESS.get(this.model.name);return!(!this.context()._datetime&&(a.write||a.create||this.skip_model_access))||this.__readonly},c.set_readonly=function(a){this.__readonly=a},c.load=function(a,b){var c,d,e=[];for(c=0,d=a.length;c<d;c++){var f=a[c],g=this.get(f);g||(g=new Sao.Record(this.model,f),g.group=this,this.push(g)),e.push(g)}var h,i=[];for(c=0,d=this.record_removed.length;c<d;c++)h=this.record_removed[c],~a.indexOf(h.id)||i.push(h);this.record_removed=i;var j=[];for(c=0,d=this.record_deleted.length;c<d;c++)h=this.record_deleted[c],~a.indexOf(h.id)||j.push(h);if(this.record_deleted=j,e.length&&b){e.forEach(function(a){a._changed.id=!0});var k=this.root_group();this.changed().then(function(){k.screens.forEach(function(a){a.display()})})}},c.get=function(a){for(var b=0,c=this.length;b<c;b++){var d=this[b];if(d.id==a)return d}},c.new_=function(a,b,c){var d=new Sao.Record(this.model,b);return d.group=this,a&&d.default_get(c),d},c.add=function(a,b,c){if(void 0!==b&&-1!=b||(b=this.length),b=Math.min(b,this.length),void 0===c&&(c=!0),a.group!=this&&(a.group=this),this.splice(b,0,a),this.record_removed.forEach(function(b){b.id==a.id&&this.record_removed.splice(this.record_removed.indexOf(b),1)}),this.record_deleted.forEach(function(b){b.id==a.id&&this.record_deleted.splice(this.record_deleted.indexOf(b),1)}),a._changed.id=!0,c&&(this.changed(),this.parent&&this.model.fields[this.parent_name])){var d=this.model.fields[this.parent_name];if(d instanceof Sao.field.Many2One||d instanceof Sao.field.Reference){var e=[this.parent.id,""];d instanceof Sao.field.Reference&&(e=[this.parent.model.name,e]),d.set_client(a,e)}}return a},c.remove=function(a,b,c,d,e){void 0===c&&(c=!0),void 0===e&&(e=!0);this.indexOf(a);a.id>=0&&(b?(~this.record_deleted.indexOf(a)&&this.record_deleted.splice(this.record_deleted.indexOf(a),1),~this.record_removed.indexOf(a)||this.record_removed.push(a)):(~this.record_removed.indexOf(a)&&this.record_removed.splice(this.record_removed.indexOf(a),1),~this.record_deleted.indexOf(a)||this.record_deleted.push(a))),a.group.parent&&(a.group.parent._changed.id=!0),c&&(a._changed.id=!0),(a.id<0||d)&&this._remove(a),e&&a.group.changed()},c._remove=function(a){var b=this.indexOf(a);this.splice(b,1)},c.unremove=function(a){this.record_removed.splice(this.record_removed.indexOf(a),1),this.record_deleted.splice(this.record_deleted.indexOf(a),1),a.group.changed()},c.clear=function(){this.splice(0,this.length),this.record_removed=[],this.record_deleted=[]},c.changed=function(){if(!this.parent)return jQuery.when.apply(jQuery,this.screens.map(function(a){return a.display()}));this.parent._changed[this.child_name]=!0;var a=this.parent.model.fields[this.child_name].changed(this.parent);return a||(a=jQuery.when()),a.then(function(){this.parent.validate(null,!0).done(function(){return this.parent.group.changed()}.bind(this))}.bind(this))},c.delete_=function(a){if(jQuery.isEmptyObject(a))return jQuery.when();var b=this.root_group();console.assert(a.every(function(a){return a.model.name==this.model.name}.bind(this)),"records not from the same model"),console.assert(a.every(function(a){return a.group.root_group()==b}),"records not from the same root group"),a=a.filter(function(a){return a.id>=0});var c=this.context();c._timestamp={},a.forEach(function(a){jQuery.extend(c._timestamp,a.get_timestamp()),a.destroy()});var d=a.map(function(a){return a.id});return b.on_write_ids(d).then(function(a){return a=a.filter(function(a){return!~d.indexOf(a)}),this.model.execute("delete",[d],c).then(function(){b.reload(a)})}.bind(this))},c.root_group=function(){for(var a=this,b=this.parent;b;)a=b.group,b=b.parent;return a},c.save=function(){var a=[];return this.forEach(function(b){a.push(b.save())}),jQuery.isEmptyObject(this.record_deleted)||(this.record_deleted.forEach(function(a){this._remove(a)}.bind(this)),a.push(this.delete_(this.record_deleted)),this.record_deleted.splice(0,this.record_deleted.length)),jQuery.when.apply(jQuery,a)},c.written=function(a){return"number"==typeof a&&(a=[a]),this.on_write_ids(a).then(function(b){b=b.filter(function(b){return!~a.indexOf(b)}),this.root_group().reload(b)}.bind(this))},c.reload=function(a){this.children.forEach(function(b){b.reload(a)}),a.forEach(function(a){var b=this.get(a);b&&jQuery.isEmptyObject(b._changed)&&b.cancel()}.bind(this))},c.on_write_ids=function(a){var b=[],c=[];return this.on_write.forEach(function(d){var e=this.model.execute(d,[a],this._context).then(function(a){jQuery.extend(c,a)});b.push(e)}.bind(this)),jQuery.when.apply(jQuery,b).then(function(){return c.filter(function(a,b,c){return b==c.indexOf(a)})})},c.set_parent=function(a){this.parent=a,a&&a.model.name==this.model.name&&this.parent.group.children.push(this)},c.add_fields=function(a){var b=this.model.add_fields(a);if(!jQuery.isEmptyObject(this)){var c=[];this.forEach(function(a){a.id<0&&c.push(a)}),c.length&&b.length&&this.model.execute("default_get",[b,this.context()]).then(function(a){c.forEach(function(b){b.set_default(a,!0,!1)}),this.root_group().screens.forEach(function(a){return a.display()})}.bind(this))}},c.destroy=function(){if(this.parent){var a=this.parent.group.children.indexOf(this);~a&&this.parent.group.children.splice(a,1)}this.parent=null},c.domain=function(){var a=[];if(this.screens.forEach(function(b){b.attributes.domain&&a.push(b.attributes.domain)}),this.parent&&this.child_name){var b=this.parent.model.fields[this.child_name];return[a,b.get_domain(this.parent)]}return a},c.context=function(){return this._get_context()},c.set_context=function(a){this._context=jQuery.extend({},a)},c.local_context=function(){return this._get_context(!0)},c._get_context=function(a){var b;if(b=a?{}:jQuery.extend({},this.model.session.context),this.parent){var c=this.parent.get_context(a);if(jQuery.extend(b,c),this.child_name in this.parent.model.fields){var d=this.parent.model.fields[this.child_name];jQuery.extend(b,d.get_context(this.parent,c,a))}}return jQuery.extend(b,this._context),this.parent_datetime_field&&(b._datetime=this.parent.get_eval()[this.parent_datetime_field]),b},c.clean4inversion=function(a){if(jQuery.isEmptyObject(a))return[];var b=new Sao.common.DomainInversion,c=a[0],d=a.slice(1);if(~["AND","OR"].indexOf(c));else if(b.is_leaf(c)){var e=c[0];e in this.model.fields&&this.model.fields[e].description.readonly&&(c=[])}else c=this.clean4inversion(c);return[c].concat(this.clean4inversion(d))},c.domain4inversion=function(){var a=this.domain();return this.__domain4inversion&&Sao.common.compare(this.__domain4inversion[0],a)||(this.__domain4inversion=[a,this.clean4inversion(a)]),this.__domain4inversion[1]},c.get_by_path=function(a){a=jQuery.extend([],a);var b=null,c=this,d=function(){if(jQuery.isEmptyObject(a))return b;var e=a[0][0],f=a[0][1];return a.splice(0,1),b=c.get(f),b?e?b.load(e).then(function(){return c=b._values[e],c?d():null}):d():null};return jQuery.when().then(d)},c},Sao.Record=Sao.class_(Object,{id_counter:-1,init:function(a,b){this.model=a,this.group=Sao.Group(a,{},[]),this.id=void 0===b||null===b?Sao.Record.prototype.id_counter:b,this.id<0&&Sao.Record.prototype.id_counter--,this._values={},this._changed={},this._loaded={},this.fields={},this._timestamp=null,this.attachment_count=-1,this.unread_note=-1,this.button_clicks={},this.state_attrs={},this.autocompletion={},this.exception=!1,this.destroyed=!1},has_changed:function(){return!jQuery.isEmptyObject(this._changed)},save:function(a){void 0===a&&(a=!1);var b=this.get_context(),c=jQuery.when();if(this.id<0||this.has_changed()){var d=this.get();if(this.id<0)try{this.id=this.model.execute("create",[[d]],b,!1)[0]}catch(e){return e.promise?e.then(function(){return this.save(a)}.bind(this)):jQuery.Deferred().reject()}else jQuery.isEmptyObject(d)||(b._timestamp=this.get_timestamp(),c=this.model.execute("write",[[this.id],d],b));c=c.done(function(){if(this.cancel(),a)return this.reload()}.bind(this)),this.group&&(c=c.done(function(){return this.group.written(this.id)}.bind(this)))}return this.group.parent&&(delete this.group.parent._changed[this.group.child_name],c=c.done(function(){return this.group.parent.save(a)}.bind(this))),c},reload:function(a){if(this.id<0)return jQuery.when();if(a){var b=a.map(function(a){return this.load(a)}.bind(this));return jQuery.when.apply(jQuery,b)}return this.load("*")},load:function(a){var b,c;if(this.destroyed||this.id<0||a in this._loaded)return jQuery.when();if("pending"==this.group.prm.state())return this.group.prm.then(function(){return this.load(a)}.bind(this));var d={};d[this.id]=this;var e,f,g;if("*"==a){e="eager",f=new Set;var h=function(a){f.add(a)};for(b in this.model.fields)g=this.model.fields[b],"lazy"==(g.description.loading||"eager")&&(e="lazy"),g.views.forEach(h)}else e=this.model.fields[a].description.loading||"eager",f=this.model.fields[a].views;var i={};if("eager"==e)for(b in this.model.fields)g=this.model.fields[b],"eager"==(g.description.loading||"eager")&&(i[b]=g);else i=this.model.fields;var j=[];for(b in i)g=i[b],b in this._loaded||f.size&&!Sao.common.intersect(Array.from(f).sort(),Array.from(g.views).sort())||j.push(b);var k=j.slice(),l=["many2one","one2one","reference"];for(var m in j){b=j[m];var n=this.model.fields[b].description;~l.indexOf(n.type)&&k.push(b+".rec_name")}~j.indexOf("rec_name")||k.push("rec_name"),k.push("_timestamp");var o=jQuery.extend({},this.get_context());if("eager"==e){var p,q,r=parseInt(Sao.config.limit/k.length,10),s=function(b){return!b.destroyed&&b.id>=0&&!(a in b._loaded)},t=function(a){return s(a)&&void 0===d[a.id]&&(a.group===this.group||JSON.stringify(a.get_context())===JSON.stringify(o))}.bind(this);this.group.parent&&this.group.parent.model.name==this.model.name?(p=[],p=p.concat.apply(p,this.group.parent.group.children),q=t):(p=this.group,q=s);var u=p.indexOf(this);if(~u)for(var v=p.length,w=1;Object.keys(d).length<r&&(u-w>=0||u+w<v)&&w<2*r;){var x;u-w>=0&&(x=p[u-w],q(x)&&(d[x.id]=x)),u+w<v&&(x=p[u+w],q(x)&&(d[x.id]=x)),w++}}for(b in this.model.fields)this.model.fields.hasOwnProperty(b)&&"binary"==this.model.fields[b].description.type&&~k.indexOf(b,k)&&(o[this.model.name+"."+b]="size");c=this.model.execute("read",[Object.keys(d).map(function(a){return parseInt(a,10)}),k],o);var y=function(a,b){void 0===b&&(b=!1);var c={},e=[];a.forEach(function(a,b,d){c[a.id]=a});for(var f in d)if(d.hasOwnProperty(f)){var g=d[f];g.exception||(g.exception=b);var h=c[f];if(g&&h){for(var i in this._changed)this._changed.hasOwnProperty(i)&&delete h[i];e.push(g.set(h))}}return jQuery.when.apply(jQuery,e)}.bind(this),z=function(){var a,b=[];for(var c in d){a={id:c};for(var e in k)a[k[e]]=null;b.push(a)}return y(b,!0)};return this.group.prm=c.then(y,z),this.group.prm},set:function(a,b){void 0===b&&(b=!0);var c,d,e=[],f={},g=[];for(c in a)if(a.hasOwnProperty(c))if(d=a[c],"_timestamp"!=c)if(c in this.model.fields){if(this.model.fields[c]instanceof Sao.field.One2Many&&(f[c]=d),this.model.fields[c]instanceof Sao.field.Many2One||this.model.fields[c]instanceof Sao.field.Reference){var h=c+".rec_name";a.hasOwnProperty(h)?this._values[h]=a[h]:this._values.hasOwnProperty(h)&&delete this._values[h]}e.push(this.model.fields[c].set(this,d)),g.push(c)}else"rec_name"==c&&(this._values[c]=d);else this._timestamp||(this._timestamp=d);for(c in f)d=f[c],e.push(this.model.fields[c].set(this,d));return jQuery.when.apply(jQuery,e.filter(Boolean)).then(function(){for(var a=0;a<g.length;a++)this._loaded[g[a]]=!0;if(b)return this.validate(g,!0)}.bind(this))},get:function(){var a={};for(var b in this.model.fields)if(this.model.fields.hasOwnProperty(b)){var c=this.model.fields[b];(!c.description.readonly||c instanceof Sao.field.One2Many)&&(void 0===this._changed[b]&&this.id>=0||(a[b]=c.get(this),c instanceof Sao.field.One2Many&&0===a[b].length&&delete a[b]))}return a},invalid_fields:function(){var a={};for(var b in this.model.fields){var c=this.model.fields[b],d=c.get_state_attrs(this).invalid;d&&(a[b]=d)}return a},get_context:function(a){return a?this.group.local_context():this.group.context()},field_get:function(a){return this.model.fields[a].get(this)},field_set:function(a,b){this.model.fields[a].set(this,b)},field_get_client:function(a){return this.model.fields[a].get_client(this)},field_set_client:function(a,b,c){this.model.fields[a].set_client(this,b,c)},default_get:function(a){if(!jQuery.isEmptyObject(this.model.fields)){var b=this.get_context();void 0===b.default_rec_name&&(b.default_rec_name=a);return this.model.execute("default_get",[Object.keys(this.model.fields)],b).then(function(a){if(this.group.parent&&this.group.parent_name in this.group.model.fields){var b=this.group.model.fields[this.group.parent_name];b instanceof Sao.field.Reference?a[this.group.parent_name]=[this.group.parent.model.name,this.group.parent.id]:b.description.relation==this.group.parent.model.name&&(a[this.group.parent_name]=this.group.parent.id)}return this.set_default(a)}.bind(this))}return jQuery.when()},set_default:function(a,b,c){void 0===b&&(b=!0),void 0===c&&(c=!0);var d=[],e=[];for(var f in a)if(a.hasOwnProperty(f)){var g=a[f];if(f in this.model.fields&&f!=this.group.exclude_field){if(this.model.fields[f]instanceof Sao.field.Many2One||this.model.fields[f]instanceof Sao.field.Reference){var h=f+".rec_name";a.hasOwnProperty(h)?this._values[h]=a[h]:this._values.hasOwnProperty(h)&&delete this._values[h]}d.push(this.model.fields[f].set_default(this,g)),this._loaded[f]=!0,e.push(f)}}return jQuery.when.apply(jQuery,d).then(function(){return this.on_change(e).then(function(){return this.on_change_with(e).then(function(){var a=function(){if(c)return this.group.root_group().screens.forEach(function(a){return a.display()})}.bind(this);return b?this.validate(null,!0).then(a):a()}.bind(this))}.bind(this))}.bind(this))},get_timestamp:function(){var a={};a[this.model.name+","+this.id]=this._timestamp;for(var b in this.model.fields)this.model.fields.hasOwnProperty(b)&&b in this._loaded&&jQuery.extend(a,this.model.fields[b].get_timestamp(this));return a},get_eval:function(){var a={};for(var b in this.model.fields)!this._loaded.hasOwnProperty(b)&&this.id>=0||(a[b]=this.model.fields[b].get_eval(this));return a.id=this.id,a},get_on_change_value:function(a){var b={};for(var c in this.model.fields)a&&~a.indexOf(c)||(!(this.id>=0)||this._loaded[c]&&this._changed[c])&&(b[c]=this.model.fields[c].get_on_change_value(this));return b.id=this.id,b},_get_on_change_args:function(a){var b={},c=Sao.common.EvalEnvironment(this,"on_change");return a.forEach(function(a){var d=c;a.split(".").forEach(function(a){void 0!==d&&(d=d[a])}),b[a]=d}),b.id=this.id,b},on_change:function(a){var b={};return a.forEach(function(a){var c=this.model.fields[a].description.on_change;jQuery.isEmptyObject(c)||(b=jQuery.extend(b,this._get_on_change_args(c)))}.bind(this)),jQuery.isEmptyObject(b)?jQuery.when():this.model.execute("on_change",[b,a],this.get_context()).then(function(a){return jQuery.when.apply(jQuery,a.map(this.set_on_change.bind(this)))}.bind(this))},on_change_with:function(a){var b,c,d={},e={},f={};for(b in this.model.fields)if(this.model.fields.hasOwnProperty(b)&&(c=this.model.fields[b].description.on_change_with,!jQuery.isEmptyObject(c))){for(var g=0;g<a.length&&!~c.indexOf(a[g]);g++);g>=a.length||(jQuery.isEmptyObject(Sao.common.intersect(Object.keys(d).sort(),c.sort()))?(d[b]=!0,e=jQuery.extend(e,this._get_on_change_args(c)),(this.model.fields[b]instanceof Sao.field.Many2One||this.model.fields[b]instanceof Sao.field.Reference)&&delete this._values[b+".rec_name"]):f[b]=!0)}var h,i=[];jQuery.isEmptyObject(d)||(h=this.model.execute("on_change_with",[e,Object.keys(d)],this.get_context()),i.push(h.then(this.set_on_change.bind(this))));var j=function(a){return function(b){return this.model.fields[a].set_on_change(this,b)}};for(b in f)f.hasOwnProperty(b)&&(c=this.model.fields[b].description.on_change_with,e=this._get_on_change_args(c),h=this.model.execute("on_change_with_"+b,[e],this.get_context()),i.push(h.then(j(b).bind(this))));return jQuery.when.apply(jQuery,i)},set_on_change:function(a){var b,c,d=[];for(b in a)if(a.hasOwnProperty(b)&&(c=a[b],b in this.model.fields)){if(this.model.fields[b]instanceof Sao.field.Many2One||this.model.fields[b]instanceof Sao.field.Reference){var e=b+".rec_name";a.hasOwnProperty(e)?this._values[e]=a[e]:this._values.hasOwnProperty(e)&&delete this._values[e]}d.push(this.model.fields[b].set_on_change(this,c))}return jQuery.when.apply(jQuery,d)},autocomplete_with:function(a){var b=[];for(var c in this.model.fields){~(this.model.fields[c].description.autocomplete||[]).indexOf(a)&&b.push(this.do_autocomplete(c))}return jQuery.when.apply(jQuery,b)},do_autocomplete:function(a){this.autocompletion[a]=[];var b=this.model.fields[a],c=b.description.autocomplete,d=this._get_on_change_args(c);return this.model.execute("autocomplete_"+a,[d],this.get_context()).then(function(b){this.autocompletion[a]=b}.bind(this))},reset:function(a){return this.cancel(),this.set(a,!0).then(function(){var a=[];return this.group.parent&&(a.push(this.group.parent.on_change([this.group.child_name])),a.push(this.group.parent.on_change_with([this.group.child_name]))),jQuery.when.apply(jQuery,a)}.bind(this))},expr_eval:function(a){if("string"!=typeof a)return a;if(a){if("[]"==a)return[];if("{}"==a)return{};var b=this.get_eval();if(b.context=this.get_context(),b.active_model=this.model.name,b.active_id=this.id,this.group.parent&&this.group.parent_name){var c=Sao.common.EvalEnvironment(this.group.parent);b["_parent_"+this.group.parent_name]=c}return new Sao.PYSON.Decoder(b).decode(a)}},rec_name:function(){return this.model.execute("read",[[this.id],["rec_name"]],this.get_context()).then(function(a){return a[0].rec_name})},validate:function(a,b,c,d){var e=function(){var e=!0
|
|
6
6
|
;for(var f in this.model.fields)if((!(d&&this.id>=0)||f in this._loaded)&&this.model.fields.hasOwnProperty(f)){var g=this.model.fields[f];a&&!~a.indexOf(f)||g.description.readonly||f!=this.group.exclude_field&&(g.validate(this,b,c)||(e=!1))}return e}.bind(this);return d?e():this._check_load(a).then(e)},pre_validate:function(){if(jQuery.isEmptyObject(this._changed))return jQuery.Deferred().resolve(!0);var a=this._get_on_change_args(Object.keys(this._changed).concat(["id"]));return this.model.execute("pre_validate",[a],this.get_context())},cancel:function(){this._loaded={},this._changed={},this._timestamp=null,this.button_clicks={}},_check_load:function(a){return this.get_loaded(a)?jQuery.when():this.reload(a)},get_loaded:function(a){if(!jQuery.isEmptyObject(a)){var b=!0;return a.forEach(function(a){a in this._loaded||a in this._changed||(b=!1)}.bind(this)),b}return Sao.common.compare(Object.keys(this.model.fields).sort(),Object.keys(this._loaded).sort())},root_parent:function(){for(var a=this;a.group.parent;)a=a.group.parent;return a},get_path:function(a){for(var b=[],c=this,d="";c&&(b.push([d,c.id]),c.group!==a);)d=c.group.child_name,c=c.group.parent;return b.reverse(),b},get_index_path:function(a){for(var b=[],c=this;c&&(b.push(c.group.indexOf(c)),c.group!==a);)c=c.group.parent;return b.reverse(),b},deleted:function(){return Boolean(~this.group.record_deleted.indexOf(this))},removed:function(){return Boolean(~this.group.record_removed.indexOf(this))},readonly:function(){return this.deleted()||this.removed()||this.exception},set_field_context:function(){for(var a in this.model.fields)if(this.model.fields.hasOwnProperty(a)){var b=this.model.fields[a],c=this._values[a];if(c&&c.set_context){var d=b.description.context;d&&c.set_context(this.expr_eval(d))}}},get_attachment_count:function(a){var b=jQuery.Deferred();return this.id<0?(b.resolve(0),b):(this.attachment_count<0||a?b=Sao.rpc({method:"model.ir.attachment.search_count",params:[[["resource","=",this.model.name+","+this.id]],this.get_context()]},this.model.session).then(function(a){return this.attachment_count=a,a}.bind(this)):b.resolve(this.attachment_count),b)},get_unread_note:function(a){var b=jQuery.Deferred();return this.id<0?(b.resolve(0),b):(this.unread_note<0||a?b=Sao.rpc({method:"model.ir.note.search_count",params:[[["resource","=",this.model.name+","+this.id],["unread","=",!0]],this.get_context()]},this.model.session).then(function(a){return this.unread_note=a,a}.bind(this)):b.resolve(this.unread_note),b)},get_button_clicks:function(a){if(this.id<0)return jQuery.when();var b=this.button_clicks[a];return void 0!==b?jQuery.when(b):Sao.rpc({method:"model.ir.model.button.click.get_click",params:[this.model.name,a,this.id,{}]},this.model.session).then(function(b){return this.button_clicks[a]=b,b}.bind(this))},destroy:function(){for(var a=Object.values(this._values),b=0;b<a.length;b++){var c=a[b];c&&c.hasOwnProperty("destroy")&&c.destroy()}this.destroyed=!0}}),Sao.field={},Sao.field.get=function(a){switch(a){case"char":return Sao.field.Char;case"selection":return Sao.field.Selection;case"datetime":case"timestamp":return Sao.field.DateTime;case"date":return Sao.field.Date;case"time":return Sao.field.Time;case"timedelta":return Sao.field.TimeDelta;case"float":return Sao.field.Float;case"numeric":return Sao.field.Numeric;case"integer":case"biginteger":return Sao.field.Integer;case"boolean":return Sao.field.Boolean;case"many2one":return Sao.field.Many2One;case"one2one":return Sao.field.One2One;case"one2many":return Sao.field.One2Many;case"many2many":return Sao.field.Many2Many;case"reference":return Sao.field.Reference;case"binary":return Sao.field.Binary;case"dict":return Sao.field.Dict;default:return Sao.field.Char}},Sao.field.Field=Sao.class_(Object,{_default:null,init:function(a){this.description=a,this.name=a.name,this.views=new Set},set:function(a,b){a._values[this.name]=b},get:function(a){var b=a._values[this.name];return void 0===b&&(b=this._default),b},set_client:function(a,b,c){var d=this.get(a);this.set(a,b),JSON.stringify(d)!=JSON.stringify(this.get(a))?(a._changed[this.name]=!0,this.changed(a).done(function(){a.validate(null,!0).then(function(){a.group.changed()})})):c&&(a._changed[this.name]=!0,this.changed(a).done(function(){a.validate(null,!0).then(function(){a.group.root_group().screens.forEach(function(a){a.display()})})}))},get_client:function(a){return this.get(a)},set_default:function(a,b){this.set(a,b),a._changed[this.name]=!0},set_on_change:function(a,b){this.set(a,b),a._changed[this.name]=!0},changed:function(a){return a.on_change([this.name]).then(function(){return a.on_change_with([this.name]).then(function(){return a.autocomplete_with(this.name).then(function(){a.set_field_context()})}.bind(this))}.bind(this))},get_timestamp:function(a){return{}},get_context:function(a,b,c){var d;return d=b?jQuery.extend({},b):a.get_context(c),jQuery.extend(d,a.expr_eval(this.description.context||{})),d},get_search_context:function(a){var b=this.get_context(a);return jQuery.extend(b,a.expr_eval(this.description.search_context||{})),b},get_search_order:function(a){return a.expr_eval(this.description.search_order||null)},get_domains:function(a,b){var c=new Sao.common.DomainInversion,d=c.domain_inversion([a.group.domain4inversion(),b||[]],this.name,Sao.common.EvalEnvironment(a));return"boolean"!=typeof d||d?"boolean"==typeof d&&d&&(d=[]):d=[["id","=",null]],[d,a.expr_eval(this.description.domain||[])]},get_domain:function(a){var b=this.get_domains(a),c=b[0],d=b[1],e=new Sao.common.DomainInversion;return e.concat([e.localize_domain(c),d])},validation_domains:function(a,b){return(new Sao.common.DomainInversion).concat(this.get_domains(a,b))},get_eval:function(a){return this.get(a)},get_on_change_value:function(a){return this.get_eval(a)},set_state:function(a,b){void 0===b&&(b=["readonly","required","invisible"]);var c=a.expr_eval(this.description.states||{});b.forEach(function(b){"readonly"==b&&this.description.readonly||(void 0!==c[b]?this.get_state_attrs(a)[b]=c[b]:void 0!==this.description[b]&&(this.get_state_attrs(a)[b]=this.description[b]))}.bind(this)),(a.group.get_readonly()||this.get_state_attrs(a).domain_readonly)&&(this.get_state_attrs(a).readonly=!0)},get_state_attrs:function(a){return this.name in a.state_attrs||(a.state_attrs[this.name]=jQuery.extend({},this.description)),(a.group.get_readonly()||a.readonly())&&(a.state_attrs[this.name].readonly=!0),a.state_attrs[this.name]},_is_empty:function(a){return!this.get_eval(a)},check_required:function(a){var b=this.get_state_attrs(a);return 1!=b.required||!this._is_empty(a)||1==b.readonly},validate:function(a,b,c){if(this.description.readonly)return!0;var d=!1;this.get_state_attrs(a).domain_readonly=!1;var e=new Sao.common.DomainInversion,f=e.simplify(this.validation_domains(a,c));if(b||this.check_required(a)||(d="required"),"boolean"==typeof f)f||(d="domain");else if(Sao.common.compare(f,[["id","=",null]]))d="domain";else{var g=e.unique_value(f),h=g[0],i=g[1],j=g[2];if(h){!1===j&&(j=null);var k,l=!0;k=jQuery.isEmptyObject(a.group.domain())?e.merge(f):e.merge(a.group.domain());var m="AND"==k[0];if(i.contains(".")){var n=i.split(".",1)[0],o=i.split(".",1)[1],p=[];m&&e.localize_domain(k.slice(1)).forEach(function(a){p.push(a)}),"id"==o&&~p.indexOf(n)||(l=!1)}l&&!c&&(this.set_client(a,j),this.get_state_attrs(a).domain_readonly=m)}e.eval_domain(f,Sao.common.EvalEnvironment(a))||(d=f)}return this.get_state_attrs(a).invalid=d,!d}}),Sao.field.Char=Sao.class_(Sao.field.Field,{_default:"",get:function(a){return Sao.field.Char._super.get.call(this,a)||this._default}}),Sao.field.Selection=Sao.class_(Sao.field.Field,{_default:null}),Sao.field.DateTime=Sao.class_(Sao.field.Field,{_default:null,time_format:function(a){return a.expr_eval(this.description.format)},set_client:function(a,b,c){var d;b&&(b.isTime?(d=this.get(a),b=d?Sao.DateTime.combine(d,b):null):b.isDate&&(d=this.get(a)||Sao.Time(),b=Sao.DateTime.combine(b,d))),Sao.field.DateTime._super.set_client.call(this,a,b,c)},date_format:function(a){var b=this.get_context(a);return Sao.common.date_format(b.date_format)}}),Sao.field.Date=Sao.class_(Sao.field.Field,{_default:null,set_client:function(a,b,c){b&&!b.isDate&&(b.isDate=!0,b.isDateTime=!1),Sao.field.Date._super.set_client.call(this,a,b,c)},date_format:function(a){var b=this.get_context(a);return Sao.common.date_format(b.date_format)}}),Sao.field.Time=Sao.class_(Sao.field.Field,{_default:null,time_format:function(a){return a.expr_eval(this.description.format)},set_client:function(a,b,c){b&&(b.isDate||b.isDateTime)&&(b=Sao.Time(b.hour(),b.minute(),b.second(),b.millisecond())),Sao.field.Time._super.set_client.call(this,a,b,c)}}),Sao.field.TimeDelta=Sao.class_(Sao.field.Field,{_default:null,converter:function(a){return a.context()[this.description.converter]},set_client:function(a,b,c){"string"==typeof b&&(b=Sao.common.timedelta.parse(b,this.converter(a.group))),Sao.field.TimeDelta._super.set_client.call(this,a,b,c)},get_client:function(a){var b=Sao.field.TimeDelta._super.get_client.call(this,a);return Sao.common.timedelta.format(b,this.converter(a.group))}}),Sao.field.Float=Sao.class_(Sao.field.Field,{_default:null,digits:function(a,b){void 0===b&&(b=1);var c=a.expr_eval(this.description.digits);if(c&&c.every(function(a){return null!==a})){var d=Math.round(Math.log(Math.abs(b))/Math.LN10);return[c[0]+d,c[1]-d]}},check_required:function(a){var b=this.get_state_attrs(a);return 1!=b.required||null!==this.get(a)||1==b.readonly},convert:function(a){return a||0===a?(a=Number(a),isNaN(a)&&(a=this._default),a):null},apply_factor:function(a,b,c){if(null!==b){b/=c;var d=this.digits(a);d&&(b=b.toFixed(d[1])),b=this.convert(b)}return b},set_client:function(a,b,c,d){void 0===d&&(d=1),b=this.apply_factor(a,this.convert(b),d),Sao.field.Float._super.set_client.call(this,a,b,c)},get_client:function(a,b){void 0===b&&(b=1);var c=this.get(a);if(null!==c){var d={},e=this.digits(a,b);return e&&(d.minimumFractionDigits=e[1],d.maximumFractionDigits=e[1]),(c*b).toLocaleString(Sao.i18n.BC47(Sao.i18n.getlang()),d)}return""}}),Sao.field.Numeric=Sao.class_(Sao.field.Float,{convert:function(a){return a||0===a?(a=new Sao.Decimal(a),isNaN(a.valueOf())&&(a=this._default),a):null}}),Sao.field.Integer=Sao.class_(Sao.field.Float,{convert:function(a){return a=parseInt(a,10),isNaN(a)&&(a=this._default),a}}),Sao.field.Boolean=Sao.class_(Sao.field.Field,{_default:!1,set_client:function(a,b,c){b=Boolean(b),Sao.field.Boolean._super.set_client.call(this,a,b,c)},get:function(a){return Boolean(a._values[this.name])},get_client:function(a){return Boolean(a._values[this.name])}}),Sao.field.Many2One=Sao.class_(Sao.field.Field,{_default:null,check_required:function(a){var b=this.get_state_attrs(a);return 1!=b.required||null!==this.get(a)||1==b.readonly},get_client:function(a){var b=a._values[this.name+".rec_name"];return void 0===b&&(this.set(a,this.get(a)),b=a._values[this.name+".rec_name"]||""),b},set:function(a,b){var c=a._values[this.name+".rec_name"]||"";if(!c&&b>=0&&null!==b){var d=a.model.fields[this.name].description.relation;c=Sao.rpc({method:"model."+d+".read",params:[[b],["rec_name"],a.get_context()]},a.model.session,!1)[0].rec_name}a._values[this.name+".rec_name"]=c,a._values[this.name]=b},set_client:function(a,b,c){var d;b instanceof Array?(d=b[1],b=b[0]):d=b==this.get(a)?a._values[this.name+".rec_name"]||"":"",a._values[this.name+".rec_name"]=d,Sao.field.Many2One._super.set_client.call(this,a,b,c)},get_context:function(a,b,c){var d=Sao.field.Many2One._super.get_context.call(this,a,b,c);return this.description.datetime_field&&(d._datetime=a.get_eval()[this.description.datetime_field]),d},validation_domains:function(a,b){return this.get_domains(a,b)[0]},get_domain:function(a){var b=this.get_domains(a),c=b[0],d=b[1],e=new Sao.common.DomainInversion;return e.concat([e.localize_domain(c,this.name),d])},get_on_change_value:function(a){return a.group.parent_name==this.name&&a.group.parent?a.group.parent.get_on_change_value([a.group.child_name]):Sao.field.Many2One._super.get_on_change_value.call(this,a)}}),Sao.field.One2One=Sao.class_(Sao.field.Many2One,{}),Sao.field.One2Many=Sao.class_(Sao.field.Field,{init:function(a){Sao.field.One2Many._super.init.call(this,a)},_default:null,_set_value:function(a,b,c,d){this._set_default_value(a);var e=a._values[this.name],f=jQuery.when();jQuery.isEmptyObject(b)&&(b=[]);var g;if("list values"==(g=jQuery.isEmptyObject(b)||!isNaN(parseInt(b[0],10))?"list ids":"list values")){var h=this.get_context(a),i={};if(b.forEach(function(a){for(var b in a)a.hasOwnProperty(b)&&(b in e.model.fields||~b.indexOf(".")||(i[b]=!0))}),!jQuery.isEmptyObject(i)){var j={method:"model."+this.description.relation+".fields_get",params:[Object.keys(i),h]};f=Sao.rpc(j,a.model.session)}}var k=function(a){var f=[];if(jQuery.isEmptyObject(a)||e.add_fields(a),"list ids"==g){for(var h=[],i=0,j=e.length;i<j;i++){var k=e[i];~b.indexOf(k.id)||h.push(k)}for(i=0,j=h.length;i<j;i++){var l=h[i];e.remove(l,!0,!0,!1,!1)}e.load(b,d||c)}else b.forEach(function(a){var b;"id"in a?(b=e.get(a.id))||(b=e.new_(!1,a.id)):b=e.new_(!1),c?(f.push(b.set_default(a,!1,!1)),e.add(b,-1,!1)):(f.push(b.set(a)),e.push(b))});return jQuery.when.apply(jQuery,f)};return f.then(k.bind(this))},set:function(a,b,c){void 0===c&&(c=!1);var d,e=a._values[this.name];return void 0!==e?(d=e.model,e.destroy()):d=a.model.name==this.description.relation?a.model:new Sao.Model(this.description.relation),a._values[this.name]=void 0,this._set_default_value(a,d),this._set_value(a,b,c)},get:function(a){var b=a._values[this.name];if(void 0===b)return[];for(var c=b.record_removed,d=b.record_deleted,e=[],f=this.description.relation_field||"",g=[],h=[],i=[],j=0,k=b.length;j<k;j++){var l=b[j];if(!~c.indexOf(l)&&!~d.indexOf(l)){var m;l.id>=0?l.has_changed()&&(m=l.get(),delete m[f],jQuery.isEmptyObject(m)||(i.push([l.id]),i.push(m)),g.push(l.id)):(m=l.get(),delete m[f],h.push(m))}}return jQuery.isEmptyObject(g)||e.push(["add",g]),jQuery.isEmptyObject(h)||e.push(["create",h]),jQuery.isEmptyObject(i)||e.push(["write"].concat(i)),jQuery.isEmptyObject(c)||e.push(["remove",c.map(function(a){return a.id})]),jQuery.isEmptyObject(d)||e.push(["delete",d.map(function(a){return a.id})]),e},set_client:function(a,b,c){null===b&&(b=[]),"number"==typeof b&&(b=[b]);var d=this.get_eval(a),e=!Sao.common.compare(d.sort(),b.sort());this._set_value(a,b,!1,e),e?(a._changed[this.name]=!0,this.changed(a).done(function(){a.validate(null,!0).then(function(){a.group.changed()})})):c&&(a._changed[this.name]=!0,this.changed(a).done(function(){a.validate(null,!0).then(function(){a.group.root_group().screens.forEach(function(a){a.display()})})}))},get_client:function(a){return this._set_default_value(a),a._values[this.name]},set_default:function(a,b){return a._changed[this.name]=!0,this.set(a,b,!0)},set_on_change:function(a,b){if(a._changed[this.name]=!0,this._set_default_value(a),b instanceof Array)return this._set_value(a,b,!1,!0);var c=jQuery.when();if(b&&(b.add||b.update)){var d=this.get_context(a),e=a._values[this.name].model.fields,f={},g=[];if(b.add)for(var h=0;h<b.add.length;h++)g.push(b.add[h][1]);if([g,b.update].forEach(function(a){jQuery.isEmptyObject(a)||a.forEach(function(a){Object.keys(a).forEach(function(a){a in e||"id"==a||~a.indexOf(".")||(f[a]=!0)})})}),!jQuery.isEmptyObject(f)){var i={method:"model."+this.description.relation+".fields_get",params:[Object.keys(f),d]};c=Sao.rpc(i,a.model.session)}}var j=[],k=a._values[this.name];return k.forEach(function(a){a.id||j.push(a)}),b&&b.remove&&b.remove.forEach(function(a){var b=k.get(a);b&&j.push(b)}.bind(this)),j.forEach(function(a){k.remove(a,!1,!0,!1,!1)}.bind(this)),b&&(b.add||b.update)&&(c=c.then(function(a){var c=[];return k.add_fields(a),b.add&&b.add.forEach(function(a){var b=a[0],d=a[1],e=k.new_(!1);k.add(e,b,!1),c.push(e.set_on_change(d))}),b.update&&b.update.forEach(function(a){if(a.id){var b=k.get(a.id);b&&c.push(b.set_on_change(a))}}),jQuery.when.apply(jQuery,c)}.bind(this))),c},_set_default_value:function(a,b){if(void 0===a._values[this.name]){b||(b=new Sao.Model(this.description.relation)),a.model.name==this.description.relation&&(b=a.model);var c=a.expr_eval(this.description.context||{}),d=Sao.Group(b,c,[]);d.set_parent(a),d.parent_name=this.description.relation_field,d.child_name=this.name,d.parent_datetime_field=this.description.datetime_field,a._values[this.name]=d}},get_timestamp:function(a){var b={},c=a._values[this.name]||[],d=c.filter(function(a){return a.has_changed()});return jQuery.extend(d,c.record_removed,c.record_deleted).forEach(function(a){jQuery.extend(b,a.get_timestamp())}),b},get_eval:function(a){var b=[],c=a._values[this.name];if(void 0===c)return b;for(var d=c.record_removed,e=c.record_deleted,f=0,g=a._values[this.name].length;f<g;f++){var h=c[f];~d.indexOf(h)||~e.indexOf(h)||b.push(h.id)}return b},get_on_change_value:function(a){var b=[],c=a._values[this.name];if(void 0===c)return b;for(var d=0,e=a._values[this.name].length;d<e;d++){var f=c[d];f.deleted()||f.removed()||b.push(f.get_on_change_value([this.description.relation_field||""]))}return b},get_removed_ids:function(a){return a._values[this.name].record_removed.map(function(a){return a.id})},get_domain:function(a){return this.get_domains(a)[1]},validation_domains:function(a,b){return this.get_domains(a,b)[0]},validate:function(a,b,c){var d=!1,e=new Sao.common.DomainInversion,f=e.localize_domain(e.domain_inversion(a.group.clean4inversion(c||[]),this.name,Sao.common.EvalEnvironment(a)),this.name);"boolean"==typeof f&&(f=f?[]:[["id","=",null]]);for(var g=0,h=(a._values[this.name]||[]).length;g<h;g++){var i=a._values[this.name][g];!i.get_loaded()&&i.id>=0&&!c||(i.validate(null,b,f,!0)||(d="children"))}var j=Sao.field.One2Many._super.validate.call(this,a,b,c);return j&&d?(this.get_state_attrs(a).invalid=d,!1):j},set_state:function(a,b){this._set_default_value(a),Sao.field.One2Many._super.set_state.call(this,a,b)},_is_empty:function(a){return jQuery.isEmptyObject(this.get_eval(a))}}),Sao.field.Many2Many=Sao.class_(Sao.field.One2Many,{get_on_change_value:function(a){return this.get_eval(a)}}),Sao.field.Reference=Sao.class_(Sao.field.Field,{_default:null,get_client:function(a){if(a._values[this.name]){return[a._values[this.name][0],a._values[this.name+".rec_name"]||""]}return null},get:function(a){return a._values[this.name]&&a._values[this.name][0]&&null!==a._values[this.name][1]&&a._values[this.name][1]>=-1?a._values[this.name].join(","):null},set_client:function(a,b,c){if(b){"string"==typeof b&&(b=b.split(","));var d,e=b[0],f=b[1];f instanceof Array?(d=f[1],f=f[0]):(f&&!isNaN(parseInt(f,10))&&(f=parseInt(f,10)),d=[e,f].join(",")==this.get(a)?a._values[this.name+".rec_name"]||"":""),a._values[this.name+".rec_name"]=d,b=[e,f]}Sao.field.Reference._super.set_client.call(this,a,b,c)},set:function(a,b){if(!b)return void(a._values[this.name]=this._default);var c,d;"string"==typeof b?(c=b.split(",")[0],d=b.split(",")[1],d?isNaN(parseInt(d,10))||(d=parseInt(d,10)):d=null):(c=b[0],d=b[1]);var e=a._values[this.name+".rec_name"]||"";c&&null!==d&&d>=0?!e&&d>=0&&(e=Sao.rpc({method:"model."+c+".read",params:[[d],["rec_name"],a.get_context()]},a.model.session,!1)[0].rec_name):e=c?"":d,a._values[this.name+".rec_name"]=e,a._values[this.name]=[c,d]},get_on_change_value:function(a){return a.group.parent_name==this.name&&a.group.parent?[a.group.parent.model.name,a.group.parent.get_on_change_value([a.group.child_name])]:Sao.field.Reference._super.get_on_change_value.call(this,a)},get_context:function(a,b,c){var d=Sao.field.Reference._super.get_context.call(this,a,b,c);return this.description.datetime_field&&(d._datetime=a.get_eval()[this.description.datetime_field]),d},validation_domains:function(a,b){return this.get_domains(a,b)[0]},get_domain:function(a){var b=null;a._values[this.name]&&(b=a._values[this.name][0]);var c=this.get_domains(a),d=c[0],e=c[1],f=new Sao.common.DomainInversion;return d=f.filter_leaf(d,this.name,b),d=f.prepare_reference_domain(d,this.name),f.concat([f.localize_domain(d,this.name,!0),e])},get_models:function(a){var b=this.get_domains(a),c=new Sao.common.DomainInversion,d=c.prepare_reference_domain(b[0],this.name);return c.extract_reference_models(c.concat([d,b[1]]),this.name)},_is_empty:function(a){var b=Sao.field.Reference._super._is_empty.call(this,a);return!b&&a._values[this.name][1]<0&&(b=!0),b}}),Sao.field.Binary=Sao.class_(Sao.field.Field,{_default:null,get_size:function(a){var b=a._values[this.name]||0;return b instanceof Uint8Array||"string"==typeof b?b.length:b},get_data:function(a){var b=a._values[this.name]||[],c=jQuery.when(b);if(!(b instanceof Uint8Array)&&"string"!=typeof b){if(a.id<0)return c;var d=a.get_context();c=a.model.execute("read",[[a.id],[this.name]],d).then(function(b){return b=b[0][this.name],this.set(a,b),b}.bind(this))}return c}}),Sao.field.Dict=Sao.class_(Sao.field.Field,{_default:{},init:function(a){Sao.field.Dict._super.init.call(this,a),this.schema_model=new Sao.Model(a.schema_model),this.keys={}},set:function(a,b){if(b){var c=[];for(var d in b)c.push(d);c.sort();var e={};for(var f in c)d=c[f],e[d]=b[d];b=e}Sao.field.Dict._super.set.call(this,a,b)},get:function(a){return Sao.field.Dict._super.get.call(this,a)||this._default},get_client:function(a){return Sao.field.Dict._super.get_client.call(this,a)||this._default},validation_domains:function(a,b){return this.get_domains(a,b)[0]},get_domain:function(a){var b=new Sao.common.DomainInversion,c=this.get_domains(a),d=c[0],e=c[1];return b.concat([b.localize_domain(d),e])},date_format:function(a){var b=this.get_context(a);return Sao.common.date_format(b.date_format)},time_format:function(a){return"%X"},add_keys:function(a,b){var c=(this.description.schema_model,this.get_context(b)),d=this.get_domain(b),e=Math.min(10,Sao.config.limit);a=jQuery.extend([],a);for(var f=function(a){return this.schema_model.execute("get_keys",[a],c).then(g)}.bind(this),g=function(a){for(var b=0,c=a.length;b<c;b++){var d=a[b];this.keys[d.name]=d}}.bind(this),h=[];a.length>0;){var i=a.splice(0,e);h.push(this.schema_model.execute("search",[[["name","in",i],d],0,Sao.config.limit,null],c).then(f))}return jQuery.when.apply(jQuery,h)},add_new_keys:function(a,b){var c=this.get_context(b);return this.schema_model.execute("get_keys",[a],c).then(function(a){var b=[];return a.forEach(function(a){this.keys[a.name]=a,b.push(a.name)}.bind(this)),b}.bind(this))},validate:function(a,b,c){var d=Sao.field.Dict._super.validate.call(this,a,b,c);if(this.description.readonly)return d;var e=new Sao.PYSON.Decoder,f=this.get_eval(a),g=[];for(var h in f)if(h in this.keys){var i=this.keys[h].domain;i&&g.push(e.decode(i))}var j=new Sao.common.DomainInversion,k=j.eval_domain(g,f);return k||(this.get_state_attrs(a).invalid="domain"),d&&k}})}(),function(){"use strict";Sao.Tab=Sao.class_(Object,{init:function(a){Sao.Tab.tabs.push(this),this.attributes=jQuery.extend({},a),this.buttons={},this.menu_buttons={},this.id="tab-"+Sao.Tab.counter++,this.name="",this.name_el=jQuery("<span/>"),this.view_prm=jQuery.when()},menu_def:function(){return[{id:"switch_",icon:"tryton-switch",label:Sao.i18n.gettext("Switch"),tooltip:Sao.i18n.gettext("Switch view")},{id:"previous",icon:"tryton-back",label:Sao.i18n.gettext("Previous"),tooltip:Sao.i18n.gettext("Previous Record")},{id:"next",icon:"tryton-forward",label:Sao.i18n.gettext("Next"),tooltip:Sao.i18n.gettext("Next Record")},{id:"search",icon:"tryton-search",label:Sao.i18n.gettext("Search")},null,{id:"new_",icon:"tryton-create",label:Sao.i18n.gettext("New"),tooltip:Sao.i18n.gettext("Create a new record")},{id:"save",icon:"tryton-save",label:Sao.i18n.gettext("Save"),tooltip:Sao.i18n.gettext("Save this record")},{id:"reload",icon:"tryton-refresh",label:Sao.i18n.gettext("Reload/Undo"),tooltip:Sao.i18n.gettext("Reload")},{id:"copy",icon:"tryton-copy",label:Sao.i18n.gettext("Duplicate")},{id:"delete_",icon:"tryton-delete",label:Sao.i18n.gettext("Delete")},null,{id:"logs",icon:"tryton-log",label:Sao.i18n.gettext("View Logs...")},{id:this.screen&&Sao.common.MODELHISTORY.contains(this.screen.model_name)?"revision":null,icon:"tryton-history",label:Sao.i18n.gettext("Show revisions...")},null,{id:"attach",icon:"tryton-attach",label:Sao.i18n.gettext("Attachment"),tooltip:Sao.i18n.gettext("Add an attachment to the record"),dropdown:!0},{id:"note",icon:"tryton-note",label:Sao.i18n.gettext("Note"),tooltip:Sao.i18n.gettext("Add a note to the record")},{id:"action",icon:"tryton-launch",label:Sao.i18n.gettext("Action")},null,{id:"relate",icon:"tryton-link",label:Sao.i18n.gettext("Relate")},{id:"print",icon:"tryton-print",label:Sao.i18n.gettext("Print")},null,{id:"export",icon:"tryton-export",label:Sao.i18n.gettext("Export")},{id:"import",icon:"tryton-import",label:Sao.i18n.gettext("Import")},null,{id:"close",icon:"tryton-close",label:Sao.i18n.gettext("Close Tab")}]},create_tabcontent:function(){this.el=jQuery("<div/>",{class:this.class_});var a=this.create_toolbar().appendTo(this.el);this.title=a.find(".title"),this.content=jQuery("<div/>").appendTo(this.el),this.info_bar&&this.el.append(this.info_bar.el)},set_menu:function(a){var b;this.menu_def().forEach(function(c){var d;if(c){if(!this[c.id])return;d=jQuery("<li/>",{role:"presentation"});var e=jQuery("<a/>",{id:c.id,role:"menuitem",href:"#",tabindex:-1}).text(" "+c.label).prepend(Sao.common.ICONFACTORY.get_icon_img(c.icon,{"aria-hidden":"true"})).appendTo(d);this.menu_buttons[c.id]=d,e.click(function(a){a.preventDefault(),this[c.id]()}.bind(this))}else{if(c||!b)return;d=jQuery("<li/>",{role:"separator",class:"divider hidden-xs"})}b=d,d.appendTo(a)}.bind(this))},create_toolbar:function(){var a=jQuery("<nav/>",{class:"toolbar navbar navbar-default",role:"toolbar"}).append(jQuery("<div/>",{class:"container-fluid"}).append(jQuery("<div/>",{class:"dropdown navbar-header navbar-left flip"}).append(jQuery("<a/>",{href:"#",class:"navbar-brand dropdown-toggle","data-toggle":"dropdown",role:"button","aria-expanded":!1,"aria-haspopup":!0}).append(jQuery("<span/>",{class:"title"})).append(jQuery("<span/>",{class:"caret"}))).append(jQuery("<ul/>",{class:"dropdown-menu",role:"menu"})).append(jQuery("<button/>",{type:"button",class:"close visible-xs","aria-label":Sao.i18n.gettext("Close")}).append(jQuery("<span/>",{"aria-hidden":!0}).append("×")).click(function(){this.close()}.bind(this)))).append(jQuery("<div/>",{class:"btn-toolbar navbar-right flip",role:"toolbar"}))),b=jQuery("<div/>",{class:"toolbar-wrapper"}).append(a);this.set_menu(a.find('ul[role*="menu"]'));var c,d=function(b){if(!b||!b.tooltip)return void(c=null);if(b.id&&this[b.id]){c||(c=jQuery("<div/>",{class:"btn-group",role:"group"}).appendTo(a.find(".btn-toolbar")));var d={type:"button",class:"btn btn-default navbar-btn",title:b.label,id:b.id};b.dropdown&&(d.class+=" dropdown-toggle",d["data-toggle"]="dropdown",d["aria-expanded"]=!1,d["aria-haspopup"]=!0);var e=jQuery("<button/>",d).append(Sao.common.ICONFACTORY.get_icon_img(b.icon,{"aria-hidden":"true"}));if(this.buttons[b.id]=e,b.dropdown){jQuery("<div/>",{class:"btn-group dropdown",role:"group"}).append(e.append(jQuery("<span/>",{class:"caret"}))).append(jQuery("<ul/>",{class:"dropdown-menu",role:"menu","aria-labelledby":b.id})).appendTo(c)}else e.appendTo(c);this.buttons[b.id].click(b,function(a){var b=a.data,c=this.buttons[b.id];if(c.data("disabled"))return void a.preventDefault();c.data("disabled",!0),(this[b.id](this)||jQuery.when()).always(function(){c.data("disabled",!1)})}.bind(this))}};this.menu_def().forEach(d.bind(this)),this.status_label=jQuery("<span/>",{class:"badge"}).appendTo(jQuery("<div/>",{class:"navbar-text hidden-xs"}).insertAfter(this.buttons.previous)),a.find(".btn-toolbar > .btn-group").last().addClass("hidden-xs").find(".dropdown").on("show.bs.dropdown",function(){jQuery(this).parents(".btn-group").removeClass("hidden-xs")}).on("hide.bs.dropdown",function(){jQuery(this).parents(".btn-group").addClass("hidden-xs")});var e=jQuery("#tabs");return a.affix({target:e.parent(),offset:{top:function(){return jQuery("#main_navbar").height()}}}),a.on("affix.bs.affix",function(){b.height(jQuery("#main_navbar").height())}),a.on("affix-top.bs.affix affix-bottom.bs.affix",function(){b.height("")}),a.on("affixed.bs.affix",function(){Sao.Tab.affix_set_with(a)}),a.on("affixed-top.bs.affix affixed-bottom.bs.affix",function(){Sao.Tab.affix_unset_width(a)}),b},show:function(){jQuery("#tablist").find('a[href="#'+this.id+'"]').tab("show")},close:function(){var a=jQuery("#tabs"),b=jQuery("#tablist"),c=b.find("#nav-"+this.id),d=a.find("#"+this.id);return this.show(),this._close_allowed().then(function(){var b=c.nextAll("li").first();b.length||(b=c.prevAll("li").first()),c.remove(),d.remove();var e=Sao.Tab.tabs.indexOf(this);e>=0&&Sao.Tab.tabs.splice(e,1),b.length?b.find("a").tab("show"):Sao.set_url(),a.trigger("ready")}.bind(this))},_close_allowed:function(){return jQuery.when()},set_name:function(a){this.name=a,this.name_el.text(Sao.common.ellipsize(a,20)),this.name_el.parents("li").first().attr("title",a)},get_url:function(){},compare:function(a){return!1}}),Sao.Tab.affix_set_with=function(a){var b=jQuery(a.parent()).width();a.css("width",b)},Sao.Tab.affix_unset_width=function(a){a.css("width","")},jQuery(window).resize(function(){jQuery(".toolbar").each(function(a,b){b=jQuery(b),b.affix("checkPosition"),b.hasClass("affix")?Sao.Tab.affix_set_with(b):Sao.Tab.affix_unset_width(b)})}),Sao.Tab.counter=0,Sao.Tab.tabs=[],Sao.Tab.tabs.close=function(a){if(a&&Sao.Tab.tabs.length)return Sao.common.sur.run(Sao.i18n.gettext("The following action requires to close all tabs.\nDo you want to continue?")).then(function(){return Sao.Tab.tabs.close(!1)});if(Sao.Tab.tabs.length){var b=Sao.Tab.tabs[0];return b.close().then(function(){return~Sao.Tab.tabs.indexOf(b)?jQuery.Deferred().reject():Sao.Tab.tabs.close()})}return Sao.main_menu_screen?Sao.main_menu_screen.save_tree_state().then(function(){Sao.main_menu_screen=null}):jQuery.when()},Sao.Tab.tabs.get_current=function(){return jQuery("#tablist").find("li.active").data("tab")},Sao.Tab.tabs.close_current=function(){this.get_current().close()},Sao.Tab.create=function(a){var b=jQuery("#tablist");void 0===a.context&&(a.context={});for(var c=0;c<Sao.Tab.tabs.length;c++){var d=Sao.Tab.tabs[c];if(d.compare(a))return void b.find('a[href="#'+d.id+'"]').tab("show")}var e;e=a.model?new Sao.Tab.Form(a.model,a):new Sao.Tab.Board(a),e.view_prm.done(function(){Sao.Tab.add(e)})},Sao.Tab.add=function(a){var b=jQuery("#tabs"),c=jQuery("#tablist"),d=jQuery("#tabcontent"),e=jQuery("<a/>",{"aria-controls":a.id,role:"tab","data-toggle":"tab",href:"#"+a.id}).on("show.bs.tab",function(){Sao.set_url(a.get_url(),a.name)}).append(jQuery("<button/>",{class:"close"}).append(jQuery("<span/>",{"aria-hidden":!0}).append("×")).append(jQuery("<span/>",{class:"sr-only"}).text(Sao.i18n.gettext("Close"))).click(function(b){b.preventDefault(),a.close()})).append(a.name_el);jQuery("<li/>",{role:"presentation","data-placement":"bottom",id:"nav-"+a.id}).append(e).appendTo(c).data("tab",a),jQuery("<div/>",{role:"tabpanel",class:"tab-pane",id:a.id}).append(a.el).appendTo(d),e.on("hide.bs.tab",function(a){jQuery(a.target).data("scrollTop",b.scrollTop())}),e.on("shown.bs.tab",function(a){b.scrollTop(jQuery(a.target).data("scrollTop")||0)}),e.tab("show"),b.trigger("ready")},Sao.Tab.previous_tab=function(){Sao.Tab.move("prevAll")},Sao.Tab.next_tab=function(){Sao.Tab.move("nextAll")},Sao.Tab.move=function(a){var b=this.tabs.get_current(),c=jQuery("#tabs"),d=jQuery("#tablist"),e=d.find("#nav-"+b.id),f=e[a]("li").first();f&&(f.find("a").tab("show"),c.trigger("ready"))},Sao.Tab.Form=Sao.class_(Sao.Tab,{class_:"tab-form",init:function(a,b){Sao.Tab.Form._super.init.call(this,b);var c=new Sao.Screen(a,b);c.tab=this,this.screen=c,this.info_bar=new Sao.Window.InfoBar,this.create_tabcontent(),c.message_callback=this.record_message.bind(this),c.switch_callback=function(){
|
|
7
7
|
this===Sao.Tab.tabs.get_current()&&Sao.set_url(this.get_url(),this.name)}.bind(this),this.set_buttons_sensitive(),this.view_prm=this.screen.switch_view().done(function(){this.screen.count_tab_domain(),this.set_name(b.name||""),this.content.append(c.screen_container.el),b.res_id?(jQuery.isArray(b.res_id)||(b.res_id=[b.res_id]),c.group.load(b.res_id),c.set_current_record(c.group.get(b.res_id)),c.display()):("form"==c.current_view.view_type&&c.new_(),~["tree","graph","calendar"].indexOf(c.current_view.view_type)&&c.search_filter()),this.update_revision()}.bind(this))},create_toolbar:function(){var a=Sao.Tab.Form._super.create_toolbar.call(this),b=this.screen,c=this.buttons;return b.model.execute("view_toolbar_get",[],b.context()).done(function(d){[["action","tryton-launch",Sao.i18n.gettext("Launch action")],["relate","tryton-link",Sao.i18n.gettext("Open related records")],["print","tryton-print",Sao.i18n.gettext("Print report")]].forEach(function(e){var f=jQuery("<div/>",{class:"btn-group dropdown",role:"group"}).append(jQuery("<button/>",{type:"button",class:"btn btn-default navbar-btn dropdown-toggle","data-toggle":"dropdown","aria-expanded":!1,"aria-haspopup":!0,title:e[2],id:e[0]}).append(Sao.common.ICONFACTORY.get_icon_img(e[1],{"aria-hidden":"true"})).append(jQuery("<span/>",{class:"caret"}))).append(jQuery("<ul/>",{class:"dropdown-menu",role:"menu","aria-labelledby":e[0]})).appendTo(a.find(".btn-toolbar > .btn-group").last());c[e[0]]=f;var g=(f.on("show.bs.dropdown",function(){jQuery(this).parents(".btn-group").removeClass("hidden-xs")}).on("hide.bs.dropdown",function(){jQuery(this).parents(".btn-group").addClass("hidden-xs")}),f.find(".dropdown-menu"));f.click(function(){g.find("."+e[0]+"_button").remove(),b.get_buttons().forEach(function(a){(a.attributes.keyword||"action")==e[0]&&jQuery("<li/>",{role:"presentation",class:e[0]+"_button"}).append(jQuery("<a/>",{role:"menuitem",href:"#",tabindex:-1}).text(a.attributes.string||"")).click(function(c){c.preventDefault(),b.button(a.attributes)}).appendTo(g)})}),d[e[0]].forEach(function(a){jQuery("<li/>",{role:"presentation"}).append(jQuery("<a/>",{role:"menuitem",href:"#",tabindex:-1}).text(a.name)).click(function(c){c.preventDefault();var d=jQuery.when();this.screen.modified()&&(d=this.save()),d.then(function(){var c=jQuery.extend({},a),d=null;b.current_record&&(d=b.current_record.id);var f=b.current_view.selected_records().map(function(a){return a.id});c=Sao.Action.evaluate(c,e[0],b.current_record);var g={model:b.model_name,id:d,ids:f};Sao.Action.exec_action(c,g,jQuery.extend({},b.local_context()))})}.bind(this)).appendTo(g)}.bind(this))}.bind(this))}.bind(this)),a},compare:function(a){if(!a)return!1;var b=Sao.common.compare;return this.screen.model_name===a.model&&this.attributes.res_id===a.res_id&&b(this.attributes.domain||[],a.domain||[])&&b(this.attributes.view_ids||[],a.view_ids||[])&&(a.view_ids||b(this.attributes.mode||["tree","form"],a.mode||["tree","form"]))&&JSON.stringify(this.screen.local_context)===JSON.stringify(a.context)&&b(this.attributes.search_value||[],a.search_value||[])&&JSON.stringify(this.screen.attributes.tab_domain)===JSON.stringify(a.tab_domain)},_close_allowed:function(){return this.modified_save().then(null,function(a){return a?jQuery.Deferred().resolve():jQuery.Deferred().reject()})},modified_save:function(){return this.screen.save_tree_state(),this.screen.current_view.set_value(),this.screen.modified()?Sao.common.sur_3b.run(Sao.i18n.gettext("This record has been modified\ndo you want to save it?")).then(function(a){switch(a){case"ok":return this.save();case"ko":var b=this.screen.current_record.id;return this.reload(!1).then(function(){return b<0?jQuery.Deferred().reject(!0):this.screen.current_record&&b!=this.screen.current_record.id?jQuery.Deferred().reject():void 0}.bind(this));default:return jQuery.Deferred().reject()}}.bind(this)):jQuery.when()},new_:function(){return Sao.common.MODELACCESS.get(this.screen.model_name).create?this.modified_save().then(function(){return this.screen.new_().then(function(){this.info_bar.message()}.bind(this))}.bind(this)):jQuery.when()},save:function(){var a=Sao.common.MODELACCESS.get(this.screen.model_name);return a.write||a.create?this.screen.save_current().then(function(){this.info_bar.message(Sao.i18n.gettext("Record saved."),"info"),this.screen.count_tab_domain()}.bind(this),function(){return this.info_bar.message(this.screen.invalid_message(),"danger"),jQuery.Deferred().reject()}.bind(this)):jQuery.Deferred().reject()},switch_:function(){return this.modified_save().then(function(){return this.screen.switch_view()}.bind(this))},reload:function(a){void 0===a&&(a=!0);var b=function(){return this.screen.cancel_current().then(function(){var a=!1,b=null;return this.screen.current_record&&(b=this.screen.current_record.id),"form"!=this.screen.current_view.view_type?this.screen.search_filter(this.screen.screen_container.search_entry.val()).then(function(){return this.screen.group.forEach(function(c){c.id==b&&(this.screen.set_current_record(c),a=!0)}.bind(this)),a}.bind(this)):a}.bind(this)).then(function(a){return this.screen.display(a).then(function(){this.info_bar.message(),this.screen.count_tab_domain()}.bind(this))}.bind(this))}.bind(this);return a?this.modified_save().then(b):(this.screen.save_tree_state(!1),b())},copy:function(){return Sao.common.MODELACCESS.get(this.screen.model_name).create?this.modified_save().then(function(){return this.screen.copy().then(function(){this.info_bar.message(Sao.i18n.gettext("Working now on the duplicated record(s)."),"info"),this.screen.count_tab_domain()}.bind(this))}.bind(this)):jQuery.when()},delete_:function(){if(!Sao.common.MODELACCESS.get(this.screen.model_name).delete)return jQuery.when();var a;return a="form"==this.screen.current_view.view_type?Sao.i18n.gettext("Are you sure to remove this record?"):Sao.i18n.gettext("Are you sure to remove those records?"),Sao.common.sur.run(a).then(function(){return this.screen.remove(!0,!1,!0).then(function(){this.info_bar.message(Sao.i18n.gettext("Records removed."),"info"),this.screen.count_tab_domain()}.bind(this),function(){this.info_bar.message(Sao.i18n.gettext("Records not removed."),"danger")}.bind(this))}.bind(this))},previous:function(){return this.modified_save().then(function(){var a=this.screen.display_previous();return this.info_bar.message(),a}.bind(this))},next:function(){return this.modified_save().then(function(){var a=this.screen.display_next();return this.info_bar.message(),a}.bind(this))},search:function(){var a=this.screen.screen_container.search_entry;return a.is(":visible")&&window.setTimeout(function(){a.focus()},0),jQuery.when()},logs:function(){var a=this.screen.current_record;if(!a||a.id<0)return this.info_bar.message(Sao.i18n.gettext("You have to select one record."),"info"),jQuery.when();var b=[["id",Sao.i18n.gettext("ID:")],["create_uid.rec_name",Sao.i18n.gettext("Creation User:")],["create_date",Sao.i18n.gettext("Creation Date:")],["write_uid.rec_name",Sao.i18n.gettext("Latest Modification by:")],["write_date",Sao.i18n.gettext("Latest Modification Date:")]];return this.screen.model.execute("read",[[a.id],b.map(function(a){return a[0]})],this.screen.context()).then(function(a){a=a[0];var c="";b.forEach(function(b){var d=b[0],e=b[1],f=a[d]||"/";a[d]&&~["create_date","write_date"].indexOf(d)&&(f=Sao.common.format_datetime(Sao.common.date_format(),"%H:%M:%S",f)),c+=e+" "+f+"\n"}),c+=Sao.i18n.gettext("Model: ")+this.screen.model.name,Sao.common.message.run(c)}.bind(this))},revision:function(){var a=null;this.screen.current_record&&(a=this.screen.current_record.id);var b=function(b){return function(c){c&&c.add(1,"milliseconds"),"form"==this.screen.current_view.view_type&&c<b[b.length-1][0]&&(c=b[b.length-1][0]),c!=this.screen.context()._datetime&&(this.screen.clear(),this.screen.group._context._datetime=c,"form"!=this.screen.current_view.view_type?this.screen.search_filter(this.screen.screen_container.search_entry.val()):this.screen.group.load([a]),this.screen.display(!0),this.update_revision())}.bind(this)}.bind(this);return this.modified_save().then(function(){var a=this.screen.current_view.selected_records().map(function(a){return a.id});return this.screen.model.execute("history_revisions",[a],this.screen.context()).then(function(a){new Sao.Window.Revision(a,b(a))})}.bind(this))},update_revision:function(){var a,b,c=this.screen.context()._datetime;if(c){var d=Sao.common.date_format(),e="%H:%M:%S.%f",f=" @ "+Sao.common.format_datetime(d,e,c);a=Sao.common.ellipsize(this.name,80-f.length)+f,b=this.name+f}else a=Sao.common.ellipsize(this.name,80),b=this.name;this.title.text(a),this.title.attr("title",b),this.set_buttons_sensitive(c)},set_buttons_sensitive:function(a){if(a)["new_","save","delete_","copy","import"].forEach(function(a){this.buttons[a]&&this.buttons[a].addClass("disabled"),this.menu_buttons[a]&&this.menu_buttons[a].addClass("disabled")}.bind(this));else{var b=Sao.common.MODELACCESS.get(this.screen.model_name);[["new_",b.create],["save",b.create||b.write],["delete_",b.delete],["copy",b.create],["import",b.create]].forEach(function(a){var b=a[0],c=a[1];this.buttons[b]&&this.buttons[b].toggleClass("disabled",!c),this.menu_buttons[b]&&this.menu_buttons[b].toggleClass("disabled",!c)}.bind(this))}},attach:function(a){var b=function(){return new Sao.Window.Attachment(d,function(){this.update_attachment_count(!0)}.bind(this))}.bind(this),c=this.buttons.attach.parents(".dropdown");if(!a)return void window.setTimeout(function(){this.buttons.attach.click()}.bind(this));var d=this.screen.current_record,e=c.find(".dropdown-menu");e.children().remove(),Sao.Window.Attachment.get_attachments(d).then(function(a){a.forEach(function(a){var b=a[0],c=a[1],d=jQuery("<a/>",{role:"menuitem",href:"#",tabindex:-1}).text(b).appendTo(jQuery("<li/>",{role:"presentation"}).appendTo(e));"string"==typeof c?(d.attr("href",c),d.attr("target","_new")):d.click(function(a){a.preventDefault(),c()})})}).always(function(){e.append(jQuery("<li/>",{class:"divider"})),e.append(jQuery("<li/>",{role:"presentation",class:"input-file"}).append(jQuery("<input/>",{type:"file",role:"menuitem",multiple:!0,tabindex:-1}).change(function(){var a=b();Sao.common.get_input_data(jQuery(this),function(b,c){a.add_data(b,c)})})).append(jQuery("<a/>",{role:"menuitem",href:"#",tabindex:-1}).text(Sao.i18n.gettext("Add...")))),e.append(jQuery("<li/>",{role:"presentation"}).append(jQuery("<a/>",{role:"menuitem",href:"#",tabindex:-1}).text(Sao.i18n.gettext("Manage...")).click(function(a){a.preventDefault(),b()})))})},update_attachment_count:function(a){var b=this.screen.current_record;b?b.get_attachment_count(a).always(this.attachment_count.bind(this)):this.attachment_count(0)},attachment_count:function(a){var b=this.buttons.attach.find(".badge");b.length||(b=jQuery("<span/>",{class:"badge"}).appendTo(this.buttons.attach));var c=a||"";a>99&&(c="99+"),b.text(c),this.buttons.attach.attr("title",Sao.i18n.gettext("Attachment(%1)",a));var d=this.screen.get_id();this.buttons.attach.prop("disabled",d<0||null===d)},note:function(){var a=this.screen.current_record;!a||a.id<0||new Sao.Window.Note(a,function(){this.update_unread_note(!0)}.bind(this))},update_unread_note:function(a){var b=this.screen.current_record;b?b.get_unread_note(a).always(this._unread_note.bind(this)):this._unread_note(0)},_unread_note:function(a){var b=this.buttons.note.find(".badge");b.length||(b=jQuery("<span/>",{class:"badge"}).appendTo(this.buttons.note));var c=a||"";a>99&&(c="99+"),b.text(c),this.buttons.note.attr("title",Sao.i18n.gettext("Note(%1)",a));var d=this.screen.get_id();this.buttons.note.prop("disabled",d<0||null===d)},record_message:function(a){if(a){var b="_";0!==a[0]&&(b=a[0]);["print","relate","attach"].forEach(function(b){var c=this.buttons[b];if(c){var d=c.is(":disabled");c.prop("disabled",d||0===a[0])}}.bind(this)),this.buttons.switch_.prop("disabled",this.attributes.view_ids>1);var c=b+" / "+a[1];a[1]<a[2]&&null!==this.screen.limit&&a[2]>this.screen.limit&&(c+=Sao.i18n.gettext(" of ")+a[2]),this.status_label.text(c).attr("title",c)}this.info_bar.message()},action:function(){window.setTimeout(function(){this.buttons.action.find("button").click()}.bind(this))},relate:function(){window.setTimeout(function(){this.buttons.relate.find("button").click()}.bind(this))},print:function(){window.setTimeout(function(){this.buttons.print.find("button").click()}.bind(this))},export:function(){new Sao.Window.Export(this.title.text(),this.screen,this.screen.current_view.selected_records().map(function(a){return a.id}),this.screen.current_view.get_fields(),this.screen.context())},import:function(){Sao.common.MODELACCESS.get(this.screen.model_name).create&&new Sao.Window.Import(this.title.text(),this.screen)},get_url:function(){return this.screen.get_url(this.attributes.name)}}),Sao.Tab.Board=Sao.class_(Sao.Tab,{class_:"tab-board",init:function(a){var b;Sao.Tab.Board._super.init.call(this,a),this.model=a.model,this.view_id=a.view_ids.length>0?a.view_ids[0]:null,this.context=a.context,this.name=a.name||"",this.dialogs=[],this.board=null,b=new Sao.Model("ir.ui.view"),this.view_prm=b.execute("read",[[this.view_id],["arch"]],this.context),this.view_prm.done(function(a){var b;b=jQuery(jQuery.parseXML(a[0].arch)),this.board=new Sao.View.Board(b,this.context),this.board.actions_prms.done(function(){var a,b,c;for(a=0,b=this.board.actions.length;a<b;a++)c=this.board.actions[a],c.screen.tab=this}.bind(this)),this.el.append(this.board.el)}.bind(this)),this.create_tabcontent(),this.set_name(this.name),this.title.text(this.name_el.text())},compare:function(a){if(!a)return!1;var b=Sao.common.compare;return this.model===a.model&&b(this.attributes.view_ids||[],a.view_ids||[])&&JSON.stringify(this.context)===JSON.stringify(a.context)},reload:function(){this.board.reload()},record_message:function(){var a,b,c;for(b=this.board.actions.length,a=0,b=b;a<b;a++)c=this.board.actions[a],c.update_domain(this.board.actions)},attachment_count:function(){},update_unread_note:function(){}}),Sao.Tab.Wizard=Sao.class_(Sao.Tab,{class_:"tab-wizard",init:function(a){Sao.Tab.Wizard._super.init.call(this),this.wizard=a,this.set_name(a.name),a.tab=this,this.create_tabcontent(),this.title.text(this.name_el.text()),this.el.append(a.form)},create_toolbar:function(){return jQuery("<span/>")},_close_allowed:function(){var a=this.wizard,b=jQuery.when();a.state!==a.end_state&&a.end_state in a.states&&(b=a.response(a.end_state));var c=jQuery.Deferred();return b.always(function(){a.state===a.end_state?c.resolve():c.reject()}),c.promise()}})}(),function(){"use strict";Sao.ScreenContainer=Sao.class_(Object,{init:function(a){this.alternate_viewport=jQuery("<div/>",{class:"screen-container"}),this.alternate_view=!1,this.search_modal=null,this.search_form=null,this.last_search_text="",this.tab_domain=a||[],this.tab_counter=[],this.el=jQuery("<div/>",{class:"screen-container"}),this.filter_box=jQuery("<form/>",{class:"filter-box"}).submit(function(a){this.do_search(),a.preventDefault()}.bind(this));var b=jQuery("<div/>",{class:"row"}).appendTo(this.filter_box);this.el.append(this.filter_box),this.filter_button=jQuery("<button/>",{type:"button",class:"btn btn-default"}).text(Sao.i18n.gettext("Filters")),this.filter_button.click(this.search_box.bind(this)),this.search_entry=jQuery("<input/>",{class:"form-control mousetrap",placeholder:Sao.i18n.gettext("Search"),autocomplete:"off"}),this.search_list=jQuery("<datalist/>"),this.search_list.uniqueId(),this.search_entry.attr("list",this.search_list.attr("id")),this.search_entry.keypress(this.key_press.bind(this)),this.search_entry.on("input",this.update.bind(this));var c=jQuery("<button/>",{type:"submit",class:"btn btn-default","aria-label":Sao.i18n.gettext("Search"),title:Sao.i18n.gettext("Search")}).append(Sao.common.ICONFACTORY.get_icon_img("tryton-search"));this.but_active=jQuery("<button/>",{type:"button",class:"btn btn-default hidden-xs","aria-expanded":!1}).append(Sao.common.ICONFACTORY.get_icon_img("tryton-archive",{"aria-hidden":!0})),this._set_active_tooltip(),this.but_active.click(this.search_active.bind(this)),this.but_bookmark=jQuery("<button/>",{type:"button",class:"btn btn-default dropdown-toggle","data-toggle":"dropdown","aria-expanded":!1,"aria-label":Sao.i18n.gettext("Bookmarks"),title:Sao.i18n.gettext("Bookmarks"),id:"bookmarks"}).append(Sao.common.ICONFACTORY.get_icon_img("tryton-bookmark",{"aria-hidden":!0}));var d=jQuery("<ul/>",{class:"dropdown-menu",role:"menu","aria-labelledby":"bookmarks"});if(this.but_bookmark.click(function(){d.children().remove();for(var a=this.bookmarks(),b=0;b<a.length;b++){var c=a[b][1],e=a[b][2];jQuery("<li/>",{role:"presentation"}).append(jQuery("<a/>",{role:"menuitem",href:"#",tabindex:-1}).text(c).click(e,this.bookmark_activate.bind(this))).appendTo(d)}}.bind(this)),this.but_star=jQuery("<button/>",{class:"btn btn-default",type:"button"}).append(jQuery("<img/>",{class:"icon","aria-hidden":!0}).data("star",!1)).click(this.star_click.bind(this)),this.set_star(),jQuery("<div/>",{class:"input-group input-group-sm"}).append(jQuery("<span/>",{class:"input-group-btn"}).append(this.filter_button)).append(this.search_entry).append(this.search_list).append(jQuery("<span/>",{class:"input-group-btn"}).append(c).append(this.but_star).append(this.but_active).append(this.but_bookmark).append(d)).appendTo(jQuery("<div/>",{class:"col-sm-10 col-xs-12"}).appendTo(b)),this.but_prev=jQuery("<button/>",{type:"button",class:"btn btn-default","aria-label":Sao.i18n.gettext("Previous"),title:Sao.i18n.gettext("Previous")}).append(Sao.common.ICONFACTORY.get_icon_img("tryton-back",{"aria-hidden":!0})),this.but_prev.click(this.search_prev.bind(this)),this.but_next=jQuery("<button/>",{type:"button",class:"btn btn-default","aria-label":Sao.i18n.gettext("Next"),title:Sao.i18n.gettext("Next")}).append(Sao.common.ICONFACTORY.get_icon_img("tryton-forward",{"aria-hidden":!0})),this.but_next.click(this.search_next.bind(this)),jQuery("<div/>",{class:"btn-group",role:"group"}).append(this.but_prev).append(this.but_next).appendTo(jQuery("<div/>",{class:"col-sm-2 pull-right"}).appendTo(b)),this.content_box=jQuery("<div/>",{class:"content-box"}),jQuery.isEmptyObject(this.tab_domain))this.tab=null;else{this.tab=jQuery("<div/>",{class:"tab-domain"}).appendTo(this.el);var e=jQuery("<ul/>",{class:"nav nav-tabs",role:"tablist"}).appendTo(this.tab);jQuery("<div/>",{class:"tab-content"}).appendTo(this.tab);this.tab_domain.forEach(function(a,b){var c=a[0],d=jQuery("<span/>",{class:"badge"});jQuery("<li/>",{role:"presentation",id:"nav-"+b}).append(jQuery("<a/>",{"aria-controls":b,role:"tab","data-toggle":"tab",href:"#"+b}).text(c+" ").append(d)).appendTo(e);this.tab_counter.push(d)}.bind(this)),e.find("a:first").tab("show");var f=this;e.find("a").click(function(a){a.preventDefault(),jQuery(this).tab("show"),f.do_search(),f.screen.count_tab_domain()})}this.el.append(this.content_box)},set_text:function(a){this.search_entry.val(a),this.bookmark_match()},update:function(){var a=this.screen.domain_parser().completion(this.get_text());this.search_list.children().remove(),a.forEach(function(a){jQuery("<option/>",{value:a.trim()}).appendTo(this.search_list)},this)},set_star:function(a){var b,c,d=this.but_star.children("img");a?(c="tryton-star",b=Sao.i18n.gettext("Remove this bookmark")):(c="tryton-star-border",b=Sao.i18n.gettext("Bookmark this filter")),this.but_star.data("star",Boolean(a)),this.but_star.attr("title",b),this.but_star.attr("aria-label",b),Sao.common.ICONFACTORY.get_icon_url(c).then(function(a){d.attr("src",a)})},get_star:function(){return this.but_star.data("star")},star_click:function(){var a=this.get_star(),b=this.screen.model_name,c=function(){this.bookmark_match(),this.but_bookmark.prop("disabled",jQuery.isEmptyObject(this.bookmarks()))}.bind(this);if(a){var d=this.bookmark_match();Sao.common.VIEW_SEARCH.remove(b,d).then(function(){c()})}else{var e=this.get_text();if(!e)return;Sao.common.ask.run(Sao.i18n.gettext("Bookmark Name:")).then(function(a){if(a){var d=this.screen.domain_parser().parse(e);Sao.common.VIEW_SEARCH.add(b,a,d).then(function(){c()}),this.set_text(this.screen.domain_parser().string(d))}}.bind(this))}},bookmarks:function(){return Sao.common.VIEW_SEARCH.get(this.screen.model_name).filter(function(a){return this.screen.domain_parser().stringable(a[2])}.bind(this))},bookmark_activate:function(a){a.preventDefault();var b=a.data;this.set_text(this.screen.domain_parser().string(b)),this.do_search()},bookmark_match:function(){var a=this.get_text();if(a){var b=this.screen.domain_parser().parse(a);this.but_star.prop("disabled",!a);for(var c=(this.get_star(),this.bookmarks()),d=0;d<c.length;d++){var e=c[d][0],f=(c[d][1],c[d][2]);if(this.screen.domain_parser().string(f)===a||Sao.common.compare(f,b))return this.set_star(!0),e}}this.set_star(!1)},search_prev:function(){this.screen.search_prev(this.get_text())},search_next:function(){this.screen.search_next(this.get_text())},search_active:function(){this.but_active.toggleClass("active"),this._set_active_tooltip(),this.screen.search_filter(this.get_text())},_set_active_tooltip:function(){var a;a=this.but_active.hasClass("active")?Sao.i18n.gettext("Show active records"):Sao.i18n.gettext("Show inactive records"),this.but_active.attr("aria-label",a),this.but_active.attr("title",a)},get_tab_domain:function(){if(!this.tab)return[];var a=this.tab.find("li").index(this.tab.find("li.active"));return this.tab_domain[a][1]},set_tab_counter:function(a,b){if(!jQuery.isEmptyObject(this.tab_counter)&&this.tab&&(void 0!==b&&null!==b||(b=this.tab.find("li").index(this.tab.find("li.active"))),!(b<0))){var c=this.tab_counter[b];if(null===a)c.attr("title",""),c.text("");else{c.attr("title",a);var d=a;a>99&&(d="99+"),c.text(d)}}},do_search:function(){return this.screen.search_filter(this.get_text())},key_press:function(a){window.setTimeout(function(){this.bookmark_match()}.bind(this))},set_screen:function(a){this.screen=a,this.but_bookmark.prop("disabled",jQuery.isEmptyObject(this.bookmarks())),this.bookmark_match()},show_filter:function(){this.filter_box.show(),this.tab&&this.tab.show()},hide_filter:function(){this.filter_box.hide(),this.tab&&this.tab.hide()},set:function(a){this.alternate_view?(this.alternate_viewport.children().detach(),this.alternate_viewport.append(a)):(this.content_box.children().detach(),this.content_box.append(a))},get_text:function(){return this.search_entry.val()},search_box:function(){var a=this.screen.domain_parser(),b=function(){this.search_modal.modal("hide");for(var b="",c=a.quote.bind(a),d=0;d<this.search_form.fields.length;d++){var e,f=this.search_form.fields[d][0],g=this.search_form.fields[d][1];switch(g.type){case"selection":case"date":case"datetime":case"time":e=g.get_value(c);break;default:e=c(g.val())}e&&(b+=c(f)+": "+e+" ")}this.set_text(b),this.do_search().then(function(){this.last_search_text=this.get_text()}.bind(this))}.bind(this);if(!this.search_modal){var c=new Sao.Dialog(Sao.i18n.gettext("Filters"),"","lg");this.search_modal=c.modal,this.search_form=c.content,this.search_form.addClass("form-horizontal"),this.search_form.submit(function(a){b(),a.preventDefault()});var d,e=[];for(var f in a.fields)d=a.fields[f],(d.searchable||void 0===d.searchable)&&e.push(d);var g=function(a){return function(b){jQuery("<option/>",{value:b,text:b}).appendTo(a)}},h="filter-"+this.screen.model_name+"-";this.search_form.fields=[];for(var i=0;i<e.length;i++){d=e[i];var j,k,l=jQuery("<div/>",{class:"form-group form-group-sm"}).append(jQuery("<label/>",{class:"col-sm-4 control-label",for:h+d.name,text:d.string})).appendTo(c.body);switch(d.type){case"boolean":k=j=jQuery("<select/>",{class:"form-control input-sm",id:h+d.name}),["",Sao.i18n.gettext("True"),Sao.i18n.gettext("False")].forEach(g(j));break;case"selection":k=new Sao.ScreenContainer.Selection(d.selection,h+d.name),j=k.el;break;case"date":case"datetime":case"time":var m,n=Sao.common.date_format(this.screen.context().date_format);if("date"==d.type)m=n;else{var o=new Sao.PYSON.Decoder({}).decode(d.format);o=Sao.common.moment_format(o),"time"==d.type?m=o:"datetime"==d.type&&(m=n+" "+o)}k=new Sao.ScreenContainer.DateTimes(m,h+d.name),j=k.el;break;default:k=j=jQuery("<input/>",{class:"form-control input-sm",type:"text",placeholder:d.string,id:h+d.name})}jQuery("<div/>",{class:"col-sm-8"}).append(j).appendTo(l),this.search_form.fields.push([d.string,k,j])}jQuery("<button/>",{class:"btn btn-primary",type:"submit"}).text(Sao.i18n.gettext("Find")).click(b).appendTo(c.footer)}if(this.search_modal.modal("show"),this.last_search_text.trim()!==this.get_text().trim()){for(var p=0;p<this.search_form.fields.length;p++){var q=this.search_form.fields[p][1];switch(q.type){case"selection":q.set_value([]);break;case"date":case"datetime":case"time":q.set_value(null,null);break;default:q.val("")}}this.search_form.fields[0][2].focus()}}}),Sao.ScreenContainer.DateTimes=Sao.class_(Object,{type:"date",init:function(a,b){this.el=jQuery("<div/>",{class:"row",id:b});var c=function(c,d){var e=jQuery("<div/>",{class:"input-group input-group-sm"}).appendTo(d);jQuery("<span/>",{class:"input-group-btn"}).append(jQuery("<button/>",{class:"datepickerbutton btn btn-default",type:"button",tabindex:-1,"aria-label":Sao.i18n.gettext("Open the calendar"),title:Sao.i18n.gettext("Open the calendar")}).append(Sao.common.ICONFACTORY.get_icon_img("tryton-date"))).appendTo(e),jQuery("<input/>",{class:"form-control input-sm",type:"text",placeholder:c,id:b+"-from"}).appendTo(e),e.datetimepicker({locale:moment.locale(),keyBinds:null}),e.data("DateTimePicker").format(a);var f=new Mousetrap(d[0]);return f.bind("enter",function(a,b){e.data("DateTimePicker").date()}),f.bind("=",function(a,b){a.preventDefault(),e.data("DateTimePicker").date(moment())}),Sao.common.DATE_OPERATORS.forEach(function(a){f.bind(a[0],function(b,c){b.preventDefault();var d=e.data("DateTimePicker"),f=d.date();f.add(a[1]),d.date(f)})}),e};this.from=c(Sao.i18n.gettext("From"),jQuery("<div/>",{class:"col-md-5"}).appendTo(this.el)),jQuery("<p/>",{class:"text-center"}).append("..").appendTo(jQuery("<div/>",{class:"col-md-1"}).appendTo(this.el)),this.to=c(Sao.i18n.gettext("To"),jQuery("<div/>",{class:"col-md-5"}).appendTo(this.el))},_get_value:function(a){return a.find("input").val()},get_value:function(a){var b=this._get_value(this.from),c=this._get_value(this.to);return b&&c?b!==c?a(b)+".."+a(c):a(b):b?">="+a(b):c?"<="+a(c):void 0},set_value:function(a,b){this.from.data("DateTimePicker").date(a),this.to.data("DateTimePicker").date(b)}}),Sao.ScreenContainer.Selection=Sao.class_(Object,{type:"selection",init:function(a,b){this.el=jQuery("<select/>",{class:"form-control input-sm",multiple:!0,id:b}),a.forEach(function(a){jQuery("<option/>",{value:a[1],text:a[1]}).appendTo(this.el)}.bind(this))},get_value:function(a){var b=this.el.val();return b=jQuery.isEmptyObject(b)?null:jQuery.map(b,a).reduce(function(a,b){return a&&(a+=";"),a+b})},set_value:function(a){this.el.val(a)}}),Sao.Screen=Sao.class_(Object,{init:function(a,b){this.model_name=a,this.model=new Sao.Model(a,b),this.attributes=jQuery.extend({},b),this.view_ids=jQuery.extend([],b.view_ids),this.view_to_load=jQuery.extend([],b.mode||["tree","form"]),this.views=[],this.views_preload=b.views_preload||{},this.exclude_field=b.exclude_field,this.new_group(b.context||{}),this.current_view=null,this.current_record=null,this.domain=b.domain||[],this.context_domain=b.context_domain,this.size_limit=null,void 0===this.attributes.limit?this.limit=Sao.config.limit:this.limit=b.limit,this.offset=0,this.order=this.default_order=b.order;var c=Sao.common.MODELACCESS.get(a);c.write||c.create||(this.attributes.readonly=!0),this.search_count=0,this.screen_container=new Sao.ScreenContainer(b.tab_domain),this.context_screen=null,b.context_model&&(this.context_screen=new Sao.Screen(b.context_model,{mode:["form"],context:b.context}),this.context_screen_prm=this.context_screen.switch_view().then(function(){return jQuery("<div/>",{class:"row"}).append(jQuery("<div/>",{class:"col-md-12"}).append(this.context_screen.screen_container.el)).prependTo(this.screen_container.filter_box),this.context_screen.new_(!1).then(function(a){return a.default_get()})}.bind(this))),b.row_activate?this.row_activate=b.row_activate:this.row_activate=this.default_row_activate,this.tree_states={},this.tree_states_done=[],this.fields_view_tree={},this._domain_parser={},this.pre_validate=!1,this.tab=null,this.message_callback=null,this.switch_callback=null},load_next_view:function(){if(!jQuery.isEmptyObject(this.view_to_load)){var a;jQuery.isEmptyObject(this.view_ids)||(a=this.view_ids.shift());var b=this.view_to_load.shift();return this.add_view_id(a,b)}return jQuery.when()},add_view_id:function(a,b){var c;if(a&&this.views_preload[String(a)])c=this.views_preload[String(a)];else{if(a||!this.views_preload[b]){return this.model.execute("fields_view_get",[a,b],this.context()).pipe(this.add_view.bind(this))}c=this.views_preload[b]}return this.add_view(c),jQuery.when()},add_view:function(a){var b=a.arch,c=a.fields,d=a.view_id,e=jQuery(jQuery.parseXML(b));"tree"==e.children().prop("tagName")&&(this.fields_view_tree[d]=a);var f="eager";"form"==e.children().prop("tagName")&&(f="lazy");for(var g in c)g in this.model.fields&&"eager"!=f?c[g].loading=this.model.fields[g].description.loading:c[g].loading=f;this.group.add_fields(c);for(g in c)this.group.model.fields[g].views.add(d);var h=Sao.View.parse(this,e,a.field_childs);return h.view_id=d,this.views.push(h),h},number_of_views:function(){return this.views.length+this.view_to_load.length},switch_view:function(a,b){if(b=void 0!==b&&null!==b?Number(b):null,this.current_view){this.current_view.set_value(),this.current_record&&!~this.current_record.group.indexOf(this.current_record)&&(this.current_record=null);var c=this.current_view.get_fields();if(this.current_record&&this.current_view.editable&&!this.current_record.validate(c,!1,!1,!0))return this.screen_container.set(this.current_view.el),this.current_view.display().done(function(){this.set_cursor()}.bind(this))}var d=function(){return!!this.current_view&&(!(!a&&null===b)&&(null!==b?this.current_view.view_id==b:this.current_view.view_type==a))}.bind(this),e=function(){for(var c=function(){return this.screen_container.set(this.current_view.el),this.display().done(function(){this.set_cursor(),this.switch_callback&&this.switch_callback()}.bind(this))}.bind(this),f=function(){return!(!a&&null===b)&&!(a&&!b&&!this.view_to_load.length)}.bind(this),g=function(){this.current_view=this.views[this.views.length-1]}.bind(this),h=function(){return g(),f()?e():c()}.bind(this),i=function(a){return a.view_id==b};!d();){if(this.view_to_load.length)return this.load_next_view().then(h);if(null!==b&&!this.views.find(i))return this.add_view_id(b,a).then(g);var j=this.views.indexOf(this.current_view);if(this.current_view=this.views[(j+1)%this.views.length],!f())break}return c()}.bind(this);return e()},search_filter:function(a,b){if(b=b||!1,this.context_screen&&!b){if("pending"==this.context_screen_prm.state())return this.context_screen_prm.then(function(){return this.search_filter(a)}.bind(this));var c=this.context_screen.current_record;if(c&&!c.validate(null,!1,null,!0))return this.new_group(),this.context_screen.display(!0),jQuery.when();var d=this.context_screen.get_on_change_value();delete d.id,this.new_group(jQuery.extend(this.local_context(),d))}var e=this.search_domain(a,!0);if(this.context_domain){var f=new Sao.PYSON.Decoder(this.context());e=["AND",e,f.decode(this.context_domain)]}var g=this.screen_container.get_tab_domain();jQuery.isEmptyObject(g)||(e=["AND",e,g]);var h=this.context();return this.screen_container.but_active.hasClass("active")&&(h.active_test=!1),this.model.execute("search",[e,this.offset,this.limit,this.order],h).then(function(a){var c=jQuery.when(this.search_count)
|
|
8
8
|
;return b||(null!==this.limit&&a.length==this.limit?c=this.model.execute("search_count",[e],h).then(function(a){return this.search_count=a,this.search_count}.bind(this),function(){return this.search_count=0,this.search_count}.bind(this)):this.search_count=a.length),c.then(function(c){return this.screen_container.but_next.prop("disabled",!(void 0!==this.limit&&a.length==this.limit&&c>this.limit+this.offset)),this.screen_container.but_prev.prop("disabled",this.offset<=0),b?a:(this.clear(),this.load(a).then(function(){this.count_tab_domain()}.bind(this)))}.bind(this))}.bind(this))},search_domain:function(a,b){b=b||!1;var c=[];if(!this.group.parent&&this.domain_parser()){var d=this.domain_parser();a||""===a?c=d.parse(a):(c=this.attributes.search_value,this.attributes.search_value=null),b&&this.screen_container.set_text(d.string(c))}else c=[["id","in",this.group.map(function(a){return a.id})]];return jQuery.isEmptyObject(c)?c=this.attributes.domain||[]:jQuery.isEmptyObject(this.attributes.domain)||(c=["AND",c,this.attributes.domain]),this.screen_container.but_active.hasClass("active")&&(c=jQuery.isEmptyObject(c)?[["active","=",!1]]:[c,["active","=",!1]]),this.current_view&&"calendar"==this.current_view.view_type&&(c=jQuery.isEmptyObject(c)?this.current_view.current_domain():["AND",c,this.current_view.current_domain()]),c},count_tab_domain:function(){var a=this.search_domain(this.screen_container.get_text());this.screen_container.tab_domain.forEach(function(b,c){if(b[2]){var d=["AND",b[1],a];this.screen_container.set_tab_counter(null,c),this.group.model.execute("search_count",[d],this.context()).then(function(a){this.screen_container.set_tab_counter(a,c)}.bind(this))}}.bind(this))},context:function(){var a=this.group.context();return this.context_screen&&(a.context_model=this.context_screen.model_name),a},local_context:function(){var a=this.group.local_context();return this.context_screen&&(a.context_model=this.context_screen.model_name),a},set_group:function(a){var b,c={},d={};if(this.group){for(b in this.group.model.fields){var e=this.group.model.fields[b];c[b]=e.description,d[b]=e.views}this.group.screens.splice(this.group.screens.indexOf(this),1),jQuery.extend(a.on_write,this.group.on_write),a.on_write=a.on_write.filter(function(a,b,c){return b==c.indexOf(a)}),this.group.parent&&!a.parent&&(a.parent=this.group.parent)}a.screens.push(this),this.tree_states_done=[],this.group=a,this.model=a.model,a&&a.length?this.set_current_record(a[0]):this.set_current_record(null),this.group.add_fields(c);var f=function(a){this.group.model.fields[b].views.add(a)}.bind(this);for(b in d){d[b].forEach(f)}this.group.exclude_field=this.exclude_field},new_group:function(a){a||(a=this.context());var b=new Sao.Group(this.model,a,[]);b.set_readonly(this.attributes.readonly||!1),this.set_group(b)},set_current_record:function(a){if(this.current_record=a,this.message_callback){var b=null,c=null;if(a){var d=this.group.indexOf(a);b=d>=0?d+this.offset+1:a.get_index_path(),c=a.id}var e=[b||0,this.group.length+this.offset,this.search_count,c];this.message_callback(e)}this.switch_callback&&this.switch_callback(),this.tab&&(a?(a.get_attachment_count().always(this.tab.attachment_count.bind(this.tab)),a.get_unread_note().always(this.tab.update_unread_note.bind(this.tab))):(this.tab.attachment_count(0),this.tab.update_unread_note(0)),this.tab.record_message())},load:function(a,b,c){return void 0===b&&(b=!0),this.tree_states_done=[],this.group.load(a,c),a.length&&"calendar"!=this.current_view.view_type?this.current_record=this.group.get(a[0]):this.current_record=null,this.display().then(function(){b&&this.set_cursor()}.bind(this))},display:function(a){var b=[];if(this.current_record&&~this.current_record.group.indexOf(this.current_record)||(this.group&&this.group.length&&"calendar"!=this.current_view.view_type?this.current_record=this.group[0]:this.current_record=null),this.views){var c=this.search_active(~["tree","graph","calendar"].indexOf(this.current_view.view_type));b.push(c);for(var d=0;d<this.views.length;d++)this.views[d]&&(this.views[d]==this.current_view||this.views[d].el.parent().length)&&b.push(this.views[d].display())}return jQuery.when.apply(jQuery,b).then(function(){return this.set_tree_state().then(function(){this.set_current_record(this.current_record),a&&this.set_cursor(!1,!1)}.bind(this))}.bind(this))},display_next:function(){var a=this.current_view;if(a.set_value(),this.set_cursor(!1,!1),~["tree","form"].indexOf(a.view_type)&&this.current_record&&this.current_record.group){for(var b=this.current_record.group,c=this.current_record;b;){var d=b.indexOf(c);if(d<b.length-1){c=b[d+1];break}if(!b.parent||c.group.model.name!=b.parent.group.model.name)break;c=b.parent,b=b.parent.group}this.set_current_record(c)}else this.set_current_record(this.group[0]);return this.set_cursor(!1,!1),a.display()},display_previous:function(){var a=this.current_view;if(a.set_value(),this.set_cursor(!1,!1),~["tree","form"].indexOf(a.view_type)&&this.current_record&&this.current_record.group){for(var b=this.current_record.group,c=this.current_record;b;){var d=b.indexOf(c);if(d>0){c=b[d-1];break}if(!b.parent||c.group.model.name!=b.parent.group.model.name)break;c=b.parent,b=b.parent.group}this.set_current_record(c)}else this.set_current_record(this.group[0]);return this.set_cursor(!1,!1),a.display()},clear:function(){this.current_record=null,this.group.clear()},default_row_activate:function(){"tree"==this.current_view.view_type&&1==this.current_view.attributes.keyword_open?Sao.Action.exec_keyword("tree_open",{model:this.model_name,id:this.get_id(),ids:[this.get_id()]},this.local_context(),!1):this.modified()||this.switch_view("form")},get_id:function(){if(this.current_record)return this.current_record.id},new_:function(a,b){var c=this.current_view;void 0===a&&(a=!0);var d=jQuery.when();if("calendar"==this.current_view.view_type){var e=this.current_view.get_selected_date();d=this.switch_view("form")}return this.current_view&&("tree"==this.current_view.view_type&&!this.current_view.editable||"graph"==this.current_view.view_type)&&(d=this.switch_view("form")),d.then(function(){var d;d=this.current_record?this.current_record.group:this.group;var f,g=d.new_(!1,void 0,b);return f=a?g.default_get(b):jQuery.when(),f.then(function(){d.add(g,this.new_model_position()),this.set_current_record(g);var a=jQuery.when();return"calendar"==c.view_type&&(a=c.set_default_date(g,e)),a.then(function(){this.display().done(function(){this.set_cursor(!0,!0)}.bind(this))}.bind(this)),g}.bind(this))}.bind(this))},new_model_position:function(){var a=-1;return this.current_view&&"tree"==this.current_view.view_type&&"top"==this.current_view.attributes.editable&&(a=0),a},set_on_write:function(a){a&&(~this.group.on_write.indexOf(a)||this.group.on_write.push(a))},cancel_current:function(a){var b=[];return this.current_record&&(this.current_record.cancel(),this.current_record.id<0&&(a?b.push(this.current_record.reset(a).then(this.display.bind(this))):b.push(this.remove(!1,!1,!1,[this.current_record])))),jQuery.when.apply(jQuery,b)},save_current:function(){var a=this.current_record;if(!a){if("tree"!=this.current_view.view_type||!this.group||!this.group.length)return jQuery.when();this.set_current_record(this.group[0]),a=this.current_record}this.current_view.set_value();var b=this.current_view.get_fields(),c=a.get_path(this.group),d=jQuery.Deferred();if("tree"==this.current_view.view_type)d=this.group.save().then(function(){return this.current_record}.bind(this));else{if(!a.validate(b,null,null,!0))return this.current_view.display().then(function(){return this.set_cursor(),jQuery.Deferred().reject()}.bind(this));d=a.save().then(function(){return a})}var e=function(){return this.display().then(function(){return d},function(){return d})}.bind(this);return d.then(function(a){return c&&a&&a.id&&c.splice(-1,1,[c[c.length-1][0],a.id]),this.group.get_by_path(c).then(function(a){this.set_current_record(a)}.bind(this))}.bind(this)).then(e,e)},set_cursor:function(a,b){this.current_view&&~["tree","form"].indexOf(this.current_view.view_type)&&this.current_view.set_cursor(a,b)},modified:function(){var a=function(a){return a.has_changed()||a.id<0};if("tree"!=this.current_view.view_type){if(this.current_record&&a(this.current_record))return!0}else if(this.group.some(a))return!0;return!1},unremove:function(){this.current_view.selected_records().forEach(function(a){a.group.unremove(a)})},remove:function(a,b,c,d){var e=jQuery.when();if(d=d||this.current_view.selected_records(),jQuery.isEmptyObject(d))return e;a&&(e=this.group.delete_(d));var f=d[0],g=f.group,h=g.indexOf(f),i=f.get_path(this.group);return e.then(function(){d.forEach(function(a){a.group.remove(a,b,!0,c)});var e=[];if(a&&d.forEach(function(a){a.group.parent&&e.push(a.group.parent.save(!1)),~a.group.record_deleted.indexOf(a)&&a.group.record_deleted.splice(a.group.record_deleted.indexOf(a),1),~a.group.record_removed.indexOf(a)&&a.group.record_removed.splice(a.group.record_removed.indexOf(a),1)}),h>0){var f=g[h-1];i.splice(-1,1,[i[i.length-1][0],f.id])}else i.splice(-1,1);return jQuery.isEmptyObject(i)?this.group.length&&this.set_current_record(this.group[0]):e.push(this.group.get_by_path(i).then(function(a){this.set_current_record(a)}.bind(this))),jQuery.when.apply(jQuery,e).then(function(){return this.display().done(function(){this.set_cursor()}.bind(this))}.bind(this))}.bind(this))},copy:function(){var a=jQuery.Deferred(),b=this.current_view.selected_records();return this.model.copy(b,this.context()).then(function(b){this.group.load(b),jQuery.isEmptyObject(b)||this.set_current_record(this.group.get(b[0])),this.display().always(a.resolve)}.bind(this),a.reject),a.promise()},search_active:function(a){return a&&!this.group.parent?(this.screen_container.set_screen(this),this.screen_container.show_filter()):this.screen_container.hide_filter(),jQuery.when()},domain_parser:function(){var a,b,c;if((a=this.current_view?this.current_view.view_id:null)in this._domain_parser)return this._domain_parser[a];a in this.fields_view_tree?b=this.fields_view_tree[a]:(b=this.model.execute("fields_view_get",[!1,"tree"],this.context(),!1),this.fields_view_tree[a]=b);var d=jQuery.extend({},b.fields);for(var e in d){var f=d[e];"selection"!=f.type&&"multiselection"!=f.type&&"reference"!=f.type||(f.selection instanceof Array||(f=jQuery.extend({},f),f.selection=this.get_selection(f),d[e]=f))}if("arch"in b){var g=jQuery(jQuery.parseXML(b.arch)),h={};g.find("tree").children().each(function(a,b){if("field"==b.tagName){var c=b.getAttribute("name");c in h||(h[c]=d[c],["string","factor"].forEach(function(a){b.getAttribute(a)&&(h[c][a]=b.getAttribute(a))}))}}),d=h}return"active"in b.fields?this.screen_container.but_active.show():this.screen_container.but_active.hide(),[["id",Sao.i18n.gettext("ID"),"integer"],["create_uid",Sao.i18n.gettext("Creation User"),"many2one"],["create_date",Sao.i18n.gettext("Creation Date"),"datetime"],["write_uid",Sao.i18n.gettext("Modification User"),"many2one"],["write_date",Sao.i18n.gettext("Modification Date"),"datetime"]].forEach(function(a){var b=a[0],c=a[1],e=a[2];b in d||(d[b]={string:c,name:b,type:e},"datetime"==e&&(d[b].format='"%H:%M:%S"'))}),c=new Sao.common.DomainParser(d,this.context()),this._domain_parser[a]=c,c},get_selection:function(a){var b,c=a.selection_change_with;if(jQuery.isEmptyObject(c))b=this.model.execute(a.selection,[],void 0,!1);else{var d={};c.forEach(function(a){d[a]=null}),b=this.model.execute(a.selection,[d],void 0,!1)}return b.sort(function(a,b){return a[1].localeCompare(b[1])})},search_prev:function(a){this.limit&&(this.offset-=this.limit),this.search_filter(a)},search_next:function(a){this.limit&&(this.offset+=this.limit),this.search_filter(a)},invalid_message:function(a){a||(a=this.current_record);var b={};for(var c in a.model.fields){var d=a.model.fields[c];b[c]=d.description}var e=new Sao.common.DomainParser(b),f=[],g=a.invalid_fields();return Object.keys(g).sort().forEach(function(b){var c=g[b],d=a.model.fields[b].description.string;"required"==c||Sao.common.compare(c,[[b,"!=",null]])?f.push(Sao.i18n.gettext('"%1" is required',d)):"domain"==c?f.push(Sao.i18n.gettext('"%1" is not valid according to its domain',d)):"children"==c?f.push(Sao.i18n.gettext('The values of "%1" are not valid',d)):e.stringable(c)?f.push(e.string(c)):f.push(Sao.i18n.gettext('"%1" is not valid according to its domain'),d)}),f.length>5&&(f.splice(5,f.length),f.push("...")),f.join("\n")},get:function(){return this.current_record?(this.current_view.set_value(),this.current_record.get()):null},get_on_change_value:function(){return this.current_record?(this.current_view.set_value(),this.current_record.get_on_change_value()):null},reload:function(a,b){this.group.reload(a);var c=[];return b&&c.push(this.group.written(a)),this.group.parent&&c.push(this.group.parent.root_parent().reload()),jQuery.when.apply(jQuery,c).then(function(){this.display()}.bind(this))},get_buttons:function(){var a=this.current_view.selected_records();if(jQuery.isEmptyObject(a))return[];var b=this.current_view.get_buttons();return a.forEach(function(a){b=b.filter(function(b){if("instance"===b.attributes.type)return!1;var c=a.expr_eval(b.attributes.states||{});return!(c.invisible||c.readonly)})}),b},button:function(a){var b,c=function(a){return this.reload(b,!0).then(function(){"string"==typeof a?this.client_action(a):a&&Sao.Action.execute(a,{model:this.model_name,id:this.current_record.id,ids:b},null,this.context(),!0)}.bind(this))},d=this.current_view.selected_records();this.current_view.set_value();for(var e=this.current_view.get_fields(),f=[],g=function(a){return function(){this.display(!0),a.validate(e)}.bind(this)}.bind(this),h=0;h<d.length;h++){var i=d[h],j=i.expr_eval(a.states||{}).pre_validate||[];f.push(i.validate(e,!1,j))}return jQuery.when.apply(jQuery,f).then(function(){for(var e,f=0;f<d.length;f++){e=d[f];if(!arguments[f])return void Sao.common.warning.run(this.invalid_message(e),Sao.i18n.gettext("Pre-validation")).then(g(e))}var h=jQuery.when();return a.confirm&&(h=Sao.common.sur.run(a.confirm)),h.then(function(){var e=this.current_record;if("instance"===a.type){var g=e.expr_eval(a.change||[]),h=e._get_on_change_args(g);return e.model.execute(a.name,[h],this.context()).then(function(a){e.set_on_change(a).then(function(){e.group.changed(),e.group.root_group.screens.forEach(function(a){a.display()})})})}return e.save(!1).then(function(){var g=this.context();for(g._timestamp={},b=[],f=0;f<d.length;f++)e=d[f],jQuery.extend(g._timestamp,e.get_timestamp()),b.push(e.id);return e.model.execute(a.name,[b],g).then(c.bind(this)).fail(function(){return this.reload(b,!0)}.bind(this))}.bind(this))}.bind(this))}.bind(this))},client_action:function(a){var b=Sao.common.MODELACCESS.get(this.model_name);"new"==a?b.create&&this.new_():"delete"==a?b.delete&&this.remove(!this.group.parent,!1,!this.group.parent):"remove"==a?b.write&&b.read&&this.group.parent&&this.remove(!1,!0,!1):"copy"==a?b.create&&this.copy():"next"==a?this.display_next():"previous"==a?this.display_previous():"close"==a?Sao.Tab.tabs.close_current():a.startsWith("switch")?this.switch_view.apply(this,a.split(" ",3).slice(1)):"reload"==a?~["tree","graph","calendar"].indexOf(this.current_view.view_type)&&!this.group.parent&&this.search_filter():"reload menu"==a?Sao.Session.current_session.reload_context().then(function(){Sao.menu()}):"reload context"==a&&Sao.Session.current_session.reload_context()},get_url:function(a){function b(a){return JSON.stringify(Sao.rpc.prepareObject(a))}var c=[];jQuery.isEmptyObject(this.domain)||c.push(["domain",b(this.domain)]);var d=this.local_context();jQuery.isEmptyObject(d)||c.push(["context",b(d)]),this.context_screen&&c.push(["context_model",this.context_screen.model_name]),a&&c.push(["name",b(a)]);var e=["model",this.model_name],f=this.views.map(function(a){return a.view_id}).concat(this.view_ids);if("form"!=this.current_view.view_type){var g;if(this.attributes.search_value)g=this.attributes.search_value;else{var h=this.screen_container.get_text();g=this.domain_parser().parse(h)}jQuery.isEmptyObject(g)||c.push(["search_value",b(g)])}else if(this.current_record&&this.current_record.id>-1){e.push(this.current_record.id);var i=f.indexOf(this.current_view.view_id);f=f.slice(i).concat(f.slice(0,i))}return jQuery.isEmptyObject(f)||c.push(["views",b(f)]),c=c.map(function(a){return a.map(encodeURIComponent).join("=")}).join("&"),e=e.join("/"),c&&(e+=";"+c),e},save_tree_state:function(a){var b,c=[];a=void 0===a||a;var d,e,f,g,h,i,j=this.group.parent?this.group.parent.id:null,k=this.group.parent?this.group.parent._timestamp:null;for(d=0,e=this.views.length;d<e;d++)if(f=this.views[d],"form"==f.view_type){for(var l in f.widgets)if(f.widgets.hasOwnProperty(l))for(g=f.widgets[l],h=0,i=g.length;h<i;h++)g[h].screen&&(b=g[h].screen.save_tree_state(a),c.push(b));1==this.views.length&&this.current_record&&(j in this.tree_states||(this.tree_states[j]={}),this.tree_states[j][f.children_field||null]=[k,[],[[this.current_record.id]]])}else if("tree"==f.view_type){var m=f.get_expanded_paths(),n=f.get_selected_paths();if(j in this.tree_states||(this.tree_states[j]={}),this.tree_states[j][f.children_field||null]=[k,m,n],a&&f.attributes.tree_state){var o=new Sao.Model("ir.ui.view_tree_state");b=o.execute("set",[this.model_name,this.get_tree_domain(j),f.children_field,JSON.stringify(m),JSON.stringify(n)],{}),c.push(b)}}return jQuery.when.apply(jQuery,c)},get_tree_domain:function(a){var b;return b=a?(this.domain||[]).concat([[this.exclude_field,"=",a]]):this.domain,JSON.stringify(Sao.rpc.prepareObject(b))},set_tree_state:function(){var a,b,c,d,e,f=this.current_view;return~["tree","form"].indexOf(f.view_type)?~this.tree_states_done.indexOf(f)?jQuery.when():"form"!=f.view_type||jQuery.isEmptyObject(this.tree_states_done)?("tree"!=f.view_type||f.attributes.tree_state||this.tree_states_done.push(f),(a=this.group.parent?this.group.parent.id:null)<0?jQuery.when():(b=this.group.parent?this.group.parent._timestamp:null,a in this.tree_states||(this.tree_states[a]={}),c=this.tree_states[a][f.children_field||null],c&&b!=c[0]&&(c=void 0),void 0===c?(e=new Sao.Model("ir.ui.view_tree_state"),d=e.execute("get",[this.model_name,this.get_tree_domain(a),f.children_field],{}).then(function(c){return c=[b,JSON.parse(c[0]),JSON.parse(c[1])],a in this.tree_states||(this.tree_states[a]={}),this.tree_states[a][f.children_field||null]=c,c}.bind(this))):d=jQuery.when(c),this.tree_states_done.push(f),d.done(function(a){var b,c,d;if(b=a[1],c=a[2],"tree"==f.view_type)return f.display(c,b);if(!jQuery.isEmptyObject(c)){for(var e=0;e<c[0].length;e++){var g=this.group.get(c[0][e]);if(!g)break;d=g}d&&d!=this.current_record&&(this.set_current_record(d),f.display())}}.bind(this)))):jQuery.when():jQuery.when()}})}(),function(){"use strict";Sao.View=Sao.class_(Object,{init:function(a,b){this.screen=a,this.view_type=null,this.el=null,this.view_id=null,this.fields={};var c=b.children()[0].attributes;this.attributes={};for(var d=0,e=c.length;d<e;d++){var f=c[d];this.attributes[f.name]=f.value}a.set_on_write(this.attributes.on_write)},set_value:function(){},get_fields:function(){return Object.keys(this.fields)},selected_records:function(){return[]},get_buttons:function(){return[]}}),Sao.View.idpath2path=function(a,b){var c,d=[];if(!b)return[];for(var e=0,f=a.rows.length;e<f;e++)if(a.rows[e].record.id==b[0]){d.push(e),c=Sao.View.idpath2path(a.rows[e],b.slice(1,b.length)),d=d.concat(c);break}return d},Sao.View.parse=function(a,b,c){switch(b.children().prop("tagName")){case"tree":return new Sao.View.Tree(a,b,c);case"form":return new Sao.View.Form(a,b);case"graph":return new Sao.View.Graph(a,b);case"calendar":return new Sao.View.Calendar(a,b)}}}(),function(){"use strict";Sao.View.Form=Sao.class_(Sao.View,{editable:!0,init:function(a,b){Sao.View.Form._super.init.call(this,a,b),this.view_type="form",this.el=jQuery("<div/>",{class:"form"}),this.widgets={},this.widget_id=0,this.state_widgets=[],this.containers=[],this.notebooks=[],this.expandables=[];var c=b.children()[0],d=this.parse(a.model,c);this.el.append(d.el)},_parse_node:function(a,b,c,d,e){var f;switch(b.tagName){case"image":this._parse_image(a,b,c,d);break;case"separator":this._parse_separator(a,b,c,d);break;case"label":f=this._parse_label(a,b,c,d),d.name&&f&&(e[d.name]=f);break;case"newline":c.add_row();break;case"button":this._parse_button(b,c,d);break;case"notebook":this._parse_notebook(a,b,c,d);break;case"page":this._parse_page(a,b,c,d);break;case"field":if(f=this._parse_field(a,b,c,d),d.name in e&&f&&f.labelled){var g=e[d.name];g.el.uniqueId(),f.labelled.uniqueId(),f.labelled.attr("aria-labelledby",g.el.attr("id")),g.el.attr("for",f.labelled.attr("id"))}break;case"group":this._parse_group(a,b,c,d);break;case"hpaned":this._parse_paned(a,b,c,d,"horizontal");break;case"vpaned":this._parse_paned(a,b,c,d,"vertical");break;case"child":this._parse_child(a,b,c,d)}},parse:function(a,b,c){void 0===c&&(c=new Sao.View.Form.Container(Number(b.getAttribute("col")||4)),this.containers.push(c));var d={},e=function(b,e){for(var f={},g=0,h=e.attributes.length;g<h;g++){var i=e.attributes[g];f[i.name]=i.value}["readonly","invisible"].forEach(function(a){f[a]&&(f[a]=1==f[a])}),["yexpand","yfill","xexpand","xfill","colspan"].forEach(function(a){f[a]&&(f[a]=Number(f[a]))}),this._parse_node(a,e,c,f,d)};return jQuery(b).children().each(e.bind(this)),c},_parse_image:function(a,b,c,d){var e=new Sao.View.Form.Image_(d);this.state_widgets.push(e),c.add(d,e)},_parse_separator:function(a,b,c,d){var e=d.name,f=d.string;e in a.fields&&(!d.states&&e in a.fields&&(d.states=a.fields[e].description.states),f||(f=a.fields[e].description.string));var g=new Sao.View.Form.Separator(f,d);this.state_widgets.push(g),c.add(d,g)},_parse_label:function(a,b,c,d){var e=d.name;if(void 0===d.xexpand&&(d.xexpand=0),e in a.fields){if(e==this.screen.exclude_field)return void c.add(d);!d.states&&e in a.fields&&(d.states=a.fields[e].description.states),void 0===d.string&&(d.string=a.fields[e].description.string+Sao.i18n.gettext(":"))}void 0===d.xalign&&(d.xalign=1);var f=new Sao.View.Form.Label(d.string,d);return this.state_widgets.push(f),c.add(d,f),f},_parse_button:function(a,b,c){var d=new Sao.common.Button(c);this.state_widgets.push(d),b.add(c,d),d.el.click(d,this.button_clicked.bind(this))},_parse_notebook:function(a,b,c,d){void 0===d.colspan&&(d.colspan=4);var e=new Sao.View.Form.Notebook(d);this.notebooks.push(e),this.state_widgets.push(e),c.add(d,e),this.parse(a,b,e)},_parse_page:function(a,b,c,d){d.string;if(d.name in a.fields){var e=a.fields[d.name];if(d.name==this.screen.exclude_field)return;["states","string"].forEach(function(a){void 0===d[a]&&void 0!==e.description[a]&&(d[a]=e.description[a])})}var f=this.parse(a,b);f=new Sao.View.Form.Page(c.add(f.el,d.string,d.icon),d),this.state_widgets.push(f)},_parse_field:function(a,b,c,d){var e=d.name;if(!(e in a.fields)||e==this.screen.exclude_field)return void c.add(d);d.widget||(d.widget=a.fields[e].description.type);var f=["relation","domain","selection","help","relation_field","string","views","add_remove","sort","context","size","filename","autocomplete","translate","create","delete","selection_change_with","schema_model"];for(var g in f){var h=f[g];h in a.fields[e].description&&null===b.getAttribute(h)&&(d[h]=a.fields[e].description[h])}var i=Sao.View.form_widget_get(d.widget);if(!i)return void c.add(d);var j=new i(e,a,d);return j.position=this.widget_id+=1,j.view=this,c.add(d,j),void 0===this.widgets[e]&&(this.widgets[e]=[]),this.widgets[e].push(j),this.fields[e]=!0,j},_parse_group:function(a,b,c,d){if(void 0!==d.name){var e=a.fields[d.name];if(d.name==this.screen.exclude_field)return void c.add(d);["states","string"].forEach(function(a){!(a in d)&&a in e.description&&(d[a]=e.description[a])})}var f;void 0!==d.expandable?(f=new Sao.View.Form.Expander(d),f.set_expanded("1"===d.expandable),this.expandables.push(f)):f=new Sao.View.Form.Group(d),f.add(this.parse(a,b)),this.state_widgets.push(f),c.add(d,f)},_parse_paned:function(a,b,c,d,e){void 0===d.yexpand&&(d.yexpand=!0),void 0===d.yfill&&(d.yfill=!0);var f=new Sao.common.Paned(e);c.add(d,f),this.parse(a,b,f)},_parse_child:function(a,b,c,d){var e,f=this.parse(a,b);e=c.get_child1().children().length?c.get_child2():c.get_child1(),e.append(f.el)},get_buttons:function(){var a=[];for(var b in this.state_widgets){var c=this.state_widgets[b];c instanceof Sao.common.Button&&a.push(c)}return a},display:function(){var a,b,c=this.screen.current_record,d=[];if(c){var e=[];for(b in this.widgets)a=c.model.fields[b],e.push([b,a.description.loading||!0,a.views.size]);e.sort(function(a,b){return!a[1]&&b[1]?-1:a[1]&&!b[1]?1:a[2]-b[2]}),e.forEach(function(a){var b=a[0];d.push(c.load(b))})}var f=function(a,b){return function(c){c.display(a,b)}};return jQuery.when.apply(jQuery,d).done(function(){var c=this.screen.current_record;for(b in this.widgets){var d=this.widgets[b];a=null,c&&(a=c.model.fields[b]),a&&a.set_state(c),d.forEach(f(c,a))}}.bind(this)).done(function(){var a,b=this.screen.current_record;for(a in this.state_widgets){this.state_widgets[a].set_state(b)}for(a in this.containers){this.containers[a].resize()}}.bind(this))},set_value:function(){var a=this.screen.current_record;if(a){var b=function(b){b.set_value(a,this)};for(var c in this.widgets)if(c in a.model.fields){var d=this.widgets[c],e=a.model.fields[c];d.forEach(b,e)}}},button_clicked:function(a){var b=a.data;b.el.prop("disabled",!0),this.screen.button(b.attributes)},selected_records:function(){return this.screen.current_record?[this.screen.current_record]:[]},set_cursor:function(a,b){var c,d,e,f,g,h,i,j,k,l,m=jQuery(document.activeElement),n=m.closest(this.el).length>0;if(b||!n){if(b)for(c=0;c<this.notebooks.length;c++)g=this.notebooks[c],g.set_current_page();this.attributes.cursor in this.widgets?f=Sao.common.find_focusable_child(this.widgets[this.attributes.cursor][0].el):(h=Sao.common.find_focusable_child(this.el))&&h.focus()}var o=this.screen.current_record;if(o){var p=[],q=this.el.find(".has-error"),r=o.invalid_fields();for(d in r)for(j=this.widgets[d]||[],c=0;c<q.length;c++)for(k=jQuery(q[c]),e=0;e<j.length;e++)if(k.closest(j[e].el).length>0){p.push(k);break}p.length>0&&(f=Sao.common.find_first_focus_widget(this.el,p))}if(f){for(c=0;c<this.notebooks.length;c++)for(g=this.notebooks[c],l=g.get_n_pages(),e=0;e<l;e++)if(h=g.get_nth_page(e),jQuery(f).closest(h).length>0){g.set_current_page(e);break}for(c=0;c<this.expandables.length;c++)i=this.expandables[c],jQuery(f).closest(i.el).length>0&&i.set_expanded(!0);jQuery(f).find("input,select,textarea").addBack(f).focus()}}}),Sao.View.Form.Container=Sao.class_(Object,{init:function(a){void 0===a&&(a=4),a<0&&(a=0),this.col=a,this.el=jQuery("<table/>",{class:"form-container responsive responsive-noheader"}),this.body=jQuery("<tbody/>").appendTo(this.el),this.col<=0?this.el.addClass("form-hcontainer"):1==this.col&&this.el.addClass("form-vcontainer"),this.add_row()},add_row:function(){this.body.append(jQuery("<tr/>"))},rows:function(){return this.body.children("tr")},row:function(){return this.rows().last()},add:function(a,b){var c=a.colspan;void 0===c&&(c=1);var d=a.xfill;void 0===d&&(d=1);var e=a.xexpand;void 0===e&&(e=1);var f=this.row();if(this.col>0){var g=0;f.children().map(function(a,b){g+=Number(jQuery(b).attr("colspan")||1)}),g+c>this.col&&(this.add_row(),f=this.row())}var h;b&&(h=b.el);var i=jQuery("<td/>",{colspan:c,class:b?b.class_||"":""}).append(h);if(f.append(i),b){if(a.yfill&&i.css("vertical-align","top"),void 0!==a.xalign){var j;j=Sao.i18n.rtl?a.xalign>=.5?"left":"right":a.xalign>=.5?"right":"left",i.css("text-align",j)}e&&(i.addClass("xexpand"),i.css("width","100%")),d&&(i.addClass("xfill"),e&&h.css("width","100%")),a.help&&b.el.attr("title",a.help)}},resize:function(){var a,b,c=this.rows().toArray(),d=[],e=this.col,f=!1,g=function(b){b=jQuery(b);var c=[];return a=0,b.children().map(function(){var b=jQuery(this),d=Math.min(Number(b.attr("colspan")),e||1);b.hasClass("xexpand")&&!jQuery.isEmptyObject(b.children())&&"none"!=b.children(":not(.tooltip)").css("display")&&c.push([b,a]),a+=d}),c};c.sort(function(a,b){if(a=g(a),b=g(b),a.length==b.length){var c=function(a,b){var c=b[0];return a+Math.min(Number(c.attr("colspan")),e||1)};return a.reduce(c,0)-b.reduce(c,0)}return b.length-a.length}),c.forEach(function(c){c=jQuery(c);var h=g(c),i=100/h.length;h.forEach(function(c){var f=c[0];a=c[1];var g=Math.min(Number(f.attr("colspan")),e||1),h=0;for(b=0;b<g;b++)h+=d[a+b]||0;for(b=0;b<g;b++)if(h){if(h>i){var j=h-i;d[a+b]&&(d[a+b]-=j/(h/d[a+b]))}}else d[a+b]=i/g}),jQuery.isEmptyObject(h)||(f=!0)}),c.forEach(function(c){c=jQuery(c),a=0,c.children().map(function(){var c=jQuery(this),f=Math.min(Number(c.attr("colspan")),e||1);if(c.hasClass("xexpand")&&"none"!=c.children(":not(.tooltip)").css("display")){var g=0;for(b=0;b<f;b++)g+=d[a+b]||0;c.css("width",g+"%")}else c.css("width","");"none"==c.children().css("display")?(c.css("visibility","collapse"),e<=1&&c.hide()):(c.css("visibility","visible"),e<=1&&c.show()),a+=f})}),f?this.el.css("width","100%"):this.el.css("width","")}}),Sao.View.Form.StateWidget=Sao.class_(Object,{init:function(a){this.attributes=a},set_state:function(a){var b;b=a?a.expr_eval(this.attributes.states||{}):{};var c=b.invisible;void 0===c&&(c=this.attributes.invisible),c?this.hide():this.show()},show:function(){this.el.show()},hide:function(){this.el.hide()}}),Sao.View.Form.LabelMixin=Sao.class_(Sao.View.Form.StateWidget,{set_state:function(a){Sao.View.Form.LabelMixin._super.set_state.call(this,a);var b;if(this.attributes.name&&a&&(b=a.model.fields[this.attributes.name]),void 0!==this.attributes.string&&!this.attributes.string&&b){var c="";a&&(c=b.get_client(a)||""),this.label_el.text(c)}var d;d=a?a.expr_eval(this.attributes.states||{}):{},void 0===d.readonly&&(d.readonly=!b),Sao.common.apply_label_attributes(this.label_el,b&&b.description.readonly||d.readonly,b&&b.description.required||d.required)}}),Sao.View.Form.Separator=Sao.class_(Sao.View.Form.LabelMixin,{init:function(a,b){Sao.View.Form.Separator._super.init.call(this,b),this.el=jQuery("<div/>",{class:"form-separator"}),this.label_el=jQuery("<label/>"),a&&this.label_el.text(a),this.el.append(this.label_el),this.el.append(jQuery("<hr/>"))}}),Sao.View.Form.Label=Sao.class_(Sao.View.Form.LabelMixin,{class_:"form-label",init:function(a,b){Sao.View.Form.Label._super.init.call(this,b),this.el=this.label_el=jQuery("<label/>",{text:a,class:this.class_})}}),Sao.View.Form.Notebook=Sao.class_(Sao.View.Form.StateWidget,{class_:"form-notebook",init:function(a){Sao.View.Form.Notebook._super.init.call(this,a),this.el=jQuery("<div/>",{class:this.class_}),this.nav=jQuery("<ul/>",{class:"nav nav-tabs",role:"tablist"}).appendTo(this.el),this.panes=jQuery("<div/>",{class:"tab-content"}).appendTo(this.el),this.selected=!1},add:function(a,b,c){var d=jQuery("<div/>",{role:"tabpanel",class:"tab-pane"}).uniqueId(),e=d.attr("id"),f=Sao.common.ICONFACTORY.get_icon_img(c),g=jQuery("<li/>",{role:"presentation"}).append(jQuery("<a/>",{"aria-controls":e,role:"tab","data-toggle":"tab",href:"#"+e}).text(b).prepend(f)).appendTo(this.nav);return d.append(a).appendTo(this.panes),this.selected||(g.addClass("active"),d.addClass("active"),this.selected=!0),g},set_current_page:function(a){var b;b=void 0===a?":visible:first":":eq("+a+"):visible",this.nav.find("li"+b+" a").tab("show")},get_n_pages:function(){return this.nav.find("li[role='presentation']").length},get_nth_page:function(a){return jQuery(this.panes.find("div[role='tabpanel']")[a])}}),Sao.View.Form.Page=Sao.class_(Sao.View.Form.StateWidget,{init:function(a,b){Sao.View.Form.Page._super.init.call(this,b),this.el=a},hide:function(){Sao.View.Form.Page._super.hide.call(this),this.el.hasClass("active")&&this.el.next(":visible").find("a").tab("show")}}),Sao.View.Form.Group=Sao.class_(Sao.View.Form.StateWidget,{class_:"form-group_",
|
package/package.json
CHANGED
package/src/model.js
CHANGED
|
@@ -149,18 +149,18 @@
|
|
|
149
149
|
record.group = this;
|
|
150
150
|
}
|
|
151
151
|
this.splice(position, 0, record);
|
|
152
|
-
|
|
152
|
+
this.record_removed.forEach(function(record_rm) {
|
|
153
153
|
if (record_rm.id == record.id) {
|
|
154
154
|
this.record_removed.splice(
|
|
155
155
|
this.record_removed.indexOf(record_rm), 1);
|
|
156
156
|
}
|
|
157
|
-
}
|
|
158
|
-
|
|
157
|
+
});
|
|
158
|
+
this.record_deleted.forEach(function(record_del) {
|
|
159
159
|
if (record_del.id == record.id) {
|
|
160
160
|
this.record_deleted.splice(
|
|
161
161
|
this.record_deleted.indexOf(record_del), 1);
|
|
162
162
|
}
|
|
163
|
-
}
|
|
163
|
+
});
|
|
164
164
|
record._changed.id = true;
|
|
165
165
|
if (changed) {
|
|
166
166
|
this.changed();
|
|
@@ -968,7 +968,7 @@
|
|
|
968
968
|
get_eval: function() {
|
|
969
969
|
var value = {};
|
|
970
970
|
for (var key in this.model.fields) {
|
|
971
|
-
if (!this.
|
|
971
|
+
if (!this._loaded.hasOwnProperty(key) && this.id >= 0)
|
|
972
972
|
continue;
|
|
973
973
|
value[key] = this.model.fields[key].get_eval(this);
|
|
974
974
|
}
|