SOLR-8139 Rename schema-browser to schema and add managed schema support

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1712532 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Upayavira 2015-11-04 11:16:45 +00:00
parent 994cfa1259
commit 6d9c2c46b1
10 changed files with 1383 additions and 798 deletions

View File

@ -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 ); }

View File

@ -1,567 +0,0 @@
/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#content #schema-browser .loader
{
background-position: 0 50%;
padding-left: 21px;
}
#content #schema-browser.loaded
{
background-image: url( ../../img/div.gif );
background-position: 21% 0;
background-repeat: repeat-y;
}
#content #schema-browser #data
{
float: right;
width: 78%;
}
#content #schema-browser #related
{
float: left;
width: 20%;
}
#content #schema-browser #related select
{
width: 100%;
}
#content #schema-browser #related select optgroup
{
font-style: normal;
padding: 5px;
}
#content #schema-browser #related select option
{
padding-left: 10px;
}
#content #schema-browser #related #f-df-t
{
border-bottom: 1px solid #f0f0f0;
padding-bottom: 15px;
}
#content #schema-browser #related .ukf-dsf dt
{
}
#content #schema-browser #related dl
{
margin-top: 15px;
}
#content #schema-browser #related dl dt,
#content #schema-browser #related dl dd a
{
color: #c0c0c0;
}
#content #schema-browser #related dl dt
{
font-weight: bold;
margin-top: 5px;
}
#content #schema-browser #related dl dd a
{
display: block;
padding-left: 10px;
}
#content #schema-browser #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
{
color: #333;
}
#content #schema-browser #related .copyfield,
#content #schema-browser #related .copyfield a
{
color: #666;
}
#content #schema-browser #data
{
}
#content #schema-browser #data #index dt
{
float: left;
margin-right: 5px;
width: 150px;
}
#content #schema-browser #data #field .field-options
{
margin-bottom: 10px;
}
#content #schema-browser #data #field .field-options .head h2
{
padding-left: 5px;
}
#content #schema-browser #data #field .partial
{
}
#content #schema-browser #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
{
float: left;
}
#content #schema-browser #data #field .field-options .options dt
{
clear: left;
margin-right: 5px;
width: 100px;
}
#content #schema-browser #data #field .field-options .flags
{
margin-top: 10px;
margin-bottom: 20px;
}
#content #schema-browser #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
{
padding: 2px 5px;
}
#content #schema-browser #data #field .field-options .flags thead td,
#content #schema-browser #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
{
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
{
border-top: 1px solid #f0f0f0;
}
#content #schema-browser #data #field .field-options .flags tbody .check
{
background-color: #fafdfa;
background-image: url( ../../img/ico/tick.png );
background-position: 50% 50%;
text-align: center;
}
#content #schema-browser #data #field .field-options .flags tbody .check span
{
}
#content #schema-browser #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-browser #data #field .field-options .analyzer p,
#content #schema-browser #data #field .field-options .analyzer dl
{
float: left;
}
#content #schema-browser #data #field .field-options .analyzer p
{
margin-right: 5px;
text-align: right;
width: 125px;
white-space: pre;
}
#content #schema-browser #data #field .field-options .analyzer p a
{
cursor: auto;
}
#content #schema-browser #data #field .field-options .analyzer p a.analysis
{
cursor: pointer;
display: block;
}
#content #schema-browser #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
{
background-image: url( ../../img/ico/question.png );
color: #008;
}
#content #schema-browser #data #field .field-options .analyzer a
{
cursor: auto;
}
#content #schema-browser #data #field .field-options .analyzer .toggle
{
background-image: url( ../../img/ico/chevron-small-expand.png );
background-position: 100% 50%;
cursor: pointer;
display: block;
padding-right: 21px;
}
#content #schema-browser #data #field .field-options .analyzer .open .toggle
{
background-image: url( ../../img/ico/chevron-small.png );
}
#content #schema-browser #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
{
clear: left;
margin-left: 55px;
padding-top: 5px;
}
#content #schema-browser #data #field .field-options .analyzer .open ul
{
display: block;
}
#content #schema-browser #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
{
color: #999;
margin-right: 5px;
text-align: right;
width: 70px;
}
#content #schema-browser #data #field .field-options .analyzer ul dd
{
margin-left: 20px;
}
#content #schema-browser #data #field .field-options .analyzer ul dd
{
background-image: url( ../../img/ico/document-list.png );
background-position: 0 50%;
color: #c0c0c0;
padding-left: 21px;
}
#content #schema-browser #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
{
background-image: url( ../../img/ico/tick.png );
}
#content #schema-browser #data #field .head
{
margin-bottom: 5px;
}
#content #schema-browser #data #field .terminfo-holder
{
border-top: 1px solid #c0c0c0;
padding-top: 10px;
}
#content #schema-browser #data #field .terminfo-holder .trigger
{
float: left;
width: 140px;
}
#content #schema-browser #data #field .terminfo-holder .trigger button span
{
background-image: url( ../../img/ico/information.png );
}
#content #schema-browser #data #field .terminfo-holder .status
{
border-left: 1px solid #f0f0f0;
float: left;
padding-left: 20px;
padding-right: 20px;
}
#content #schema-browser #data #field .terminfo-holder.disabled .trigger button span
{
background-image: url( ../../img/ico/prohibition.png );
}
#content #schema-browser #data #field .terminfo-holder.disabled .status
{
display: block;
}
#content #schema-browser #data #field .terminfo-holder .trigger .autoload
{
}
#content #schema-browser #data #field .terminfo-holder.loaded .trigger .autoload
{
background-image: url( ../../img/ico/ui-check-box-uncheck.png );
background-position: 0 50%;
color: #c0c0c0;
display: block;
margin-top: 10px;
padding-left: 21px;
}
#content #schema-browser #data #field .terminfo-holder .trigger .autoload:hover
{
color: #008;
}
#content #schema-browser #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
{
border-left: 1px solid #f0f0f0;
float: left;
padding-left: 20px;
padding-right: 20px;
}
#content #schema-browser #data #field .topterms-holder .head input
{
height: 18px;
line-height: 16px;
text-align: right;
width: 30px;
}
#content #schema-browser #data #field .topterms-holder .head .max-holder
{
color: #c0c0c0;
}
#content #schema-browser #data #field .topterms-holder .head .max-holder:hover .max
{
color: #008;
}
#content #schema-browser #data #field .topterms-holder .head #query_link
{
background-image: url( ../../img/ico/question-white.png );
background-position: 0 50%;
color: #c0c0c0;
padding-left: 21px;
margin-left: 5px;
}
#content #schema-browser #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
{
visibility: hidden;
}
#content #schema-browser #data #field .topterms-holder .head #query_link:hover span
{
visibility: visible;
}
#content #schema-browser .topterms-holder li
{
border-top: 1px solid #999;
margin-bottom: 5px;
}
/* possible overwrite with inline style */
#content #schema-browser .topterms-holder li p
{
background-color: #999;
color: #fff;
float: left;
}
#content #schema-browser .topterms-holder li p span
{
display: block;
padding-right: 2px;
text-align: right;
}
/* possible overwrite with inline style */
#content #schema-browser .topterms-holder li ul
{
margin-left: 30px;
}
#content #schema-browser .topterms-holder li li
{
border-top: 0;
margin-bottom: 0;
white-space: nowrap;
}
#content #schema-browser .topterms-holder li li.odd
{
background-color: #f0f0f0;
}
#content #schema-browser .topterms-holder li li a
{
display: block;
padding-left: 2px;
padding-right: 2px;
}
#content #schema-browser .topterms-holder li li a:hover
{
background-color: #c0c0c0;
}
#content #schema-browser #data #field .histogram-holder ul
{
margin-left: 25px;
}
#content #schema-browser #data #field .histogram-holder li
{
margin-bottom: 2px;
position: relative;
width: 150px;
}
#content #schema-browser #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
{
padding-top: 1px;
padding-bottom: 1px;
}
#content #schema-browser #data #field .histogram-holder li dl
{
background-color: #c0c0c0;
min-width: 1px;
}
#content #schema-browser #data #field .histogram-holder li dt
{
color: #a0a0a0;
position: absolute;
overflow: hidden;
left: -25px;
top: 0px;
}
#content #schema-browser #data #field .histogram-holder li dt span
{
display: block;
padding-right: 4px;
text-align: right;
}
#content #schema-browser #data #field .histogram-holder li dd
{
clear: left;
float: left;
margin-left: 2px;
white-space: nowrap;
}
#content #schema-browser #data #field .histogram-holder li:hover dl
{
background-color: #b0b0b0;
}
#content #schema-browser #data #field .histogram-holder li:hover dt
{
color: #333;
}

View File

@ -0,0 +1,704 @@
/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#content #schema .loader
{
background-position: 0 50%;
padding-left: 21px;
}
#content #schema.loaded
{
background-image: url( ../../img/div.gif );
background-position: 21% 0;
background-repeat: repeat-y;
}
#content #schema #data
{
float: right;
width: 78%;
}
#content #schema #related
{
float: left;
width: 20%;
}
#content #schema #related select
{
width: 100%;
}
#content #schema #related select optgroup
{
font-style: normal;
padding: 5px;
}
#content #schema #related select option
{
padding-left: 10px;
}
#content #schema #related #f-df-t
{
border-bottom: 1px solid #f0f0f0;
padding-bottom: 15px;
}
#content #schema #related .ukf-dsf dt
{
}
#content #schema #related dl
{
margin-top: 15px;
}
#content #schema #related dl dt,
#content #schema #related dl dd a
{
color: #c0c0c0;
}
#content #schema #related dl dt
{
font-weight: bold;
margin-top: 5px;
}
#content #schema #related dl dd a
{
display: block;
padding-left: 10px;
}
#content #schema #related dl dd a:hover
{
background-color: #f8f8f8;
}
#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 #related .copyfield,
#content #schema #related .copyfield a
{
color: #666;
}
#content #schema #data
{
}
#content #schema #data #index dt
{
float: left;
margin-right: 5px;
width: 150px;
}
#content #schema #data #field .field-options
{
margin-bottom: 10px;
}
#content #schema #data #field .field-options .head h2
{
padding-left: 5px;
}
#content #schema #data #field .partial
{
}
#content #schema #data #field .partial p
{
background-image: url( ../../img/ico/exclamation-button.png );
background-position: 0 50%;
padding-left: 21px;
}
#content #schema #data #field .field-options .options dt,
#content #schema #data #field .field-options .options dd
{
float: left;
}
#content #schema #data #field .field-options .options dt
{
clear: left;
margin-right: 5px;
width: 100px;
}
#content #schema #data #field .field-options .flags
{
margin-top: 10px;
margin-bottom: 20px;
}
#content #schema #data #field .field-options .flags thead td
{
color: #c0c0c0;
padding-right: 5px;
width: 100px;
}
#content #schema #data #field .field-options .flags tbody td,
#content #schema #data #field .field-options .flags th
{
padding: 2px 5px;
}
#content #schema #data #field .field-options .flags thead td,
#content #schema #data #field .field-options .flags tbody th
{
padding-left: 0;
}
#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 #data #field .field-options .flags tbody th,
#content #schema #data #field .field-options .flags tbody td
{
border-top: 1px solid #f0f0f0;
}
#content #schema #data #field .field-options .flags tbody .check
{
background-color: #fafdfa;
background-image: url( ../../img/ico/tick.png );
background-position: 50% 50%;
text-align: center;
}
#content #schema #data #field .field-options .flags tbody .check span
{
}
#content #schema #data #field .field-options .flags tbody .text
{
color: #c0c0c0;
}
#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 #data #field .field-options .analyzer p,
#content #schema #data #field .field-options .analyzer dl
{
float: left;
}
#content #schema #data #field .field-options .analyzer p
{
margin-right: 5px;
text-align: right;
width: 125px;
white-space: pre;
}
#content #schema #data #field .field-options .analyzer p a
{
cursor: auto;
}
#content #schema #data #field .field-options .analyzer p a.analysis
{
cursor: pointer;
display: block;
}
#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 #data #field .field-options .analyzer p a.analysis:hover span
{
background-image: url( ../../img/ico/question.png );
color: #008;
}
#content #schema #data #field .field-options .analyzer a
{
cursor: auto;
}
#content #schema #data #field .field-options .analyzer .toggle
{
background-image: url( ../../img/ico/chevron-small-expand.png );
background-position: 100% 50%;
cursor: pointer;
display: block;
padding-right: 21px;
}
#content #schema #data #field .field-options .analyzer .open .toggle
{
background-image: url( ../../img/ico/chevron-small.png );
}
#content #schema #data #field .field-options .analyzer li
{
border-top: 1px solid #f0f0f0;
margin-top: 10px;
padding-top: 10px;
}
#content #schema #data #field .field-options .analyzer ul
{
clear: left;
margin-left: 55px;
padding-top: 5px;
}
#content #schema #data #field .field-options .analyzer .open ul
{
display: block;
}
#content #schema #data #field .field-options .analyzer ul li
{
border-top: 1px solid #f8f8f8;
margin-top: 5px;
padding-top: 5px;
}
#content #schema #data #field .field-options .analyzer ul p
{
color: #999;
margin-right: 5px;
text-align: right;
width: 70px;
}
#content #schema #data #field .field-options .analyzer ul dd
{
margin-left: 20px;
}
#content #schema #data #field .field-options .analyzer ul dd
{
background-image: url( ../../img/ico/document-list.png );
background-position: 0 50%;
color: #c0c0c0;
padding-left: 21px;
}
#content #schema #data #field .field-options .analyzer ul dd.ico-0
{
background-image: url( ../../img/ico/slash.png );
}
#content #schema #data #field .field-options .analyzer ul dd.ico-1
{
background-image: url( ../../img/ico/tick.png );
}
#content #schema #data #field .head
{
margin-bottom: 5px;
}
#content #schema #data #field .terminfo-holder
{
border-top: 1px solid #c0c0c0;
padding-top: 10px;
}
#content #schema #data #field .terminfo-holder .trigger
{
float: left;
width: 140px;
}
#content #schema #data #field .terminfo-holder .trigger button span
{
background-image: url( ../../img/ico/information.png );
}
#content #schema #data #field .terminfo-holder .status
{
border-left: 1px solid #f0f0f0;
float: left;
padding-left: 20px;
padding-right: 20px;
}
#content #schema #data #field .terminfo-holder.disabled .trigger button span
{
background-image: url( ../../img/ico/prohibition.png );
}
#content #schema #data #field .terminfo-holder.disabled .status
{
display: block;
}
#content #schema #data #field .terminfo-holder .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%;
color: #c0c0c0;
display: block;
margin-top: 10px;
padding-left: 21px;
}
#content #schema #data #field .terminfo-holder .trigger .autoload:hover
{
color: #008;
}
#content #schema #data #field .terminfo-holder .trigger .autoload.on
{
background-image: url( ../../img/ico/ui-check-box.png );
color: #333;
}
#content #schema #data #field .topterms-holder,
#content #schema #data #field .histogram-holder
{
border-left: 1px solid #f0f0f0;
float: left;
padding-left: 20px;
padding-right: 20px;
}
#content #schema #data #field .topterms-holder .head input
{
height: 18px;
line-height: 16px;
text-align: right;
width: 30px;
}
#content #schema #data #field .topterms-holder .head .max-holder
{
color: #c0c0c0;
}
#content #schema #data #field .topterms-holder .head .max-holder:hover .max
{
color: #008;
}
#content #schema #data #field .topterms-holder .head #query_link
{
background-image: url( ../../img/ico/question-white.png );
background-position: 0 50%;
color: #c0c0c0;
padding-left: 21px;
margin-left: 5px;
}
#content #schema #data #field .topterms-holder .head #query_link:hover
{
background-image: url( ../../img/ico/question.png );
}
#content #schema #data #field .topterms-holder .head #query_link span
{
visibility: hidden;
}
#content #schema #data #field .topterms-holder .head #query_link:hover span
{
visibility: visible;
}
#content #schema .topterms-holder li
{
border-top: 1px solid #999;
margin-bottom: 5px;
}
/* possible overwrite with inline style */
#content #schema .topterms-holder li p
{
background-color: #999;
color: #fff;
float: left;
}
#content #schema .topterms-holder li p span
{
display: block;
padding-right: 2px;
text-align: right;
}
/* possible overwrite with inline style */
#content #schema .topterms-holder li ul
{
margin-left: 30px;
}
#content #schema .topterms-holder li li
{
border-top: 0;
margin-bottom: 0;
white-space: nowrap;
}
#content #schema .topterms-holder li li.odd
{
background-color: #f0f0f0;
}
#content #schema .topterms-holder li li a
{
display: block;
padding-left: 2px;
padding-right: 2px;
}
#content #schema .topterms-holder li li a:hover
{
background-color: #c0c0c0;
}
#content #schema #data #field .histogram-holder ul
{
margin-left: 25px;
}
#content #schema #data #field .histogram-holder li
{
margin-bottom: 2px;
position: relative;
width: 150px;
}
#content #schema #data #field .histogram-holder li.odd
{
background-color: #f0f0f0;
}
#content #schema #data #field .histogram-holder li dl,
#content #schema #data #field .histogram-holder li dt
{
padding-top: 1px;
padding-bottom: 1px;
}
#content #schema #data #field .histogram-holder li dl
{
background-color: #c0c0c0;
min-width: 1px;
}
#content #schema #data #field .histogram-holder li dt
{
color: #a0a0a0;
position: absolute;
overflow: hidden;
left: -25px;
top: 0px;
}
#content #schema #data #field .histogram-holder li dt span
{
display: block;
padding-right: 4px;
text-align: right;
}
#content #schema #data #field .histogram-holder li dd
{
clear: left;
float: left;
margin-left: 2px;
white-space: nowrap;
}
#content #schema #data #field .histogram-holder li:hover dl
{
background-color: #b0b0b0;
}
#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%;
}

View File

@ -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>

View File

@ -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) {

View File

@ -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('SchemaBrowserController',
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('SchemaBrowserController',
$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('SchemaBrowserController',
$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, core, is, field) {
}
// 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, name) {
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()
{

View File

@ -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"}
})
}]);

View File

@ -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">

View File

@ -1,207 +0,0 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<div id="schema-browser" class="loaded">
<div class="clearfix">
<div id="data">
<div id="field">
<div class="field-options" ng-show="showing">
<div class="block head">
<h2>
<span class="type">{{selectedType}}</span>:
<span class="name">{{name}}</span>
</h2>
</div>
<div class="partial" ng-show="partialState">
<p>Because your Index is empty, we do not have enough Information about this Field</p>
</div>
<dl class="options clearfix">
<dt class="field-type">Field-Type:</dt>
<dd class="field-type">{{analysis.data.className}}</dd>
<dt class="similarity" ng-show="display.similarity">Similarity:</dt>
<dd class="similarity" ng-show="display.similarity">{{ display.similarity.details }} ({{ similarity.className }}) </dd>
<dt class="position-increment-gap" ng-show="display.positionIncrementGap"><abbr title="Position Increment Gap">PI Gap</abbr>:</dt>
<dd class="position-increment-gap" ng-show="display.positionIncrementGap">{{ display.positionIncrementGap }}</dd>
<dt class="docs" ng-show="display.docs">Docs:</dt>
<dd class="docs" ng-show="display.docs"><a href="{{display.docsUrl}}">{{display.docs | number}}</a></dd>
<dt class="distinct" ng-show="display.distinct">Distinct:</dt>
<dd class="distinct" ng-show="display.distinct">{{display.distinct}}</dd>
</dl>
<table class="flags" cellspacing="0" cellpadding="0" border="0">
<thead>
<tr>
<td>Flags:</td>
<th ng-repeat="key in display.columns">{{key.name}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="row in display.rows track by row.name">
<th>{{row.name}}</th>
<td colspan="2" class="text" ng-show="row.comment">{{row.comment}}</td>
<td ng-repeat="cell in row.cells"
ng-class="{'check':cell.value}">
<span ng-show="cell.value"></span>
<span ng-show="!cell.value">&nbsp;</span>
</td>
</tr>
</tbody>
</table>
<ul class="analyzer">
<li class="clearfix {{analyzer.key}}" ng-class="{open: analyzer.show}" ng-repeat="analyzer in analysis.analyzers">
<p><a class="analysis" ng-href="#/{{core}}/analysis?{{analysis.query}}"><span>{{analyzer.name}}&nbsp;Analyzer:</span></a></p>
<dl>
<dt><a ng-click="toggleAnalyzer(analyzer)" class="toggle">{{analyzer.detail.className}}</a></dt>
</dl>
<ul ng-show="analyzer.show">
<li class="clearfix {{componentType.key}} data" ng-repeat="componentType in analyzer.detail.componentTypes" ng-show="componentType.components">
<p>{{componentType.label}}:</p>
<dl>
<dt ng-repeat-start="component in componentType.components">{{component.className}}</dt>
<dd ng-repeat-end ng-repeat="arg in component.args"
ng-class="{'ico-1': arg.booleanValue, 'ico-0': arg.booleanValue==false}">
{{arg.name}}<span ng-show="arg.value">: {{arg.value}}</span>
</dd>
</dl>
</li>
</ul>
</li>
</ul>
</div>
<div class="terminfo-holder loaded clearfix" ng-class="{disabled: noTermData}" ng-show="is.field">
<div class="trigger">
<button class="submit" ng-click="toggleTerms()"><span ng-class="{loader:isLoadingTerms}">Load Term Info</span></button>
<br/>
<span ng-show="isCloudEnabled">N.B. Loaded from a single core - not from the whole collection.</span>
<a ng-show="showTerms" ng-click="toggleAutoload()" ng-class="{on:isAutoload}" class="autoload" title="Automatically load Term Info?"><span>Autoload</span></a>
</div>
<p ng-show="showTerms && noTerms" class="status">Sorry, no Term Info available :(</p>
<div ng-show="showTerms && termInfo.topTerms" class="topterms-holder">
<form>
<p class="head">
<input type="text" ng-model="topTermsCount" ng-change="loadTermInfo()">
<a class="max-holder" ng-click="loadAllTopTerms()" title="Load all Top-Terms">/<span class="max">{{termInfo.maxTerms | number}}</span></a> Top-Terms:
<a id="query_link" href="#/{{core}}/query?q={{name}}:[* TO *]"><span>Query</span>&nbsp;</a>
</p>
</form>
<ul>
<li class="clearfix" ng-repeat="countGroup in termInfo.topTerms">
<p><span>{{countGroup.count}}</span></p>
<ul>
<li ng-repeat="term in countGroup.terms" ng-class="{odd:$odd}"><a href="#/{{core}}/query?q={{name}}:{{term}}">{{term}}</a></li>
</ul>
</li>
</ul>
</div>
<div ng-show="showTerms && termInfo.histogram" class="histogram-holder">
<p class="head">Histogram:</p>
<ul>
<li ng-repeat="row in termInfo.histogram" ng-class="{odd:$odd}">
<dl class="clearfix" style="width: {{(( row.value / termInfo.histogramMax ) * 100 )}}%;">
<dt><span>{{ row.key | number}}</span></dt>
<dd><span>{{ row.value | number }}</span></dd>
</dl>
</li>
</ul>
</div>
</div>
</div>
</div>
<div id="related">
<select id="type_or_name"
ng-model="fieldOrType"
chosen
data-placeholder="Please select ..."
ng-change="selectFieldOrType()"
ng-options="f.value as f.label group by f.group for f in fieldsAndTypes"></select>
<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>
<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>
<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>
<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>
<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>
</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>
<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>
</dl>
</div>
</div>
</div>

View File

@ -0,0 +1,448 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<div 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">
<div class="field-options" ng-show="showing">
<div class="block head">
<h2>
<span class="type">{{selectedType}}</span>:
<span class="name">{{name}}</span>
</h2>
</div>
<div class="partial" ng-show="partialState">
<p>Because your Index is empty, we do not have enough Information about this Field</p>
</div>
<dl class="options clearfix">
<dt class="field-type">Field-Type:</dt>
<dd class="field-type">{{analysis.data.className}}</dd>
<dt class="similarity" ng-show="display.similarity">Similarity:</dt>
<dd class="similarity" ng-show="display.similarity">{{ display.similarity.details }} ({{ similarity.className }}) </dd>
<dt class="position-increment-gap" ng-show="display.positionIncrementGap"><abbr title="Position Increment Gap">PI Gap</abbr>:</dt>
<dd class="position-increment-gap" ng-show="display.positionIncrementGap">{{ display.positionIncrementGap }}</dd>
<dt class="docs" ng-show="display.docs">Docs:</dt>
<dd class="docs" ng-show="display.docs"><a href="{{display.docsUrl}}">{{display.docs | number}}</a></dd>
<dt class="distinct" ng-show="display.distinct">Distinct:</dt>
<dd class="distinct" ng-show="display.distinct">{{display.distinct}}</dd>
</dl>
<table class="flags" cellspacing="0" cellpadding="0" border="0" ng-show="display.columns.length!=0">
<thead>
<tr>
<td>Flags:</td>
<th ng-repeat="key in display.columns">{{key.name}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="row in display.rows track by row.name">
<th>{{row.name}}</th>
<td colspan="2" class="text" ng-show="row.comment">{{row.comment}}</td>
<td ng-repeat="cell in row.cells"
ng-class="{'check':cell.value}">
<span ng-show="cell.value"></span>
<span ng-show="!cell.value">&nbsp;</span>
</td>
</tr>
</tbody>
</table>
<ul class="analyzer">
<li class="clearfix {{analyzer.key}}" ng-class="{open: analyzer.show}" ng-repeat="analyzer in analysis.analyzers">
<p><a class="analysis" ng-href="#/{{core}}/analysis?{{analysis.query}}"><span>{{analyzer.name}}&nbsp;Analyzer:</span></a></p>
<dl>
<dt><a ng-click="toggleAnalyzer(analyzer)" class="toggle">{{analyzer.detail.className}}</a></dt>
</dl>
<ul ng-show="analyzer.show">
<li class="clearfix {{componentType.key}} data" ng-repeat="componentType in analyzer.detail.componentTypes" ng-show="componentType.components">
<p>{{componentType.label}}:</p>
<dl>
<dt ng-repeat-start="component in componentType.components">{{component.className}}</dt>
<dd ng-repeat-end ng-repeat="arg in component.args"
ng-class="{'ico-1': arg.booleanValue, 'ico-0': arg.booleanValue==false}">
{{arg.name}}<span ng-show="arg.value">: {{arg.value}}</span>
</dd>
</dl>
</li>
</ul>
</li>
</ul>
</div>
<div class="terminfo-holder loaded clearfix" ng-class="{disabled: noTermData}" ng-show="is.field">
<div class="trigger">
<button class="submit" ng-click="toggleTerms()"><span ng-class="{loader:isLoadingTerms}">Load Term Info</span></button>
<br/>
<span ng-show="isCloudEnabled">N.B. Loaded from a single core - not from the whole collection.</span>
<a ng-show="showTerms" ng-click="toggleAutoload()" ng-class="{on:isAutoload}" class="autoload" title="Automatically load Term Info?"><span>Autoload</span></a>
</div>
<p ng-show="showTerms && noTerms" class="status">Sorry, no Term Info available :(</p>
<div ng-show="showTerms && termInfo.topTerms" class="topterms-holder">
<form>
<p class="head">
<input type="text" ng-model="topTermsCount" ng-change="loadTermInfo()">
<a class="max-holder" ng-click="loadAllTopTerms()" title="Load all Top-Terms">/<span class="max">{{termInfo.maxTerms | number}}</span></a> Top-Terms:
<a id="query_link" href="#/{{core}}/query?q={{name}}:[* TO *]"><span>Query</span>&nbsp;</a>
</p>
</form>
<ul>
<li class="clearfix" ng-repeat="countGroup in termInfo.topTerms">
<p><span>{{countGroup.count}}</span></p>
<ul>
<li ng-repeat="term in countGroup.terms" ng-class="{odd:$odd}"><a href="#/{{core}}/query?q={{name}}:{{term}}">{{term}}</a></li>
</ul>
</li>
</ul>
</div>
<div ng-show="showTerms && termInfo.histogram" class="histogram-holder">
<p class="head">Histogram:</p>
<ul>
<li ng-repeat="row in termInfo.histogram" ng-class="{odd:$odd}">
<dl class="clearfix" style="width: {{(( row.value / termInfo.histogramMax ) * 100 )}}%;">
<dt><span>{{ row.key | number}}</span></dt>
<dd><span>{{ row.value | number }}</span></dd>
</dl>
</li>
</ul>
</div>
</div>
</div>
</div>
<div id="related">
<select id="type_or_name"
ng-model="fieldOrType"
chosen
data-placeholder="Please select ..."
ng-change="selectFieldOrType()"
ng-options="f.value as f.label group by f.group for f in fieldsAndTypes"></select>
<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?field={{field}}">{{field}}</a></dd>
<dt class="copyfield" ng-show="leftbar.copyFieldSources">Copied from</dt>
<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">
<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?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?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?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?field={{defaultSearchField}}">{{defaultSearchField}}</a></dd>
</dl>
</div>
</div>
</div>
</div>