changeset 1f85e96c0a8f in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=1f85e96c0a8f
description:
        Add symbol widget

        issue9059
        review276871002
diffstat:

 CHANGELOG        |   1 +
 COPYRIGHT        |   2 ++
 src/model.js     |  21 +++++++++++++++++++++
 src/screen.js    |   4 ++++
 src/view/form.js |  34 ++++++++++++++++++++++++++++++++--
 src/view/tree.js |  54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 114 insertions(+), 2 deletions(-)

diffs (198 lines):

diff -r d9f2bb167506 -r 1f85e96c0a8f CHANGELOG
--- a/CHANGELOG Thu Oct 08 21:30:30 2020 +0200
+++ b/CHANGELOG Fri Oct 09 19:09:06 2020 +0200
@@ -1,3 +1,4 @@
+* Manage symbol widget
 * Fallback to model name as title
 * Set treeview footer sticky on bottom
 * Add get, in_ and contains methods to PYSON
diff -r d9f2bb167506 -r 1f85e96c0a8f COPYRIGHT
--- a/COPYRIGHT Thu Oct 08 21:30:30 2020 +0200
+++ b/COPYRIGHT Fri Oct 09 19:09:06 2020 +0200
@@ -4,6 +4,8 @@
 Copyright (C) 2012-2020 B2CK SPRL.
 Copyright (C) 2019 Jitbit.
 Copyright (C) 2013 Thomas Park
+Copyright (C) 2020 Maxime Richez
+Copyright (C) 2020 SALUC SA
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff -r d9f2bb167506 -r 1f85e96c0a8f src/model.js
--- a/src/model.js      Thu Oct 08 21:30:30 2020 +0200
+++ b/src/model.js      Fri Oct 09 19:09:06 2020 +0200
@@ -1832,6 +1832,27 @@
             var shift = Math.round(Math.log(Math.abs(factor)) / Math.LN10);
             return [digits[0] + shift, digits[1] - shift];
         },
+        get_symbol: function(record, symbol) {
+            if (record && (symbol in record.model.fields)) {
+                var value = this.get(record) || 0;
+                var sign = 1;
+                if (value < 0) {
+                    sign = -1;
+                } else if (value === 0) {
+                    sign = 0;
+                }
+                var symbol_field = record.model.fields[symbol];
+                var symbol_name = symbol_field.description.relation;
+                var symbol_id = symbol_field.get(record);
+                if (symbol_name && (symbol_id !== null) && (symbol_id >= 0)) {
+                    return Sao.rpc({
+                        'method': 'model.' + symbol_name + '.get_symbol',
+                        'params': [symbol_id, sign, record.get_context()],
+                    }, record.model.session, false) || ['', 1];
+                }
+            }
+            return ['', 1];
+        },
         check_required: function(record) {
             var state_attrs = this.get_state_attrs(record);
             if (state_attrs.required == 1) {
diff -r d9f2bb167506 -r 1f85e96c0a8f src/screen.js
--- a/src/screen.js     Thu Oct 08 21:30:30 2020 +0200
+++ b/src/screen.js     Fri Oct 09 19:09:06 2020 +0200
@@ -1671,6 +1671,10 @@
                                 }
                             });
                         }
+                        var symbol = node.getAttribute('symbol');
+                        if (symbol && !(symbol in dom_fields)) {
+                            dom_fields[symbol] = fields[symbol];
+                        }
                     }
                 });
                 fields = dom_fields;
diff -r d9f2bb167506 -r 1f85e96c0a8f src/view/form.js
--- a/src/view/form.js  Thu Oct 08 21:30:30 2020 +0200
+++ b/src/view/form.js  Fri Oct 09 19:09:06 2020 +0200
@@ -1784,6 +1784,14 @@
         init: function(view, attributes) {
             Sao.View.Form.Integer._super.init.call(this, view, attributes);
             this.input_text = this.labelled = integer_input(this.input);
+            if (this.attributes.symbol) {
+                this.symbol_start = jQuery('<span/>', {
+                    'class': 'input-group-addon symbol symbol-start'
+                }).prependTo(this.group);
+                this.symbol_end = jQuery('<span/>', {
+                    'class': 'input-group-addon symbol symbol-end'
+                }).appendTo(this.group);
+            }
             this.group.css('width', '');
             this.factor = Number(attributes.factor || 1);
         },
@@ -1825,12 +1833,34 @@
             return 8;
         },
         display: function() {
+            var set_symbol = function(el, text) {
+                if (text) {
+                    el.text(text);
+                    el.show();
+                } else {
+                    el.text('');
+                    el.hide();
+                }
+            };
             Sao.View.Form.Integer._super.display.call(this);
-            var field = this.field;
+            var field = this.field,
+                record = this.record;
             var value = '';
             this.el.css('width', this.width + 'ch');
             if (field) {
-                value = field.get_client(this.record, this.factor);
+                value = field.get_client(record, this.factor);
+            }
+            if (field && this.attributes.symbol) {
+                var result = field.get_symbol(record, this.attributes.symbol);
+                var symbol = result[0],
+                    position = result[1];
+                if (position < 0.5) {
+                    set_symbol(this.symbol_start, symbol);
+                    set_symbol(this.symbol_end, '');
+                } else {
+                    set_symbol(this.symbol_start, '');
+                    set_symbol(this.symbol_end, symbol);
+                }
             }
             this.input_text.val(value);
             this.input_text.attr('maxlength', this.input.attr('maxlength'));
diff -r d9f2bb167506 -r 1f85e96c0a8f src/view/tree.js
--- a/src/view/tree.js  Thu Oct 08 21:30:30 2020 +0200
+++ b/src/view/tree.js  Fri Oct 09 19:09:06 2020 +0200
@@ -77,6 +77,12 @@
             if ('icon' in attributes) {
                 column.prefixes.push(new Sao.View.Tree.Affix(attributes));
             }
+            if ('symbol' in attributes) {
+                column.prefixes.push(
+                    new Sao.View.Tree.Symbol(attributes, 0));
+                column.suffixes.push(
+                    new Sao.View.Tree.Symbol(attributes, 1));
+            }
             var affix, affix_attributes;
             var affixes = node.childNodes;
             for (var i = 0; i < affixes.length; i++) {
@@ -702,6 +708,9 @@
                             'boolean': 3,
                             'binary': 20,
                         }[column.attributes.widget] || 10;
+                        if (column.attributes.symbol) {
+                            width += 2;
+                        }
                         var factor = 1;
                         if (column.attributes.expand) {
                             factor += parseInt(column.attributes.expand, 10);
@@ -1999,6 +2008,51 @@
         }
     });
 
+    Sao.View.Tree.Symbol = Sao.class_(Object, {
+        class_: 'column-symbol',
+        init: function(attributes, position) {
+            this.attributes = attributes;
+            this.position = position;
+        },
+        get_cell: function() {
+            var cell = jQuery('<span/>', {
+                'class': this.class_,
+                'tabindex': 0
+            });
+            return cell;
+        },
+        render: function(record, cell) {
+            if (!cell) {
+                cell = this.get_cell();
+            }
+            var render = function() {
+                var field = record.model.fields[this.attributes.name];
+                var invisible = field.get_state_attrs(record).invisible;
+                if (invisible) {
+                    cell.text('');
+                    cell.hide();
+                    return;
+                }
+                var result = field.get_symbol(record, this.attributes.symbol);
+                var symbol = result[0],
+                    position = result[1];
+                if (Math.round(position) === this.position) {
+                    cell.text(symbol);
+                    cell.show();
+                } else {
+                    cell.text('');
+                    cell.hide();
+                }
+            }.bind(this);
+            if (!record.is_loaded(this.attributes.name)) {
+                record.load(this.attributes.name).done(render);
+            } else {
+                render();
+            }
+            return cell;
+        },
+    });
+
     Sao.View.Tree.CharColumn = Sao.class_(Object, {
         class_: 'column-char',
         init: function(model, attributes) {

Reply via email to