Merge pull request #975 from ruwany/Supun94-master

Bumping apim versions and adding topic browser
4.x.x
inoshperera 7 years ago committed by GitHub
commit 6601afcf53

@ -32,6 +32,7 @@ public class PaginationConfiguration {
private int operationListPageSize;
private int notificationListPageSize;
private int activityListPageSize;
private int topicListPageSize;
public int getDeviceListPageSize() {
return deviceListPageSize;
@ -78,4 +79,14 @@ public class PaginationConfiguration {
this.activityListPageSize = activityListPageSize;
}
public int getTopicListPageSize() {
return deviceListPageSize;
}
@XmlElement(name = "TopicListPageSize", required = true)
public void setTopicListPageSize(int topicListPageSize) {
this.topicListPageSize = topicListPageSize;
}
}

@ -66,6 +66,7 @@
"scopes": [
"perm:sign-csr",
"perm:admin:devices:view",
"perm:admin:topics:view",
"perm:roles:add",
"perm:roles:add-users",
"perm:roles:update",

@ -614,6 +614,9 @@ var userModule = function () {
if (publicMethods.isAuthorized("/permission/admin/device-mgt")) {
permissions["IS_ADMIN"] = true;
}
if (publicMethods.isAuthorized("/permission/admin/device-mgt/topics/view")) {
permissions["VIEW_TOPICS"] = true;
}
return permissions;
};

@ -0,0 +1,283 @@
/*
* Copyright (c) 2016, 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.
*/
/**
* Following function would execute
* when a user clicks on the list item
* initial mode and with out select mode.
*/
function InitiateViewOption(url) {
if (!$(".select-enable-btn").text() == "Select" && !$(this).hasClass("btn")) {
url = $(this).parent().data("url");
$(location).attr('href', url);
}
}
/*
* DOM ready functions.
*/
$(document).ready(function () {
var permissionSet = {};
$.setPermission = function (permission) {
permissionSet[permission] = true;
};
$.hasPermission = function (permission) {
return permissionSet[permission];
};
name = getParameterByName("name");
/* for device list sorting drop down */
$(".ctrl-filter-type-switcher").popover({
html: true,
content: function () {
return $("#content-filter-types").html();
}
});
});
function loadTopics(searchType, searchParam) {
var serviceURL;
if ($.hasPermission("VIEW_TOPICS")) {
serviceURL = "/api/mqtt-topics/v1.0/admin/topics";
} else {
$("#loading-content").remove();
$('#topics-table').addClass('hidden');
$('#topics-listing-status-msg').text('Permission denied.');
$("#topics-listing-status").removeClass(' hidden');
return;
}
var columns = [
{
targets: 0,
data: 'localSubscribedQueueOrTopicName',
class: 'remove-padding-top viewEnabledIcon',
render: function (data, type, row, meta) {
return '<div class="thumbnail icon"><img class="square-element text fw fw-bookmark" src=""/></div>';
}
},
{
targets: 1,
data: 'localSubscribedQueueOrTopicName',
class: 'remove-padding-top viewEnabledIcon',
},
{
targets: 2,
data: 'localNumberOfMessagesRemainingForSubscriber',
class: 'remove-padding-top viewEnabledIcon',
},
{
targets: 3,
data: 'localActive',
class: 'remove-padding-top viewEnabledIcon',
},
{
targets: 4,
data: 'localDurable',
class: 'remove-padding-top viewEnabledIcon',
},
{
targets: 5,
data: 'localSubscriberQueueName',
class: 'remove-padding-top viewEnabledIcon',
},
{
targets: 6,
data: 'localSubscriptionIdentifier',
class: 'remove-padding-top viewEnabledIcon',
}
];
var fnCreatedRow = function (row, data, dataIndex) {
$(row).attr('data-type', 'selectable');
$(row).attr('localSubscribedQueueOrTopicName', htmlspecialchars(data.localSubscribedQueueOrTopicName));
$(row).attr('localNumberOfMessagesRemainingForSubscriber', htmlspecialchars(data.localNumberOfMessagesRemainingForSubscriber));
$(row).attr('data-url', context + '/device/' + htmlspecialchars(data.localSubscribedQueueOrTopicName) + '?id=' + htmlspecialchars(data.localNumberOfMessagesRemainingForSubscriber));
var topicName = htmlspecialchars(data.localSubscribedQueueOrTopicName);
var remainingMesgCount = htmlspecialchars(data.localNumberOfMessagesRemainingForSubscriber);
var isActive = htmlspecialchars(data.localActive);
var isDurable = htmlspecialchars(data.localDurable);
var localSubscriberQueueName = htmlspecialchars(data.localSubscriberQueueName);
var subscriptionIdentifier = htmlspecialchars(data.localSubscriptionIdentifier);
$.each($('td', row), function (colIndex) {
switch (colIndex) {
case 1:
$(this).attr('data-grid-label', "Topic Name");
$(this).attr('data-search', topicName);
$(this).attr('data-display', topicName);
break;
case 2:
$(this).attr('data-grid-label', "Remaining Messages");
$(this).attr('data-search', remainingMesgCount);
$(this).attr('data-display', remainingMesgCount);
break;
case 3:
$(this).attr('data-grid-label', "Active");
$(this).attr('data-search', isActive);
$(this).attr('data-display', isActive);
break;
case 4:
$(this).attr('data-grid-label', "Durable");
$(this).attr('data-search', isDurable);
$(this).attr('data-display', isDurable);
break;
case 5:
$(this).attr('data-grid-label', "Subscriber Queue Name");
$(this).attr('data-search', localSubscriberQueueName);
$(this).attr('data-display', localSubscriberQueueName);
break;
case 6:
$(this).attr('data-grid-label', "SubscriptionIdentifier");
$(this).attr('data-search', subscriptionIdentifier);
$(this).attr('data-display', subscriptionIdentifier);
break;
}
});
};
function htmlspecialchars(text) {
return jQuery('<div/>').text(text).html();
}
var dataFilter = function (data) {
data = JSON.parse(data);
var objects = [];
$(data.subscriptions).each(function (index) {
objects.push(
{
localSubscribedQueueOrTopicName: data.subscriptions[index].localSubscribedQueueOrTopicName,
localNumberOfMessagesRemainingForSubscriber: data.subscriptions[index].localNumberOfMessagesRemainingForSubscriber,
localActive: data.subscriptions[index].localActive,
localDurable: data.subscriptions[index].localDurable,
localSubscriberQueueName: data.subscriptions[index].localSubscriberQueueName,
localSubscriptionIdentifier: data.subscriptions[index].localSubscriptionIdentifier,
name: data.subscriptions[index].localSubscribedQueueOrTopicName
}
);
});
var json = {
"recordsTotal": data.count,
"recordsFiltered": data.count,
"data": objects
};
return JSON.stringify(json);
};
$('#topics-grid').datatables_extended_serverside_paging(
null,
serviceURL,
dataFilter,
columns,
fnCreatedRow,
function () {
$(".icon .text").res_text(0.2);
$('#topics-grid').removeClass('hidden');
$("#loading-content").remove();
}, {
"placeholder": "Search By Topic Name",
"searchKey": "name"
}
);
}
/*
* DOM ready functions.
*/
$(document).ready(function () {
/* Adding selected class for selected devices */
var permissionList = $("#permission").data("permission");
for (var key in permissionList) {
if (permissionList.hasOwnProperty(key)) {
$.setPermission(key);
}
}
loadTopics();
$(".dataTables_toolbar").css("display", "none");
/* for topic list sorting drop down */
$(".ctrl-filter-type-switcher").popover({
html: true,
content: function () {
return $("#content-filter-types").html();
}
});
/* for data tables*/
$('[data-toggle="tooltip"]').tooltip();
$("[data-toggle=popover]").popover();
$(".ctrl-filter-type-switcher").popover({
html: true,
content: function () {
return $('#content-filter-types').html();
}
});
$('#nav').affix({
offset: {
top: $('header').height()
}
});
});
var modalPopup = ".modal";
var modalPopupContainer = modalPopup + " .modal-content";
var modalPopupContent = modalPopup + " .modal-content";
var body = "body";
/*
* set popup maximum height function.
*/
function setPopupMaxHeight() {
$(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30)));
$(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2)));
}
/*
* show popup function.
*/
function showPopup() {
$(modalPopup).modal('show');
}
/*
* hide popup function.
*/
function hidePopup() {
$(modalPopupContent).html("");
$(modalPopupContent).removeClass("operation-data");
$(modalPopup).modal('hide');
$('body').removeClass('modal-open').css('padding-right', '0px');
$('.modal-backdrop').remove();
}
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

@ -0,0 +1,131 @@
{{!
Copyright (c) 2016, 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.
}}`
{{unit "cdmf.unit.ui.title" pageTitle="MQTT Dashboard"}}
{{unit "cdmf.unit.data-tables-extended"}}
{{unit "cdmf.unit.lib.ui-permissions-utility"}}
{{#zone "breadcrumbs"}}
<li>
<a href="{{@app.context}}/">
<i class="icon fw fw-home"></i>
</a>
</li>
<li>
<!--suppress HtmlUnknownTarget -->
<a href="{{@app.context}}/topics">
Dashboard
</a>
</li>
<li>
<a href="#">
MQTT
</a>
</li>
{{/zone}}
{{#zone "content"}}
<div class="wr-device-list row">
<div class="wr-hidden-operations wr-advance-operations"></div>
<div class="col-md-12 wr-page-content">
<div>
<span id="permission" data-permission="{{permissions.list}}"></span>
<div id="loading-content" class="col-centered">
<i class="fw fw-settings fw-spin fw-2x"></i>
Loading subscriptions . . .
<br>
</div>
<div id="topics-listing-status" class="raw hidden">
<ul style="list-style-type: none;">
<li class="message message-info">
<h4>
<i class="icon fw fw-info"></i>
<a id="topics-listing-status-msg"></a>
</h4>
</li>
</ul>
</div>
<div id="topics-table">
<table class="table table-striped table-hover list-table display responsive nowrap data-table hidden"
id="topics-grid">
<thead>
<tr class="sort-row">
<th class="no-sort"></th>
<th>By TopicName</th>
<th>By RemainingMsgCount</th>
<th>By Active</th>
<th>By Durable</th>
<th>By SubscriberQueueName</th>
<th>By SubscriptionIdentifier</th>
</tr>
<tr class="filter-row filter-box">
<th class="no-sort"></th>
<th data-for="By TopicName" class="text-filter"></th>
<th data-for="By RemainingMessageCount" class="text-filter"></th>
<th data-for="By Active" class="select-filter"></th>
<th data-for="By Durable" class="select-filter data-platform"></th>
<th data-for="By SubscriberQueueName" class="select-filter"></th>
<th data-for="By SubscriptionIdentifier" class="select-filter"></th>
<!--<th class="no-sort"></th>-->
</tr>
</thead>
<tbody id="ast-container">
<br class="c-both" />
</tbody>
</table>
</div>
<br class="c-both" />
<div id="content-filter-types" style="display: none">
<div class="sort-title">Sort By</div>
<div class="sort-options">
<a href="#">By SubscribedQueueOrTopicName<span class="ico-sort-asc"></span></a>
<a href="#">By localNumberOfMessagesRemainingForSubscriber</a>
<a href="#">By localActive</a>
<a href="#">By localDurable</a>
<a href="#">By localSubscriberQueueName</a>
<a href="#">By localSubscriptionIdentifier</a>
</div>
</div>
</div>
</div>
</div>
{{/zone}}
{{#zone "bottomJs"}}
<script id="device-listing" data-current-user="{{@user.username}}" data-device-types="{{deviceTypes}}"
type="text/x-handlebars-template"></script>
{{js "js/topic-listing.js"}}
{{/zone}}
{{#zone "topCss"}}
<style>
.select2-dropdown {
z-index: 999999999;
}
.wr-input-control {
color: black;
}
.select2-selection__choice {
font-size: medium;
}
</style>
{{/zone}}

@ -0,0 +1,44 @@
/*
* Copyright (c) 2016, 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.
*/
function onRequest(context) {
var constants = require("/app/modules/constants.js");
var userModule = require("/app/modules/business-controllers/user.js")["userModule"];
var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"];
var groupModule = require("/app/modules/business-controllers/group.js")["groupModule"];
var groupId = request.getParameter("groupId");
var viewModel = {};
var title = "Topics";
viewModel.title = title;
var currentUser = session.get(constants.USER_SESSION_KEY);
if (currentUser) {
viewModel.permissions = {};
var uiPermissions = userModule.getUIPermissions();
viewModel.permissions.list = stringify(uiPermissions);
if (uiPermissions.VIEW_TOPICS) {
viewModel.permissions.enroll = true;
}
viewModel.currentUser = currentUser;
var deviceCount = 1;
viewModel.deviceCount = deviceCount;
var utility = require("/app/modules/utility.js").utility;
}
return viewModel;
}

@ -65,6 +65,7 @@
<NotificationListPageSize>20</NotificationListPageSize>
<ActivityListPageSize>20</ActivityListPageSize>
<OperationListPageSize>20</OperationListPageSize>
<TopicListPageSize>20</TopicListPageSize>
</PaginationConfiguration>
<!--This specifies whether to enable the DeviceStatus Task in this node. In clustered setup only master node
should have to run this task.-->

@ -1851,7 +1851,7 @@
<commons-lang.wso2.osgi.version.range>[2.6.0,3.0.0)</commons-lang.wso2.osgi.version.range>
<!-- Carbon API Management -->
<carbon.api.mgt.version>6.1.64</carbon.api.mgt.version>
<carbon.api.mgt.version>6.1.109</carbon.api.mgt.version>
<carbon.api.mgt.version.range>(6.0.0,7.0.0]</carbon.api.mgt.version.range>
<!-- Carbon Analytics -->

Loading…
Cancel
Save