You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2015/06/17 09:05:29 UTC

incubator-ignite git commit: # ignite-850 Add requered.

Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-843 ca022de1e -> 53d301db0


# ignite-850 Add requered.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/53d301db
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/53d301db
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/53d301db

Branch: refs/heads/ignite-843
Commit: 53d301db0c5995f3937dca0a0894f5a2fe243e93
Parents: ca022de
Author: Andrey <an...@gridgain.com>
Authored: Wed Jun 17 14:00:15 2015 +0700
Committer: Andrey <an...@gridgain.com>
Committed: Wed Jun 17 14:03:31 2015 +0700

----------------------------------------------------------------------
 .../nodejs/public/form-models/caches.json       |  94 +++--
 .../nodejs/public/form-models/clusters.json     | 400 ++++++++++---------
 .../public/javascripts/controllers/common.js    |   3 +-
 .../nodejs/public/stylesheets/style.css         |   2 +-
 .../nodejs/public/stylesheets/style.less        |  12 +-
 .../nodejs/views/includes/controls.jade         |  28 +-
 6 files changed, 291 insertions(+), 248 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53d301db/modules/webconfig/nodejs/public/form-models/caches.json
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/form-models/caches.json b/modules/webconfig/nodejs/public/form-models/caches.json
index ef6659b..6a9bddc 100644
--- a/modules/webconfig/nodejs/public/form-models/caches.json
+++ b/modules/webconfig/nodejs/public/form-models/caches.json
@@ -91,47 +91,59 @@
             "Cache expiration policy"
           ],
           "details": {
-            "LRU": [
-              {
-                "label": "Batch size",
-                "type": "text",
-                "model": "batchSize",
-                "placeholder": "1"
-              },
-              {
-                "label": "Max memory size",
-                "type": "text",
-                "model": "maxMemorySize",
-                "placeholder": "0",
-                "tip": [
-                  "Maximum allowed cache size in bytes"
-                ]
-              }
-            ],
-            "RND": [
-              {
-                "label": "Batch size",
-                "type": "text",
-                "model": "batchSize",
-                "placeholder": "1"
-              }
-            ],
-            "FIFO": [
-              {
-                "label": "Batch size",
-                "type": "text",
-                "model": "batchSize",
-                "placeholder": "1"
-              }
-            ],
-            "SORTED": [
-              {
-                "label": "Batch size",
-                "type": "text",
-                "model": "batchSize",
-                "placeholder": "1"
-              }
-            ]
+            "LRU": {
+              "expanded": false,
+              "fields": [
+                {
+                  "label": "Batch size",
+                  "type": "text",
+                  "model": "batchSize",
+                  "placeholder": "1"
+                },
+                {
+                  "label": "Max memory size",
+                  "type": "text",
+                  "model": "maxMemorySize",
+                  "placeholder": "0",
+                  "tip": [
+                    "Maximum allowed cache size in bytes"
+                  ]
+                }
+              ]
+            },
+            "RND": {
+              "expanded": false,
+              "fields": [
+                {
+                  "label": "Batch size",
+                  "type": "text",
+                  "model": "batchSize",
+                  "placeholder": "1"
+                }
+              ]
+            },
+            "FIFO": {
+              "expanded": false,
+              "fields": [
+                {
+                  "label": "Batch size",
+                  "type": "text",
+                  "model": "batchSize",
+                  "placeholder": "1"
+                }
+              ]
+            },
+            "SORTED": {
+              "expanded": false,
+              "fields": [
+                {
+                  "label": "Batch size",
+                  "type": "text",
+                  "model": "batchSize",
+                  "placeholder": "1"
+                }
+              ]
+            }
           }
         }
       ]

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53d301db/modules/webconfig/nodejs/public/form-models/clusters.json
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/form-models/clusters.json b/modules/webconfig/nodejs/public/form-models/clusters.json
index f34cade..ab8c56f 100644
--- a/modules/webconfig/nodejs/public/form-models/clusters.json
+++ b/modules/webconfig/nodejs/public/form-models/clusters.json
@@ -10,204 +10,224 @@
     {
       "label": "Discovery",
       "type": "dropdown-details",
-      "customizable": true,
-      "expanded": false,
       "group": "discovery",
       "model": "kind",
+      "required": true,
       "placeholder": "Choose discovery",
       "items": "discoveries",
       "tip": [
         "Discovery allows to discover remote nodes in grid."
       ],
       "details": {
-        "Vm": [
-          {
-            "tableLabel": "Addresses",
-            "label": "address",
-            "type": "table-simple",
-            "model": "addresses",
-            "editIdx": -1,
-            "placeholder": "IP address",
-            "tip": [
-              "Addresses may be represented as follows:",
-              "<ul>",
-              "    <li>IP address (e.g. 127.0.0.1, 9.9.9.9, etc);</li>",
-              "    <li>IP address and port (e.g. 127.0.0.1:47500, 9.9.9.9:47501, etc);</li>",
-              "    <li>IP address and port range (e.g. 127.0.0.1:47500..47510, 9.9.9.9:47501..47504, etc);</li>",
-              "    <li>Hostname (e.g. host1.com, host2, etc);</li>",
-              "    <li>Hostname and port (e.g. host1.com:47500, host2:47502, etc).</li>",
-              "    <li>Hostname and port range (e.g. host1.com:47500..47510, host2:47502..47508, etc).</li>",
-              "</ul>",
-              "<p>",
-              "If port is 0 or not provided then default port will be used (depends on",
-              "discovery SPI configuration).",
-              "<p>",
-              "If port range is provided (e.g. host:port1..port2) the following should be considered:",
-              "<ul>",
-              "    <li>port1 < port2 should be true;</li>",
-              "    <li>Both port1 and port2 should be greater than 0.</li>",
-              "</ul>"
-            ]
-          }
-        ],
-        "Multicast": [
-          {
-            "label": "IP address",
-            "type": "text",
-            "model": "multicastGroup",
-            "placeholder": "228.1.2.4",
-            "tip": [
-              "IP address of multicast group."
-            ]
-          },
-          {
-            "label": "Port number",
-            "type": "text",
-            "model": "multicastPort",
-            "placeholder": "47400",
-            "tip": [
-              "Port number which multicast messages are sent to."
-            ]
-          },
-          {
-            "label": "Waits for reply ",
-            "type": "text",
-            "model": "responseWaitTime",
-            "placeholder": "500",
-            "tip": [
-              "Time in milliseconds IP finder waits for reply to multicast address request."
-            ]
-          },
-          {
-            "label": "Attempts count",
-            "type": "text",
-            "model": "addressRequestAttempts",
-            "placeholder": "2",
-            "tip": [
-              "Number of attempts to send multicast address request. ",
-              "IP finder re-sends request only in case if no reply for previous request is received."
-            ]
-          },
-          {
-            "label": "Local address",
-            "type": "text",
-            "model": "localAddress",
-            "tip": [
-              "Local host address used by this IP finder.",
-              "If provided address is non-loopback then multicast socket is bound to this interface.",
-              "If local address is not set or is any local address then",
-              "IP finder creates multicast sockets for all found non-loopback addresses"
-            ]
-          }
-        ],
-        "S3": [
-          {
-            "label": "Bucket name",
-            "type": "text",
-            "model": "bucketName",
-            "placeholder": ""
-          }
-        ],
-        "Cloud": [
-          {
-            "label": "Credential",
-            "type": "text",
-            "model": "credential",
-            "placeholder": "",
-            "tip": [
-              "Credential that is used during authentication on the cloud.",
-              "Depending on a cloud platform it can be a password or access key."
-            ]
-          },
-          {
-            "label": "Path to credential",
-            "type": "text",
-            "model": "credentialPath",
-            "placeholder": "",
-            "tip": [
-              "Path to a credential that is used during authentication on the cloud.",
-              "Access key or private key should be stored in a plain or PEM file without a passphrase."
-            ]
-          },
-          {
-            "label": "Identity",
-            "type": "text",
-            "model": "identity",
-            "placeholder": "",
-            "tip": [
-              "Identity that is used as a user name during a connection to the cloud.",
-              "Depending on a cloud platform it can be an email address, user name, etc."
-            ]
-          },
-          {
-            "label": "Provider",
-            "type": "text",
-            "model": "provider",
-            "placeholder": "",
-            "tip": [
-              "Cloud provider to use."
-            ]
-          }
-        ],
-        "GoogleStorage": [
-          {
-            "label": "Project name",
-            "type": "text",
-            "model": "projectName",
-            "placeholder": "",
-            "tip": [
-              "Google Cloud Platforms project name.",
-              "Usually this is an auto generated project number (ex. 208709979073) that can be found in 'Overview' section of Google Developer Console."
-            ]
-          },
-          {
-            "label": "Bucket name",
-            "type": "text",
-            "model": "bucketName",
-            "placeholder": "",
-            "tip": [
-              "Google Cloud Storage bucket name.",
-              "If the bucket doesn't exist Ignite will automatically create it.",
-              "However the name must be unique across whole Google Cloud Storage and Service Account Id must be authorized to perform this operation."
-            ]
-          },
-          {
-            "label": "Private key path",
-            "type": "text",
-            "model": "serviceAccountP12FilePath",
-            "placeholder": "",
-            "tip": [
-              "Full path to the private key in PKCS12 format of the Service Account."
-            ]
-          },
-          {
-            "label": "Account id",
-            "type": "text",
-            "model": "accountId",
-            "placeholder": "",
-            "tip": [
-              "Service account ID (typically an e-mail address)."
-            ]
-          }
-        ],
-        "Jdbc": [
-          {
-            "label": "DB schema should be initialized by Ignite",
-            "type": "check",
-            "model": "initSchema",
-            "tip": [
-              "Flag indicating whether DB schema should be initialized by Ignite or was explicitly created by user."
-            ]
-          }
-        ],
-        "SharedFs": [
-          {
-            "label": "File path",
-            "type": "text",
-            "model": "path",
-            "placeholder": "disco/tcp"
-          }
-        ]
+        "Vm": {
+          "expanded": true,
+          "fields": [
+            {
+              "tableLabel": "Addresses",
+              "label": "address",
+              "type": "table-simple",
+              "model": "addresses",
+              "editIdx": -1,
+              "placeholder": "IP address",
+              "tip": [
+                "Addresses may be represented as follows:",
+                "<ul>",
+                "    <li>IP address (e.g. 127.0.0.1, 9.9.9.9, etc);</li>",
+                "    <li>IP address and port (e.g. 127.0.0.1:47500, 9.9.9.9:47501, etc);</li>",
+                "    <li>IP address and port range (e.g. 127.0.0.1:47500..47510, 9.9.9.9:47501..47504, etc);</li>",
+                "    <li>Hostname (e.g. host1.com, host2, etc);</li>",
+                "    <li>Hostname and port (e.g. host1.com:47500, host2:47502, etc).</li>",
+                "    <li>Hostname and port range (e.g. host1.com:47500..47510, host2:47502..47508, etc).</li>",
+                "</ul>",
+                "<p>",
+                "If port is 0 or not provided then default port will be used (depends on",
+                "discovery SPI configuration).",
+                "<p>",
+                "If port range is provided (e.g. host:port1..port2) the following should be considered:",
+                "<ul>",
+                "    <li>port1 < port2 should be true;</li>",
+                "    <li>Both port1 and port2 should be greater than 0.</li>",
+                "</ul>"
+              ]
+            }
+          ]
+        },
+        "Multicast": {
+            "expanded": false,
+            "fields": [
+            {
+              "label": "IP address",
+              "type": "text",
+              "model": "multicastGroup",
+              "placeholder": "228.1.2.4",
+              "tip": [
+                "IP address of multicast group."
+              ]
+            },
+            {
+              "label": "Port number",
+              "type": "text",
+              "model": "multicastPort",
+              "placeholder": "47400",
+              "tip": [
+                "Port number which multicast messages are sent to."
+              ]
+            },
+            {
+              "label": "Waits for reply ",
+              "type": "text",
+              "model": "responseWaitTime",
+              "placeholder": "500",
+              "tip": [
+                "Time in milliseconds IP finder waits for reply to multicast address request."
+              ]
+            },
+            {
+              "label": "Attempts count",
+              "type": "text",
+              "model": "addressRequestAttempts",
+              "placeholder": "2",
+              "tip": [
+                "Number of attempts to send multicast address request. ",
+                "IP finder re-sends request only in case if no reply for previous request is received."
+              ]
+            },
+            {
+              "label": "Local address",
+              "type": "text",
+              "model": "localAddress",
+              "tip": [
+                "Local host address used by this IP finder.",
+                "If provided address is non-loopback then multicast socket is bound to this interface.",
+                "If local address is not set or is any local address then",
+                "IP finder creates multicast sockets for all found non-loopback addresses"
+              ]
+            }
+          ]
+        },
+        "S3": {
+          "expanded": true,
+          "fields": [
+            {
+              "label": "Bucket name",
+              "type": "text",
+              "model": "bucketName",
+              "placeholder": ""
+            }
+          ]
+        },
+        "Cloud": {
+          "expanded": true,
+          "fields": [
+            {
+              "label": "Credential",
+              "type": "text",
+              "model": "credential",
+              "placeholder": "",
+              "tip": [
+                "Credential that is used during authentication on the cloud.",
+                "Depending on a cloud platform it can be a password or access key."
+              ]
+            },
+            {
+              "label": "Path to credential",
+              "type": "text",
+              "model": "credentialPath",
+              "placeholder": "",
+              "tip": [
+                "Path to a credential that is used during authentication on the cloud.",
+                "Access key or private key should be stored in a plain or PEM file without a passphrase."
+              ]
+            },
+            {
+              "label": "Identity",
+              "type": "text",
+              "model": "identity",
+              "placeholder": "",
+              "tip": [
+                "Identity that is used as a user name during a connection to the cloud.",
+                "Depending on a cloud platform it can be an email address, user name, etc."
+              ]
+            },
+            {
+              "label": "Provider",
+              "type": "text",
+              "model": "provider",
+              "placeholder": "",
+              "tip": [
+                "Cloud provider to use."
+              ]
+            }
+          ]
+        },
+        "GoogleStorage": {
+          "expanded": true,
+          "fields": [
+            {
+              "label": "Project name",
+              "type": "text",
+              "model": "projectName",
+              "placeholder": "",
+              "tip": [
+                "Google Cloud Platforms project name.",
+                "Usually this is an auto generated project number (ex. 208709979073) that can be found in 'Overview' section of Google Developer Console."
+              ]
+            },
+            {
+              "label": "Bucket name",
+              "type": "text",
+              "model": "bucketName",
+              "placeholder": "",
+              "tip": [
+                "Google Cloud Storage bucket name.",
+                "If the bucket doesn't exist Ignite will automatically create it.",
+                "However the name must be unique across whole Google Cloud Storage and Service Account Id must be authorized to perform this operation."
+              ]
+            },
+            {
+              "label": "Private key path",
+              "type": "text",
+              "model": "serviceAccountP12FilePath",
+              "placeholder": "",
+              "tip": [
+                "Full path to the private key in PKCS12 format of the Service Account."
+              ]
+            },
+            {
+              "label": "Account id",
+              "type": "text",
+              "model": "accountId",
+              "placeholder": "",
+              "tip": [
+                "Service account ID (typically an e-mail address)."
+              ]
+            }
+          ]
+        },
+        "Jdbc": {
+          "expanded": true,
+          "fields": [
+            {
+              "label": "DB schema should be initialized by Ignite",
+              "type": "check",
+              "model": "initSchema",
+              "tip": [
+                "Flag indicating whether DB schema should be initialized by Ignite or was explicitly created by user."
+              ]
+            }
+          ]
+        },
+        "SharedFs": {
+          "expanded": false,
+          "fields": [
+            {
+              "label": "File path",
+              "type": "text",
+              "model": "path",
+              "placeholder": "disco/tcp"
+            }
+          ]
+        }
       }
     },
     {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53d301db/modules/webconfig/nodejs/public/javascripts/controllers/common.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/javascripts/controllers/common.js b/modules/webconfig/nodejs/public/javascripts/controllers/common.js
index a993754..f472605 100644
--- a/modules/webconfig/nodejs/public/javascripts/controllers/common.js
+++ b/modules/webconfig/nodejs/public/javascripts/controllers/common.js
@@ -30,7 +30,8 @@ configuratorModule.config(function($selectProvider) {
     angular.extend($selectProvider.defaults, {
         maxLength: '1',
         allText: 'Select All',
-        noneText: 'Clear All'
+        noneText: 'Clear All',
+        template: '/select'
     });
 });
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53d301db/modules/webconfig/nodejs/public/stylesheets/style.css
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/stylesheets/style.css b/modules/webconfig/nodejs/public/stylesheets/style.css
index 406c573..5c2e347 100644
--- a/modules/webconfig/nodejs/public/stylesheets/style.css
+++ b/modules/webconfig/nodejs/public/stylesheets/style.css
@@ -1 +1 @@
-.main-header .logo{height:auto}.main-sidebar{padding-top:60px}.navbar-default .navbar-brand,.navbar-default .navbar-brand:hover{position:absolute;width:100%;left:0;text-align:center}.modal-backdrop.am-fade{opacity:.5;transition:opacity .15s linear}.modal-backdrop.am-fade.ng-enter{opacity:0}.modal-backdrop.am-fade.ng-enter.ng-enter-active{opacity:.5}.modal-backdrop.am-fade.ng-leave{opacity:.5}.modal-backdrop.am-fade.ng-leave.ng-leave-active{opacity:0}.modal.center .modal-dialog{position:fixed;top:40%;left:50%;min-width:320px;max-width:630px;width:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.ng-table th.text-right{text-align:right}.ng-table th.text-left{text-align:left}.ng-table th.text-center{text-align:center}.fa.fa-remove{color:red}.border-left{-webkit-box-shadow:1px 0 0 0 #eee inset;box-shadow:1px 0 0 0 #eee inset}.border-right{-webkit-box-shadow:1px 0 0 0 #eee;box-shadow:1px 0 0 0 #eee}.theme-line{background-color:#f9f9f9}.t
 heme-line header{background-color:#fff}.theme-line header a.btn{border:0 none;padding:10px 25px;background-color:rgba(0,0,0,0.15)}.theme-line header a.btn:hover{background-color:rgba(0,0,0,0.25)}.theme-line header a.btn.btn-link{background:transparent;color:rgba(255,255,255,0.8)}.theme-line header a.btn.btn-link:hover{color:#fff;text-decoration:none}.theme-line .navbar-nav a{background-color:transparent}.theme-line .navbar-nav a:hover,.theme-line .navbar-nav a:active,.theme-line .navbar-nav a:focus{background-color:transparent}.theme-line .main-links{padding-top:50px}.theme-line .main-links h3{margin-top:0;font-size:17px}.theme-line .main-links .links a{color:#888}.theme-line .main-links .links a:hover{text-decoration:none}.theme-line #category-columns,.theme-solid #category-columns{margin:50px 30px 0}.theme-line #category-columns h4{text-transform:uppercase;font-weight:300;color:#999;font-size:14px}.theme-line #category-columns ul{list-style:none;padding:0;margin-bottom:15px}.theme
 -line #category-columns ul li a{padding:4px 0;display:block;font-size:16px}.theme-line #category-columns ul .view-all{font-size:0.85em}.theme-line .docs-header{color:#999;overflow:hidden}.theme-line .docs-header h1{color:#444;margin-top:0;font-size:25px}.theme-line .btn-primary{border:0 none}.theme-line .main-content .nav-horizontal a{-webkit-box-shadow:0 0;box-shadow:0 0;border:0 none;background-color:#fff;-webkit-border-radius:0;border-radius:0;color:#aaa;padding:6px;margin:0 14px}.theme-line .main-content .nav-horizontal a:hover{color:#999;border-bottom:4px solid #ddd}.theme-line .main-content .nav-horizontal a.active{border-bottom:4px solid #888}.theme-line .sidebar-nav{color:#474a54;padding-bottom:30px}.theme-line .sidebar-nav ul{padding:0;list-style:none;font-size:13px;margin:3px 0 0}.theme-line .sidebar-nav ul li a{padding:3px 0;display:block;color:#666;position:relative;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.theme-line .sidebar-n
 av ul li a:before{top:0;content:" ";display:block;width:6px;height:100%;position:absolute;left:-30px}.theme-line .sidebar-nav ul li a:hover{text-decoration:none}.theme-line .select li a{color:#666}.theme-line .select li a:hover,.theme-line .select .active{color:#ec1c24;background-color:white}.theme-line .sidebar-nav ul li .subcategory{padding-left:15px}.theme-line .sidebar-nav h4{margin-top:2em;font-weight:normal;text-transform:uppercase;font-size:11px;margin-bottom:10px;color:#bbb}.theme-line .sidebar-nav h4:first-child{margin-top:0}.theme-line .sidebar-nav .ask{width:100%;text-align:center;padding:10px}.theme-line .border-left .sidebar-nav{padding-left:15px}.theme-line .suggest{padding:4px;display:inline-block;font-size:12px}.header{padding:15px}.header .has-github{padding-right:136px}.header h1.navbar-brand{height:40px;width:200px;padding:0;margin:5px 15px 0 0}.header h1.navbar-brand a{text-indent:-99999px;background:no-repeat center center;display:block;width:100%;height:100%;-w
 ebkit-background-size:contain;-moz-background-size:contain;background-size:contain}.header .nav.navbar-nav.pull-right{position:relative;right:-30px}.header .nav.navbar-nav .not-link{padding:15px;display:inline-block}.header .nav.navbar-nav .stable,.header .nav.navbar-nav .beta,.header .nav.navbar-nav .private{font-size:9px;padding:3px 5px;display:inline-block;line-height:8px;-webkit-border-radius:3px;border-radius:3px;margin-left:6px;color:#fff;top:-2px;position:relative;opacity:0.6;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";filter:alpha(opacity=60)}.header .nav.navbar-nav a:hover>.stable,.header .nav.navbar-nav a:hover>.beta,.header .nav.navbar-nav a:hover>.private{opacity:1;-ms-filter:none;filter:none}.header .nav.navbar-nav .beta{background-color:#59c3d1}.header .nav.navbar-nav .stable{background-color:#41b841}.header .nav.navbar-nav .private{background-color:#333}.theme-line header{border-bottom:8px solid}.theme-line header h2{color:#aaa}.theme-line header 
 p{color:#666}.theme-line header{border-bottom-color:#ec1c24}.theme-line .navbar-nav{color:#888}.theme-line .navbar-nav a{color:#bbb}.theme-line header a.btn{background-color:#ec1c24}.theme-line header a.btn:hover{background-color:#950d12}.theme-line header .navbar-nav .tt-cursor{background-color:#ec1c24}.theme-line header .navbar-nav a:hover,.theme-line header .navbar-nav .open>a{color:#ec1c24}.theme-line .navbar-nav .active a{color:#ec1c24}.theme-line .navbar-nav .active a:hover{color:#950d12}.theme-line .main-links .links a:hover{color:#ec1c24}.theme-line .main-content a{color:#666}.theme-line .main-content a:hover{color:#950d12}.theme-line .sidebar-nav ul li a.active:before{background-color:#ec1c24}.theme-line .sidebar-nav ul li a.active{color:#ec1c24}.theme-line .sidebar-nav ul li a:hover,.theme-line .sidebar-nav ul li a.active:hover{color:#950d12}.theme-line .btn-primary{background-color:#ec1c24}.theme-line .btn-primary:hover{background-color:#950d12}.theme-line .main-content .
 nav-horizontal a.active{border-color:#ec1c24;color:#ec1c24}.theme-line .main-content .nav-horizontal a:hover{color:#950d12}.theme-line .main-content .nav-horizontal a.active:hover{border-color:#950d12}.theme-line header .navbar-nav a.active,.theme-line #versions-list li a:hover strong,.theme-line #versions-list li a.active .current,.theme-line #versions-list li a:active .current{color:#ec1c24}.theme-line.body-threes .section-right .threes-nav .btn-default:hover,.theme-line.page-docs.body-threes .section-right .threes-nav .pull-right a:hover{color:#ec1c24;border-color:#ec1c24}.theme-line .section-right{padding-left:30px}.body-overlap .main-content{margin-top:30px}.body-box .main-content,.body-overlap .main-content{padding:30px;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,0.1);box-shadow:0 0 0 1px rgba(0,0,0,0.1);background-color:#fff}body{font-weight:400;font-family:Roboto Slab, serif}h1,h2,h3,h4,h5,h6{font-weight:700;font-family:Roboto Slab, serif}.submit-vote.submit-vote-parent.voted a.
 submit-vote-button,.submit-vote.submit-vote-parent a.submit-vote-button:hover{background-color:#ec1c24}div.submit-vote.submit-vote-parent.voted a.submit-vote-button:hover{background-color:#950d12}a,.link .title{color:#ec1c24}a:hover,.link:hover .title{color:#950d12}.header h1.navbar-brand a{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli")}.header h1.navbar-brand{width:96px}.block-edit-parameters{text-align:right;padding-bottom:5px}.ng-table-pager{display:none}.container-footer{margin-top:20px}.vcenter{display:inline-block;vertical-align:middle;float:none}.vcenter2{position:relative;top:50%;transform:translateY(-50%)}.modal{display:block;overflow:hidden}.modal .close{position:absolute;top:24px;right:24px;float:none}.modal .modal-dialog{width:610px}.modal .modal-content{-webkit-border-radius:0;border-radius:0;background-color:#f7f7f7}.modal .modal-content .modal-header{background-color:#fff;text-align:center;color:#555;padding:24px;font-family:"myriad-pr
 o",sans-serif}.modal .modal-content .modal-header h4{font-family:"myriad-pro",sans-serif;font-size:22px}.modal .modal-content .modal-header h4 .fa{display:block;font-size:41px;color:#ddd;margin-bottom:5px}.modal .modal-content .modal-header p{color:#aaa;font-size:1em;margin:3px 0 0}.modal .modal-content .modal-spacer{padding:10px 10px 0 10px}.modal .modal-content .modal-footer{margin-top:0}.modal-body{padding-top:30px}h1.ignite-logo{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli")}.st-sort-ascent:after{font-family:FontAwesome, serif;content:'\f077'}.st-sort-descent:after{font-family:FontAwesome, serif;content:'\f078'}.block-display-image img{max-width:100%;max-height:450px;margin:auto;display:block}.greedy{min-height:200px;height:calc(100vh - 230px)}@media (min-width:768px){.navbar-nav>li>a{padding-top:20px;padding-bottom:10px}}.details-row,.settings-row{display:block;margin:0.65em 0;line-height:28px}.details-row [class*="col-"],.settings-row [class*="
 col-"]{display:inline-block;vertical-align:middle;float:none;padding-left:0 !important;padding-right:0 !important}.details-row input[type="checkbox"],.settings-row input[type="checkbox"]{line-height:20px;margin-right:4px}.details-row .checkbox label,.settings-row .checkbox label{line-height:20px;vertical-align:middle}.details-row{padding-left:1.3em}button{margin-right:4px}h1,h2,h3{-webkit-user-select:none;font-weight:normal;line-height:1}h3{color:black;font-size:1.2em;margin-top:0;margin-bottom:1.5em}table tr:hover{cursor:pointer}.input-group{display:inline-block}.input-group .form-control{width:auto;margin-left:0;margin-right:0}.form-control{display:inline-block;text-align:left;padding:3px 6px;height:28px}.form-control button{text-align:left}.form-horizontal .control-label{padding-top:4px}button .caret{float:right;margin-left:0;margin-top:7px}.theme-line .panel-heading{padding:10px 10px;margin:0}.theme-line .panel-heading h3{margin-bottom:0}.theme-line .panel-heading h3>a{color:bla
 ck;cursor:pointer}.theme-line .panel-title a{color:#ec1c24}.theme-line .panel-title h3{margin-bottom:1.3em}.theme-line .panel-body{padding:0.65em 1.3em}.theme-line .main-content a.customize{color:#ec1c24;cursor:pointer}.theme-line .panel-collapse{margin:0}.theme-line .links table,.theme-line .links-edit table{display:table;table-layout:fixed;margin-bottom:20px}.theme-line .links table td,.theme-line .links-edit table td{padding-left:18px}.theme-line .links table .active a,.theme-line .links-edit table .active a{color:#ec1c24;font-weight:bold}.theme-line .links table a:hover,.theme-line .links-edit table a:hover{color:#950d12}.theme-line .links table a,.theme-line .links-edit table a{color:#666}.theme-line .links-edit table label{line-height:28px;color:#666}.btn{padding:3px 6px}.panel-title a{font-size:14px}.panel-details{margin-top:1.3em;padding:0.65em;border-radius:4px;border:thin dotted lightgrey}.tooltip.right .tooltip-arrow{border-right-color:#ec1c24}.tooltip>.tooltip-inner{max-
 width:400px;text-align:left;background-color:#ec1c24}label{font-weight:normal;line-height:14px;margin-bottom:0}.form-horizontal .checkbox{padding-top:0}.input-tip{display:block;overflow:hidden;padding-right:4px}.tipField{float:right;line-height:28px;margin-right:18px}.tipLabel{margin-left:4px}.table-nowrap{table-layout:fixed}.td-overflow{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fa-edit{cursor:pointer}.fa-remove{margin-left:10px;cursor:pointer}.required{font-weight:bold}.blank{visibility:hidden}
\ No newline at end of file
+.main-header .logo{height:auto}.main-sidebar{padding-top:60px}.navbar-default .navbar-brand,.navbar-default .navbar-brand:hover{position:absolute;width:100%;left:0;text-align:center}.modal-backdrop.am-fade{opacity:.5;transition:opacity .15s linear}.modal-backdrop.am-fade.ng-enter{opacity:0}.modal-backdrop.am-fade.ng-enter.ng-enter-active{opacity:.5}.modal-backdrop.am-fade.ng-leave{opacity:.5}.modal-backdrop.am-fade.ng-leave.ng-leave-active{opacity:0}.modal.center .modal-dialog{position:fixed;top:40%;left:50%;min-width:320px;max-width:630px;width:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.ng-table th.text-right{text-align:right}.ng-table th.text-left{text-align:left}.ng-table th.text-center{text-align:center}.fa.fa-remove{color:red}.border-left{-webkit-box-shadow:1px 0 0 0 #eee inset;box-shadow:1px 0 0 0 #eee inset}.border-right{-webkit-box-shadow:1px 0 0 0 #eee;box-shadow:1px 0 0 0 #eee}.theme-line{background-color:#f9f9f9}.t
 heme-line header{background-color:#fff}.theme-line header a.btn{border:0 none;padding:10px 25px;background-color:rgba(0,0,0,0.15)}.theme-line header a.btn:hover{background-color:rgba(0,0,0,0.25)}.theme-line header a.btn.btn-link{background:transparent;color:rgba(255,255,255,0.8)}.theme-line header a.btn.btn-link:hover{color:#fff;text-decoration:none}.theme-line .navbar-nav a{background-color:transparent}.theme-line .navbar-nav a:hover,.theme-line .navbar-nav a:active,.theme-line .navbar-nav a:focus{background-color:transparent}.theme-line .main-links{padding-top:50px}.theme-line .main-links h3{margin-top:0;font-size:17px}.theme-line .main-links .links a{color:#888}.theme-line .main-links .links a:hover{text-decoration:none}.theme-line #category-columns,.theme-solid #category-columns{margin:50px 30px 0}.theme-line #category-columns h4{text-transform:uppercase;font-weight:300;color:#999;font-size:14px}.theme-line #category-columns ul{list-style:none;padding:0;margin-bottom:15px}.theme
 -line #category-columns ul li a{padding:4px 0;display:block;font-size:16px}.theme-line #category-columns ul .view-all{font-size:0.85em}.theme-line .docs-header{color:#999;overflow:hidden}.theme-line .docs-header h1{color:#444;margin-top:0;font-size:25px}.theme-line .btn-primary{border:0 none}.theme-line .main-content .nav-horizontal a{-webkit-box-shadow:0 0;box-shadow:0 0;border:0 none;background-color:#fff;-webkit-border-radius:0;border-radius:0;color:#aaa;padding:6px;margin:0 14px}.theme-line .main-content .nav-horizontal a:hover{color:#999;border-bottom:4px solid #ddd}.theme-line .main-content .nav-horizontal a.active{border-bottom:4px solid #888}.theme-line .sidebar-nav{color:#474a54;padding-bottom:30px}.theme-line .sidebar-nav ul{padding:0;list-style:none;font-size:13px;margin:3px 0 0}.theme-line .sidebar-nav ul li a{padding:3px 0;display:block;color:#666;position:relative;white-space:nowrap;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.theme-line .sidebar-n
 av ul li a:before{top:0;content:" ";display:block;width:6px;height:100%;position:absolute;left:-30px}.theme-line .sidebar-nav ul li a:hover{text-decoration:none}.theme-line .select li a{color:#666}.theme-line .select li a:hover,.theme-line .select .active{color:#ec1c24;background-color:white}.theme-line .sidebar-nav ul li .subcategory{padding-left:15px}.theme-line .sidebar-nav h4{margin-top:2em;font-weight:normal;text-transform:uppercase;font-size:11px;margin-bottom:10px;color:#bbb}.theme-line .sidebar-nav h4:first-child{margin-top:0}.theme-line .sidebar-nav .ask{width:100%;text-align:center;padding:10px}.theme-line .border-left .sidebar-nav{padding-left:15px}.theme-line .suggest{padding:4px;display:inline-block;font-size:12px}.header{padding:15px}.header .has-github{padding-right:136px}.header h1.navbar-brand{height:40px;width:200px;padding:0;margin:5px 15px 0 0}.header h1.navbar-brand a{text-indent:-99999px;background:no-repeat center center;display:block;width:100%;height:100%;-w
 ebkit-background-size:contain;-moz-background-size:contain;background-size:contain}.header .nav.navbar-nav.pull-right{position:relative;right:-30px}.header .nav.navbar-nav .not-link{padding:15px;display:inline-block}.header .nav.navbar-nav .stable,.header .nav.navbar-nav .beta,.header .nav.navbar-nav .private{font-size:9px;padding:3px 5px;display:inline-block;line-height:8px;-webkit-border-radius:3px;border-radius:3px;margin-left:6px;color:#fff;top:-2px;position:relative;opacity:0.6;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";filter:alpha(opacity=60)}.header .nav.navbar-nav a:hover>.stable,.header .nav.navbar-nav a:hover>.beta,.header .nav.navbar-nav a:hover>.private{opacity:1;-ms-filter:none;filter:none}.header .nav.navbar-nav .beta{background-color:#59c3d1}.header .nav.navbar-nav .stable{background-color:#41b841}.header .nav.navbar-nav .private{background-color:#333}.theme-line header{border-bottom:8px solid}.theme-line header h2{color:#aaa}.theme-line header 
 p{color:#666}.theme-line header{border-bottom-color:#ec1c24}.theme-line .navbar-nav{color:#888}.theme-line .navbar-nav a{color:#bbb}.theme-line header a.btn{background-color:#ec1c24}.theme-line header a.btn:hover{background-color:#950d12}.theme-line header .navbar-nav .tt-cursor{background-color:#ec1c24}.theme-line header .navbar-nav a:hover,.theme-line header .navbar-nav .open>a{color:#ec1c24}.theme-line .navbar-nav .active a{color:#ec1c24}.theme-line .navbar-nav .active a:hover{color:#950d12}.theme-line .main-links .links a:hover{color:#ec1c24}.theme-line .main-content a{color:#666}.theme-line .main-content a:hover{color:#950d12}.theme-line .sidebar-nav ul li a.active:before{background-color:#ec1c24}.theme-line .sidebar-nav ul li a.active{color:#ec1c24}.theme-line .sidebar-nav ul li a:hover,.theme-line .sidebar-nav ul li a.active:hover{color:#950d12}.theme-line .btn-primary{background-color:#ec1c24}.theme-line .btn-primary:hover{background-color:#950d12}.theme-line .main-content .
 nav-horizontal a.active{border-color:#ec1c24;color:#ec1c24}.theme-line .main-content .nav-horizontal a:hover{color:#950d12}.theme-line .main-content .nav-horizontal a.active:hover{border-color:#950d12}.theme-line header .navbar-nav a.active,.theme-line #versions-list li a:hover strong,.theme-line #versions-list li a.active .current,.theme-line #versions-list li a:active .current{color:#ec1c24}.theme-line.body-threes .section-right .threes-nav .btn-default:hover,.theme-line.page-docs.body-threes .section-right .threes-nav .pull-right a:hover{color:#ec1c24;border-color:#ec1c24}.theme-line .section-right{padding-left:30px}.body-overlap .main-content{margin-top:30px}.body-box .main-content,.body-overlap .main-content{padding:30px;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,0.1);box-shadow:0 0 0 1px rgba(0,0,0,0.1);background-color:#fff}body{font-weight:400;font-family:Roboto Slab, serif}h1,h2,h3,h4,h5,h6{font-weight:700;font-family:Roboto Slab, serif}.submit-vote.submit-vote-parent.voted a.
 submit-vote-button,.submit-vote.submit-vote-parent a.submit-vote-button:hover{background-color:#ec1c24}div.submit-vote.submit-vote-parent.voted a.submit-vote-button:hover{background-color:#950d12}a,.link .title{color:#ec1c24}a:hover,.link:hover .title{color:#950d12}.header h1.navbar-brand a{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli")}.header h1.navbar-brand{width:96px}.block-edit-parameters{text-align:right;padding-bottom:5px}.ng-table-pager{display:none}.container-footer{margin-top:20px}.vcenter{display:inline-block;vertical-align:middle;float:none}.vcenter2{position:relative;top:50%;transform:translateY(-50%)}.modal{display:block;overflow:hidden}.modal .close{position:absolute;top:24px;right:24px;float:none}.modal .modal-dialog{width:610px}.modal .modal-content{-webkit-border-radius:0;border-radius:0;background-color:#f7f7f7}.modal .modal-content .modal-header{background-color:#fff;text-align:center;color:#555;padding:24px;font-family:"myriad-pr
 o",sans-serif}.modal .modal-content .modal-header h4{font-family:"myriad-pro",sans-serif;font-size:22px}.modal .modal-content .modal-header h4 .fa{display:block;font-size:41px;color:#ddd;margin-bottom:5px}.modal .modal-content .modal-header p{color:#aaa;font-size:1em;margin:3px 0 0}.modal .modal-content .modal-spacer{padding:10px 10px 0 10px}.modal .modal-content .modal-footer{margin-top:0}.modal-body{padding-top:30px}h1.ignite-logo{background-image:url("https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli")}.st-sort-ascent:after{font-family:FontAwesome, serif;content:'\f077'}.st-sort-descent:after{font-family:FontAwesome, serif;content:'\f078'}.block-display-image img{max-width:100%;max-height:450px;margin:auto;display:block}.greedy{min-height:200px;height:calc(100vh - 230px)}@media (min-width:768px){.navbar-nav>li>a{padding-top:20px;padding-bottom:10px}}.details-row,.settings-row{display:block;margin:0.65em 0;line-height:28px}.details-row [class*="col-"],.settings-row [class*="
 col-"]{display:inline-block;vertical-align:middle;float:none;padding-left:0 !important;padding-right:0 !important}.details-row input[type="checkbox"],.settings-row input[type="checkbox"]{line-height:20px;margin-right:4px}.details-row .checkbox label,.settings-row .checkbox label{line-height:20px;vertical-align:middle}.details-row{padding-left:1.3em}button{margin-right:4px}h1,h2,h3{-webkit-user-select:none;font-weight:normal;line-height:1}h3{color:black;font-size:1.2em;margin-top:0;margin-bottom:1.5em}table tr:hover{cursor:pointer}.input-group{display:inline-block}.input-group .form-control{width:auto;margin-left:0;margin-right:0}.form-control{display:inline-block;text-align:left;padding:3px 6px;height:28px}.form-control button{text-align:left}.form-horizontal .control-label{padding-top:4px}button .caret{float:right;margin-left:0;margin-top:7px}.theme-line .panel-heading{padding:10px 10px;margin:0}.theme-line .panel-heading h3{margin-bottom:0}.theme-line .panel-heading h3>a{color:bla
 ck;cursor:pointer}.theme-line .panel-title a{color:#ec1c24}.theme-line .panel-title h3{margin-bottom:1.3em}.theme-line .panel-body{padding:0.65em 1.3em}.theme-line .main-content a.customize{color:#ec1c24;cursor:pointer}.theme-line .panel-collapse{margin:0}.theme-line .links table,.theme-line .links-edit table{display:table;table-layout:fixed;margin-bottom:20px}.theme-line .links table td,.theme-line .links-edit table td{padding-left:18px}.theme-line .links table .active a,.theme-line .links-edit table .active a{color:#ec1c24;font-weight:bold}.theme-line .links table a:hover,.theme-line .links-edit table a:hover{color:#950d12}.theme-line .links table a,.theme-line .links-edit table a{color:#666}.theme-line .links-edit table label{line-height:28px;color:#666}.btn{padding:3px 6px}.panel-title a{font-size:14px}.panel-details{margin-top:1.3em;margin-bottom:0.65em;padding:0.65em;border-radius:4px;border:thin dotted lightgrey}.tooltip.right .tooltip-arrow{border-right-color:#ec1c24}.toolti
 p>.tooltip-inner{max-width:400px;text-align:left;background-color:#ec1c24}label{font-weight:normal;line-height:14px;margin-bottom:0}.form-horizontal .checkbox{padding-top:0}.input-tip{display:block;overflow:hidden;padding-right:4px}.labelField{float:left;margin-right:4px}.tipField{float:right;line-height:28px;margin-right:18px}.tipLabel{margin-left:4px}.table-nowrap{table-layout:fixed}.td-overflow{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fa-edit{cursor:pointer}.fa-remove{margin-left:10px;cursor:pointer}label.required:after{color:#ec1c24;content:' *';display:inline}.blank{visibility:hidden}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53d301db/modules/webconfig/nodejs/public/stylesheets/style.less
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/public/stylesheets/style.less b/modules/webconfig/nodejs/public/stylesheets/style.less
index 48d91fb..52c4f67 100644
--- a/modules/webconfig/nodejs/public/stylesheets/style.less
+++ b/modules/webconfig/nodejs/public/stylesheets/style.less
@@ -797,6 +797,7 @@ button .caret {
 
 .panel-details {
   margin-top: 1.3em;
+  margin-bottom: 0.65em;
   padding: 0.65em;
 
   border-radius: 4px;
@@ -829,6 +830,11 @@ label {
   padding-right:4px;
 }
 
+.labelField {
+  float: left;
+  margin-right: 4px;
+}
+
 .tipField {
   float: right;
   line-height: @input-height;
@@ -859,8 +865,10 @@ label {
   cursor: pointer;
 }
 
-.required {
-  font-weight: bold;
+label.required:after {
+  color: #ec1c24;
+  content: ' *';
+  display:inline;
 }
 
 .blank {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53d301db/modules/webconfig/nodejs/views/includes/controls.jade
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/views/includes/controls.jade b/modules/webconfig/nodejs/views/includes/controls.jade
index 0865731..02d4564 100644
--- a/modules/webconfig/nodejs/views/includes/controls.jade
+++ b/modules/webconfig/nodejs/views/includes/controls.jade
@@ -44,11 +44,11 @@ mixin details-row
             .col-sm-8
                 +tipField('detail.tip')
                 .input-tip
-                    button.form-control(bs-select ng-model=detailMdl data-template='/select' data-placeholder='{{detail.placeholder}}' bs-options='item.value as item.label for item in {{detail.items}}')
+                    button.form-control(bs-select ng-model=detailMdl data-placeholder='{{detail.placeholder}}' bs-options='item.value as item.label for item in {{detail.items}}')
         div(ng-switch-when='dropdown-multiple')
             label(class=lblDetailClasses) {{detail.label}}:
             .col-sm-8
-                button.form-control(bs-select ng-model=detailMdl data-multiple='1' data-template='/select' data-placeholder='{{detail.placeholder}}' bs-options='item.value as item.label for item in {{detail.items}}')
+                button.form-control(bs-select ng-model=detailMdl data-multiple='1' data-placeholder='{{detail.placeholder}}' bs-options='item.value as item.label for item in {{detail.items}}')
             +tipField('detail.tip')
         div(ng-switch-when='table-simple')
             .details-label
@@ -81,27 +81,29 @@ mixin form-row
                     input.form-control(type='text' ng-if='!group.model' ng-model='backupItem[field.model]' placeholder='{{field.placeholder}}' ng-required='field.required')
                     input.form-control(type='text' ng-if='group.model' ng-model='backupItem[group.model][field.model]' placeholder='{{field.placeholder}}' ng-required='field.required')
         div(ng-switch-when='dropdown')
-            label(class=lblClasses) {{field.label}}:
+            label(class=lblClasses ng-class='{required: field.required}') {{field.label}}:
             .col-sm-4
                 +tipField('field.tip')
                 .input-tip
-                    button.form-control(bs-select ng-if='!group.model' ng-model='backupItem[field.model]' data-template='/select' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')
-                    button.form-control(bs-select ng-if='group.model' ng-model='backupItem[group.model][field.model]' data-template='/select' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')
+                    button.form-control(bs-select ng-if='!group.model' ng-model='backupItem[field.model]' ng-required='field.required' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}' )
+                    button.form-control(bs-select ng-if='group.model' ng-model='backupItem[group.model][field.model]' ng-required='field.required' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')
         div(ng-switch-when='dropdown-multiple')
-            label(class=lblClasses) {{field.label}}:
+            label(class=lblClasses ng-class='{required: field.required}') {{field.label}}:
             .col-sm-4
                 +tipField('field.tip')
                 .input-tip
-                    button.form-control(bs-select ng-model='backupItem[field.model]' data-multiple='1' data-template='/select' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')
+                    button.form-control(bs-select ng-model='backupItem[field.model]' data-multiple='1' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')
         div(ng-switch-when='dropdown-details')
-            label(class=lblClasses) {{field.label}}:
+            - var expanded = 'field.details[backupItem[field.group][field.model]].expanded'
+
+            label(class=lblClasses ng-class='{required: field.required}') {{field.label}}:
             .col-sm-4
                 +tipField('field.tip')
                 .input-tip
-                    button.form-control(bs-select ng-model=masterMdl data-template='/select' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')
-            a.customize(ng-if='field.customizable' ng-show=masterMdl ng-init='lbl="Show settings"' ng-click='field.expanded = !field.expanded; lbl = field.expanded ? "Hide settings" : lbl="Show settings"') {{lbl}}
-            .col-sm-6.panel-details(ng-show='field.expanded && #{masterMdl}')
-                .details-row(ng-repeat='detail in field.details[#{masterMdl}]')
+                    button.form-control(bs-select ng-model=masterMdl ng-required='field.required' data-placeholder='{{field.placeholder}}' bs-options='item.value as item.label for item in {{field.items}}')
+            a.customize(ng-show=masterMdl ng-init='' ng-click='#{expanded} = !#{expanded}') {{#{expanded} ? "Hide settings" : "Show settings"}}
+            .col-sm-6.panel-details(ng-show='#{expanded} && #{masterMdl}')
+                .details-row(ng-repeat='detail in field.details[#{masterMdl}].fields')
                     +details-row
         div(ng-switch-when='indexedTypes')
             div
@@ -130,7 +132,7 @@ mixin form-row
                                     a(ng-click='field.editIdx = $index; curValue = #{tblMdl}[$index]') {{$index + 1}}. {{item}}
                                     i.tipField.fa.fa-remove(ng-click='field.editIdx = -1; #{tblMdl}.splice($index, 1)')
                                 div(ng-show='field.editIdx == {{$index}}')
-                                    label(style='float: left') {{$index + 1}}.&nbsp
+                                    label.labelField {{$index + 1}}.
                                     i.tipField.fa.fa-floppy-o(ng-click='field.editIdx = -1; #{tblMdl}[$index]=curValue')
                                     .input-tip
                                         input.form-control(type='text' ng-model='curValue' placeholder='{{field.placeholder}}')