You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by up...@apache.org on 2015/11/04 12:16:45 UTC

svn commit: r1712532 - in /lucene/dev/trunk/solr/webapp/web: ./ css/angular/ js/angular/ js/angular/controllers/ partials/

Author: upayavira
Date: Wed Nov  4 11:16:45 2015
New Revision: 1712532

URL: http://svn.apache.org/viewvc?rev=1712532&view=rev
Log:
SOLR-8139 Rename schema-browser to schema and add managed schema support

Added:
    lucene/dev/trunk/solr/webapp/web/css/angular/schema.css
      - copied, changed from r1712531, lucene/dev/trunk/solr/webapp/web/css/angular/schema-browser.css
    lucene/dev/trunk/solr/webapp/web/js/angular/controllers/schema.js
      - copied, changed from r1712262, lucene/dev/trunk/solr/webapp/web/js/angular/controllers/schema-browser.js
    lucene/dev/trunk/solr/webapp/web/partials/schema.html
      - copied, changed from r1712262, lucene/dev/trunk/solr/webapp/web/partials/schema-browser.html
Removed:
    lucene/dev/trunk/solr/webapp/web/css/angular/schema-browser.css
    lucene/dev/trunk/solr/webapp/web/js/angular/controllers/schema-browser.js
    lucene/dev/trunk/solr/webapp/web/partials/schema-browser.html
Modified:
    lucene/dev/trunk/solr/webapp/web/css/angular/menu.css
    lucene/dev/trunk/solr/webapp/web/index.html
    lucene/dev/trunk/solr/webapp/web/js/angular/app.js
    lucene/dev/trunk/solr/webapp/web/js/angular/services.js
    lucene/dev/trunk/solr/webapp/web/partials/analysis.html

Modified: lucene/dev/trunk/solr/webapp/web/css/angular/menu.css
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/css/angular/menu.css?rev=1712532&r1=1712531&r2=1712532&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/css/angular/menu.css (original)
+++ lucene/dev/trunk/solr/webapp/web/css/angular/menu.css Wed Nov  4 11:16:45 2015
@@ -278,7 +278,7 @@ limitations under the License.
 .sub-menu .analysis a { background-image: url( ../../img/ico/funnel.png ); }
 .sub-menu .documents a { background-image: url( ../../img/ico/documents-stack.png ); }
 .sub-menu .files a { background-image: url( ../../img/ico/folder.png ); }
-.sub-menu .schema-browser a { background-image: url( ../../img/ico/book-open-text.png ); }
+.sub-menu .schema a { background-image: url( ../../img/ico/book-open-text.png ); }
 .sub-menu .replication a { background-image: url( ../../img/ico/node.png ); }
 .sub-menu .distribution a { background-image: url( ../../img/ico/node-select.png ); }
 .sub-menu .ping a { background-image: url( ../../img/ico/system-monitor.png ); }

Copied: lucene/dev/trunk/solr/webapp/web/css/angular/schema.css (from r1712531, lucene/dev/trunk/solr/webapp/web/css/angular/schema-browser.css)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/css/angular/schema.css?p2=lucene/dev/trunk/solr/webapp/web/css/angular/schema.css&p1=lucene/dev/trunk/solr/webapp/web/css/angular/schema-browser.css&r1=1712531&r2=1712532&rev=1712532&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/css/angular/schema-browser.css (original)
+++ lucene/dev/trunk/solr/webapp/web/css/angular/schema.css Wed Nov  4 11:16:45 2015
@@ -17,186 +17,186 @@ limitations under the License.
 
 */
 
-#content #schema-browser .loader
+#content #schema .loader
 {
   background-position: 0 50%;
   padding-left: 21px;   
 }
 
-#content #schema-browser.loaded
+#content #schema.loaded
 {
   background-image: url( ../../img/div.gif );
   background-position: 21% 0;
   background-repeat: repeat-y;
 }
 
-#content #schema-browser #data
+#content #schema #data
 {
   float: right;
   width: 78%;
 }
 
-#content #schema-browser #related
+#content #schema #related
 {
   float: left;
   width: 20%;
 }
 
-#content #schema-browser #related select
+#content #schema #related select
 {
   width: 100%;
 }
 
-#content #schema-browser #related select optgroup
+#content #schema #related select optgroup
 {
   font-style: normal;
   padding: 5px;
 }
 
-#content #schema-browser #related select option
+#content #schema #related select option
 {
   padding-left: 10px;
 }
 
-#content #schema-browser #related #f-df-t
+#content #schema #related #f-df-t
 {
   border-bottom: 1px solid #f0f0f0;
   padding-bottom: 15px;
 }
 
-#content #schema-browser #related .ukf-dsf dt
+#content #schema #related .ukf-dsf dt
 {
 }
 
-#content #schema-browser #related dl
+#content #schema #related dl
 {
   margin-top: 15px;
 }
 
-#content #schema-browser #related dl dt,
-#content #schema-browser #related dl dd a
+#content #schema #related dl dt,
+#content #schema #related dl dd a
 {
   color: #c0c0c0;
 }
 
-#content #schema-browser #related dl dt
+#content #schema #related dl dt
 {
   font-weight: bold;
   margin-top: 5px;
 }
 
-#content #schema-browser #related dl dd a
+#content #schema #related dl dd a
 {
   display: block;
   padding-left: 10px;
 }
 
-#content #schema-browser #related dl dd a:hover
+#content #schema #related dl dd a:hover
 {
   background-color: #f8f8f8;
 }
 
-#content #schema-browser #related .field .field,
-#content #schema-browser #related .field .field a,
-#content #schema-browser #related .dynamic-field .dynamic-field,
-#content #schema-browser #related .dynamic-field .dynamic-field a,
-#content #schema-browser #related .type .type,
-#content #schema-browser #related .type .type a,
-#content #schema-browser #related .active,
-#content #schema-browser #related .active a
+#content #schema #related .field .field,
+#content #schema #related .field .field a,
+#content #schema #related .dynamic-field .dynamic-field,
+#content #schema #related .dynamic-field .dynamic-field a,
+#content #schema #related .type .type,
+#content #schema #related .type .type a,
+#content #schema #related .active,
+#content #schema #related .active a
 {
   color: #333;
 }
 
-#content #schema-browser #related .copyfield,
-#content #schema-browser #related .copyfield a
+#content #schema #related .copyfield,
+#content #schema #related .copyfield a
 {
   color: #666;
 }
 
-#content #schema-browser #data
+#content #schema #data
 {
 }
 
-#content #schema-browser #data #index dt
+#content #schema #data #index dt
 {
   float: left;
   margin-right: 5px;
   width: 150px;
 }
 
-#content #schema-browser #data #field .field-options
+#content #schema #data #field .field-options
 {
   margin-bottom: 10px;
 }
 
-#content #schema-browser #data #field .field-options .head h2
+#content #schema #data #field .field-options .head h2
 {
   padding-left: 5px;
 }
 
-#content #schema-browser #data #field .partial
+#content #schema #data #field .partial
 {
 }
 
-#content #schema-browser #data #field .partial p
+#content #schema #data #field .partial p
 {
   background-image: url( ../../img/ico/exclamation-button.png );
   background-position: 0 50%;
   padding-left: 21px;
 }
 
-#content #schema-browser #data #field .field-options .options dt,
-#content #schema-browser #data #field .field-options .options dd
+#content #schema #data #field .field-options .options dt,
+#content #schema #data #field .field-options .options dd
 {
   float: left;
 }
 
-#content #schema-browser #data #field .field-options .options dt
+#content #schema #data #field .field-options .options dt
 {
   clear: left;
   margin-right: 5px;
   width: 100px;
 }
 
-#content #schema-browser #data #field .field-options .flags
+#content #schema #data #field .field-options .flags
 {
   margin-top: 10px;
   margin-bottom: 20px;
 }
 
-#content #schema-browser #data #field .field-options .flags thead td
+#content #schema #data #field .field-options .flags thead td
 {
   color: #c0c0c0;
   padding-right: 5px;
   width: 100px;
 }
 
-#content #schema-browser #data #field .field-options .flags tbody td,
-#content #schema-browser #data #field .field-options .flags th
+#content #schema #data #field .field-options .flags tbody td,
+#content #schema #data #field .field-options .flags th
 {
   padding: 2px 5px;
 }
 
-#content #schema-browser #data #field .field-options .flags thead td,
-#content #schema-browser #data #field .field-options .flags tbody th
+#content #schema #data #field .field-options .flags thead td,
+#content #schema #data #field .field-options .flags tbody th
 {
   padding-left: 0;
 }
 
-#content #schema-browser #data #field .field-options .flags thead th,
-#content #schema-browser #data #field .field-options .flags tbody td
+#content #schema #data #field .field-options .flags thead th,
+#content #schema #data #field .field-options .flags tbody td
 {
   border-left: 1px solid #f0f0f0;
 }
 
-#content #schema-browser #data #field .field-options .flags tbody th,
-#content #schema-browser #data #field .field-options .flags tbody td
+#content #schema #data #field .field-options .flags tbody th,
+#content #schema #data #field .field-options .flags tbody td
 {
   border-top: 1px solid #f0f0f0;
 }
 
-#content #schema-browser #data #field .field-options .flags tbody .check
+#content #schema #data #field .field-options .flags tbody .check
 {
   background-color: #fafdfa;
   background-image: url( ../../img/ico/tick.png );
@@ -204,29 +204,29 @@ limitations under the License.
   text-align: center;
 }
 
-#content #schema-browser #data #field .field-options .flags tbody .check span
+#content #schema #data #field .field-options .flags tbody .check span
 {
 }
 
-#content #schema-browser #data #field .field-options .flags tbody .text
+#content #schema #data #field .field-options .flags tbody .text
 {
   color: #c0c0c0;
 }
 
-#content #schema-browser #data #field .field-options .analyzer,
-#content #schema-browser #data #field .field-options .analyzer li,
-#content #schema-browser #data #field .field-options .analyzer ul,
-#content #schema-browser #data #field .field-options .analyzer ul li
+#content #schema #data #field .field-options .analyzer,
+#content #schema #data #field .field-options .analyzer li,
+#content #schema #data #field .field-options .analyzer ul,
+#content #schema #data #field .field-options .analyzer ul li
 {
 }
 
-#content #schema-browser #data #field .field-options .analyzer p,
-#content #schema-browser #data #field .field-options .analyzer dl
+#content #schema #data #field .field-options .analyzer p,
+#content #schema #data #field .field-options .analyzer dl
 {
   float: left;
 }
 
-#content #schema-browser #data #field .field-options .analyzer p
+#content #schema #data #field .field-options .analyzer p
 {
   margin-right: 5px;
   text-align: right;
@@ -234,36 +234,36 @@ limitations under the License.
   white-space: pre;
 }
 
-#content #schema-browser #data #field .field-options .analyzer p a
+#content #schema #data #field .field-options .analyzer p a
 {
   cursor: auto;
 }
 
-#content #schema-browser #data #field .field-options .analyzer p a.analysis
+#content #schema #data #field .field-options .analyzer p a.analysis
 {
   cursor: pointer;
   display: block;
 }
 
-#content #schema-browser #data #field .field-options .analyzer p a.analysis span
+#content #schema #data #field .field-options .analyzer p a.analysis span
 {
   background-image: url( ../../img/ico/question-white.png );
   background-position: 0 50%;
   padding-left: 21px;
 }
 
-#content #schema-browser #data #field .field-options .analyzer p a.analysis:hover span
+#content #schema #data #field .field-options .analyzer p a.analysis:hover span
 {
   background-image: url( ../../img/ico/question.png );
   color: #008;
 }
 
-#content #schema-browser #data #field .field-options .analyzer a
+#content #schema #data #field .field-options .analyzer a
 {
   cursor: auto;
 }
 
-#content #schema-browser #data #field .field-options .analyzer .toggle
+#content #schema #data #field .field-options .analyzer .toggle
 {
   background-image: url( ../../img/ico/chevron-small-expand.png );
   background-position: 100% 50%;
@@ -272,38 +272,38 @@ limitations under the License.
   padding-right: 21px;
 }
 
-#content #schema-browser #data #field .field-options .analyzer .open .toggle
+#content #schema #data #field .field-options .analyzer .open .toggle
 {
   background-image: url( ../../img/ico/chevron-small.png );
 }
 
-#content #schema-browser #data #field .field-options .analyzer li
+#content #schema #data #field .field-options .analyzer li
 {
   border-top: 1px solid #f0f0f0;
   margin-top: 10px;
   padding-top: 10px;
 }
 
-#content #schema-browser #data #field .field-options .analyzer ul
+#content #schema #data #field .field-options .analyzer ul
 {
   clear: left;
   margin-left: 55px;
   padding-top: 5px;
 }
 
-#content #schema-browser #data #field .field-options .analyzer .open ul
+#content #schema #data #field .field-options .analyzer .open ul
 {
   display: block;
 }
 
-#content #schema-browser #data #field .field-options .analyzer ul li
+#content #schema #data #field .field-options .analyzer ul li
 {
   border-top: 1px solid #f8f8f8;
   margin-top: 5px;
   padding-top: 5px;
 }
 
-#content #schema-browser #data #field .field-options .analyzer ul p
+#content #schema #data #field .field-options .analyzer ul p
 {
   color: #999;
   margin-right: 5px;
@@ -311,12 +311,12 @@ limitations under the License.
   width: 70px;
 }
 
-#content #schema-browser #data #field .field-options .analyzer ul dd
+#content #schema #data #field .field-options .analyzer ul dd
 {
   margin-left: 20px;
 }
 
-#content #schema-browser #data #field .field-options .analyzer ul dd
+#content #schema #data #field .field-options .analyzer ul dd
 {
   background-image: url( ../../img/ico/document-list.png );
   background-position: 0 50%;
@@ -324,39 +324,39 @@ limitations under the License.
   padding-left: 21px;
 }
 
-#content #schema-browser #data #field .field-options .analyzer ul dd.ico-0
+#content #schema #data #field .field-options .analyzer ul dd.ico-0
 {
   background-image: url( ../../img/ico/slash.png );
 }
 
-#content #schema-browser #data #field .field-options .analyzer ul dd.ico-1
+#content #schema #data #field .field-options .analyzer ul dd.ico-1
 {
   background-image: url( ../../img/ico/tick.png );
 }
 
-#content #schema-browser #data #field .head
+#content #schema #data #field .head
 {
   margin-bottom: 5px;
 }
 
-#content #schema-browser #data #field .terminfo-holder
+#content #schema #data #field .terminfo-holder
 {
   border-top: 1px solid #c0c0c0;
   padding-top: 10px;
 }
 
-#content #schema-browser #data #field .terminfo-holder .trigger
+#content #schema #data #field .terminfo-holder .trigger
 {
   float: left;
   width: 140px;
 }
 
-#content #schema-browser #data #field .terminfo-holder .trigger button span
+#content #schema #data #field .terminfo-holder .trigger button span
 {
   background-image: url( ../../img/ico/information.png );
 }
 
-#content #schema-browser #data #field .terminfo-holder .status
+#content #schema #data #field .terminfo-holder .status
 {
   border-left: 1px solid #f0f0f0;
   float: left;
@@ -364,21 +364,21 @@ limitations under the License.
   padding-right: 20px;
 }
 
-#content #schema-browser #data #field .terminfo-holder.disabled .trigger button span
+#content #schema #data #field .terminfo-holder.disabled .trigger button span
 {
   background-image: url( ../../img/ico/prohibition.png );
 }
 
-#content #schema-browser #data #field .terminfo-holder.disabled .status
+#content #schema #data #field .terminfo-holder.disabled .status
 {
   display: block;
 }
 
-#content #schema-browser #data #field .terminfo-holder .trigger .autoload
+#content #schema #data #field .terminfo-holder .trigger .autoload
 {
 }
 
-#content #schema-browser #data #field .terminfo-holder.loaded .trigger .autoload
+#content #schema #data #field .terminfo-holder.loaded .trigger .autoload
 {
   background-image: url( ../../img/ico/ui-check-box-uncheck.png );
   background-position: 0 50%;
@@ -388,19 +388,19 @@ limitations under the License.
   padding-left: 21px;
 }
 
-#content #schema-browser #data #field .terminfo-holder .trigger .autoload:hover
+#content #schema #data #field .terminfo-holder .trigger .autoload:hover
 {
   color: #008;
 }
 
-#content #schema-browser #data #field .terminfo-holder .trigger .autoload.on
+#content #schema #data #field .terminfo-holder .trigger .autoload.on
 {
   background-image: url( ../../img/ico/ui-check-box.png );
   color: #333;
 }
 
-#content #schema-browser #data #field .topterms-holder,
-#content #schema-browser #data #field .histogram-holder
+#content #schema #data #field .topterms-holder,
+#content #schema #data #field .histogram-holder
 {
   border-left: 1px solid #f0f0f0;
   float: left;
@@ -408,7 +408,7 @@ limitations under the License.
   padding-right: 20px;
 }
 
-#content #schema-browser #data #field .topterms-holder .head input
+#content #schema #data #field .topterms-holder .head input
 {
   height: 18px;
   line-height: 16px;
@@ -416,17 +416,17 @@ limitations under the License.
   width: 30px;
 }
 
-#content #schema-browser #data #field .topterms-holder .head .max-holder
+#content #schema #data #field .topterms-holder .head .max-holder
 {
   color: #c0c0c0;
 }
 
-#content #schema-browser #data #field .topterms-holder .head .max-holder:hover .max
+#content #schema #data #field .topterms-holder .head .max-holder:hover .max
 {
   color: #008;
 }
 
-#content #schema-browser #data #field .topterms-holder .head #query_link
+#content #schema #data #field .topterms-holder .head #query_link
 {
   background-image: url( ../../img/ico/question-white.png );
   background-position: 0 50%;
@@ -435,37 +435,37 @@ limitations under the License.
   margin-left: 5px;
 }
 
-#content #schema-browser #data #field .topterms-holder .head #query_link:hover
+#content #schema #data #field .topterms-holder .head #query_link:hover
 {
   background-image: url( ../../img/ico/question.png );
 }
 
 
-#content #schema-browser #data #field .topterms-holder .head #query_link span
+#content #schema #data #field .topterms-holder .head #query_link span
 {
   visibility: hidden;
 }
 
-#content #schema-browser #data #field .topterms-holder .head #query_link:hover span
+#content #schema #data #field .topterms-holder .head #query_link:hover span
 {
   visibility: visible;
 }
 
-#content #schema-browser .topterms-holder li
+#content #schema .topterms-holder li
 {
   border-top: 1px solid  #999;
   margin-bottom: 5px;
 }
 
 /* possible overwrite with inline style */
-#content #schema-browser .topterms-holder li p
+#content #schema .topterms-holder li p
 {
   background-color:  #999;
   color: #fff;
   float: left;
 }
 
-#content #schema-browser .topterms-holder li p span
+#content #schema .topterms-holder li p span
 {
   display: block;
   padding-right: 2px;
@@ -473,66 +473,66 @@ limitations under the License.
 }
 
 /* possible overwrite with inline style */
-#content #schema-browser .topterms-holder li ul
+#content #schema .topterms-holder li ul
 {
   margin-left: 30px;
 }
 
-#content #schema-browser .topterms-holder li li
+#content #schema .topterms-holder li li
 {
   border-top: 0;
   margin-bottom: 0;
   white-space: nowrap;
 }
 
-#content #schema-browser .topterms-holder li li.odd
+#content #schema .topterms-holder li li.odd
 {
   background-color: #f0f0f0;
 }
 
-#content #schema-browser .topterms-holder li li a
+#content #schema .topterms-holder li li a
 {
   display: block;
   padding-left: 2px;
   padding-right: 2px;
 }
 
-#content #schema-browser .topterms-holder li li a:hover
+#content #schema .topterms-holder li li a:hover
 {
   background-color: #c0c0c0;
 }
 
-#content #schema-browser #data #field .histogram-holder ul
+#content #schema #data #field .histogram-holder ul
 {
   margin-left: 25px;
 }
 
-#content #schema-browser #data #field .histogram-holder li
+#content #schema #data #field .histogram-holder li
 {
   margin-bottom: 2px;
   position: relative;
   width: 150px;
 }
 
-#content #schema-browser #data #field .histogram-holder li.odd
+#content #schema #data #field .histogram-holder li.odd
 {
   background-color: #f0f0f0;
 }
 
-#content #schema-browser #data #field .histogram-holder li dl,
-#content #schema-browser #data #field .histogram-holder li dt
+#content #schema #data #field .histogram-holder li dl,
+#content #schema #data #field .histogram-holder li dt
 {
   padding-top: 1px;
   padding-bottom: 1px;
 }
 
-#content #schema-browser #data #field .histogram-holder li dl
+#content #schema #data #field .histogram-holder li dl
 {
   background-color: #c0c0c0;
   min-width: 1px;
 }
 
-#content #schema-browser #data #field .histogram-holder li dt
+#content #schema #data #field .histogram-holder li dt
 {
   color: #a0a0a0;
   position: absolute;
@@ -541,14 +541,14 @@ limitations under the License.
   top: 0px;
 }
 
-#content #schema-browser #data #field .histogram-holder li dt span
+#content #schema #data #field .histogram-holder li dt span
 {
   display: block;
   padding-right: 4px;
   text-align: right;
 }
 
-#content #schema-browser #data #field .histogram-holder li dd
+#content #schema #data #field .histogram-holder li dd
 {
   clear: left;
   float: left;
@@ -556,12 +556,149 @@ limitations under the License.
   white-space: nowrap;
 }
 
-#content #schema-browser #data #field .histogram-holder li:hover dl
+#content #schema #data #field .histogram-holder li:hover dl
 {
   background-color: #b0b0b0;
 }
 
-#content #schema-browser #data #field .histogram-holder li:hover dt
+#content #schema #data #field .histogram-holder li:hover dt
 {
   color: #333;
 }
+
+#content #schema #actions {
+  margin-bottom: 20px;
+  min-height: 30px;
+}
+
+#content #schema .actions #addField span { background-image: url( ../../img/ico/document-list.png ); }
+#content #schema .actions #addDynamicField span { background-image: url( ../../img/ico/documents-stack.png ); }
+#content #schema .actions #addCopyField span { background-image: url( ../../img/ico/document-import.png ); }
+
+#content #schema .actions div.action
+{
+  width: 320px;
+  background-color: #fff;
+  border: 1px solid #f0f0f0;
+  box-shadow: 5px 5px 10px #c0c0c0;
+  -moz-box-shadow: 5px 5px 10px #c0c0c0;
+  -webkit-box-shadow: 5px 5px 10px #c0c0c0;
+  position: absolute;
+  left: 160px;
+  top: 50px;
+  padding: 10px;
+  z-index: 2;
+}
+
+#content #schema .actions p
+{
+  padding-bottom: 8px;
+}
+
+#content #schema .actions label
+{
+  float: left;
+  padding-top: 3px;
+  padding-bottom: 3px;
+  text-align: right;
+  width: 25%;
+}
+
+#content #schema .actions input,
+#content #schema .actions select,
+#content #schema .actions .buttons,
+#content #schema .actions .note span
+{
+  float: right;
+  width: 71%;
+}
+
+#content #schema .actions label.checkbox {
+  margin-left: 27%;
+  text-align: left;
+  width: 73%;
+  padding: 0px;
+  margin-top: 0px;
+}
+#content #schema .actions .checkbox input {
+  float: none;
+  width: auto;
+}
+
+#content #schema .add_showhide {
+  background-image: url( ../../img/ico/chevron-small-expand.png );
+  background-position: 100% 50%;
+  cursor: pointer;
+  padding-right: 21px;
+}
+
+#content #schema .add_showhide.open {
+    background-image: url( ../../img/ico/chevron-small.png );
+}
+
+#content #schema label
+{
+  cursor: pointer;
+  display: block;
+  margin-top: 5px;
+  width: 100%;
+}
+
+#content #schema .checkbox
+{
+  margin-bottom: 0;
+  width: auto;
+}
+
+#content #schema .chosen-container {
+  margin-left: 6px;
+  width: 100%;
+}
+#content #schema .chosen-drop input,
+#content #schema .chosen-results {
+  width: 100% !important;
+}
+
+#content #schema button span
+{
+  background-image: url( ../../img/ico/cross.png );
+}
+#content #schema button.submit span
+{
+  background-image: url( ../../img/ico/tick.png );
+}
+
+#content #schema .error
+{
+  background-image: url( ../../img/ico/cross-button.png );
+  background-position: 22% 1px;
+  color: #c00;
+  font-weight: bold;
+  margin-bottom: 10px;
+}
+
+#content #schema #actions .error span
+{
+  float: right;
+  width: 71%;
+  padding-left: 3px;
+  padding-right: 3px;
+}
+
+#content #schema .delete-field button span {
+  background-image: url( ../../img/ico/cross.png );
+}
+
+#content #schema span.rem {
+  background-image: url( ../../img/ico/cross.png );
+  background-position: 100% 50%;
+  cursor: pointer;
+  padding-right: 21px;
+  right:10px;
+  float:right;
+}
+
+#content #schema .copyfield .updatable a {
+  float:left;
+  width:80%;
+}
\ No newline at end of file

Modified: lucene/dev/trunk/solr/webapp/web/index.html
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/index.html?rev=1712532&r1=1712531&r2=1712532&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/index.html (original)
+++ lucene/dev/trunk/solr/webapp/web/index.html Wed Nov  4 11:16:45 2015
@@ -39,7 +39,7 @@ limitations under the License.
   <link rel="stylesheet" type="text/css" href="css/angular/documents.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/query.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/replication.css?_=${version}">
-  <link rel="stylesheet" type="text/css" href="css/angular/schema-browser.css?_=${version}">
+  <link rel="stylesheet" type="text/css" href="css/angular/schema.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/segments.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/threads.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/chosen.css?_=${version}">
@@ -74,7 +74,7 @@ limitations under the License.
   <script src="js/angular/controllers/query.js"></script>
   <script src="js/angular/controllers/plugins.js"></script>
   <script src="js/angular/controllers/replication.js"></script>
-  <script src="js/angular/controllers/schema-browser.js"></script>
+  <script src="js/angular/controllers/schema.js"></script>
   <script src="js/angular/controllers/segments.js"></script>
 
 </head>
@@ -185,7 +185,7 @@ limitations under the License.
               <li class="documents" ng-class="{active:page=='documents'}"><a href="#/{{currentCollection.name}}/documents"><span>Documents</span></a></li>
               <li class="files" ng-class="{active:page=='files'}"><a href="#/{{currentCollection.name}}/files"><span>Files</span></a></li>
               <li class="query" ng-class="{active:page=='query'}"><a href="#/{{currentCollection.name}}/query"><span>Query</span></a></li>
-              <li class="schema-browser" ng-class="{active:page=='schema-browser'}"><a href="#/{{currentCollection.name}}/schema-browser"><span>Schema Browser</span></a></li>
+              <li class="schema" ng-class="{active:page=='schema'}"><a href="#/{{currentCollection.name}}/schema"><span>Schema</span></a></li>
         </ul>
           </div>
           <div id="core-selector">
@@ -212,7 +212,7 @@ limitations under the License.
               <li class="plugins" ng-class="{active:page=='plugins'}"><a href="#/{{currentCore.name}}/plugins"><span>Plugins / Stats</span></a></li>
               <li ng-hide="isCloudEnabled" class="query" ng-class="{active:page=='query'}"><a href="#/{{currentCore.name}}/query"><span>Query</span></a></li>
               <li class="replication" ng-class="{active:page=='replication'}"><a href="#/{{currentCore.name}}/replication"><span>Replication</span></a></li>
-              <li ng-hide="isCloudEnabled" class="schema-browser" ng-class="{active:page=='schema-browser'}"><a href="#/{{currentCore.name}}/schema-browser"><span>Schema Browser</span></a></li>
+              <li ng-hide="isCloudEnabled" class="schema" ng-class="{active:page=='schema'}"><a href="#/{{currentCore.name}}/schema"><span>Schema</span></a></li>
               <li class="segments" ng-class="{active:page=='segments'}"><a href="#/{{currentCore.name}}/segments"><span>Segments info</span></a></li>
       </ul>
           </div>

Modified: lucene/dev/trunk/solr/webapp/web/js/angular/app.js
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/js/angular/app.js?rev=1712532&r1=1712531&r2=1712532&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/js/angular/app.js (original)
+++ lucene/dev/trunk/solr/webapp/web/js/angular/app.js Wed Nov  4 11:16:45 2015
@@ -121,9 +121,9 @@ solrAdminApp.config([
         templateUrl: 'partials/dataimport.html',
         controller: 'DataImportController'
       }).
-      when('/:core/schema-browser', {
-        templateUrl: 'partials/schema-browser.html',
-        controller: 'SchemaBrowserController'
+      when('/:core/schema', {
+        templateUrl: 'partials/schema.html',
+        controller: 'SchemaController'
       }).
       when('/:core/segments', {
         templateUrl: 'partials/segments.html',
@@ -156,6 +156,30 @@ solrAdminApp.config([
     }
   };
 })
+.directive('escapePressed', function () {
+    return function (scope, element, attrs) {
+        element.bind("keydown keypress", function (event) {
+            if(event.which === 27) {
+                scope.$apply(function (){
+                    scope.$eval(attrs.escapePressed);
+                });
+                event.preventDefault();
+            }
+        });
+    };
+})
+.directive('focusWhen', function($timeout) {
+  return {
+    link: function(scope, element, attrs) {
+      scope.$watch(attrs.focusWhen, function(value) {
+        if(value === true) {
+          $timeout(function() {
+            element[0].focus();
+          }, 100);
+        }
+      });
+    }
+  };
 .directive('scrollableWhenSmall', function($window) {
   return {
     link: function(scope, element, attrs) {

Copied: lucene/dev/trunk/solr/webapp/web/js/angular/controllers/schema.js (from r1712262, lucene/dev/trunk/solr/webapp/web/js/angular/controllers/schema-browser.js)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/js/angular/controllers/schema.js?p2=lucene/dev/trunk/solr/webapp/web/js/angular/controllers/schema.js&p1=lucene/dev/trunk/solr/webapp/web/js/angular/controllers/schema-browser.js&r1=1712262&r2=1712532&rev=1712532&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/js/angular/controllers/schema-browser.js (original)
+++ lucene/dev/trunk/solr/webapp/web/js/angular/controllers/schema.js Wed Nov  4 11:16:45 2015
@@ -17,14 +17,13 @@
 
 var cookie_schema_browser_autoload = 'schema-browser_autoload';
 
-solrAdminApp.controller('SchemaBrowserController',
-    function($scope, $routeParams, $location, $cookies, Luke, Constants) {
-        $scope.resetMenu("schema-browser", Constants.IS_COLLECTION_PAGE);
+solrAdminApp.controller('SchemaController',
+    function($scope, $routeParams, $location, $cookies, $timeout, Luke, Constants, Schema, Config) {
+        $scope.resetMenu("schema", Constants.IS_COLLECTION_PAGE);
 
         $scope.refresh = function () {
             Luke.schema({core: $routeParams.core}, function (schema) {
-                Luke.index({core: $routeParams.core}, function (index) {
-
+                Luke.raw({core: $routeParams.core}, function (index) {
                     var data = mergeIndexAndSchemaData(index, schema.schema);
 
                     $scope.fieldsAndTypes = getFieldsAndTypes(data);
@@ -42,8 +41,12 @@ solrAdminApp.controller('SchemaBrowserCo
                         var field = data.fields[$scope.name];
                         leftbar.types = [field.type];
                         if (field.dynamicBase) leftbar.dynamicFields = [field.dynamicBase];
-                        if (field.copySources && field.copySources.length>0) leftbar.copyFieldSources = field.copySources.sort();
-                        if (field.copyDests && field.copyDests.length>0) leftbar.copyFieldDests = field.copyDests.sort();
+                        if (field.copySources && field.copySources.length>0) {
+                            leftbar.copyFieldSources = sortedObjectArray(field.copySources.sort());
+                        }
+                        if (field.copyDests && field.copyDests.length>0) {
+                            leftbar.copyFieldDests = sortedObjectArray(field.copyDests.sort());
+                        }
                         $scope.fieldOrType = "field=" + $scope.name;
                     } else if (search["dynamic-field"]) {
                         $scope.selectedType = "Dynamic Field";
@@ -70,15 +73,20 @@ solrAdminApp.controller('SchemaBrowserCo
                     $scope.isDefaultSearchField = ($scope.selectedType == "Field" && $scope.name == $scope.defaultSearchField);
                     $scope.isUniqueKeyField = ($scope.selectedType == "Field" && $scope.name == $scope.uniqueKeyField);
 
-                    $scope.display = getFieldProperties(index, $routeParams.core, $scope.is, $scope.name);
+                    $scope.display = getFieldProperties(data, $routeParams.core, $scope.is, $scope.name);
                     $scope.analysis = getAnalysisInfo(data, $scope.is, $scope.name);
 
                     $scope.isAutoload = $cookies[cookie_schema_browser_autoload] == "true";
                     if ($scope.isAutoload) {
                         $scope.toggleTerms();
                     }
+
+                    $scope.types = Object.keys(schema.schema.types);
                 });
             });
+            Config.get({core: $routeParams.core}, function(data) {
+                $scope.isSchemaUpdatable = data.config.schemaFactory.class == "ManagedIndexSchemaFactory";
+            });
         };
         $scope.refresh();
 
@@ -123,6 +131,161 @@ solrAdminApp.controller('SchemaBrowserCo
             $cookies[cookie_schema_browser_autoload] = $scope.isAutoload;
             console.log("cookie: " + $cookies[cookie_schema_browser_autoload]);
         }
+
+        $scope.hideAll = function() {
+            $scope.showAddField = false;
+            $scope.showAddDynamicField = false;
+            $scope.showAddCopyField = false;
+        }
+
+        $scope.toggleAddField = function() {
+            if ($scope.showAddField && $scope.adding == "field") {
+                $scope.hideAll();
+            } else {
+                $scope.hideAll();
+                $scope.showAddField = true;
+                $scope.adding = "field";
+
+                $scope.newField = {
+                    stored: "true",
+                    indexed: "true"
+                }
+                delete $scope.addErrors;
+            }
+        }
+
+        $scope.addField = function() {
+            delete $scope.addErrors;
+            var data = {"add-field": $scope.newField};
+            Schema.post({core: $routeParams.core}, data, function(data) {
+                if (data.errors) {
+                    $scope.addErrors = data.errors[0].errorMessages;
+                    if (typeof $scope.addErrors === "string") {
+                        $scope.addErrors = [$scope.addErrors];
+                    }
+                } else {
+                    $scope.added = true;
+                    $timeout(function() {
+                        $scope.showAddField = false;
+                        $scope.added = false;
+                        $scope.refresh();
+                    }, 1500);
+                }
+            });
+        }
+
+        $scope.toggleAddDynamicField = function() {
+            if ($scope.showAddField && $scope.adding == "dynamicField") {
+                $scope.hideAll();
+            } else {
+                $scope.hideAll();
+                $scope.showAddField = true;
+                $scope.adding = "dynamicField";
+
+                $scope.newField = {
+                    stored: "true",
+                    indexed: "true"
+                }
+                delete $scope.addErrors;
+            }
+        }
+
+        $scope.addDynamicField = function() {
+            delete $scope.addErrors;
+            var data = {"add-dynamic-field": $scope.newField};
+            Schema.post({core: $routeParams.core}, data, function(data) {
+                if (data.errors) {
+                    $scope.addErrors = data.errors[0].errorMessages;
+                    if (typeof $scope.addErrors === "string") {
+                        $scope.addErrors = [$scope.addErrors];
+                    }
+                } else {
+                    $scope.added = true;
+                    $timeout(function() {
+                        $scope.showAddField = false;
+                        $scope.added = false;
+                        $scope.refresh();
+                    }, 1500);
+                }
+            });
+        }
+
+        $scope.toggleAddCopyField = function() {
+            if ($scope.showAddCopyField) {
+                $scope.hideAll();
+            } else {
+                $scope.hideAll();
+                $scope.showAddCopyField = true;
+
+                $scope.copyField = {};
+                delete $scope.addCopyFieldErrors;
+            }
+        }
+        $scope.addCopyField = function() {
+            delete $scope.addCopyFieldErrors;
+            var data = {"add-copy-field": $scope.copyField};
+            Schema.post({core: $routeParams.core}, data, function(data) {
+                if (data.errors) {
+                    $scope.addCopyFieldErrors = data.errors[0].errorMessages;
+                    if (typeof $scope.addCopyFieldErrors === "string") {
+                        $scope.addCopyFieldErrors = [$scope.addCopyFieldErrors];
+                    }
+                } else {
+                    $scope.showAddCopyField = false;
+                    $timeout($scope.refresh, 1500);
+                }
+            });
+        }
+
+        $scope.toggleDelete = function() {
+            if ($scope.showDelete) {
+                $scope.showDelete = false;
+            } else {
+                if ($scope.is.field) {
+                    $scope.deleteData = {'delete-field': {name: $scope.name}};
+                } else if ($scope.is.dynamicField) {
+                    $scope.deleteData = {'delete-dynamic-field': {name: $scope.name}};
+                } else {
+                    alert("TYPE NOT KNOWN");
+                }
+                $scope.showDelete = true;
+            }
+        }
+
+        $scope.delete = function() {
+            Schema.post({core: $routeParams.core}, $scope.deleteData, function(data) {
+               if (data.errors) {
+                   $scope.deleteErrors = data.errors[0].errorMessages;
+                   if (typeof $scope.deleteErrors === "string") {
+                       $scope.deleteErrors = [$scope.deleteErrors];
+                   }
+               } else {
+                   $scope.deleted = true;
+                   $timeout(function() {
+                       $location.search("");
+                     }, 1500
+                   );
+               }
+            });
+        }
+        $scope.toggleDeleteCopyField = function(field) {
+            field.show = !field.show;
+            delete field.errors;
+        }
+        $scope.deleteCopyField = function(field, source, dest) {
+            data = {'delete-copy-field': {source: source, dest: dest}};
+            Schema.post({core: $routeParams.core}, data, function(data) {
+               if (data.errors) {
+                   field.errors = data.errors[0].errorMessages;
+                   if (typeof $scope.deleteErrors === "string") {
+                       field.errors = [field.errors];
+                   }
+               } else {
+                   field.deleted = true;
+                   $timeout($scope.refresh, 1500);
+               }
+            });
+        }
     }
 );
 
@@ -303,9 +466,9 @@ var getFieldProperties = function(data,
     }
 
     // identify columns in field property table:
-    for (var key in data.info.key) {
+    for (var key in data.key) {
         if (allFlags.indexOf(key)>=0) {
-            display.columns.push({key: key, name: data.info.key[key]});
+            display.columns.push({key: key, name: data.key[key]});
         }
     }
 
@@ -343,9 +506,7 @@ var getAnalysisInfo = function(data, is,
     var processComponentType = function (label, key, componentTypeData) {
         if (componentTypeData) {
             var components = [];
-                console.dir(componentTypeData);
             for (var componentName in componentTypeData) {
-                console.log(componentName);
                 var componentData = componentTypeData[componentName];
                 var component = {className: componentData.className, args:[]};
                 if (componentData.args) {
@@ -420,6 +581,14 @@ var getTermInfo = function(data) {
     return termInfo;
 };
 
+var sortedObjectArray = function(list) {
+    var objarr = [];
+    for (var i in list) {
+      objarr.push({"name": list[i]});
+    }
+    return objarr;
+}
+
 /*
         var get_width = function get_width()
         {

Modified: lucene/dev/trunk/solr/webapp/web/js/angular/services.js
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/js/angular/services.js?rev=1712532&r1=1712531&r2=1712532&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/js/angular/services.js (original)
+++ lucene/dev/trunk/solr/webapp/web/js/angular/services.js Wed Nov  4 11:16:45 2015
@@ -136,7 +136,8 @@ solrAdminServices.factory('System',
 .factory('Luke',
   ['$resource', function($resource) {
     return $resource('/solr/:core/admin/luke', {core: '@core', wt:'json', _:Date.now()}, {
-      "index":  {params: {numTerms: 0}},
+      "index":  {params: {numTerms: 0, show: 'index'}},
+      "raw": {params: {numTerms: 0}},
       "schema": {params: {show:'schema'}},
       "field": {},
       "fields": {params: {show:'schema'}, interceptor: {
@@ -238,5 +239,18 @@ solrAdminServices.factory('System',
        return $resource('/solr/:core/admin/segments', {'wt':'json', core: '@core', _:Date.now()}, {
            get: {}
        });
-   }
-]);
+}])
+.factory('Schema',
+   ['$resource', function($resource) {
+     return $resource('/solr/:core/schema', {wt: 'json', core: '@core', _:Date.now()}, {
+       get: {method: "GET"},
+       check: {method: "GET", headers: {doNotIntercept: "true"}},
+       post: {method: "POST"}
+     });
+}])
+.factory('Config',
+   ['$resource', function($resource) {
+     return $resource('/solr/:core/config', {wt: 'json', core: '@core', _:Date.now()}, {
+       get: {method: "GET"}
+     })
+}]);

Modified: lucene/dev/trunk/solr/webapp/web/partials/analysis.html
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/partials/analysis.html?rev=1712532&r1=1712531&r2=1712532&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/partials/analysis.html (original)
+++ lucene/dev/trunk/solr/webapp/web/partials/analysis.html Wed Nov  4 11:16:45 2015
@@ -51,7 +51,7 @@ limitations under the License.
               <label for="type_or_name">Analyse Fieldname / FieldType:</label>
               <select style="width:130px" chosen ng-change="changeFieldOrType()" id="type_or_name" ng-model="fieldOrType" ng-options="f.value as f.label group by f.group for f in fieldsAndTypes"></select>
 
-              <a id="tor_schema" ng-href="#/{{core}}/schema-browser?{{schemaBrowserUrl}}"><span>Schema Browser</span>&nbsp;</a>
+              <a id="tor_schema" ng-href="#/{{core}}/schema?{{schemaBrowserUrl}}"><span>Schema Browser</span>&nbsp;</a>
 
               <div class="buttons clearfix">
 

Copied: lucene/dev/trunk/solr/webapp/web/partials/schema.html (from r1712262, lucene/dev/trunk/solr/webapp/web/partials/schema-browser.html)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/partials/schema.html?p2=lucene/dev/trunk/solr/webapp/web/partials/schema.html&p1=lucene/dev/trunk/solr/webapp/web/partials/schema-browser.html&r1=1712262&r2=1712532&rev=1712532&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/partials/schema-browser.html (original)
+++ lucene/dev/trunk/solr/webapp/web/partials/schema.html Wed Nov  4 11:16:45 2015
@@ -14,10 +14,191 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
-<div id="schema-browser" class="loaded">
+<div id="schema" class="loaded">
 
   <div class="clearfix">
 
+    <div id="frame">
+    <div id="actions" class="actions clearfix" ng-show="isSchemaUpdatable">
+      <button id="addField" class="action" ng-click="toggleAddField()"><span>Add Field</span></button>
+      <button id="addDynamicField" class="action" ng-click="toggleAddDynamicField()"><span>Add Dynamic Field</span></button>
+      <button id="addCopyField" class="action" ng-click="toggleAddCopyField()"><span>Add Copy Field</span></button>
+
+      <div class="action add" data-rel="add" ng-show="showAddField" escape-pressed="hideAll()">
+
+          <p class="clearfix"><label for="add_name">name:</label>
+          <input type="text" id="add_name" ng-model="newField.name" focus-when="showAddField" placeholder="enter a field name"></p>
+
+          <p class="clearfix"><label for="add_type">field type:</label>
+          <select chosen type="text" id="add_type" ng-model="newField.type" ng-options="type for type in types"></select>
+          </p>
+
+          <p class="clearfix" ng-show="adding=='field'"><label for="add_default">default:</label>
+          <input type="text" id="add_default" ng-model="newField.default" placeholder="enter a default value if needed"></p>
+
+          <p class="clearfix">
+            <label class="checkbox" for="add_stored">
+              <input type="checkbox" ng-model="newField.stored" id="add_stored" title="Full field should be stored in index." ng-true-value="'true'" ng-false-value="'false'">
+            stored
+            </label>
+          </p>
+
+          <p class="clearfix">
+            <label class="checkbox" for="add_indexed">
+              <input type="checkbox" ng-model="newField.indexed" id="add_indexed" title="Field should be indexed." ng-true-value="'true'" ng-false-value="'false'">
+            indexed
+            </label>
+          </p>
+
+          <p class="clearfix">
+            <label class="checkbox" for="add_docValues">
+              <input type="checkbox" ng-model="newField.docValues" id="add_docValues" title="DocValues should be stored for the field." ng-true-value="'true'" ng-false-value="'false'">
+            docValues
+            </label>
+          </p>
+
+          <p class="clearfix">
+            <label class="checkbox" for="add_multiValued">
+              <input type="checkbox" ng-model="newField.multiValued" id="add_multiValued" title="Multiple values are allowed for this field." ng-true-value="'true'" ng-false-value="'false'">
+            multiValued
+            </label>
+          </p>
+
+          <p class="clearfix" ng-show="adding=='field'">
+            <label class="checkbox" for="add_required">
+              <input type="checkbox" ng-model="newField.required" id="add_required" title="Field must be provided for all documents." ng-true-value="'true'" ng-false-value="'false'">
+            required
+            </label>
+          </p>
+
+          <p class="clearfix">
+            <a ng-click="showOmit=!showOmit">
+              <span class="add_showhide" ng-hide="showOmit">Show omit options</span>
+              <span class="add_showhide open" ng-show="showOmit">Hide omit options</span>
+            </a>
+          </p>
+
+          <div ng-show="showOmit">
+
+            <p class="clearfix">
+              <label class="checkbox" for="add_omitNorms">
+                <input type="checkbox" ng-model="newField.omitNorms" id="add_omitNorms" title="Full field should be omitNorms in index." ng-true-value="'true'" ng-false-value="'false'">
+              omitNorms
+              </label>
+            </p>
+
+            <p class="clearfix">
+              <label class="checkbox" for="add_omitTermFreqAndPositions">
+                <input type="checkbox" ng-model="newField.omitTermFreqAndPositions" id="add_omitTermFreqAndPositions" title="Full field should be omitTermFreqAndPositions in index." ng-true-value="'true'" ng-false-value="'false'">
+              omitTermFreqAndPositions
+              </label>
+            </p>
+
+            <p class="clearfix">
+              <label class="checkbox" for="add_omitPositions">
+                <input type="checkbox" ng-model="newField.omitPositions" id="add_omitPositions" title="Full field should be omitPositions in index." ng-true-value="'true'" ng-false-value="'false'">
+              omitPositions
+              </label>
+            </p>
+          </div>
+
+          <p class="clearfix">
+            <a ng-click="showTermVectors=!showTermVectors">
+              <span class="add_showhide" ng-hide="showTermVectors">Show term vector options</span>
+              <span class="add_showhide open" ng-show="showTermVectors">Hide term vector options</span>
+            </a>
+          </p>
+          <div ng-show="showTermVectors">
+
+             <p class="clearfix">
+              <label class="checkbox" for="add_termVectors">
+                <input type="checkbox" ng-model="newField.termVectors" id="add_termVectors" title="Full field should be termVectors in index." ng-true-value="'true'" ng-false-value="'false'">
+              termVectors
+              </label>
+            </p>
+
+            <p class="clearfix">
+              <label class="checkbox" for="add_termPositions">
+                <input type="checkbox" ng-model="newField.termPositions" id="add_termPositions" title="Full field should be termPositions in index." ng-true-value="'true'" ng-false-value="'false'">
+              termPositions
+              </label>
+            </p>
+
+            <p class="clearfix">
+              <label class="checkbox" for="add_termOffsets">
+                <input type="checkbox" ng-model="newField.termOffsets" id="add_termOffsets" title="Full field should be termOffsets in index." ng-true-value="'true'" ng-false-value="'false'">
+              termOffsets
+              </label>
+            </p>
+
+            <p class="clearfix">
+              <label class="checkbox" for="add_termPayloads">
+                <input type="checkbox" ng-model="newField.termPayloads" id="add_termPayloads" title="Full field should be termPayloads in index." ng-true-value="'true'" ng-false-value="'false'">
+              termPayloads
+              </label>
+            </p>
+
+          </div>
+
+          <p class="clearfix">
+            <a ng-click="showSort=!showSort">
+              <span class="add_showhide" ng-hide="showSort">Show sort options</span>
+              <span class="add_showhide open" ng-show="showSort">Show sort options</span>
+            </a>
+          </p>
+          <div ng-show="showSort">
+            <p class="clearfix">
+              <label class="checkbox" for="add_sortMissingFirst">
+                <input type="checkbox" ng-model="newField.sortMissingFirst" id="add_sortMissingFirst" title="Full field should be sortMissingFirst in index." ng-true-value="'true'" ng-false-value="'false'">
+              sortMissingFirst
+              </label>
+            </p>
+
+            <p class="clearfix">
+              <label class="checkbox" for="add_sortMissingLast">
+                <input type="checkbox" ng-model="newField.sortMissingLast" id="add_sortMissingLast" title="Full field should be sortMissingLast in index." ng-true-value="'true'" ng-false-value="'false'">
+              sortMissingLast
+              </label>
+            </p>
+
+          </div>
+
+          <div ng-repeat="error in addErrors" ng-show="addErrors" class="clearfix note error">
+            <span>{{error}}</span></div>
+
+          <p class="clearfix buttons">
+            <button ng-show="adding=='field'" type="submit" class="submit" ng-class="{success: added}" ng-click="addField()"><span>Add Field</span></button>
+            <button ng-show="adding=='dynamicField'" type="submit" class="submit" ng-class="{success: added}" ng-click="addDynamicField()"><span>Add Dynamic Field</span></button>
+            <button type="reset" class="reset" ng-click="hideAll()"><span>Cancel</span></button>
+          </p>
+
+
+
+      </div>
+
+      <div class="action add" data-rel="add" ng-show="showAddCopyField" escape-pressed="hideAll()">
+
+        <form>
+
+          <p class="clearfix"><label for="add_source">source:</label>
+          <input type="text" id="add_source" ng-model="copyField.source" focus-when="showAddCopyField" placeholder="specify your source field or pattern"></p>
+
+          <p class="clearfix"><label for="add_dest">destination:</label>
+          <input type="text" id="add_dest" ng-model="copyField.dest" placeholder="specify your destination field or pattern"></p>
+
+          <div ng-repeat="error in addCopyFieldErrors" ng-show="addCopyFieldErrors" class="clearfix note error">
+            <span>{{error}}</span></div>
+
+          <p class="clearfix buttons">
+            <button type="submit" class="submit" ng-class="{success: added}" ng-click="addCopyField()"><span>Add CopyField</span></button>
+            <button type="reset" class="reset" ng-click="hideAll()"><span>Cancel</span></button>
+          </p>
+
+        </form>
+
+      </div>
+    </div>
+
     <div id="data">
 
       <div id="field">
@@ -56,7 +237,7 @@ limitations under the License.
 
           </dl>
 
-          <table class="flags" cellspacing="0" cellpadding="0" border="0">
+          <table class="flags" cellspacing="0" cellpadding="0" border="0" ng-show="display.columns.length!=0">
 
             <thead>
 
@@ -174,33 +355,93 @@ limitations under the License.
       <dl id="f-df-t">
 
         <dt class="field" ng-class="{active: selectedType=='Field'}" ng-show="leftbar.fields">Field</dt>
-        <dd class="field" ng-class="{active: selectedType=='Field'}" ng-repeat="field in leftbar.fields"><a href="#/{{core}}/schema-browser?field={{field}}">{{field}}</a></dd>
+        <dd class="field" ng-class="{active: selectedType=='Field'}" ng-repeat="field in leftbar.fields"><a href="#/{{core}}/schema?field={{field}}">{{field}}</a></dd>
 
         <dt class="copyfield" ng-show="leftbar.copyFieldSources">Copied from</dt>
-        <dd class="copyfield" ng-repeat="field in leftbar.copyFieldSources"><a href="#/{{core}}/schema-browser?field={{field}}">{{field}}</a></dd>
+        <dd class="copyfield" ng-repeat="field in leftbar.copyFieldSources">
+            <div class="clearfix" ng-hide="isSchemaUpdatable">
+              <a href="#/{{core}}/schema?field={{field.name}}">{{field.name}}</a>
+            </div>
+            <div class="clearfix updatable" ng-show="isSchemaUpdatable">
+              <a style="float:left;width:80%" href="#/{{core}}/schema?field={{field.name}}">{{field.name}}</a>
+              <span ng-click="toggleDeleteCopyField(field)" class="rem">&nbsp;</span>
+            </div>
+            <div class="action delete" ng-show="field.show">
+                <form class="delete">
+
+                  <p class="clearfix"><em>Are you sure you want to delete this CopyField?</em></p>
+                  <div ng-repeat="error in field.errors" ng-show="field.errors" class="clearfix note error">
+                    <span>{{error}}</span></div>
+
+                  <p class="clearfix buttons">
+                    <button class="submit" ng-class="{success: field.deleted}" ng-click="deleteCopyField(field, field.name, name)"><span>Delete</span></button>
+                    <button type="reset" class="reset" ng-click="toggleDeleteCopyField(field)"><span>Cancel</span></button>
+                  </p>
+                </form>
+            </div>
+        </dd>
 
         <dt class="copyfield" ng-show="leftbar.copyFieldDests">Copied to</dt>
-        <dd class="copyfield" ng-repeat="field in leftbar.copyFieldDests"><a href="#/{{core}}/schema-browser?field={{field}}">{{field}}</a></dd>
-
+        <dd class="copyfield" ng-repeat="field in leftbar.copyFieldDests">
+            <div class="clearfix" ng-hide="isSchemaUpdatable">
+              <a href="#/{{core}}/schema?field={{field.name}}">{{field.name}}</a>
+            </div>
+            <div class="clearfix updatable" ng-show="isSchemaUpdatable">
+              <a href="#/{{core}}/schema?field={{field.name}}">{{field.name}}</a>
+              <span ng-click="toggleDeleteCopyField(field)" class="rem">&nbsp;</span>
+            </div>
+            <div class="action delete" ng-show="field.show">
+                <form class="delete">
+
+                  <p class="clearfix"><em>Are you sure you want to delete this CopyField?</em></p>
+                  <div ng-repeat="error in field.errors" ng-show="field.errors" class="clearfix note error">
+                    <span>{{error}}</span></div>
+
+                  <p class="clearfix buttons">
+                    <button class="submit" ng-class="{success: field.deleted}" ng-click="deleteCopyField(field, name, field.name)"><span>Delete</span></button>
+                    <button type="reset" class="reset" ng-click="toggleDeleteCopyField(field)"><span>Cancel</span></button>
+                  </p>
+                </form>
+            </div>
+        </dd>
         <dt class="dynamic-field" ng-class="{active: selectedType=='Dynamic Field'}" ng-show="leftbar.dynamicFields">Dynamic Field {{dynamicFields}} / {{dynamicFields.length()}}</dt>
-        <dd class="dynamic-field" ng-class="{active: selectedType=='Dynamic Field'}" ng-repeat="field in leftbar.dynamicFields"><a href="#/{{core}}/schema-browser?dynamic-field={{field}}">{{field}}</a></dd>
+        <dd class="dynamic-field" ng-class="{active: selectedType=='Dynamic Field'}" ng-repeat="field in leftbar.dynamicFields"><a href="#/{{core}}/schema?dynamic-field={{field}}">{{field}}</a></dd>
 
         <dt class="type" ng-class="{active: selectedType=='Type'}" ng-show="leftbar.types">Type</dt>
-        <dd class="type" ng-class="{active: selectedType=='Type'}" ng-repeat="type in leftbar.types"><a href="#/{{core}}/schema-browser?type={{type}}">{{type}}</a></dd>
+        <dd class="type" ng-class="{active: selectedType=='Type'}" ng-repeat="type in leftbar.types"><a href="#/{{core}}/schema?type={{type}}">{{type}}</a></dd>
+
+        <dt></dt>
+        <dd class="active delete-field" ng-show="isSchemaUpdatable &amp;&amp; leftbar.fields &amp;&amp;!showDelete"><button ng-click="toggleDelete()"><span>delete field</span></button></dd>
+        <dd class="active delete-field" ng-show="isSchemaUpdatable &amp;&amp; leftbar.dynamicFields &amp;&amp;!showDelete"><button ng-click="toggleDelete()"><span>delete dynamic field</span></button></dd>
+
+        <div class="action delete" ng-show="showDelete">
 
+            <form class="delete">
+
+              <p class="clearfix"><em>Are you sure you want to delete this {{selectedType}}?</em></p>
+              <div ng-repeat="error in deleteErrors" ng-show="deleteErrors" class="clearfix note error">
+                <span>{{error}}</span></div>
+
+              <p class="clearfix buttons">
+                <button class="submit" ng-class="{success: deleted}" ng-click="delete()"><span>Delete</span></button>
+                <button type="reset" class="reset" ng-click="toggleDelete()"><span>Cancel</span></button>
+              </p>
+            </form>
+        </div>
       </dl>
 
       <dl class="ukf-dsf">
 
         <dt class="unique-key-field" ng-class="{active: isUniqueKeyField}" ng-show="uniqueKeyField">Unique Key Field</dt>
-        <dd class="unique-key-field" ng-class="{active: isUniqueKeyField}"><a ng-href="#/{{core}}/schema-browser?field={{uniqueKeyField}}">{{uniqueKeyField}}</a></dd>
+        <dd class="unique-key-field" ng-class="{active: isUniqueKeyField}"><a ng-href="#/{{core}}/schema?field={{uniqueKeyField}}">{{uniqueKeyField}}</a></dd>
 
         <dt class="default-search-field" ng-class="{active: isDefaultSearchField}" ng-show="defaultSearchField">Default Search Field</dt>
-        <dd class="default-search-field" ng-class="{active: isDefaultSearchField}"><a ng-href="#/{{core}}/schema-browser?field={{defaultSearchField}}">{{defaultSearchField}}</a></dd>
+        <dd class="default-search-field" ng-class="{active: isDefaultSearchField}"><a ng-href="#/{{core}}/schema?field={{defaultSearchField}}">{{defaultSearchField}}</a></dd>
 
       </dl>
 
     </div>
+      </div>
 
   </div>