From 35aaffd7e03ac1e201cc831ca742283a09b40901 Mon Sep 17 00:00:00 2001 From: charithag Date: Fri, 24 Jul 2015 22:59:29 +0530 Subject: [PATCH] Commit before unified framework changes [Unstable] --- .../jaggeryapps/iotserver/api/group-api.jag | 200 ++++++++++ .../jaggeryapps/iotserver/jaggery.conf | 4 + .../iotserver/pages/devices/index.hbs | 2 +- .../jaggeryapps/iotserver/pages/group.hbs | 23 ++ .../iotserver/units/appbar/appbar.js | 9 + .../extended-search-box.hbs | 8 +- .../public/js/extended-search-box.js | 6 +- .../units/group-detail/group-detail.hbs | 174 +++++++++ .../units/group-detail/group-detail.js | 55 +++ .../units/group-detail/group-detail.json | 3 + .../units/group-detail/public/img/graph.png | Bin 0 -> 5431 bytes .../group-detail/public/img/group-icon.png | Bin 0 -> 6097 bytes .../group-detail/public/js/group-detail.js | 69 ++++ .../units/group-listing/group-listing.hbs | 168 +++++++++ .../units/group-listing/group-listing.js | 12 + .../units/group-listing/group-listing.json | 3 + .../public/images/group-icon.png | Bin 0 -> 6097 bytes .../group-listing/public/js/group-listing.js | 343 ++++++++++++++++++ .../public/templates/group-listing.hbs | 54 +++ .../units/theme/public/css/custom-desktop.css | 10 +- 20 files changed, 1130 insertions(+), 13 deletions(-) create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/api/group-api.jag create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/pages/group.hbs create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.hbs create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.js create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.json create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/public/img/graph.png create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/public/img/group-icon.png create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/public/js/group-detail.js create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/group-listing.hbs create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/group-listing.js create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/group-listing.json create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/public/images/group-icon.png create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/public/js/group-listing.js create mode 100644 modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/public/templates/group-listing.hbs diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/api/group-api.jag b/modules/distribution/src/repository/jaggeryapps/iotserver/api/group-api.jag new file mode 100644 index 00000000..fb9535c1 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/api/group-api.jag @@ -0,0 +1,200 @@ +<% +/* + * 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. + */ + +var uri = request.getRequestURI(); +var uriMatcher = new URIMatcher(String(uri)); + +var log = new Log("api/group-api.jag"); + +var constants = require("/modules/constants.js"); +var dcProps = require('/config/dc-props.js').config(); + +var carbon = require('carbon'); +var carbonHttpsServletTransport = carbon.server.address('https'); +var deviceCloudService = carbonHttpsServletTransport + "/devicecloud/group_manager"; + +var user = session.get(constants.USER_SESSION_KEY); +if (!user) { + response.sendRedirect(dcProps.appContext + "login?#login-required"); + exit();//stop execution +} + +var result; +var endPoint; +var data; +var groupId; + +if (uriMatcher.match("/{context}/api/group/add")) { + + var name = request.getParameter("name"); + var description = request.getParameter("description"); + + //URL: POST https://localhost:9443/devicecloud/group_manager/group/add + endPoint = deviceCloudService + "/group/add"; + data = {"name": name, "username": user.username, "description": description}; + result = post(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/update")) { + + groupId = uriMatcher.elements().groupId; + name = request.getParameter("name"); + description = request.getParameter("description"); + + //URL: PUT https://localhost:9443/devicecloud/group_manager/group/id/{groupId} + endPoint = deviceCloudService + "id/" + groupId; + data = {"name": name, "username": user.username, "description": description}; + result = put(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/remove")) { + + groupId = uriMatcher.elements().groupId; + + //URL: DELETE https://localhost:9443/devicecloud/group_manager/group/id/{groupId} + endPoint = deviceCloudService + "id/" + groupId; + data = {"username": user.username}; + result = del(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}")) { + + groupId = uriMatcher.elements().groupId; + + //URL: GET https://localhost:9443/devicecloud/group_manager/group/id/{groupId} + endPoint = deviceCloudService + "id/" + groupId; + data = {"username": user.username}; + result = get(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/name/{groupName}")) { + + //URL: GET https://localhost:9443/devicecloud/group_manager/group/name/{name} + endPoint = deviceCloudService + "name/" + uriMatcher.elements().groupName; + data = {"username": user.username}; + result = get(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/all")) { + + //URL: GET https://localhost:9443/devicecloud/group_manager/group/all + endPoint = deviceCloudService + "/group/all"; + data = {"username": user.username}; + result = get(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/all/count")) { + + //URL: GET https://localhost:9443/devicecloud/group_manager/group/all/count + endPoint = deviceCloudService + "/group/all/count"; + data = {"username": user.username}; + result = get(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/share")) { + + groupId = uriMatcher.elements().groupId; + var shareUser = request.getParameter("shareUser"); + role = request.getParameter("role"); + + //URL: PUT https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/share + endPoint = deviceCloudService + "/group/id/" + groupId + "/share"; + data = {"username": user.username, "shareUser":shareUser, "role":role}; + result = post(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/share")) { + + groupId = uriMatcher.elements().groupId; + var unShareUser = request.getParameter("unShareUser"); + role = request.getParameter("role"); + + //URL: DELETE https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/share + endPoint = deviceCloudService + "/group/id/" + groupId + "/share"; + data = {"username": user.username, "unShareUser":unShareUser, "role":role}; + result = del(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/role/add")) { + + groupId = uriMatcher.elements().groupId; + var permissions = request.getParameter("permissions"); + role = request.getParameter("role"); + + //URL: POST https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/role + endPoint = deviceCloudService + "/group/id/" + groupId + "/role"; + data = {"username": user.username, "permissions":permissions, "role":role}; + result = post(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/role/delete")) { + + groupId = uriMatcher.elements().groupId; + role = request.getParameter("role"); + + //URL: DELETE https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/role + endPoint = deviceCloudService + "/group/id/" + groupId + "/role"; + data = {"username": user.username, "role":role}; + result = del(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/role/all")) { + + groupId = uriMatcher.elements().groupId; + + //URL: GET https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/role/all + endPoint = deviceCloudService + "/group/id/" + groupId + "/role/all"; + data = {"username": user.username}; + result = get(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/{userId}/role/all")) { + + groupId = uriMatcher.elements().groupId; + var userId = uriMatcher.elements().userId; + + //URL: GET https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/{user}/role/all + endPoint = deviceCloudService + "/group/id/" + groupId + "/" + userId +"/role/all"; + data = {"username": user.username}; + result = get(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/user/all")) { + + groupId = uriMatcher.elements().groupId; + + //URL: GET https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/user/all + endPoint = deviceCloudService + "/group/id/" + groupId + "/user/all"; + data = {"username": user.username}; + result = get(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/device/all")) { + + groupId = uriMatcher.elements().groupId; + + //URL: GET https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/device/all + endPoint = deviceCloudService + "/group/id/" + groupId + "/device/all"; + data = {"username": user.username}; + result = get(endPoint, data, "json"); + +} else if (uriMatcher.match("/{context}/api/group/id/{groupId}/device/assign")) { + + groupId = uriMatcher.elements().groupId; + var deviceId = request.getParameter("deviceId"); + var deviceType = request.getParameter("deviceType"); + + //URL: GET https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/device/assign + endPoint = deviceCloudService + "/group/id/" + groupId + "/device/assign"; + data = {"username": user.username, "deviceId":deviceId, "deviceType":deviceType}; + result = put(endPoint, data, "json"); + +} + +// returning the result. +if (result) { + print(result); +} +%> diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/jaggery.conf b/modules/distribution/src/repository/jaggeryapps/iotserver/jaggery.conf index 420fe87e..2771f3c3 100644 --- a/modules/distribution/src/repository/jaggeryapps/iotserver/jaggery.conf +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/jaggery.conf @@ -19,6 +19,10 @@ "url": "/api/devices/*", "path": "/api/device-api.jag" }, + { + "url": "/api/group/*", + "path": "/api/group-api.jag" + }, { "url": "/api/operation/*", "path": "/api/operation-api.jag" diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/pages/devices/index.hbs b/modules/distribution/src/repository/jaggeryapps/iotserver/pages/devices/index.hbs index ea9cd1a3..c2ec062f 100644 --- a/modules/distribution/src/repository/jaggeryapps/iotserver/pages/devices/index.hbs +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/pages/devices/index.hbs @@ -5,7 +5,7 @@ {{/zone}} {{#zone "body"}} {{unit "appbar" link="device-mgt" title="My Devices"}} - {{unit "extended-search-box"}} + {{unit "extended-search-box" item="Device"}} {{unit "operation-mod"}}
diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/pages/group.hbs b/modules/distribution/src/repository/jaggeryapps/iotserver/pages/group.hbs new file mode 100644 index 00000000..3246f4c5 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/pages/group.hbs @@ -0,0 +1,23 @@ +{{authorized}} +{{layout "fluid"}} +{{#zone "title"}} + Groups +{{/zone}} +{{#zone "body"}} + {{unit "appbar" link="group-mgt" title="My Groups"}} + {{unit "extended-search-box" item="Group"}} + {{unit "operation-mod"}} +
+
+ +
+
+ +
+ {{unit "operation-bar"}} + {{unit "group-listing"}} +
+ +
+
+{{/zone}} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/appbar/appbar.js b/modules/distribution/src/repository/jaggeryapps/iotserver/units/appbar/appbar.js index 381b757a..56288fb8 100644 --- a/modules/distribution/src/repository/jaggeryapps/iotserver/units/appbar/appbar.js +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/units/appbar/appbar.js @@ -7,6 +7,7 @@ function onRequest(context) { "policies": [], "profiles": [], "device-mgt": [], + "group-mgt": [], "store": [], "dashboard": [], "analytics" : [] @@ -37,6 +38,7 @@ function onRequest(context) { links.store.push(storeLink); links.analytics.push(deviceMgtLink); links['device-mgt'].push(dashboardLink); + links['group-mgt'].push(dashboardLink); if (!carbonUser) { //user is not logged in @@ -74,6 +76,13 @@ function onRequest(context) { url: "/iotserver/devices/add-device" }); } + if (permissions.ADD_DEVICE) { + links["group-mgt"].push({ + title: "Add Group", + icon: "fw-add", + url: "/iotserver/group#add-device" + }); + } }// end-if-user context.currentActions = links[context.link]; diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/extended-search-box/extended-search-box.hbs b/modules/distribution/src/repository/jaggeryapps/iotserver/units/extended-search-box/extended-search-box.hbs index 62bace1d..edad07c6 100644 --- a/modules/distribution/src/repository/jaggeryapps/iotserver/units/extended-search-box/extended-search-box.hbs +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/units/extended-search-box/extended-search-box.hbs @@ -71,7 +71,7 @@
- +
@@ -79,9 +79,9 @@
diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/extended-search-box/public/js/extended-search-box.js b/modules/distribution/src/repository/jaggeryapps/iotserver/units/extended-search-box/public/js/extended-search-box.js index 3f6ea637..3ba305e0 100644 --- a/modules/distribution/src/repository/jaggeryapps/iotserver/units/extended-search-box/public/js/extended-search-box.js +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/units/extended-search-box/public/js/extended-search-box.js @@ -51,7 +51,7 @@ $(document).ready(function(){ $(searchBtn).click(function(){ var input = $(searchField).html(); var searchType = $(searchField).data("search-type"); - loadDevices(searchType, input); + loadGroups(searchType, input); }); }); @@ -123,7 +123,7 @@ function containerUpdate(asset){ function selectAsset(asset){ var platformType = $(asset).data("type"); loadOperationBar(platformType); - loadDevices("type", platformType); + loadGroups("type", platformType); //$(tagsContainer +' span').each(function(){ // if($(this).attr('level') == $(asset).attr('level')){ // removeTags(this); @@ -218,5 +218,5 @@ function removeTags(tag){ $(this).remove(); }); unloadOperationBar(); - loadDevices(); + loadGroups(); } diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.hbs b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.hbs new file mode 100644 index 00000000..92c4f7e4 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.hbs @@ -0,0 +1,174 @@ +{{#zone "main"}} +
+
+ +
+
+
+
+ +
+
+ {{unit "operation-bar"}} +
+
+ + + +
+
+
+ +
+
+
Owner: {{group.ownerId}}
+
Date of Enrollment:
{{group.enrollment}}
+
+
+
+ +
+ + +
+ +
+ {{#if group.viewModel.BatteryLevel}} +
+
+
BATTERY
+
+
+
{{group.viewModel.BatteryLevel}}%
+
+
+
+ {{/if}} + + {{#if group.viewModel.DeviceCapacity}} +
+
+
STORAGE
+
+
+
{{group.viewModel.DeviceCapacityPercentage}}%{{group.viewModel.DeviceCapacityUsed}} GB Free
+
+
+
+ {{/if}} + {{#if group.viewModel.internal_memory.FreeCapacity}} +
+
+
LOCAL STORAGE
+
+
+
{{group.viewModel.internal_memory.DeviceCapacityPercentage}}%{{group.viewModel.internal_memory.FreeCapacity}} GB Free
+
+
+
+ {{/if}} + {{#if group.viewModel.external_memory.FreeCapacity}} +
+
+
EXTERNAL STORAGE
+
+
+
{{group.viewModel.external_memory.DeviceCapacityPercentage}}%{{group.viewModel.external_memory.FreeCapacity}} GB Free
+
+
+
+ {{/if}} +
+ +
+ + +
+ + + + + +
+ +
+
+ Not available yet +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+
+
+ +{{/zone}} +{{#zone "bottomJs"}} + + +{{/zone}} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.js b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.js new file mode 100644 index 00000000..ac6935bd --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.js @@ -0,0 +1,55 @@ +function onRequest(context) { + var uri = request.getRequestURI(); + var uriMatcher = new URIMatcher(String(uri)); + var isMatched = uriMatcher.match("/{context}/group/id/{groupId}"); + if (isMatched) { + var matchedElements = uriMatcher.elements(); + var groupId = matchedElements.groupId; + context.groupId = groupId; + //var group = deviceModule.viewDevice(deviceType, deviceId); + //if (device){ + // var viewModel = {}; + // var deviceInfo = device.properties.DEVICE_INFO; + // if (deviceInfo != undefined && String(deviceInfo.toString()).length > 0){ + // deviceInfo = JSON.parse(deviceInfo); + // if (device.type == "ios"){ + // viewModel.imei = device.properties.IMEI; + // viewModel.phoneNumber = deviceInfo.PhoneNumber; + // viewModel.udid = deviceInfo.UDID; + // viewModel.BatteryLevel = Math.round(deviceInfo.BatteryLevel * 100); + // viewModel.DeviceCapacity = Math.round(deviceInfo.DeviceCapacity * 100) / 100; + // viewModel.AvailableDeviceCapacity = Math.round(deviceInfo.AvailableDeviceCapacity * 100) / 100; + // viewModel.DeviceCapacityUsed = Math.round((viewModel.DeviceCapacity + // - viewModel.AvailableDeviceCapacity) * 100) / 100; + // viewModel.DeviceCapacityPercentage = Math.round(viewModel.DeviceCapacityUsed + // / viewModel.DeviceCapacity * 10000) /100; + // }else if(device.type == "android"){ + // viewModel.imei = device.properties.IMEI; + // viewModel.model = device.properties.DEVICE_MODEL; + // viewModel.vendor = device.properties.VENDOR; + // viewModel.internal_memory = {}; + // viewModel.external_memory = {}; + // viewModel.location = { + // latitude: device.properties.LATITUDE, + // longitude: device.properties.LONGITUDE + // }; + // viewModel.BatteryLevel = deviceInfo.BATTERY_LEVEL; + // viewModel.internal_memory.FreeCapacity = Math.round((deviceInfo.INTERNAL_TOTAL_MEMORY - + // deviceInfo.INTERNAL_AVAILABLE_MEMORY) * 100) / 100; + // viewModel.internal_memory.DeviceCapacityPercentage = Math.round(deviceInfo.INTERNAL_AVAILABLE_MEMORY + // / deviceInfo.INTERNAL_TOTAL_MEMORY * 10000) / 100; + // viewModel.external_memory.FreeCapacity = Math.round((deviceInfo.EXTERNAL_TOTAL_MEMORY - + // deviceInfo.EXTERNAL_AVAILABLE_MEMORY) * 100) / 100; + // viewModel.external_memory.DeviceCapacityPercentage = Math.round(deviceInfo.EXTERNAL_AVAILABLE_MEMORY + // /deviceInfo.EXTERNAL_TOTAL_MEMORY * 10000) /100; + // } + // viewModel.enrollment = device.enrollment; + // device.viewModel = viewModel; + // } + //} + context.group = groupId; + } else { + response.sendError(404); + } + return context; +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.json b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.json new file mode 100644 index 00000000..3dbff381 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/group-detail.json @@ -0,0 +1,3 @@ +{ + "predicate": "false" +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/public/img/graph.png b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/public/img/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..dd819ef4fcd087ae7e802a23fec22bb60d05e42c GIT binary patch literal 5431 zcmaJ_c|4Te+qY*+h)IeWBV-+8pUD!2LL}>iYAl1X%rJ{>#2~VjB1@L6DcP3@$&w|6 zDEnI3_h;@_1cfv-25IB)Xpo|eytKV66be#Ol7T8HDk(vwKytEBIf(4Ztt1UqfGaA&<&;5x zUEmXMcn3$g2}1WTUniCt*qKQ5fI}eO-rh3a@-jHQ69fu_!G3GV$w{9eqzS%QqOFfK zmLUAM0s>92$74K*7#tS#ThZ1IMwxnni2sQqobqyHy44kC%L1s#J{-?|K;lZEBALPxO<#n|RL}43KV^Gj{8RX7 z>`ArbPs;jvNcSEM4OhM%LetD=WI2t+%+zV5ZIXPJy9s+$I6T~%cF+@Z=Z#nEX}5=^ z*@Z1e%GNrsyf#w;(klnLQ=gm8mD|@ZY*xIr?;nsEc+)>n$c*KE3zh-xgZBkNoOBG_ zvE=$4&1K{@5g}#eor(9y1UxrvLZoM-b3=WN`aaR_Hh_!EQ#v_`5>C-UG=RY<|9R*E6obuI($d84Hm&?yR461F0A%LWJ1N>ciRXII4Ux{ZMSZUb~&V% zYU#kXk`jI`fWj69ce9Zl`tlVKx@8=&eCMsK_pbeA8Fm_0X_;3$a(IYxqiOC2F!)u8 zgz!)yRykD#&f_186Dv4%P(4)&5S*$uPAzKVa_tv?{v%EMQlrJPU@Eg?H=EO3Kd+-6k( z;3%_9Sj{qA6wOIvg&ZV4s?c$yI`zZ83!b^SuKVG*hQhsdsg3*8jSeqY*Uu5T+Beq$Az67s4Tmn;9gP$hTZ2 zyYwAmlSy0DfyMel!vV3-soWm%!JyeE$|czPqOs-s^yoqfJG{k%vX600ondw1_WYVpU+QWM(#W|d11*uS9OrLIb+!Y#~BxW0Op&o zW7rj9$}SSO3PA?zXP;94sORYe<=cRabpl?FZ+8WS^|Y?Xr$(vSjThozY)y2+CH;X>ZKzpHDb2yvM9LH796DSh9XTCe_npxkqQGeMo<12;9|QbzUVhP zV;CrHU8~7#I2ouA8vU+ek>#uzZ3psIDSLoVj{oM3F$Fm+Zz(7pUaV0%mlk;%$IK-G z)h!r(8EQ20QZ6oZu zpcH#QrTFb=k6ZD5r?4l~yxI`7j-BPJ_v34kGd2?n3f|8g8k>wm{cr7jzdg2}(ohmT zm1f85+g$Tfrdp5GlANl<+m!}_mB^YMdb?`C-xeRmT?Rzh7c)m88fu2^mrd@z6@4}J ziC6sm3FK(<+Zw#uvQ}RIMmOcPMA#=6pv~OZ-HvK!G3^;r)`D^0xsfw%Q6eUKiY_GO zD7iR^aX;vV9Y6?z4G?Ymk}qJ_#kyY0hcYw-iu~ z52)M8-s-%I;qVBgviZ1isEH(`pbaR@cm{B3iCh5$HdM!_^F%{B_Ovee)rOigzRs!S zyCavnHClK$sJz=Fp&1fC;P(e`Qel~2`ngQaH^0yXnP=v)5fz3cjl&hx$2ohHKq{(n zL~Ze#efq$MDwBCr#Z^`dveOlPh`x5%cKW%E;Cl7^eH5u&r|PN)su47=zS6z&lKWGB zj>=euyh2uV7STa&vhE?r-um5@$1A(p=@||BikEP(2_gvLvKP(+wm{!!?2ztUAdOO* zb3-zRVsLCsQkQ#2tn2MVCE0+fOaS4D?@ZVGHYBOWx6|CM&rps_fR^8LJ(D>bvOK9f znwijtTHMc&!U@%#(Q;A6*-ZEA?z9B~OEo6vz*8#3U>DQ9@;2hWm~e!CG|a;KnyYv0 zgv;{i3&6>s=wOn>3xWvp%^JTqZnjqIIii5f1~y}QY&Ki;Vdt~0`C8SZdq)twhg*IR zs*y>+DLIBwn8n}*N>hdr#`{r4{d-`|p0h^~)b*`o1GQ0zkd`EtD)mw1aPpjfGZ4_I}$Zx^^O zpNwihbn^y_>X`8uv{Q(<>f9JL^A$R<f~J5` zp82)?yDWDaXjPAr;&Rtxzb~^}3wj$glx6P+#PDlmvZ=gtR@smhGqlAxeMd~s{-93_6pKQjpwX|?}*i75i><={x*Cs4@ZIW;HDS~ zHgIvo`lpz~*1GJM-f&)XTM12uf)62#iUHL#!}n#{xRW~!Th^JZf&E)BJ4{#q$L0^d z{9-T*U}MegpWcRY#zE`=H4o@mW-g~Up_m?1r*!49d}mOE^}K3$^9J< zicMrEUMjO4AhXJr&^uBjgdCpWY2wt>;xqS;^S00N-8vi_H&7`*%!CT2pu=Qk?nx~mc z)QCVPtn%0YNCr2qCAP$k2+(zgm~cvF1ww>GYs4A*$+w8OPRHc%^AW3kd9HY7Dac3) zMTe*?L*xj0nPU#O)6KdvBW?=gD|MK#`fa?-s$059CyC^;()@h=+qsieSv(j_k~{hI z!Nc=ji9)2N$PqQ5IToSOepB#ESEx41b|zH(A(t!nVUAG8>ddO|<6v{;t6Y6oKkE?< z)KtI0SOJS-XF4v;UaEOXQw{G-I3AQlet*L?7!HfTVqPx><)=~<$8p;+5+f2Uj^y*%>WBekO^Yd7ej<@+oL97o=) zNKPiPU88aB&&vV7Lf4+DZ7YOq2ZzpXMvZf=!eWslj~I?xF<*?xG37hGb(k~1xRZs4?>&91F|`5r@C3v*$7eRA1a4JKj?iHqZXlhh}kpAQ9PeWWyFf zQbf*I4V#+27$_JMe>L4K4+iW)jLPjU7>z;jp6ba_ajMhGOK%w$#azP4&Ax~ zu^wM|I31J<`25A@g5AJ(L_!9msk- z$0KxAgt^2o%kpSVAz!qf>nNtsfjV-OduBO|91v$qOEF$GkY(#Hy@gt6l}x`TBD!3B zOeEWVZPc_F(En8Z(BT<-%jMpTsn^pCF0q@J+ z3CFPejSIcb4Qe`t%zhmBBzO#c>&Z(+wN}5qT4o^p8hxjVhLsZHNo)l$0WV;ED;$Boi5hP0Q{2i%Fu z^ppQg7;+k#Wq-I$x>1@j3S~rCvUG z3{Uc!SYv!)93`X`@=Tk$PX19qnMa(__w0_3Yi5vIWgnVsCK}a#!Bf9eyMO5UMPXA1 zY`y{mb#0W=KF9?sG!s<%E^G1AO$R;KR=bvKxRXxM)FbDvR|m&YW~{O~nsM1slrWY! z{a`Tpjn-&ESO!NcpM&F#Lut1}U=;Gf6KG do5ytQG>>z2#Y$jY8NZJ*^>mC7MOvuf{{g(Y2Y3Jg literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/public/img/group-icon.png b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-detail/public/img/group-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ac34c1b2aff02bbc390f0c188acfeb7400cc4cce GIT binary patch literal 6097 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 + +
+ +
+
+

Loading...

+
+
+ +
+ +
+ +
+
+

You don't have any Groups registered at the moment.

+

+ + + + + + Add New Group + +

+
+
+ +
+ +
+
+
+
+

Do you really want to remove this group from your Group List?

+ +
+
+
+
+ +
+
+
+
+

Group was successfully removed.

+ +
+
+
+
+ +
+
+
+
+

Please enter new name for the group?

+
+
+ +
+ +
+
+
+
+ +
+
+
+
+

Group was successfully updated.

+ +
+
+
+
+ +
+
+
+
+

Exception at backend. Try Later.

+ +
+
+
+
+ +
+
+
+
+

Action not permitted.

+ +
+
+
+
+ +
+
+
+
+

Group does not exist.

+ +
+
+
+
+ +
+
+
+
+

Group does not exist.

+ +
+
+
+
+{{/zone}} +{{#zone "bottomJs"}} + + +{{/zone}} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/group-listing.js b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/group-listing.js new file mode 100644 index 00000000..96820097 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/group-listing.js @@ -0,0 +1,12 @@ +function onRequest(context){ + //var userModule = require("/modules/user.js").userModule; + var permissions = []; + //if(userModule.isAuthorized("/permission/device-mgt/admin/devices/list")){ + // permissions.push("LIST_GROUPS"); + //}else if(userModule.isAuthorized("/permission/device-mgt/user/devices/list")){ + // permissions.push("LIST_OWN_GROUPS"); + //} + permissions.push("LIST_GROUPS"); + context.permissions = stringify(permissions); + return context; +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/group-listing.json b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/group-listing.json new file mode 100644 index 00000000..3dbff381 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/group-listing.json @@ -0,0 +1,3 @@ +{ + "predicate": "false" +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/public/images/group-icon.png b/modules/distribution/src/repository/jaggeryapps/iotserver/units/group-listing/public/images/group-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ac34c1b2aff02bbc390f0c188acfeb7400cc4cce GIT binary patch literal 6097 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 +
+ +
+ + + +{{/each}} + +
diff --git a/modules/distribution/src/repository/jaggeryapps/iotserver/units/theme/public/css/custom-desktop.css b/modules/distribution/src/repository/jaggeryapps/iotserver/units/theme/public/css/custom-desktop.css index 1f361a96..beed45c6 100644 --- a/modules/distribution/src/repository/jaggeryapps/iotserver/units/theme/public/css/custom-desktop.css +++ b/modules/distribution/src/repository/jaggeryapps/iotserver/units/theme/public/css/custom-desktop.css @@ -250,23 +250,23 @@ a.ast-type-item:hover { } @media (min-width: 768px){ - .ctrl-wr-asset { width: 24%; } + .ctrl-wr-asset { width: 30%; } } @media (min-width: 992px){ - .ctrl-wr-asset { width: 19%; } + .ctrl-wr-asset { width: 25%; } } @media (min-width:1300px){ - .ctrl-wr-asset { width: 13%; } + .ctrl-wr-asset { width: 19%; } } @media (min-width:1500px){ - .ctrl-wr-asset { width: 11.5%; } + .ctrl-wr-asset { width: 17.5%; } } @media (min-width:1800px){ - .ctrl-wr-asset { width: 9%; } + .ctrl-wr-asset { width: 15%; } } .ctrl-wr-asset.selected {