http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/i18n/en.js ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/src/i18n/en.js b/rocketmq-console/src/main/resources/static/src/i18n/en.js new file mode 100644 index 0000000..651456f --- /dev/null +++ b/rocketmq-console/src/main/resources/static/src/i18n/en.js @@ -0,0 +1,80 @@ +var en = { + "TITLE": "RocketMq-Console-Ng", + "CLOSE": "Close", + "NO": "NO.", + "ADDRESS": "Address", + "VERSION": "Version", + "PRO_MSG_TPS": "Produce Massage TPS", + "CUS_MSG_TPS": "Consumer Massage TPS", + "YESTERDAY_PRO_COUNT": "Yesterday Produce Count", + "YESTERDAY_CUS_COUNT": "Yesterday Consume Count", + "TODAY_PRO_COUNT": "Today Produce Count", + "TODAY_CUS_COUNT": "Today Consume Count", + "INSTANCE": "Instance", + "SPLIT": "Broker", + "CLUSTER": "Cluster", + "CLUSTER_DETAIL": "Cluster Detail", + "TOPIC": "Topic", + "SUBSCRIPTION_GROUP":"SubscriptionGroup", + "PRODUCER_GROUP":"ProducerGroup", + "CONSUMER":"Consumer", + "PRODUCER":"Producer", + "MESSAGE":"Message", + "COMMIT": "Commit", + "OPERATION": "Operation", + "ADD": "Add", + "UPDATE": "Update", + "STATUS": "Status", + "ROUTER": "Router", + "MANAGE": "Manage", + "CONFIG": "Config", + "SEND_MSG": "Send Massage", + "RESET_CUS_OFFSET": "Reset Consumer Offset", + "DELETE": "Delete", + "CHANGE_LANG": "ChangeLanguage", + "BROKER": "Broker", + "NORMAL": "NORMAL", + "RETRY": "RETRY", + "DLQ": "DLQ", + "QUANTITY":"Quantity", + "TYPE":"Type", + "MODE":"Mode", + "DELAY":"Delay", + "DASHBOARD":"Dashboard", + "CONSUME_DETAIL":"CONSUME DETAIL", + "CLIENT":"CLIENT", + "LAST_CONSUME_TIME":"LastConsumeTime", + "TIME":"Time", + "RESET":"RESET", + "DATE":"Date", + "NO_DATA":"NO DATA", + "SEARCH":"Search", + "BEGIN":"Begin", + "END":"End", + "TOPIC_CHANGE":"Topic Change", + "SEND":"Send", + "SUBSCRIPTION_CHANGE":"Subscription Change", + "QUEUE":"Queue", + "MIN_OFFSET":"minOffset", + "MAX_OFFSET":"maxOffset", + "LAST_UPDATE_TIME_STAMP":"lastUpdateTimeStamp", + "QUEUE_DATAS":"queueDatas", + "READ_QUEUE_NUMS":"readQueueNums", + "WRITE_QUEUE_NUMS":"writeQueueNums", + "PERM":"perm", + "TAG":"Tag", + "KEY":"Key", + "MESSAGE_BODY":"Message Body", + "TOPIC_NAME":"topicName", + "ORDER":"order", + "CONSUMER_CLIENT":"consumerClient", + "BROKER_OFFSET":"brokerOffset", + "CONSUMER_OFFSET":"consumerOffset", + "DIFF_TOTAL":"diffTotal", + "LAST_TIME_STAMP":"lastTimeStamp", + "RESET_OFFSET":"resetOffset", + "CLUSTER_NAME":"clusterName", + "OPS":"OPS", + "AUTO_REFRESH":"AUTO_REFRESH", + "REFRESH":"REFRESH" +} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/i18n/zh.js ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/src/i18n/zh.js b/rocketmq-console/src/main/resources/static/src/i18n/zh.js new file mode 100644 index 0000000..6cf39f0 --- /dev/null +++ b/rocketmq-console/src/main/resources/static/src/i18n/zh.js @@ -0,0 +1,80 @@ +var zh = { + "TITLE": "RocketMqæ§å¶å°", + "CLOSE": "å ³é", + "NO": "ç¼å·", + "ADDRESS": "å°å", + "VERSION": "çæ¬", + "PRO_MSG_TPS": "çäº§æ¶æ¯TPS", + "CUS_MSG_TPS": "æ¶è´¹æ¶æ¯TPS", + "YESTERDAY_PRO_COUNT": "æ¨æ¥çäº§æ»æ°", + "YESTERDAY_CUS_COUNT": "æ¨æ¥æ¶è´¹æ»æ°", + "TODAY_PRO_COUNT": "ä»å¤©çäº§æ»æ°", + "TODAY_CUS_COUNT": "ä»å¤©æ¶è´¹æ»æ°", + "INSTANCE": "å®ä¾", + "SPLIT": "åç", + "CLUSTER": "é群", + "CLUSTER_DETAIL": "é群详æ ", + "COMMIT": "æäº¤", + "TOPIC": "主é¢", + "SUBSCRIPTION_GROUP":"订é ç»", + "PRODUCER_GROUP":"ç产ç»", + "CONSUMER":"æ¶è´¹è ", + "PRODUCER":"ç产è ", + "MESSAGE":"æ¶æ¯", + "OPERATION": "æä½", + "ADD": "æ°å¢", + "UPDATE": "æ´æ°", + "STATUS": "ç¶æ", + "ROUTER": "è·¯ç±", + "MANAGE": "管ç", + "CONFIG": "é ç½®", + "SEND_MSG": "åéæ¶æ¯", + "RESET_CUS_OFFSET": "éç½®æ¶è´¹ä½ç¹", + "DELETE": "å é¤", + "CHANGE_LANG": "æ´æ¢è¯è¨", + "BROKER": "Broker", + "NORMAL": "æ®é", + "RETRY": "éè¯", + "DLQ": "æ»ä¿¡", + "QUANTITY":"æ°é", + "TYPE":"ç±»å", + "MODE":"模å¼", + "DELAY":"å»¶è¿", + "DASHBOARD":"驾驶è±", + "CONSUME_DETAIL":"æ¶è´¹è¯¦æ ", + "CLIENT":"ç»ç«¯", + "LAST_CONSUME_TIME":"æåæ¶è´¹æ¶é´", + "TIME":"æ¶é´ç¹", + "RESET":"éç½®", + "DATE":"æ¥æ", + "NO_DATA":"ææ æ°æ®", + "SEARCH":"æç´¢", + "BEGIN":"å¼å§", + "END":"ç»æ", + "TOPIC_CHANGE":"ä¿®æ¹ä¸»é¢", + "SEND":"åé", + "SUBSCRIPTION_CHANGE":"ä¿®æ¹è®¢é ", + "QUEUE":"éå", + "MIN_OFFSET":"æå°ä½ç¹", + "MAX_OFFSET":"æå¤§ä½ç¹", + "LAST_UPDATE_TIME_STAMP":"䏿¬¡æ´æ°æ¶é´", + "QUEUE_DATAS":"éåä¿¡æ¯", + "READ_QUEUE_NUMS":"读éåæ°é", + "WRITE_QUEUE_NUMS":"åéåæ°é", + "PERM":"perm", + "TAG":"æ ç¾", + "KEY":"å¼", + "MESSAGE_BODY":"æ¶æ¯ä¸»ä½", + "TOPIC_NAME":"主é¢å", + "ORDER":"顺åº", + "CONSUMER_CLIENT":"æ¶è´¹è ç»ç«¯", + "BROKER_OFFSET":"代çè ä½ç¹", + "CONSUMER_OFFSET":"æ¶è´¹è ä½ç¹", + "DIFF_TOTAL":"å·®å¼", + "LAST_TIME_STAMP":"䏿¬¡æ¶é´", + "RESET_OFFSET":"éç½®ä½ç¹", + "CLUSTER_NAME":"é群å", + "OPS":"è¿ç»´", + "AUTO_REFRESH":"èªå¨å·æ°", + "REFRESH":"å·æ°" +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/message.js ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/src/message.js b/rocketmq-console/src/main/resources/static/src/message.js new file mode 100644 index 0000000..fca286c --- /dev/null +++ b/rocketmq-console/src/main/resources/static/src/message.js @@ -0,0 +1,200 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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 module = app; + +module.controller('messageController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) { + $scope.allTopicList = []; + $scope.selectedTopic =[]; + $scope.key =""; + $scope.messageId =""; + $scope.queryMessageByTopicResult=[]; + $scope.queryMessageByTopicAndKeyResult=[]; + $scope.queryMessageByMessageIdResult={}; + $http({ + method: "GET", + url: "topic/list.query" + }).success(function (resp) { + if(resp.status ==0){ + $scope.allTopicList = resp.data.topicList.sort(); + console.log($scope.allTopicList); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + $scope.timepickerBegin = moment().subtract(1, 'hour').format('YYYY-MM-DD HH:mm'); + $scope.timepickerEnd = moment().add(1,'hour').format('YYYY-MM-DD HH:mm'); + $scope.timepickerOptions ={format: 'YYYY-MM-DD HH:mm', showClear: true}; + + $scope.paginationConf = { + currentPage: 1, + totalItems: 0, + itemsPerPage: 20, + pagesLength: 15, + perPageOptions: [10], + rememberPerPage: 'perPageItems', + onChange: function () { + $scope.changeShowMessageList(this.currentPage,this.totalItems); + } + }; + + + $scope.queryMessageByTopic = function () { + console.log($scope.selectedTopic); + console.log($scope.timepickerBegin) + console.log($scope.timepickerEnd) + $http({ + method: "GET", + url: "message/queryMessageByTopic.query", + params: { + topic: $scope.selectedTopic, + begin: $scope.timepickerBegin.valueOf(), + end: $scope.timepickerEnd.valueOf() + + } + }).success(function (resp) { + if (resp.status == 0) { + console.log(resp); + $scope.queryMessageByTopicResult = resp.data; + $scope.changeShowMessageList(1,$scope.queryMessageByTopicResult.length); + // todo + // console.log($scope.queryMessageByTopicResult); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + }; + + $scope.queryMessageByTopicAndKey = function () { + console.log($scope.selectedTopic); + console.log($scope.key); + $http({ + method: "GET", + url: "message/queryMessageByTopicAndKey.query", + params: { + topic: $scope.selectedTopic, + key:$scope.key + } + }).success(function (resp) { + if (resp.status == 0) { + console.log(resp); + $scope.queryMessageByTopicAndKeyResult = resp.data; + console.log($scope.queryMessageByTopicAndKeyResult); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + }; + + $scope.queryMessageByBrokerAndOffset = function (storeHost,commitLogOffset) { + $http({ + method: "GET", + url: "message/viewMessageByBrokerAndOffset.query", + params: { + brokerHost: storeHost.address, + port:storeHost.port, + offset: commitLogOffset + } + }).success(function (resp) { + if (resp.status == 0) { + console.log(resp); + ngDialog.open({ + template: 'messageDetailViewDialog', + controller: 'messageDetailViewDialogController', + data: resp.data + }); + } else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + }; + + $scope.queryMessageByMessageId = function (messageId,topic) { + $http({ + method: "GET", + url: "message/viewMessage.query", + params: { + msgId: messageId, + topic:topic + } + }).success(function (resp) { + if (resp.status == 0) { + console.log(resp); + ngDialog.open({ + template: 'messageDetailViewDialog', + controller: 'messageDetailViewDialogController', + data:resp.data + }); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + }; + + + $scope.changeShowMessageList = function (currentPage,totalItem) { + var perPage = $scope.paginationConf.itemsPerPage; + var from = (currentPage - 1) * perPage; + var to = (from + perPage)>totalItem?totalItem:from + perPage; + $scope.messageShowList = $scope.queryMessageByTopicResult.slice(from, to); + $scope.paginationConf.totalItems = totalItem ; + }; +}]); + +module.controller('messageDetailViewDialogController',['$scope', 'ngDialog', '$http','Notification', function ($scope, ngDialog, $http,Notification) { + + $scope.resendMessage = function (msgId,topic,consumerGroup) { + $http({ + method: "POST", + url: "message/consumeMessageDirectly.do", + params: { + msgId: msgId, + consumerGroup:consumerGroup, + topic:topic + } + }).success(function (resp) { + if (resp.status == 0) { + ngDialog.open({ + template: 'operationResultDialog', + data:{ + result:resp.data + } + }); + } + else { + ngDialog.open({ + template: 'operationResultDialog', + data:{ + result:resp.errMsg + } + }); + } + }); + }; + $scope.showExceptionDesc = function (errmsg) { + if(errmsg == null){ + errmsg = "Don't have Exception" + } + ngDialog.open({ + template: 'operationResultDialog', + data:{ + result:errmsg + } + }); + }; + }] +); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/ops.js ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/src/ops.js b/rocketmq-console/src/main/resources/static/src/ops.js new file mode 100644 index 0000000..312e41f --- /dev/null +++ b/rocketmq-console/src/main/resources/static/src/ops.js @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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. + */ + +app.controller('opsController', ['$scope','$location','$http','Notification','remoteApi','tools', function ($scope,$location,$http,Notification,remoteApi,tools) { + $scope.namesvrAddrList = []; + $scope.useVIPChannel = true; + $http({ + method: "GET", + url: "ops/homePage.query" + }).success(function (resp) { + if (resp.status == 0) { + $scope.namesvrAddrList = resp.data.namesvrAddrList; + $scope.useVIPChannel = resp.data.useVIPChannel + }else{ + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + + $scope.updateNameSvrAddr = function () { + $http({ + method: "POST", + url: "ops/updateNameSvrAddr.do", + params:{nameSvrAddrList:$scope.namesvrAddrList.join(";")} + }).success(function (resp) { + if (resp.status == 0) { + Notification.info({message: "SUCCESS", delay: 2000}); + }else{ + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + }; + $scope.updateIsVIPChannel = function () { + $http({ + method: "POST", + url: "ops/updateIsVIPChannel.do", + params:{useVIPChannel:$scope.useVIPChannel} + }).success(function (resp) { + if (resp.status == 0) { + Notification.info({message: "SUCCESS", delay: 2000}); + }else{ + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + } +}]); http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/producer.js ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/src/producer.js b/rocketmq-console/src/main/resources/static/src/producer.js new file mode 100644 index 0000000..3c039ad --- /dev/null +++ b/rocketmq-console/src/main/resources/static/src/producer.js @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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 module = app; +module.controller('producerController', ['$scope', '$http','Notification',function ($scope, $http,Notification) { + $scope.selectedTopic=[]; + $scope.producerGroup=""; + $http({ + method: "GET", + url: "topic/list.query" + }).success(function (resp) { + if(resp.status ==0){ + $scope.allTopicList = resp.data.topicList.sort(); + console.log($scope.allTopicList); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + $scope.queryClientByTopicAndGroup = function () { + $http({ + method: "GET", + url: "producer/producerConnection.query", + params:{ + topic:$scope.selectedTopic, + producerGroup:$scope.producerGroup + } + }).success(function (resp) { + if(resp.status ==0){ + $scope.connectionList = resp.data.connectionSet; + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + } +} ]); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js b/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js new file mode 100644 index 0000000..1189771 --- /dev/null +++ b/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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. + */ +app.service('remoteApi', ['$http','tools', function ($http,tools) { + var queryTopic = function(callback){ + $http({ + method: "GET", + url: "topic/list.query" + }).success(callback); + } + + var queryClusterList = function(callback){ + $http({ + method: "GET", + url: "cluster/list.query" + }).success(callback); + } + + var queryBrokerHisData = function(date,callback){ + var url = 'dashboard/broker.query'; + var data = {date:date}; + var setting = { + type: "GET", + data:data, + timeout:15000,//data is too large,so master set time out is long enough + success:callback + } + $.ajax(url,setting) + } + + var queryTopicHisData = function(date,topicName,callback){ + var url = 'dashboard/topic.query'; + var data = {date:date,topicName:topicName}; + var setting = { + type: "GET", + data:data, + timeout:15000,//data is too large,so master set time out is long enough + success:callback + } + $.ajax(url,setting) + } + + var queryTopicCurrentData = function(callback){ + var url = 'dashboard/topicCurrent'; + var setting = { + type: "GET", + timeout:15000,//data is too large,so master set time out is long enough + success:callback + } + $.ajax(url,setting) + } + + + return { + queryTopic:queryTopic, + queryClusterList:queryClusterList, + queryBrokerHisData:queryBrokerHisData, + queryTopicHisData:queryTopicHisData, + queryTopicCurrentData:queryTopicCurrentData + } +}]) + http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/tools/tools.js ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/src/tools/tools.js b/rocketmq-console/src/main/resources/static/src/tools/tools.js new file mode 100644 index 0000000..9ab5ae7 --- /dev/null +++ b/rocketmq-console/src/main/resources/static/src/tools/tools.js @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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. + */ + +app.service('tools', ['$http', function ($http) { + + var ctx = ""; + var dashboardRefreshTime = 5000; // todo improve. when data size is large,request is too slow + + var generateBrokerMap = function (brokerServer, clusterAddrTable, brokerAddrTable) { + var map = {}; + $.each(brokerServer, function (brokerName, brokerStatusList) { // broker + $.each(clusterAddrTable, function (clusterName, brokerNameList) { //clusterAddrTable + if (angular.isUndefined(map[clusterName])) { + map[clusterName] = []; + } + $.each(brokerNameList, function (listIndex, clusterBrokerName) { + if (clusterBrokerName == brokerName) { + $.each(brokerStatusList, function (index, brokerStatus) { + brokerStatus.split = brokerName; + brokerStatus.index = index; + brokerStatus.address = brokerAddrTable[clusterBrokerName].brokerAddrs[index]; + brokerStatus.brokerName = brokerAddrTable[clusterBrokerName].brokerName; + map[clusterName].push(brokerStatus); + }) + } + }) + }) + }); + return map; + }; + + var fastSort = function (arrayToSort, propertyToSortWith, sortDirection) { + // temporary holder of position and sort-value + var map = arrayToSort.map(function (e, i) { + if (typeof e[propertyToSortWith] === 'string') { + return { index: i, value: e[propertyToSortWith].toLowerCase() }; + } + else { + return { index: i, value: e[propertyToSortWith] }; + } + + }) + + // sorting the map containing the reduced values + map.sort(function (a, b) { + if (sortDirection === "ascending") { + return +(a.value > b.value) || +(a.value === b.value) - 1; + } + else { + return +(a.value < b.value) || +(a.value === b.value) - 1; + } + + }); + + // container for the resulting order + var result = map.map(function (e) { + return arrayToSort[e.index]; + }); + return result; + }; + + return { + generateBrokerMap:generateBrokerMap, + fastSort:fastSort, + ctx:ctx, + dashboardRefreshTime:dashboardRefreshTime + } +}]) + + + http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/topic.js ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/src/topic.js b/rocketmq-console/src/main/resources/static/src/topic.js new file mode 100644 index 0000000..047fbe2 --- /dev/null +++ b/rocketmq-console/src/main/resources/static/src/topic.js @@ -0,0 +1,406 @@ +/** + * Created by tcrow on 2017/1/12 0012. + */ +var module = app; + +module.directive('ngConfirmClick', [ + function(){ + return { + link: function (scope, element, attr) { + var msg = attr.ngConfirmClick || "Are you sure?"; + var clickAction = attr.confirmedClick; + element.bind('click',function (event) { + if ( window.confirm(msg) ) { + scope.$eval(clickAction) + } + }); + } + }; + }]); +module.controller('topicController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) { + $scope.paginationConf = { + currentPage: 1, + totalItems: 0, + itemsPerPage: 10, + pagesLength: 15, + perPageOptions: [10], + rememberPerPage: 'perPageItems', + onChange: function () { + $scope.showTopicList(this.currentPage,this.totalItems); + + } + }; + $scope.filterNormal = true + $scope.filterRetry = false + $scope.filterDLQ = false + $scope.allTopicList = []; + $scope.topicShowList = []; + $http({ + method: "GET", + url: "topic/list.query" + }).success(function (resp) { + if(resp.status ==0){ + $scope.allTopicList = resp.data.topicList.sort(); + console.log($scope.allTopicList); + console.log(JSON.stringify(resp)); + $scope.showTopicList(1,$scope.allTopicList.length); + + }else { + Notification.error({message: resp.errMsg, delay: 5000}); + } + + }); + $scope.filterStr=""; + $scope.$watch('filterStr', function() { + $scope.filterList(1); + }); + $scope.$watch('filterNormal', function() { + $scope.filterList(1); + }); + $scope.$watch('filterRetry', function() { + $scope.filterList(1); + }); + $scope.$watch('filterDLQ', function() { + $scope.filterList(1); + }); + $scope.filterList = function (currentPage) { + var lowExceptStr = $scope.filterStr.toLowerCase(); + var canShowList = []; + + $scope.allTopicList.forEach(function(element) { + if($scope.filterByType(element)){ + if (element.toLowerCase().indexOf(lowExceptStr) != -1){ + canShowList.push(element); + } + } + }); + $scope.paginationConf.totalItems =canShowList.length; + var perPage = $scope.paginationConf.itemsPerPage; + var from = (currentPage - 1) * perPage; + var to = (from + perPage)>canShowList.length?canShowList.length:from + perPage; + $scope.topicShowList = canShowList.slice(from, to); + }; + + $scope.filterByType = function(str){ + if($scope.filterRetry){ + if(str.startsWith("%R")){ + return true + } + } + if($scope.filterDLQ){ + if(str.startsWith("%D")){ + return true + } + } + if($scope.filterNormal){ + if(str.startsWith("%") == false){ + return true + } + } + return false; + }; + + $scope.showTopicList = function (currentPage,totalItem) { + if($scope.filterStr != ""){ + $scope.filterList(currentPage); + return; + } + var perPage = $scope.paginationConf.itemsPerPage; + var from = (currentPage - 1) * perPage; + var to = (from + perPage)>totalItem?totalItem:from + perPage; + console.log($scope.allTopicList); + console.log(from) + console.log(to) + $scope.topicShowList = $scope.allTopicList.slice(from, to); + $scope.paginationConf.totalItems = totalItem ; + console.log($scope.topicShowList) + console.log($scope.paginationConf.totalItems) + $scope.filterList(currentPage); + }; + $scope.deleteTopic= function (topic) { + $http({ + method: "POST", + url: "topic/deleteTopic.do", + params:{ + topic:topic + } + }).success(function (resp) { + if(resp.status ==0){ + Notification.info({message: "delete success!", delay: 2000}); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + }; + $scope.statsView = function (topic) { + $http({ + method: "GET", + url: "topic/stats.query", + params: {topic: topic} + }).success(function (resp) { + if (resp.status == 0) { + console.log(JSON.stringify(resp)); + ngDialog.open({ + template: 'statsViewDialog', + trapFocus:false, + data:{ + topic:topic, + statsData:resp.data + } + }); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }) + }; + $scope.routerView = function (topic) { + $http({ + method: "GET", + url: "topic/route.query", + params: {topic: topic} + }).success(function (resp) { + if (resp.status == 0) { + console.log(JSON.stringify(resp)); + ngDialog.open({ + template: 'routerViewDialog', + controller: 'routerViewDialogController', + trapFocus:false, + data:{ + topic:topic, + routeData:resp.data + } + }); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }) + }; + + + $scope.consumerView = function (topic) { + $http({ + method: "GET", + url: "topic/queryConsumerByTopic.query", + params: {topic: topic} + }).success(function (resp) { + if (resp.status == 0) { + console.log(JSON.stringify(resp)); + ngDialog.open({ + template: 'consumerViewDialog', + data:{ + topic:topic, + consumerData:resp.data, + consumerGroupCount:Object.keys(resp.data).length + } + }); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }) + }; + $scope.openDeleteTopicDialog = function (topic) { + ngDialog.open({ + template: 'deleteTopicDialog', + controller: 'deleteTopicDialogController', + data:{ + topic:topic, + consumerData:"asd" + } + }); + }; + + $scope.openConsumerResetOffsetDialog = function (topic) { + + $http({ + method: "GET", + url: "topic/queryTopicConsumerInfo.query", + params:{ + topic:topic + } + }).success(function (resp) { + if(resp.status ==0){ + if(resp.data.groupList == null){ + Notification.error({message: "don't have consume group!", delay: 2000}); + return + } + ngDialog.open({ + template: 'consumerResetOffsetDialog', + controller: 'consumerResetOffsetDialogController', + data:{ + topic: topic, + selectedConsumerGroup:[], + allConsumerGroupList:resp.data.groupList + } + }); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + + }; + + + $scope.openSendTopicMessageDialog = function (topic) { + ngDialog.open({ + template: 'sendTopicMessageDialog', + controller: 'sendTopicMessageDialogController', + data: { + topic: topic + } + }); + }; + + $scope.openUpdateDialog = function (topic) { + $http({ + method: "GET", + url: "topic/examineTopicConfig.query", + params:{ + topic:topic + } + }).success(function (resp) { + if(resp.status ==0){ + $scope.openCreateOrUpdateDialog(resp.data); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + }; + + $scope.openCreateOrUpdateDialog = function (request) { + var bIsUpdate = true; + + if(request == null){ + request = [{ + writeQueueNums:16, + readQueueNums:16, + perm:6, + order:false, + topicName:"", + brokerNameList:[] + }]; + bIsUpdate = false; + } + $http({ + method: "GET", + url: "cluster/list.query" + }).success(function (resp) { + if(resp.status ==0){ + console.log(resp); + ngDialog.open({ + template: 'topicModifyDialog', + controller: 'topicModifyDialogController', + data:{ + topicRequestList:request, + allClusterNameList:Object.keys(resp.data.clusterInfo.clusterAddrTable), + allBrokerNameList:Object.keys(resp.data.brokerServer), + bIsUpdate:bIsUpdate + } + }); + } + }); + } + + $scope.openAddDialog = function () { + $scope.openCreateOrUpdateDialog(null); + } + +}]); + +module.controller('topicModifyDialogController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) { + $scope.postTopicRequest = function (topicRequestItem) { + console.log(topicRequestItem); + var request = JSON.parse(JSON.stringify(topicRequestItem)); + console.log(request); + $http({ + method: "POST", + url: "topic/createOrUpdate.do", + data:request + }).success(function (resp) { + if(resp.status ==0){ + Notification.info({message: "success!", delay: 2000}); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }); + } + }] +); +module.controller('consumerResetOffsetDialogController',['$scope', 'ngDialog', '$http','Notification', function ($scope, ngDialog, $http,Notification) { + $scope.timepicker = {}; + $scope.timepicker.date = moment().format('YYYY-MM-DD HH:mm'); + $scope.timepicker.options = {format: 'YYYY-MM-DD HH:mm', showClear: true}; + $scope.resetOffset = function () { + console.log($scope.timepicker.date); + console.log($scope.timepicker.date.valueOf()); + console.log($scope.ngDialogData.selectedConsumerGroup); + $http({ + method: "POST", + url: "consumer/resetOffset.do", + data: { + resetTime: $scope.timepicker.date.valueOf(), + consumerGroupList: $scope.ngDialogData.selectedConsumerGroup, + topic:$scope.ngDialogData.topic, + force:true + } + }).success(function (resp) { + if(resp.status ==0){ + ngDialog.open({ + template: 'resetOffsetResultDialog', + data:{ + result:resp.data + } + }); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }) + } + }] +); + +module.controller('sendTopicMessageDialogController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) { + $scope.sendTopicMessage = { + topic: $scope.ngDialogData.topic, + key: "key", + tag:"tag", + messageBody:"messageBody" + }; + $scope.send = function () { + $http({ + method: "POST", + url: "topic/sendTopicMessage.do", + data: $scope.sendTopicMessage + }).success(function (resp) { + if(resp.status ==0){ + ngDialog.open({ + template: 'sendResultDialog', + data:{ + result:resp.data + } + }); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }) + } + }] + +); + +module.controller('routerViewDialogController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) { + $scope.deleteTopicByBroker = function (broker) { + $http({ + method: "POST", + url: "topic/deleteTopicByBroker.do", + params: {brokerName:broker.brokerName,topic:$scope.ngDialogData.topic} + }).success(function (resp) { + if(resp.status ==0){ + Notification.info({message: "delete success", delay: 2000}); + }else { + Notification.error({message: resp.errMsg, delay: 2000}); + } + }) + }; + }] + +); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/animate.css ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/style/animate.css b/rocketmq-console/src/main/resources/static/style/animate.css new file mode 100644 index 0000000..e3f0d0e --- /dev/null +++ b/rocketmq-console/src/main/resources/static/style/animate.css @@ -0,0 +1,32 @@ +.view { +} + +.view .ng-enter { + overflow-y: auto; +} + +.view .ng-leave { + opacity: 0; + -webkit-transition: opacity .2s linear; + transition: opacity 0.2s linear; +} + +.ng-hide-add { + transform: rotateZ(0); + transform-origin: right; + transition: all 0.2s ease-in-out; +} + +.ng-hide-add.ng-hide-add-active { + transform: rotateZ(-135deg); +} + +.ng-hide-remove { + transform: rotateY(90deg); + transform-origin: left; + transition: all 0.2s ease; +} + +.ng-hide-remove.ng-hide-remove-active { + transform: rotateY(0); +} http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/app.css ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/style/app.css b/rocketmq-console/src/main/resources/static/style/app.css new file mode 100644 index 0000000..1941c11 --- /dev/null +++ b/rocketmq-console/src/main/resources/static/style/app.css @@ -0,0 +1,274 @@ +/* Write your styles */ +.scrollTo { + position: fixed; + right: 50px; + bottom: 70px; + z-index: 999; +} + +/*.icon_u_c{background:url(/app/img/icon_user_center.png) no-repeat left top;}*/ +.icon { + float: left; + width: 24px; + height: 24px; + display: inline-block; + margin: 10px 18px 0 5px; +} +.icon_alipay { + background:url("/style/img/alipay.png") no-repeat left top; + height:100px; + width: 100px; + margin-top: -40px; +} + +.icon_alipay_active { + background:url("/style/img/alipay_active.png") no-repeat left top; + height:100px; + width: 100px; + margin-top: -40px; +} + +.icon_weipay { + background:url("/style/img/weipay.png") no-repeat left top; + height:100px; + width: 100px; + margin-top: -40px; +} + +.icon_weipay_active { + background:url("/style/img/weipay_active.png") no-repeat left top; + height:100px; + width: 100px; + margin-top: -40px; +} + +.round { + background:#5bc0de; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius:5px; + color: #FFFFFF; +} + + +/* ANIMATIONS +============================================================================= */ + +/* leaving animations ----------------------------------------- */ +/* rotate and fall */ +@keyframes rotateFall { + 0% { transform: rotateZ(0deg); } + 20% { transform: rotateZ(10deg); animation-timing-function: ease-out; } + 40% { transform: rotateZ(17deg); } + 60% { transform: rotateZ(16deg); } + 100% { transform: translateY(100%) rotateZ(17deg); } +} + +/* slide in from the bottom */ +@keyframes slideOutLeft { + to { transform: translateX(-100%); } +} + +/*!* rotate out newspaper *!*/ +@keyframes rotateOutNewspaper { + to { transform: translateZ(-3000px) rotateZ(360deg); opacity: 0; } +} + +/* entering animations --------------------------------------- */ +/* scale up */ +@keyframes scaleUp { + from { opacity: 0.3; -webkit-transform: scale(0.8); } +} + +/* slide in from the right */ +@keyframes slideInRight { + from { transform:translateX(100%); } + to { transform: translateX(0); } +} + +/* slide in from the bottom */ +@keyframes slideInUp { + from { transform:translateY(100%); } + to { transform: translateY(0); } +} + +.ng-enter { animation: scaleUp 0.5s both ease-in; z-index: 8888; } +.ng-leave { animation: slideOutLeft 0.2s both ease-in; z-index: 9999; } + + + + +.managerList { + list-style:none; + position: relative; + width: 100%; + margin-left: 20px; +} + +.managerList > li { + width: 95%; + margin-top:10px; +} + +.managerList ul { + list-style-type:none; + float:left; + padding: 0; +} + +.managerList li { + list-style-type:none; + float:left; + padding: 0; +} + +.managerList .head { + width: 90%; +} + +.managerList .footer { + width: 90%; + margin-top: 10px; + margin-left: 50px; +} + +.managerList .checkbox { + width: 50px; +} + +.managerList .liCheck { + width: 50px; +} + +.managerList .liContent { + width: 90%; +} + +.managerList .preview { + width: 50%; + margin-left: 50px; + margin-top: 10px; +} + +.managerList .logo { + margin-top: 9px; + width: 50px; +} + +.managerList .content{ + width: 50%; +} + +.managerList .content ul{ + width: 90%; +} + +.managerList .butt{ + /*width: 20%;*/ +} + +.badgeCustomer { + background-color:#f44336; + margin-top:23px; +} + +.chatPanel { + width: 90%; + float: left; + border: 1px solid #d4d4d4; + border-radius: 2px; + padding: 20px; + position: relative; + -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175); + box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175); + float: right; +} + +.chatPanel:after{ + position: absolute; + top: 27px; + right: -14px; + display: inline-block; + border-top: 14px solid transparent; + border-left: 14px solid #fff; + border-right: 0 solid #fff; + border-bottom: 14px solid transparent; + content: " "; +} + +.chatPanel:before{ + position: absolute; + top: 26px; + right: -15px; + display: inline-block; + border-top: 15px solid transparent; + border-left: 15px solid #ccc; + border-right: 0 solid #ccc; + border-bottom: 15px solid transparent; + content: " "; +} + +.chatPanel-left { + float: left; +} +.chatPanel-left:before { + border-left-width: 0; + border-right-width: 15px; + left: -15px; + right: auto; +} +.chatPanel-left:after { + border-left-width: 0; + border-right-width: 14px; + left: -14px; + right: auto; +} + +.xxs-avatar { + width: 10px; + height: 10px; +} + + +.xs-avatar { + width: 50px; + height: 50px; +} + +.md-avatar { + width: 70px; + height: 70px; +} + +.lg-avatar { + width: 100px; + height: 100px; +} + +.text-truncate { + word-wrap: normal; + /* for IE */ + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.text-yellow { + color:#FFCC66; +} + +.label-xl{ + font-size:150%; +} + +.pointer { + cursor: pointer; +} + +.limit_height{ + height: 600px;overflow-y:auto;overflow-x:hidden; +} + +.table.text-middle>tbody>tr>td,.table.text-middle>tbody>tr>th{ + vertical-align: middle; +} http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/btn.css ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/style/btn.css b/rocketmq-console/src/main/resources/static/style/btn.css new file mode 100644 index 0000000..29d4186 --- /dev/null +++ b/rocketmq-console/src/main/resources/static/style/btn.css @@ -0,0 +1,752 @@ + +.btn, +.navbar .navbar-nav > li > a.btn { + border: none; + border-radius: 3px; + position: relative; + padding: 12px 30px; + margin: 10px 1px; + font-size: 12px; + font-weight: 400; + text-transform: uppercase; + letter-spacing: 0; + will-change: box-shadow, transform; + transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} +.btn::-moz-focus-inner, +.navbar .navbar-nav > li > a.btn::-moz-focus-inner { + border: 0; +} +.btn, .btn.btn-default, +.navbar .navbar-nav > li > a.btn, +.navbar .navbar-nav > li > a.btn.btn-default { + box-shadow: 0 2px 2px 0 rgba(153, 153, 153, 0.14), 0 3px 1px -2px rgba(153, 153, 153, 0.2), 0 1px 5px 0 rgba(153, 153, 153, 0.12); +} +.btn, .btn:hover, .btn:focus, .btn:active, .btn.active, .btn:active:focus, .btn:active:hover, .btn.active:focus, .btn.active:hover, .open > .btn.dropdown-toggle, .open > .btn.dropdown-toggle:focus, .open > .btn.dropdown-toggle:hover, .btn.btn-default, .btn.btn-default:hover, .btn.btn-default:focus, .btn.btn-default:active, .btn.btn-default.active, .btn.btn-default:active:focus, .btn.btn-default:active:hover, .btn.btn-default.active:focus, .btn.btn-default.active:hover, .open > .btn.btn-default.dropdown-toggle, .open > .btn.btn-default.dropdown-toggle:focus, .open > .btn.btn-default.dropdown-toggle:hover, +.navbar .navbar-nav > li > a.btn, +.navbar .navbar-nav > li > a.btn:hover, +.navbar .navbar-nav > li > a.btn:focus, +.navbar .navbar-nav > li > a.btn:active, +.navbar .navbar-nav > li > a.btn.active, +.navbar .navbar-nav > li > a.btn:active:focus, +.navbar .navbar-nav > li > a.btn:active:hover, +.navbar .navbar-nav > li > a.btn.active:focus, +.navbar .navbar-nav > li > a.btn.active:hover, .open > +.navbar .navbar-nav > li > a.btn.dropdown-toggle, .open > +.navbar .navbar-nav > li > a.btn.dropdown-toggle:focus, .open > +.navbar .navbar-nav > li > a.btn.dropdown-toggle:hover, +.navbar .navbar-nav > li > a.btn.btn-default, +.navbar .navbar-nav > li > a.btn.btn-default:hover, +.navbar .navbar-nav > li > a.btn.btn-default:focus, +.navbar .navbar-nav > li > a.btn.btn-default:active, +.navbar .navbar-nav > li > a.btn.btn-default.active, +.navbar .navbar-nav > li > a.btn.btn-default:active:focus, +.navbar .navbar-nav > li > a.btn.btn-default:active:hover, +.navbar .navbar-nav > li > a.btn.btn-default.active:focus, +.navbar .navbar-nav > li > a.btn.btn-default.active:hover, .open > +.navbar .navbar-nav > li > a.btn.btn-default.dropdown-toggle, .open > +.navbar .navbar-nav > li > a.btn.btn-default.dropdown-toggle:focus, .open > +.navbar .navbar-nav > li > a.btn.btn-default.dropdown-toggle:hover { + background-color: #999999; + color: #FFFFFF; +} +.btn:focus, .btn:active, .btn:hover, .btn.btn-default:focus, .btn.btn-default:active, .btn.btn-default:hover, +.navbar .navbar-nav > li > a.btn:focus, +.navbar .navbar-nav > li > a.btn:active, +.navbar .navbar-nav > li > a.btn:hover, +.navbar .navbar-nav > li > a.btn.btn-default:focus, +.navbar .navbar-nav > li > a.btn.btn-default:active, +.navbar .navbar-nav > li > a.btn.btn-default:hover { + box-shadow: 0 14px 26px -12px rgba(153, 153, 153, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(153, 153, 153, 0.2); +} +.btn.disabled, .btn.disabled:hover, .btn.disabled:focus, .btn.disabled.focus, .btn.disabled:active, .btn.disabled.active, .btn:disabled, .btn:disabled:hover, .btn:disabled:focus, .btn:disabled.focus, .btn:disabled:active, .btn:disabled.active, .btn[disabled], .btn[disabled]:hover, .btn[disabled]:focus, .btn[disabled].focus, .btn[disabled]:active, .btn[disabled].active, fieldset[disabled] .btn, fieldset[disabled] .btn:hover, fieldset[disabled] .btn:focus, fieldset[disabled] .btn.focus, fieldset[disabled] .btn:active, fieldset[disabled] .btn.active, .btn.btn-default.disabled, .btn.btn-default.disabled:hover, .btn.btn-default.disabled:focus, .btn.btn-default.disabled.focus, .btn.btn-default.disabled:active, .btn.btn-default.disabled.active, .btn.btn-default:disabled, .btn.btn-default:disabled:hover, .btn.btn-default:disabled:focus, .btn.btn-default:disabled.focus, .btn.btn-default:disabled:active, .btn.btn-default:disabled.active, .btn.btn-default[disabled], .btn.btn-default[disabled]: hover, .btn.btn-default[disabled]:focus, .btn.btn-default[disabled].focus, .btn.btn-default[disabled]:active, .btn.btn-default[disabled].active, fieldset[disabled] .btn.btn-default, fieldset[disabled] .btn.btn-default:hover, fieldset[disabled] .btn.btn-default:focus, fieldset[disabled] .btn.btn-default.focus, fieldset[disabled] .btn.btn-default:active, fieldset[disabled] .btn.btn-default.active, +.navbar .navbar-nav > li > a.btn.disabled, +.navbar .navbar-nav > li > a.btn.disabled:hover, +.navbar .navbar-nav > li > a.btn.disabled:focus, +.navbar .navbar-nav > li > a.btn.disabled.focus, +.navbar .navbar-nav > li > a.btn.disabled:active, +.navbar .navbar-nav > li > a.btn.disabled.active, +.navbar .navbar-nav > li > a.btn:disabled, +.navbar .navbar-nav > li > a.btn:disabled:hover, +.navbar .navbar-nav > li > a.btn:disabled:focus, +.navbar .navbar-nav > li > a.btn:disabled.focus, +.navbar .navbar-nav > li > a.btn:disabled:active, +.navbar .navbar-nav > li > a.btn:disabled.active, +.navbar .navbar-nav > li > a.btn[disabled], +.navbar .navbar-nav > li > a.btn[disabled]:hover, +.navbar .navbar-nav > li > a.btn[disabled]:focus, +.navbar .navbar-nav > li > a.btn[disabled].focus, +.navbar .navbar-nav > li > a.btn[disabled]:active, +.navbar .navbar-nav > li > a.btn[disabled].active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn, fieldset[disabled] +.navbar .navbar-nav > li > a.btn:hover, fieldset[disabled] +.navbar .navbar-nav > li > a.btn:focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn:active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.active, +.navbar .navbar-nav > li > a.btn.btn-default.disabled, +.navbar .navbar-nav > li > a.btn.btn-default.disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-default.disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-default.disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-default.disabled:active, +.navbar .navbar-nav > li > a.btn.btn-default.disabled.active, +.navbar .navbar-nav > li > a.btn.btn-default:disabled, +.navbar .navbar-nav > li > a.btn.btn-default:disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-default:disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-default:disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-default:disabled:active, +.navbar .navbar-nav > li > a.btn.btn-default:disabled.active, +.navbar .navbar-nav > li > a.btn.btn-default[disabled], +.navbar .navbar-nav > li > a.btn.btn-default[disabled]:hover, +.navbar .navbar-nav > li > a.btn.btn-default[disabled]:focus, +.navbar .navbar-nav > li > a.btn.btn-default[disabled].focus, +.navbar .navbar-nav > li > a.btn.btn-default[disabled]:active, +.navbar .navbar-nav > li > a.btn.btn-default[disabled].active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-default, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-default:hover, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-default:focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-default.focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-default:active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-default.active { + box-shadow: none; +} +.btn.btn-simple, .btn.btn-default.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-default.btn-simple { + background-color: transparent; + color: #999999; + box-shadow: none; +} +.btn.btn-simple:hover, .btn.btn-simple:focus, .btn.btn-simple:active, .btn.btn-default.btn-simple:hover, .btn.btn-default.btn-simple:focus, .btn.btn-default.btn-simple:active, +.navbar .navbar-nav > li > a.btn.btn-simple:hover, +.navbar .navbar-nav > li > a.btn.btn-simple:focus, +.navbar .navbar-nav > li > a.btn.btn-simple:active, +.navbar .navbar-nav > li > a.btn.btn-default.btn-simple:hover, +.navbar .navbar-nav > li > a.btn.btn-default.btn-simple:focus, +.navbar .navbar-nav > li > a.btn.btn-default.btn-simple:active { + background-color: transparent; + color: #999999; +} +.btn.btn-primary, +.navbar .navbar-nav > li > a.btn.btn-primary { + box-shadow: 0 2px 2px 0 rgba(156, 39, 176, 0.14), 0 3px 1px -2px rgba(156, 39, 176, 0.2), 0 1px 5px 0 rgba(156, 39, 176, 0.12); +} +.btn.btn-primary, .btn.btn-primary:hover, .btn.btn-primary:focus, .btn.btn-primary:active, .btn.btn-primary.active, .btn.btn-primary:active:focus, .btn.btn-primary:active:hover, .btn.btn-primary.active:focus, .btn.btn-primary.active:hover, .open > .btn.btn-primary.dropdown-toggle, .open > .btn.btn-primary.dropdown-toggle:focus, .open > .btn.btn-primary.dropdown-toggle:hover, +.navbar .navbar-nav > li > a.btn.btn-primary, +.navbar .navbar-nav > li > a.btn.btn-primary:hover, +.navbar .navbar-nav > li > a.btn.btn-primary:focus, +.navbar .navbar-nav > li > a.btn.btn-primary:active, +.navbar .navbar-nav > li > a.btn.btn-primary.active, +.navbar .navbar-nav > li > a.btn.btn-primary:active:focus, +.navbar .navbar-nav > li > a.btn.btn-primary:active:hover, +.navbar .navbar-nav > li > a.btn.btn-primary.active:focus, +.navbar .navbar-nav > li > a.btn.btn-primary.active:hover, .open > +.navbar .navbar-nav > li > a.btn.btn-primary.dropdown-toggle, .open > +.navbar .navbar-nav > li > a.btn.btn-primary.dropdown-toggle:focus, .open > +.navbar .navbar-nav > li > a.btn.btn-primary.dropdown-toggle:hover { + background-color: #9c27b0; + color: #FFFFFF; +} +.btn.btn-primary:focus, .btn.btn-primary:active, .btn.btn-primary:hover, +.navbar .navbar-nav > li > a.btn.btn-primary:focus, +.navbar .navbar-nav > li > a.btn.btn-primary:active, +.navbar .navbar-nav > li > a.btn.btn-primary:hover { + box-shadow: 0 14px 26px -12px rgba(156, 39, 176, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(156, 39, 176, 0.2); +} +.btn.btn-primary.disabled, .btn.btn-primary.disabled:hover, .btn.btn-primary.disabled:focus, .btn.btn-primary.disabled.focus, .btn.btn-primary.disabled:active, .btn.btn-primary.disabled.active, .btn.btn-primary:disabled, .btn.btn-primary:disabled:hover, .btn.btn-primary:disabled:focus, .btn.btn-primary:disabled.focus, .btn.btn-primary:disabled:active, .btn.btn-primary:disabled.active, .btn.btn-primary[disabled], .btn.btn-primary[disabled]:hover, .btn.btn-primary[disabled]:focus, .btn.btn-primary[disabled].focus, .btn.btn-primary[disabled]:active, .btn.btn-primary[disabled].active, fieldset[disabled] .btn.btn-primary, fieldset[disabled] .btn.btn-primary:hover, fieldset[disabled] .btn.btn-primary:focus, fieldset[disabled] .btn.btn-primary.focus, fieldset[disabled] .btn.btn-primary:active, fieldset[disabled] .btn.btn-primary.active, +.navbar .navbar-nav > li > a.btn.btn-primary.disabled, +.navbar .navbar-nav > li > a.btn.btn-primary.disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-primary.disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-primary.disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-primary.disabled:active, +.navbar .navbar-nav > li > a.btn.btn-primary.disabled.active, +.navbar .navbar-nav > li > a.btn.btn-primary:disabled, +.navbar .navbar-nav > li > a.btn.btn-primary:disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-primary:disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-primary:disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-primary:disabled:active, +.navbar .navbar-nav > li > a.btn.btn-primary:disabled.active, +.navbar .navbar-nav > li > a.btn.btn-primary[disabled], +.navbar .navbar-nav > li > a.btn.btn-primary[disabled]:hover, +.navbar .navbar-nav > li > a.btn.btn-primary[disabled]:focus, +.navbar .navbar-nav > li > a.btn.btn-primary[disabled].focus, +.navbar .navbar-nav > li > a.btn.btn-primary[disabled]:active, +.navbar .navbar-nav > li > a.btn.btn-primary[disabled].active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-primary, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-primary:hover, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-primary:focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-primary.focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-primary:active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-primary.active { + box-shadow: none; +} +.btn.btn-primary.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple { + background-color: transparent; + color: #9c27b0; + box-shadow: none; +} +.btn.btn-primary.btn-simple:hover, .btn.btn-primary.btn-simple:focus, .btn.btn-primary.btn-simple:active, +.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple:hover, +.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple:focus, +.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple:active { + background-color: transparent; + color: #9c27b0; +} +.btn.btn-info, +.navbar .navbar-nav > li > a.btn.btn-info { + box-shadow: 0 2px 2px 0 rgba(0, 188, 212, 0.14), 0 3px 1px -2px rgba(0, 188, 212, 0.2), 0 1px 5px 0 rgba(0, 188, 212, 0.12); +} +.btn.btn-info, .btn.btn-info:hover, .btn.btn-info:focus, .btn.btn-info:active, .btn.btn-info.active, .btn.btn-info:active:focus, .btn.btn-info:active:hover, .btn.btn-info.active:focus, .btn.btn-info.active:hover, .open > .btn.btn-info.dropdown-toggle, .open > .btn.btn-info.dropdown-toggle:focus, .open > .btn.btn-info.dropdown-toggle:hover, +.navbar .navbar-nav > li > a.btn.btn-info, +.navbar .navbar-nav > li > a.btn.btn-info:hover, +.navbar .navbar-nav > li > a.btn.btn-info:focus, +.navbar .navbar-nav > li > a.btn.btn-info:active, +.navbar .navbar-nav > li > a.btn.btn-info.active, +.navbar .navbar-nav > li > a.btn.btn-info:active:focus, +.navbar .navbar-nav > li > a.btn.btn-info:active:hover, +.navbar .navbar-nav > li > a.btn.btn-info.active:focus, +.navbar .navbar-nav > li > a.btn.btn-info.active:hover, .open > +.navbar .navbar-nav > li > a.btn.btn-info.dropdown-toggle, .open > +.navbar .navbar-nav > li > a.btn.btn-info.dropdown-toggle:focus, .open > +.navbar .navbar-nav > li > a.btn.btn-info.dropdown-toggle:hover { + background-color: #00bcd4; + color: #FFFFFF; +} +.btn.btn-info:focus, .btn.btn-info:active, .btn.btn-info:hover, +.navbar .navbar-nav > li > a.btn.btn-info:focus, +.navbar .navbar-nav > li > a.btn.btn-info:active, +.navbar .navbar-nav > li > a.btn.btn-info:hover { + box-shadow: 0 14px 26px -12px rgba(0, 188, 212, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 188, 212, 0.2); +} +.btn.btn-info.disabled, .btn.btn-info.disabled:hover, .btn.btn-info.disabled:focus, .btn.btn-info.disabled.focus, .btn.btn-info.disabled:active, .btn.btn-info.disabled.active, .btn.btn-info:disabled, .btn.btn-info:disabled:hover, .btn.btn-info:disabled:focus, .btn.btn-info:disabled.focus, .btn.btn-info:disabled:active, .btn.btn-info:disabled.active, .btn.btn-info[disabled], .btn.btn-info[disabled]:hover, .btn.btn-info[disabled]:focus, .btn.btn-info[disabled].focus, .btn.btn-info[disabled]:active, .btn.btn-info[disabled].active, fieldset[disabled] .btn.btn-info, fieldset[disabled] .btn.btn-info:hover, fieldset[disabled] .btn.btn-info:focus, fieldset[disabled] .btn.btn-info.focus, fieldset[disabled] .btn.btn-info:active, fieldset[disabled] .btn.btn-info.active, +.navbar .navbar-nav > li > a.btn.btn-info.disabled, +.navbar .navbar-nav > li > a.btn.btn-info.disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-info.disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-info.disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-info.disabled:active, +.navbar .navbar-nav > li > a.btn.btn-info.disabled.active, +.navbar .navbar-nav > li > a.btn.btn-info:disabled, +.navbar .navbar-nav > li > a.btn.btn-info:disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-info:disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-info:disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-info:disabled:active, +.navbar .navbar-nav > li > a.btn.btn-info:disabled.active, +.navbar .navbar-nav > li > a.btn.btn-info[disabled], +.navbar .navbar-nav > li > a.btn.btn-info[disabled]:hover, +.navbar .navbar-nav > li > a.btn.btn-info[disabled]:focus, +.navbar .navbar-nav > li > a.btn.btn-info[disabled].focus, +.navbar .navbar-nav > li > a.btn.btn-info[disabled]:active, +.navbar .navbar-nav > li > a.btn.btn-info[disabled].active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-info, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-info:hover, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-info:focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-info.focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-info:active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-info.active { + box-shadow: none; +} +.btn.btn-info.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-info.btn-simple { + background-color: transparent; + color: #00bcd4; + box-shadow: none; +} +.btn.btn-info.btn-simple:hover, .btn.btn-info.btn-simple:focus, .btn.btn-info.btn-simple:active, +.navbar .navbar-nav > li > a.btn.btn-info.btn-simple:hover, +.navbar .navbar-nav > li > a.btn.btn-info.btn-simple:focus, +.navbar .navbar-nav > li > a.btn.btn-info.btn-simple:active { + background-color: transparent; + color: #00bcd4; +} +.btn.btn-success, +.navbar .navbar-nav > li > a.btn.btn-success { + box-shadow: 0 2px 2px 0 rgba(76, 175, 80, 0.14), 0 3px 1px -2px rgba(76, 175, 80, 0.2), 0 1px 5px 0 rgba(76, 175, 80, 0.12); +} +.btn.btn-success, .btn.btn-success:hover, .btn.btn-success:focus, .btn.btn-success:active, .btn.btn-success.active, .btn.btn-success:active:focus, .btn.btn-success:active:hover, .btn.btn-success.active:focus, .btn.btn-success.active:hover, .open > .btn.btn-success.dropdown-toggle, .open > .btn.btn-success.dropdown-toggle:focus, .open > .btn.btn-success.dropdown-toggle:hover, +.navbar .navbar-nav > li > a.btn.btn-success, +.navbar .navbar-nav > li > a.btn.btn-success:hover, +.navbar .navbar-nav > li > a.btn.btn-success:focus, +.navbar .navbar-nav > li > a.btn.btn-success:active, +.navbar .navbar-nav > li > a.btn.btn-success.active, +.navbar .navbar-nav > li > a.btn.btn-success:active:focus, +.navbar .navbar-nav > li > a.btn.btn-success:active:hover, +.navbar .navbar-nav > li > a.btn.btn-success.active:focus, +.navbar .navbar-nav > li > a.btn.btn-success.active:hover, .open > +.navbar .navbar-nav > li > a.btn.btn-success.dropdown-toggle, .open > +.navbar .navbar-nav > li > a.btn.btn-success.dropdown-toggle:focus, .open > +.navbar .navbar-nav > li > a.btn.btn-success.dropdown-toggle:hover { + background-color: #4caf50; + color: #FFFFFF; +} +.btn.btn-success:focus, .btn.btn-success:active, .btn.btn-success:hover, +.navbar .navbar-nav > li > a.btn.btn-success:focus, +.navbar .navbar-nav > li > a.btn.btn-success:active, +.navbar .navbar-nav > li > a.btn.btn-success:hover { + box-shadow: 0 14px 26px -12px rgba(76, 175, 80, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(76, 175, 80, 0.2); +} +.btn.btn-success.disabled, .btn.btn-success.disabled:hover, .btn.btn-success.disabled:focus, .btn.btn-success.disabled.focus, .btn.btn-success.disabled:active, .btn.btn-success.disabled.active, .btn.btn-success:disabled, .btn.btn-success:disabled:hover, .btn.btn-success:disabled:focus, .btn.btn-success:disabled.focus, .btn.btn-success:disabled:active, .btn.btn-success:disabled.active, .btn.btn-success[disabled], .btn.btn-success[disabled]:hover, .btn.btn-success[disabled]:focus, .btn.btn-success[disabled].focus, .btn.btn-success[disabled]:active, .btn.btn-success[disabled].active, fieldset[disabled] .btn.btn-success, fieldset[disabled] .btn.btn-success:hover, fieldset[disabled] .btn.btn-success:focus, fieldset[disabled] .btn.btn-success.focus, fieldset[disabled] .btn.btn-success:active, fieldset[disabled] .btn.btn-success.active, +.navbar .navbar-nav > li > a.btn.btn-success.disabled, +.navbar .navbar-nav > li > a.btn.btn-success.disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-success.disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-success.disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-success.disabled:active, +.navbar .navbar-nav > li > a.btn.btn-success.disabled.active, +.navbar .navbar-nav > li > a.btn.btn-success:disabled, +.navbar .navbar-nav > li > a.btn.btn-success:disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-success:disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-success:disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-success:disabled:active, +.navbar .navbar-nav > li > a.btn.btn-success:disabled.active, +.navbar .navbar-nav > li > a.btn.btn-success[disabled], +.navbar .navbar-nav > li > a.btn.btn-success[disabled]:hover, +.navbar .navbar-nav > li > a.btn.btn-success[disabled]:focus, +.navbar .navbar-nav > li > a.btn.btn-success[disabled].focus, +.navbar .navbar-nav > li > a.btn.btn-success[disabled]:active, +.navbar .navbar-nav > li > a.btn.btn-success[disabled].active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-success, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-success:hover, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-success:focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-success.focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-success:active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-success.active { + box-shadow: none; +} +.btn.btn-success.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-success.btn-simple { + background-color: transparent; + color: #4caf50; + box-shadow: none; +} +.btn.btn-success.btn-simple:hover, .btn.btn-success.btn-simple:focus, .btn.btn-success.btn-simple:active, +.navbar .navbar-nav > li > a.btn.btn-success.btn-simple:hover, +.navbar .navbar-nav > li > a.btn.btn-success.btn-simple:focus, +.navbar .navbar-nav > li > a.btn.btn-success.btn-simple:active { + background-color: transparent; + color: #4caf50; +} +.btn.btn-warning, +.navbar .navbar-nav > li > a.btn.btn-warning { + box-shadow: 0 2px 2px 0 rgba(255, 152, 0, 0.14), 0 3px 1px -2px rgba(255, 152, 0, 0.2), 0 1px 5px 0 rgba(255, 152, 0, 0.12); +} +.btn.btn-warning, .btn.btn-warning:hover, .btn.btn-warning:focus, .btn.btn-warning:active, .btn.btn-warning.active, .btn.btn-warning:active:focus, .btn.btn-warning:active:hover, .btn.btn-warning.active:focus, .btn.btn-warning.active:hover, .open > .btn.btn-warning.dropdown-toggle, .open > .btn.btn-warning.dropdown-toggle:focus, .open > .btn.btn-warning.dropdown-toggle:hover, +.navbar .navbar-nav > li > a.btn.btn-warning, +.navbar .navbar-nav > li > a.btn.btn-warning:hover, +.navbar .navbar-nav > li > a.btn.btn-warning:focus, +.navbar .navbar-nav > li > a.btn.btn-warning:active, +.navbar .navbar-nav > li > a.btn.btn-warning.active, +.navbar .navbar-nav > li > a.btn.btn-warning:active:focus, +.navbar .navbar-nav > li > a.btn.btn-warning:active:hover, +.navbar .navbar-nav > li > a.btn.btn-warning.active:focus, +.navbar .navbar-nav > li > a.btn.btn-warning.active:hover, .open > +.navbar .navbar-nav > li > a.btn.btn-warning.dropdown-toggle, .open > +.navbar .navbar-nav > li > a.btn.btn-warning.dropdown-toggle:focus, .open > +.navbar .navbar-nav > li > a.btn.btn-warning.dropdown-toggle:hover { + background-color: #ff9800; + color: #FFFFFF; +} +.btn.btn-warning:focus, .btn.btn-warning:active, .btn.btn-warning:hover, +.navbar .navbar-nav > li > a.btn.btn-warning:focus, +.navbar .navbar-nav > li > a.btn.btn-warning:active, +.navbar .navbar-nav > li > a.btn.btn-warning:hover { + box-shadow: 0 14px 26px -12px rgba(255, 152, 0, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(255, 152, 0, 0.2); +} +.btn.btn-warning.disabled, .btn.btn-warning.disabled:hover, .btn.btn-warning.disabled:focus, .btn.btn-warning.disabled.focus, .btn.btn-warning.disabled:active, .btn.btn-warning.disabled.active, .btn.btn-warning:disabled, .btn.btn-warning:disabled:hover, .btn.btn-warning:disabled:focus, .btn.btn-warning:disabled.focus, .btn.btn-warning:disabled:active, .btn.btn-warning:disabled.active, .btn.btn-warning[disabled], .btn.btn-warning[disabled]:hover, .btn.btn-warning[disabled]:focus, .btn.btn-warning[disabled].focus, .btn.btn-warning[disabled]:active, .btn.btn-warning[disabled].active, fieldset[disabled] .btn.btn-warning, fieldset[disabled] .btn.btn-warning:hover, fieldset[disabled] .btn.btn-warning:focus, fieldset[disabled] .btn.btn-warning.focus, fieldset[disabled] .btn.btn-warning:active, fieldset[disabled] .btn.btn-warning.active, +.navbar .navbar-nav > li > a.btn.btn-warning.disabled, +.navbar .navbar-nav > li > a.btn.btn-warning.disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-warning.disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-warning.disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-warning.disabled:active, +.navbar .navbar-nav > li > a.btn.btn-warning.disabled.active, +.navbar .navbar-nav > li > a.btn.btn-warning:disabled, +.navbar .navbar-nav > li > a.btn.btn-warning:disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-warning:disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-warning:disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-warning:disabled:active, +.navbar .navbar-nav > li > a.btn.btn-warning:disabled.active, +.navbar .navbar-nav > li > a.btn.btn-warning[disabled], +.navbar .navbar-nav > li > a.btn.btn-warning[disabled]:hover, +.navbar .navbar-nav > li > a.btn.btn-warning[disabled]:focus, +.navbar .navbar-nav > li > a.btn.btn-warning[disabled].focus, +.navbar .navbar-nav > li > a.btn.btn-warning[disabled]:active, +.navbar .navbar-nav > li > a.btn.btn-warning[disabled].active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-warning, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-warning:hover, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-warning:focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-warning.focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-warning:active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-warning.active { + box-shadow: none; +} +.btn.btn-warning.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple { + background-color: transparent; + color: #ff9800; + box-shadow: none; +} +.btn.btn-warning.btn-simple:hover, .btn.btn-warning.btn-simple:focus, .btn.btn-warning.btn-simple:active, +.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple:hover, +.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple:focus, +.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple:active { + background-color: transparent; + color: #ff9800; +} +.btn.btn-danger, +.navbar .navbar-nav > li > a.btn.btn-danger { + box-shadow: 0 2px 2px 0 rgba(244, 67, 54, 0.14), 0 3px 1px -2px rgba(244, 67, 54, 0.2), 0 1px 5px 0 rgba(244, 67, 54, 0.12); +} +.btn.btn-danger, .btn.btn-danger:hover, .btn.btn-danger:focus, .btn.btn-danger:active, .btn.btn-danger.active, .btn.btn-danger:active:focus, .btn.btn-danger:active:hover, .btn.btn-danger.active:focus, .btn.btn-danger.active:hover, .open > .btn.btn-danger.dropdown-toggle, .open > .btn.btn-danger.dropdown-toggle:focus, .open > .btn.btn-danger.dropdown-toggle:hover, +.navbar .navbar-nav > li > a.btn.btn-danger, +.navbar .navbar-nav > li > a.btn.btn-danger:hover, +.navbar .navbar-nav > li > a.btn.btn-danger:focus, +.navbar .navbar-nav > li > a.btn.btn-danger:active, +.navbar .navbar-nav > li > a.btn.btn-danger.active, +.navbar .navbar-nav > li > a.btn.btn-danger:active:focus, +.navbar .navbar-nav > li > a.btn.btn-danger:active:hover, +.navbar .navbar-nav > li > a.btn.btn-danger.active:focus, +.navbar .navbar-nav > li > a.btn.btn-danger.active:hover, .open > +.navbar .navbar-nav > li > a.btn.btn-danger.dropdown-toggle, .open > +.navbar .navbar-nav > li > a.btn.btn-danger.dropdown-toggle:focus, .open > +.navbar .navbar-nav > li > a.btn.btn-danger.dropdown-toggle:hover { + background-color: #f44336; + color: #FFFFFF; +} +.btn.btn-danger:focus, .btn.btn-danger:active, .btn.btn-danger:hover, +.navbar .navbar-nav > li > a.btn.btn-danger:focus, +.navbar .navbar-nav > li > a.btn.btn-danger:active, +.navbar .navbar-nav > li > a.btn.btn-danger:hover { + box-shadow: 0 14px 26px -12px rgba(244, 67, 54, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2); +} +.btn.btn-danger.disabled, .btn.btn-danger.disabled:hover, .btn.btn-danger.disabled:focus, .btn.btn-danger.disabled.focus, .btn.btn-danger.disabled:active, .btn.btn-danger.disabled.active, .btn.btn-danger:disabled, .btn.btn-danger:disabled:hover, .btn.btn-danger:disabled:focus, .btn.btn-danger:disabled.focus, .btn.btn-danger:disabled:active, .btn.btn-danger:disabled.active, .btn.btn-danger[disabled], .btn.btn-danger[disabled]:hover, .btn.btn-danger[disabled]:focus, .btn.btn-danger[disabled].focus, .btn.btn-danger[disabled]:active, .btn.btn-danger[disabled].active, fieldset[disabled] .btn.btn-danger, fieldset[disabled] .btn.btn-danger:hover, fieldset[disabled] .btn.btn-danger:focus, fieldset[disabled] .btn.btn-danger.focus, fieldset[disabled] .btn.btn-danger:active, fieldset[disabled] .btn.btn-danger.active, +.navbar .navbar-nav > li > a.btn.btn-danger.disabled, +.navbar .navbar-nav > li > a.btn.btn-danger.disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-danger.disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-danger.disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-danger.disabled:active, +.navbar .navbar-nav > li > a.btn.btn-danger.disabled.active, +.navbar .navbar-nav > li > a.btn.btn-danger:disabled, +.navbar .navbar-nav > li > a.btn.btn-danger:disabled:hover, +.navbar .navbar-nav > li > a.btn.btn-danger:disabled:focus, +.navbar .navbar-nav > li > a.btn.btn-danger:disabled.focus, +.navbar .navbar-nav > li > a.btn.btn-danger:disabled:active, +.navbar .navbar-nav > li > a.btn.btn-danger:disabled.active, +.navbar .navbar-nav > li > a.btn.btn-danger[disabled], +.navbar .navbar-nav > li > a.btn.btn-danger[disabled]:hover, +.navbar .navbar-nav > li > a.btn.btn-danger[disabled]:focus, +.navbar .navbar-nav > li > a.btn.btn-danger[disabled].focus, +.navbar .navbar-nav > li > a.btn.btn-danger[disabled]:active, +.navbar .navbar-nav > li > a.btn.btn-danger[disabled].active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-danger, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-danger:hover, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-danger:focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-danger.focus, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-danger:active, fieldset[disabled] +.navbar .navbar-nav > li > a.btn.btn-danger.active { + box-shadow: none; +} +.btn.btn-danger.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple { + background-color: transparent; + color: #f44336; + box-shadow: none; +} +.btn.btn-danger.btn-simple:hover, .btn.btn-danger.btn-simple:focus, .btn.btn-danger.btn-simple:active, +.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple:hover, +.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple:focus, +.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple:active { + background-color: transparent; + color: #f44336; +} +.btn.btn-white, .btn.btn-white:focus, .btn.btn-white:hover, +.navbar .navbar-nav > li > a.btn.btn-white, +.navbar .navbar-nav > li > a.btn.btn-white:focus, +.navbar .navbar-nav > li > a.btn.btn-white:hover { + background-color: #FFFFFF; + color: #999999; +} +.btn.btn-white.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-white.btn-simple { + color: #FFFFFF; + background: transparent; + box-shadow: none; +} +.btn.btn-facebook, +.navbar .navbar-nav > li > a.btn.btn-facebook { + background-color: #3b5998; + color: #fff; + box-shadow: 0 2px 2px 0 rgba(59, 89, 152, 0.14), 0 3px 1px -2px rgba(59, 89, 152, 0.2), 0 1px 5px 0 rgba(59, 89, 152, 0.12); +} +.btn.btn-facebook:focus, .btn.btn-facebook:active, .btn.btn-facebook:hover, +.navbar .navbar-nav > li > a.btn.btn-facebook:focus, +.navbar .navbar-nav > li > a.btn.btn-facebook:active, +.navbar .navbar-nav > li > a.btn.btn-facebook:hover { + background-color: #3b5998; + color: #fff; + box-shadow: 0 14px 26px -12px rgba(59, 89, 152, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(59, 89, 152, 0.2); +} +.btn.btn-facebook.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-facebook.btn-simple { + color: #3b5998; + background-color: transparent; + box-shadow: none; +} +.btn.btn-twitter, +.navbar .navbar-nav > li > a.btn.btn-twitter { + background-color: #55acee; + color: #fff; + box-shadow: 0 2px 2px 0 rgba(85, 172, 238, 0.14), 0 3px 1px -2px rgba(85, 172, 238, 0.2), 0 1px 5px 0 rgba(85, 172, 238, 0.12); +} +.btn.btn-twitter:focus, .btn.btn-twitter:active, .btn.btn-twitter:hover, +.navbar .navbar-nav > li > a.btn.btn-twitter:focus, +.navbar .navbar-nav > li > a.btn.btn-twitter:active, +.navbar .navbar-nav > li > a.btn.btn-twitter:hover { + background-color: #55acee; + color: #fff; + box-shadow: 0 14px 26px -12px rgba(85, 172, 238, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(85, 172, 238, 0.2); +} +.btn.btn-twitter.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-twitter.btn-simple { + color: #55acee; + background-color: transparent; + box-shadow: none; +} +.btn.btn-pinterest, +.navbar .navbar-nav > li > a.btn.btn-pinterest { + background-color: #cc2127; + color: #fff; + box-shadow: 0 2px 2px 0 rgba(204, 33, 39, 0.14), 0 3px 1px -2px rgba(204, 33, 39, 0.2), 0 1px 5px 0 rgba(204, 33, 39, 0.12); +} +.btn.btn-pinterest:focus, .btn.btn-pinterest:active, .btn.btn-pinterest:hover, +.navbar .navbar-nav > li > a.btn.btn-pinterest:focus, +.navbar .navbar-nav > li > a.btn.btn-pinterest:active, +.navbar .navbar-nav > li > a.btn.btn-pinterest:hover { + background-color: #cc2127; + color: #fff; + box-shadow: 0 14px 26px -12px rgba(204, 33, 39, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(204, 33, 39, 0.2); +} +.btn.btn-pinterest.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-pinterest.btn-simple { + color: #cc2127; + background-color: transparent; + box-shadow: none; +} +.btn.btn-google, +.navbar .navbar-nav > li > a.btn.btn-google { + background-color: #dd4b39; + color: #fff; + box-shadow: 0 2px 2px 0 rgba(221, 75, 57, 0.14), 0 3px 1px -2px rgba(221, 75, 57, 0.2), 0 1px 5px 0 rgba(221, 75, 57, 0.12); +} +.btn.btn-google:focus, .btn.btn-google:active, .btn.btn-google:hover, +.navbar .navbar-nav > li > a.btn.btn-google:focus, +.navbar .navbar-nav > li > a.btn.btn-google:active, +.navbar .navbar-nav > li > a.btn.btn-google:hover { + background-color: #dd4b39; + color: #fff; + box-shadow: 0 14px 26px -12px rgba(221, 75, 57, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(221, 75, 57, 0.2); +} +.btn.btn-google.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-google.btn-simple { + color: #dd4b39; + background-color: transparent; + box-shadow: none; +} +.btn.btn-instagram, +.navbar .navbar-nav > li > a.btn.btn-instagram { + background-color: #125688; + color: #fff; + box-shadow: 0 2px 2px 0 rgba(18, 86, 136, 0.14), 0 3px 1px -2px rgba(18, 86, 136, 0.2), 0 1px 5px 0 rgba(18, 86, 136, 0.12); +} +.btn.btn-instagram:focus, .btn.btn-instagram:active, .btn.btn-instagram:hover, +.navbar .navbar-nav > li > a.btn.btn-instagram:focus, +.navbar .navbar-nav > li > a.btn.btn-instagram:active, +.navbar .navbar-nav > li > a.btn.btn-instagram:hover { + background-color: #125688; + color: #fff; + box-shadow: 0 14px 26px -12px rgba(18, 86, 136, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(18, 86, 136, 0.2); +} +.btn.btn-instagram.btn-simple, +.navbar .navbar-nav > li > a.btn.btn-instagram.btn-simple { + color: #125688; + background-color: transparent; + box-shadow: none; +} +.btn:focus, .btn:active, .btn:active:focus, +.navbar .navbar-nav > li > a.btn:focus, +.navbar .navbar-nav > li > a.btn:active, +.navbar .navbar-nav > li > a.btn:active:focus { + outline: 0; +} +.btn.btn-round, +.navbar .navbar-nav > li > a.btn.btn-round { + border-radius: 30px; +} +.btn:not(.btn-just-icon):not(.btn-fab) .fa, +.navbar .navbar-nav > li > a.btn:not(.btn-just-icon):not(.btn-fab) .fa { + font-size: 18px; + margin-top: -2px; + position: relative; + top: 2px; +} +.btn.btn-fab, +.navbar .navbar-nav > li > a.btn.btn-fab { + border-radius: 50%; + font-size: 24px; + height: 56px; + margin: auto; + min-width: 56px; + width: 56px; + padding: 0; + overflow: hidden; + position: relative; + line-height: normal; +} +.btn.btn-fab .ripple-container, +.navbar .navbar-nav > li > a.btn.btn-fab .ripple-container { + border-radius: 50%; +} +.btn.btn-fab.btn-fab-mini, .btn-group-sm .btn.btn-fab, +.navbar .navbar-nav > li > a.btn.btn-fab.btn-fab-mini, .btn-group-sm +.navbar .navbar-nav > li > a.btn.btn-fab { + height: 40px; + min-width: 40px; + width: 40px; +} +.btn.btn-fab.btn-fab-mini.material-icons, .btn-group-sm .btn.btn-fab.material-icons, +.navbar .navbar-nav > li > a.btn.btn-fab.btn-fab-mini.material-icons, .btn-group-sm +.navbar .navbar-nav > li > a.btn.btn-fab.material-icons { + top: -3.5px; + left: -3.5px; +} +.btn.btn-fab.btn-fab-mini .material-icons, .btn-group-sm .btn.btn-fab .material-icons, +.navbar .navbar-nav > li > a.btn.btn-fab.btn-fab-mini .material-icons, .btn-group-sm +.navbar .navbar-nav > li > a.btn.btn-fab .material-icons { + font-size: 17px; +} +.btn.btn-fab i.material-icons, +.navbar .navbar-nav > li > a.btn.btn-fab i.material-icons { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-12px, -12px); + line-height: 24px; + width: 24px; + font-size: 24px; +} +.btn.btn-lg, .btn-group-lg .btn, +.navbar .navbar-nav > li > a.btn.btn-lg, .btn-group-lg +.navbar .navbar-nav > li > a.btn { + font-size: 14px; + padding: 18px 36px; +} +.btn.btn-sm, .btn-group-sm .btn, +.navbar .navbar-nav > li > a.btn.btn-sm, .btn-group-sm +.navbar .navbar-nav > li > a.btn { + padding: 5px 20px; + font-size: 11px; +} +.btn.btn-xs, .btn-group-xs .btn, +.navbar .navbar-nav > li > a.btn.btn-xs, .btn-group-xs +.navbar .navbar-nav > li > a.btn { + padding: 4px 15px; + font-size: 10px; +} +.btn.btn-just-icon, +.navbar .navbar-nav > li > a.btn.btn-just-icon { + font-size: 20px; + padding: 12px 12px; + line-height: 1em; +} +.btn.btn-just-icon i, +.navbar .navbar-nav > li > a.btn.btn-just-icon i { + width: 20px; +} +.btn.btn-just-icon.btn-lg, +.navbar .navbar-nav > li > a.btn.btn-just-icon.btn-lg { + font-size: 22px; + padding: 13px 18px; +} + +.btn .material-icons { + vertical-align: middle; + font-size: 17px; + top: -1px; + position: relative; +} + +.navbar .navbar-nav > li > a.btn { + margin-top: 2px; + margin-bottom: 2px; +} +.navbar .navbar-nav > li > a.btn.btn-fab { + margin: 5px 2px; +} +.navbar .navbar-nav > li > a:not(.btn) .material-icons { + margin-top: -3px; + top: 0px; + position: relative; + margin-right: 3px; +} +.navbar .navbar-nav > li > .profile-photo { + margin: 5px 2px; +} + +.navbar-default:not(.navbar-transparent) .navbar-nav > li > a.btn.btn-white.btn-simple { + color: #555555; +} + +.btn-group, +.btn-group-vertical { + position: relative; + margin: 10px 1px; +} +.btn-group.open > .dropdown-toggle.btn, .btn-group.open > .dropdown-toggle.btn.btn-default, +.btn-group-vertical.open > .dropdown-toggle.btn, +.btn-group-vertical.open > .dropdown-toggle.btn.btn-default { + background-color: #FFFFFF; +} +.btn-group.open > .dropdown-toggle.btn.btn-inverse, +.btn-group-vertical.open > .dropdown-toggle.btn.btn-inverse { + background-color: #212121; +} +.btn-group.open > .dropdown-toggle.btn.btn-primary, +.btn-group-vertical.open > .dropdown-toggle.btn.btn-primary { + background-color: #9c27b0; +} +.btn-group.open > .dropdown-toggle.btn.btn-success, +.btn-group-vertical.open > .dropdown-toggle.btn.btn-success { + background-color: #4caf50; +} +.btn-group.open > .dropdown-toggle.btn.btn-info, +.btn-group-vertical.open > .dropdown-toggle.btn.btn-info { + background-color: #00bcd4; +} +.btn-group.open > .dropdown-toggle.btn.btn-warning, +.btn-group-vertical.open > .dropdown-toggle.btn.btn-warning { + background-color: #ff9800; +} +.btn-group.open > .dropdown-toggle.btn.btn-danger, +.btn-group-vertical.open > .dropdown-toggle.btn.btn-danger { + background-color: #f44336; +} +.btn-group.open > .dropdown-toggle.btn.btn-rose, +.btn-group-vertical.open > .dropdown-toggle.btn.btn-rose { + background-color: #e91e63; +} +.btn-group .dropdown-menu, +.btn-group-vertical .dropdown-menu { + border-radius: 0 0 3px 3px; +} +.btn-group.btn-group-raised, +.btn-group-vertical.btn-group-raised { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.btn-group .btn + .btn, +.btn-group .btn, +.btn-group .btn:active, +.btn-group .btn-group, +.btn-group-vertical .btn + .btn, +.btn-group-vertical .btn, +.btn-group-vertical .btn:active, +.btn-group-vertical .btn-group { + margin: 0; +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/img/alipay.png ---------------------------------------------------------------------- diff --git a/rocketmq-console/src/main/resources/static/style/img/alipay.png b/rocketmq-console/src/main/resources/static/style/img/alipay.png new file mode 100644 index 0000000..8d72f26 Binary files /dev/null and b/rocketmq-console/src/main/resources/static/style/img/alipay.png differ
