merge upstream
bzr revid: chs@openerp.com-20111117125432-zhfrcyrtwy9b9cv8 bzr revid: chs@openerp.com-20111118132606-6gh7zmrx7606w8fv
|
@ -515,7 +515,7 @@ class Root(object):
|
|||
request.parameter_storage_class = werkzeug.datastructures.ImmutableDict
|
||||
|
||||
if request.path == '/':
|
||||
params = urllib.urlencode(dict(request.args, debug=''))
|
||||
params = urllib.urlencode(request.args)
|
||||
return werkzeug.utils.redirect(self.root + '?' + params, 301)(
|
||||
environ, start_response)
|
||||
elif request.path == '/mobile':
|
||||
|
|
|
@ -338,7 +338,8 @@ class Session(openerpweb.Controller):
|
|||
"session_id": req.session_id,
|
||||
"uid": req.session._uid,
|
||||
"context": ctx,
|
||||
"db": req.session._db
|
||||
"db": req.session._db,
|
||||
"login": req.session._login
|
||||
}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
|
@ -347,7 +348,8 @@ class Session(openerpweb.Controller):
|
|||
return {
|
||||
"uid": req.session._uid,
|
||||
"context": req.session.get_context() if req.session._uid else False,
|
||||
"db": req.session._db
|
||||
"db": req.session._db,
|
||||
"login": req.session._login
|
||||
}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
// TODO: t-set + t-value + children node == scoped variable ?
|
||||
var QWeb2 = {
|
||||
expressions_cache: {},
|
||||
RESERVED_WORDS: 'true,false,NaN,null,undefined,debugger,in,instanceof,new,function,return,this,typeof,eval,Math,RegExp,Array,Object,Date'.split(','),
|
||||
RESERVED_WORDS: 'true,false,NaN,null,undefined,debugger,console,in,instanceof,new,function,return,this,typeof,eval,Math,RegExp,Array,Object,Date'.split(','),
|
||||
ACTIONS_PRECEDENCE: 'foreach,if,call,set,esc,escf,raw,rawf,js,debug,log'.split(','),
|
||||
WORD_REPLACEMENT: {
|
||||
'and': '&&',
|
||||
|
|
|
@ -809,33 +809,33 @@ label.error {
|
|||
also on the first and last children of the first and last row
|
||||
*/
|
||||
.openerp .oe-listview table.oe-listview-content {
|
||||
-webkit-border-radius: 7px;
|
||||
-moz-border-radius: 7px;
|
||||
border-radius: 7px;
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.openerp .oe-listview table.oe-listview-content thead tr:first-child th:first-child {
|
||||
-webkit-border-top-left-radius: 7px;
|
||||
-moz-border-radius-topleft: 7px;
|
||||
border-top-left-radius: 7px;
|
||||
-webkit-border-top-left-radius: 4px;
|
||||
-moz-border-radius-topleft: 4px;
|
||||
border-top-left-radius: 4px;
|
||||
}
|
||||
.openerp .oe-listview table.oe-listview-content thead tr:first-child th:last-child {
|
||||
-webkit-border-top-right-radius: 7px;
|
||||
-moz-border-radius-topright: 7px;
|
||||
border-top-right-radius: 7px;
|
||||
-webkit-border-top-right-radius: 4px;
|
||||
-moz-border-radius-topright: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
}
|
||||
.openerp .oe-listview table.oe-listview-content tfoot tr:last-child th:first-child,
|
||||
.openerp .oe-listview table.oe-listview-content tfoot tr:last-child td:first-child,
|
||||
.openerp .oe-listview table.oe-listview-content tbody:last-child tr:last-child th:first-child {
|
||||
-webkit-border-bottom-left-radius: 7px;
|
||||
-moz-border-radius-bottomleft: 7px;
|
||||
border-bottom-left-radius: 7px;
|
||||
-webkit-border-bottom-left-radius: 4px;
|
||||
-moz-border-radius-bottomleft: 4px;
|
||||
border-bottom-left-radius: 4px;
|
||||
}
|
||||
.openerp .oe-listview table.oe-listview-content tfoot tr:last-child th:last-child,
|
||||
.openerp .oe-listview table.oe-listview-content tfoot tr:last-child td:last-child,
|
||||
.openerp .oe-listview table.oe-listview-content tbody:last-child tr:last-child td:last-child {
|
||||
-webkit-border-bottom-right-radius: 7px;
|
||||
-moz-border-radius-bottomright: 7px;
|
||||
border-bottom-right-radius: 7px;
|
||||
-webkit-border-bottom-right-radius: 4px;
|
||||
-moz-border-radius-bottomright: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
|
||||
/* Notebook */
|
||||
|
@ -967,20 +967,25 @@ label.error {
|
|||
.openerp .oe_forms textarea {
|
||||
resize:vertical;
|
||||
}
|
||||
.openerp .oe_forms input[type="text"], .openerp .oe_forms input[type="password"], .openerp .oe_forms select, .openerp .oe_forms .button {
|
||||
.openerp .oe_forms input[type="text"], .openerp .oe_forms input[type="password"], .openerp .oe_forms select, .openerp .oe_forms .oe_button {
|
||||
height: 22px;
|
||||
}
|
||||
.openerp .oe_forms input.field_datetime {
|
||||
min-width: 11em;
|
||||
}
|
||||
.openerp .oe_forms.oe_frame .oe_datepicker_root {
|
||||
width: 100%;
|
||||
}
|
||||
.openerp .oe_forms .button {
|
||||
.openerp .oe_forms .oe_button {
|
||||
color: #4c4c4c;
|
||||
white-space: nowrap;
|
||||
min-width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
.openerp .oe_forms .button span {
|
||||
@-moz-document url-prefix() {
|
||||
/* Strange firefox behaviour on width: 100% + white-space: nowrap */
|
||||
.openerp .oe_forms .oe_button {
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
.openerp .oe_forms .oe_button span {
|
||||
position: relative;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
@ -989,13 +994,20 @@ label.error {
|
|||
cursor: pointer;
|
||||
right: 5px;
|
||||
top: 3px;
|
||||
z-index: 2;
|
||||
}
|
||||
.openerp .oe_datepicker_container {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
display: none;
|
||||
}
|
||||
.openerp .oe_datepicker_root {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
.openerp .oe_datepicker_root input[type="text"] {
|
||||
min-width: 160px;
|
||||
.openerp .oe_forms.oe_frame .oe_datepicker_root {
|
||||
width: 100%;
|
||||
}
|
||||
.openerp .oe_input_icon_disabled {
|
||||
position: absolute;
|
||||
|
@ -1003,7 +1015,7 @@ label.error {
|
|||
opacity: 0.5;
|
||||
filter:alpha(opacity=50);
|
||||
right: 5px;
|
||||
top: 5px;
|
||||
top: 3px;
|
||||
}
|
||||
.openerp img.oe_field_translate {
|
||||
margin-left: -21px;
|
||||
|
|
|
@ -125,7 +125,11 @@ openerp.web.callback = function(obj, method) {
|
|||
callback.callback_chain.splice(i, 1);
|
||||
i -= 1;
|
||||
}
|
||||
r = c.callback.apply(c.self, c.args.concat(args));
|
||||
var result = c.callback.apply(c.self, c.args.concat(args));
|
||||
if (c.callback === method) {
|
||||
// return the result of the original method
|
||||
r = result;
|
||||
}
|
||||
// TODO special value to stop the chain
|
||||
// openerp.web.callback_stop
|
||||
}
|
||||
|
@ -374,6 +378,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
this.rpc_mode = (this.server == hostname) ? "oe-json" : "oe-jsonp";
|
||||
this.session_id = false;
|
||||
this.uid = false;
|
||||
this.username = false;
|
||||
this.user_context= {};
|
||||
this.db = false;
|
||||
this.module_loading = $.Deferred();
|
||||
|
@ -525,10 +530,13 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
var self = this;
|
||||
var params = { db: db, login: login, password: password };
|
||||
return this.rpc("/web/session/login", params, function(result) {
|
||||
self.session_id = result.session_id;
|
||||
self.uid = result.uid;
|
||||
self.user_context = result.context;
|
||||
self.db = result.db;
|
||||
_.extend(self, {
|
||||
session_id: result.session_id,
|
||||
uid: result.uid,
|
||||
user_context: result.context,
|
||||
db: result.db,
|
||||
username: result.login
|
||||
});
|
||||
self.session_save();
|
||||
|
||||
self.on_session_valid(success_callback);
|
||||
|
@ -544,9 +552,12 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
var self = this;
|
||||
this.session_id = this.get_cookie('session_id');
|
||||
return this.rpc("/web/session/get_session_info", {}).then(function(result) {
|
||||
self.uid = result.uid;
|
||||
self.user_context = result.context;
|
||||
self.db = result.db;
|
||||
_.extend(self, {
|
||||
uid: result.uid,
|
||||
user_context: result.context,
|
||||
db: result.db,
|
||||
username: result.login
|
||||
});
|
||||
if (self.uid)
|
||||
self.on_session_valid(continuation);
|
||||
else
|
||||
|
|
|
@ -316,7 +316,7 @@ openerp.web.DataSet = openerp.web.Widget.extend( /** @lends openerp.web.DataSet
|
|||
def.reject();
|
||||
} else {
|
||||
fields = fields || false;
|
||||
return this.read_ids([this.ids[this.index]], fields).then(function(records) {
|
||||
this.read_ids([this.ids[this.index]], fields).then(function(records) {
|
||||
def.resolve(records[0]);
|
||||
}, function() {
|
||||
def.reject.apply(def, arguments);
|
||||
|
|
|
@ -76,7 +76,13 @@ openerp.web.format_value = function (value, descriptor, value_if_empty) {
|
|||
if (typeof value === 'number' && isNaN(value)) {
|
||||
value = false;
|
||||
}
|
||||
//noinspection FallthroughInSwitchStatementJS
|
||||
switch (value) {
|
||||
case '':
|
||||
if (descriptor.type === 'char') {
|
||||
return '';
|
||||
}
|
||||
console.warn('Field', descriptor, 'had an empty string as value, treating as false...');
|
||||
case false:
|
||||
case Infinity:
|
||||
case -Infinity:
|
||||
|
|
|
@ -41,7 +41,11 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search
|
|||
if (this.headless) {
|
||||
this.ready.resolve();
|
||||
} else {
|
||||
this.rpc("/web/searchview/load", {"model": this.model, "view_id":this.view_id}, this.on_loaded);
|
||||
this.rpc("/web/searchview/load", {
|
||||
model: this.model,
|
||||
view_id: this.view_id,
|
||||
context: this.dataset.get_context()
|
||||
}, this.on_loaded);
|
||||
}
|
||||
return this.ready.promise();
|
||||
},
|
||||
|
|
|
@ -140,7 +140,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
|||
// null index means we should start a new record
|
||||
promise = this.on_button_new();
|
||||
} else {
|
||||
promise = this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded);
|
||||
promise = this.dataset.read_index(_.keys(this.fields_view.fields)).pipe(this.on_record_loaded);
|
||||
}
|
||||
this.$element.show();
|
||||
if (this.sidebar) {
|
||||
|
@ -155,6 +155,8 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
|||
}
|
||||
},
|
||||
on_record_loaded: function(record) {
|
||||
var self = this,
|
||||
deferred_stack = $.Deferred.queue();
|
||||
if (!record) {
|
||||
throw("Form: No record received");
|
||||
}
|
||||
|
@ -172,33 +174,41 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
|||
this.$form_header.find('.oe_form_on_readonly').toggle(this.readonly);
|
||||
this.$form_header.find('.oe_form_on_editable').toggle(!this.readonly);
|
||||
this.datarecord = record;
|
||||
for (var f in this.fields) {
|
||||
var field = this.fields[f];
|
||||
|
||||
_(this.fields).each(function (field, f) {
|
||||
field.dirty = false;
|
||||
field.set_value(this.datarecord[f] || false);
|
||||
field.validate();
|
||||
}
|
||||
if (!record.id) {
|
||||
// New record: Second pass in order to trigger the onchanges
|
||||
this.show_invalid = false;
|
||||
for (var f in record) {
|
||||
var field = this.fields[f];
|
||||
if (field) {
|
||||
field.dirty = true;
|
||||
this.do_onchange(field);
|
||||
var result = field.set_value(self.datarecord[f] || false);
|
||||
if (result && _.isFunction(result.promise)) {
|
||||
deferred_stack.push(result);
|
||||
}
|
||||
$.when(result).then(function() {
|
||||
field.validate();
|
||||
});
|
||||
});
|
||||
deferred_stack.push('force resolution if no fields');
|
||||
return deferred_stack.then(function() {
|
||||
if (!record.id) {
|
||||
// New record: Second pass in order to trigger the onchanges
|
||||
self.show_invalid = false;
|
||||
for (var f in record) {
|
||||
var field = self.fields[f];
|
||||
if (field) {
|
||||
field.dirty = true;
|
||||
self.do_onchange(field);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.on_form_changed();
|
||||
this.initial_mutating_lock.resolve();
|
||||
this.show_invalid = true;
|
||||
this.do_update_pager(record.id == null);
|
||||
if (this.sidebar) {
|
||||
this.sidebar.attachments.do_update();
|
||||
}
|
||||
if (this.default_focus_field && !this.embedded_view) {
|
||||
this.default_focus_field.focus();
|
||||
}
|
||||
self.on_form_changed();
|
||||
self.initial_mutating_lock.resolve();
|
||||
self.show_invalid = true;
|
||||
self.do_update_pager(record.id == null);
|
||||
if (self.sidebar) {
|
||||
self.sidebar.attachments.do_update();
|
||||
}
|
||||
if (self.default_focus_field && !self.embedded_view) {
|
||||
self.default_focus_field.focus();
|
||||
}
|
||||
});
|
||||
},
|
||||
on_form_changed: function() {
|
||||
for (var w in this.widgets) {
|
||||
|
@ -354,12 +364,13 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
|||
var keys = _.keys(self.fields_view.fields);
|
||||
$.when(self.do_set_editable()).then(function() {
|
||||
if (keys.length) {
|
||||
self.dataset.default_get(keys).then(self.on_record_loaded).then(function() {
|
||||
self.dataset.default_get(keys).pipe(self.on_record_loaded).then(function() {
|
||||
def.resolve();
|
||||
});
|
||||
} else {
|
||||
self.on_record_loaded({});
|
||||
def.resolve();
|
||||
self.on_record_loaded({}).then(function() {
|
||||
def.resolve();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -476,8 +487,8 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
|||
// should not happen in the server, but may happen for internal purpose
|
||||
return $.Deferred().reject();
|
||||
} else {
|
||||
this.reload();
|
||||
return $.when(r).then(success);
|
||||
return $.when(this.reload()).pipe(function () {
|
||||
return $.when(r).then(success); }, null);
|
||||
}
|
||||
},
|
||||
/**
|
||||
|
@ -524,7 +535,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
|||
if (self.dataset.index == null || self.dataset.index < 0) {
|
||||
return $.when(self.on_button_new());
|
||||
} else {
|
||||
return self.dataset.read_index(_.keys(self.fields_view.fields), self.on_record_loaded);
|
||||
return self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_record_loaded);
|
||||
}
|
||||
};
|
||||
this.reload_lock = this.reload_lock.pipe(act, act);
|
||||
|
@ -550,12 +561,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
|||
});
|
||||
},
|
||||
is_dirty: function() {
|
||||
for (var f in this.fields) {
|
||||
if (this.fields[f].is_dirty()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return _.any(this.fields, function (value) {
|
||||
return value.is_dirty();
|
||||
});
|
||||
},
|
||||
is_interactible_record: function() {
|
||||
var id = this.datarecord.id;
|
||||
|
@ -1353,54 +1361,58 @@ openerp.web.DateTimeWidget = openerp.web.Widget.extend({
|
|||
template: "web.datetimepicker",
|
||||
jqueryui_object: 'datetimepicker',
|
||||
type_of_date: "datetime",
|
||||
init: function(parent) {
|
||||
this._super(parent);
|
||||
this.name = parent.name;
|
||||
},
|
||||
start: function() {
|
||||
var self = this;
|
||||
this.$element.find('input').change(this.on_change);
|
||||
this.$input = this.$element.find('input.oe_datepicker_master');
|
||||
this.$input_picker = this.$element.find('input.oe_datepicker_container');
|
||||
this.$input.change(this.on_change);
|
||||
this.picker({
|
||||
onSelect: this.on_picker_select,
|
||||
changeMonth: true,
|
||||
changeYear: true,
|
||||
showWeek: true,
|
||||
showButtonPanel: false
|
||||
showButtonPanel: true
|
||||
});
|
||||
this.$element.find('img.oe_datepicker_trigger').click(function() {
|
||||
if (!self.readonly) {
|
||||
self.picker('setDate', self.value ? openerp.web.auto_str_to_date(self.value) : new Date());
|
||||
self.$element.find('.oe_datepicker').toggle();
|
||||
self.$input_picker.show();
|
||||
self.picker('show');
|
||||
self.$input_picker.hide();
|
||||
}
|
||||
});
|
||||
this.$element.find('.ui-datepicker-inline').removeClass('ui-widget-content ui-corner-all');
|
||||
this.$element.find('button.oe_datepicker_close').click(function() {
|
||||
self.$element.find('.oe_datepicker').hide();
|
||||
});
|
||||
this.set_readonly(false);
|
||||
this.value = false;
|
||||
},
|
||||
picker: function() {
|
||||
return $.fn[this.jqueryui_object].apply(this.$element.find('.oe_datepicker_container'), arguments);
|
||||
return $.fn[this.jqueryui_object].apply(this.$input_picker, arguments);
|
||||
},
|
||||
on_picker_select: function(text, instance) {
|
||||
var date = this.picker('getDate');
|
||||
this.$element.find('input').val(date ? this.format_client(date) : '').change();
|
||||
this.$input.val(date ? this.format_client(date) : '').change();
|
||||
},
|
||||
set_value: function(value) {
|
||||
this.value = value;
|
||||
this.$element.find('input').val(value ? this.format_client(value) : '');
|
||||
this.$input.val(value ? this.format_client(value) : '');
|
||||
},
|
||||
get_value: function() {
|
||||
return this.value;
|
||||
},
|
||||
set_value_from_ui: function() {
|
||||
var value = this.$element.find('input').val() || false;
|
||||
var value = this.$input.val() || false;
|
||||
this.value = this.parse_client(value);
|
||||
},
|
||||
set_readonly: function(readonly) {
|
||||
this.readonly = readonly;
|
||||
this.$element.find('input').attr('disabled', this.readonly);
|
||||
this.$input.attr('disabled', this.readonly);
|
||||
this.$element.find('img.oe_datepicker_trigger').toggleClass('oe_input_icon_disabled', readonly);
|
||||
},
|
||||
is_valid: function(required) {
|
||||
var value = this.$element.find('input').val();
|
||||
var value = this.$input.val();
|
||||
if (value === "") {
|
||||
return !required;
|
||||
} else {
|
||||
|
@ -1413,7 +1425,7 @@ openerp.web.DateTimeWidget = openerp.web.Widget.extend({
|
|||
}
|
||||
},
|
||||
focus: function() {
|
||||
this.$element.find('input').focus();
|
||||
this.$input.focus();
|
||||
},
|
||||
parse_client: function(v) {
|
||||
return openerp.web.parse_value(v, {"widget": this.type_of_date});
|
||||
|
@ -1430,11 +1442,7 @@ openerp.web.DateTimeWidget = openerp.web.Widget.extend({
|
|||
|
||||
openerp.web.DateWidget = openerp.web.DateTimeWidget.extend({
|
||||
jqueryui_object: 'datepicker',
|
||||
type_of_date: "date",
|
||||
on_picker_select: function(text, instance) {
|
||||
this._super(text, instance);
|
||||
this.$element.find('.oe_datepicker').hide();
|
||||
}
|
||||
type_of_date: "date"
|
||||
});
|
||||
|
||||
openerp.web.form.FieldDatetime = openerp.web.form.Field.extend({
|
||||
|
@ -2112,7 +2120,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
|
|||
},
|
||||
reload_current_view: function() {
|
||||
var self = this;
|
||||
self.is_loaded = self.is_loaded.pipe(function() {
|
||||
return self.is_loaded = self.is_loaded.pipe(function() {
|
||||
var view = self.viewmanager.views[self.viewmanager.active_view].controller;
|
||||
if(self.viewmanager.active_view === "list") {
|
||||
return view.reload_content();
|
||||
|
@ -2185,8 +2193,8 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
|
|||
if (this.dataset.index === null && this.dataset.ids.length > 0) {
|
||||
this.dataset.index = 0;
|
||||
}
|
||||
self.reload_current_view();
|
||||
this.is_setted.resolve();
|
||||
self.is_setted.resolve();
|
||||
return self.reload_current_view();
|
||||
},
|
||||
get_value: function() {
|
||||
var self = this;
|
||||
|
|
|
@ -210,7 +210,7 @@ session.web.ViewManager = session.web.Widget.extend(/** @lends session.web.View
|
|||
sidebar_id : self.element_id + '_sidebar_' + view.view_type,
|
||||
action : self.action,
|
||||
action_views_ids : views_ids
|
||||
}, self.flags, view.options || {})
|
||||
}, self.flags, self.flags[view.view_type] || {}, view.options || {})
|
||||
});
|
||||
views_ids[view.view_type] = view.view_id;
|
||||
});
|
||||
|
|
|
@ -714,7 +714,7 @@
|
|||
</t>
|
||||
<t t-name="Widget">
|
||||
Unhandled widget
|
||||
<t t-raw="console.log('Unhandled widget', widget)"/>
|
||||
<t t-js="dict">console.warn('Unhandled widget', dict.widget);</t>
|
||||
</t>
|
||||
<t t-name="WidgetFrame">
|
||||
<table border="0" width="100%" cellpadding="0" cellspacing="0" class="oe_frame oe_forms">
|
||||
|
@ -907,13 +907,13 @@
|
|||
</t>
|
||||
<t t-name="web.datetimepicker">
|
||||
<div class="oe_datepicker_root">
|
||||
<input type="text" size="1" style="width: 100%"/>
|
||||
<input type="text" size="1" style="width: 100%"
|
||||
t-att-name="widget.name"
|
||||
t-attf-class="oe_datepicker_master field_#{widget.type_of_date}"
|
||||
/>
|
||||
<img class="oe_input_icon oe_datepicker_trigger" t-att-src='widget.session.server + "/web/static/src/img/ui/field_calendar.png"'
|
||||
title="Select date" width="16" height="16" border="0"/>
|
||||
<div class="oe_datepicker ui-widget-content ui-corner-all" style="display: none; position: absolute; z-index: 1;">
|
||||
<div class="oe_datepicker_container"/>
|
||||
<button type="button" class="oe_datepicker_close ui-state-default ui-priority-primary ui-corner-all" style="float: right;">Done</button>
|
||||
</div>
|
||||
<input type="text" size="1" class="oe_datepicker_container" disabled="disabled"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-name="FieldSelection">
|
||||
|
@ -1081,7 +1081,7 @@
|
|||
</table>
|
||||
</t>
|
||||
<t t-name="WidgetButton">
|
||||
<button type="button" style="width: 100%" class="button">
|
||||
<button type="button" class="oe_button">
|
||||
<img t-if="widget.node.attrs.icon" t-att-src="widget.session.server + '/web/static/src/img/icons/' + widget.node.attrs.icon + '.png'" width="16" height="16"/>
|
||||
<span t-if="widget.string"><t t-esc="widget.string"/></span>
|
||||
</button>
|
||||
|
@ -1163,8 +1163,8 @@
|
|||
t-att-title="attrs.help"
|
||||
t-att-class="classes.join(' ')"
|
||||
t-att-autofocus="attrs.default_focus === '1' ? 'autofocus' : undefined">
|
||||
<img t-if="attrs.icon" t-att-src="widget.session.server + '/web/static/src/img/icons/' + attrs.icon + '.png'" width="16" height="16"/>
|
||||
<br t-if="attrs.icon and attrs.string"/>
|
||||
<img t-att-src="widget.session.server + '/web/static/src/img/icons/' + (attrs.icon || 'gtk-home') + '.png'" width="16" height="16"/>
|
||||
<br t-if="attrs.string"/>
|
||||
<t t-esc="attrs.string"/>
|
||||
</button>
|
||||
<span t-name="SearchView.filters" class="filter_label_group"
|
||||
|
|
|
@ -119,20 +119,24 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
|
|||
scheduler.attachEvent('onDblClick', this.do_edit_event);
|
||||
scheduler.attachEvent('onBeforeLightbox', this.do_edit_event);
|
||||
|
||||
this.mini_calendar = scheduler.renderCalendar({
|
||||
container: this.sidebar.navigator.element_id,
|
||||
navigation: true,
|
||||
date: scheduler._date,
|
||||
handler: function(date, calendar) {
|
||||
scheduler.setCurrentView(date, 'day');
|
||||
}
|
||||
});
|
||||
if (this.options.sidebar) {
|
||||
this.mini_calendar = scheduler.renderCalendar({
|
||||
container: this.sidebar.navigator.element_id,
|
||||
navigation: true,
|
||||
date: scheduler._date,
|
||||
handler: function(date, calendar) {
|
||||
scheduler.setCurrentView(date, 'day');
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
refresh_scheduler: function() {
|
||||
scheduler.setCurrentView(scheduler._date);
|
||||
},
|
||||
refresh_minical: function() {
|
||||
scheduler.updateCalendar(this.mini_calendar);
|
||||
if (this.options.sidebar) {
|
||||
scheduler.updateCalendar(this.mini_calendar);
|
||||
}
|
||||
},
|
||||
reload_event: function(id) {
|
||||
this.dataset.read_ids([id], _.keys(this.fields), this.on_events_loaded);
|
||||
|
@ -192,7 +196,7 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
|
|||
scheduler.parse(res_events, 'json');
|
||||
this.refresh_scheduler();
|
||||
this.refresh_minical();
|
||||
if (!no_filter_reload) {
|
||||
if (!no_filter_reload && this.options.sidebar) {
|
||||
this.sidebar.responsible.on_events_loaded(sidebar_items);
|
||||
}
|
||||
},
|
||||
|
|
|
@ -218,9 +218,35 @@ openerp.web.form.DashBoard = openerp.web.form.Widget.extend({
|
|||
});
|
||||
},
|
||||
on_load_action: function(result) {
|
||||
var self = this;
|
||||
var action_orig = _.extend({}, result.result);
|
||||
var action = result.result;
|
||||
var self = this,
|
||||
action = result.result,
|
||||
action_attrs = this.actions_attrs[action.id],
|
||||
view_mode = action_attrs.view_mode;
|
||||
|
||||
// TODO: Use xmo's python evaluator when ready
|
||||
if (action_attrs.context) {
|
||||
action.context = _.extend(action.context || {}, action_attrs.context);
|
||||
}
|
||||
if (action_attrs.domain) {
|
||||
action.domain = action.domain || [];
|
||||
action.domain.push.apply(action.domain, action_attrs.domain);
|
||||
}
|
||||
var action_orig = _.extend({}, action);
|
||||
|
||||
if (view_mode && view_mode != action.view_mode) {
|
||||
var action_view_mode = action.view_mode.split(',');
|
||||
action.views = _.map(view_mode.split(','), function(mode) {
|
||||
if (_.indexOf(action_view_mode, mode) < 0) {
|
||||
return [false, mode == 'tree' ? 'list': mode];
|
||||
} else {
|
||||
mode = mode === 'tree' ? 'list' : mode;
|
||||
return _.find(action.views, function(view) {
|
||||
return view[1] == mode;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
action.flags = {
|
||||
search_view : false,
|
||||
sidebar : false,
|
||||
|
@ -228,7 +254,10 @@ openerp.web.form.DashBoard = openerp.web.form.Widget.extend({
|
|||
action_buttons : false,
|
||||
pager: false,
|
||||
low_profile: true,
|
||||
display_title: false
|
||||
display_title: false,
|
||||
list: {
|
||||
selectable: false
|
||||
}
|
||||
};
|
||||
var am = new openerp.web.ActionManager(this);
|
||||
this.action_managers.push(am);
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
<h1>Welcome to your new OpenERP instance.</h1>
|
||||
<div class="oe-static-home-banner">
|
||||
<li>Remember to bookmark this page.</li>
|
||||
<li>Remember your login: <i><t t-esc="session.login"/></i></li>
|
||||
<li>Remember your login: <t t-esc="session.username"/></li>
|
||||
<li>Choose the first OpenERP Application you want to install..</li>
|
||||
</div>
|
||||
<div class="oe-static-home-tiles">
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
<template>
|
||||
<t t-name="KanbanView">
|
||||
<div class="oe_kanban_header">
|
||||
<t t-if="widget.options.action_buttons !== false">
|
||||
<button type="button" class="oe_kanban_button_new">New</button>
|
||||
</t>
|
||||
</div>
|
||||
<div class="oe_kanban_view">
|
||||
<table style="width:100%;" class="oe_kanban_groups">
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"name" : "Process",
|
||||
"version" : "2.0",
|
||||
"depends" : ["web"],
|
||||
"js": [
|
||||
"static/src/js/process.js"
|
||||
],
|
||||
"css": [
|
||||
"static/src/css/process.css"
|
||||
],
|
||||
'qweb': [
|
||||
"static/src/xml/web_process.css"
|
||||
],
|
||||
'active': True
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
|
||||
a.cta-a {
|
||||
float: left;
|
||||
padding: 5px 10px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
background: #eeeded url(/web_process/static/src/img/cta-a.gif) repeat-x;
|
||||
box-shadow: 0 1px 0 #fff;
|
||||
-moz-box-shadow: 0 1px 0 #fff;
|
||||
-webkit-box-shadow: 0 1px 0 #fff;
|
||||
color: #8c8c8c;
|
||||
font-size: 0.9em;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
text-shadow: #fff 0 1px 0;
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
a.cta-a span {
|
||||
float: left;
|
||||
padding: 7px 0 5px 5px;
|
||||
background-position: 0 50%;
|
||||
background-repeat: no-repeat;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a.cta-a strong {
|
||||
display: block;
|
||||
color: #393939;
|
||||
}
|
||||
|
||||
.process_h1 {
|
||||
background:url("/web_process/static/src/img/sep-a.gif") repeat-x scroll 0 90% transparent;
|
||||
font-size:2em;
|
||||
font-weight:normal;
|
||||
padding:0 0 5px 5px;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.process-links {
|
||||
padding: 5px 10px;
|
||||
text-align: center;
|
||||
display: table;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.process-links a.cta-a {
|
||||
display: table-cell;
|
||||
}
|
||||
|
||||
.process-help-text {
|
||||
float: left;
|
||||
padding:5px 10px;
|
||||
min-height:56px;
|
||||
font-size: 120%;
|
||||
}
|
||||
|
||||
td.process_fields,button.toggle_fields span:last-child {
|
||||
display: none;
|
||||
}
|
After Width: | Height: | Size: 650 B |
After Width: | Height: | Size: 635 B |
After Width: | Height: | Size: 810 B |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 108 B |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 379 B |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 166 B |
After Width: | Height: | Size: 43 B |
After Width: | Height: | Size: 128 B |
After Width: | Height: | Size: 200 B |
|
@ -0,0 +1,309 @@
|
|||
openerp.web_process = function (openerp) {
|
||||
var QWeb = openerp.web.qweb;
|
||||
openerp.web.ViewManager.include({
|
||||
start: function() {
|
||||
this._super();
|
||||
var self = this;
|
||||
this.process_check();
|
||||
this.process_help = this.action ? this.action.help : 'Help: Not Defined';
|
||||
this.model = this.dataset.model;
|
||||
if(this.action) this.process_model = this.action.res_model;
|
||||
else this.process_model = this.model;
|
||||
},
|
||||
process_check: function() {
|
||||
var self = this,
|
||||
grandparent = this.widget_parent && this.widget_parent.widget_parent,
|
||||
view = this.views[this.views_src[0].view_type],
|
||||
$process_view = this.$element.find('.oe-process-view');
|
||||
if (!(grandparent instanceof openerp.web.WebClient) ||
|
||||
!(view.view_type === this.views_src[0].view_type
|
||||
&& view.view_id === this.views_src[0].view_id)) {
|
||||
$process_view.hide();
|
||||
return;
|
||||
}
|
||||
$process_view.click(function() {
|
||||
self.initialize_process_view();
|
||||
});
|
||||
},
|
||||
initialize_process_view: function() {
|
||||
var self = this;
|
||||
$.when(this.fields_get(), this.help(), this.get_process_object()).pipe(function(fields, help, process) {
|
||||
self.process_fields = fields;
|
||||
self.process_help = help;
|
||||
if(process && process.length) {
|
||||
if(process.length > 1) {
|
||||
self.process_selection = process;
|
||||
} else {
|
||||
self.process_id = process[0][0],
|
||||
self.process_title = process[0][1];
|
||||
}
|
||||
}
|
||||
return $.Deferred().resolve();
|
||||
}).pipe(function() {
|
||||
var def = $.Deferred();
|
||||
if(self.process_id) {
|
||||
self.graph_get().done(function(res) {
|
||||
self.process_notes = res.notes;
|
||||
self.process_subflows = _.filter(res.nodes, function(x) {
|
||||
return x.subflow != false;
|
||||
});
|
||||
self.process_related = res.related;
|
||||
def.resolve(res);
|
||||
});
|
||||
} else def.resolve();
|
||||
return def.promise();
|
||||
}).done(function(res) {
|
||||
$.when(self.render_process_view()).done(function() {
|
||||
if(res) self.draw_process_graph(res);
|
||||
});
|
||||
});
|
||||
},
|
||||
graph_get: function() {
|
||||
var self = this;
|
||||
var def = $.Deferred();
|
||||
this.process_id = parseInt(this.process_id, 10);
|
||||
|
||||
this.process_dataset
|
||||
.call("graph_get",[this.process_id, this.model || this.dataset.model, false, [80,80,150,100]])
|
||||
.done(function(res) {
|
||||
self.process_dataset
|
||||
.call("search_by_model",[self.model || self.dataset.model,self.session.context])
|
||||
.done(
|
||||
function(r) {
|
||||
res['related'] = r;
|
||||
def.resolve(res);
|
||||
});
|
||||
});
|
||||
return def.promise();
|
||||
},
|
||||
fields_get : function() {
|
||||
var self = this,
|
||||
def = $.Deferred(),
|
||||
dataset = new openerp.web.DataSetStatic(this, this.model || this.dataset.model, this.session.context);
|
||||
dataset
|
||||
.call('fields_get',[])
|
||||
.done(function(fields) {
|
||||
def.resolve(fields);
|
||||
}).fail(def.reject);
|
||||
return def.promise();
|
||||
},
|
||||
help : function() {
|
||||
var self = this,
|
||||
def = $.Deferred();
|
||||
if(!this.subflow_model) {
|
||||
def.resolve(this.action ? (this.action.help!=false ? this.action.help : 'Help: Not Defined') : 'Help: Not Defined');
|
||||
} else {
|
||||
var dataset = new openerp.web.DataSetSearch(this, "ir.actions.act_window", this.session.context, []);
|
||||
dataset
|
||||
.read_slice(['help'],
|
||||
{
|
||||
domain: [
|
||||
['res_model', '=', this.subflow_model],
|
||||
['name', 'ilike', this.subflow_name]
|
||||
]
|
||||
}
|
||||
).done(function(res) {
|
||||
def.resolve(res.help || 'Help: Not Defined');
|
||||
});
|
||||
}
|
||||
return def.promise();
|
||||
},
|
||||
get_process_object : function() {
|
||||
var self = this,
|
||||
def = $.Deferred();
|
||||
if(this.process_id)
|
||||
return def.resolve().promise();
|
||||
|
||||
this.process_dataset = new openerp.web.DataSetStatic(this, "process.process", this.session.context);
|
||||
this.process_dataset
|
||||
.call("search_by_model", [self.process_model,self.session.context])
|
||||
.done(function(res) {
|
||||
if (!res.length) {
|
||||
self.process_model = false;
|
||||
self.get_process_object().done(def.resolve);
|
||||
}
|
||||
else {
|
||||
def.resolve(res);
|
||||
}
|
||||
})
|
||||
.fail(def.reject);
|
||||
return def.promise();
|
||||
},
|
||||
render_process_view : function() {
|
||||
this.$element.html(QWeb.render("ProcessView", this));
|
||||
var self = this;
|
||||
this.$element.find('#edit_process').click(function() {
|
||||
self.edit_process_view();
|
||||
});
|
||||
var $parent = this.widget_parent.$element;
|
||||
$parent.find('#change_process').click(function() {
|
||||
self.process_selection = false,
|
||||
self.process_id = $parent.find('#select_process').val(),
|
||||
self.process_title = $.trim($parent.find('#select_process option:selected').text());
|
||||
self.initialize_process_view();
|
||||
});
|
||||
|
||||
this.$element.find(".toggle_fields").click(function() {
|
||||
$(this).children().toggle();
|
||||
self.$element.find('.process_fields').toggle();
|
||||
});
|
||||
|
||||
this.$element.find(".process_subflow").click(function() {
|
||||
self.process_id = this.id;
|
||||
self.initialize_process_view();
|
||||
});
|
||||
},
|
||||
draw_process_graph : function(res) {
|
||||
var self = this,
|
||||
process_graph = new Graph();
|
||||
var process_renderer = function(r, n) {
|
||||
var process_node,
|
||||
process_node_text,
|
||||
process_node_desc,
|
||||
process_set;
|
||||
|
||||
var node_button,
|
||||
node_menu,
|
||||
img_src;
|
||||
|
||||
var bg = "node",
|
||||
clip_rect = "".concat(n.node.x,",",n.node.y,",150,100");
|
||||
|
||||
//Image part
|
||||
bg = n.node.kind == "subflow" ? "node-subflow" : "node";
|
||||
bg = n.node.gray ? bg + "-gray" : bg;
|
||||
img_src = '/web_process/static/src/img/'+ bg + '.png';
|
||||
|
||||
r['image'](img_src, n.node.x, n.node.y,150, 100)
|
||||
.attr({"clip-rect": clip_rect})
|
||||
.mousedown(function() {
|
||||
return false;
|
||||
});
|
||||
//Node
|
||||
process_node = r['rect'](n.node.x, n.node.y, 150, 100).attr({stroke: "none"});
|
||||
// Node text
|
||||
process_node_text = r.text(n.node.x, n.node.y, (n.node.name))
|
||||
.attr({"fill": "#fff", "font-weight": "bold", "cursor": "pointer"});
|
||||
process_node_text.translate((process_node.getBBox().width/ 2) + 5, 10)
|
||||
if(n.node.subflow) {
|
||||
process_node_text.click(function() {
|
||||
self.process_id = n.node.subflow[0];
|
||||
self.subflow_model = n.node.model;
|
||||
self.subflow_name = n.node.name;
|
||||
self.initialize_process_view();
|
||||
});
|
||||
}
|
||||
//Node Description
|
||||
new_notes = n.node.notes;
|
||||
if(n.node.notes.length > 25) {
|
||||
var new_notes= temp_str = '';
|
||||
var from = to = 0;
|
||||
while (1) {
|
||||
from = 25;
|
||||
temp_str = n.node.notes.substr(to ,25);
|
||||
if (temp_str.lastIndexOf(" ") < 25 && temp_str.length >= 25) {
|
||||
from = temp_str.lastIndexOf(" ");
|
||||
}
|
||||
new_notes += "\n" + n.node.notes.substr(to , from);
|
||||
if(new_notes.length > n.node.notes.length) break;
|
||||
to += from;
|
||||
}
|
||||
}
|
||||
process_node_desc = r.text(n.node.x+85, n.node.y+50, (new_notes));
|
||||
r['image']('/web/static/src/img/icons/gtk-info.png', n.node.x+20, n.node.y+70, 16, 16)
|
||||
.attr({"cursor": "pointer", "title": "Help"})
|
||||
.click(function() {
|
||||
window.open(n.node.url || "http://doc.openerp.com/v6.0/index.php?model=" + n.node.model);
|
||||
});
|
||||
|
||||
if(n.node.menu) {
|
||||
r['image']('/web/static/src/img/icons/gtk-jump-to.png', n.node.x+115, n.node.y+70, 16, 16)
|
||||
.attr({"cursor": "pointer", "title": n.node.menu.name})
|
||||
.click(function() {
|
||||
self.jump_to_view(n.node.res_model, n.node.menu.id);
|
||||
});
|
||||
}
|
||||
|
||||
process_set = r.set().push(process_node);
|
||||
process_set.mousedown(function() {
|
||||
return false;
|
||||
});
|
||||
return process_set;
|
||||
};
|
||||
|
||||
_.each(res['nodes'],function(node, node_id) {
|
||||
node['res_model'] = self.model,
|
||||
node['res_id'] = false,
|
||||
node['id'] = node_id;
|
||||
process_graph.addNode(node['name'], {node: node,render: process_renderer});
|
||||
});
|
||||
|
||||
_.each(res['transitions'], function(transitions) {
|
||||
var src = res['nodes'][transitions['source']];
|
||||
var dst = res['nodes'][transitions['target']];
|
||||
// make active
|
||||
transitions['active'] = src.active && !dst.gray;
|
||||
process_graph.addEdge(src['name'], dst['name'], {directed : true});
|
||||
});
|
||||
|
||||
var layouter = new Graph.Layout.Ordered(process_graph);
|
||||
var render_process_graph = new Graph.Renderer.Raphael('process_canvas', process_graph, $('#process_canvas').width(), $('#process_canvas').height());
|
||||
},
|
||||
jump_to_view: function(model, id) {
|
||||
var self = this;
|
||||
var dataset = new openerp.web.DataSetStatic(this, 'ir.values', this.session.context);
|
||||
dataset.call('get',
|
||||
['action', 'tree_but_open',[['ir.ui.menu', id]], dataset.context],
|
||||
function(res) {
|
||||
self.$element.empty();
|
||||
var action = res[0][res[0].length - 1];
|
||||
self.rpc("/web/action/load", {
|
||||
action_id: action.id,
|
||||
context: dataset.context
|
||||
}, function(result) {
|
||||
var action_manager = new openerp.web.ActionManager(self);
|
||||
action_manager.appendTo(self.widget_parent.$element);
|
||||
action_manager.do_action(result.result);
|
||||
});
|
||||
});
|
||||
},
|
||||
edit_process_view: function() {
|
||||
var self = this;
|
||||
var action_manager = new openerp.web.ActionManager(this);
|
||||
var dialog = new openerp.web.Dialog(this, {
|
||||
width: 800,
|
||||
height: 600,
|
||||
buttons : {
|
||||
Cancel : function() {
|
||||
$(this).dialog('destroy');
|
||||
},
|
||||
Save : function() {
|
||||
var form_view = action_manager.inner_viewmanager.views.form.controller;
|
||||
|
||||
form_view.do_save(function() {
|
||||
self.initialize_process_view();
|
||||
});
|
||||
$(this).dialog('destroy');
|
||||
}
|
||||
}
|
||||
}).start().open();
|
||||
|
||||
action_manager.appendTo(dialog.$element);
|
||||
action_manager.do_action({
|
||||
res_model : 'process.process',
|
||||
res_id: self.process_id,
|
||||
views : [[false, 'form']],
|
||||
type : 'ir.actions.act_window',
|
||||
auto_search : false,
|
||||
flags : {
|
||||
search_view: false,
|
||||
sidebar : false,
|
||||
views_switcher : false,
|
||||
action_buttons : false,
|
||||
pager: false
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
};
|
||||
// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax:
|
|
@ -0,0 +1,143 @@
|
|||
<template>
|
||||
<t t-extend="ViewManager" t-name="ViewManagerAction">
|
||||
<t t-jquery=".oe-view-manager-header" t-operation="append">
|
||||
<img class="oe-process-view" src="/web/static/src/img/icons/gtk-help.png" title="ProcessView"/>
|
||||
</t>
|
||||
</t>
|
||||
<t t-name="ProcessView">
|
||||
<table class="view" border="0" width="100%" height="100%" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td width="75%" valign="top" class="fields collapsed" style="padding-top:10px;">
|
||||
<h1 class="process_h1">
|
||||
<t t-esc="action.name"/> (<t t-esc="model"/>)
|
||||
</h1>
|
||||
<p class="process-links">
|
||||
<a class="cta-a" target="_blank" href="#">
|
||||
<span>
|
||||
<strong>Documentation</strong>
|
||||
Read Documentation Online
|
||||
</span>
|
||||
</a>
|
||||
<a class="cta-a" target="_blank" href="http://www.openerp.com/forum/">
|
||||
<span>
|
||||
<strong>Forum</strong>
|
||||
Community Discussion
|
||||
</span>
|
||||
</a>
|
||||
<a class="cta-a" target="_blank" href="http://www.openerp.com/services/books">
|
||||
<span>
|
||||
<strong>Books</strong>
|
||||
Get the book on Amazon
|
||||
</span>
|
||||
</a>
|
||||
<a class="cta-a" target="_blank" href="http://www.openerp.com/services/subscribe-onsite">
|
||||
<span>
|
||||
<strong>Support / Publisher Warranty</strong>
|
||||
Get the OpenERP Warranty
|
||||
</span>
|
||||
</a>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p><t t-esc="process_help"/></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<h2>
|
||||
<t t-esc="process_title"/> Process
|
||||
</h2>
|
||||
<t t-if="process_notes">
|
||||
<p>
|
||||
<strong>Notes:</strong> <t t-esc="process_notes"/>
|
||||
</p>
|
||||
<p>
|
||||
<strong>Last modified by:</strong> N/A
|
||||
</p>
|
||||
<t t-if="process_subflows.length">
|
||||
<strong>Subflows:</strong>
|
||||
|
||||
<t t-foreach="process_subflows" t-as="subflow">
|
||||
<t t-if="subflow.subflow[0] != process_id">
|
||||
<p>
|
||||
<a class="process_subflow" t-att-id="subflow.subflow[0]" href="javascript: void(0)">
|
||||
<t t-esc="subflow.subflow[1]"/>
|
||||
</a>
|
||||
</p>
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
<t t-if="process_related.length and process_related[0][0] != process_id">
|
||||
<strong>Related:</strong>
|
||||
<p>
|
||||
<a class="process_subflow" t-att-id="process_related[0][0]" href="javascript: void(0)">
|
||||
<t t-esc="process_related[0][1]"/>
|
||||
</a>
|
||||
</p>
|
||||
</t>
|
||||
</t>
|
||||
</td>
|
||||
</tr>
|
||||
<tr t-if="process_selection">
|
||||
<td>
|
||||
<fieldset>
|
||||
<legend>
|
||||
Select Process
|
||||
</legend>
|
||||
<select id="select_process">
|
||||
<t t-foreach="process_selection" t-as="prc">
|
||||
<option t-att-value="prc[0]">
|
||||
<t t-esc="prc[1]"/>
|
||||
</option>
|
||||
</t>
|
||||
</select>
|
||||
<button id="change_process">Select</button>
|
||||
</fieldset>
|
||||
</td>
|
||||
</tr>
|
||||
<tr t-if="process_id">
|
||||
<td>
|
||||
<div id="process_canvas" style="overflow: auto;"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr t-if="process_id">
|
||||
<td>
|
||||
<button id="edit_process">Edit Process</button>
|
||||
<button class="toggle_fields">
|
||||
<span>Show Fields</span>
|
||||
<span>Hide Fields</span>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr t-if="process_id">
|
||||
<td class="process_fields">
|
||||
<table>
|
||||
<t t-foreach="process_fields" t-as="field">
|
||||
<tr>
|
||||
<td>
|
||||
<t t-esc="field"/>
|
||||
</td>
|
||||
<td>
|
||||
<table>
|
||||
<t t-foreach="field_value" t-as="fld">
|
||||
<tr>
|
||||
<td>
|
||||
<t t-esc="fld"/>:
|
||||
</td>
|
||||
<td>
|
||||
<t t-esc="fld_value"/>
|
||||
</td>
|
||||
</tr>
|
||||
</t>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</t>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</t>
|
||||
</template>
|