diff --git a/front/core/components/popover/popover.js b/front/core/components/popover/popover.js
index c999514cd..38f566135 100644
--- a/front/core/components/popover/popover.js
+++ b/front/core/components/popover/popover.js
@@ -75,9 +75,19 @@ export default class Popover extends Component {
if (parent) this.parent = parent;
let isDescriptorMoreMenu = parent && parent.attributes[0].nodeValue == 'more-button';
- const leftMenu = this.document.querySelector('div[class="menu left"]');
+ let leftMenu = this.document.querySelector('div[class="menu left"]');
if (isDescriptorMoreMenu && leftMenu) {
+ let leftMenuWidth = leftMenu.offsetWidth;
+ let descriptorDiv = this.document.querySelector('vn-side-menu div');
+
+ let descriptorWidth = descriptorDiv.offsetWidth;
+ this.scrollbarWidth = leftMenuWidth - descriptorWidth;
+ let newWidth = leftMenuWidth - this.scrollbarWidth;
+
leftMenu.style.overflow = 'hidden';
+ leftMenu.style.minWidth = `${newWidth}px`;
+ leftMenu.style.width = `${newWidth}px`;
+
this.restoreOverflow = true;
}
@@ -106,7 +116,12 @@ export default class Popover extends Component {
if (this.restoreOverflow) {
const leftMenu = this.document.querySelector('div[class="menu left"]');
+ let leftMenuWidth = parseInt(leftMenu.style.width);
+ let newWidth = leftMenuWidth + this.scrollbarWidth;
leftMenu.style.overflow = 'auto';
+ leftMenu.style.minWidth = `${newWidth}px`;
+ leftMenu.style.width = `${newWidth}px`;
+
this.restoreOverflow = false;
}
this._shown = false;
diff --git a/modules/agency/back/methods/zone-geo/getLeaves.js b/modules/agency/back/methods/zone-geo/getLeaves.js
deleted file mode 100644
index bfcef08ae..000000000
--- a/modules/agency/back/methods/zone-geo/getLeaves.js
+++ /dev/null
@@ -1,155 +0,0 @@
-
-const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
-
-module.exports = Self => {
- Self.remoteMethod('getLeaves', {
- description: 'Returns the first shipped and landed possible for params',
- accepts: [{
- arg: 'zoneFk',
- type: 'Number',
- required: true,
- },
- {
- arg: 'parentFk',
- type: 'Number',
- default: 1,
- required: false,
- },
- {
- arg: 'filter',
- type: 'Object',
- description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string',
- http: {source: 'query'}
- }],
- returns: {
- type: ['object'],
- root: true
- },
- http: {
- path: `/getLeaves`,
- verb: 'GET'
- }
- });
-
- Self.getLeaves = async(zoneFk, parentFk = null, filter) => {
- let conn = Self.dataSource.connector;
- let stmts = [];
-
- stmts.push(`DROP TEMPORARY TABLE IF EXISTS tmp.checkedChilds`);
- stmts.push(new ParameterizedSQL(
- `CREATE TEMPORARY TABLE tmp.checkedChilds (
- id INT,
- name VARCHAR(100),
- lft INT,
- rgt INT,
- depth BIGINT(22),
- sons DECIMAL(10, 0),
- isIncluded TINYINT
- ) ENGINE = MEMORY`));
-
- if (!parentFk) {
- stmts.push(new ParameterizedSQL(
- `INSERT INTO tmp.checkedChilds
- SELECT
- zg.id,
- zg.name,
- zg.lft,
- zg.rgt,
- zg.depth,
- zg.sons,
- zi.isIncluded
- FROM zoneGeo zg
- JOIN zoneIncluded zi ON zi.geoFk = zg.id
- AND zoneFk = ?`, [zoneFk]));
- }
-
- let stmt = new ParameterizedSQL(
- `SELECT * FROM (
- SELECT
- zg.id,
- zg.name,
- zg.lft,
- zg.rgt,
- zg.depth,
- zg.sons,
- IF(ch.id = zg.id, isIncluded, null) selected
- FROM zoneGeo zg
- JOIN tmp.checkedChilds ch
- ON zg.lft <= ch.lft AND zg.rgt >= ch.rgt
- UNION ALL
- SELECT
- zg.id,
- zg.name,
- zg.lft,
- zg.rgt,
- zg.depth,
- zg.sons,
- zi.isIncluded AS selected
- FROM zoneGeo zg
- LEFT JOIN zoneIncluded zi ON zi.geoFk = zg.id
- AND zi.zoneFk = ?
- WHERE (? IS NULL AND zg.parentFk IS NULL)
- OR (? IS NOT NULL AND zg.parentFk = ?)) AS nst`,
- [zoneFk, parentFk, parentFk, parentFk]);
-
- // Get nodes from depth greather than Origin
- stmt.merge(conn.makeSuffix(filter));
- stmt.merge('GROUP BY nst.id');
-
- const resultIndex = stmts.push(stmt) - 1;
-
- const sql = ParameterizedSQL.join(stmts, ';');
- const result = await Self.rawStmt(sql);
- const nodes = result[resultIndex];
-
- if (nodes.length == 0)
- return nodes;
-
- // Get parent nodes
- const minorDepth = nodes.reduce((a, b) => {
- return b < a ? b : a;
- }).depth;
-
- const parentNodes = nodes.filter(element => {
- return element.depth === minorDepth;
- });
- const leaves = Object.assign([], sortNodes(parentNodes));
-
- nestLeaves(leaves);
-
- function nestLeaves(elements) {
- elements.forEach(element => {
- let childs = Object.assign([], getLeaves(element));
- if (childs.length > 0) {
- element.childs = childs;
- nestLeaves(element.childs);
- }
- });
- }
-
- function getLeaves(parent) {
- let elements = nodes.filter(element => {
- return element.lft > parent.lft && element.rgt < parent.rgt
- && element.depth === parent.depth + 1;
- });
-
- return sortNodes(elements);
- }
-
- return leaves;
- };
-
- function sortNodes(nodes) {
- return nodes.sort((a, b) => {
- if (b.selected !== a.selected) {
- if (a.selected == null)
- return 1;
- if (b.selected == null)
- return -1;
- return b.selected - a.selected;
- }
-
- return a.name.localeCompare(b.name);
- });
- }
-};
diff --git a/modules/agency/back/methods/zone/getLeaves.js b/modules/agency/back/methods/zone/getLeaves.js
new file mode 100644
index 000000000..50ee54345
--- /dev/null
+++ b/modules/agency/back/methods/zone/getLeaves.js
@@ -0,0 +1,57 @@
+
+module.exports = Self => {
+ Self.remoteMethod('getLeaves', {
+ description: 'Returns the nodes for a zone',
+ accepts: [
+ {
+ arg: 'id',
+ type: 'Number',
+ http: {source: 'path'},
+ required: true
+ }, {
+ arg: 'parentFk',
+ type: 'Number',
+ description: 'Get the children of the specified father',
+ }, {
+ arg: 'search',
+ type: 'String',
+ description: 'Filter nodes whose name starts with',
+ }
+ ],
+ returns: {
+ type: ['Object'],
+ root: true
+ },
+ http: {
+ path: `/:id/getLeaves`,
+ verb: 'GET'
+ }
+ });
+
+ Self.getLeaves = async(id, parentFk = null, search) => {
+ let [res] = await Self.rawSql(
+ `CALL zone_getLeaves(?, ?, ?)`,
+ [id, parentFk, search]
+ );
+
+ let map = new Map();
+ for (let node of res) {
+ if (!map.has(node.parentFk))
+ map.set(node.parentFk, []);
+ map.get(node.parentFk).push(node);
+ }
+
+ function setLeaves(nodes) {
+ if (!nodes) return;
+ for (let node of nodes) {
+ node.childs = map.get(node.id);
+ setLeaves(node.childs);
+ }
+ }
+
+ let leaves = map.get(parentFk);
+ setLeaves(leaves);
+
+ return leaves || [];
+ };
+};
diff --git a/modules/agency/back/models/zone-geo.js b/modules/agency/back/models/zone-geo.js
deleted file mode 100644
index 987e2de71..000000000
--- a/modules/agency/back/models/zone-geo.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = Self => {
- require('../methods/zone-geo/getLeaves')(Self);
-};
diff --git a/modules/agency/back/models/zone.js b/modules/agency/back/models/zone.js
index c7ba642f3..2c540603d 100644
--- a/modules/agency/back/models/zone.js
+++ b/modules/agency/back/models/zone.js
@@ -1,6 +1,7 @@
module.exports = Self => {
require('../methods/zone/clone')(Self);
require('../methods/zone/editPrices')(Self);
+ require('../methods/zone/getLeaves')(Self);
Self.validatesPresenceOf('warehouseFk', {
message: `Warehouse cannot be blank`
diff --git a/modules/agency/front/location/index.html b/modules/agency/front/location/index.html
index fb9bf863c..c45fd5cd6 100644
--- a/modules/agency/front/location/index.html
+++ b/modules/agency/front/location/index.html
@@ -1,23 +1,25 @@