From 03f323d6e284ecc7b126a3a86272b13abd55bc40 Mon Sep 17 00:00:00 2001 From: Dulitha Wijewantha Date: Mon, 18 Jul 2016 12:29:58 +0530 Subject: [PATCH 1/6] Fixed a bug where getBoolean wasn't used --- .../core/operation/mgt/dao/impl/CommandOperationDAOImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java index 464597dc05..d21872b103 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/CommandOperationDAOImpl.java @@ -99,7 +99,7 @@ public class CommandOperationDAOImpl extends GenericOperationDAOImpl { if (rs.next()) { commandOperation = new CommandOperation(); - commandOperation.setEnabled(rs.getInt("ENABLED") != 0); + commandOperation.setEnabled(rs.getBoolean("ENABLED")); } } catch (SQLException e) { throw new OperationManagementDAOException("SQL Error occurred while retrieving the command operation " + From b8635db485350ad57e9a288cf7c546a0ddfb400a Mon Sep 17 00:00:00 2001 From: Ace Date: Thu, 21 Jul 2016 07:42:20 +0530 Subject: [PATCH 2/6] Adding changes to common modules to accomodate ui restructuring --- .../app/modules/backend-service-invoker.js | 401 +++++++++--------- .../jaggeryapps/devicemgt/app/modules/util.js | 9 +- .../public/js/invoker-lib.js | 95 ++--- 3 files changed, 250 insertions(+), 255 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/backend-service-invoker.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/backend-service-invoker.js index 30c5edaff8..19e5a7c379 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/backend-service-invoker.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/backend-service-invoker.js @@ -1,43 +1,47 @@ /* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except * in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /** - * This backendServiceInvoker contains the wrappers for back end jaggary calls. + * This backendServiceInvoker contains the wrappers for back end jaggery calls. */ var backendServiceInvoker = function () { var log = new Log("/app/modules/backend-service-invoker.js"); + var publicXMLHTTPInvokers = {}; + var publicHTTPClientInvokers = {}; + var privateMethods = {}; var publicWSInvokers = {}; - var publicHTTPClientInvokers = {}; - var IS_OAUTH_ENABLED = true; + var TOKEN_EXPIRED = "Access token expired"; var TOKEN_INVALID = "Invalid input. Access token validation failed"; + + var devicemgtProps = require("/app/conf/devicemgt-props.js").config(); var constants = require("/app/modules/constants.js"); - var tokenUtil = require("/app/modules/api-wrapper-util.js").apiWrapperUtil; - var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); + var userModule = require("/app/modules/user.js")["userModule"]; + var tokenUtil = require("/app/modules/api-wrapper-util.js")["apiWrapperUtil"]; /** - * This methoad reads the token pair from the session and return the access token. + * This method reads the token pair from the session and return the access token. * If the token pair s not set in the session this will send a redirect to the login page. */ privateMethods.getAccessToken = function () { - var tokenPair = session.get(constants.ACCESS_TOKEN_PAIR_IDENTIFIER); + var tokenPair = session.get(constants["ACCESS_TOKEN_PAIR_IDENTIFIER"]); if (tokenPair) { return tokenPair.accessToken; } else { @@ -46,152 +50,119 @@ var backendServiceInvoker = function () { }; /** - * This method add Oauth authentication header to outgoing XMLHTTP Requests if Oauth authentication is enabled. - * @param method HTTP request type. - * @param url target url. - * @param payload payload/data which need to be send. - * @param successCallback a function to be called if the respond if successful. - * @param errorCallback a function to be called if en error is reserved. + * --------------------------------------------------------------------------- + * Start of XML-HTTP-REQUEST based Interceptor implementations + * --------------------------------------------------------------------------- + */ + + /** + * This method add Oauth authentication header to outgoing XML-HTTP Requests if Oauth authentication is enabled. + * @param httpMethod HTTP request type. + * @param requestPayload payload/data if exists which is needed to be send. + * @param endpoint Backend REST API url. + * @param responseCallback a function to be called with response retrieved. * @param count a counter which hold the number of recursive execution */ - privateMethods.execute = function (method, url, successCallback, errorCallback, payload, count, contentType, acceptType) { + privateMethods.execute = function (httpMethod, requestPayload, endpoint, responseCallback, count) { var xmlHttpRequest = new XMLHttpRequest(); - xmlHttpRequest.open(method, url); - if(!contentType){ - contentType = constants.APPLICATION_JSON; - } - if(!acceptType){ - acceptType = constants.APPLICATION_JSON; - } - xmlHttpRequest.setRequestHeader(constants.CONTENT_TYPE_IDENTIFIER, contentType); - xmlHttpRequest.setRequestHeader(constants.ACCEPT_IDENTIFIER, acceptType); - xmlHttpRequest.setRequestHeader(constants.REFERER, String(privateMethods.getClientDomain())); - if (IS_OAUTH_ENABLED) { + + xmlHttpRequest.open(httpMethod, endpoint); + xmlHttpRequest.setRequestHeader(constants["CONTENT_TYPE_IDENTIFIER"], constants["APPLICATION_JSON"]); + xmlHttpRequest.setRequestHeader(constants["ACCEPT_IDENTIFIER"], constants["APPLICATION_JSON"]); + + if (devicemgtProps["isOAuthEnabled"]) { var accessToken = privateMethods.getAccessToken(); if (!accessToken) { - response.sendRedirect(devicemgtProps["httpsURL"] + "/devicemgt/login"); + userModule.logout(function () { + response.sendRedirect(devicemgtProps["appContext"] + "login"); + }); } else { - xmlHttpRequest.setRequestHeader(constants.AUTHORIZATION_HEADER, constants.BEARER_PREFIX + accessToken); + xmlHttpRequest. + setRequestHeader(constants["AUTHORIZATION_HEADER"], constants["BEARER_PREFIX"] + accessToken); } } - if (payload) { - xmlHttpRequest.send(payload); + + if (requestPayload) { + xmlHttpRequest.send(requestPayload); } else { xmlHttpRequest.send(); } - if ((xmlHttpRequest.status >= 200 && xmlHttpRequest.status < 300) || xmlHttpRequest.status == 302) { - if (xmlHttpRequest.responseText != null) { - return successCallback(parse(xmlHttpRequest.responseText)); - } else { - return successCallback({"status": xmlHttpRequest.status, "messageFromServer": "Operation Completed"}); - } - } else if (xmlHttpRequest.status == 401 && (xmlHttpRequest.responseText == TOKEN_EXPIRED || - xmlHttpRequest.responseText == TOKEN_INVALID ) && count < 5) { + log.debug("Service Invoker-URL: " + endpoint); + log.debug("Service Invoker-Method: " + httpMethod); + + log.info("Request : " + httpMethod + " " + endpoint); + log.info("Request payload if any : " + stringify(requestPayload)); + log.info("Response status : " + xmlHttpRequest.status); + log.info("Response payload if any : " + xmlHttpRequest.responseText); + //log.info("Response headers : " + xmlHttpRequest.getAllResponseHeaders()); + + if (xmlHttpRequest.status == 401 && (xmlHttpRequest.responseText == TOKEN_EXPIRED || + xmlHttpRequest.responseText == TOKEN_INVALID ) && count < 5) { tokenUtil.refreshToken(); - return privateMethods.execute(method, url, successCallback, errorCallback, payload, (count + 1)); - } else if (xmlHttpRequest.status == 500) { - return errorCallback(xmlHttpRequest); + return privateMethods.execute(httpMethod, requestPayload, endpoint, responseCallback, ++count); } else { - return errorCallback(xmlHttpRequest); + return responseCallback(xmlHttpRequest); } }; /** - * This method add Oauth authentication header to outgoing XMLHTTP Requests if Oauth authentication is enabled. - * @param method HTTP request type. - * @param url target url. - * @param payload payload/data which need to be send. - * @param successCallback a function to be called if the respond if successful. - * @param errorCallback a function to be called if en error is reserved. + * This method add Oauth authentication header to outgoing XML-HTTP Requests if Oauth authentication is enabled. + * @param httpMethod HTTP request type. + * @param requestPayload payload/data if exists which is needed to be send. + * @param endpoint Backend REST API url. + * @param responseCallback a function to be called with response retrieved. */ - privateMethods.initiateXMLHTTPRequest = function (method, url, successCallback, errorCallback, payload, contentType, acceptType) { - if (privateMethods.getAccessToken()) { - return privateMethods.execute(method, url, successCallback, errorCallback, payload, 0, contentType, acceptType); - } + privateMethods.initiateXMLHTTPRequest = function (httpMethod, requestPayload, endpoint, responseCallback) { + return privateMethods.execute(httpMethod, requestPayload, endpoint, responseCallback, 0); }; /** - * This method add Oauth authentication header to outgoing HTTPClient Requests if Oauth authentication is enabled. - * @param method HTTP request type. - * @param url target url. - * @param payload payload/data which need to be send. - * @param successCallback a function to be called if the respond if successful. - * @param errorCallback a function to be called if en error is reserved. + * This method invokes return initiateXMLHttpRequest for get calls + * @param endpoint Backend REST API url. + * @param responseCallback a function to be called with response retrieved. */ - privateMethods.initiateHTTPClientRequest = function (method, url, successCallback, errorCallback, payload, contentType, acceptType) { - var HttpClient = Packages.org.apache.commons.httpclient.HttpClient; - var httpMethodObject; - switch (method) { - case constants.HTTP_POST: - var PostMethod = Packages.org.apache.commons.httpclient.methods.PostMethod; - httpMethodObject = new PostMethod(url); - break; - case constants.HTTP_PUT: - var PutMethod = Packages.org.apache.commons.httpclient.methods.PutMethod; - httpMethodObject = new PutMethod(url); - break; - case constants.HTTP_GET: - var GetMethod = Packages.org.apache.commons.httpclient.methods.GetMethod; - httpMethodObject = new GetMethod(url); - break; - case constants.HTTP_DELETE: - var DeleteMethod = Packages.org.apache.commons.httpclient.methods.DeleteMethod; - httpMethodObject = new DeleteMethod(url); - break; - default: - throw new IllegalArgumentException("Invalid HTTP request type: " + method); - } - var Header = Packages.org.apache.commons.httpclient.Header; - var header = new Header(); - header.setName(constants.CONTENT_TYPE_IDENTIFIER); - header.setValue(contentType); - httpMethodObject.addRequestHeader(header); - header = new Header(); - header.setName(constants.ACCEPT_IDENTIFIER); - header.setValue(acceptType); - httpMethodObject.addRequestHeader(header); - header = new Header(); - header.setName(constants.REFERER); - header.setValue(String(privateMethods.getClientDomain())); - httpMethodObject.addRequestHeader(header); - if (IS_OAUTH_ENABLED) { - var accessToken = privateMethods.getAccessToken(); - if (accessToken) { - header = new Header(); - header.setName(constants.AUTHORIZATION_HEADER); - header.setValue(constants.BEARER_PREFIX + accessToken); - httpMethodObject.addRequestHeader(header); - } else { - response.sendRedirect(devicemgtProps["httpsURL"] + "/devicemgt/login"); - } + publicXMLHTTPInvokers.get = function (endpoint, responseCallback) { + var requestPayload = null; + return privateMethods.initiateXMLHTTPRequest(constants["HTTP_GET"], requestPayload, endpoint, responseCallback); + }; - } - if (payload) { - var stringRequestEntity = new StringRequestEntity(stringify(payload)); - httpMethodObject.setRequestEntity(stringRequestEntity); - } - var client = new HttpClient(); - try { - client.executeMethod(httpMethodObject); - var status = httpMethodObject.getStatusCode(); - if (status == 200) { - var responseContentDispositionHeader = httpMethodObject.getResponseHeader(constants.CONTENT_DISPOSITION_IDENTIFIER); - if (responseContentDispositionHeader) { - return successCallback(httpMethodObject.getResponseBodyAsStream(), httpMethodObject.getResponseHeaders()); - } else { - return successCallback(httpMethodObject.getResponseBody()); - } - } else { - return errorCallback(httpMethodObject.getResponseBody()); - } - } catch (e) { - return errorCallback(response); - } finally { - httpMethodObject.releaseConnection(); - } + /** + * This method invokes return initiateXMLHttpRequest for post calls + * @param endpoint Backend REST API url. + * @param requestPayload payload/data if exists which is needed to be send. + * @param responseCallback a function to be called with response retrieved. + */ + publicXMLHTTPInvokers.post = function (endpoint, requestPayload, responseCallback) { + return privateMethods.initiateXMLHTTPRequest(constants["HTTP_POST"], requestPayload, endpoint, responseCallback); + }; + + /** + * This method invokes return initiateXMLHttpRequest for put calls + * @param endpoint Backend REST API url. + * @param requestPayload payload/data if exists which is needed to be send. + * @param responseCallback a function to be called with response retrieved. + */ + publicXMLHTTPInvokers.put = function (endpoint, requestPayload, responseCallback) { + return privateMethods.initiateXMLHTTPRequest(constants["HTTP_PUT"], requestPayload, endpoint, responseCallback); }; + /** + * This method invokes return initiateXMLHttpRequest for delete calls + * @param endpoint Backend REST API url. + * @param responseCallback a function to be called with response retrieved. + */ + publicXMLHTTPInvokers.delete = function (endpoint, responseCallback) { + var requestPayload = null; + return privateMethods.initiateXMLHTTPRequest(constants["HTTP_DELETE"], requestPayload, endpoint, responseCallback); + }; + + /** + * --------------------------------------------------------------------------- + * Start of WS-REQUEST based Interceptor implementations + * --------------------------------------------------------------------------- + */ + /** * This method add Oauth authentication header to outgoing WS Requests if Oauth authentication is enabled. * @param action @@ -202,32 +173,26 @@ var backendServiceInvoker = function () { * @param soapVersion soapVersion which need to used. */ privateMethods.initiateWSRequest = function (action, endpoint, successCallback, errorCallback, soapVersion, payload) { - var ws = require('ws'); + var ws = require("ws"); var wsRequest = new ws.WSRequest(); var options = []; - if (IS_OAUTH_ENABLED) { + if (devicemgtProps["isOAuthEnabled"]) { var accessToken = privateMethods.getAccessToken(); if (accessToken) { - var authenticationHeaderName = String(constants.AUTHORIZATION_HEADER); - var authenticationHeaderValue = String(constants.BEARER_PREFIX + accessToken); + var authenticationHeaderName = String(constants["AUTHORIZATION_HEADER"]); + var authenticationHeaderValue = String(constants["BEARER_PREFIX"] + accessToken); var headers = []; var oAuthAuthenticationData = {}; oAuthAuthenticationData.name = authenticationHeaderName; oAuthAuthenticationData.value = authenticationHeaderValue; headers.push(oAuthAuthenticationData); - - var referrerData = {}; - referrerData.name = constants.REFERER; - referrerData.value = String(privateMethods.getClientDomain()); - headers.push(referrerData); - options.HTTPHeaders = headers; } else { - response.sendRedirect(devicemgtProps["httpsURL"] + "/devicemgt/login"); + response.sendRedirect(devicemgtProps["appContext"] + "login"); } } options.useSOAP = soapVersion; - options.useWSA = constants.WEB_SERVICE_ADDRESSING_VERSION; + options.useWSA = constants["WEB_SERVICE_ADDRESSING_VERSION"]; options.action = action; var wsResponse; try { @@ -245,68 +210,104 @@ var backendServiceInvoker = function () { }; /** - * This method invokes return initiateXMLHttpRequest for get calls - * @param url target url. + * This method invokes return initiateWSRequest for soap calls + * @param action describes particular soap action. + * @param requestPayload SOAP request payload which is needed to be send. + * @param endpoint service end point to be triggered. * @param successCallback a function to be called if the respond if successful. * @param errorCallback a function to be called if en error is reserved. + * @param soapVersion soapVersion which need to used. */ - publicXMLHTTPInvokers.get = function (url, successCallback, errorCallback, contentType, acceptType) { - return privateMethods.initiateXMLHTTPRequest(constants.HTTP_GET, url, successCallback, errorCallback, contentType, acceptType); + publicWSInvokers.soapRequest = function (action, requestPayload, endpoint, successCallback, errorCallback, soapVersion) { + return privateMethods.initiateWSRequest(action, endpoint, successCallback, errorCallback, soapVersion, requestPayload); }; /** - * This method invokes return initiateXMLHttpRequest for post calls - * @param url target url. - * @param payload payload/data which need to be send. - * @param successCallback a function to be called if the respond if successful. - * @param errorCallback a function to be called if en error is reserved. + * --------------------------------------------------------------------------- + * Start of HTTP-CLIENT-REQUEST based Interceptor implementations + * --------------------------------------------------------------------------- */ - publicXMLHTTPInvokers.post = function (url, payload, successCallback, errorCallback, contentType, acceptType) { - return privateMethods.initiateXMLHTTPRequest(constants.HTTP_POST, url, successCallback, errorCallback, payload, contentType, acceptType); - }; /** - * This method invokes return initiateXMLHttpRequest for put calls + * This method add Oauth authentication header to outgoing HTTPClient Requests if Oauth authentication is enabled. + * @param method HTTP request type. * @param url target url. * @param payload payload/data which need to be send. * @param successCallback a function to be called if the respond if successful. * @param errorCallback a function to be called if en error is reserved. */ - publicXMLHTTPInvokers.put = function (url, payload, successCallback, errorCallback, contentType, acceptType) { - return privateMethods.initiateXMLHTTPRequest(constants.HTTP_PUT, url, successCallback, errorCallback, payload, contentType, acceptType); - }; - - /** - * This method invokes return initiateXMLHttpRequest for delete calls - * @param url target url. - * @param successCallback a function to be called if the respond if successful. - * @param errorCallback a function to be called if en error is reserved. - */ - publicXMLHTTPInvokers.delete = function (url, successCallback, errorCallback, contentType, acceptType) { - return privateMethods.initiateXMLHTTPRequest(constants.HTTP_DELETE, url, successCallback, errorCallback, contentType, acceptType); - }; + privateMethods.initiateHTTPClientRequest = function (method, url, successCallback, errorCallback, payload) { + var HttpClient = Packages.org.apache.commons.httpclient.HttpClient; + var httpMethodObject; + switch (method) { + case constants["HTTP_GET"]: + var GetMethod = Packages.org.apache.commons.httpclient.methods.GetMethod; + httpMethodObject = new GetMethod(url); + break; + case constants["HTTP_POST"]: + var PostMethod = Packages.org.apache.commons.httpclient.methods.PostMethod; + httpMethodObject = new PostMethod(url); + break; + case constants["HTTP_PUT"]: + var PutMethod = Packages.org.apache.commons.httpclient.methods.PutMethod; + httpMethodObject = new PutMethod(url); + break; + case constants["HTTP_DELETE"]: + var DeleteMethod = Packages.org.apache.commons.httpclient.methods.DeleteMethod; + httpMethodObject = new DeleteMethod(url); + break; + default: + throw new IllegalArgumentException("Invalid HTTP request method: " + method); + } + var Header = Packages.org.apache.commons.httpclient.Header; + var header = new Header(); + header.setName(constants["CONTENT_TYPE_IDENTIFIER"]); + header.setValue(constants["APPLICATION_JSON"]); + httpMethodObject.addRequestHeader(header); + header = new Header(); + header.setName(constants["ACCEPT_IDENTIFIER"]); + header.setValue(constants["APPLICATION_JSON"]); + httpMethodObject.addRequestHeader(header); - /** - * This method invokes return initiateWSRequest for soap calls - * @param endpoint service end point to be triggered. - * @param payload soap payload which need to be send. - * @param successCallback a function to be called if the respond if successful. - * @param errorCallback a function to be called if en error is reserved. - * @param soapVersion soapVersion which need to used. - */ - publicWSInvokers.soapRequest = function (action, endpoint, payload, successCallback, errorCallback, soapVersion) { - return privateMethods.initiateWSRequest(action, endpoint, successCallback, errorCallback, soapVersion, payload); + if (devicemgtProps["isOAuthEnabled"]) { + var accessToken = privateMethods.getAccessToken(); + if (accessToken) { + header = new Header(); + header.setName(constants["AUTHORIZATION_HEADER"]); + header.setValue(constants["BEARER_PREFIX"] + accessToken); + httpMethodObject.addRequestHeader(header); + } else { + response.sendRedirect(devicemgtProps["appContext"] + "login"); + } + } + var stringRequestEntity = new StringRequestEntity(stringify(payload)); + httpMethodObject.setRequestEntity(stringRequestEntity); + var client = new HttpClient(); + try { + client.executeMethod(httpMethodObject); + var status = httpMethodObject.getStatusCode(); + if (status == 200) { + return successCallback(httpMethodObject.getResponseBody()); + } else { + return errorCallback(httpMethodObject.getResponseBody()); + } + } catch (e) { + return errorCallback(response); + } finally { + method.releaseConnection(); + } }; - /** * This method invokes return initiateHTTPClientRequest for get calls * @param url target url. * @param successCallback a function to be called if the respond if successful. * @param errorCallback a function to be called if en error is reserved. */ - publicHTTPClientInvokers.get = function (url, successCallback, errorCallback, contentType, acceptType) { - return privateMethods.initiateHTTPClientRequest(constants.HTTP_GET, url, successCallback, errorCallback, null, contentType, acceptType); + publicHTTPClientInvokers.get = function (url, successCallback, errorCallback) { + var requestPayload = null; + return privateMethods. + initiateHTTPClientRequest(constants["HTTP_GET"], url, successCallback, errorCallback, requestPayload); }; /** @@ -316,9 +317,9 @@ var backendServiceInvoker = function () { * @param successCallback a function to be called if the respond if successful. * @param errorCallback a function to be called if en error is reserved. */ - publicHTTPClientInvokers.post = function (url, payload, successCallback, errorCallback, contentType, acceptType) { + publicHTTPClientInvokers.post = function (url, payload, successCallback, errorCallback) { return privateMethods. - initiateHTTPClientRequest(constants.HTTP_POST, url, successCallback, errorCallback, payload, contentType, acceptType); + initiateHTTPClientRequest(constants["HTTP_POST"], url, successCallback, errorCallback, payload); }; /** @@ -328,8 +329,9 @@ var backendServiceInvoker = function () { * @param successCallback a function to be called if the respond if successful. * @param errorCallback a function to be called if en error is reserved. */ - publicHTTPClientInvokers.put = function (url, payload, successCallback, errorCallback, contentType, acceptType) { - return privateMethods.initiateHTTPClientRequest(constants.HTTP_PUT, url, successCallback, errorCallback, payload, contentType, acceptType); + publicHTTPClientInvokers.put = function (url, payload, successCallback, errorCallback) { + return privateMethods. + initiateHTTPClientRequest(constants["HTTP_PUT"], url, successCallback, errorCallback, payload); }; /** @@ -338,23 +340,16 @@ var backendServiceInvoker = function () { * @param successCallback a function to be called if the respond if successful. * @param errorCallback a function to be called if en error is reserved. */ - publicHTTPClientInvokers.delete = function (url, successCallback, errorCallback, contentType, acceptType) { - return privateMethods.initiateHTTPClientRequest(constants.HTTP_DELETE, url, successCallback, errorCallback, contentType, acceptType); + publicHTTPClientInvokers.delete = function (url, successCallback, errorCallback) { + var requestPayload = null; + return privateMethods. + initiateHTTPClientRequest(constants["HTTP_DELETE"], url, successCallback, errorCallback, requestPayload); }; - /** - * This method fetch the current logged user from the session and returns - * the tenant domain name of the user - * @returns {tenantDomain} - */ - privateMethods.getClientDomain = function () { - var user = session.get(constants.USER_SESSION_KEY); - return user.domain; - } + var publicMethods = {}; + publicMethods.XMLHttp = publicXMLHTTPInvokers; + publicMethods.WS = publicWSInvokers; + publicMethods.HttpClient = publicHTTPClientInvokers; - var publicInvokers = {}; - publicInvokers.XMLHttp = publicXMLHTTPInvokers; - publicInvokers.WS = publicWSInvokers; - publicInvokers.HttpClient = publicHTTPClientInvokers; - return publicInvokers; -}(); \ No newline at end of file + return publicMethods; +}(); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/util.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/util.js index 1deb5c6093..3334ea6664 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/util.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/util.js @@ -25,11 +25,12 @@ var util = function () { var carbon = require('carbon'); var constants = require("/app/modules/constants.js"); var adminUser = devicemgtProps["adminUser"]; + var clientName = devicemgtProps["clientName"]; module.getDyanmicCredentials = function (owner) { var payload = { "callbackUrl": devicemgtProps.callBackUrl, - "clientName": "devicemgt", + "clientName": clientName, "tokenScope": "admin", "owner": adminUser, "applicationType": "webapp", @@ -79,7 +80,7 @@ var util = function () { */ module.getTokenWithPasswordGrantType = function (username, password, encodedClientKeys, scope) { var xhr = new XMLHttpRequest(); - var tokenEndpoint = devicemgtProps.idPServer + "/token"; + var tokenEndpoint = devicemgtProps.idPServer; xhr.open("POST", tokenEndpoint, false); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("Authorization", "Basic " + encodedClientKeys); @@ -119,7 +120,7 @@ var util = function () { encodedExtractedAssertion = this.encode(extractedAssertion); var xhr = new XMLHttpRequest(); - var tokenEndpoint = devicemgtProps.idPServer + "/token"; + var tokenEndpoint = devicemgtProps.idPServer; xhr.open("POST", tokenEndpoint, false); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("Authorization", "Basic " + clientKeys); @@ -140,7 +141,7 @@ var util = function () { module.refreshToken = function (tokenPair, clientData, scope) { var xhr = new XMLHttpRequest(); - var tokenEndpoint = devicemgtProps.idPServer + "/token"; + var tokenEndpoint = devicemgtProps.idPServer; xhr.open("POST", tokenEndpoint, false); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("Authorization", "Basic " + clientData); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/public/js/invoker-lib.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/public/js/invoker-lib.js index cd9d2e5d29..30f2be1c64 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/public/js/invoker-lib.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/public/js/invoker-lib.js @@ -1,72 +1,71 @@ /* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except * in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ var invokerUtil = function () { - var module = {}; + var publicMethods = {}; + var privateMethods = {}; - var END_POINT = window.location.origin+"/devicemgt/api/invoker/execute/"; + privateMethods.execute = function (requestMethod, requestURL, requestPayload, successCallback, errorCallback) { + var restAPIRequestDetails = {}; + restAPIRequestDetails["requestMethod"] = requestMethod; + restAPIRequestDetails["requestURL"] = requestURL; + restAPIRequestDetails["requestPayload"] = JSON.stringify(requestPayload); + var appContext = devicemgtProps["appContext"]; - module.get = function (url, successCallback, errorCallback, contentType, acceptType) { - var payload = null; - execute("GET", url, payload, successCallback, errorCallback, contentType, acceptType); + var request = { + url: appContext + "api/invoker/execute/", + type: "POST", + contentType: "application/json", + data: JSON.stringify(restAPIRequestDetails), + accept: "application/json", + success: successCallback, + error: function (jqXHR) { + if (jqXHR.status == 401) { + console.log("Unauthorized access attempt!"); + $(modalPopupContent).html($("#error-msg").html()); + showPopup(); + } else { + errorCallback(jqXHR); + } + } + }; + + $.ajax(request); }; - module.post = function (url, payload, successCallback, errorCallback, contentType, acceptType) { - execute("POST", url, payload, successCallback, errorCallback, contentType, acceptType); + + publicMethods.get = function (requestURL, successCallback, errorCallback) { + var requestPayload = null; + privateMethods.execute("GET", requestURL, requestPayload, successCallback, errorCallback); }; - module.put = function (url, payload, successCallback, errorCallback, contentType, acceptType) { - execute("PUT", url, payload, successCallback, errorCallback, contentType, acceptType); + + publicMethods.post = function (requestURL, requestPayload, successCallback, errorCallback) { + privateMethods.execute("POST", requestURL, requestPayload, successCallback, errorCallback); }; - module.delete = function (url, successCallback, errorCallback, contentType, acceptType) { - var payload = null; - execute("DELETE", url, payload, successCallback, errorCallback, contentType, acceptType); + + publicMethods.put = function (requestURL, requestPayload, successCallback, errorCallback) { + privateMethods.execute("PUT", requestURL, requestPayload, successCallback, errorCallback); }; - function execute (methoad, url, payload, successCallback, errorCallback, contentType, acceptType) { - if(contentType == undefined){ - contentType = "application/json"; - } - if(acceptType == undefined){ - acceptType = "application/json"; - } - var data = { - url: END_POINT, - type: "POST", - contentType: contentType, - accept: acceptType, - success: successCallback - }; - var paramValue = {}; - paramValue.actionMethod = methoad; - paramValue.actionUrl = url; - paramValue.actionPayload = payload; - if(contentType == "application/json"){ - paramValue.actionPayload = JSON.stringify(payload); - } - data.data = JSON.stringify(paramValue); - $.ajax(data).fail(function (jqXHR) { - if (jqXHR.status == "401") { - console.log("Unauthorized access attempt!"); - $(modalPopupContent).html($('#error-msg').html()); - showPopup(); - } else { - errorCallback(jqXHR); - } - }); + + publicMethods.delete = function (requestURL, successCallback, errorCallback) { + var requestPayload = null; + privateMethods.execute("DELETE", requestURL, requestPayload, successCallback, errorCallback); }; - return module; + + return publicMethods; }(); From 31b62e633654be43f0f3d003520387e8fd2ed2a1 Mon Sep 17 00:00:00 2001 From: dilanua Date: Thu, 21 Jul 2016 12:54:39 +0530 Subject: [PATCH 3/6] Adding jaggery.conf url mapping for data-tables-invoker-api --- .../jaggeryapps/devicemgt/api/data-tables-invoker-api.jag | 2 +- .../src/main/resources/jaggeryapps/devicemgt/jaggery.conf | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/data-tables-invoker-api.jag b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/data-tables-invoker-api.jag index 160a7ff517..88babb54f0 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/data-tables-invoker-api.jag +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/api/data-tables-invoker-api.jag @@ -22,7 +22,7 @@ var log = new Log("api/data-tables-invoker-api.jag"); var uri = request.getRequestURI(); var uriMatcher = new URIMatcher(String(uri)); -var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); +var devicemgtProps = require("/app/conf/devicemgt-props.js").config(); var serviceInvokers = require("/app/modules/backend-service-invoker.js")["backendServiceInvoker"]; if (uriMatcher.match("/{context}/api/data-tables/invoker")) { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/jaggery.conf b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/jaggery.conf index 28ddcefb6c..909af4c456 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/jaggery.conf +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/jaggery.conf @@ -1,6 +1,6 @@ { "displayName": "Carbon Device Management App", - "logLevel": "warn", + "logLevel": "info", "initScripts": ["/app/modules/init.js"], "urlMappings": [ { @@ -50,6 +50,10 @@ { "url": "/*", "path": "/lib/pages.jag" + }, + { + "url": "/api/data-tables/invoker", + "path": "/api/data-tables-invoker-api.jag" } ] } \ No newline at end of file From c8b37207fcfd9fa3ea93904534b93c733ef78571 Mon Sep 17 00:00:00 2001 From: Ace Date: Thu, 21 Jul 2016 15:03:17 +0530 Subject: [PATCH 4/6] Fixing context issue in service-invoker --- .../public/js/invoker-lib.js | 3 +-- .../service-invoker-utility.hbs | 14 +++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/public/js/invoker-lib.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/public/js/invoker-lib.js index 30f2be1c64..a63dcbd5b0 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/public/js/invoker-lib.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/public/js/invoker-lib.js @@ -26,10 +26,9 @@ var invokerUtil = function () { restAPIRequestDetails["requestMethod"] = requestMethod; restAPIRequestDetails["requestURL"] = requestURL; restAPIRequestDetails["requestPayload"] = JSON.stringify(requestPayload); - var appContext = devicemgtProps["appContext"]; var request = { - url: appContext + "api/invoker/execute/", + url: context + "/api/invoker/execute/", type: "POST", contentType: "application/json", data: JSON.stringify(restAPIRequestDetails), diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/service-invoker-utility.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/service-invoker-utility.hbs index 1659537657..af0fa53631 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/service-invoker-utility.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.lib.service-invoker-utility/service-invoker-utility.hbs @@ -15,10 +15,7 @@ specific language governing permissions and limitations under the License. }} -{{#zone "bottomJs"}} - {{js "js/js.cookie.js"}} - {{js "js/invoker-lib.js"}} - +{{#zone "content"}}
@@ -34,4 +31,11 @@
-{{/zone}} \ No newline at end of file +{{/zone}} +{{#zone "bottomJs"}} + + {{js "js/js.cookie.js"}} + {{js "js/invoker-lib.js"}} +{{/zone}} From 177b7cf3dfc81ad063477ae228f852943caddfaa Mon Sep 17 00:00:00 2001 From: dilanua Date: Thu, 21 Jul 2016 17:58:59 +0530 Subject: [PATCH 5/6] Refactoring data-tables-extended-unit --- .../data-tables-extended.hbs | 3 +- .../dataTables.extended.serversidepaging.js | 281 ++++++++++++++++++ 2 files changed, 283 insertions(+), 1 deletion(-) create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/js/dataTables.extended.serversidepaging.js diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.hbs index ebe533ca13..0bb33aa8cb 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/data-tables-extended.hbs @@ -19,9 +19,10 @@ {{~css "css/dataTables.bootstrap.css"}} {{~css "css/dataTables.responsive.css"}} {{/zone}} -{{~#zone "bottomJs"}} +{{#zone "bottomJs"}} {{~js "js/jquery.dataTables.min.js"}} {{~js "js/dataTables.bootstrap.js"}} {{~js "js/dataTables.responsive.min.js"}} {{~js "js/dataTables.extended.js"}} + {{~js "js/dataTables.extended.serversidepaging.js"}} {{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/js/dataTables.extended.serversidepaging.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/js/dataTables.extended.serversidepaging.js new file mode 100644 index 0000000000..1ac4db312d --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.data-tables-extended/public/js/dataTables.extended.serversidepaging.js @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * ========================================================= + * data-tables extended function (Server-side Pagination) + * ========================================================= + */ + +/** + * @namespace $ + * The $ is just a function. + * It is actually an alias for the function called jQuery. + * For ex: $(this) means jQuery(this) and S.fn.x means jQuery.fn.x + */ + + $.fn.datatables_extended_serverside_paging = function (settings , url, dataFilter, + columns, fnCreatedRow, fnDrawCallback) { + var elem = $(this); + + // EMM related function + if (initiateViewOption) { + $(".viewEnabledIcon").bind("click", initiateViewOption); + } + //--- End of EMM related codes + + $(elem).DataTable( + $.extend({},{ + serverSide: true, + bSortCellsTop: true, + ajax : { + url: "/emm/api/data-tables/invoker", + data : function (params) { + var filter = ""; + var i; + for (i = 0; i < params.columns.length; i++) { + // console.log(i); + filter += "&" + params.columns[i].data + "=" + params.columns[i].search.value; + } + // console.log(filter); + params.offset = params.start; + params.limit = params.length; + params.filter = filter; + params.url = url; + }, + dataFilter: dataFilter + }, + columns: columns, + responsive: false, + autoWidth: false, + dom:'<"dataTablesTop"' + + 'f' + + '<"dataTables_toolbar">' + + '>' + + 'rt' + + '<"dataTablesBottom"' + + 'lip' + + '>', + language: { + searchPlaceholder: 'Search by Role name', + search: '' + }, + fnCreatedRow: fnCreatedRow, + "fnDrawCallback": fnDrawCallback, + initComplete: function () { + this.api().columns().every(function () { + + var column = this; + var filterColumn = $('.filter-row th', elem); + + /** + * Create & add select/text filters to each column + */ + if (filterColumn.eq(column.index()).hasClass('select-filter')) { + var select = $('') + .appendTo(filterColumn.eq(column.index()).empty()) + .on('change', function () { + var val = $.fn.dataTable.util.escapeRegex( + $(this).val() + ); + + column + //.search(val ? '^' + val + '$' : '', true, false) + .search(val ? val : '', true, false) + .draw(); + + if (filterColumn.eq(column.index()).hasClass('data-platform')) { + if (val == null || val == undefined || val == "") { + $("#operation-bar").hide(); + $("#operation-guide").show(); + } else { + $("#operation-guide").hide(); + $("#operation-bar").show(); + loadOperationBar(val); + } + } + }); + + $(column).each(function () { + if ($(column.nodes()).attr('data-search')) { + var titles = []; + column.nodes().unique().sort().each(function (d, j) { + var title = $(d).attr('data-display'); + if ($.inArray(title, titles) < 0) { + titles.push(title); + if (title !== undefined) { + select.append('') + } + } + }); + } else { + column.data().unique().sort().each(function (d, j) { + select.append('') + }); + } + }); + } else if (filterColumn.eq(column.index()).hasClass('text-filter')) { + var title = filterColumn.eq(column.index()).attr('data-for'); + $(filterColumn.eq(column.index()).empty()).html(''); + + filterColumn.eq(column.index()).find('input').on('keyup change', function () { + column.search($(this).val()).draw(); + if ($('.dataTables_empty').length > 0) { + $('.bulk-action-row').addClass("hidden"); + } else { + $('.bulk-action-row').removeClass("hidden"); + } + }); + } + + }); + + /** + * search input default styles override + */ + var search_input = $(this).closest('.dataTables_wrapper').find('div[id$=_filter] input'); + search_input.before('').removeClass('input-sm'); + + /** + * create sorting dropdown menu for list table advance operations + */ + var dropdownmenu = $(''); + $('.sort-row th', elem).each(function () { + if (!$(this).hasClass('no-sort')) { + dropdownmenu.append('
  • ' + $(this).html() + '
  • '); + } + }); + + /** + * append advance operations to list table toolbar + */ + $('.dataTable.list-table').closest('.dataTables_wrapper').find('.dataTablesTop .dataTables_toolbar').html('' + + '' + ); + + /** + * sorting dropdown menu select function + */ + $('.dataTables_wrapper .sort-list li a').click(function () { + $(this).closest('li').siblings('li').find('a').removeClass('sorting_asc').removeClass('sorting_desc'); + + var thisTable = $(this).closest('.dataTables_wrapper').find('.dataTable').dataTable(); + + if (!($(this).hasClass('sorting_asc')) && !($(this).hasClass('sorting_desc'))) { + $(this).addClass('sorting_asc'); + thisTable.fnSort([[$(this).attr('data-column'), 'asc']]); + } + else if ($(this).hasClass('sorting_asc')) { + $(this).switchClass('sorting_asc', 'sorting_desc'); + thisTable.fnSort([[$(this).attr('data-column'), 'desc']]); + } + else if ($(this).hasClass('sorting_desc')) { + $(this).switchClass('sorting_desc', 'sorting_asc'); + thisTable.fnSort([[$(this).attr('data-column'), 'asc']]); + } + }); + + var rowSelectedClass = 'DTTT_selected selected'; + + /** + * Enable/Disable selection on rows + */ + $('.dataTables_wrapper [data-click-event=toggle-selectable]').click(function () { + var button = this, + thisTable = $(this).closest('.dataTables_wrapper').find('.dataTable').dataTable(); + if ($(button).html() == 'Select') { + thisTable.addClass("table-selectable"); + $(button).addClass("active").html('Cancel'); + $(button).parent().next().children("button").removeClass("disabled"); + // EMM related code + $(".viewEnabledIcon").unbind("click"); + //--- End of EMM related codes + } else if ($(button).html() == 'Cancel') { + thisTable.removeClass("table-selectable"); + $(button).addClass("active").html('Select'); + $(button).parent().next().children().addClass("disabled"); + // EMM related function + $(".viewEnabledIcon").bind("click", initiateViewOption); + //--- End of EMM related codes + } + }); + /** + * select/deselect all rows function + */ + $('.dataTables_wrapper [data-click-event=toggle-selected]').click(function () { + var button = this, + thisTable = $(this).closest('.dataTables_wrapper').find('.dataTable').dataTable(); + if (!$(button).hasClass('disabled')) { + if ($(button).html() == 'Select All') { + thisTable.api().rows().every(function () { + $(this.node()).addClass(rowSelectedClass); + $(button).html('Deselect All'); + }); + } + else if ($(button).html() == 'Deselect All') { + thisTable.api().rows().every(function () { + $(this.node()).removeClass(rowSelectedClass); + $(button).html('Select All'); + }); + } + } + }); + + /** + * on row click select/deselect row function + */ + $('body').on('click', '[data-type=selectable]', function () { + var rowSelectedClass = 'DTTT_selected selected'; + $(this).toggleClass(rowSelectedClass); + var button = this, + thisTable = $(this).closest('.dataTables_wrapper').find('.dataTable').dataTable(); + + thisTable.api().rows().every(function () { + if (!$(this.node()).hasClass(rowSelectedClass)) { + $(button).closest('.dataTables_wrapper').find('[data-click-event=toggle-selected]').html('Select All'); + } + }); + }); + + /** + * list table list/grid view toggle function + */ + var toggleButton = $('[data-click-event=toggle-list-view]'); + toggleButton.click(function () { + if ($(this).attr('data-view') == 'grid') { + $(this).closest('.dataTables_wrapper').find('.dataTable').addClass('grid-view'); + //$(this).closest('li').hide(); + //$(this).closest('li').siblings().show(); + } + else { + $(this).closest('.dataTables_wrapper').find('.dataTable').removeClass('grid-view'); + //$(this).closest('li').hide(); + //$(this).closest('li').siblings().show(); + } + }) + } + },settings) + ); + +}; From da6ff6e7fa0c2f8f9cf2372083f0c4aaaee18991 Mon Sep 17 00:00:00 2001 From: dilanua Date: Thu, 21 Jul 2016 18:04:51 +0530 Subject: [PATCH 6/6] Refactoring user-listing page --- .../cdmf.page.users/public/js/listing.js | 274 ++++++++++-------- .../public/templates/listing.hbs | 5 + .../app/pages/cdmf.page.users/users.hbs | 7 +- .../app/pages/cdmf.page.users/users.js | 7 +- 4 files changed, 171 insertions(+), 122 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/js/listing.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/js/listing.js index 6c29b73a40..2ef13959c3 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/js/listing.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/js/listing.js @@ -1,21 +1,23 @@ /* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except * in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ +var deviceMgtAPIsBasePath = "/api/device-mgt/v1.0"; + /** * Checks if provided input is valid against RegEx input. * @@ -35,10 +37,10 @@ function inputIsValid(regExp, inputString) { $(function () { var sortableElem = '.wr-sortable'; $(sortableElem).sortable({ - beforeStop: function () { - var sortedIDs = $(this).sortable('toArray'); - } - }); + beforeStop: function () { + $(this).sortable('toArray'); + } + }); $(sortableElem).disableSelection(); }); @@ -46,11 +48,9 @@ var modalPopup = ".wr-modalpopup"; var modalPopupContainer = modalPopup + " .modalpopup-container"; var modalPopupContent = modalPopup + " .modalpopup-content"; var body = "body"; -var isInit = true; +//var isInit = true; $(".icon .text").res_text(0.2); -var resetPasswordServiceURL = "/devicemgt_admin/users/reset-password"; - /* * set popup maximum height function. */ @@ -80,11 +80,9 @@ function hidePopup() { */ function getSelectedUsernames() { var usernameList = []; - var userList = $("#user-grid").find('> tbody > tr'); + var userList = $("#user-grid").find('tr.DTTT_selected'); userList.each(function () { - if ($(this).hasClass('DTTT_selected')) { - usernameList.push($(this).attr('data-username')); - } + usernameList.push($(this).data('username')); }); return usernameList; } @@ -96,7 +94,7 @@ function getSelectedUsernames() { */ $("a.invite-user-link").click(function () { var usernameList = getSelectedUsernames(); - var inviteUserAPI = "/devicemgt_admin/users/email-invitation"; + var inviteUserAPI = deviceMgtAPIsBasePath + "/users/send-invitation"; if (usernameList.length == 0) { $(modalPopupContent).html($("#errorUsers").html()); @@ -108,20 +106,25 @@ $("a.invite-user-link").click(function () { $("a#invite-user-yes-link").click(function () { invokerUtil.post( - inviteUserAPI, - usernameList, - function () { + inviteUserAPI, + usernameList, + // The success callback + function (data, textStatus, jqXHR) { + if (jqXHR.status == 200) { $(modalPopupContent).html($('#invite-user-success-content').html()); $("a#invite-user-success-link").click(function () { hidePopup(); }); - }, - function () { - $(modalPopupContent).html($('#invite-user-error-content').html()); - $("a#invite-user-error-link").click(function () { - hidePopup(); - }); } + }, + // The error callback + function (jqXHR) { + console.log("error in invite-user API, status code: " + jqXHR.status); + $(modalPopupContent).html($('#invite-user-error-content').html()); + $("a#invite-user-error-link").click(function () { + hidePopup(); + }); + } ); }); @@ -137,16 +140,17 @@ $("a.invite-user-link").click(function () { */ function removeUser(uname, uid) { var username = uname; - var userid = uid; - var removeUserAPI = "/devicemgt_admin/users?username=" + username; + var userId = uid; + var removeUserAPI = deviceMgtAPIsBasePath + "/users/" + username; $(modalPopupContent).html($('#remove-user-modal-content').html()); showPopup(); $("a#remove-user-yes-link").click(function () { invokerUtil.delete( - removeUserAPI, - function () { - $("#" + userid).remove(); + removeUserAPI, + function (data, textStatus, jqXHR) { + if (jqXHR.status == 200) { + $("#" + userId).remove(); // get new user-list-count var newUserListCount = $(".user-list > span").length; // update user-listing-status-msg with new user-count @@ -156,13 +160,16 @@ function removeUser(uname, uid) { $("a#remove-user-success-link").click(function () { hidePopup(); }); - }, - function () { - $(modalPopupContent).html($('#remove-user-error-content').html()); - $("a#remove-user-error-link").click(function () { - hidePopup(); - }); } + }, + // The error callback + function (jqXHR) { + console.log("error in remove-user API, status code: " + jqXHR.status); + $(modalPopupContent).html($('#remove-user-error-content').html()); + $("a#remove-user-error-link").click(function () { + hidePopup(); + }); + } ); }); @@ -202,29 +209,30 @@ function resetPassword(uname) { $(errorMsgWrapper).removeClass("hidden"); } else { var resetPasswordFormData = {}; - resetPasswordFormData.username = user; - resetPasswordFormData.newPassword = window.btoa(unescape(encodeURIComponent(confirmedPassword))); + //resetPasswordFormData.username = user; + resetPasswordFormData.newPassword = unescape(confirmedPassword); + + var resetPasswordServiceURL = deviceMgtAPIsBasePath + "/admin/users/"+ user +"/credentials"; invokerUtil.post( - resetPasswordServiceURL, - resetPasswordFormData, - function (data) { // The success callback - data = JSON.parse(data); - if (data.statusCode == 201) { - $(modalPopupContent).html($('#reset-password-success-content').html()); - $("a#reset-password-success-link").click(function () { - hidePopup(); - }); - } - }, function (data) { // The error callback - if (data.statusCode == 400) { - $(errorMsg).text("Old password does not match with the provided value."); - $(errorMsgWrapper).removeClass("hidden"); - } else { - $(errorMsg).text("An unexpected error occurred. Please try again later."); - $(errorMsgWrapper).removeClass("hidden"); - } + resetPasswordServiceURL, + resetPasswordFormData, + // The success callback + function (data, textStatus, jqXHR) { + if (jqXHR.status == 200) { + $(modalPopupContent).html($('#reset-password-success-content').html()); + $("a#reset-password-success-link").click(function () { + hidePopup(); + }); } + }, + // The error callback + function (jqXHR) { + console.log("error in reset-password API, status code: " + jqXHR.status); + var payload = JSON.parse(jqXHR.responseText); + $(errorMsg).text(payload.message); + $(errorMsgWrapper).removeClass("hidden"); + } ); } }); @@ -250,7 +258,7 @@ $("#search-btn").click(function () { * when a user clicks on the list item * initial mode and with out select mode. */ -function InitiateViewOption() { +function initiateViewOption() { if ($("#can-view").val()) { $(location).attr('href', $(this).data("url")); } else { @@ -259,74 +267,112 @@ function InitiateViewOption() { } } -function loadUsers(searchParam) { - $("#loading-content").show(); - var userListing = $("#user-listing"); - var userListingSrc = userListing.attr("src"); - $.template("user-listing", userListingSrc, function (template) { - var serviceURL = "/devicemgt_admin/users"; - if (searchParam) { - serviceURL = serviceURL + "/view-users?username=" + searchParam; - } - var successCallback = function (data) { - if (!data) { - $('#ast-container').addClass('hidden'); - $('#user-listing-status-msg').text('No users are available to be displayed.'); - return; +function loadUsers() { + var loadingContentIcon = "#loading-content"; + $(loadingContentIcon).show(); + + var dataFilter = function (data) { + data = JSON.parse(data); + + var objects = []; + + $(data.users).each(function (index) { + objects.push({ + username: data.users[index].username, + firstname: data.users[index].firstname ? data.users[index].firstname: '' , + lastname: data.users[index].lastname ? data.users[index].lastname : '', + emailAddress : data.users[index].emailAddress ? data.users[index].emailAddress: '', + DT_RowId : "role-" + data.users[index].username}) + }); + + var json = { + "recordsTotal": data.count, + "recordsFiltered": data.count, + "data": objects + }; + + return JSON.stringify(json); + }; + + var fnCreatedRow = function(nRow, aData, iDataIndex) { + console.log(JSON.stringify(aData)); + $(nRow).attr('data-type', 'selectable'); + $(nRow).attr('data-username', aData["username"]); + }; + + var columns = [ + { + class: "remove-padding icon-only content-fill", + data: null, + defaultContent: + '
    ' + + '' + + '
    ' + }, + { + class: "fade-edge", + data: null, + render: function (data, type, row, meta) { + return '

    ' + data.firstname + ' ' + data.lastname + '

    '; } - var canRemove = $("#can-remove").val(); - var canEdit = $("#can-edit").val(); - var canResetPassword = $("#can-reset-password").val(); - data = JSON.parse(data); - data = data.responseContent; - var viewModel = {}; - viewModel.users = data; - for (var i = 0; i < viewModel.users.length; i++) { - viewModel.users[i].userid = viewModel.users[i].username.replace(/[^\w\s]/gi, ''); - if (canRemove) { - viewModel.users[i].canRemove = true; - } - if (canEdit) { - viewModel.users[i].canEdit = true; - } - if (canResetPassword) { - viewModel.users[i].canResetPassword = true; - } - viewModel.users[i].adminUser = $("#user-table").data("user"); + }, + { + class: "fade-edge remove-padding-top", + data: null, + render: function (data, type, row, meta) { + return ' ' + data.username; } - if (data.length > 0) { - $('#ast-container').removeClass('hidden'); - $('#user-listing-status-msg').text(""); - var content = template(viewModel); - $("#ast-container").html(content); - } else { - $('#ast-container').addClass('hidden'); - $('#user-listing-status-msg').text('No users are available to be displayed.'); + }, + { + class: "fade-edge remove-padding-top", + data: null, + render: function (data, type, row, meta) { + return ' ' + + data.emailAddress + ' '; } - $("#loading-content").hide(); - if (isInit) { - $('#user-grid').datatables_extended(); - isInit = false; + }, + { + class: "text-right content-fill text-left-on-grid-view no-wrap", + data: null, + render: function (data, type, row, meta) { + return ' ' + + '' + + '' + + ' ' + + + '' + + ' ' + + ' ' + + + ' ' + + '' + + ' ' + + '<' + + '/i> ' + + ' ' } - $(".icon .text").res_text(0.2); - }; - invokerUtil.get(serviceURL, - successCallback, - function (message) { - $('#ast-container').addClass('hidden'); - $('#user-listing-status-msg').text('Invalid search query. Try again with a valid search query'); - } - ); - }); + } + + ]; + + $('#user-grid').datatables_extended_serverside_paging(null, '/api/device-mgt/v1.0/users', dataFilter, columns, fnCreatedRow, null); + + $("#loading-content").hide(); } $(document).ready(function () { loadUsers(); $(".viewEnabledIcon").click(function () { - InitiateViewOption(); + initiateViewOption(); }); + if (!$("#can-invite").val()) { $("#invite-user-button").remove(); } -}); \ No newline at end of file +}); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/templates/listing.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/templates/listing.hbs index 6414e6de93..db67d76973 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/templates/listing.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/public/templates/listing.hbs @@ -52,6 +52,11 @@ + + + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.hbs index 493f395a70..d54c3a1d55 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.hbs @@ -298,15 +298,13 @@ Enter new password

    - +

    Retype new password

    - +

    @@ -338,6 +336,7 @@ + {{/zone}} {{#zone "common-navigation"}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.js index 74f3d583fc..d0085bd39d 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.users/users.js @@ -26,13 +26,13 @@ function onRequest(context) { return options.fn(this); } }); + var page = {}; var userModule = require("/app/modules/user.js")["userModule"]; var deviceMgtProps = require("/app/conf/devicemgt-props.js").config(); + + page["adminUser"] = deviceMgtProps["adminUser"]; page["permissions"] = userModule.getUIPermissions(); - if (userModule.isAuthorized("/permission/admin/device-mgt/users/delete")) { - page["removePermitted"] = true; - } if (userModule.isAuthorized("/permission/admin/device-mgt/users/remove")) { page["removePermitted"] = true; @@ -51,6 +51,5 @@ function onRequest(context) { page["resetPasswordPermitted"] = true; } - page["adminUser"] = deviceMgtProps.adminUser; return page; } \ No newline at end of file