提交 93bc3087 编写于 作者: nengyuangzhang's avatar nengyuangzhang

added command feature to myems-admin

上级 be4287e1
......@@ -7,7 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Added
- added tbl_commands to system database
- added command actions to myems-api
-
- added command feature to myems-admin
### Changed
- updated tranlations of myems-admin
- changed theme of BarChart and MultiTrendChart in myems-web
......
......@@ -380,6 +380,37 @@ app
]
}
})
.state('settings.command', {
url: "/command",
templateUrl: "views/settings/command/command.html",
data: {
pageTitle: 'MENU.SETTINGS.COMMAND'
},
resolve: {
deps: [
'$ocLazyLoad',
function ($ocLazyLoad) {
return $ocLazyLoad.load(['ui.select', 'ui.checkbox', 'toaster']).then(
function () {
return $ocLazyLoad.load([{
files: ['js/plugins/sweetalert/sweetalert.min.js', 'css/plugins/sweetalert/sweetalert.css']
}, {
name: 'oitozero.ngSweetAlert',
files: ['js/plugins/sweetalert/angular-sweetalert.min.js']
}, {
serie: true,
files: [
'app/services/settings/command/command.service.js',
'app/controllers/settings/command/command.master.controller.js',
'app/controllers/settings/command/command.controller.js'
]
}]);
}
);
}
]
}
})
.state('settings.tariff', {
url: "/tariff",
templateUrl: "views/settings/tariff/tariff.html",
......
......@@ -41,7 +41,7 @@ app.controller('EnergyItemController', function(
params:function(){
return {
energyItems:angular.copy($scope.energyItems),
categories:angular.copy($scope.categories)
categories:angular.copy($scope.categories)
};
}
}
......
'use strict';
app.controller('CommandController', function(
$scope,
$window,
$uibModal,
$translate,
CommandService,
toaster,
SweetAlert) {
$scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user"));
$scope.getAllCommands = function() {
CommandService.getAllCommands(function (response) {
if (angular.isDefined(response.status) && response.status === 200) {
$scope.commands = response.data;
} else {
$scope.commands = [];
}
});
};
$scope.addCommand = function() {
var modalInstance = $uibModal.open({
templateUrl: 'views/settings/command/command.model.html',
controller: 'ModalAddCommandCtrl',
windowClass: "animated fadeIn",
});
modalInstance.result.then(function(command) {
let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
CommandService.addCommand(command, headers, function (response) {
if (angular.isDefined(response.status) && response.status === 201) {
toaster.pop({
type: "success",
title: $translate.instant("TOASTER.SUCCESS_TITLE"),
body: $translate.instant("TOASTER.SUCCESS_ADD_BODY", {template: $translate.instant("SETTING.COMMAND")}),
showCloseButton: true,
});
$scope.getAllCommands();
$scope.$emit('handleEmitCommandChanged');
} else {
toaster.pop({
type: "error",
title: $translate.instant("TOASTER.ERROR_ADD_BODY", {template: $translate.instant("SETTING.COMMAND")}),
body: $translate.instant(response.data.description),
showCloseButton: true,
});
}
});
}, function() {
});
};
$scope.editCommand=function(command){
var modalInstance = $uibModal.open({
windowClass: "animated fadeIn",
templateUrl: 'views/settings/command/command.model.html',
controller: 'ModalEditCommandCtrl',
resolve: {
params:function(){
return {
command:angular.copy(command),
commands:angular.copy($scope.commands)
};
}
}
});
modalInstance.result.then(function (modifiedCommand) {
let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
CommandService.editCommand(modifiedCommand, headers, function (response){
if(angular.isDefined(response.status) && response.status === 200){
toaster.pop({
type: "success",
title: $translate.instant("TOASTER.SUCCESS_TITLE"),
body: $translate.instant("TOASTER.SUCCESS_UPDATE_BODY", {template: $translate.instant("SETTING.COMMAND")}),
showCloseButton: true,
});
$scope.getAllCommands();
$scope.$emit('handleEmitCommandChanged');
} else {
toaster.pop({
type: "error",
title: $translate.instant("TOASTER.ERROR_UPDATE_BODY", {template: $translate.instant("SETTING.COMMAND")}),
body: $translate.instant(response.data.description),
showCloseButton: true,
});
}
});
}, function () {
//do nothing;
});
};
$scope.deleteCommand=function(command){
SweetAlert.swal({
title: $translate.instant("SWEET.TITLE"),
text: $translate.instant("SWEET.TEXT"),
type: "warning",
showCancelButton: true,
confirmButtonColor: "#DD6B55",
confirmButtonText: $translate.instant("SWEET.CONFIRM_BUTTON_TEXT"),
cancelButtonText: $translate.instant("SWEET.CANCEL_BUTTON_TEXT"),
closeOnConfirm: true,
closeOnCancel: true
},
function (isConfirm) {
if (isConfirm) {
let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
CommandService.deleteCommand(command, headers, function (response) {
if (angular.isDefined(response.status) && response.status === 204) {
toaster.pop({
type: "success",
title: $translate.instant("TOASTER.SUCCESS_TITLE"),
body: $translate.instant("TOASTER.SUCCESS_DELETE_BODY", {template: $translate.instant("SETTING.COMMAND")}),
showCloseButton: true,
});
$scope.getAllCommands();
$scope.$emit('handleEmitCommandChanged');
} else {
toaster.pop({
type: "error",
title: $translate.instant("TOASTER.ERROR_DELETE_BODY", {template: $translate.instant("SETTING.COMMAND")}),
body: $translate.instant(response.data.description),
showCloseButton: true,
});
}
});
}
});
};
$scope.sendCommand = function (command) {
let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
CommandService.sendCommand(command, headers, function (response) {
if (angular.isDefined(response.status) && response.status === 200) {
toaster.pop({
type: "success",
title: $translate.instant('TOASTER.SUCCESS_TITLE'),
body: $translate.instant('COMMAND.SEND_SUCCESS'),
showCloseButton: true,
});
$scope.getAllCommands();
} else {
toaster.pop({
type: "error",
title: $translate.instant(response.data.title),
body: $translate.instant(response.data.description),
showCloseButton: true,
});
}
});
};
$scope.getAllCommands();
});
app.controller('ModalAddCommandCtrl', function ($scope, $uibModalInstance) {
$scope.operation="SETTING.ADD_COMMAND";
$scope.ok = function () {
$uibModalInstance.close($scope.command);
};
$scope.cancel = function () {
$uibModalInstance.dismiss('cancel');
};
});
app.controller('ModalEditCommandCtrl', function ($scope, $uibModalInstance, params) {
$scope.operation="SETTING.EDIT_COMMAND";
$scope.command = params.command;
$scope.commands=params.commands;
$scope.ok = function() {
$uibModalInstance.close($scope.command);
};
$scope.cancel = function() {
$uibModalInstance.dismiss('cancel');
};
});
'use strict';
app.controller('CommandMasterController', function($scope) {
$scope.$on('handleEmitCommandChanged', function(event) {
$scope.$broadcast('handleBroadcastCommandChanged');
});
});
\ No newline at end of file
......@@ -3,8 +3,8 @@
app.controller('CostCenterController', function(
$scope,
$window,
$translate,
$uibModal,
$translate,
CostCenterService,
toaster,
SweetAlert) {
......@@ -102,7 +102,8 @@ app.controller('CostCenterController', function(
confirmButtonText: $translate.instant("SWEET.CONFIRM_BUTTON_TEXT"),
cancelButtonText: $translate.instant("SWEET.CANCEL_BUTTON_TEXT"),
closeOnConfirm: true,
closeOnCancel: true },
closeOnCancel: true
},
function (isConfirm) {
if (isConfirm) {
let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
......@@ -134,7 +135,6 @@ app.controller('CostCenterController', function(
});
app.controller('ModalAddCostCenterCtrl', function ($scope, $uibModalInstance) {
$scope.operation="SETTING.ADD_COSTCENTER";
$scope.ok = function () {
$uibModalInstance.close($scope.costcenter);
......@@ -150,11 +150,11 @@ app.controller('ModalEditCostCenterCtrl', function ($scope, $uibModalInstance, p
$scope.costcenter = params.costcenter;
$scope.costcenters=params.costcenters;
$scope.ok = function () {
$scope.ok = function() {
$uibModalInstance.close($scope.costcenter);
};
$scope.cancel = function () {
$scope.cancel = function() {
$uibModalInstance.dismiss('cancel');
};
});
'use strict';
app.factory('CommandService', function($http) {
return {
getAllCommands:function(callback){
$http.get(getAPI()+'commands')
.then(function (response) {
callback(response);
}, function (response) {
callback(response);
});
},
searchCommands: function(query, callback) {
$http.get(getAPI()+'commands', { params: { q: query } })
.then(function (response) {
callback(response);
}, function (response) {
callback(response);
});
},
addCommand: function(command, headers, callback) {
$http.post(getAPI()+'commands',{data:command}, {headers})
.then(function (response) {
callback(response);
}, function (response) {
callback(response);
});
},
editCommand: function(command, headers, callback) {
$http.put(getAPI()+'commands/'+command.id,{data:command}, {headers})
.then(function (response) {
callback(response);
}, function (response) {
callback(response);
});
},
deleteCommand: function(command, headers, callback) {
$http.delete(getAPI()+'commands/'+command.id, {headers})
.then(function (response) {
callback(response);
}, function (response) {
callback(response);
});
},
getCommand: function(id, callback) {
$http.get(getAPI()+'commands/'+id)
.then(function (response) {
callback(response);
}, function (response) {
callback(response);
});
},
sendCommand: function(command, headers, callback) {
$http.put(getAPI()+'commands/'+command.id+'/send',{data:command}, {headers})
.then(function (response) {
callback(response);
}, function (response) {
callback(response);
});
},
};
});
\ No newline at end of file
......@@ -35,6 +35,7 @@ function config($translateProvider) {
QR_CODE: 'QR Code',
WORKING_CALENDAR: 'Working Calendar',
NON_WORKING_DAY: 'Non Working Day',
COMMAND: 'Command',
},
FDD: {
ID: 'ID',
......@@ -96,6 +97,7 @@ function config($translateProvider) {
CATEGORY: 'Energy Categories',
TARIFF: 'Tariffs',
COSTCENTER: 'Cost Centers',
COMMAND: 'Commands',
CONTACT: 'Contacts',
GATEWAY: 'Gateways',
DATASOURCE: 'Data Sources',
......@@ -177,6 +179,7 @@ function config($translateProvider) {
ADD_WORKING_CALENDAR: 'Add Working Calendar',
ADD_NON_WORKING_DAY: 'Add Non Working Day',
ADD_MICROGRID: 'Add Microgrid',
ADD_COMMAND: 'Add Command',
EDIT_SPACE: 'Edit Space',
EDIT_TENANT: 'Edit Tenant',
......@@ -193,6 +196,7 @@ function config($translateProvider) {
EDIT_WORKING_CALENDAR: 'Edit Working Calendar',
EDIT_NON_WORKING_DAY: 'Edit Non Working Day',
EDIT_MICROGRID: 'Edit Microgrid',
EDIT_COMMAND: 'Edit Command',
REQUIRES_AUTHENTICATION: 'Requires Authentication',
SELECT_DATE: 'Please Select Date',
......@@ -307,6 +311,8 @@ function config($translateProvider) {
WORKING_CALENDAR: 'Working Calendar',
NON_WORKING_DAY: 'Non Working Day',
COMMAND: 'Command',
},
CONTACT: {
EMAIL: 'Email',
......@@ -321,6 +327,18 @@ function config($translateProvider) {
EXTERNAL_ID: 'External ID',
INPUT_EXTERNAL_ID: 'Please Input External ID',
},
COMMAND: {
TOPIC: 'Topic',
PAYLOAD: 'Payload',
SET_VALUE: 'Set Value',
DESCRIPTION: 'Description',
INPUT_TOPIC: 'Please Input Topic',
INPUT_PAYLOAD: 'Please Input Payload',
INPUT_SET_VALUE: 'Please Input Set Value',
INPUT_DESCRIPTION: 'Please Input Description',
SEND: 'Send',
SEND_SUCCESS: 'Send Success',
},
ENERGY_FLOW_DIAGRAM: {
ADD_ENERGY_FLOW_DIAGRAM: 'Add Energy Flow Diagram',
EDIT_ENERGY_FLOW_DIAGRAM: 'Eidt Energy Flow Diagram',
......@@ -1194,6 +1212,7 @@ function config($translateProvider) {
QR_CODE: "二维码",
WORKING_CALENDAR: '工作日历',
NON_WORKING_DAY: '非工作日',
COMMAND: '命令',
},
FDD: {
ID: 'ID',
......@@ -1255,6 +1274,7 @@ function config($translateProvider) {
CATEGORY: '能源分类',
TARIFF: '能源费率',
COSTCENTER: '成本中心',
COMMAND: '命令',
CONTACT: '联系人',
GATEWAY: '网关',
DATASOURCE: '数据源',
......@@ -1336,12 +1356,12 @@ function config($translateProvider) {
ADD_WORKING_CALENDAR: '新增工作日历',
ADD_NON_WORKING_DAY: '新增非工作日',
ADD_MICROGRID: '新增微电网',
ADD_COMMAND: '添加命令',
EDIT_SPACE: '编辑空间',
EDIT_TENANT: '编辑租户',
EDIT_STORE: '编辑门店',
EDIT_METER: '编辑计量表',
EDIT_MICROGRID: '编辑微电网',
EDIT_VIRTUAL_METER: '编辑虚拟表',
EDIT_OFFLINE_METER: '编辑离线表',
EDIT_POINT: '编辑数据点',
......@@ -1353,6 +1373,8 @@ function config($translateProvider) {
EDIT_EMAIL_SERVER: '编辑邮箱服务器',
EDIT_WORKING_CALENDAR: '编辑工作日历',
EDIT_NON_WORKING_DAY: '编辑非工作日',
EDIT_MICROGRID: '编辑微电网',
EDIT_COMMAND: '编辑命令',
REQUIRES_AUTHENTICATION: '需要身份验证',
SELECT_DATE: '请选择日期',
......@@ -1470,6 +1492,8 @@ function config($translateProvider) {
WORKING_CALENDAR: '工作日历',
NON_WORKING_DAY: '非工作日',
COMMAND: '命令',
},
CONTACT: {
EMAIL: '邮箱',
......@@ -1484,6 +1508,18 @@ function config($translateProvider) {
EXTERNAL_ID: '外部ID',
INPUT_EXTERNAL_ID: '请输入外部ID',
},
COMMAND: {
TOPIC: '主题',
PAYLOAD: '载荷',
SET_VALUE: '设定值',
DESCRIPTION: '描述',
INPUT_TOPIC: '请输入主题',
INPUT_PAYLOAD: '请输入载荷',
INPUT_SET_VALUE: '请输入设定值',
INPUT_DESCRIPTION: '请输入描述',
SEND: '发送',
SEND_SUCCESS: '发送成功',
},
GATEWAY: {
GATEWAY: '网关',
TOKEN: '令牌',
......@@ -2357,6 +2393,7 @@ function config($translateProvider) {
QR_CODE: 'QR Code',
WORKING_CALENDAR: 'Arbeitskalender',
NON_WORKING_DAY: 'Arbeitsfreie Tage',
COMMAND: 'Befehl',
},
FDD: {
ID: 'ID',
......@@ -2418,6 +2455,7 @@ function config($translateProvider) {
CATEGORY: 'Energiekategorien',
TARIFF: 'Energietarife',
COSTCENTER: 'Kostenstellen',
COMMAND: 'Befehle',
CONTACT: 'Kontakte',
GATEWAY: 'Gateways',
DATASOURCE: 'Datenquellen',
......@@ -2499,6 +2537,7 @@ function config($translateProvider) {
ADD_WORKING_CALENDAR: 'Hinzufügen eines neuen Arbeitskalenders',
ADD_NON_WORKING_DAY: 'Arbeitsfreie Tage hinzugefügt',
ADD_MICROGRID: 'Add Microgrid',
ADD_COMMAND: 'Befehl hinzufügen',
EDIT_SPACE: 'Leerzeichen bearbeiten',
EDIT_TENANT: 'Mieter bearbeiten',
......@@ -2515,6 +2554,8 @@ function config($translateProvider) {
EDIT_EMAIL_SERVER: 'Postfachserver bearbeiten',
EDIT_WORKING_CALENDAR: 'Bearbeiten des Arbeitskalenders',
EDIT_NON_WORKING_DAY: 'Arbeitsfreie Tage bearbeiten',
EDIT_MICROGRID: 'Mikronetz bearbeiten',
EDIT_COMMAND: 'Befehl bearbeiten',
REQUIRES_AUTHENTICATION: 'Authentifizierung erforderlich',
SELECT_DATE: 'Bitte wählen Sie ein Datum',
......@@ -2631,6 +2672,8 @@ function config($translateProvider) {
WORKING_CALENDAR: 'Working Calendar',
NON_WORKING_DAY: 'Non Working Day',
COMMAND: 'Befehl',
},
CONTACT: {
EMAIL: 'Briefkasten',
......@@ -2641,6 +2684,18 @@ function config($translateProvider) {
INPUT_DESCRIPTION: 'Bitte geben Sie eine Beschreibung ein',
INVALID_EMAIL: 'Falsches E-Mail-Format (xxx@xxx.xx)',
},
COMMAND: {
TOPIC: 'Thema',
PAYLOAD: 'Nutzlast',
SET_VALUE: 'Sollwert',
DESCRIPTION: 'Beschreibung',
INPUT_TOPIC: 'Bitte geben Sie Thema ein',
INPUT_PAYLOAD: 'Bitte Nutzlast eingeben',
INPUT_SET_VALUE: 'Bitte geben Sie den eingestellten Wert ein',
INPUT_DESCRIPTION: 'Bitte geben Sie eine Beschreibung ein',
SEND: 'Senden',
SEND_SUCCESS: 'Erfolg senden',
},
COSTCENTER: {
EXTERNAL_ID: 'Externe ID',
INPUT_EXTERNAL_ID: 'Bitte geben Sie eine externe ID ein',
......
......@@ -31,6 +31,7 @@
<li ui-sref-active="active"><a ui-sref="settings.energyflowdiagram">{{ 'MENU.SETTINGS.ENERGY_FLOW_DIAGRAM' | translate }}</a></li>
<li ui-sref-active="active"><a ui-sref="settings.distributionsystem">{{ 'MENU.SETTINGS.DISTRIBUTION_SYSTEM' | translate }}</a></li>
<li ui-sref-active="active"><a ui-sref="settings.microgrid">{{ 'MENU.SETTINGS.MICROGRID' | translate }}</a></li>
<li ui-sref-active="active"><a ui-sref="settings.command">{{ 'MENU.SETTINGS.COMMAND' | translate }}</a></li>
<li ui-sref-active="active"><a ui-sref="settings.menu">{{ 'MENU.SETTINGS.MENU' | translate }}</a></li>
<li ui-sref-active="active"><a ui-sref="settings.emailserver">{{ 'MENU.SETTINGS.EMAIL_SERVER' | translate }}</a></li>
<li ui-sref-active="active"><a ui-sref="settings.knowledgefile">{{ 'MENU.SETTINGS.KNOWLEDGEFILE' | translate }}</a></li>
......
<div class="wrapper wrapper-content" ng-controller="CommandMasterController">
<div class="row">
<div class="col-lg-12">
<div class="tabs-container">
<uib-tabset>
<uib-tab heading="{{'SETTING.COMMAND' | translate}}">
<div class="panel-body" ng-controller="CommandController">
<a ng-click="addCommand()" class="btn btn-primary btn-rounded btn-outline" href="">
<i class="fa fa-plus-circle"></i> {{'SETTING.ADD_COMMAND' | translate}}</a>
<table class="table table-bordered table-hover" >
<thead>
<tr>
<th class="text-center">{{'SETTING.ID' | translate}}</th>
<th class="text-center">{{'SETTING.NAME' | translate}}</th>
<th class="text-center">{{'COMMAND.TOPIC' | translate}}</th>
<th class="text-center">{{'COMMAND.PAYLOAD' | translate}}</th>
<th class="text-center">{{'COMMAND.SET_VALUE' | translate}}</th>
<th class="text-center">{{'COMMAND.DESCRIPTION' | translate}}</th>
<th class="text-center">{{'SETTING.ACTION' | translate}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="command in commands">
<td class="text-center">{{ command.id }}</td>
<td class="text-center">{{ command.name }}</td>
<td class="text-center">{{ command.topic }}</td>
<td class="text-center">{{ command.payload }}</td>
<td class="text-center">{{ command.set_value }}</td>
<td class="text-center">{{ command.description }}</td>
<td class="text-center">
<a ng-click="editCommand(command)"
class="btn btn-primary btn-rounded btn-xs">{{'SETTING.EDIT' | translate}}</a>
<a ng-click="deleteCommand(command)"
class="btn btn-danger btn-rounded btn-xs">{{'SETTING.DELETE' | translate}}</a>
<a ng-click="sendCommand(command)"
class="btn btn-danger btn-rounded btn-xs">{{'COMMAND.SEND' | translate}}</a>
</td>
</tr>
</tbody>
</table>
</div>
</uib-tab>
</uib-tabset>
</div>
</div>
</div>
</div>
\ No newline at end of file
<div class="inmodal">
<div class="modal-header">
<h4 class="modal-title">{{operation | translate}}(ID:{{command.id}})</h4>
</div>
<div class="modal-body">
<form role="form" name="form_command" novalidate class="form-horizontal">
<div class="form-group"><label class="col-sm-3 control-label">{{'SETTING.NAME' | translate}}</label>
<div class="col-sm-9"><input ng-model="command.name" type="text" name="commandname" class="form-control" required="">
<div class="m-t-xs" ng-show="form_command.commandname.$invalid && form_command.commandname.$dirty">
<small class="text-danger" ng-show="form_command.commandname.$error.required">{{'SETTING.INPUT_NAME' | translate}}</small>
</div>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-3 control-label">{{'COMMAND.TOPIC' | translate}}</label>
<div class="col-sm-9"><input ng-model="command.topic" type="text" name="commandtopic" class="form-control">
</div>
</div>
<div class="form-group"><label class="col-sm-3 control-label">{{'COMMAND.PAYLOAD' | translate}}</label>
<div class="col-sm-9"><textarea rows="3" ng-model="command.payload" type="text" name="commandpayload" class="form-control" required=""></textarea>
<div class="m-t-xs" ng-show="form_command.commandpayload.$invalid && form_command.commandpayload.$dirty">
<small class="text-danger" ng-show="form_command.commandpayload.$error.required">{{'COMMAND.INPUT_PAYLOAD' | translate}}</small>
</div>
</div>
</div>
<div class="form-group"><label class="col-sm-3 control-label">{{'COMMAND.SET_VALUE' | translate}} ({{'SETTING.OPTIONAL' | translate}})</label>
<div class="col-sm-9"><input ng-model="command.set_value" type="number" name="commandset_value" class="form-control" >
<div class="m-t-xs" ng-show="form_command.commandset_value.$invalid && form_command.commandset_value.$dirty">
<small class="text-danger" ng-show="form_command.commandset_value.$error.required">{{'COMMAND.INPUT_SET_VALUE' | translate}}</small>
</div>
</div>
</div>
<div class="form-group"><label class="col-sm-3 control-label">{{'COMMAND.DESCRIPTION' | translate}} ({{'SETTING.OPTIONAL' | translate}})</label>
<div class="col-sm-9">
<input ng-model="command.description" type="text" name="commanddescription" class="form-control">
<div class="m-t-xs" ng-show="form_command.commanddescription.$invalid && form_command.commanddescription.$dirty">
<small class="text-danger" ng-show="form_command.commanddescription.$error.required">{{'COMMAND.INPUT_DESCRIPTION' | translate}}</small>
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-white" ng-click="cancel()">{{'SETTING.CANCEL' | translate}}</button>
<button type="button" ng-disabled="form_command.$invalid" class="btn btn-primary" ng-click="ok()">{{'SETTING.SAVE' | translate}}</button>
</div>
</div>
......@@ -6,7 +6,8 @@
<uib-tabset>
<uib-tab heading="{{'SETTING.COSTCENTER' | translate}}">
<div class="panel-body" ng-controller="CostCenterController">
<a ng-click="addCostCenter()" class="btn btn-primary btn-rounded btn-outline" href=""><i class="fa fa-plus-circle"></i> {{'SETTING.ADD_COSTCENTER' | translate}}</a>
<a ng-click="addCostCenter()" class="btn btn-primary btn-rounded btn-outline" href="">
<i class="fa fa-plus-circle"></i> {{'SETTING.ADD_COSTCENTER' | translate}}</a>
<table class="table table-bordered table-hover" >
<thead>
<tr>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册