changeset a49d85f225ed in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=a49d85f225ed
description:
Improve the layout of CSV import and export
issue8096
review46751002
diffstat:
CHANGELOG | 1 +
src/sao.less | 5 +-
src/window.js | 181 +++++++++++++++++++++++++++++++--------------------------
3 files changed, 101 insertions(+), 86 deletions(-)
diffs (338 lines):
diff -r 89c2b0b3a357 -r a49d85f225ed CHANGELOG
--- a/CHANGELOG Wed Feb 13 10:59:48 2019 +0100
+++ b/CHANGELOG Wed Feb 13 11:04:09 2019 +0100
@@ -1,3 +1,4 @@
+* Improve layout of CSV import/export
* Add support for height and width on notebook
* Use tab key for tab navigation
* Use record and field properties of widget instead of method arguments
diff -r 89c2b0b3a357 -r a49d85f225ed src/sao.less
--- a/src/sao.less Wed Feb 13 10:59:48 2019 +0100
+++ b/src/sao.less Wed Feb 13 11:04:09 2019 +0100
@@ -463,8 +463,9 @@
.csv {
.modal-dialog {
.column-fields {
- height: 35vh;
- overflow-y: scroll;
+ max-height: 400px;
+ overflow: auto;
+ white-space: nowrap;
}
}
}
diff -r 89c2b0b3a357 -r a49d85f225ed src/window.js
--- a/src/window.js Wed Feb 13 10:59:48 2019 +0100
+++ b/src/window.js Wed Feb 13 11:04:09 2019 +0100
@@ -893,7 +893,7 @@
"x-cp1255", "x-cp1256", "x-cp1257", "x-cp1258", "x-euc-jp",
"x-gbk",
"x-mac-cyrillic", "x-mac-roman", "x-mac-ukrainian", "x-sjis",
"x-user-defined", "x-x-big5"];
- this.dialog = new Sao.Dialog(title, 'csv', 'md');
+ this.dialog = new Sao.Dialog(title, 'csv', 'lg');
this.el = this.dialog.modal;
this.fields = {};
@@ -917,18 +917,21 @@
'class': 'row'
}).appendTo(this.dialog.body);
- jQuery('<hr/>').appendTo(this.dialog.body);
-
var column_fields_all = jQuery('<div/>', {
- 'class': 'col-md-4 column-fields'
- }).append(jQuery('<label/>', {
+ 'class': 'col-md-5',
+ }).append(jQuery('<div/>', {
+ 'class': 'panel panel-default',
+ }).append(jQuery('<div/>', {
+ 'class': 'panel-heading',
+ }).append(jQuery('<h3/>', {
+ 'class': 'panel-title',
'text': Sao.i18n.gettext('All Fields')
- })).appendTo(row_fields);
+ })))).appendTo(row_fields);
this.fields_all = jQuery('<ul/>', {
- 'class': 'list-unstyled'
+ 'class': 'list-unstyled column-fields panel-body'
}).css('cursor', 'pointer')
- .appendTo(column_fields_all);
+ .appendTo(column_fields_all.find('.panel'));
var prm = this.get_fields(this.screen.model_name)
.then(function(fields){
@@ -937,8 +940,8 @@
}.bind(this));
this.column_buttons = jQuery('<div/>', {
- 'class': 'col-md-4'
- }).append('<label/>').appendTo(row_fields);
+ 'class': 'col-md-2'
+ }).appendTo(row_fields);
var button_add = jQuery('<button/>', {
'class': 'btn btn-default btn-block',
@@ -973,18 +976,24 @@
jQuery('<hr>').appendTo(this.column_buttons);
var column_fields_selected = jQuery('<div/>', {
- 'class': 'col-md-4 column-fields'
- }).append(jQuery('<label/>', {
+ 'class': 'col-md-5',
+ }).append(jQuery('<div/>', {
+ 'class': 'panel panel-default',
+ }).append(jQuery('<div/>', {
+ 'class': 'panel-heading',
+ }).append(jQuery('<h3/>', {
+ 'class': 'panel-title',
'text': Sao.i18n.gettext('Fields Selected')
- })).appendTo(row_fields);
+ })))).appendTo(row_fields);
// TODO: Make them draggable to re-order
this.fields_selected = jQuery('<ul/>', {
- 'class': 'list-unstyled'
- }).css('cursor', 'pointer').appendTo(column_fields_selected);
+ 'class': 'list-unstyled column-fields panel-body',
+ }).css('cursor', 'pointer')
+ .appendTo(column_fields_selected.find('.panel'));
this.chooser_form = jQuery('<div/>', {
- 'class': 'form-inline'
+ 'class': 'row form-inline'
}).appendTo(this.dialog.body);
var row_csv_param = jQuery('<div/>', {
@@ -1008,12 +1017,12 @@
this.expander_csv = jQuery('<div/>', {
'id': 'expander_csv',
- 'class': 'collapse'
+ 'class': 'collapse col-md-12 form-inline'
}).appendTo(row_csv_param);
var delimiter_label = jQuery('<label/>', {
'text': Sao.i18n.gettext('Delimiter:'),
- 'class': 'col-sm-2 control-label',
+ 'class': 'control-label',
'for': 'input-delimiter'
});
@@ -1033,13 +1042,14 @@
jQuery('<div/>', {
'class': 'form-group'
- }).append(delimiter_label).append(jQuery('<div/>', {
- 'class': 'col-sm-4'
- }).append(this.el_csv_delimiter)).appendTo(this.expander_csv);
+ }).append(delimiter_label)
+ .append(this.el_csv_delimiter)
+ .appendTo(this.expander_csv);
+ this.expander_csv.append(' ');
var quotechar_label = jQuery('<label/>', {
'text': Sao.i18n.gettext('Quote Char:'),
- 'class': 'col-sm-2 control-label',
+ 'class': 'control-label',
'for': 'input-quotechar'
});
@@ -1054,14 +1064,14 @@
jQuery('<div/>', {
'class': 'form-group'
- }).append(quotechar_label).append(jQuery('<div/>', {
- 'class': 'col-sm-4'
- }).append(this.el_csv_quotechar))
- .appendTo(this.expander_csv);
+ }).append(quotechar_label)
+ .append(this.el_csv_quotechar)
+ .appendTo(this.expander_csv);
+ this.expander_csv.append(' ');
var encoding_label = jQuery('<label/>', {
'text': Sao.i18n.gettext('Encoding:'),
- 'class': 'col-sm-2 control-label',
+ 'class': 'control-label',
'for': 'input-encoding'
});
@@ -1086,10 +1096,10 @@
jQuery('<div/>', {
'class': 'form-group'
- }).append(encoding_label).append(jQuery('<div/>', {
- 'class': 'col-sm-4'
- }).append(this.el_csv_encoding))
- .appendTo(this.expander_csv);
+ }).append(encoding_label)
+ .append(this.el_csv_encoding)
+ .appendTo(this.expander_csv);
+ this.expander_csv.append(' ');
this.el.modal('show');
this.el.on('hidden.bs.modal', function() {
@@ -1151,11 +1161,9 @@
}).append(this.file_input))
.appendTo(this.chooser_form);
- jQuery('<hr>').insertAfter(this.chooser_form);
-
var skip_label = jQuery('<label/>', {
'text': Sao.i18n.gettext('Lines to Skip:'),
- 'class': 'col-sm-2 control-label',
+ 'class': 'control-label',
'for': 'input-skip'
});
@@ -1168,10 +1176,10 @@
jQuery('<div/>', {
'class': 'form-group'
- }).append(skip_label).append(jQuery('<div/>', {
- 'class': 'col-sm-4'
- }).append(this.el_csv_skip))
- .appendTo(this.expander_csv);
+ }).append(skip_label)
+ .append(this.el_csv_skip)
+ .appendTo(this.expander_csv);
+ this.expander_csv.append(' ');
},
sig_sel_add: function(el_field) {
el_field = jQuery(el_field);
@@ -1211,29 +1219,29 @@
}
}.bind(this)).appendTo(parent_view);
parent_node[field].view = node;
-
- if (parent_node[field].relation) {
- node.prepend(' ');
- var expander_icon = Sao.common.ICONFACTORY
- .get_icon_img('tryton-arrow-right')
- .data('expanded', false)
- .click(function(e) {
- e.stopPropagation();
- var icon;
- var expanded = expander_icon.data('expanded');
- expander_icon.data('expanded', !expanded);
- if (expanded) {
- icon = 'tryton-arrow-right';
- node.next('ul').remove();
- } else {
- icon = 'tryton-arrow-down';
- this.on_row_expanded(parent_node[field]);
- }
-
Sao.common.ICONFACTORY.get_icon_url(icon).then(function(url) {
+ var expander_icon = Sao.common.ICONFACTORY
+ .get_icon_img('tryton-arrow-right')
+ .data('expanded', false)
+ .click(function(e) {
+ e.stopPropagation();
+ var icon;
+ var expanded = expander_icon.data('expanded');
+ expander_icon.data('expanded', !expanded);
+ if (expanded) {
+ icon = 'tryton-arrow-right';
+ node.next('ul').remove();
+ } else {
+ icon = 'tryton-arrow-down';
+ this.on_row_expanded(parent_node[field]);
+ }
+ Sao.common.ICONFACTORY.get_icon_url(icon)
+ .then(function(url) {
expander_icon.attr('src', url);
});
- }.bind(this)).prependTo(node);
- }
+ }.bind(this)).prependTo(node);
+ expander_icon.css(
+ 'visibility',
+ parent_node[field].relation ? 'visible' : 'hidden');
}.bind(this));
},
model_populate: function (fields, parent_node, prefix_field,
@@ -1458,13 +1466,16 @@
.appendTo(this.column_buttons);
var predefined_exports_column = jQuery('<div/>', {
- 'class': 'col-md-12'
- }).append(jQuery('<label/>', {
+ 'class': 'panel panel-default',
+ }).append(jQuery('<div/>', {
+ 'class': 'panel-heading',
+ }).append(jQuery('<h3/>', {
+ 'class': 'panel-title',
'text': Sao.i18n.gettext('Predefined Exports')
- })).appendTo(this.column_buttons);
+ }))).appendTo(this.column_buttons);
this.predef_exports_list = jQuery('<ul/>', {
- 'class': 'list-unstyled predef-exports'
+ 'class': 'list-unstyled predef-exports panel-body'
}).css('cursor', 'pointer')
.appendTo(predefined_exports_column);
@@ -1476,10 +1487,11 @@
jQuery('<div/>', {
'class': 'form-group'
}).append(jQuery('<div/>', {
- 'class': 'col-md-6'
+ 'class': 'checkbox',
}).append(jQuery('<label/>', {
'text': ' '+Sao.i18n.gettext('Add Field Names')
}).prepend(this.el_add_field_names))).appendTo(this.expander_csv);
+ this.expander_csv.append(' ');
},
view_populate: function(parent_node, parent_view) {
var names = Object.keys(parent_node).sort(function(a, b) {
@@ -1506,28 +1518,29 @@
}.bind(this)).appendTo(parent_view);
parent_node[name].view = node;
- if (parent_node[name].children) {
- node.prepend(' ');
- var expander_icon = Sao.common.ICONFACTORY
- .get_icon_img('tryton-arrow-right')
- .data('expanded', false)
- .click(function(e) {
- e.stopPropagation();
- var icon;
- var expanded = expander_icon.data('expanded');
- expander_icon.data('expanded', !expanded);
- if (expanded) {
- icon = 'tryton-arrow-right';
- node.next('ul').remove();
- } else {
- icon = 'tryton-arrow-down';
- this.on_row_expanded(parent_node[name]);
- }
-
Sao.common.ICONFACTORY.get_icon_url(icon).then(function(url) {
+ var expander_icon = Sao.common.ICONFACTORY
+ .get_icon_img('tryton-arrow-right')
+ .data('expanded', false)
+ .click(function(e) {
+ e.stopPropagation();
+ var icon;
+ var expanded = expander_icon.data('expanded');
+ expander_icon.data('expanded', !expanded);
+ if (expanded) {
+ icon = 'tryton-arrow-right';
+ node.next('ul').remove();
+ } else {
+ icon = 'tryton-arrow-down';
+ this.on_row_expanded(parent_node[name]);
+ }
+ Sao.common.ICONFACTORY.get_icon_url(icon)
+ .then(function(url) {
expander_icon.attr('src', url);
});
- }.bind(this)).prependTo(node);
- }
+ }.bind(this)).prependTo(node);
+ expander_icon.css(
+ 'visibility',
+ parent_node[name].children ? 'visible' : 'hidden');
}.bind(this));
},
model_populate: function(fields, parent_node, prefix_field,