http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afb89794/eagle-webservice/src/main/webapp/app/public/css/main.css ---------------------------------------------------------------------- diff --git a/eagle-webservice/src/main/webapp/app/public/css/main.css b/eagle-webservice/src/main/webapp/app/public/css/main.css deleted file mode 100644 index a7eba4b..0000000 --- a/eagle-webservice/src/main/webapp/app/public/css/main.css +++ /dev/null @@ -1,805 +0,0 @@ -@CHARSET "UTF-8"; -/* - * 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. - */ - -/* Frame */ -body.no-sidebar .content-wrapper { - margin-left: 0; - - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -body.no-sidebar .main-footer { - margin-left: 0; -} - -/* Navigation */ -.navbar-nav > .user-menu > .dropdown-menu > li.user-header .img-circle { - display: inline-block; - border: 3px solid; - border-color: rgba(255,255,255,0.2); - width: 90px; - height: 90px; - margin-top: 10px; -} - -.navbar-nav > .user-menu > .dropdown-menu > li.user-header .fa { - font-size: 60px; - color: rgba(255,255,255,0.8); - margin-top: 10px; -} - - /* Common */ -a { - cursor: pointer; -} - -/* Table */ -.table.table-sm>tbody>tr>td, -.table.table-sm>tbody>tr>th, -.table.table-sm>tfoot>tr>td, -.table.table-sm>tfoot>tr>th, -.table.table-sm>thead>tr>td, -.table.table-sm>thead>tr>th{ - padding: 3px 8px; -} - -.table thead th .fa.fa-sort, -.table thead th .fa.fa-sort-asc, -.table thead th .fa.fa-sort-desc { - margin-top: 5px; - opacity: 0.3; - float: right; -} -.table thead th:hover .fa.fa-sort, -.table thead th:hover .fa.fa-sort-asc, -.table thead th:hover .fa.fa-sort-desc { - opacity: 0.8; -} - -.table tr th, -.table tr td { - -webkit-transition: background .5s linear; - -o-transition: background .5s linear; - transition: background .5s linear; -} - -.sortTable-cntr .pagination { - margin-top: 0; -} - -.table th.input-field, -.table td.input-field { - padding: 0; - vertical-align: middle; -} - -.table th.input-field > input, -.table td.input-field > input, -.table th.input-field > select, -.table td.input-field > select { - border: none; - transition: border-color 0s; -} - -.table th.input-field > input:focus, -.table td.input-field > input:focus, -.table th.input-field > select:focus, -.table td.input-field > select:focus { - box-shadow: inset 1px 1px 0px #3c8dbc, inset -1px -1px 0px #3c8dbc; -} - -.table th.input-field > input.has-warning, -.table td.input-field > input.has-warning { - box-shadow: inset 1px 1px 0px #f39c12, inset -1px -1px 0px #f39c12; -} - -/* Box */ -.small-box > a.inner { - color: #FFF; - display: block; -} - -.small-box > a.inner h3 { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - font-size: 32px; -} - -.info-box.bg-gray, -.info-box a { - color: #FFFFFF; -} -.info-box a:hover { - color: #FFFFFF; - text-decoration: underline; -} - -.info-box-content a.config { - color: rgba(255,255,255,0.8); -} -.info-box-content a.config:hover { - color: #FFFFFF; -} - -.info-box-content.box-clickable { - box-shadow: 0 0 3px; -} -.box-clickable { - cursor: pointer; -} - -.info-box-content .info-box-text.text-large { - font-size: 26px; - margin: 5px 0 10px 0; -} - -/* inline group */ -.inline-group dl, -.inline-group dl dt, -.inline-group dl dd { - display: inline-block; -} - -.inline-group dl { - margin-right: 35px; -} -.inline-group dl dt { - margin-right: 20px; -} - -.inline-group.form-inline { - margin-top: 5px; -} -.inline-group dl { - margin-right: 25px; -} -.inline-group dl dt { - margin-right: 5px; -} - -/* Search box */ -.search-box { - position: relative; - margin-bottom: 15px; -} -.search-box input[type="search"] { - padding-left: 26px; -} -.search-box .fa.fa-search { - position: absolute; - top: 8px; - left: 8px; - z-index: 2; - pointer-events: none; - color: #999; -} - -/* Navigation Tab */ -ul.nav.nav-tabs li .btn { - margin-top: 1px; -} - -.modal-body ul.nav.nav-tabs { - border-bottom-color: #F4F4F4; - margin-bottom: 15px; -} - -.modal-body ul.nav.nav-tabs li { - border-top: 3px solid #FFFFFF; - margin-right: 3px; -} -.modal-body ul.nav.nav-tabs li.active { - border-top-color: #3c8dbc; -} - -.modal-body ul.nav.nav-tabs li > a, -.modal-body ul.nav.nav-tabs li > a:active, -.modal-body ul.nav.nav-tabs li > a:hover { - border: none; - border-radius: 0; - margin: 0; - padding: 6px 15px 8px 15px; - color: #444; -} -.modal-body ul.nav.nav-tabs li:not(.active) > a:hover { - background: rgba(0,0,0,0); - color: #999; -} -.modal-body ul.nav.nav-tabs li.active > a { - border-left: 1px solid #F4F4F4; - border-right: 1px solid #F4F4F4; -} - -/* Step Navigation */ -.step-cntr .step { - background: #3c8dbc; - margin: 0 0 20px 0; - color: #FFF; - height: 60px; - border-radius: 3px; - box-shadow: 0 1px 1px rgba(0,0,0,0.1); - display: block; - - -webkit-transition: background .15s linear; - -o-transition: background .15s linear; - transition: background .15s linear; -} -.step-cntr .step.active { - background: #f39c12; -} - -.step-cntr .step h1, -.step-cntr .step h2, -.step-cntr .step p { - margin: 0; - padding: 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} - -.step-cntr .step h1 { - display: inline-block; - font-size: 30px; - float: left; - border-right: 2px solid rgba(255,255,255,0.2); - width: 60px; - height: 60px; - text-align: center; - padding-top: 12px; - margin-right: 10px; -} -.step-cntr .step h2 { - font-size: 18px; - padding: 8px 0 5px 0; -} - -/* Panel */ -.panel-group.panel-group-sm .panel .panel-heading { - padding: 5px 6px 5px 10px; -} -.panel-group.panel-group-sm .panel .panel-heading h4 { - font-size: 14px; -} -.panel-group.panel-group-sm .panel .panel-heading h4 a { - display: block; -} -.panel-group.panel-group-sm .panel .panel-heading .pull-right { - padding-left: 5px; - padding-right: 5px; - border-radius: 3px; -} - -/* Drop Down */ -.dropdown-menu > li.danger > a { - color: #dd4b39; -} -.dropdown-menu > li.danger > a:hover { - color: #FFFFFF; - background: #dd4b39; -} - -/* Drop Down */ -.dropdown-menu.left { - right: 0; - left: auto; -} - -.dropdown-submenu{position:relative;} -.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} -.dropdown-submenu:hover>.dropdown-menu{display:block;} -.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;} -.dropdown-submenu:hover>a:after{border-left-color:#ffffff;} -.dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} - -/* Input Group */ -.input-group .input-group-btn select { - width: auto; -} - -/* Form group */ -.form-group .checkbox { - display: inline; - margin-right: 10px; -} - -.form-group select.has-warning, -.form-group input.has-warning { - border-color: #f39c12; - box-shadow: none; -} - -.checkbox.noMargin { - margin-top: 0; - margin-bottom: 5px; -} - -/* UL */ -ul.path { - margin-left: 0; -} - -ul.path li { - padding: 0; - margin-right: 5px; -} -ul.path li a { - color: #FFFFFF; -} - -ul.tree { - padding: 0 0 0 5px; -} - -ul.tree > li, -ul.tree > li > ul > li { - list-style-type: none; -} - -ul.tree .tree-item .hover { - display: none; -} -ul.tree .tree-item:hover .hover { - display: inline-block; -} - -ul.tree > li > ul { - padding: 0 0 0 25px; -} - -ul.tree > li > ul > li.active { - background: #F4F4F4; -} - -ul.tree.tree-bordered { - border: 1px solid #f4f4f4; -} -ul.tree.tree-bordered, -ul.tree.tree-bordered > li > ul { - padding: 0; -} -ul.tree.tree-bordered > li:not(:last-child) { - border-bottom: 1px solid #f4f4f4; -} -ul.tree.tree-bordered > li > ul > li { - border-top: 1px solid #f4f4f4; -} -ul.tree.tree-bordered > li > span, -ul.tree.tree-bordered > li > a { - display: block; - padding: 8px; -} -ul.tree.tree-bordered > li > ul > li > span, -ul.tree.tree-bordered > li > ul > li > a { - display: block; - padding: 8px 8px 8px 30px; -} - -.product-list-in-box > .item { - -webkit-transition: background .5s linear; - -o-transition: background .5s linear; - transition: background .5s linear; -} -.product-list-in-box > .item.ng-animate { - transition: 0s; -} -.product-list-in-box > .item.active { - background: #F5FAFC; - -webkit-transition: none; - -o-transition: none; - transition: none; -} - -.nav.fixed-height, -.products-list.fixed-height { - height: 402px; - overflow-y: auto; -} - -.products-list .product-operation { - float: left; - border: 1px solid #9EC8E0; - border-radius: 5px; - overflow: hidden; -} - -.products-list .product-operation .fa { - display: block; - padding: 4px 16px; - color: #3c8dbc; -} -.products-list .product-operation a.fa:hover { - color: #FFFFFF; - background: #337ab7; -} - -.products-list .product-operation.single .fa { - padding: 12px 12px; - font-size: 20px; -} - -.products-list .item .product-info a.fa.fa-times { - display: none; -} -.products-list .item:hover .product-info a.fa.fa-times { - display: block; -} - -/* Label */ -.label.label-default { - color: #FFFFFF; -} - -.label.label-sm { - padding: .0em .4em .1em; -} - -/* Row */ -.row.narrow { - margin-left: -5px; - margin-right: -5px; - margin-bottom: -10px; -} - -.row.narrow>.col-xs-1, .row.narrow>.col-sm-1, .row.narrow>.col-md-1, .row.narrow>.col-lg-1, .row.narrow>.col-xs-2, .row.narrow>.col-sm-2, .row.narrow>.col-md-2, .row.narrow>.col-lg-2, .row.narrow>.col-xs-3, .row.narrow>.col-sm-3, .row.narrow>.col-md-3, .row.narrow>.col-lg-3, .row.narrow>.col-xs-4, .row.narrow>.col-sm-4, .row.narrow>.col-md-4, .row.narrow>.col-lg-4, .row.narrow>.col-xs-5, .row.narrow>.col-sm-5, .row.narrow>.col-md-5, .row.narrow>.col-lg-5, .row.narrow>.col-xs-6, .row.narrow>.col-sm-6, .row.narrow>.col-md-6, .row.narrow>.col-lg-6, .row.narrow>.col-xs-7, .row.narrow>.col-sm-7, .row.narrow>.col-md-7, .row.narrow>.col-lg-7, .row.narrow>.col-xs-8, .row.narrow>.col-sm-8, .row.narrow>.col-md-8, .row.narrow>.col-lg-8, .row.narrow>.col-xs-9, .row.narrow>.col-sm-9, .row.narrow>.col-md-9, .row.narrow>.col-lg-9, .row.narrow>.col-xs-10, .row.narrow>.col-sm-10, .row.narrow>.col-md-10, .row.narrow>.col-lg-10, .row.narrow>.col-xs-11, .row.narrow>.col-sm-11, .row.narrow>.col-md-11, . row.narrow>.col-lg-11, .row.narrow>.col-xs-12, .row.narrow>.col-sm-12, .row.narrow>.col-md-12, .row.narrow>.col-lg-12 { - padding-left: 5px; - padding-right: 5px; -} - -.row.narrow > [class^="col-"], -.row.narrow > [class*=" col-"] { - margin-bottom: 10px; -} - -/* Chart */ -.sortable-mock-element .nvd3-chart-wrapper { - background: #FFFFFF; - opacity: 0.8; -} - -.sortable-enter .nvd3-chart-wrapper { - border-color: #3c8dbc; - pointer-events: none; -} -.sortable-enter .nvd3-chart-wrapper .nvtooltip { - display: none; -} - -.nvd3-chart-wrapper { - position: relative; - border: 1px solid rgba(0,0,0,0.1); -} -.nvd3-chart-wrapper:hover { - //border-color: #F4F4F4; -} - -.nvd3-chart-wrapper .nvd3-chart-config { - position: absolute; - top: 1px; - right: 1px; - display: none; - border-radius: 0; - padding: 0 5px; - background: rgba(0,0,0,0.7); -} -.nvd3-chart-wrapper:hover .nvd3-chart-config { - display: block; -} - -.nvd3-chart-wrapper .nvd3-chart-config a { - color: rgba(255,255,255, 0.9); - padding: 5px 2px 4px 2px; - font-size: 16px; -} -.nvd3-chart-wrapper .nvd3-chart-config a:hover { - color: #FFFFFF; -} - -.nvd3-chart-cntr { - padding: 5px; -} - -.nvd3-chart-cntr > h3 { - text-align: center; - font-size: 16px; - font-weight: bolder; - margin: 0; - padding: 5px 0; - - overflow:hidden; - text-overflow:ellipsis; - -} - -.nvd3-chart-cntr > svg.nvd3-svg { - height: 200px; -} - -.nvd3-chart-cntr.lg > svg.nvd3-svg { - height: 400px; -} - -/* Tab */ -body .tab-content>.tab-pane { - display: block; - height: 0px; - overflow: hidden; - position: relative; -} -body .tab-content>.tab-pane.active { - height: auto; - overflow-x: visible; - overflow-y: visible; -} - -body .modal-body .nav-pills > li > a, -body .box-body .nav-pills > li > a { - padding: 5px 15px; - border: none; -} - -body .modal-body .nav-stacked > li { - border-bottom: 1px solid #f4f4f4; - margin: 0; -} -body .modal-body .nav-stacked > li:last-child { - border-bottom: none; -} - -body .box-body .nav-tabs-custom { - box-shadow: none; - margin-bottom: 0; -} -body .box-body .nav-tabs-custom > .nav-tabs > li:first-of-type.active > a { - border-left-color: #f4f4f4; -} -body .box-body .nav-tabs-custom > .nav-tabs > li > a { - padding: 8px 15px; -} -body .box-body .nav-tabs-custom > .tab-content { - padding: 10px 0; -} - -/* Box */ -.box .guideline { - margin-top: 0; -} - -.box.inner-box { - border: none; - box-shadow: none; - padding: 5px 10px; - margin: 0; - border-bottom: 1px solid #f4f4f4; - position: relative; - border-radius: 0; -} - -.box.inner-box .box-title { - margin: 0 5px 5px 0; - padding: 0; - font-size: 16px; - font-weight: bolder; - display: inline-block; - word-break: break-all; -} - -.box.inner-box .box-tools { - position: absolute; - top: 0; - right: 0; -} - -.box.inner-box:last-child { - border-bottom: none; -} - -/* Navigation Tab */ -.nav-tabs-custom { - position: relative; -} - -.nav-tabs-custom .box-tools { - position: absolute; - right: 15px; - top: 8px; -} - -.nav-tabs-custom .box-tools .strong { - font-weight: bolder; -} - -/* Customize */ -#content { - position: relative; -} - -.page-fixed { - position: absolute; - top: -45px; - right: 0; -} - -@media (max-width:991px) { - .page-fixed { - top: -70px; - } -} - -.fixed-right { - position: absolute; - right: 0; - z-index: 3; -} - -.main-header .logo img { - height: 34px; -} - -.main-header .navbar-toggle { - float: none; - border-radius: 0; -} -.main-header .navbar-toggle:hover { - background: rgba(0, 0, 0, 0.1); -} - -#moduleMenu > ul > li.active > a { - border-top: 3px solid rgba(255,255,255,0.8); - padding-top: 12px; -} - -@media (max-width: 767px) { - #moduleMenu > ul > li.active > a { - padding: 10px 15px; - border-top: none; - border-left: 3px solid rgba(255,255,255,0.8); - } - - .main-header .navbar .navbar-custom-menu .nav .dropdown-menu li a { - color: #333; - } - .main-header .navbar .navbar-custom-menu .nav .dropdown-menu li a:hover { - color: #FFF; - } -} - -#timeRangePickerCntr .navbar-form { - display: inline-block; - padding-right: 0; -} - -#timeRangePickerCntr #timeRangePicker { - min-width: 300px; -} - -body .login-box, body .register-box { - margin: 3% auto; -} - -.content-header > .breadcrumb > li { - font-size: 14px; -} - -.daterangepicker .ranges { - width: 110px!important; -} -.daterangepicker .daterangepicker_start_input, -.daterangepicker .daterangepicker_end_input { - display: block!important; - padding: 0!important; - float: none!important; -} -.daterangepicker .daterangepicker_start_input .input-mini, -.daterangepicker .daterangepicker_end_input .input-mini { - width: 110px!important; -} - -.form-group.inner-icon { - position: relative; -} -.form-group.inner-icon .fa { - position: absolute; - left: 10px; - top: 10px; -} -.form-group.inner-icon input { - padding-left: 35px; -} - -#autoRefreshCntr > a { - border: none; - opacity: 0.3; -} -#autoRefreshCntr.autoRefresh > a { - opacity: 1; -} - -.table-responsive .row { - margin: 0; -} - - -/* Misc */ -body .tooltip-inner { - max-width: 500px; -} - -.text-nowrap { - white-space: nowrap; -} - -.text-ellipsis, -.label.text-ellipsis { - overflow:hidden; - text-overflow:ellipsis; - display: inline-block; - white-space: nowrap; - max-width: 100%; -} -td.text-ellipsis { - display: table-cell; -} - -.text-breakall { - max-width: 100%; - display: inline-block; - word-wrap: break-word; -} - -.btn.btn-xs.sm { - font-size: 12px; - padding: 2px 6px; -} - -.form-control.input-xs { - height: 24px; - padding: 2px 8px; - font-size: 12px; - line-height: 100%; -} - -pre.noWrap { - border: none; - border-radius: 0; - background: transparent; - margin: 0; - padding: 0; -} - -.noSelect { - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-touch-callout: none; - -webkit-user-select: none; -} - -.blink { - animation: blinker 1s linear infinite; -} - -@keyframes blinker { - 50% {opacity: 0.0;} -} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afb89794/eagle-webservice/src/main/webapp/app/public/feature/classification/controller.js ---------------------------------------------------------------------- diff --git a/eagle-webservice/src/main/webapp/app/public/feature/classification/controller.js b/eagle-webservice/src/main/webapp/app/public/feature/classification/controller.js deleted file mode 100644 index 462b41b..0000000 --- a/eagle-webservice/src/main/webapp/app/public/feature/classification/controller.js +++ /dev/null @@ -1,358 +0,0 @@ -/* - * 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. - */ - -(function() { - 'use strict'; - - var featureControllers = angular.module('featureControllers'); - var feature = featureControllers.register("classification"); - var eagleApp = angular.module('eagleApp'); - - // ============================================================== - // = Function = - // ============================================================== - - // ============================================================= - // = Sensitivity = - // ============================================================= - feature.navItem("sensitivity", "Classification", "user-secret"); - feature.controller('sensitivity', function(PageConfig, Site, $scope, Application, Entities, UI) { - PageConfig.pageTitle = "Data Classification"; - PageConfig.pageSubTitle = Site.current().tags.site; - $scope.ajaxId = eagleApp._TRS(); - $scope.viewConfig = Application.current().configObj.view; - - if(!$scope.viewConfig) { - $.dialog({ - title: "OPS", - content: "View configuration not defined in Application." - }); - return; - } - - // ===================== Function ===================== - $scope.export = function() { - var _data = {}; - UI.fieldConfirm({title: "Export Classification", confirm: false, size: "large"}, _data, [ - {name: "Data", field: "data", type: "blob", rows: 20, optional: true, readonly: true}] - ); - - Entities.queryEntities($scope.viewConfig.service, {site: Site.current().tags.site})._promise.then(function(data) { - _data.data = JSON.stringify(data, null, "\t"); - }); - }; - - $scope.import = function() { - UI.fieldConfirm({title: "Import Classification", size: "large"}, {}, [ - {name: "Data", field: "data", type: "blob", rows: 20, optional: true} - ], function(entity) { - var _list = common.parseJSON(entity.data, false); - if(!_list) { - return "Invalid JSON format"; - } - if(!$.isArray(_list)) { - return "Not an array"; - } - }).then(null, null, function(holder) { - Entities.updateEntity($scope.viewConfig.service, common.parseJSON(holder.entity.data, []), {timestamp: false})._promise.then(function() { - holder.closeFunc(); - location.reload(); - }); - }); - }; - - $scope.deleteAll = function() { - UI.deleteConfirm("All the Classification Data").then(null, null, function(holder) { - Entities.deleteEntities($scope.viewConfig.service, {site: Site.current().tags.site})._promise.then(function() { - holder.closeFunc(); - location.reload(); - }); - }); - }; - }); - // ============================================================= - // = Sensitivity - Job = - // ============================================================= - feature.controller('sensitivityViewJob', function(Site, $scope, $wrapState, Entities) { - $scope.items = []; - - // Mark sensitivity - $scope._oriItem = {}; - $scope._markItem = {}; - - // ======================= View ======================= - // Item - $scope.updateItems = function() { - $scope.items = Entities.query($scope.viewConfig.api, {site: Site.current().tags.site}); - }; - - - $scope.updateItems(); - - // =================== Sensitivity =================== - $scope.markSensitivity = function(item) { - $scope._oriItem = item; - $scope._markItem = { - prefix: $scope.viewConfig.prefix, - tags: { - site: Site.current().tags.site - }, - sensitivityType: "" - }; - - $scope._markItem.tags[$scope.viewConfig.keys[0]] = item.jobId; - $("#sensitivityMDL").modal(); - }; - $scope.confirmUpateSensitivity = function() { - $scope._oriItem.sensitiveType = $scope._markItem.sensitivityType; - Entities.updateEntity($scope.viewConfig.service, $scope._markItem, {timestamp: false})._promise.success(function(data) { - Entities.dialog(data); - }); - $("#sensitivityMDL").modal('hide'); - }; - $scope.unmarkSensitivity = function(item) { - $.dialog({ - title: "Unmark Confirm", - content: "Do you want to remove the sensitivity mark on '" + item.jobId + "'?", - confirm: true - }, function(ret) { - if(!ret) return; - - var _cond = {site: Site.current().tags.site}; - _cond[$scope.viewConfig.keys[0]] = item.jobId; - Entities.deleteEntities($scope.viewConfig.service, _cond); - - item.sensitiveType = null; - $scope.$apply(); - }); - }; - }); - // ============================================================= - // = Sensitivity - Folder = - // ============================================================= - feature.controller('sensitivityViewFolder', function(Site, $scope, $wrapState, Entities) { - $scope.path = $wrapState.param.path || "/"; - $scope.pathUnitList = []; - $scope.items = []; - - // Mark sensitivity - $scope._oriItem = {}; - $scope._markItem = {}; - - // ======================= View ======================= - // Path - function _refreshPathUnitList(_path) { - var _start,_current, _unitList = []; - _path = _path + (_path.match(/\/$/) ? "" : "/"); - for(_current = _start = 0 ; _current < _path.length ; _current += 1) { - if(_path[_current] === "/") { - _unitList.push({ - name: _path.substring(_start, _current + (_current === 0 ? 1 : 0)), - path: _path.substring(0, _current === 0 ? 1 : _current) - }); - _start = _current + 1; - } - } - $scope.pathUnitList = _unitList; - } - - // Item - $scope.updateItems = function(path) { - if(path) $scope.path = path; - - $scope.items = Entities.query($scope.viewConfig.api, {site: Site.current().tags.site, path: $scope.path}); - $scope.items._promise.success(function(data) { - Entities.dialog(data, function() { - if($scope.path !== "/") $scope.updateItems("/"); - }); - }); - _refreshPathUnitList($scope.path); - }; - - $scope.getFileName = function(item) { - return (item.resource + "").replace(/^.*\//, ""); - }; - - $scope.updateItems($scope.path); - - // =================== Sensitivity =================== - $scope.markSensitivity = function(item) { - $scope._oriItem = item; - $scope._markItem = { - prefix: $scope.viewConfig.prefix, - tags: { - site: Site.current().tags.site - }, - sensitivityType: "" - }; - $scope._markItem.tags[$scope.viewConfig.keys[0]] = item.resource; - $("#sensitivityMDL").modal(); - }; - $scope.confirmUpateSensitivity = function() { - $scope._oriItem.sensitiveType = $scope._markItem.sensitivityType; - Entities.updateEntity($scope.viewConfig.service, $scope._markItem, {timestamp: false})._promise.success(function(data) { - Entities.dialog(data); - }); - $("#sensitivityMDL").modal('hide'); - }; - $scope.unmarkSensitivity = function(item) { - $.dialog({ - title: "Unmark Confirm", - content: "Do you want to remove the sensitivity mark on '" + item.resource + "'?", - confirm: true - }, function(ret) { - if(!ret) return; - - var _cond = {site: Site.current().tags.site}; - _cond[$scope.viewConfig.keys[0]] = item.resource; - Entities.deleteEntities($scope.viewConfig.service, _cond); - - item.sensitiveType = null; - $scope.$apply(); - }); - }; - }); - - // ============================================================= - // = Sensitivity - Table = - // ============================================================= - feature.controller('sensitivityViewTable', function(Site, $scope, Entities) { - $scope.databases = null; - $scope.table = null; - - // Mark sensitivity - $scope._oriItem = {}; - $scope._markItem = {}; - - // ======================= View ======================= - var _fillAttr = function(list, key, target) { - list._promise.then(function() { - $.each(list, function(i, unit) { - unit[key] = unit[target]; - }); - }); - return list._promise; - }; - - $scope.loadDatabases = function(database) { - var _dbs = Entities.query($scope.viewConfig.api.database, {site: Site.current().tags.site}); - return _fillAttr(_dbs, "database", $scope.viewConfig.mapping.database).then(function() { - if($scope.databases) { - $.each($scope.databases, function(i, oriDB) { - var db = common.array.find(oriDB.resource, _dbs, "resource"); - if(db) { - db.show = oriDB.show; - db.tables = oriDB.tables; - } - }); - } - $scope.databases = _dbs; - }); - }; - $scope.loadDatabases(); - - $scope.loadTables = function(database, force) { - var _tables, _qry; - if(database.tables && !force) return; - _qry = { - site: Site.current().tags.site - }; - _qry[$scope.viewConfig.mapping.database] = database[$scope.viewConfig.mapping.database]; - _tables = Entities.query($scope.viewConfig.api.table, _qry); - if(!database.tables) database.tables = _tables; - _fillAttr(_tables, "table", $scope.viewConfig.mapping.table); - return _fillAttr(_tables, "database", $scope.viewConfig.mapping.database).then(function() { - database.tables = _tables; - }); - }; - - $scope.loadColumns = function(database, table) { - $scope.table = table; - - if(table.columns) return; - var _qry = { - site: Site.current().tags.site - }; - _qry[$scope.viewConfig.mapping.database] = database[$scope.viewConfig.mapping.database]; - _qry[$scope.viewConfig.mapping.table] = table[$scope.viewConfig.mapping.table]; - table.columns = Entities.query($scope.viewConfig.api.column, _qry); - _fillAttr(table.columns, "column", $scope.viewConfig.mapping.column); - }; - - $scope.refreshData = function() { - $scope.loadDatabases().then(function() { - if(!$scope.table) return; - - var _table = $scope.table; - var _db = common.array.find($scope.table.database, $scope.databases, "database"); - if(_db) { - $scope.loadTables(_db, true).then(function() { - $scope.table = common.array.find(_table.table, _db.tables, "table"); - $scope.table.columns = _table.columns; - }); - } - }); - }; - - // =================== Sensitivity =================== - $scope.markSensitivity = function(item, event) { - if(event) event.stopPropagation(); - - $scope._oriItem = item; - $scope._markItem = { - prefix: $scope.viewConfig.prefix, - tags: { - site: Site.current().tags.site - }, - sensitivityType: "" - }; - $scope._markItem.tags[$scope.viewConfig.keys[0]] = item.resource; - $("#sensitivityMDL").modal(); - }; - $scope.confirmUpateSensitivity = function() { - $scope._oriItem.sensitiveType = $scope._markItem.sensitivityType; - Entities.updateEntity($scope.viewConfig.service, $scope._markItem, {timestamp: false})._promise.success(function(data) { - Entities.dialog(data); - $scope.refreshData(); - }); - $("#sensitivityMDL").modal('hide'); - }; - $scope.unmarkSensitivity = function(item, event) { - if(event) event.stopPropagation(); - - $.dialog({ - title: "Unmark Confirm", - content: "Do you want to remove the sensitivity mark on '" + item.resource + "'?", - confirm: true - }, function(ret) { - if(!ret) return; - - var _qry = { - site: Site.current().tags.site - }; - _qry[$scope.viewConfig.keys[0]] = item.resource; - Entities.deleteEntities($scope.viewConfig.service, _qry)._promise.then(function() { - $scope.refreshData(); - }); - - item.sensitiveType = null; - $scope.$apply(); - }); - }; - }); -})(); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afb89794/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity.html ---------------------------------------------------------------------- diff --git a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity.html b/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity.html deleted file mode 100644 index 41fb291..0000000 --- a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity.html +++ /dev/null @@ -1,40 +0,0 @@ -<!-- - 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. - --> - -<div class="box box-primary"> - <div class="box-header with-border"> - <i class="fa fa-folder-open"></i> - <h3 class="box-title ng-binding">{{Application.current().displayName}}</h3> - <div class="box-tools pull-right" ng-if="viewConfig"> - <div class="btn-group"> - <button type="button" class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"> - <span class="fa fa-wrench"></span> - </button> - <ul class="dropdown-menu" role="menu"> - <li><a ng-click="import()"><span class="fa fa-cloud-upload"></span> Import</a></li> - <li><a ng-click="export()"><span class="fa fa-cloud-download"></span> Export</a></li> - <li class="divider"></li> - <li class="danger"><a ng-click="deleteAll()"><span class="fa fa-trash"></span> Delete All</a></li> - </ul> - </div> - </div> - </div> - <div class="box-body"> - <ng-include ng-if="viewConfig" src="'public/feature/classification/page/sensitivity/' + viewConfig.type + '.html?_=' + ajaxId"></ng-include> - </div> -</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afb89794/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/folder.html ---------------------------------------------------------------------- diff --git a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/folder.html b/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/folder.html deleted file mode 100644 index cfefffa..0000000 --- a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/folder.html +++ /dev/null @@ -1,110 +0,0 @@ -<!-- - 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. - --> -<div ng-controller="classification_sensitivityViewFolder"> - <ul class="list-inline path"> - <li>Path:</li> - <li ng-repeat="unit in pathUnitList"> - <a ng-click="updateItems(unit.path)" class="label bg-black">{{unit.name}}</a> - </li> - </ul> - - <table class="table table-bordered"> - <thead> - <tr> - <th width="15%">File Name</th> - <th width="10%">Owner</th> - <th width="10%">Group</th> - <th>Sensitivity Type</th> - <th width="10" ng-show="Auth.isRole('ROLE_ADMIN')"> </th> - </tr> - </thead> - <tbody> - <tr ng-show="items._promise.$$state.status !== 1"> - <td colspan="5"> - <span class="fa fa-refresh fa-spin"> </span> - Loading... - </td> - </tr> - <tr ng-show="items._promise.$$state.status === 1 && !items.length"> - <td colspan="5"> - <span class="fa fa-exclamation-triangle"> </span> - Empty Folder - </td> - </tr> - <tr ng-repeat="item in items" ng-class="{warning : item.sensitiveType}"> - <td> - <span ng-show="!item.isdir"> - <span class="fa fa-file"> </span> - {{getFileName(item)}} - </span> - <a ng-show="item.isdir" ng-click="updateItems(item.resource)"> - <span class="fa fa-folder"> </span> - {{getFileName(item)}} - </a> - - <span class="pull-right" ng-show="item.childSensitiveTypes.length"> - <span class="fa fa-dot-circle-o text-muted" uib-tooltip="Contain child sensitivity defination"> </span> - </span> - </td> - <td>{{item.owner}}</td> - <td>{{item.groupName}}</td> - <td>{{item.sensitiveType}}</td> - <td ng-show="Auth.isRole('ROLE_ADMIN')"> - <button class="fa fa-eye btn btn-primary btn-xs" ng-click="markSensitivity(item)" ng-show="!item.sensitiveType" - uib-tooltip="Mark as sensitivity data" tooltip-animation="false" tooltip-placement="left"> </button> - <button class="fa fa-eye-slash btn btn-warning btn-xs" ng-click="unmarkSensitivity(item)" ng-show="item.sensitiveType" - uib-tooltip="Remove the sensitivity mark" tooltip-animation="false" tooltip-placement="left"> </button> - </td> - </tr> - </tbody> - </table> - - - <!-- Modal: Create / Edit site --> - <div class="modal fade" id="sensitivityMDL" tabindex="-1" role="dialog"> - <div class="modal-dialog" role="document"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"> - <span aria-hidden="true">×</span> - </button> - <h4 class="modal-title">Mark Sensitivity Data</h4> - </div> - <div class="modal-body"> - <div class="form-group"> - <label>Resource</label> - <input type="text" readonly="readonly" class="form-control" ng-model="_markItem.tags.filedir" /> - </div> - <div class="form-group"> - <label>* Sensitivity Type</label> - <input type="text" class="form-control" ng-model="_markItem.sensitivityType" id="sensitiveType" /> - </div> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" data-dismiss="modal"> - Close - </button> - <button type="button" class="btn btn-primary" ng-click="confirmUpateSensitivity()" ng-disabled="!_markItem.sensitivityType"> - Update - </button> - </div> - </div> - </div> - </div> - -</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afb89794/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/job.html ---------------------------------------------------------------------- diff --git a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/job.html b/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/job.html deleted file mode 100644 index 05d70da..0000000 --- a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/job.html +++ /dev/null @@ -1,92 +0,0 @@ -<!-- - 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. - --> -<div ng-controller="classification_sensitivityViewJob"> - <ul class="list-inline path"> - <li>Oozie CoordinatorJob:</li> - </ul> - - <table class="table table-bordered"> - <thead> - <tr> - <th width="15%">JobId</th> - <th width="10%">AppName</th> - <th>Sensitivity Type</th> - <th width="10" ng-show="Auth.isRole('ROLE_ADMIN')"> </th> - </tr> - </thead> - <tbody> - <tr ng-show="items._promise.$$state.status !== 1"> - <td colspan="5"> - <span class="fa fa-refresh fa-spin"> </span> - Loading... - </td> - </tr> - <tr ng-show="items._promise.$$state.status === 1 && !items.length"> - <td colspan="5"> - <span class="fa fa-exclamation-triangle"> </span> - Empty - </td> - </tr> - <tr ng-repeat="item in items" ng-class="{warning : item.sensitiveType}"> - <td>{{item.jobId}}</td> - <td>{{item.name}}</td> - <td>{{item.sensitiveType}}</td> - <td ng-show="Auth.isRole('ROLE_ADMIN')"> - <button class="fa fa-eye btn btn-primary btn-xs" ng-click="markSensitivity(item)" ng-show="!item.sensitiveType" - uib-tooltip="Mark as sensitivity data" tooltip-animation="false" tooltip-placement="left"> </button> - <button class="fa fa-eye-slash btn btn-warning btn-xs" ng-click="unmarkSensitivity(item)" ng-show="item.sensitiveType" - uib-tooltip="Remove the sensitivity mark" tooltip-animation="false" tooltip-placement="left"> </button> - </td> - </tr> - </tbody> - </table> - - - <!-- Modal: Create / Edit site --> - <div class="modal fade" id="sensitivityMDL" tabindex="-1" role="dialog"> - <div class="modal-dialog" role="document"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"> - <span aria-hidden="true">×</span> - </button> - <h4 class="modal-title">Mark Sensitivity Data</h4> - </div> - <div class="modal-body"> - <div class="form-group"> - <label>Resource</label> - <input type="text" readonly="readonly" class="form-control" ng-model="_markItem.tags.oozieResource" /> - </div> - <div class="form-group"> - <label>* Sensitivity Type</label> - <input type="text" class="form-control" ng-model="_markItem.sensitivityType" id="sensitiveType" /> - </div> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" data-dismiss="modal"> - Close - </button> - <button type="button" class="btn btn-primary" ng-click="confirmUpateSensitivity()" ng-disabled="!_markItem.sensitivityType"> - Update - </button> - </div> - </div> - </div> - </div> - -</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/afb89794/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/table.html ---------------------------------------------------------------------- diff --git a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/table.html b/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/table.html deleted file mode 100644 index 13d5807..0000000 --- a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/table.html +++ /dev/null @@ -1,150 +0,0 @@ -<!-- - 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. - --> -<div ng-controller="classification_sensitivityViewTable"> - <p ng-show="databases._promise.$$state.status !== 1"> - <span class="fa fa-refresh fa-spin"> </span> - Loading... - </p> - - <div ng-show="databases._promise.$$state.status === 1" class="row"> - <div class="col-md-4"> - <label> - Databases - ({{databases.length}}) - </label> - <ul class="tree tree-bordered" style="max-height: 500px; overflow-y: auto;"> - <li ng-repeat="db in databases"> - <span class="tree-item box-clickable text-primary" ng-click="db.show = !db.show; loadTables(db);"> - <span ng-class="{'text-warning' : db.sensitiveType}"> - <span class="fa fa-database"> </span> - {{db.database}} - <span ng-show="db.tables._promise.$$state.status === 1">({{db.tables.length}})</span> - - <span ng-show="Auth.isRole('ROLE_ADMIN')"> - <a class="fa fa-eye text-muted hover" ng-click="markSensitivity(db, $event)" ng-show="!db.sensitiveType" - uib-tooltip="Mark as sensitivity data" tooltip-animation="false" tooltip-placement="right"></a> - <a class="fa fa-eye-slash text-muted hover" ng-click="unmarkSensitivity(db, $event)" ng-show="db.sensitiveType" - uib-tooltip="Remove the sensitivity mark" tooltip-animation="false" tooltip-placement="right"></a> - </span> - - <span class="pull-right" ng-show="db.childSensitiveTypes.length"> - <span class="fa fa-dot-circle-o" uib-tooltip="Contain child sensitivity defination" tooltip-placement="right" tooltip-append-to-body="true"> </span> - </span> - <span ng-show="db.sensitiveType" class="pull-right">[{{db.sensitiveType}}]</span> - </span> - </span> - <ul ng-show="db.show"> - <li ng-show="db.tables._promise.$$state.status !== 1"> - <span> - <span class="fa fa-refresh fa-spin"> </span> - Loading... - </span> - </li> - <li ng-repeat="tb in db.tables" ng-class="{active : tb === table}"> - <span class="tree-item box-clickable text-primary" ng-click="loadColumns(db, tb)"> - <span ng-class="{'text-warning' : tb.sensitiveType}"> - <span class="fa fa-table"> </span> - {{tb.table}} - - <span ng-show="Auth.isRole('ROLE_ADMIN')"> - <a class="fa fa-eye text-muted hover" ng-click="markSensitivity(tb, $event)" ng-show="!tb.sensitiveType" - uib-tooltip="Mark as sensitivity data" tooltip-animation="false" tooltip-placement="right"></a> - <a class="fa fa-eye-slash text-muted hover" ng-click="unmarkSensitivity(tb, $event)" ng-show="tb.sensitiveType" - uib-tooltip="Remove the sensitivity mark" tooltip-animation="false" tooltip-placement="right"></a> - </span> - - <span class="pull-right" ng-show="tb.childSensitiveTypes.length"> - <span class="fa fa-dot-circle-o" uib-tooltip="Contain child sensitivity defination" tooltip-placement="right" tooltip-append-to-body="true"> </span> - </span> - <span ng-show="tb.sensitiveType" class="pull-right">[{{tb.sensitiveType}}]</span> - </span> - </span> - </li> - </ul> - </li> - </ul> - </div> - <div class="col-md-8"> - <label ng-show="table">Route: {{table.database}} > {{table.table}}</label> - <p ng-show="table && table.columns._promise.$$state.status !== 1"> - <span class="fa fa-refresh fa-spin"> </span> - Loading... - </p> - <div ng-show="table && table.columns._promise.$$state.status === 1"> - <table class="table table-bordered"> - <thead> - <tr> - <th width="40%">Column Name</th> - <th>Sensitivity Type</th> - <th width="10" ng-show="Auth.isRole('ROLE_ADMIN')"> </th> - </tr> - </thead> - <tbody> - <tr ng-repeat="col in table.columns" ng-class="{warning : col.sensitiveType}"> - <td>{{col.column}}</td> - <td>{{col.sensitiveType}}</td> - <td ng-show="Auth.isRole('ROLE_ADMIN')"> - <button class="fa fa-eye btn btn-primary btn-xs" ng-click="markSensitivity(col)" ng-show="!col.sensitiveType" - uib-tooltip="Mark as sensitivity data" tooltip-animation="false" tooltip-placement="left"> </button> - <button class="fa fa-eye-slash btn btn-warning btn-xs" ng-click="unmarkSensitivity(col)" ng-show="col.sensitiveType" - uib-tooltip="Remove the sensitivity mark" tooltip-animation="false" tooltip-placement="left"> </button> - </td> - </tr> - </tbody> - </table> - </div> - </div> - </div> - - - - - - - <!-- Modal: Create / Edit site --> - <div class="modal fade" id="sensitivityMDL" tabindex="-1" role="dialog"> - <div class="modal-dialog" role="document"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"> - <span aria-hidden="true">×</span> - </button> - <h4 class="modal-title">Mark Sensitivity Data</h4> - </div> - <div class="modal-body"> - <div class="form-group"> - <label>Resource</label> - <input type="text" readonly="readonly" class="form-control" ng-model="_markItem.tags[viewConfig.keys[0]]" /> - </div> - <div class="form-group"> - <label>* Sensitivity Type</label> - <input type="text" class="form-control" ng-model="_markItem.sensitivityType" id="sensitiveType" /> - </div> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" data-dismiss="modal"> - Close - </button> - <button type="button" class="btn btn-primary" ng-click="confirmUpateSensitivity()" ng-disabled="!_markItem.sensitivityType"> - Update - </button> - </div> - </div> - </div> - </div> -</div> \ No newline at end of file