diff --git a/modules/agency/back/methods/zone-geo/getLeaves.js b/modules/agency/back/methods/zone-geo/getLeaves.js index f07095b08..11487304e 100644 --- a/modules/agency/back/methods/zone-geo/getLeaves.js +++ b/modules/agency/back/methods/zone-geo/getLeaves.js @@ -1,28 +1,24 @@ -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'} - }], + description: 'Returns the nodes for a zone', + accepts: [ + { + arg: 'zoneFk', + type: 'Number', + 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'], + type: ['Object'], root: true }, http: { @@ -31,126 +27,30 @@ module.exports = Self => { } }); - Self.getLeaves = async(zoneFk, parentFk = null, filter) => { - let conn = Self.dataSource.connector; - let stmts = []; + Self.getLeaves = async(zoneFk, parentFk = null, search) => { + let [res] = await Self.rawSql( + `CALL zoneGeo_getLeaves(?, ?, ?)`, + [zoneFk, parentFk, search] + ); - 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 map = new Map(); + for (let node of res) { + if (!map.has(node.parentFk)) + map.set(node.parentFk, []); + map.get(node.parentFk).push(node); } - 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 - AND zg.depth > 0 - 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 setLeaves(nodes) { + if (!nodes) return; + for (let node of nodes) { + node.childs = map.get(node.id); + setLeaves(node.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); - } + let leaves = map.get(parentFk); + setLeaves(leaves); 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/front/location/index.html b/modules/agency/front/location/index.html index fb9bf863c..8773530ea 100644 --- a/modules/agency/front/location/index.html +++ b/modules/agency/front/location/index.html @@ -2,22 +2,25 @@ vn-id="model" url="/agency/api/ZoneGeos/getLeaves" filter="::$ctrl.filter" - params="{zoneFk: $ctrl.$stateParams.id}" auto-load="false"> + params="{zoneFk: $ctrl.$stateParams.id}" + auto-load="false">
- - + +
\ No newline at end of file diff --git a/modules/agency/front/location/index.js b/modules/agency/front/location/index.js index 9a28fd3d1..d09bb5891 100644 --- a/modules/agency/front/location/index.js +++ b/modules/agency/front/location/index.js @@ -1,18 +1,17 @@ import ngModule from '../module'; class Controller { - constructor($scope, $http, $stateParams) { + constructor($, $http, $stateParams) { this.$stateParams = $stateParams; - this.$scope = $scope; + this.$ = $; this.$http = $http; this.searchValue = ''; this.filter = {}; } - onSearch() { - this.$scope.$applyAsync(() => { - this.$scope.treeview.refresh(); - }); + onSearch(params) { + this.$.model.applyFilter(null, params); + this.$.$applyAsync(() => this.$.treeview.refresh()); } exprBuilder(param, value) {