From d0fe8abbdaa4ccff15203fdef30dbda6e7ef6d2a Mon Sep 17 00:00:00 2001 From: Marco Balestri Date: Mon, 2 Mar 2020 17:06:05 +0100 Subject: [PATCH 001/618] R widget first commit --- .../backendservices/rest/widgets/RWidget.java | 70 +++++ .../cockpit/api/engine/EngineResource.java | 3 + .../cockpit-widget/widget/RWidget/RMode.js | 0 .../cockpit-widget/widget/RWidget/RWidget.js | 243 ++++++++++++++++++ .../widget/RWidget/RWidgetEdit.js | 145 +++++++++++ .../RWidgetEditPropertyTemplate.html | 152 +++++++++++ .../RWidget/templates/RWidgetTemplate.html | 1 + .../js/src/messages/messages.properties | 14 + 8 files changed, 628 insertions(+) create mode 100644 knowage-core/src/main/java/it/eng/knowage/backendservices/rest/widgets/RWidget.java create mode 100644 knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/RMode.js create mode 100644 knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/RWidget.js create mode 100644 knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/RWidgetEdit.js create mode 100644 knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/templates/RWidgetEditPropertyTemplate.html create mode 100644 knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/templates/RWidgetTemplate.html diff --git a/knowage-core/src/main/java/it/eng/knowage/backendservices/rest/widgets/RWidget.java b/knowage-core/src/main/java/it/eng/knowage/backendservices/rest/widgets/RWidget.java new file mode 100644 index 00000000000..3df1637c9cd --- /dev/null +++ b/knowage-core/src/main/java/it/eng/knowage/backendservices/rest/widgets/RWidget.java @@ -0,0 +1,70 @@ +/* + * Knowage, Open Source Business Intelligence suite + * Copyright (C) 2019 Engineering Ingegneria Informatica S.p.A. + * + * Knowage is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Knowage is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package it.eng.knowage.backendservices.rest.widgets; + +import java.util.HashMap; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.MediaType; + +import org.apache.log4j.Logger; + +import it.eng.spagobi.commons.bo.UserProfile; +import it.eng.spagobi.services.content.bo.Content; +import it.eng.spagobi.services.content.service.ContentServiceImplSupplier; +import it.eng.spagobi.user.UserProfileManager; + +/* + Answers on: https://localhost:8080/knowage/restful-services/2.0/backendservices/widgets/RWidget + */ +@Path("/2.0/backendservices/widgets/RWidget") +public class RWidget { + + static protected Logger logger = Logger.getLogger(RWidget.class); + + @POST + @Path("/view") + @Consumes(MediaType.APPLICATION_JSON) + public String view(@PathParam("document_id") Integer documentId, HashMap params) { + logger.debug("IN"); + UserProfile userProfile = UserProfileManager.getProfile(); + String userId = (String) userProfile.getUserUniqueIdentifier(); + ContentServiceImplSupplier supplier = new ContentServiceImplSupplier(); + Content content; + try { + content = supplier.readTemplate(userId, Integer.toString(documentId), params); + } catch (Exception e) { + logger.error("error while retrieving template for userId [" + userId + "] and documentId [" + documentId + "]"); + return null; + } finally { + logger.debug("OUT"); + } + String rCode = getRCodeFromTemplate(content.getContent()); + return content.getContent(); + } + + private String getRCodeFromTemplate(String template) { + + return ""; + } + +} diff --git a/knowagecockpitengine/src/main/java/it/eng/knowage/engine/cockpit/api/engine/EngineResource.java b/knowagecockpitengine/src/main/java/it/eng/knowage/engine/cockpit/api/engine/EngineResource.java index 0517beeb640..15b7b8f8f30 100644 --- a/knowagecockpitengine/src/main/java/it/eng/knowage/engine/cockpit/api/engine/EngineResource.java +++ b/knowagecockpitengine/src/main/java/it/eng/knowage/engine/cockpit/api/engine/EngineResource.java @@ -163,6 +163,9 @@ public List getEngine() throws EMFInternalError { .withCssClass("fab fa-python").withType("python").withTag("python").build()); } + ret.add(Widget.builder().withName("R").withDescKey("sbi.cockpit.editor.newwidget.description.R").withImg("11.png").withCssClass("fab fa-r-project") + .withType("R").withTag("R").build()); + if (functionalities.contains(DISCOVERY_WIDGET_USE)) { ret.add(Widget.builder().withName("Discovery").withDescKey("sbi.cockpit.editor.newwidget.description.discovery")/* TODO : .withImg(???) */ diff --git a/knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/RMode.js b/knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/RMode.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/RWidget.js b/knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/RWidget.js new file mode 100644 index 00000000000..60808188c7d --- /dev/null +++ b/knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/RWidget.js @@ -0,0 +1,243 @@ +/* +Knowage, Open Source Business Intelligence suite +Copyright (C) 2016 Engineering Ingegneria Informatica S.p.A. + +Knowage is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +Knowage is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + */ + +/** + * @author Marco Balestri + */ + +(function () { + angular + .module('cockpitModule') + .config(function($locationProvider) { + $locationProvider.html5Mode(true); + }) + .directive('cockpitRWidget', function () { + return { + templateUrl: baseScriptPath+ '/directives/cockpit-widget/widget/RWidget/templates/RWidgetTemplate.html', + controller: cockpitRWidgetControllerFunction, + compile: function (tElement, tAttrs, transclude) { + return { + post: function postLink(scope, element, attrs, ctrl, transclud) { + element.ready(function () { + scope.initWidget(); + }); + } + }; + } + } + }) + + .directive('bindHtmlCompile', ['$compile', function ($compile) { + return { + restrict: 'A', + link: function (scope, element, attrs) { + scope.$watch(function () { + return scope.$eval(attrs.bindHtmlCompile); + }, function (value) { + element.html(value && value.toString()); + var compileScope = scope; + if (attrs.bindHtmlScope) { + compileScope = scope.$eval(attrs.bindHtmlScope); + } + $compile(element.contents())(compileScope); + }); + } + }; + }]) + + function cockpitRWidgetControllerFunction( + $scope, + $mdDialog, + $mdPanel, + $q, + $timeout, + $http, + $sce, + $location, + sbiModule_translate, + sbiModule_restServices, + sbiModule_config, + cockpitModule_properties, + cockpitModule_analyticalDrivers, + cockpitModule_generalServices, + cockpitModule_datasetServices, + cockpitModule_widgetSelection, + cockpitModule_template, + sbiModule_user) { + + $scope.getTemplateUrl = function (template) { + return cockpitModule_generalServices.getTemplateUrl('RWidget', template); + } + + $scope.refresh = function (element, width, height, datasetRecords, nature) { + $scope.showWidgetSpinner(); + if(nature == 'init') { + $timeout(function () { + $scope.widgetIsInit = true; + cockpitModule_properties.INITIALIZED_WIDGETS.push($scope.ngModel.id); + }, 500); + } + $scope.documentId = cockpitModule_properties.DOCUMENT_ID; + $scope.sendData(); + $scope.hideWidgetSpinner(); + } + + $scope.reinit = function() { + $scope.refreshWidget(); + } + + $scope.crossNavigation = function () { + $scope.doSelection(null, null, null, null, null, null, $scope.ngModel.dataset.dsId, null); + } + + $scope.buildAggregations = function (meta, dataset_label) { + aggregations = {"measures": [], "categories": [], "dataset": dataset_label}; + for (i=0; i. + */ + +/** + * @author Marco Balestri + */ + +angular + .module('cockpitModule') + .controller('RWidgetEditControllerFunction', RWidgetEditControllerFunction) + +function RWidgetEditControllerFunction( + $scope, + $http, + finishEdit, + model, + sbiModule_translate, + $mdDialog, + mdPanelRef, + cockpitModule_datasetServices, + cockpitModule_analyticalDrivers, + cockpitModule_helperDescriptors, + sbiModule_restServices) { + + $scope.translate = sbiModule_translate; + $scope.newModel = angular.copy(model); + $scope.formattedAnalyticalDrivers = []; + + $scope.setLibraries = function () { + $http({ + url: "https://" + $scope.newModel.knowageAddress + "widgets/Rwidget/libraries", + method: "GET", + headers: {'Content-Type': 'application/json', + 'Authorization': $scope.encodedUserId} + }) + .then(function(response) { //success + $scope.newModel.libraries = response.data; + }, + function(response) { //failed + }); + } + + sbiModule_restServices.restToRootProject(); + sbiModule_restServices.promiseGet('2.0/configs/category', 'R_CONFIGURATION') + .then(function(response){ + $scope.newModel.REnvs = $scope.buildEnvironments(response.data); + $scope.newModel.REnvsKeys = Object.keys($scope.newModel.REnvs); + }, function(error){ + }); + + for(var a in cockpitModule_analyticalDrivers){ + $scope.formattedAnalyticalDrivers.push({'name':a}); + } + + $scope.buildEnvironments = function (data) { + toReturn = {} + for (i=0; i + + +
+

{{translate.load('kn.cockpit.R.configuration')}}

+ +
+
+ + + + + + + + + + + + + + + + + +
+ + + + + + + {{key}} + + + + + + + + + + + + + + + +
+

{{translate.load('kn.cockpit.R.RScript')}}

+ +
+
+ + + +
+
+
+ +

{{translate.load('kn.cockpit.R.availabletags')}}

+
+ {{tag.label}} +
+

+ {{tag.description}} +

+
{{tag.hiddenMessage}}
+
+ + + + {{opt.name}} + + + + + {{input.label || input.name}} + +
+
+ + Insert + +
+
+ +
+
+ +
+ + + + + + + + + + + {{key}} + + + + + + + + + + + + + + + + + + + + + + +
{{translate.load('sbi.cockpit.widget.R.library')}}{{translate.load('sbi.cockpit.widget.R.version')}}
{{lib.name}}{{lib.version}}
+ +
+
+
+ + + + + + + + + + + +
+
+
+ + + {{translate.load('sbi.generic.cancel')}} + + + {{translate.load('sbi.generic.save')}} + + + \ No newline at end of file diff --git a/knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/templates/RWidgetTemplate.html b/knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/templates/RWidgetTemplate.html new file mode 100644 index 00000000000..146acd35ed2 --- /dev/null +++ b/knowagecockpitengine/src/main/webapp/js/src/angular_1.4/cockpit/directives/cockpit-widget/widget/RWidget/templates/RWidgetTemplate.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/knowagecockpitengine/src/main/webapp/js/src/messages/messages.properties b/knowagecockpitengine/src/main/webapp/js/src/messages/messages.properties index 5c277231d7a..663c519a7ba 100644 --- a/knowagecockpitengine/src/main/webapp/js/src/messages/messages.properties +++ b/knowagecockpitengine/src/main/webapp/js/src/messages/messages.properties @@ -800,6 +800,7 @@ sbi.cockpit.editor.newwidget.description.html = Custom HTML code editor with sho sbi.cockpit.editor.newwidget.description.map = Interactive map with multiple layers representation. sbi.cockpit.editor.newwidget.description.selector = Selector widget to easily filter categories. sbi.cockpit.editor.newwidget.description.python = Write your own python code and create your visualization. +sbi.cockpit.editor.newwidget.description.R = Write your own R script and create your custom visualization. sbi.cockpit.editor.newwidget.description.discovery = Advanced faceted table to interact with Solr datasets. sbi.cockpit.editor.newwidget.info=Click on a widget to add it in the current cockpit sheet. sbi.cockpit.editor.newwidget.title=Select New Widget @@ -1845,6 +1846,19 @@ kn.cockpit.python.availabletags = Available Tags kn.cockpit.python.tag1 = Columns Data kn.cockpit.python.tag2 = Parameters +kn.cockpit.R.configuration = R Widget Configuration +kn.cockpit.R.environment = R environment +kn.cockpit.R.outputFileName = Output file name +kn.cockpit.R.outputType = Output type +kn.cockpit.R.outputVariableName = Output variable name +kn.cockpit.R.RScript = R script +kn.cockpit.R.tag1.desc = This tag is used to select a specific column from the selected dataset +kn.cockpit.R.tag2.desc = This tag is used to choose a parameter value from the ones available from the selected dataset +kn.cockpit.R.nodataset = No Dataset Selected +kn.cockpit.R.availabletags = Available Tags +kn.cockpit.R.tag1 = Columns Data +kn.cockpit.R.tag2 = Parameters + kn.cockpit.selector.selectall = Select/deselect All kn.cockpit.selector.select = Select kn.cockpit.selector.cancel = Cancel From d00a4cf1c586fed24e5c2a7df85f633fba070f3d Mon Sep 17 00:00:00 2001 From: Radmila Selakovic Date: Wed, 4 Mar 2020 10:25:41 +0100 Subject: [PATCH 002/618] [CLOSES KNOWAGE-4891] fixing issue with registry update record --- .../js/src/registry/registry.controller.js | 312 +++++++++--------- .../webapp/js/src/registry/registry.tpl.html | 102 +++--- 2 files changed, 214 insertions(+), 200 deletions(-) diff --git a/knowageqbeengine/src/main/webapp/js/src/registry/registry.controller.js b/knowageqbeengine/src/main/webapp/js/src/registry/registry.controller.js index 30e4951751d..e038234d388 100644 --- a/knowageqbeengine/src/main/webapp/js/src/registry/registry.controller.js +++ b/knowageqbeengine/src/main/webapp/js/src/registry/registry.controller.js @@ -29,13 +29,12 @@ $httpProvider.interceptors .push('httpInterceptor'); - } ]).controller('RegistryController', ['registryConfigService', 'registryCRUDService', + } ]).controller('RegistryController', ['$scope','registryConfigService', 'registryCRUDService', 'regFilterGetData', 'sbiModule_messaging','sbiModule_translate', 'sbiModule_config', '$mdDialog', '$filter', 'orderByFilter','registryPaginationService', RegistryController]) - function RegistryController(registryConfigService, registryCRUDService, + function RegistryController($scope,registryConfigService, registryCRUDService, regFilterGetData, sbiModule_messaging, sbiModule_translate, sbiModule_config, $mdDialog, $filter, orderBy, registryPaginationService) { - var self = this; var registryConfigurationService = registryConfigService; var registryCRUD = registryCRUDService; var registryConfiguration = registryConfigurationService @@ -44,24 +43,24 @@ var sbiMessaging = sbiModule_messaging; var pagination = registryPaginationService; var dateColumns=[]; - self.sbiTranslate = sbiModule_translate; - self.data = []; - self.resultsNumber = 0; - self.comboColumnOptions = {}; - self.columns = []; - self.columnSizeInfo = []; - self.columnFieldTypes = []; - self.selectedRow = []; - self.formParams = {}; - self.filters = {}; - self.page = 1; - self.propertyName = ''; - self.reverse = false; - self.dateFormat='MM/dd/yyyy'; + $scope.sbiTranslate = sbiModule_translate; + $scope.data = []; + $scope.resultsNumber = 0; + $scope.comboColumnOptions = {}; + $scope.columns = []; + $scope.columnSizeInfo = []; + $scope.columnFieldTypes = []; + $scope.selectedRow = []; + $scope.formParams = {}; + $scope.filters = {}; + $scope.page = 1; + $scope.propertyName = ''; + $scope.reverse = false; + $scope.dateFormat='MM/dd/yyyy'; // array object to define the registry configuration - self.configuration = { + $scope.configuration = { title: "Registry Document", itemsPerPage: 15, //enableButtons: registryConfiguration.configurations[0].value == "true", @@ -72,43 +71,43 @@ for(var i = 0 ; i < registryConfiguration.configurations.length;i++){ if(registryConfiguration.configurations[i].name=="enableButtons"){ - self.configuration.enableButtons = registryConfiguration.configurations[i].value == "true" + $scope.configuration.enableButtons = registryConfiguration.configurations[i].value == "true" } else { if(registryConfiguration.configurations[i].name=="enableDeleteRecords"){ - self.configuration.enableDeleteRecords = registryConfiguration.configurations[i].value == "true" + $scope.configuration.enableDeleteRecords = registryConfiguration.configurations[i].value == "true" } if(registryConfiguration.configurations[i].name=="enableAddRecords"){ - self.configuration.enableAddRecords = registryConfiguration.configurations[i].value == "true" + $scope.configuration.enableAddRecords = registryConfiguration.configurations[i].value == "true" } } } //Getting initial data from server var loadInitialData = function(){ - if(self.configuration.pagination == 'true') { - self.formParams.start = 0; - self.formParams.limit = self.configuration.itemsPerPage; + if($scope.configuration.pagination == 'true') { + $scope.formParams.start = 0; + $scope.formParams.limit = $scope.configuration.itemsPerPage; } else { - self.formParams.start = 0; + $scope.formParams.start = 0; } - readData(self.formParams); + readData($scope.formParams); }; var readData = function(formParameters) { - self.formatNumber= 0; + $scope.formatNumber= 0; registryCRUD.read(formParameters).then(function(response) { - self.data = response.data.rows; - if(self.configuration.pagination != 'true'){ - self.data = orderBy(self.data,self.propertyName,self.reverse); + $scope.data = response.data.rows; + if($scope.configuration.pagination != 'true'){ + $scope.data = orderBy($scope.data,$scope.propertyName,$scope.reverse); } dateColumns = dateColumnsFilter(response.data.metaData.fields); - self.data = dateRowsFilter(dateColumns,response.data.rows); - self.resultsNumber = response.data.results; - self.initalizePagination(); - if(self.columnSizeInfo.length == 0) { - self.columnSizeInfo = response.data.metaData.columnsInfos; - self.columnFieldTypes = response.data.metaData.fields; - self.columns.length=0 + $scope.data = dateRowsFilter(dateColumns,response.data.rows); + $scope.resultsNumber = response.data.results; + $scope.initalizePagination(); + if($scope.columnSizeInfo.length == 0) { + $scope.columnSizeInfo = response.data.metaData.columnsInfos; + $scope.columnFieldTypes = response.data.metaData.fields; + $scope.columns.length=0 addColumnsInfo(); } @@ -121,38 +120,38 @@ // Filling columns var addColumnsInfo = function() { columnsInfo.forEach(function(column) { - self.columnSizeInfo.forEach(function(columnSize) { + $scope.columnSizeInfo.forEach(function(columnSize) { if(columnSize.sizeColumn === column.field) { column.size = columnSize.size; } }); - self.columnFieldTypes.forEach(function(columnType) { + $scope.columnFieldTypes.forEach(function(columnType) { if(columnType.name === column.field) { column.dataType = columnType.type; } }); if(column.type && column.type === 'merge') { - self.configuration.pivot = true; + $scope.configuration.pivot = true; } if(column.visible == true) { column.position = columnsInfo.indexOf(column); - self.columns.push(column); + $scope.columns.push(column); } }); }; //Sorting Columns - self.sortBy = function(propertyName){ - if(self.configuration.pagination != 'true'){ - self.reverse = (propertyName !== null && self.propertyName === propertyName) ? !self.reverse : false; - self.propertyName = propertyName; - self.data = orderBy(self.data,self.propertyName,self.reverse); + $scope.sortBy = function(propertyName){ + if($scope.configuration.pagination != 'true'){ + $scope.reverse = (propertyName !== null && $scope.propertyName === propertyName) ? !$scope.reverse : false; + $scope.propertyName = propertyName; + $scope.data = orderBy($scope.data,$scope.propertyName,$scope.reverse); } }; - self.setDataType = function(columnDataType) { + $scope.setDataType = function(columnDataType) { switch(columnDataType) { case 'string': return 'text'; @@ -172,9 +171,9 @@ } }; - self.getDecimalPlaces = function(colName){ + $scope.getDecimalPlaces = function(colName){ var decimalPlaces; - var floatColumns = $filter('filter')(self.columnFieldTypes, {type: 'float'}, true); + var floatColumns = $filter('filter')($scope.columnFieldTypes, {type: 'float'}, true); floatColumns.forEach(function(col){ if(col.name == colName) { var format = col.format.split(','); @@ -184,7 +183,7 @@ }); }; - self.getStep = function(dataType){ + $scope.getStep = function(dataType){ if(dataType == 'float'){ return '.01'; } else if(dataType == 'int') { @@ -195,7 +194,7 @@ }; /* Pivot Table */ - self.setRowspan = function(rows,rowIndex,columnIndex,columns){ + $scope.setRowspan = function(rows,rowIndex,columnIndex,columns){ // count columns to be merged var rowsToMergeCounter = 0; @@ -236,7 +235,7 @@ } }; - self.compareRowsForRowspanPrint = function(rows,rowIndex,columnIndex,columns){ + $scope.compareRowsForRowspanPrint = function(rows,rowIndex,columnIndex,columns){ if( columns[columnIndex].type !== 'merge'){ return true; @@ -280,7 +279,7 @@ } }; - self.setSummaryRowColor = function(rows,index,columns){ + $scope.setSummaryRowColor = function(rows,index,columns){ //counter to check is there summaryFunction and type='measure' atributes var counter = 0; var summaryFunctionIndex = 0; @@ -311,7 +310,7 @@ return; }; - self.isItSummaryRow = function(rows,indexF,index,columns){ + $scope.isItSummaryRow = function(rows,indexF,index,columns){ var row = rows[indexF]; var columnField = columns[index].field; if(index > 0){ @@ -328,39 +327,39 @@ //Adding options to combo columns var clicked = 0; - self.dependentColumns = []; + $scope.dependentColumns = []; - self.addColumnOptions = function(column, row, $mdOpenMenu) { + $scope.addColumnOptions = function(column, row, $mdOpenMenu) { $mdOpenMenu(); row.selected = true; //regular independent combo columns - if(column.editor === 'COMBO' && !self.isDependentColumn(column)) { - if(!self.comboColumnOptions[column.field]) { - self.comboColumnOptions[column.field] = {}; + if(column.editor === 'COMBO' && !$scope.isDependentColumn(column)) { + if(!$scope.comboColumnOptions[column.field]) { + $scope.comboColumnOptions[column.field] = {}; var promise = regFilterGetData.getData(column.field); promise.then(function(response) { - self.comboColumnOptions[column.field] = response; + $scope.comboColumnOptions[column.field] = response; }); return promise; } } //dependent combo columns - if(column.editor === 'COMBO' && self.isDependentColumn(column)) { - if(!self.comboColumnOptions[column.field]) { - self.comboColumnOptions[column.field] = {}; + if(column.editor === 'COMBO' && $scope.isDependentColumn(column)) { + if(!$scope.comboColumnOptions[column.field]) { + $scope.comboColumnOptions[column.field] = {}; var dependencesPromise = regFilterGetData.getDependeceOptions(column, row) dependencesPromise.then(function(response) { - self.comboColumnOptions[column.field][row[column.dependsFrom]] = response.data.rows; + $scope.comboColumnOptions[column.field][row[column.dependsFrom]] = response.data.rows; }); return dependencesPromise; } else { - if(!self.comboColumnOptions[column.field].hasOwnProperty(row[column.dependsFrom])) { + if(!$scope.comboColumnOptions[column.field].hasOwnProperty(row[column.dependsFrom])) { var dependencesPromise = regFilterGetData.getDependeceOptions(column, row) dependencesPromise.then(function(response) { - self.comboColumnOptions[column.field][row[column.dependsFrom]] = response.data.rows; + $scope.comboColumnOptions[column.field][row[column.dependsFrom]] = response.data.rows; }); return dependencesPromise; } @@ -368,45 +367,45 @@ } }; - self.stopShow = false; + $scope.stopShow = false; - self.notifyAboutDependency = function(column, event) { + $scope.notifyAboutDependency = function(column, event) { clicked++; if(clicked == 1) { fillDependencyColumns(column); - createDialog(self.dependentColumns); + createDialog($scope.dependentColumns); } - if(self.dependentColumns.length != 0 && !self.stopShow) { + if($scope.dependentColumns.length != 0 && !$scope.stopShow) { - $mdDialog.show(self.confirm) + $mdDialog.show($scope.confirm) .then(function(result){ - self.stopShow = result; + $scope.stopShow = result; }, function(result){ - self.stopShow = result; + $scope.stopShow = result; }); } }; var fillDependencyColumns = function(column) { - for(var i = 0; i < self.columns.length; i++) { - var col = self.columns[i]; + for(var i = 0; i < $scope.columns.length; i++) { + var col = $scope.columns[i]; if(col.dependsFrom === column.field) { var dependent = col.title; - self.dependentColumns.push(dependent); + $scope.dependentColumns.push(dependent); } } }; var createDialog = function(dependentColumns) { - self.confirm = $mdDialog.prompt( + $scope.confirm = $mdDialog.prompt( { controller: DialogController, parent: angular.element(document.body), templateUrl: sbiModule_config.dynamicResourcesEnginePath + '/registry/dependentColumnsDialog.tpl.html', locals: { - dontShowAgain: self.stopShow, - columns: self.dependentColumns + dontShowAgain: $scope.stopShow, + columns: $scope.dependentColumns }, targetEvent: event, clickOutsideToClose: false, @@ -428,7 +427,7 @@ }; - self.isDependentColumn = function(column) { + $scope.isDependentColumn = function(column) { if(column.hasOwnProperty('dependsFrom')) { return true; } else { @@ -437,14 +436,14 @@ }; //Filters handling - self.addFilterOptions = function(filterField){ + $scope.addFilterOptions = function(filterField){ var promise = regFilterGetData.getData(filterField); promise.then(function(response) { addOptions(filterField,response); }); }; - self.checkIfFilterColumnExists = function(){ + $scope.checkIfFilterColumnExists = function(){ var filters = []; for (var i = 0; i < registryConfiguration.filters.length; i++) { var filter = registryConfiguration.filters[i]; @@ -464,55 +463,56 @@ }; - self.getFilteredData = function(params) { - self.formParams = Object.assign({}, params); - if(self.configuration.pagination == 'true') { - self.formParams.start = 0; - self.formParams.limit = self.configuration.itemsPerPage; - self.page = 1; + $scope.getFilteredData = function(params) { + $scope.formParams = Object.assign({}, params); + if($scope.configuration.pagination == 'true') { + $scope.formParams.start = 0; + $scope.formParams.limit = $scope.configuration.itemsPerPage; + $scope.page = 1; } else { - self.formParams.start = 0; + $scope.formParams.start = 0; } - readData(self.formParams); + readData($scope.formParams); }; - self.deleteFilterValues = function(){ - self.filters = {}; - self.formParams = {}; - self.page = 1; - for(var i = 0 ; i<(self.configuration.filters).length; i++){ - self.configuration.filters[i].value = null; + $scope.deleteFilterValues = function(){ + $scope.filters = {}; + $scope.formParams = {}; + $scope.page = 1; + for(var i = 0 ; i<($scope.configuration.filters).length; i++){ + $scope.configuration.filters[i].value = null; } - loadInitialData(self.formParams); + loadInitialData($scope.formParams); }; // Update - self.setSelected = function(selectedRow) { + $scope.setSelected = function(selectedRow) { - if((self.selectedRow).indexOf(selectedRow) === -1){ - self.selectedRow.push(selectedRow); + if(($scope.selectedRow).indexOf(selectedRow) === -1){ + $scope.selectedRow.push(selectedRow); } }; - self.updateRow = function() { - for (var i = 0; i < self.selectedRow.length; i++) { - for(var property in self.selectedRow[i]) { - if(!self.selectedRow[i].id && self.selectedRow[i][property] && typeof self.selectedRow[i][property].getMonth === 'function') { - self.selectedRow[i][property].setTime(self.selectedRow[i][property].getTime() - new Date().getTimezoneOffset()*60*1000); + $scope.updateRow = function() { + for (var i = 0; i < $scope.selectedRow.length; i++) { + for(var property in $scope.selectedRow[i]) { + if(!$scope.selectedRow[i].id && $scope.selectedRow[i][property] && typeof $scope.selectedRow[i][property].getMonth === 'function') { + $scope.selectedRow[i][property].setTime($scope.selectedRow[i][property].getTime() - new Date().getTimezoneOffset()*60*1000); } } - registryCRUD.update(self.selectedRow[i]).then(function(response) { - sbiMessaging.showInfoMessage( self.sbiTranslate.load("kn.registry.registryDocument.update.success") - +' '+ (response.data.ids.length) + ' ' + self.sbiTranslate.load("kn.registry.registryDocument.row"), self.sbiTranslate.load("kn.registry.registryDocument.success")); + registryCRUD.update($scope.selectedRow[i]).then(function(response) { + sbiMessaging.showInfoMessage( $scope.sbiTranslate.load("kn.registry.registryDocument.update.success") + +' '+ (response.data.ids.length) + ' ' + $scope.sbiTranslate.load("kn.registry.registryDocument.row"), $scope.sbiTranslate.load("kn.registry.registryDocument.success")); + $scope.selectedRow = []; }); } - self.selectedRow = []; + }; // Delete - self.deleteRowFromDB = function(row, event) { + $scope.deleteRowFromDB = function(row, event) { if(row.id) { var confirm = $mdDialog.confirm() .title(sbiModule_translate.load('kn.registry.document.delete.row')) @@ -523,92 +523,92 @@ $mdDialog.show(confirm).then(function() { registryCRUD.delete(row).then(function(response) { - sbiMessaging.showInfoMessage(self.sbiTranslate.load("kn.registry.registryDocument.delete.success"), self.sbiTranslate.load("kn.registry.registryDocument.success")); - self.deleteRow(row.$$hashKey); + sbiMessaging.showInfoMessage($scope.sbiTranslate.load("kn.registry.registryDocument.delete.success"), $scope.sbiTranslate.load("kn.registry.registryDocument.success")); + $scope.deleteRow(row.$$hashKey); }); }); } else { - self.deleteRow(row.$$hashKey); + $scope.deleteRow(row.$$hashKey); } }; - self.isArray = angular.isArray; + $scope.isArray = angular.isArray; - self.deleteRow = function(hash) { - angular.forEach(self.data, function(value, key) { + $scope.deleteRow = function(hash) { + angular.forEach($scope.data, function(value, key) { if (value.$$hashKey == hash) { - self.data.splice(key, 1); + $scope.data.splice(key, 1); return; } }); }; - self.addRow = function() { - var tmpRow = angular.copy(self.data[0], {}); + $scope.addRow = function() { + var tmpRow = angular.copy($scope.data[0], {}); for ( var i in tmpRow) { tmpRow[i] = ""; }; - self.data.unshift(tmpRow); + $scope.data.unshift(tmpRow); }; // reordering columns function - self.move = function(position, direction) { + $scope.move = function(position, direction) { var prev, cur, next; if (direction == 'left') { - angular.forEach(self.columns, function(value, key) { + angular.forEach($scope.columns, function(value, key) { if (value.position == (position - 1)) prev = key; if (value.position == (position)) cur = key; }) - self.columns[cur].position--; - self.columns[prev].position++; + $scope.columns[cur].position--; + $scope.columns[prev].position++; } else { - angular.forEach(self.columns, function(value, key) { + angular.forEach($scope.columns, function(value, key) { if (value.position == (position + 1)) next = key; if (value.position == (position)) cur = key; }) - self.columns[cur].position++; - self.columns[next].position--; + $scope.columns[cur].position++; + $scope.columns[next].position--; } } - self.addToFilters = function(filter) { - self.filters[filter.field] = filter.value; + $scope.addToFilters = function(filter) { + $scope.filters[filter.field] = filter.value; } //Pagination - self.initalizePagination=function(){ - - self.getTotalPages = pagination.getTotalPages(self.resultsNumber,self.configuration.itemsPerPage); - self.hasNext = pagination.hasNext(self.page,self.configuration.itemsPerPage,self.resultsNumber); - self.hasPrevious = pagination.hasPrevious(self.page); - self.min = pagination.min(self.resultsNumber,self.page,self.configuration.itemsPerPage); - self.max = pagination.max(self.page,self.configuration.itemsPerPage,self.resultsNumber); - self.next = function() { - self.page++; - self.formParams = pagination.next(self.page,self.formParams,self.configuration.itemsPerPage,self.filters); - readData(self.formParams); + $scope.initalizePagination=function(){ + + $scope.getTotalPages = pagination.getTotalPages($scope.resultsNumber,$scope.configuration.itemsPerPage); + $scope.hasNext = pagination.hasNext($scope.page,$scope.configuration.itemsPerPage,$scope.resultsNumber); + $scope.hasPrevious = pagination.hasPrevious($scope.page); + $scope.min = pagination.min($scope.resultsNumber,$scope.page,$scope.configuration.itemsPerPage); + $scope.max = pagination.max($scope.page,$scope.configuration.itemsPerPage,$scope.resultsNumber); + $scope.next = function() { + $scope.page++; + $scope.formParams = pagination.next($scope.page,$scope.formParams,$scope.configuration.itemsPerPage,$scope.filters); + readData($scope.formParams); }; - self.previous = function() { - self.page--; - self.formParams = pagination.previous(self.page,self.formParams,self.configuration.itemsPerPage,self.filters); - readData(self.formParams); + $scope.previous = function() { + $scope.page--; + $scope.formParams = pagination.previous($scope.page,$scope.formParams,$scope.configuration.itemsPerPage,$scope.filters); + readData($scope.formParams); }; - self.goToPage = function() { - self.formParams = pagination.goToPage(self.page,self.formParams,self.configuration.itemsPerPage,self.filters); - readData(self.formParams); + $scope.goToPage = function() { + $scope.formParams = pagination.goToPage($scope.page,$scope.formParams,$scope.configuration.itemsPerPage,$scope.filters); + readData($scope.formParams); } }; - self.checkIfSelected = function(row) { + $scope.checkIfSelected = function(row) { - if((self.selectedRow).indexOf(row) !== -1 ){ + if(($scope.selectedRow).indexOf(row) !== -1 ){ return 'blue'; } } @@ -633,5 +633,19 @@ return rows; } + $scope.$watch('data',function(newValue,oldValue){ + if (newValue.length==oldValue.length){ + for(var i = 0 ; i +
-

{{rc.configuration.title}}

+

{{configuration.title}}

-
+
Clear - +
- + - - + + {{opt.column_1}}
Filter - +
Save - +
- +
- - + -
  -
- {{col.title}} - {{col.title}} +
+
+ {{col.title}} + {{col.title}} - + Move Left - + Move Right @@ -60,22 +60,22 @@

{{rc.configuration.title}}

- + Add row
{{$index+1}} +
{{row[col.field] }} - - + + -
+
{{row[col.field] | number}} {{row[col.field]}} {{row[col.field] | date:"MM/dd/yyyy"}} @@ -83,19 +83,19 @@

{{rc.configuration.title}}

{{row[col.field]}} {{row[col.field] | decimal:col.format}}
- + - -
- - {{opt.column_1}} +
+ + {{opt.column_1}}
-
+
- {{opt.column_1}} + {{opt.column_1}}
@@ -105,16 +105,16 @@

{{rc.configuration.title}}

- +
- +
- - - +
+
{{col.title}} @@ -123,33 +123,33 @@

{{rc.configuration.title}}

+
{{row[col.field] }} - {{row[col.field] | number:rc.getDecimalPlaces(col.field) }} + {{row[col.field] | number:getDecimalPlaces(col.field) }} - - -
+ + +
{{row[col.field] | number}} {{row[col.field] | date:"MM/dd/yyyy"}} {{row[col.field]}} {{row[col.field] | decimal:col.format}}
- + - -
- - {{opt.column_1}} +
+ + {{opt.column_1}}
-
+
- {{opt.column_1}} + {{opt.column_1}}
@@ -161,19 +161,19 @@

{{rc.configuration.title}}

-