From 1f5af8bd9f6ff43571c2dc9d78b90d387daa740d Mon Sep 17 00:00:00 2001
From: Roberto Sánchez <roberto.sanchez@curisit.net>
Date: Sun, 29 Dec 2013 14:39:08 +0000
Subject: [PATCH] #333 feature - Added synamic load for catalog forms
---
securis/src/main/resources/static/admin.html | 322 +++++++++++++++++++++++++++-------------
securis/src/main/resources/static/js/catalogs.json | 56 +++++++
securis/src/main/resources/static/server.js | 7
securis/src/main/resources/static/js/admin.js | 70 ++++++++
4 files changed, 350 insertions(+), 105 deletions(-)
diff --git a/securis/src/main/resources/static/admin.html b/securis/src/main/resources/static/admin.html
index 5973b56..fa8b84c 100644
--- a/securis/src/main/resources/static/admin.html
+++ b/securis/src/main/resources/static/admin.html
@@ -1,6 +1,8 @@
<!DOCTYPE html>
-<html class="no-js" lang="en" ng-app="app" xmlns:ng="http://angularjs.org">
+<html class="no-js" lang="en" ng-app="app"
+ xmlns:ng="http://angularjs.org">
<head>
+<base href="/">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title></title>
@@ -14,6 +16,30 @@
padding-top: 50px;
padding-bottom: 20px;
}
+a {
+ cursor: default !important;
+}
+.animate-show {
+ -webkit-transition: all linear 0.5s;
+ transition: all linear 0.5s;
+ opacity:1;
+}
+
+.animate-show.ng-hide-add,
+.animate-show.ng-hide-remove {
+ -webkit-transition: all linear 0.5s;
+ transition: all linear 0.5s;
+ display: block !important;
+}
+
+.animate-show.ng-hide {
+ opacity: 0;
+}
+
+input.ng-invalid-maxlength {
+ border: solid 1px red;
+}
+
</style>
<link rel="stylesheet"
href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.3/css/bootstrap-theme.min.css">
@@ -30,7 +56,7 @@
<div class="container">
<div class="navbar-header">
<ul class="nav navbar-nav navbar-left">
- <li style="color:white;padding-top:15px;">SeCuris</li>
+ <li style="color: white; padding-top: 15px;">SeCuris</li>
<li><a href="#licenses">Licenses</a></li>
<li><a href="#admin">Admin</a></li>
</ul>
@@ -44,115 +70,199 @@
</div>
</div>
- <div class="container">
- <div class="col-md-12">
-
- </div>
- <div class="col-md-2">
+ <div class="container" ng-controller="CatalogsCtrl">
+ <div class="col-md-12"> </div>
+ <div class="col-md-2">
-<ul class="nav nav-pills nav-stacked">
- <li class="active"><a href="#">Applications</a></li>
- <li><a href="#">License types</a></li>
- <li><a href="#">Users</a></li>
- <li><a href="#">Organizations</a></li>
- <li><a href="#">Params</a></li>
-</ul>
+ <ul class="nav nav-pills nav-stacked">
+ <li ng-repeat="catalog in catalogs.data" ng-class="{active: $index === catalogIndex}"><a ng-click="selectCatalog($index, $event)" ng-bind="catalog.name"></a></li>
+ </ul>
- </div>
- <div class="col-md-10">
- <nav class="navbar navbar-default navbar-static-top">
- <!-- Brand and toggle get grouped for better mobile display -->
- <div class="navbar-header">
- <a class="navbar-brand" href="#">Applications</a>
- </div>
-
- <!-- Collect the nav links, forms, and other content for toggling -->
- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
- <ul class="nav navbar-nav">
- <li><a href="#"><span class="glyphicon glyphicon-plus"></span>
- New</a></li>
- <li><a href="#"><span class="glyphicon glyphicon-pencil"></span>
- Edit</a></li>
- <li><a href="#">
- <span class="glyphicon glyphicon-ban-circle"></span>
- Cancel</a></li>
- </ul>
- <form class="navbar-form navbar-right" role="search">
- <div class="form-group">
- <input type="text" class="form-control" placeholder="Search">
- </div>
- <button type="submit" class="btn btn-default">
- <span class="glyphicon glyphicon-search"></span>
-
- </button>
- </form>
- </div>
-</nav>
- <div class="panel panel-default">
- <form role="form" class="form-horizontal " name="licenseForm">
- <div class="form-group">
- <label class="col-md-3 control-label" for="username">Date</label>
- <div class="col-md-5">
- <input type="text" id="username" name="username" placeholder=""
- class="form-control" ng-model="username" required>
- </div>
+ </div>
+ <div class="col-md-10">
+ <div id="toolbarAndForm" ng-controller="CatalogFormCtrl">
+ <nav class="navbar navbar-default navbar-static-top">
+ <!-- Brand and toggle get grouped for better mobile display -->
+ <div class="navbar-header">
+ <a class="navbar-brand" ng-bind="catalogMetadata.name"></a>
</div>
- <div class="form-group">
- <!-- Password-->
- <label class="col-md-3 control-label" for="password">License</label>
- <div class="col-md-5">
- <input type="password" id="password" name="password"
- placeholder="" class="form-control" ng-model="password" required>
- </div>
+
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <div class="collapse navbar-collapse"
+ id="bs-example-navbar-collapse-1">
+ <ul class="nav navbar-nav">
+ <li><a ng-click="editNew()"><span class="glyphicon glyphicon-plus"></span>
+ New</a></li>
+ <li><a ng-click="edit()"><span class="glyphicon glyphicon-pencil"></span>
+ Edit</a></li>
+ <li><a ng-click="cancel()"> <span
+ class="glyphicon glyphicon-ban-circle"></span> Cancel
+ </a></li>
+ </ul>
+ <form class="navbar-form navbar-right" role="search">
+ <div class="form-group">
+ <input type="text" class="form-control" placeholder="Search">
+ </div>
+ <button type="submit" class="btn btn-default">
+ <span class="glyphicon glyphicon-search"></span>
+
+ </button>
+ </form>
</div>
- <div class="form-group">
- <div class="col-md-offset-3 col-md-10">
- <button type="submit" class="btn btn-primary">
- <span class="glyphicon glyphicon-floppy-disk"></span>
- Save</button>
- </div>
+ </nav>
+ <div class="panel panel-default animate-show ng-hide" ng-show="showForm">
+ <form role="form" class="form-horizontal " name="licenseForm">
+ <div class="form-group" ng-repeat="field in catalogMetadata.fields" ng-if="!isNew || !field.readOnly">
+ <label class="col-md-3 control-label" for="{{field.name}}">{{field.display}}</label>
+ <div class="col-md-5">
+ <input ng-if="!field.readOnly && !field.multiline" type="{{field.type}}" id="{{field.name}}" name="{{field.name}}" placeholder=""
+ class="form-control" ng-model="formu[field.name]" ng-required="field.mandatory" ng-maxlength="20" />
+ <textarea ng-if="!field.readOnly && field.multiline" type="{{field.type}}" id="{{field.name}}" name="{{field.name}}" placeholder=""
+ class="form-control" ng-model="formu[field.name]" rows="{{field.multiline}}" ng-required="field.mandatory" ng-maxlength="field.maxlength" ></textarea>
+ <p ng-if="field.readOnly" class="form-control-static">{{formu[field.name]}}</p>
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="col-md-offset-3 col-md-10">
+ <button type="submit" class="btn btn-primary">
+ <span class="glyphicon glyphicon-floppy-disk"></span> Save
+ </button>
+ </div>
+ </div>
+ </form>
</div>
- </form>
- </div>
- <div class="panel panel-default">
- <div class="panel-heading">Licenses for pack <strong>BP-CICS-002</strong>
- <span class="badge pull-right" style="color:#ccffcc;">4</span>
- <span class="badge pull-right">15</span>
- </div>
-
- <table class="table table-hover table-condensed">
- <thead>
- <tr>
- <th>License</th>
- <th>Email</th>
- <th>Status</th>
- <th></th>
- </tr>
- </thead>
- <tbody>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user1@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td><td><span ng-click="editRow()" class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0029HAHAHA UK</td><td>user2@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user3@bp.com</td><td class="danger"><span class="glyphicon glyphicon-warning-sign"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0128HAHAHA UK</td><td>user4@bp.com</td><td class="danger"><span class="glyphicon glyphicon-warning-sign"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-00qqasddHA UK</td><td>user5@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAaaHA UK</td><td>user6@bp.com</td><td class="warning"><span class="glyphicon glyphicon-question-sign"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028aaaaHA UK</td><td>user7@bp.com</td><td class="warning"><span class="glyphicon glyphicon-question-sign"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user8@bp.com</td><td class="success"><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user9@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user0@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user11@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user12@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user13@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user14@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user15@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- <tr><td>BP-CICS-0028HAHAHA UK</td><td>user16@bp.com</td><td><span class="glyphicon glyphicon-ok-circle"></span></td><td><span class="glyphicon glyphicon-pencil"></span></td></tr>
- </tbody>
- <tfoot>
- </tfoot>
- </table>
+ </div>
+
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ Licenses for pack <strong>BP-CICS-002</strong> <span
+ class="badge pull-right" style="color: #ccffcc;">4</span> <span
+ class="badge pull-right">15</span>
+ </div>
+
+ <table class="table table-hover table-condensed">
+ <thead>
+ <tr>
+ <th>License</th>
+ <th>Email</th>
+ <th>Status</th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user1@bp.com</td>
+ <td class="success"><span
+ class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span ng-click="editRow()"
+ class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0029HAHAHA UK</td>
+ <td>user2@bp.com</td>
+ <td class="success"><span
+ class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user3@bp.com</td>
+ <td class="danger"><span
+ class="glyphicon glyphicon-warning-sign"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0128HAHAHA UK</td>
+ <td>user4@bp.com</td>
+ <td class="danger"><span
+ class="glyphicon glyphicon-warning-sign"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-00qqasddHA UK</td>
+ <td>user5@bp.com</td>
+ <td class="success"><span
+ class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAaaHA UK</td>
+ <td>user6@bp.com</td>
+ <td class="warning"><span
+ class="glyphicon glyphicon-question-sign"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028aaaaHA UK</td>
+ <td>user7@bp.com</td>
+ <td class="warning"><span
+ class="glyphicon glyphicon-question-sign"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user8@bp.com</td>
+ <td class="success"><span
+ class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user9@bp.com</td>
+ <td><span class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user0@bp.com</td>
+ <td><span class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user11@bp.com</td>
+ <td><span class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user12@bp.com</td>
+ <td><span class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user13@bp.com</td>
+ <td><span class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user14@bp.com</td>
+ <td><span class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user15@bp.com</td>
+ <td><span class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ <tr>
+ <td>BP-CICS-0028HAHAHA UK</td>
+ <td>user16@bp.com</td>
+ <td><span class="glyphicon glyphicon-ok-circle"></span></td>
+ <td><span class="glyphicon glyphicon-pencil"></span></td>
+ </tr>
+ </tbody>
+ <tfoot>
+ </tfoot>
+ </table>
+ </div>
</div>
- </div>
</div>
@@ -175,7 +285,9 @@
src="//code.angularjs.org/1.2.6/angular-route.js"></script>
<script type="text/javascript"
src="//code.angularjs.org/1.2.6/angular-resource.js"></script>
- <script type="text/javascript" src="js/login.js"></script>
+ <script type="text/javascript"
+ src="//code.angularjs.org/1.2.6/angular-animate.js"></script>
+ <script type="text/javascript" src="js/admin.js"></script>
<!-- <script src="js/main.js"></script> -->
<script type="text/javascript">
diff --git a/securis/src/main/resources/static/js/admin.js b/securis/src/main/resources/static/js/admin.js
new file mode 100644
index 0000000..45f2b1b
--- /dev/null
+++ b/securis/src/main/resources/static/js/admin.js
@@ -0,0 +1,70 @@
+(function() {
+ 'use strict';
+
+ var app = angular.module('app', [ 'ngRoute', 'ngAnimate' ]);
+
+ app.factory('Catalogs', function($http) {
+ var CatalogsService = {}
+ CatalogsService.list = function(initFn) {
+ $http.get('/js/catalogs.json').success(function(data){
+ console.log(data);
+ CatalogsService.data = data;
+ initFn();
+ })
+ return CatalogsService;
+ }
+ CatalogsService.getName = function(index) {
+ return CatalogsService.data ? CatalogsService.data[index].name : '';
+ }
+ CatalogsService.getMetadata = function(index) {
+ return CatalogsService.data ? CatalogsService.data[index] : {};
+ }
+ return CatalogsService;
+
+ });
+
+ app.controller('CatalogsCtrl', [ '$scope', '$http', 'Catalogs' ,
+ function($scope, $http, catalogs) {
+ $scope.formu = {};
+ $scope.catalogIndex = 0;
+ $scope.catalogs = catalogs.list(function() {
+ $scope.catalogMetadata = catalogs.getMetadata($scope.catalogIndex);
+ }); //['Applications','License types','Users','Organizations','System params'];
+ $scope.catalogMetadata = {};
+ $scope.selectCatalog = function(index, $event) {
+ $scope.catalogIndex = index;
+ $scope.catalogMetadata = catalogs.getMetadata($scope.catalogIndex);
+ console.log($event);
+ }
+ } ]);
+
+
+ app.controller('CatalogFormCtrl', [ '$scope', '$http',
+
+ function($scope, $http, menuController) {
+ $scope.showForm = false;
+ console.log('Form: currentCatalog:'+ $scope.cataLogIndex);
+ $scope.editNew = function() {
+ $scope.showForm = true;
+ $scope.isNew = true;
+ $scope.formu = {};
+ }
+ $scope.edit = function() {
+ $scope.showForm = true;
+ $scope.isNew = false;
+ // TODO: Load in formu values for Form
+ $scope.formu = {};
+ }
+ $scope.cancel = function() {
+ $scope.showForm = false;
+ }
+ } ]);
+
+ app.controller('CatalogListCtrl', [ '$scope', '$http',
+ function($scope, $http) {
+ console.log('List: currentCatalog: '+ $scope.currentCatalog);
+
+ } ]);
+
+})();
+
diff --git a/securis/src/main/resources/static/js/catalogs.json b/securis/src/main/resources/static/js/catalogs.json
new file mode 100644
index 0000000..ddc9a0a
--- /dev/null
+++ b/securis/src/main/resources/static/js/catalogs.json
@@ -0,0 +1,56 @@
+[
+ {
+ "name": "Applications",
+ "Entity": "Application",
+ "fields": [
+ {
+ "name": "id",
+ "display": "ID",
+ "type": "number",
+ "pk": true,
+ "readOnly": true
+ },
+ {
+ "name": "name",
+ "display": "Name",
+ "type": "string",
+ "maxlength": 45,
+ "mandatory": true
+ },
+ {
+ "name": "description",
+ "display": "Description",
+ "type": "string",
+ "maxlength": 500,
+ "multiline": 2
+ },
+ {
+ "name": "creation_timestamp",
+ "display": "Creation date",
+ "type": "date",
+ "readOnly": true
+ }
+ ]
+ },
+ {
+ "name": "License types",
+ "Entity": "LicenseType",
+ "fields": []
+ },
+ {
+ "name": "Users",
+ "Entity": "User",
+ "fields": []
+ },
+ {
+ "name": "Organizations",
+ "Entity": "Organization",
+ "fields": []
+ },
+ {
+ "name": "System params",
+ "Entity": "SystemParams",
+ "fields": []
+ }
+
+]
\ No newline at end of file
diff --git a/securis/src/main/resources/static/server.js b/securis/src/main/resources/static/server.js
new file mode 100644
index 0000000..c57de05
--- /dev/null
+++ b/securis/src/main/resources/static/server.js
@@ -0,0 +1,7 @@
+var connect = require('connect');
+
+connect.createServer(
+ connect.static(__dirname)
+).listen(8080);
+
+console.log('Server listening in http://0.0.0.0:8080...');
--
Gitblit v1.3.2