From ed0448604bd22cc8a63cf4eb972f432bb4dc0ef7 Mon Sep 17 00:00:00 2001 From: Johannes Hoermann <j.hoermann@adito.de> Date: Thu, 17 Jan 2019 16:55:47 +0100 Subject: [PATCH] treetable lib - added support for unsorted data, added a product two times in the example data, refactored uuid of example data --- .../data/example_offer/OFFER_1000.xml | 2 +- .../data/example_offer/OFFER_1001.xml | 2 +- .../data/example_offer/OFFER_1002.xml | 2 +- .../data/example_offer/OFFER_1003.xml | 2 +- .../data/example_offer/OFFER_1004.xml | 2 +- .../data/example_product/PRODUCT_42154311.xml | 38 ++++++++++------- .../example_salesorder/SALESORDER_1000.xml | 2 +- .../example_salesorder/SALESORDER_1001.xml | 2 +- .../example_salesorder/SALESORDER_1002.xml | 2 +- .../example_salesorder/SALESORDER_1003.xml | 2 +- .../example_salesorder/SALESORDER_1004.xml | 2 +- process/Data_lib/process.js | 41 ++++++++++++++----- process/Product_lib/process.js | 15 ++++--- 13 files changed, 74 insertions(+), 40 deletions(-) diff --git a/others/db_changes/data/example_offer/OFFER_1000.xml b/others/db_changes/data/example_offer/OFFER_1000.xml index 6d228aaaf9..a9137d7875 100644 --- a/others/db_changes/data/example_offer/OFFER_1000.xml +++ b/others/db_changes/data/example_offer/OFFER_1000.xml @@ -26,7 +26,7 @@ <column name="GROUPCODEID" valueNumeric="1"/> <column name="PRICE" valueNumeric="210.00"/> <column name="ITEMSORT" valueNumeric="1"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="VAT" valueNumeric="19.00"/> <column name="ITEMNAME" value="AX45"/> <column name="OPTIONAL" valueNumeric="0"/> diff --git a/others/db_changes/data/example_offer/OFFER_1001.xml b/others/db_changes/data/example_offer/OFFER_1001.xml index af385c8fcb..cc1776de41 100644 --- a/others/db_changes/data/example_offer/OFFER_1001.xml +++ b/others/db_changes/data/example_offer/OFFER_1001.xml @@ -26,7 +26,7 @@ <column name="GROUPCODEID" valueNumeric="1"/> <column name="PRICE" valueNumeric="210.00"/> <column name="ITEMSORT" valueNumeric="1"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="VAT" valueNumeric="19.00"/> <column name="ITEMNAME" value="AX45"/> <column name="OPTIONAL" valueNumeric="0"/> diff --git a/others/db_changes/data/example_offer/OFFER_1002.xml b/others/db_changes/data/example_offer/OFFER_1002.xml index 5dc19d4ca2..90e1e8b814 100644 --- a/others/db_changes/data/example_offer/OFFER_1002.xml +++ b/others/db_changes/data/example_offer/OFFER_1002.xml @@ -26,7 +26,7 @@ <column name="GROUPCODEID" valueNumeric="1"/> <column name="PRICE" valueNumeric="210.00"/> <column name="ITEMSORT" valueNumeric="1"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="VAT" valueNumeric="19.00"/> <column name="ITEMNAME" value="AX45"/> <column name="OPTIONAL" valueNumeric="0"/> diff --git a/others/db_changes/data/example_offer/OFFER_1003.xml b/others/db_changes/data/example_offer/OFFER_1003.xml index 116bae3c00..69fac55b8e 100644 --- a/others/db_changes/data/example_offer/OFFER_1003.xml +++ b/others/db_changes/data/example_offer/OFFER_1003.xml @@ -26,7 +26,7 @@ <column name="GROUPCODEID" valueNumeric="1"/> <column name="PRICE" valueNumeric="210.00"/> <column name="ITEMSORT" valueNumeric="1"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="VAT" valueNumeric="19.00"/> <column name="ITEMNAME" value="AX45"/> <column name="OPTIONAL" valueNumeric="0"/> diff --git a/others/db_changes/data/example_offer/OFFER_1004.xml b/others/db_changes/data/example_offer/OFFER_1004.xml index 93278cc1b6..143d3fc170 100644 --- a/others/db_changes/data/example_offer/OFFER_1004.xml +++ b/others/db_changes/data/example_offer/OFFER_1004.xml @@ -26,7 +26,7 @@ <column name="GROUPCODEID" valueNumeric="1"/> <column name="PRICE" valueNumeric="210.00"/> <column name="ITEMSORT" valueNumeric="1"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="VAT" valueNumeric="19.00"/> <column name="ITEMNAME" value="AX45"/> <column name="OPTIONAL" valueNumeric="0"/> diff --git a/others/db_changes/data/example_product/PRODUCT_42154311.xml b/others/db_changes/data/example_product/PRODUCT_42154311.xml index 15f6a25763..ff6855c5f8 100644 --- a/others/db_changes/data/example_product/PRODUCT_42154311.xml +++ b/others/db_changes/data/example_product/PRODUCT_42154311.xml @@ -2,7 +2,7 @@ <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> <changeSet author="m.schroeger" id="7896e3d7-8ecc-4a41-9117-239480c05cb4"> <insert tableName="PRODUCT"> - <column name="PRODUCTID" value="P101 "/> + <column name="PRODUCTID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="ADVERTISING" value="N"/> <column name="GROUPCODEID" valueNumeric="1"/> <column name="MINSTOCK" valueNumeric="5.00"/> @@ -92,7 +92,7 @@ <column name="TAKEPRICE" valueNumeric="0"/> <column name="QUANTITY" valueNumeric="1.00"/> <column name="SOURCE_ID" value="feefb3a9-f02a-4536-9ebb-ab7070cc71ba"/> - <column name="DEST_ID" value="P101 "/> + <column name="DEST_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="USER_NEW" value="Admin"/> <column name="DATE_NEW" valueDate="2018-11-12T14:35:33"/> </insert> @@ -102,7 +102,7 @@ <column name="TAKEPRICE" valueNumeric="1"/> <column name="QUANTITY" valueNumeric="2.00"/> <column name="SOURCE_ID" value="f52b1d6e-bf08-4fe1-8d83-ac0728c4b1c4"/> - <column name="DEST_ID" value="P101 "/> + <column name="DEST_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="USER_NEW" value="Admin"/> <column name="DATE_NEW" valueDate="2018-11-12T14:35:36"/> </insert> @@ -112,7 +112,7 @@ <column name="TAKEPRICE" valueNumeric="1"/> <column name="QUANTITY" valueNumeric="3.00"/> <column name="SOURCE_ID" value="b973e3f9-277c-4787-96a0-7cac54472420"/> - <column name="DEST_ID" value="P101 "/> + <column name="DEST_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="USER_NEW" value="Admin"/> <column name="DATE_NEW" valueDate="2018-11-12T14:35:39"/> </insert> @@ -146,6 +146,16 @@ <column name="USER_NEW" value="Admin"/> <column name="DATE_NEW" valueDate="2018-11-12T14:35:49"/> </insert> + <insert tableName="PROD2PROD"> + <column name="PROD2PRODID" value="a58d73e4-8e5a-4b96-9d39-2a178736bb31"/> + <column name="OPTIONAL" valueNumeric="0"/> + <column name="TAKEPRICE" valueNumeric="0"/> + <column name="QUANTITY" valueNumeric="1.00"/> + <column name="SOURCE_ID" value="b973e3f9-277c-4787-96a0-7cac54472420"/> + <column name="DEST_ID" value="368aa1c0-b802-4dea-844e-e61bf85a03c9"/> + <column name="USER_NEW" value="Admin"/> + <column name="DATE_NEW" valueDate="2018-11-12T14:35:33"/> + </insert> <insert tableName="PRODUCTPRICE"> <column name="PRODUCTPRICEID" value="12f288ac-f01b-4d20-b1b8-0f4f02e11079"/> @@ -153,7 +163,7 @@ <column name="VALID_FROM" valueDate="2018-02-01T00:00:00"/> <column name="PRICE" valueNumeric="150.00"/> <column name="VAT" valueNumeric="19.00"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="FROMQUANTITY" valueNumeric="1.00"/> <column name="CURRENCY" valueNumeric="1"/> <column name="PRICELIST" valueNumeric="1"/> @@ -167,7 +177,7 @@ <column name="VALID_FROM" valueDate="2018-11-01T00:00:00"/> <column name="PRICE" valueNumeric="195.00"/> <column name="VAT" valueNumeric="19.00"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="FROMQUANTITY" valueNumeric="50.00"/> <column name="CURRENCY" valueNumeric="1"/> <column name="PRICELIST" valueNumeric="1"/> @@ -181,7 +191,7 @@ <column name="VALID_FROM" valueDate="2018-11-10T00:00:00"/> <column name="PRICE" valueNumeric="210.00"/> <column name="VAT" valueNumeric="19.00"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="FROMQUANTITY" valueNumeric="1.00"/> <column name="CURRENCY" valueNumeric="1"/> <column name="PRICELIST" valueNumeric="1"/> @@ -195,7 +205,7 @@ <column name="VALID_FROM" valueDate="2018-11-01T00:00:00"/> <column name="PRICE" valueNumeric="205.00"/> <column name="VAT" valueNumeric="19.00"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="FROMQUANTITY" valueNumeric="1.00"/> <column name="CURRENCY" valueNumeric="1"/> <column name="PRICELIST" valueNumeric="2"/> @@ -209,7 +219,7 @@ <column name="VALID_FROM" valueDate="2018-11-01T00:00:00"/> <column name="PRICE" valueNumeric="180.00"/> <column name="VAT" valueNumeric="19.00"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="FROMQUANTITY" valueNumeric="50.00"/> <column name="CURRENCY" valueNumeric="1"/> <column name="PRICELIST" valueNumeric="2"/> @@ -223,7 +233,7 @@ <column name="VALID_FROM" valueDate="2018-11-01T00:00:00"/> <column name="PRICE" valueNumeric="208.00"/> <column name="VAT" valueNumeric="19.00"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="FROMQUANTITY" valueNumeric="50.00"/> <column name="CURRENCY" valueNumeric="2"/> <column name="PRICELIST" valueNumeric="1"/> @@ -236,7 +246,7 @@ <column name="STOCKID" value="f09201f8-85f3-4715-8d44-5cec7b8f437b"/> <column name="IN_OUT" valueNumeric="1"/> <column name="QUANTITY" valueNumeric="30"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="ENTRYDATE" valueDate="2018-11-22T00:00:00"/> <column name="WAREHOUSE" valueNumeric="1"/> <column name="USER_NEW" value="Admin"/> @@ -246,7 +256,7 @@ <column name="STOCKID" value="a90a8aba-76bb-40b1-a4ab-ef39508296cb"/> <column name="IN_OUT" valueNumeric="1"/> <column name="QUANTITY" valueNumeric="25"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="ENTRYDATE" valueDate="2018-11-15T00:00:00"/> <column name="WAREHOUSE" valueNumeric="1"/> <column name="USER_NEW" value="Admin"/> @@ -256,7 +266,7 @@ <column name="STOCKID" value="bd4c1a16-1b80-4b3e-aa67-306f387a62df"/> <column name="IN_OUT" valueNumeric="0"/> <column name="QUANTITY" valueNumeric="23"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="ENTRYDATE" valueDate="2018-11-22T00:00:00"/> <column name="WAREHOUSE" valueNumeric="1"/> <column name="USER_NEW" value="Admin"/> @@ -266,7 +276,7 @@ <column name="STOCKID" value="3caba278-9d38-485c-9d78-11ea969b832c"/> <column name="IN_OUT" valueNumeric="0"/> <column name="QUANTITY" valueNumeric="17"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="ENTRYDATE" valueDate="2018-11-15T00:00:00"/> <column name="WAREHOUSE" valueNumeric="1"/> <column name="USER_NEW" value="Admin"/> diff --git a/others/db_changes/data/example_salesorder/SALESORDER_1000.xml b/others/db_changes/data/example_salesorder/SALESORDER_1000.xml index f13b78150f..d86dd2a5ab 100644 --- a/others/db_changes/data/example_salesorder/SALESORDER_1000.xml +++ b/others/db_changes/data/example_salesorder/SALESORDER_1000.xml @@ -25,7 +25,7 @@ <column name="GROUPCODEID" valueNumeric="1"/> <column name="PRICE" valueNumeric="210.00"/> <column name="ITEMSORT" valueNumeric="1"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="VAT" valueNumeric="19.00"/> <column name="ITEMNAME" value="AX45"/> <column name="OPTIONAL" valueNumeric="0"/> diff --git a/others/db_changes/data/example_salesorder/SALESORDER_1001.xml b/others/db_changes/data/example_salesorder/SALESORDER_1001.xml index 73aa64e42e..7ddd1513fa 100644 --- a/others/db_changes/data/example_salesorder/SALESORDER_1001.xml +++ b/others/db_changes/data/example_salesorder/SALESORDER_1001.xml @@ -25,7 +25,7 @@ <column name="GROUPCODEID" valueNumeric="1"/> <column name="PRICE" valueNumeric="210.00"/> <column name="ITEMSORT" valueNumeric="1"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="VAT" valueNumeric="19.00"/> <column name="ITEMNAME" value="AX45"/> <column name="OPTIONAL" valueNumeric="0"/> diff --git a/others/db_changes/data/example_salesorder/SALESORDER_1002.xml b/others/db_changes/data/example_salesorder/SALESORDER_1002.xml index 0033b250a0..e98d540e7d 100644 --- a/others/db_changes/data/example_salesorder/SALESORDER_1002.xml +++ b/others/db_changes/data/example_salesorder/SALESORDER_1002.xml @@ -25,7 +25,7 @@ <column name="GROUPCODEID" valueNumeric="1"/> <column name="PRICE" valueNumeric="210.00"/> <column name="ITEMSORT" valueNumeric="1"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="VAT" valueNumeric="19.00"/> <column name="ITEMNAME" value="AX45"/> <column name="OPTIONAL" valueNumeric="0"/> diff --git a/others/db_changes/data/example_salesorder/SALESORDER_1003.xml b/others/db_changes/data/example_salesorder/SALESORDER_1003.xml index 31c3057291..c80913c15a 100644 --- a/others/db_changes/data/example_salesorder/SALESORDER_1003.xml +++ b/others/db_changes/data/example_salesorder/SALESORDER_1003.xml @@ -25,7 +25,7 @@ <column name="GROUPCODEID" valueNumeric="1"/> <column name="PRICE" valueNumeric="210.00"/> <column name="ITEMSORT" valueNumeric="1"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="VAT" valueNumeric="19.00"/> <column name="ITEMNAME" value="AX45"/> <column name="OPTIONAL" valueNumeric="0"/> diff --git a/others/db_changes/data/example_salesorder/SALESORDER_1004.xml b/others/db_changes/data/example_salesorder/SALESORDER_1004.xml index 5a6bb119d4..bfd9eb9cfd 100644 --- a/others/db_changes/data/example_salesorder/SALESORDER_1004.xml +++ b/others/db_changes/data/example_salesorder/SALESORDER_1004.xml @@ -25,7 +25,7 @@ <column name="GROUPCODEID" valueNumeric="1"/> <column name="PRICE" valueNumeric="210.00"/> <column name="ITEMSORT" valueNumeric="1"/> - <column name="PRODUCT_ID" value="P101 "/> + <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/> <column name="VAT" valueNumeric="19.00"/> <column name="ITEMNAME" value="AX45"/> <column name="OPTIONAL" valueNumeric="0"/> diff --git a/process/Data_lib/process.js b/process/Data_lib/process.js index e13e50ca67..83430f5e24 100644 --- a/process/Data_lib/process.js +++ b/process/Data_lib/process.js @@ -5,7 +5,7 @@ import("system.logging"); * * @class */ -function DataTree() +function DataTree(pRootId) { this._dataTree = { /* @@ -14,14 +14,15 @@ function DataTree() }*/ }; this._resultData = []; + this.rootId = pRootId } /** * @return {DataTree} */ -DataTree.begin = function() +DataTree.begin = function(pRootId) { - var tree = new DataTree(); + var tree = new DataTree(pRootId); return tree; } @@ -42,8 +43,8 @@ DataTree.prototype.add = function(pUid, pParentId, pData, pManipulateNodeFn) if (this._dataTree[pParentId] == undefined) { + // create parent node. It will be replaced later, if the actual parent is added. this._dataTree[pParentId] = { - data: [], ids: [], parent: "root" } @@ -53,6 +54,14 @@ DataTree.prototype.add = function(pUid, pParentId, pData, pManipulateNodeFn) if (pManipulateNodeFn != undefined) pManipulateNodeFn(pParentId, this._dataTree[pParentId]); + var tmpIds = []; + // node already created as parent by a childNode. + if (this._dataTree[pUid] != undefined && this._dataTree[pUid].parent == "root") + { + // tmp-save already added ids of the node + tmpIds = this._dataTree[pUid].ids; + } + this._dataTree[pUid] = { data: pData, parent: pParentId @@ -60,7 +69,7 @@ DataTree.prototype.add = function(pUid, pParentId, pData, pManipulateNodeFn) if (this._dataTree[pUid].ids == undefined) { - this._dataTree[pUid].ids = []; + this._dataTree[pUid].ids = tmpIds; } // callback to provide a hook for manipulating the node. (e.g. for adding additional node data) @@ -73,7 +82,7 @@ DataTree.prototype.add = function(pUid, pParentId, pData, pManipulateNodeFn) /** * * @param {String[]} pData - * @param {manipulateNodeCallback} pManipulateNodeFn + * @param {manipulateNodeCallback} pManipulateNodeFn may be called more than once for each node!!! * */ DataTree.prototype.addArray = function(pData, pManipulateNodeFn) @@ -87,18 +96,22 @@ DataTree.prototype.addArray = function(pData, pManipulateNodeFn) return this; } -DataTree.prototype.toArray = function(pRootId) +DataTree.prototype.toArray = function() { var treeArray = []; var tree = this._dataTree; // in this function Ids are just concatenated. This is bad, because it results in very long strings. // Because of this the concatenated id's are maped to new uids in the resulting array var uidMap = {}; - __push(pRootId, tree[pRootId]); + __push(this.rootId, tree[this.rootId]); function __push(pParent, pNode) { for (var i = 0; i < pNode.ids.length; i++) { - + if (pNode.parent == "root") + { + pParent = "" + } + var nextUid = pParent + pNode.ids[i]; __addRow(nextUid, pParent, tree[pNode.ids[i]].data) logging.log(nextUid + "\n---- " + tree[pNode.ids[i]].toSource()) @@ -110,7 +123,15 @@ DataTree.prototype.toArray = function(pRootId) { uidMap[pUid] = util.getNewUUID(); if (uidMap[pParentId] == undefined) { - uidMap[pParentId] = util.getNewUUID(); + logging.log(pParentId) + if (pParentId == "") + { + uidMap[pParentId] = ""; + } + else + { + uidMap[pParentId] = util.getNewUUID(); + } } treeArray.push([uidMap[pUid], uidMap[pParentId]].concat(pRowdata)); diff --git a/process/Product_lib/process.js b/process/Product_lib/process.js index c7ec23ae1f..3290b4dc13 100644 --- a/process/Product_lib/process.js +++ b/process/Product_lib/process.js @@ -432,7 +432,7 @@ Prod2ProdUtils.prototype.getPartsListObject = function() { */ Prod2ProdUtils.prototype.getPartsListForRecordContainer = function() { var tree = this._relateChilds(); - return tree.toArray(this.productId); + return tree.toArray(); // var ret = []; // var childs = this._relateChilds(); // @@ -539,7 +539,7 @@ Prod2ProdUtils.prototype._buildTree = function(supervised) { var productId = this.productId; logging.log(this.data.toSource()); - var tree = DataTree.begin().addArray(this.data, + var tree = DataTree.begin(this.productId).addArray(this.data, function(pUid, pNode) { logging.log(pUid) @@ -555,10 +555,13 @@ Prod2ProdUtils.prototype._buildTree = function(supervised) { { pNode["destid"] = pNode.parent; pNode["sourceid"] = pUid; - pNode["quantity"] = pNode.data[1]; - pNode["optional"] = pNode.data[2]; - pNode["takeprice"] = pNode.data[3]; - pNode["productcode"] = pNode.data[4]; + + if (pNode.data != undefined) { + pNode["quantity"] = pNode.data[1]; + pNode["optional"] = pNode.data[2]; + pNode["takeprice"] = pNode.data[3]; + pNode["productcode"] = pNode.data[4]; + } } } ); -- GitLab