This commit is contained in:
2026-05-15 22:19:14 -07:00
commit f4f046263c
2058 changed files with 236159 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
<!--
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="dashboard">
<div class="clearfix">
<div id="collection" class="block collprops">
<h2><span>Alias: {{selectedCollection.name}}</span></h2>
<div class="content">
<dl>
<dt><span>Collections:</span></dt>
<dd>
<span ng-repeat="coll in (selectedCollection.collections | splitByComma)">
<a href="#~collections/{{coll}}">{{coll}}</a>{{$last ? '' : ', '}}
</span>
</dd>
<span ng-repeat="(key, value) in selectedCollection.properties">
<dt><span>{{ key }}</span></dt>
<dd>{{ value }}</dd>
</span>
</dl>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,128 @@
<!--
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="analysis">
<div class="block analysis-error" id="analysis-handler-missing" ng-show="isHandlerMissing">
<div class="head">This Functionality requires the <code>/analysis/field</code> Handler to be registered and active!</div>
</div>
<div class="block analysis-error" id="analysis-error" ng-show="analysisError">
<div class="body">{{analysisError}}</div>
</div>
<div id="analysis-holder">
<div id="field-analysis">
<form method="get">
<ul class="clearfix">
<li class="index">
<label for="analysis_fieldvalue_index">Field Value (Index)</label>
<textarea name="analysis.fieldvalue" id="analysis_fieldvalue_index" ng-model="indexText"></textarea>
</li>
<li class="query">
<label for="analysis_fieldvalue_query">Field Value (Query)</label>
<textarea name="analysis.query" id="analysis_fieldvalue_query" ng-model="queryText"></textarea>
</li>
<li class="settings-holder clearfix">
<div class="settings clearfix">
<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?{{schemaBrowserUrl}}"><span>Schema Browser</span>&nbsp;</a>
<div class="buttons clearfix">
<button type="submit" ng-click="updateQueryString()"><span>Analyse Values</span></button>
<div class="verbose_output" ng-class="{active:verbose}">
<a ng-click="toggleVerbose()">Verbose Output</a>
</div>
</div>
</div>
</li>
</ul>
</form>
</div>
<div id="analysis-result" class="clearfix verbose_output">
<div ng-class="key" ng-repeat="(key, type) in result">
<table border="0" cellspacing="0" cellpadding="0">
<tbody ng-repeat="component in type">
<tr class="step">
<td class="part analyzer">
<div>
<abbr title="{{component.name}}">{{component.short}}</abbr>
</div>
</td>
<td class="part legend" ng-show="verbose">
<div class="holder">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<table border="0" cellspacing="0" cellpadding="0">
<tr ng-repeat="caption in component.captions" class="{{generate_class_name( short_key )}}">
<td>{{ caption }}</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</td>
<td class="part data" ng-class="{spacer:token.blank}" colspan="1" ng-repeat="token in component.tokens track by token.index">
<div class="holder" ng-hide="token.blank">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr class="details">
<td class="details">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr class="{{value.name}} {{value.extraclass}}" ng-repeat="value in token.keys" ng-show="verbose || value.name=='text'">
<td>{{value.value}}</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>
<div class="holder" ng-show="token.blank">&nbsp;</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,303 @@
<!--
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="cloud" class="clearfix">
<div id="frame">
<div id="zk-status-content" class="content clearfix" ng-show="showZkStatus">
<div id="zk-controls">
<a class="reload" ng-click="initZookeeper()"><span>Refresh</span></a>
<a class="details-button" ng-click="toggleDetails()" ng-class="{on:showDetails}">
<span>Toggle details</span>
</a>
</div>
<div class="zookeeper-status">Status: <span class="zkstatus-{{zkState.status}}">{{zkState.status}}</span></div>
<div class="zookeeper-errors" ng-show="zkState.errors">
Errors:
<ul>
<li ng-repeat="error in zkState.errors">{{error}}</li>
</ul>
</div>
<div>ZK connection string: {{zkState.zkHost}}</div>
<div>Ensemble size: {{zkState.ensembleSize}}</div>
<div>Ensemble mode: {{zkState.mode}}</div>
<div>Dynamic reconfig enabled: {{zkState.dynamicReconfig}}</div>
<table id="zk-table">
<thead>
<tr>
<th></th>
<th ng-repeat="host in zkState.details">{{host.host}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="key in mainKeys">
<td>{{key}}</td>
<td ng-repeat="host in zkState.details" ng-style="key === 'zk_server_state' && host[key] === 'leader' ? {'font-weight': 'bold'} : {'font-weight': 'normal'}">
{{key === 'zk_version' ? host[key].split("-")[0] : host[key]}}
</td>
</tr>
<tr ng-repeat="key in ensembleMainKeys" ng-show="zkState.mode === 'ensemble'">
<td>{{key}}</td>
<td ng-repeat="host in zkState.details">
{{host[key]}}
</td>
</tr>
<tr id="detail-divider" ng-show="showDetails" >
<td ng-class="details"></td>
<td ng-repeat="host in zkState.details" ng-class="details"></td>
</tr>
<tr ng-repeat="key in detailKeys | filter: notEmptyRow" ng-show="showDetails">
<td>{{key}}</td>
<td ng-repeat="host in zkState.details">
{{host[key]}}
</td>
</tr>
<tr ng-repeat="key in ensembleDetailKeys | filter: notEmptyRow" ng-show="showDetails && zkState.mode === 'ensemble'">
<td>{{key}}</td>
<td ng-repeat="host in zkState.details">
{{host[key]}}
</td>
</tr>
</tbody>
</table>
</div>
<div id="tree-content" class="content clearfix" ng-show="showTree">
<jstree class="tree" on-select="showTreeLink(url)" id="tree" data="tree"></jstree>
<div id="file-content" class="clearfix">
<a id="toggle" ng-click="showProps = !showProps" ng-show="showData" ng-class="showProps ? 'minus' : 'plus'">Metadata</a>
<div id="prop" ng-show="znode.prop && showData && showProps">
<ul>
<li ng-class="{odd:$odd}" ng-repeat="(key, prop) in znode.prop">
<dl class="clearfix">
<dt>{{ key }}</dt>
<dd>{{ prop }}</dd>
</dl>
</li>
</ul>
</div>
<div id="data" ng-show="showData">
<em ng-show="!znode.data">Node "{{znode.path }}" has no utf8 Content</em>
<pre ng-show="znode.data" class="syntax language-{{lang}}"
ng-bind-html="znode.data | highlight:lang | unsafe">
</pre>
<a class="close" ng-click="hideData()"><span>&nbsp;</span></a>
</div>
</div>
</div>
<div id="nodes-content" class="content clearfix" ng-show="showNodes">
<div id="controls">
<a class="reload" ng-click="initClusterState()"><span>Refresh</span></a>
<a class="details-button" ng-click="toggleAllDetails()" ng-class="{on:showAllDetails}">
<span>Show all details</span>
</a>
</div>
<div>
<div id="nodesPaging">
<button ng-show="prevEnabled" ng-click="previousPage()" id="nodesPagingPrev">&lt; Previous</button>
<span ng-show="filteredHosts.length==0">No hosts found.</span>
<span ng-hide="filteredHosts.length==0">Hosts {{from+1}} - {{from + hostsToShow.length}} of {{filteredHosts.length}}.</span>&nbsp;
Filter by:&nbsp;<select ng-model="filterType" ng-change="filterInput()" id="nodesPagingFilterType">
<option value="node">Host/node name</option>
<option value="collection">Collection name</option>
</select>&nbsp;
<span ng-show="filterType=='node'">
<input ng-model="nodeFilter" type="text" size="10" name="nodefilter" ng-change="filterInput()" ng-model-options='{ debounce: 500 }' />&nbsp;
</span>
<span ng-show="filterType=='collection'">
<input ng-model="collectionFilter" type="text" size="10" name="collectionfilter" ng-change="filterInput()" ng-model-options='{ debounce: 500 }'/>&nbsp;
</span>
Show <input ng-model="pageSize" ng-change="filterInput()" type="text" size="2" name="rows" ng-model-options='{ debounce: 500 }'/> hosts per page.
<button ng-show="nextEnabled" ng-click="nextPage()">Next &gt;</button>
</div>
</div>
<table id="nodes-table">
<thead>
<tr>
<th>Host</th>
<th>Node</th>
<th>CPU</th>
<th>Heap</th>
<th>Disk usage</th>
<th>Requests</th>
<th>Collections</th>
<th>Replicas</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="key in nodesToShow | orderBy:'key.order'" ng-init="n = nodes[key]; h = nodes[firstLiveNodeForHost(key)]">
<td rowspan="{{hosts[h.host].nodes.length}}" ng-show="isFirstNodeForHost(key)">
<div class="host-name">{{h.host}}</div>
<span class="host-spec" ng-show="!showDetails[h.host]">
<span title="{{h.system.system.uptime}}">{{h.system.system.name}}</span>
<span title="free: {{h.memFree}}">{{h.memTotal}}</span>
<span title="{{h.system.jvm.name}} {{h.system.jvm.version}}">Java {{h.system.jvm.spec.version}}</span>
<br/>Load: {{h.loadAvg}}
</span>
<div class="host-spec" ng-show="showDetails[h.host]">
{{h.system.system.name}} {{h.system.system.version}}, {{h.system.system.availableProcessors}}cpu<br/>
Uptime: {{h.uptime}}<br/>
<span title="Used: {{h.memUsed}} - includes OS file-cache, and it is normal for it to approach 100%">Memory: {{h.memTotal}}</span><br/>
File descriptors: {{h.openFileDescriptorCount}}/{{h.maxFileDescriptorCount}}<br/>
Disk: <span class="{{h.diskUsedPctStyle}}" title="Nodes may use other disks too">{{h.diskTotal}} used: {{h.diskUsedPct}}%</span><br/>
Load: {{h.loadAvg}}
</div>
<div class="node-spec" ng-click="toggleHostDetails(h.host)">
<a ng-show="showDetails[h.host]">hide details...</a>
<a ng-show="!showDetails[h.host]">show details...</a>
</div>
</td>
<td ng-class="{'dead-node': n.dead}"><div class="node-name"><a href="{{n.base_url}}">{{key.replace(n.host+':', '')}}</a></div>
<div ng-show="n.dead" class="node-down">(DEAD)</div>
<div ng-show="!n.dead">
Uptime: {{n.jvmUptime}}<br/>
<div class="node-spec" ng-show="showDetails[key]">
Java <span title="{{n.system.jvm.jre.vendor}}">{{n.system.jvm.jre.version}}</span><br/>
Solr {{n.system.lucene['solr-impl-version'].split(" ")[0]}}<br>
</div>
<div class="node-spec" ng-click="toggleDetails(key)">
<a ng-show="showDetails[key]">hide details...</a>
<a ng-show="!showDetails[key]">show details...</a>
</div>
</div>
</td>
<td ng-class="{'dead-node': n.dead}">
<div class="node-cpu" ng-show="!n.dead">
<span class="{{n.cpuPctStyle}}">{{n.cpuPct}}%</span>
</div>
</td>
<td ng-class="{'dead-node': n.dead}">
<div class="node-heap" title="total: {{n.heapTotal}} free: {{n.heapFree}} used%: {{n.heapUsedPct}}%" ng-show="!n.dead">
<span class="{{n.heapUsedPctStyle}}">{{n.heapUsedPct}}%</span>
</div>
<div class="node-spec" ng-show="showDetails[key] && !n.dead">
Max: {{n.heapTotal}}<br/>
Used: {{n.heapUsed}}
</div>
</td>
<td class="scroll-height-250" ng-class="{'dead-node': n.dead}">
<div>
<div class="node-disk" title="Available disk: {{n.diskTotal}} free: {{n.diskFree}} used by this node: {{n.size}}" ng-show="!n.dead">
{{n.size}}
</div>
<div class="node-spec" ng-show="showDetails[key] && !n.dead">
Total #docs: {{n.numDocs}}<br/>
Avg size/doc: {{n.sizePerDoc}}
</div>
<div id="chart{{n.id}}" ng-show="showDetails[key] && !n.dead"></div>
</div>
</td>
<td ng-class="{'dead-node': n.dead}"><div class="node-requests" title="1minRate: {{n.req1minRate}} 5minRate: {{n.req5minRate}} 15minRate: {{n.req15minRate}} p75: {{n.reqp75_ms}} p99: {{n.reqp99_ms}}" ng-show="!n.dead">
RPM: {{n.req15minRate}}<br/>p95: {{n.reqp95_ms}}ms</div>
</td>
<td ng-class="{'dead-node': n.dead}">
<div ng-show="!n.collections">(none)</div>
<div ng-repeat="c in n.collections | limitTo:showDetails[key]?999:2 track by $index">
<a href="{{h.base_url + '/#/~collections/' + c}}">{{ c }}</a>
</div>
<div class="more" ng-show="n.collections.length > 2 && !showDetails[key]">
<a ng-click="toggleDetails(key)">({{n.collections.length - 2}} more...)</a>
</div>
</td>
<td class="scroll-height-250" ng-class="{'dead-node': n.dead}">
<div ng-show="!n.cores">(none)</div>
<div ng-repeat="core in n.cores | limitTo:showDetails[key]?999:2 track by $index">
<div ng-show="!n.dead"><a class="{{core.leader ? 'leader' : 'replica'}}" href="{{core.base_url + '/#/' + core.core + '/core-overview'}}">{{ core.label }}</a> ({{core.numDocsHuman}} docs)</div>
<div ng-show="n.dead">{{ core.label }}</div>
<ul class="core-details" ng-show="showDetails[key] && !n.dead" >
<li>deleted: {{core.deletedDocsHuman}}</li>
<li>warmupTime: {{core.warmupTime}}</li>
<li ng-show="core.numDocs > 0">avg size/doc: {{core.avgSizePerDoc}}</li>
</ul>
</div>
<div class="more" ng-show="n.cores.length > 2 && !showDetails[key] && !n.dead">
<a ng-click="toggleDetails(key)">({{n.cores.length - 2}} more...)</a>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div graph data="graphData" leaf-count="leafCount" helper-data="helperData" id="graph-content" class="content clearfix" ng-show="showGraph">
<div id="canvas"></div>
<div id="legend">
<ul>
<li class="leader"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Leader</li>
<li class="active"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Active</li>
<li class="recovering"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Recovering</li>
<li class="down"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Down</li>
<li class="recovery_failed"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Recovery Failed</li>
<li class="shard-inactive"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Inactive</li>
<li class="gone"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><circle r="4.5"></circle></g></g></svg> Gone</li>
<li class="replicatype"><svg width="15" height="15"><g transform="translate(5,2)"><g transform="translate(0,5)"><rect width="8" height="8"></rect></g></g></svg>Replica Type:<br/>N(NRT),T(TLOG),<br/>P(PULL) </li>
</ul>
</div>
<div style="width: 100%; text-align: center;" ng-show="showPaging">
<div id="cloudGraphPaging">
<button ng-show="prevEnabled" ng-click="previous()" id="cloudGraphPagingPrev">&lt; Previous</button>
<span ng-show="total==0">No collections found.</span>
<span ng-hide="total==0">Collections {{start}} - {{last}} of {{total}}.</span>&nbsp;
Filter by:&nbsp;<select ng-model="filterType" ng-change="initGraph()" id="cloudGraphPagingFilterType">
<option value="status">Status</option>
<option value="name">Name</option>
</select>&nbsp;T:{{filterType}}
<span ng-show="filterType=='status'">
<select ng-model="pagingStatusFilter" id="cloudGraphPagingStatusFilter" ng-change="resetGraph()">
<option value=""> - Any - </option>
<option value="healthy">Healthy</option>
<option value="degraded">Degraded</option>
<option value="downed_shard">Downed Shard</option>
<option value="recovering">Replica in Recovery</option>
</select>
</span>
<span ng-show="filterType=='name'">
<input ng-model="pagingFilter" type="text" size="10" name="filter" ng-change="resetGraph()"/>&nbsp;
</span>
Show <input ng-model="rows" ng-change="resetGraph()" type="text" size="2" name="rows" /> per page.
<button ng-show="nextEnabled" ng-click="next()">Next &gt;</button>
</div>
</div>
</div>
</div>
<div id="debug" ng-show="showDebug">
<ul class="clearfix">
<li class="clipboard"><a href="#" data-copied="Copied to Clipboard!">Copy to Clipboard (BUGGY!)</a></li>
<li class="close"><a ng-click="closeDebug()">Close</a></li>
</ul>
<pre class="debug"></pre>
</div>
</div>

View File

@@ -0,0 +1,79 @@
<!--
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="dashboard">
<div class="clearfix">
<div id="collection" class="block collprops">
<h2><span>Collection: {{selectedCollection.name}}</span></h2>
<div class="content">
<dl>
<dt>Config name:</dt>
<dd class="value">{{selectedCollection.configName}}</dd>
<dt>Replication factor:</dt>
<dd class="value">{{selectedCollection.replicationFactor}}</dd>
<dt>Router name:</dt>
<dd class="value">{{selectedCollection.router.name}}</dd>
</dl>
</div>
</div>
<div id="shards" class="block fieldlist">
<h2><span>Shards</span></h2>
<div>
<div class="shard" ng-repeat="(name, shard) in selectedCollection.shards">
<a ng-click="hideShard(shard)"><h3 class="shard-title">{{name}}</h3></a>
<dl class="shard-detail clearfix" ng-hide="shard.hide">
<dt>Range:</dt>
<dd class="value">{{ shard.range }}</dd>
<dt>Active:</dt>
<dd class="ico value" ng-class="shard.state='active' ? 'ico-1' : 'ico-0'"><span>yes</span></dd>
<dt>Replicas:</dt>
<dd>
<div class="replica clearfix {{$odd?'odd':''}}" ng-repeat="(name, replica) in shard.replicas">
<a ng-click="showReplica(replica)"><h3>{{replica.core}}</h3></a>
<dl ng-show="replica.show">
<dt>Base URL: </dt><dd>{{replica.base_url}}</dd>
<dt>Core: </dt><dd><a href="{{replica.base_url}}{{rootUrl}}#/{{replica.core}}">{{replica.core}}</a></dd>
<dt>Active: </dt>
<dd class="ico value" ng-class="replica.state == 'active' ? 'ico-1' : 'ico-0'"><span>yes</span></dd>
<dt>Leader: </dt>
<dd class="ico value" ng-class="replica.leader == 'true' ? 'ico-1' : 'ico-0'"><span>yes</span></dd>
</dl>
</div>
</dd>
</dl>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,413 @@
<!--
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="collections" class="clearfix empty">
<div id="ui-block" style="display:none">&nbsp;</div><!-- @todo what is this for? -->
<div class="actions clearfix">
<div class="action add" data-rel="add" ng-show="showAdd" style="left:0px;width:500px">
<form>
<p class="clearfix"><label for="add_name">name:</label>
<input type="text" name="name" id="add_name" ng-model="newCollection.name" placeholder="new collection"></p>
<p class="clearfix"><label for="add_config">config set:</label>&nbsp;
<select chosen ng-options="config.name as config.name for config in configs" name="config_name" id="add_config" ng-model="newCollection.configName">
</select>
</p>
<p class="clearfix"><label for="add_numShards">numShards:</label>
<input type="text" name="numShards" id="add_numShards" ng-model="newCollection.numShards"></p>
<p class="clearfix replication-factor" ng-disabled="replicaTypesChosen()"><label for="add_replicationFactor">replicationFactor:</label>
<input type="text" name="replicationFactor" id="add_replicationFactor"
ng-model="newCollection.replicationFactor"
ng-disabled="replicaTypesChosen()"
class="replication-factor"
>
</p>
<p class="clearfix"><a ng-click="showAdvanced=!showAdvanced">
<span id="add_advanced" ng-class="{open: showAdvanced}">Show advanced</span></a></p>
<div ng-show="showAdvanced">
<p>Advanced options: </p>
<p class="clearfix"><label for="add_router_name">router:</label>
<select name="routerName" id="add_router_name" ng-model="newCollection.routerName">
<option value="compositeId">Composite ID</option>
<option value="implicit">Implicit</option>
</select>
</p>
<p class="clearfix"><label for="add_shards">shards:</label>
<input type="text" name="shards" id="add_shards" ng-model="newCollection.shards"></p>
<p class="clearfix"><label for="add_routerField">router.field:</label>
<input type="text" name="routerField" id="add_routerField" ng-model="newCollection.routerField"></p>
<p class="clearfix"><label for="add_createNodeSet">createNodeSet:</label>
<select
chosen
multiple
disable-search="true"
ng-model="newCollection.createNodeSet"
ng-options="node for node in availableNodeSet">
</select>
</p>
<p>Replica Types: </p>
<p class="clearfix"><Label for="add_nrtReplicas">nrt replicas:</Label>
<input type="text" name="nrtReplicas" id="add_nrtReplicas" ng-model="newCollection.nrtReplicas"></p>
<p class="clearfix"><Label for="add_tlogReplicas">tlog replicas:</Label>
<input type="text" name="tlogReplicas" id="add_tlogReplicas" ng-model="newCollection.tlogReplicas"></p>
<p class="clearfix"><Label for="add_pullReplicas">pull replicas:</Label>
<input type="text" name="pullReplicas" id="add_pullReplicas" ng-model="newCollection.pullReplicas"></p>
</div>
<p class="clearfix note error" ng-show="addMessage">
<span>{{addMessage}}</span>
</p>
<p class="clearfix buttons">
<button type="submit" ng-class="{submit,disabled:!isPermitted(permissions.COLL_EDIT_PERM)}" ng-disabled="!isPermitted(permissions.COLL_EDIT_PERM)" ng-click="addCollection()">
<span>Add Collection</span>
</button>
<button type="reset" class="reset" ng-click="cancelAddCollection()"><span>Cancel</span></button>
</p>
</form>
</div>
<div class="action create-alias" ng-show="showCreateAlias">
<form>
<input type="hidden" name="core" data-core="current">
<p class="clearfix"><label for="alias">Alias Name:</label>
<input type="text" name="alias" ng-model="aliasToCreate" id="alias"></p>
<p class="clearfix"><label for="aliasCollections">Collections:</label>
<select multiple id="aliasCollections" ng-model="aliasCollections" ng-options="collection.name for collection in collections" class="other">
</select></p>
<p class="clearfix note error" ng-show="renameMessage">
<span>{{renameMessage}}</span>
</p>
<p class="clearfix buttons">
<button ng-class="{submit,disabled:!isPermitted(permissions.COLL_EDIT_PERM)}" ng-disabled="!isPermitted(permissions.COLL_EDIT_PERM)" ng-click="createAlias()"><span>Create Alias</span></button>
<button type="reset" class="reset" ng-click="cancelCreateAlias()"><span>Cancel</span></button>
</p>
</form>
</div>
</div>
<div id="frame">
<div id="actions" class="actions clearfix" ng-show="collection">
<button id="delete-collection" ng-class="{warn,disabled:!isPermitted(permissions.COLL_EDIT_PERM)}" ng-disabled="!isPermitted(permissions.COLL_EDIT_PERM)" ng-click="showDeleteCollection()" ng-show="collection && collection.type === 'collection'"><span>Delete collection</span></button>
<button id="delete-alias" ng-class="{action,disabled:!isPermitted(permissions.COLL_EDIT_PERM)}" ng-disabled="!isPermitted(permissions.COLL_EDIT_PERM)" ng-click="toggleDeleteAlias()" ng-show="collection && collection.type === 'alias'"><span>Delete alias</span></button>
<button id="reload" ng-click="reloadCollection()" ng-show="collection && collection.type === 'collection'"
ng-disabled="!isPermitted(permissions.COLL_EDIT_PERM)"
ng-class="{success: reloadSuccess, warn: reloadFailure, disabled:!isPermitted(permissions.COLL_EDIT_PERM)}"><span>Reload</span></button>
<div class="action delete" ng-show="showDelete">
<form>
<p>Please type collection name to confirm deletion:</p>
<p class="clearfix"><label for="collectiondeleteConfirm">Collection</label>
<input type="text" ng-model="collectionDeleteConfirm" id="collectionDeleteConfirm"></p>
<p class="clearfix note error" ng-show="deleteMessage">
<span>{{deleteMessage}}</span>
</p>
<p class="clearfix buttons">
<button class="submit" ng-click="deleteCollection()"><span>Delete</span></button>
<button type="reset" class="reset" ng-click="showDelete=false"><span>Cancel</span></button>
</p>
</form>
</div>
<div class="action delete-alias" ng-show="showDeleteAlias">
<form>
<p>Are you sure you want to delete alias {{ collection.name }}?</p>
<p class="clearfix buttons">
<button type="submit" class="submit" ng-click="deleteAlias()"><span>Delete Alias</span></button>
<button type="reset" class="reset" ng-click="cancelDeleteAlias()"><span>Cancel</span></button>
</p>
</form>
</div>
</div>
<div class="requires-core" ng-hide="collection">
<h2 ng-show="aliases.length + collections.length > 0">Please select a collection or alias</h2>
</div>
<div id="data" class="requires-core clearfix" ng-show="collection">
<div class="block" id="alias-data" ng-show="collection.type === 'alias'">
<h2>Alias: {{collection.name}}</h2>
<div class="message-container">
<div class="message"></div>
</div>
<div class="content">
<ul>
<li>
<dl class="clearfix">
<dt><span>Collections:</span></dt>
<dd>
<span ng-repeat="coll in (collection.collections | splitByComma)">
<a href="#~collections/{{coll}}">{{coll}}</a>{{$last ? '' : ', '}}
</span>
</dd>
<div ng-repeat="(key, value) in collection.properties">
<dt><span>{{ key }}</span></dt>
<dd><span>{{ value }}</span></dd>
</div>
</dl>
</li>
</ul>
</div>
</div>
<div class="block" id="collection-data" ng-show="collection.type === 'collection'">
<h2>Collection: {{collection.name}}</h2>
<div class="message-container">
<div class="message"></div>
</div>
<div class="content">
<ul>
<li>
<dl class="clearfix">
<dt><span>Shard count:</span></dt>
<dd>{{collection.shards.length}}</dd>
</dl>
</li>
<li><dl class="clearfix">
<dt><span>configName:</span></dt>
<dd>{{collection.configName}}</dd>
</dl></li>
<li><dl class="clearfix">
<dt><span>replicationFactor:</span></dt>
<dd>{{collection.replicationFactor}}</dd>
</dl></li>
<li><dl class="clearfix">
<dt><span>router:</span></dt>
<dd>{{collection.router.name}}</dd>
</dl></li>
<li ng-show="collection.aliases"><dl class="clearfix">
<dt><span>aliases:</span></dt>
<dd>
<span ng-repeat="coll in collection.aliases">
<a href="#~collections/alias_{{coll}}">{{coll}}</a>{{$last ? '' : ', '}}
</span>
</dd>
</dl></li>
</ul>
</div>
</div>
<div class="block" id="shard-data" ng-show="collection.type === 'collection'">
<div class="content shard" ng-repeat="shard in collection.shards">
<a ng-click="toggleShard(shard)">
<h2>
<span ng-class="{open:shard.show}"><b>Shard: {{shard.name}}</b></span>
<div style="float:right" ng-show="!shard.range || shard.state == 'inactive'"><a ng-click="toggleRemoveShard(shard)"><span class="rem"></span></a></div>
</h2>
</a>
<ul ng-show="shard.showRemove">
<li>
<form class="delete-shard">
<p class="clearfix"><em>Are you sure you want to delete this shard?</em></p>
<p class="clearfix buttons">
<button class="submit" ng-class="{success: shard.deleted}" ng-click="deleteShard(shard)"><span>Delete Shard</span></button>
<button type="reset" class="reset" ng-click="toggleRemoveShard(shard)"><span>Cancel</span></button>
</p>
</form>
</li>
</ul>
<ul ng-show="shard.show">
<li>
<ul>
<li>
<dl class="clearfix">
<dt><span>state:</span></dt>
<dd>{{shard.state}}</dd>
</dl>
</li>
<li>
<dl class="clearfix">
<dt><span>range:</span></dt>
<dd>{{shard.range}}</dd>
</dl>
<br/>
</li>
<li>
<ul class="replica" ng-repeat="replica in shard.replicas">
<li>
<h2>
<a ng-click="toggleReplica(replica)">
<span class="openReplica" ng-class="{open:replica.show}">Replica: {{replica.name}}</span>
</a>
<div style="float:right"><a ng-click="toggleRemoveReplica(replica)"><span class="rem"></span></a></div>
</h2>
</li>
<li>
<ul ng-show="replica.showRemove">
<li>
<form class="delete-replica">
<p class="clearfix"><em>Are you sure you want to delete this replica?</em></p>
<p class="clearfix buttons">
<button class="submit" ng-class="{success: replica.deleted}" ng-click="deleteReplica(replica)"><span>Delete Replica</span></button>
<button type="reset" class="reset" ng-click="toggleRemoveReplica(replica)"><span>Cancel</span></button>
</p>
</form>
</li>
</ul>
<ul ng-show="replica.show">
<li>
<dl class="clearfix">
<dt><span>core:</span></dt>
<dd>{{replica.core}}</dd>
</dl>
</li>
<li>
<dl class="clearfix">
<dt><span>base URL:</span></dt>
<dd><a ng-href="{{replica.base_url}}{{rootUrl}}">{{replica.base_url}}</a></dd>
</dl>
</li>
<li>
<dl class="clearfix">
<dt><span>node name:</span></dt>
<dd>{{replica.node_name}}</dd>
</dl>
</li>
<li>
<dl class="clearfix">
<dt><span>state:</span></dt>
<dd>{{replica.state}}</dd>
</dl>
</li>
<li>
<dl class="clearfix">
<dt><span>leader:</span></dt>
<dd class="ico" ng-class="replica.leader ?'ico-1' : 'ico-0'"><span></span></dd>
</dl>
</li>
</ul>
</li>
</ul>
</li>
<li ng-hide="shard.showAdd">
<span class="actions replica">
<button class="action" id="add-replica" ng-click="toggleAddReplica(shard)"><span>add replica</span></button>
</span>
</li>
</ul>
<div class="action add-replica" ng-show="shard.showAdd">
<form>
<p id="node-name" class="clearfix">
<p>
<label for="node-name">Node:</label>
<select chosen ng-model="shard.replicaNodeName" ng-options="node for node in nodes" class="other">
<option value="">No specified node</option>
</select>
</p>
<p>
<label for="node-name">Type:</label>
<select chosen ng-model="shard.replicaType" ng-init="shard.replicaType='NRT'" ng-options="node for node in ['NRT', 'TLOG', 'PULL']" class="other">
</select>
</p>
<div ng-if="shard.replicaNodeName">node: {{shard.replicaNodeName}}</div>
<div ng-if="shard.replicaNodeName">node: {{shard.replicaType}}</div>
</p>
<p class="clearfix note error" ng-show="createReplicaMessage">
<span>{{createReplicaMessage}}</span>
</p>
<p class="clearfix buttons">
<button class="submit delete" ng-class="{success: shard.replicaAdded}" ng-click="addReplica(shard)"><span>Create Replica</span></button>
<button type="reset" class="reset" ng-click="toggleAddReplica(shard)"><span>Cancel</span></button>
</p>
<p clas="clearfix">&nbsp;</p>
</form>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<div id="navigation" class="requires-core clearfix">
<button id="add" ng-class="{action,disabled:!isPermitted(permissions.COLL_EDIT_PERM)}" ng-disabled="!isPermitted(permissions.COLL_EDIT_PERM)" ng-click="showAddCollection()"><span>Add Collection</span></button>
<ul>
<li ng-repeat="c in collections" ng-class="{current: collection.name == c.name && collection.type === 'collection'}"><a href="#~collections/{{c.name}}">{{c.name}}</a></li>
</ul>
<hr/>
<button id="create-alias" ng-class="{action,disabled:!isPermitted(permissions.COLL_EDIT_PERM)}" ng-click="toggleCreateAlias()" ng-disabled="collections.length == 0 || !isPermitted(permissions.COLL_EDIT_PERM)"><span>Create Alias</span></button>
<ul>
<li ng-repeat="c in aliases" ng-class="{current: collection.name == c.name && collection.type === 'alias'}"><a href="#~collections/alias_{{c.name}}">{{c.name}}</a></li>
</ul>
</div>
</div>

View File

@@ -0,0 +1,203 @@
<!--
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="dashboard">
<div class="clearfix">
<div class="block fieldlist" id="statistics" ng-class="{disabled: statisticsDisabled}">
<h2><span>Statistics</span></h2>
<div class="message-container" ng-show="statsMessage">
<div class="message">{{statsMessage}}</div>
</div>
<div class="content">
<dl>
<dt>Last Modified:</dt>
<dd class="value">{{index.lastModified | timeago}}</dd>
<dt class="index_num-docs">Num Docs:</dt>
<dd class="value">{{index.numDocs}}</dd>
<dt class="index_max-doc">Max Doc:</dt>
<dd class="index_max-doc value">{{index.maxDoc}}</dd>
<dt class="index_deleted-docs">Deleted Docs:</dt>
<dd class="index_deleted-docs value">{{index.deletedDocs}}</dd>
<dt class="index_version">Version:</dt>
<dd class="index_version value">{{index.version}}</dd>
<dt class="index_segmentCount">Segment Count:</dt>
<dd class="index_segmentCount value">{{index.segmentCount}}</dd>
<dt class="index_current">Current:</dt>
<dd class="ico" ng-class="index.current ?'ico-1' : 'ico-0'"><span></span></dd>
</dl>
</div>
</div>
<div class="block fieldlist" id="instance">
<h2><span>Instance</span></h2>
<div class="message-container" ng-show="indexMessage">
<div class="message">{{indexMessage}}</div>
</div>
<div class="content">
<dl>
<dt><abbr title="Current Working Directory">CWD</abbr>:</dt>
<dd class="value">{{ core.directory.cwd }}</dd>
<dt>Instance:</dt>
<dd class="value">{{ core.directory.instance }}</dd>
<dt>Data:</dt>
<dd class="value">{{ core.directory.data }}</dd>
<dt>Index:</dt>
<dd class="value">{{ core.directory.index }}</dd>
<dt>Impl:</dt>
<dd class="value">{{ core.directory.dirimpl }}</dd>
</dl>
</div>
</div>
</div>
<div class="clearfix">
<div class="block" id="replication">
<h2>
<span class="is-replicating">
Replication
<span ng-show="isFollower"> (Follower)</span>
<span ng-show="isLeader"> (Leader)</span>
</span>
</h2>
<div class="message-container" ng-show="replicationMessage">
<div class="message">{{replicationMessage}}</div>
</div>
<div class="content clearfix" id="details">
<table border="0" cellspacing="0" cellpadding="0">
<thead>
<tr>
<td><span>Index</span></td>
<th>Version</th>
<th><abbr title="Generation">Gen</abbr></th>
<th>Size</th>
</tr>
</thead>
<tbody>
<tr class="leaderSearch" ng-show="isLeader">
<th>Leader (Searching)</th>
<td class="version"><div>{{replication.indexVersion}}</div></td>
<td class="generation"><div>{{replication.generation}}</div></td>
<td class="size"><div>{{replication.indexSize || '-'}}</div></td>
</tr>
<tr class="leader" ng-show="isLeader">
<th>Leader (Replicable)</th>
<td class="version"><div>{{replication.leader.replicableVersion || '-'}}</div></td>
<td class="generation"><div>{{replication.leader.replicableGeneration || '-'}}</div></td>
<td class="size"><div>-</div></td>
</tr>
<tr class="leader" ng-show="isFollower">
<th>Leader (Replicable)</th>
<td class="version"><div>{{replication.leader.replicableVersion || '-'}}</div></td>
<td class="generation"><div>{{replication.leader.replicableGeneration || '-'}}</div></td>
<td class="size"><div>-</div></td>
</tr>
<tr class="leaderSearch" ng-show="isFollower">
<th>Leader (Searching)</th>
<td class="version"><div>{{replication.follower.leaderDetails.indexVersion}}</div></td>
<td class="generation"><div>{{replication.follower.leaderDetails.generation}}</div></td>
<td class="size"><div>{{replication.follower.leaderDetails.indexSize || '-'}}</div></td>
</tr>
<tr class="follower followerOnly" ng-show="isFollower">
<th>Follower (Searching)</th>
<td class="version"><div>{{replication.indexVersion}}</div></td>
<td class="generation"><div>{{replication.generation}}</div></td>
<td class="size"><div>{{replication.indexSize || '-'}}</div></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="block fieldlist" id="healthcheck" ng-class="{disabled: healthcheckMessage}">
<h2><span>Healthcheck</span></h2>
<div class="message-container" ng-show="healthcheckMessage">
<div class="message">{{healthcheckMessage}}</div>
</div>
<div class="content" ng-show="!healthcheckMessage">
<dl>
<dt class="status">Status:</dt>
<dd class="status value ico ico-1" ng-show="healthcheckStatus" ng-click="toggleHealthcheck()">
<button class="healthcheck-status enabled">Healthcheck Status</button>
</dd>
<dd class="status value ico ico-0" ng-show="!healthcheckStatus" ng-click="toggleHealthcheck()">
<button class="healthcheck-status">enable ping</button>
</dd>
</dl>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,224 @@
<!--
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="cores" class="clearfix empty">
<div id="ui-block" style="display:none">&nbsp;</div><!-- @todo what is this for? -->
<div id="frame">
<div id="actions" class="actions clearfix">
<button id="add" class="action" ng-click="showAddCore()"><span>Add Core</span></button>
<span ng-show="hasCores">
<button id="unload" class="warn requires-core" ng-click="unloadCore()"><span>Unload</span></button>
<button id="rename" class="action requires-core" ng-click="showRenameCore()"><span>Rename</span></button>
<button id="swap" class="action requires-core" ng-click="showSwapCores()"><span>Swap</span></button>
<button id="reload" class="requires-core" ng-click="reloadCore()"
ng-class="{success: reloadSuccess, warn: reloadFailure}"><span>Reload</span></button>
</span>
<div class="action add" data-rel="add" ng-show="showAdd" style="display:block;left:0px;">
<form>
<p class="clearfix"><label for="add_name">name:</label>
<input type="text" name="name" id="add_name" ng-model="newCore.name"></p>
<p class="clearfix"><label for="add_instanceDir">instanceDir:</label>
<input type="text" name="instanceDir" id="add_instanceDir" ng-model="newCore.instanceDir"></p>
<p class="clearfix"><label for="add_dataDir">dataDir:</label>
<input type="text" name="dataDir" id="add_dataDir" ng-model="newCore.dataDir"></p>
<p class="clearfix"><label for="add_config">config:</label>
<input type="text" name="config" id="add_config" ng-model="newCore.config"></p>
<p class="clearfix"><label for="add_schema">schema:</label>
<input type="text" name="schema" id="add_schema" ng-model="newCore.schema"></p>
<div class="cloud" ng-show="isCloud">
<p class="clearfix"><label for="add_collection">collection:</label>
<input type="text" name="collection" id="add_collection" ng-model="newCore.collection"></p>
<p class="clearfix"><label for="add_shard">shard:</label>
<input type="text" name="add_shard" id="add_shard" ng-model="newCore.shard"></p>
</div>
<p class="clearfix note directory-note">
<span><code>instanceDir</code> and <code>dataDir</code> need to exist before you can create the core</span>
</p>
<p class="clearfix note error" ng-show="addMessage">
<span>{{addMessage}}</span>
</p>
<p class="clearfix buttons">
<button type="submit" class="submit" ng-click="addCore()"><span>Add Core</span></button>
<button type="reset" class="reset" ng-click="cancelAddCore()"><span>Cancel</span></button>
</p>
</form>
</div>
<div class="action rename" ng-show="showRename">
<form>
<input type="hidden" name="core" data-core="current">
<p class="clearfix"><label for="rename_other">New Name:</label>
<input type="text" name="other" ng-model="other" id="rename_other"></p>
<p class="clearfix note error" ng-show="renameMessage">
<span>{{renameMessage}}</span>
</p>
<p class="clearfix buttons">
<button class="submit" ng-click="renameCore()"><span>Rename Core</span></button>
<button type="reset" class="reset" ng-click="cancelRenameCore()"><span>Cancel</span></button>
</p>
</form>
</div>
<div class="action swap" ng-show="showSwap">
<form>
<p class="clearfix"><label for="swap_core">this:</label>
<input type="text" id="swap_core" name="core" ng-model="selectedCore" readonly="readonly"></p>
<p class="clearfix"><label for="swap_other">and:</label>
<select id="swap_other" ng-model="swapOther" ng-options="core.name as core.name for core in swapCorelist" class="other">
</select></p>
<p class="clearfix note error" ng-show="swapMessage">
<span>{{swapMessage}}</span>
</p>
<p class="clearfix buttons">
<button type="submit" class="submit" ng-click="swapCores()"><span>Swap Cores</span></button>
<button type="reset" class="reset" ng-click="cancelSwapCores()"><span>Cancel</span></button>
</p>
</form>
</div>
</div>
<div id="data" class="requires-core" ng-show="hasCores">
<div class="block" id="core-data">
<h2><span>Core</span></h2>
<div class="message-container">
<div class="message"></div>
</div>
<div class="content">
<ul>
<li class="startTime"><dl class="clearfix">
<dt><span>startTime:</span></dt>
<dd class="timeago">{{core.startTime | timeago}}</dd>
</dl></li>
<li class="instanceDir"><dl class="clearfix">
<dt><span>instanceDir:</span></dt>
<dd>{{core.instanceDir}}</dd>
</dl></li>
<li class="dataDir"><dl class="clearfix">
<dt><span>dataDir:</span></dt>
<dd>{{core.dataDir}}</dd>
</dl></li>
</ul>
</div>
</div>
<div class="block" id="index-data" ng-show="hasCores">
<h2><span>Index</span></h2>
<div class="message-container">
<div class="message">{{core.message}}</div>
</div>
<div class="content">
<ul>
<li class="lastModified"><dl class="clearfix">
<dt><span>lastModified:</span></dt>
<dd class="timeago">{{core.index.lastModified | timeago}}</dd>
</dl></li>
<li class="version"><dl class="clearfix">
<dt><span>version:</span></dt>
<dd>{{core.index.version}}</dd>
</dl></li>
<li class="numDocs"><dl class="clearfix">
<dt><span>numDocs:</span></dt>
<dd>{{core.index.numDocs}}</dd>
</dl></li>
<li class="maxDoc"><dl class="clearfix">
<dt><span>maxDoc:</span></dt>
<dd>{{core.index.maxDoc}}</dd>
</dl></li>
<li class="deletedDocs"><dl class="clearfix">
<dt><span>deletedDocs:</span></dt>
<dd>{{core.index.deletedDocs}}</dd>
</dl></li>
<li class="current"><dl class="clearfix">
<dt><span>current:</span></dt>
<dd class="ico" ng-class="core.index.current ?'ico-1' : 'ico-0'"><span></span></dd>
</dl></li>
<li class="directory"><dl class="clearfix">
<dt><span>directory:</span></dt>
<dd>{{core.index.directory}}</dd>
</dl></li>
</ul>
</div>
</div>
</div>
</div>
<div id="navigation" class="requires-core clearfix" ng-show="hasCores">
<ul>
<li ng-repeat="c in cores" ng-class="{current: core.name == c.name}"><a href="#~cores/{{c.name}}">{{c.name}}</a></li>
</ul>
</div>
</div>

View File

@@ -0,0 +1,111 @@
<!--
/*
* 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="documents" class="clearfix">
<div id="form">
<form>
<label for="qt">
<a rel="help">Request-Handler (qt)</a>
</label>
<input ng-model="handler" type="text" id="qt" value="/update" title="Request handler in solrconfig.xml.">
<label for="document-type">
<a rel="help">Document Type</a>
</label>
<div><select ng-model="type" id="document-type" ng-change="changeDocumentType()" placeholder="The type of the document field">
<!-- TODO: support the Builder -->
<option value="csv">CSV</option>
<option value="wizard">Document Builder</option>
<option value="upload">File Upload</option>
<option value="json">JSON</option>
<option value="solr">Solr Command (raw XML or JSON)</option>
<option value="xml">XML</option>
</select>
</div>
<div id="document-container">
<div id="wizard" ng-show="type=='wizard'">
<div id="wizard-fields">
<div><span class="description">Field</span>: <select ng-model="fieldName" id="wiz-field-select" name="wiz-field-select"
ng-options="field for field in fields"></select>
</div>
<div><span id="wiz-field-data"><span class="description">Field Data</span>:</span>
<textarea ng-model="fieldData"
id="wizard-doc"
name="wizard-doc"
rows="10"
cols="40"
placeholder="Enter your field text here and then click 'Add Field' to add the field to the document.">
</textarea>
</div>
</div>
<div id="wizard-add"><a ng-click="addWizardField()" id="add-field-href"><img border="0" src="./img/ico/plus-button.png"/>Add
Field</a></div>
</div>
<label for="document">
<a rel="help">Document(s)</a>
</label>
<textarea ng-show="type!='upload'" ng-model="document" name="document" id="document" title="The Document" rows="10"
cols="70" placeholder="{{placeholder}}"></textarea>
<div id="file-upload" ng-show="type=='upload'">
<input type="file" id="the-file" name="the-file" file-model="fileUpload"/>
</div>
</div>
<div id="advanced">
<!-- TODO: only show for JSON/XML-->
<div id="attribs">
<div id="upload-only" ng-show="type=='upload'">
<label for="erh-params"><!-- TODO: cleaner way to do this? -->
<a rel="help">Extracting Req. Handler Params</a>
</label>
<input ng-model="literalParams" type="text" id="erh-params" value="&literal.id=change.me"
title="Extracting Request Handler Parameters" size="50">
</div>
<div id="general-attribs">
<label for="commitWithin">
<a rel="help">Commit Within</a>
</label>
<input type="text" ng-model="commitWithin" id="commitWithin" value="1000" title="Commit Within (ms)">
<label for="overwrite">
<a rel="help">Overwrite</a>
</label>
<input ng-model="overwrite" type="text" id="overwrite" value="true" title="Overwrite">
</div>
</div>
</div>
<button type="submit" ng-click="submit()" id="submit">Submit Document</button>
</form>
</div>
<div id="result">
<div id="response" ng-show="response">
<div>
<span class="description">Status: </span>{{ responseStatus }}
</div>
<div>
<span class="description">Response:</span>
<pre class="syntax language-json"><code ng-bind-html="response | highlight:'json' | unsafe"></code></pre>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,47 @@
<!--
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="files" class="clearfix">
<div id="frame">
<div id="tree-holder">
<jstree class="tree" on-select="showTreeLink(data)" data="tree" id="tree"></jstree>
</div>
<div id="file-content" class="clearfix">
<div class="top clearfix">
<a id="url" class="address-bar" href="{{url}}" ng-show="url">{{baseurl}}{{url}}</a>
</div>
<div class="view-file">
<div class="response" ng-show="content">
<pre class="syntax language-{{lang}}"><code ng-bind-html="content | highlight:lang | unsafe"></code></pre>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,306 @@
<!--
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="index" class="clearfix">
<div class="clearfix">
<div class="index-left">
<div class="block" id="instance">
<h2><span>Instance</span></h2>
<div class="content">
<ul class="data" ngShow="system">
<li class="start_time"><dl class="clearfix">
<dt><span>Start</span></dt>
<dd class="timeago">{{system.jvm.jmx.startTime | timeago}}</dd>
</dl></li>
<!--
<li class="host"><dl class="clearfix">
<dt><span>Host</span></dt>
<dd></dd>
</dl></li>
<li class="dir dir_cwd"><dl class="clearfix">
<dt><span>CWD</span></dt>
<dd></dd>
</dl></li>
<li class="dir dir_instance"><dl class="clearfix">
<dt><span>Instance</span></dt>
<dd></dd>
</dl></li>
<li class="dir dir_data"><dl class="clearfix">
<dt><span>Data</span></dt>
<dd></dd>
</dl></li>
<li class="dir dir_index"><dl class="clearfix">
<dt><span>Index</span></dt>
<dd></dd>
</dl></li>
-->
</ul>
</div>
</div>
<div class="block" id="versions">
<h2><span>Versions</span></h2>
<div class="content">
<ul class="data">
<li class="solr solr_spec_version"><dl class="clearfix">
<dt><span>solr-spec</span></dt>
<dd>{{system.lucene["solr-spec-version"]}}</dd>
</dl></li>
<li class="solr_impl_version"><dl class="clearfix">
<dt class=""><span>solr-impl</span></dt>
<dd>{{system.lucene["solr-impl-version"]}}</dd>
</dl></li>
<li class="lucene lucene_spec_version"><dl class="clearfix">
<dt><span>lucene-spec</span></dt>
<dd>{{system.lucene["lucene-spec-version"]}}</dd>
</dl></li>
<li class="lucene_impl_version"><dl class="clearfix">
<dt><span>lucene-impl</span></dt>
<dd>{{system.lucene["lucene-impl-version"]}}</dd>
</dl></li>
</ul>
</div>
<div class="content" ng-show="releaseDaysOld > 365">
<p class="warning-msg"><img src="img/ico/exclamation-button.png"/>&nbsp;WARNING: This Solr release is more than a year old. Consider upgrading.</p>
</div>
</div>
</div>
<div class="index-right">
<div class="block" id="system">
<h2><span>System</span>
<small class="bar-desc">{{load_average}}</small>
</h2>
<a class="reload" ng-click="reload()"><span>reload</span></a>
<div class="content">
<div id="physical-memory-bar" ng-show="system.system.totalPhysicalMemorySize && system.system.freePhysicalMemorySize">
<p data-desc="physical-memory-bar">Physical Memory
<small class="bar-desc">{{memoryPercentage}}</small>
</p>
<div class="bar-holder bar-lvl-2">
<div class="bar-max bar">
<span class="bar-max val">{{memoryMax}}</span>
<div class="bar-total bar" ng-style="{width:memoryPercentage}">
<span class="bar-total val" title="raw: {{memoryTotal}}B">{{memoryTotalDisplay}}</span>
</div>
</div>
</div>
</div>
<div id="swap-space-bar" ng-show="system.system.totalSwapSpaceSize && system.system.freeSwapSpaceSize">
<p data-desc="swap-space-bar">Swap Space
<small class="bar-desc">{{swapPercentage}}</small>
</p>
<div class="bar-holder bar-lvl-2">
<div class="bar-max bar">
<span class="bar-max val">{{swapMax}}</span>
<div class="bar-total bar" ng-style="{width:swapPercentage}">
<span class="bar-total val" title="raw:{{swapTotal}}B">{{swapTotalDisplay}}</span>
</div>
</div>
</div>
</div>
<div id="file-descriptor-bar" ng-show="system.system.maxFileDescriptorCount && system.system.openFileDescriptorCount">
<p data-desc="file-descriptor-bar">File Descriptor Count
<small class="bar-desc">{{fileDescriptorPercentage}}</small>
</p>
<div class="bar-holder bar-lvl-2">
<div class="bar-max bar">
<span class="bar-max val">{{system.system.maxFileDescriptorCount}}</span>
<div class="bar-total bar" ng-style="{width:fileDescriptorPercentage}">
<span class="bar-total val">{{system.system.openFileDescriptorCount}}</span>
</div>
</div>
</div>
</div>
<p class="no-info" ng-show="noInfo">Sorry, no information available</p>
</div>
</div>
</div>
</div>
<div class="clearfix">
<div class="index-left">
<div class="block" id="jvm">
<h2><span>JVM</span></h2>
<div class="content clearfix">
<ul class="data">
<li class="jvm_version"><dl class="clearfix">
<dt><span>Runtime</span></dt>
<dd>{{system.jvm.name}} {{system.jvm.version}}</dd>
</dl></li>
<li class="processors"><dl class="clearfix">
<dt><span>Processors</span></dt>
<dd>{{system.jvm.processors}}</dd>
</dl></li>
<li class="command_line_args"><dl class="clearfix">
<dt><span>Args</span></dt>
<dd ng-repeat="arg in commandLineArgs track by $index" ng-class="{'odd':$odd}">{{arg}}</dd>
</dl></li>
<li>
<div id="sort-command-line" ng-click="toggleCommandLineOrder()"><a ng-class="{on: commandLineOrderBy=='Sorted'}">Sort JVM Command line Args</a></div>
</li>
</ul>
</div>
</div>
</div>
<div class="index-right">
<div class="block" id="jvm-memory">
<h2><span data-desc="jvm-memory-bar">JVM-Memory
<small class="bar-desc">{{javaMemoryPercentage}}</small>
</span></h2>
<div class="content">
<div id="jvm-memory-bar">
<div class="bar-holder bar-lvl-3">
<div class="bar-max bar">
<span class="bar-max val" title="raw: {{javaMemoryMax}}">{{javaMemoryMax}}</span>
<div class="bar-total bar" ng-style="{width: javaMemoryTotalPercentage}">
<span class="bar-total val" title="raw: {{javaMemoryTotal}}B">{{javaMemoryTotalDisplay}}</span>
<div class="bar-used bar" ng-style="{width: javaMemoryUsedPercentage}">
<span class="bar-used val" title="raw: {{javaMemoryUsed}}B">{{javaMemoryUsedDisplay}}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="block" id="security">
<h2>Security</h2>
<div class="content" ng-show="isSecurityEnabled">
<ul class="data">
<li class="authentication_plugin"><dl class="clearfix">
<dt><span>Authentication Plugin</span></dt>
<dd>{{system.security["authenticationPlugin"]}}</dd>
</dl></li>
<li class="authorization_plugin"><dl class="clearfix">
<dt><span>Authorization Plugin</span></dt>
<dd>{{system.security["authorizationPlugin"]}}</dd>
</dl></li>
<li class="username"><dl class="clearfix">
<dt><span>Current Username</span></dt>
<dd>{{system.security["username"]}}</dd>
</dl></li>
<li class="user_roles"><dl class="clearfix">
<dt><span>User Roles</span></dt>
<dd>{{system.security["roles"]}}</dd>
</dl></li>
</ul>
</div>
<div ng-show="!isSecurityEnabled" style="text-align: left">
<p class="warning-msg"><img src="img/ico/shield--exclamation.png"/>&nbsp;WARNING: Security is not enabled for this server!</p>
<p>See <a href="/solr/#/~security">security screen</a> for how to enable authentication</p>
<p>TLS enabled? <img ng-show="tls" src="img/ico/tick.png"/><img ng-show="!tls" src="img/ico/cross.png"/></p>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,27 @@
<!--
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="java-properties">
<ul>
<li ng-class="{odd:$odd}" ng-repeat="prop in props | orderObjectBy:'name'">
<dl class="clearfix">
<dt ng-bind-html="prop.name | unsafe"></dt>
<dd ng-class="{odd:$odd, multi:props.length&gt;1}"><span ng-repeat-start="val in prop.values">{{val}}</span><span ng-repeat-end ng-if="!$last">{{pathSeparator}}{{"&#8203;"}}</span></dd>
</dl>
</li>
</ul>
</div>

View File

@@ -0,0 +1,55 @@
<!--
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="logging" class="clearfix">
<div id="frame">
<div class="block">
<h2><span>{{watcher}}</span></h2>
<div id="loggingtree">
<ul class="tree jstree jstree-container-ul jstree-children tree ng-isolate-scope jstree-1 jstree-default">
<li class="jstree-node jstree-leaf jstree-open level-{{logger.level.toLowerCase()}}" ng-class="{'jstree-last':$last}" ng-repeat="logger in logging" ng-include="'logger.html'"></li>
</ul>
</div>
</div>
</div>
</div>
<script type="text/ng-template" id="logger.html">
<i class="trigger jstree-icon jstree-ocl">&nbsp;</i>
<a ng-click="toggleOptions(logger)" class="jstree-anchor trigger {{logger.level.toLowerCase() }}" ng-class="{null:!logger.level, set: logger.set}" title="{{ logger.name }}" rel="{{logger.level}}">
<span class="ns">{{logger.name}}</span>
<span class="name" ng-show="logger.short">{{ logger.short }}</span>
<span class="name" ng-show="!logger.short"><em>empty</em></span>
</a>
<div class="selector-holder" ng-class="{open:logger.showOptions}">
<div class="selector">
<a class="trigger" ng-click="toggleOptions(logger)"><span><em>{{logger.level || "null"}}</em></span></a>
<div ng-show="logger.showOptions">
<ul>
<li ng-repeat="level in levels track by level.pos">
<a ng-click="setLevel(logger, level.name)">{{level.name}}</a>
</li>
<li class="unset"><a ng-click="setLevel(logger, 'unset')">UNSET</a></li>
</ul>
<a class="close" ng-click="toggleOptions(logger)"><span>[x]</span></a>
</div>
</div>
</div>
<ul>
<li class="jstree-node jstree-leaf jstree-open level-{{logger.level.toLowerCase()}}" ng-class="{'jstree-last':$last}" ng-repeat="logger in logger.children" ng-include="'logger.html'"></li>
</ul>
</script>

View File

@@ -0,0 +1,57 @@
<!--
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="logging" class="clearfix">
<div id="viewer">
<div class="block">
<h2><span>{{watcher}}</span></h2>
</div>
<table class="has-data" border="0" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th class="time">Time (<span>{{timezone}}</span>)</th>
<th class="level">Level</th>
<th class="core">Core</th>
<th class="logger">Logger</th>
<th class="message">Message</th>
</tr>
</thead>
<tbody ng-repeat="event in events">
<tr ng-click="toggleRow(event)" class="{{event.trace ? 'has-trace': ''}} {{'level-'+event.level.toLowerCase()}}">
<td class="span"><a><span>{{ timezone == "UTC" ? event.utc_time : event.local_time }}</span></a></td>
<td class="level span"><a><span>{{ event.level }} {{event.showTrace}}</span></span></a></td>
<td class="span"><a><span>{{ event.core }}</span></a></td>
<td class="span"><a><span><abbr title="{{event.logger}}">{{event.loggerBase}}</abbr></span></a></td>
<td class="message span"><a><span>{{ event.message }}</span></a></td>
</tr>
<tr class="trace" ng-show="event.showTrace && event.trace">
<td colspan="4"><pre>{{event.trace}}</pre></td>
</tr>
</tbody>
<tfoot>
<tr ng-show="events.length==0">
<td colspan="4">No Events available</td>
</tr>
</tfoot>
</table>
<div id="footer" class="clearfix">
<div id="state">Last Check: {{sinceDisplay}}</div>
<div id="date-format" ng-click="toggleTimezone()"><a ng-class="{on: timezone=='UTC'}">Show dates in UTC</a></div>
<a id="refresh-toggle" ng-class="{'active': !stopped, 'stopped': stopped}" ng-click="toggleRefresh()">Auto-Refresh</a>
</div>
</div>
</div>

View File

@@ -0,0 +1,177 @@
<!--
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="login" class="clearfix">
<div ng-show="authScheme === 'Basic'">
<h1>Basic Authentication</h1>
<div class="login-error" ng-show="statusText !== 'require authentication' || authParamsError !== null">
{{statusText}}{{authParamsError}}
</div>
<div ng-show="!isLoggedIn()">
<p>
Solr requires authentication for resource {{authLocation === '/' ? 'Dashboard' : authLocation}}.<br/>
Please log in with your username and password for realm {{authRealm}}.
</p>
<br/>
<div ng-show="error" class="alert alert-danger">{{error}}</div>
<form name="form" ng-submit="login()" role="form" autocomplete="off">
<div class="form-group">
<label for="username">Username</label>
<input type="text" name="username" id="username" class="form-control" ng-model="username" required />
<span ng-show="form.username.$dirty && form.username.$error.required" class="help-block">Username is required</span>
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" name="password" id="password" class="form-control" ng-model="password" required />
<span ng-show="form.password.$dirty && form.password.$error.required" class="help-block">Password is required</span>
</div>
<br/>
<div class="form-actions">
<button type="submit" ng-disabled="form.$invalid" class="btn btn-danger">Login</button>
</div>
</form>
</div>
<div ng-show="isLoggedIn()">
<p>
Logged in as user {{authLoggedinUser}}. Realm={{authRealm}}.<br/>
</p>
<br/>
<form name="logoutForm" ng-submit="logout()" role="form" ng-show="isLoggedIn()">
<div class="form-actions">
<button type="submit" class="btn btn-danger">Logout</button>
</div>
</form>
</div>
</div>
<div ng-show="authScheme === 'Negotiate'">
<h1>Kerberos Authentication</h1>
<p>Your browser did not provide the required information to authenticate using Kerberos.
Please check that your computer has a valid ticket for communicating with Solr,
and that your browser is properly configured to provide that ticket when required.
For more information, consult
<a href="https://solr.apache.org/guide/solr/latest/deployment-guide/kerberos-authentication-plugin.html">
Solr's Kerberos documentation
</a>.
</p>
The response from the server was:
<hr/>
<pre>HTTP 401 {{statusText}}
WWW-Authenticate: {{wwwAuthHeader}}</pre>
<hr/>
</div>
<div ng-show="authScheme === 'Certificate'">
<h1>Certificate Authentication</h1>
<p>Your browser did not provide the required information to authenticate using PKI Certificates.
Please check that your computer has a valid PKI certificate for communicating with Solr,
and that your browser is properly configured to provide that certificate when required.
For more information, consult
<a href="https://solr.apache.org/guide/solr/latest/deployment-guide/cert-authentication-plugin.html">
Solr's Certificate Authentication documentation
</a>.
</p>
The response from the server was:
<hr/>
<pre>HTTP 401 {{statusText}}
WWW-Authenticate: {{wwwAuthHeader}}</pre>
<hr/>
</div>
<div ng-show="authScheme === 'Bearer'">
<h1>OpenID Connect (JWT) authentication</h1>
<div class="login-error" ng-show="statusText || authParamsError || error">
{{statusText}} {{authParamsError}} {{error}} {{errorDescription}}
</div>
<div ng-show="isCallback">
Callback from ID Provider received.
<p ng-show="error">
There were errors during login with ID Provider. Please try again.<br/>
</p>
</div>
<div ng-show="!isLoggedIn() && !isCallback">
<p>
Solr requires authentication for resource {{authLocation === '/' ? 'Dashboard' : authLocation}}.
</p>
<div ng-show="authData !== null && jwtIsLoginNode()">
<p>
Please log in with your Identity Provider (IdP) for realm {{authRealm}}.
</p>
<p>
Clicking the button below, you will be redirected to the authorization endpoint of the ID provider:<br/>
{{authData['authorizationEndpoint']}}
</p>
<br/>
<div ng-show="error" class="alert alert-danger">{{error}}</div>
<form name="form" ng-submit="jwtLogin()" role="form">
<div class="form-actions">
<button type="submit" class="btn btn-danger">Redirect to Identity Provider</button>
</div>
</form>
</div>
<div ng-show="authData !== null && !jwtIsLoginNode()">
<p>
In order to log in to the identity provider, you need to load this page from the Solr node registered as callback node:<br/>
{{jwtFindLoginNode()}}<br/>
After successful login you will be able to navigate to other nodes.
</p>
<p>
<form name="form" ng-submit="jwtGotoLoginNode()" role="form">
<div class="form-actions">
<button type="submit" class="btn btn-danger">Redirect to {{jwtFindLoginNode()}}</button>
</div>
</form>
</p>
</div>
<div class="login-error" ng-show="authData === null">
Unable to login. There is a problem with the Solr backend. Please consult Solr logs.
</div>
</div>
<div ng-show="isLoggedIn()">
<p>
Logged in as user {{authLoggedinUser}}. Realm={{authRealm}}.<br/>
</p>
<br/>
<form name="logoutForm" ng-submit="jwtLogout()" role="form" ng-show="isLoggedIn()">
<div class="form-actions">
<button type="submit" class="btn btn-danger">Logout</button>
</div>
</form>
</div>
</div>
<div ng-show="!authSchemeSupported">
<h1>Authentication scheme not supported</h1>
<div class="login-error">
{{statusText}}
</div>
<p>Some or all Solr operations are protected by an authentication scheme that is not yet supported by this Admin UI ({{authScheme}}).</p>
<p>Solr returned an error response:
<hr/>
<pre>HTTP 401 {{statusText}}
WWW-Authenticate: {{wwwAuthHeader}}</pre>
<hr/>
</p>
<p>A possible workaround may be to use another client that supports this scheme.</p>
</div>
</div>

View File

@@ -0,0 +1,93 @@
<!--
/*
* 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="paramsets" class="clearfix">
<div id="form">
<form>
<fieldset>
<legend>Select Paramset</legend>
<div id="paramset-name-container">
<label for="paramsetName">
<a rel="help">Paramsets</a>
</label>
<select id="paramsetName"
ng-model="name"
chosen
data-placeholder="Please select..."
ng-change="selectParamset()"
ng-options="item for item in paramsetList"><option value=""></option></select>
</div>
<div id="delete-paramset" ng-show="name">
<button id="delete-paramset" class="warn" ng-click="deleteParamset()">Delete Paramset</button>
<div>
</fieldset>
<div>
<form>
<label>
<input type="checkbox"
ng-model="switch.showSample">
Sample Paramset
</label>
</form>
<div ng-switch="switch.showSample">
<div id="sample-paramset" ng-switch-when="true">
<pre class="syntax language-json"><code ng-bind-html="placeholder | highlight:'json' | unsafe"></code></pre>
</div>
</div>
<fieldset>
<legend>Update Paramset(s)</legend>
<div class="fieldset" id="paramsetContent-container">
<label for="paramset">
Paramset(s) JSON
</label>
<textarea ng-model="paramsetContent"
name="paramsetContent"
id="paramsetContent"
title="Request Parameters API Payload"
rows="10"
cols="65"></textarea>
<p>
<a href="https://solr.apache.org/guide/solr/latest/configuration-guide/request-parameters-api.html" target="_out">syntax help</a>
</p>
</div>
</fieldset>
</div>
<button type="submit" ng-click="submit()" id="submit">Submit Updates</button>
</form>
</div>
<div id="result">
<div id="response" ng-show="response">
<div>
<span class="description">Status: </span>{{ responseStatus }}
</div>
<div>
<span class="description">Response:</span>
<pre class="syntax language-json"><code ng-bind-html="response | highlight:'json' | unsafe"></code></pre>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,72 @@
<!--
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="plugins" class="clearfix">
<div id="frame">
<ul>
<li class="entry" ng-class="{changed: plugin.changed}" ng-repeat="plugin in type.plugins">
<a ng-click="selectPlugin(plugin)">
<span>{{ plugin.name }}</span>
</a>
<ul class="detail" ng-show="plugin.open">
<li ng-repeat="(key, value) in plugin.properties" ng-class="{odd: $odd}">
<dl class="clearfix">
<dt>{{ key }}:</dt>
<!--<dd ng-repeat="v in value">{{v}}</dd><!-- is AN ARRAY!!-->
<dd>{{value}}</dd>
</dl>
</li>
<li class="stats clearfix" ng-show="plugin.stats">
<span>stats:</span>
<ul>
<li ng-repeat="(key, value) in plugin.stats" ng-class="{odd: $odd}">
<dl class="clearfix">
<dt>{{key}}:</dt>
<dd>{{value}}</dd>
</dl>
</li>
</ul>
</li>
</ul>
</ul>
</div>
<div id="navigation" class="clearfix">
<ul>
<li ng-repeat="typeObj in types" class="{{typeObj.lower}}" ng-class="{active:typeObj==type}">
<a ng-click="selectPluginType(typeObj)" rel="{{typeObj.name}}">{{typeObj.name}}
<span ng-show="typeObj.changes">{{typeObj.changes}}</span>
</a>
</li>
<li class="PLUGINCHANGES"><a ng-click="startRecording()">Watch Changes</a></li>
<li class="RELOAD"><a ng-click="refresh()">Refresh Values</a></li>
<li class="NOTE"><p>NOTE: Only selected metrics are shown here. Full metrics can be accessed via /admin/metrics handler.</p></li>
</ul>
</div>
<div id="recording" ng-show="isRecording">
<div class="wrapper clearfix">
<p class="loader">Watching for Changes</p>
<button class="primary" ng-click="stopRecording()">Stop &amp; Show Changes</button>
</div>
<div id="blockUI"></div>
</div>
</div>

View File

@@ -0,0 +1,579 @@
<!--
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="query" class="clearfix">
<div id="form">
<form>
<label for="qt" title="Request handler in solrconfig.xml.">
<a rel="help">Request-Handler (qt)</a>
</label>
<input type="text" ng-model="qt" id="qt" placeholder="/select" value="/select" title="Request handler in solrconfig.xml.">
<fieldset class="common">
<legend>common</legend>
<div class="fieldset">
<label for="q" title="The query string.">
q
</label>
<textarea name="q" ng-model="val['q']" id="q" title="The query string.">*:*</textarea>
<label for="qOp" title="The query operator.">
q.op
</label>
<select ng-model="val['q.op']" id="qOp" name="q.op" title="The query operator.">
<option value="AND">AND</option>
<option value="OR">OR</option>
</select>
<label for="fq" title="Filter query.">
<a rel="help">fq</a>
</label>
<div class="multiple" id="fq">
<div class="row clearfix" ng-repeat="filter in filters">
<input type="text" ng-model="filter.fq" name="fq" title="Filter query.">
<div class="buttons">
<a class="rem" ng-click="removeFilter($index)"><span></span></a>
<a class="add" ng-click="addFilter($index)"><span></span></a>
</div>
</div>
</div>
<label for="sort" title="Sort field or function with asc|desc.">
<a rel="help">sort</a>
</label>
<input type="text" ng-model="val['sort']" id="sort" name="sort" title="Sort field or function with asc|desc.">
<label for="start" title="Number of leading documents to skip and number of documents to return after 'start'. (Integers)">
<a rel="help">start</a>,
<a rel="help">rows</a>
</label>
<div class="clearfix">
<input type="text" name="start" ng-model="val['start']" id="start" placeholder="0" pattern="[0-9]+" title="Number of leading documents to skip. (Integer)">
<input type="text" name="rows" ng-model="val['rows']" id="rows" placeholder="10" pattern="[0-9]+" title="Number of documents to return after 'start'. (Integer)">
</div>
<label for="fl" title="Field list, comma separated.">
<a rel="help">fl</a>
</label>
<input type="text" ng-model="val['fl']" name="fl" id="fl" value="" title="Field list, comma separated.">
<label for="df" title="Default search field">
<a rel="help">df</a>
</label>
<input type="text" ng-model="val['df']" name="df" id="df" value="" title="Default search field">
<label for="useParams">paramset(s)</label>
<select id="useParams"
ng-model="useParams"
title="The paramsets to apply to the query."
chosen
multiple
data-placeholder="Select paramset(s)..."
ng-options="item for item in paramsetList"><option value=""></option></select>
<label for="wt" title="The writer type (response format).">
<a rel="help">wt</a>
</label>
<select name="wt" ng-model="val['wt']" id="wt" title="The writer type (response format).">
<option ng-selected="selected" value=''>------</option>
<option>json</option>
<option>xml</option>
<option>python</option>
<option>ruby</option>
<option>php</option>
<option>csv</option>
</select>
<label for="indent" class="checkbox" title="Enable indenting of results.">
<input type="checkbox" ng-model="val['indent']" name="indent" id="indent" title="Enable indenting of results." ng-true-value="true" ng-false-value="false">
indent on
</label>
</div>
</fieldset>
<fieldset class="debugQuery optional">
<legend>
<label for="debugQuery" class="checkbox" title="Show timing and diagnostics.">
<input type="checkbox" ng-model="val['debugQuery']" name="debugQuery" id="debugQuery" value="true">
debugQuery
</label>
</legend>
<div class="fieldset" ng-show="val['debugQuery']">
<label for="debug_explain_structured" class="checkbox" title="Show Score explanations as nested structures.">
<input type="checkbox" ng-model="val['debug.explain.structured']" name="debug.explain.structured" id="debug_explain_structured" value="true">
debug.explain.structured
</label>
</div>
</fieldset>
<fieldset class="dismax optional">
<legend>
<label for="defType" class="checkbox" title="Choose defType">
defType
<select ng-model="val['defType']" name="defType" id="defType">
<option ng-selected="selected" value=''>------</option>
<option value="lucene">lucene</option>
<option value="dismax">dismax</option>
<option value="edismax">edismax</option>
</select>
</label>
</legend>
<div class="fieldset" ng-show="val['defType']=='dismax' || val['defType']=='edismax'">
<label for="q_alt" title="Alternate query when 'q' is absent.">q.alt</label>
<input type="text" ng-model="val['q.alt']" name="q.alt" id="q_alt" title="Alternate query when 'q' is absent.">
<label for="qf" title="Query fields with optional boosts.">qf</label>
<input type="text" ng-model="val['qf']" name="qf" id="qf" title="Query fields with optional boosts.">
<label for="mm" title="Min-should-match expression.">mm</label>
<input type="text" ng-model="val['mm']" name="mm" id="mm" title="Min-should-match expression.">
<label for="pf" title="Phrase boosted fields.">pf</label>
<input type="text" ng-model="val['pf']" name="pf" id="pf" title="Phrase boosted fields.">
<label for="ps" title="Phrase boost slop.">ps</label>
<input type="text" ng-model="val['ps']" name="ps" id="ps" title="Phrase boost slop.">
<label for="qs" title="Query string phrase slop.">qs</label>
<input type="text" ng-model="val['qs']" name="qs" id="qs" title="Query string phrase slop.">
<label for="tie" title="Score tie-breaker. Try 0.1.">tie</label>
<input type="text" ng-model="val['tie']" name="tie" id="tie" title="Score tie-breaker. Try 0.1.">
<label for="bq" title="Boost query.">bq</label>
<input type="text" ng-model="val['bq']" name="bq" id="bq" title="Boost query.">
<label for="bf" title="Boost function (added).">bf</label>
<input type="text" ng-model="val['bf']" name="bf" id="bf" title="Boost function (added).">
<div ng-show="val['defType']=='edismax'">
<label for="uf" title="User Fields">uf</label>
<input type="text" ng-model="val['uf']" name="uf" id="uf" title="User Fields">
<label for="pf2" title="bigram phrase boost fields">pf2</label>
<input type="text" ng-model="val['pf2']" name="pf2" id="pf2" title="bigram phrase boost fields">
<label for="pf3" title="trigram phrase boost fields">pf3</label>
<input type="text" ng-model="val['pf3']" name="pf3" id="pf3" title="trigram phrase boost fields">
<label for="ps2" title="phrase slop for bigram phrases">ps2</label>
<input type="text" ng-model="val['ps2']" name="ps2" id="ps2" title="phrase slop for bigram phrases">
<label for="ps3" title="phrase slop for trigram phrases">ps3</label>
<input type="text" ng-model="val['ps3']" name="ps3" id="ps3" title="phrase slop for trigram phrases">
<label for="boost" title="multiplicative boost function">boost</label>
<input type="text" ng-model="val['boost']" name="boost" id="boost" title="multiplicative boost function">
<label for="stopwords" class="checkbox" title="remove stopwords from mandatory 'matching' component">
<input type="checkbox" ng-model="val['stopwords']" name="stopwords" id="stopwords">
stopwords
</label>
<label for="lowercaseOperators" class="checkbox" title="Enable lower-case 'and' and 'or' as operators">
<input type="checkbox" ng-model="val['lowercaseOperators']" name="lowercaseOperators" id="lowercaseOperators">
lowercaseOperators
</label>
</div>
</div>
</fieldset>
<fieldset class="hl optional">
<legend>
<label for="hl" class="checkbox" title="Enable highlighting.">
<input type="checkbox" ng-model="val['hl']" name="hl" id="hl" value="true">
hl
</label>
</legend>
<div class="fieldset" ng-show="val['hl']">
<label for="hl_fl" title="Fields to highlight on.">hl.fl</label>
<input type="text" ng-model="val['hl.fl']" name="hl.fl" id="hl_fl" value="" title="Fields to highlight on.">
<div class="fieldset" ng-show="val['hl.method']=='original'">
<label for="hl_simple_pre">hl.simple.pre</label>
<input type="text" ng-model="val['hl.simple.pre']" name="hl.simple.pre" id="hl_simple_pre" value="<em>">
<label for="hl_simple_post">hl.simple.post</label>
<input type="text" ng-model="val['hl.simple.post']" name="hl.simple.post" id="hl_simple_post" value="</em>">
</div>
<div class="fieldset" ng-show="val['hl.method']=='unified' || val['hl.method']=='fastVector'">
<label for="hl_tag_pre">hl.tag.pre</label>
<input type="text" ng-model="val['hl.tag.pre']" name="hl.tag.pre" id="hl_tag_pre" value="<em>">
<label for="hl_tag_post">hl.tag.post</label>
<input type="text" ng-model="val['hl.tag.post']" name="hl.tag.post" id="hl_tag_post" value="</em>">
</div>
<label for="hl_requireFieldMatch" class="checkbox">
<input type="checkbox" ng-model="val['hl.requireFieldMatch']" name="hl.requireFieldMatch" id="hl_requireFieldMatch" value="true">
hl.requireFieldMatch
</label>
<label for="hl_usePhraseHighlighter" class="checkbox">
<input type="checkbox" ng-model="val['hl.usePhraseHighLighter']" name="hl.usePhraseHighlighter" id="hl_usePhraseHighlighter" value="true">
hl.usePhraseHighlighter
</label>
<label for="hl_highlightMultiTerm" class="checkbox">
<input type="checkbox" ng-model="val['hl.highlightMultiTerm']" name="hl.highlightMultiTerm" id="hl_highlightMultiTerm" value="true">
hl.highlightMultiTerm
</label>
<label for="hl_q">hl.q</label>
<input type="text" ng-model="val['hl.q']" name="hl.q" id="hl_q" value="">
<label for="hl_qparser">hl.qparser</label>
<input type="text" ng-model="val['hl.qparser']" name="hl.qparser" id="hl_qparser" value="">
<label for="hl_snippets">hl.snippets</label>
<input type="text" ng-model="val['hl.snippets']" name="hl.snippets" id="hl_snippets" value="">
<label for="hl_fragsize">hl.fragsize</label>
<input type="text" ng-model="val['hl.fragsize']" name="hl.fragsize" id="hl_fragsize" value="">
<label for="hl_encoder">hl.encoder</label>
<input type="text" ng-model="val['hl.encoder']" name="hl.encoder" id="hl_encoder" value="">
<label for="hl_maxAnalyzedChars">hl.maxAnalyzedChars</label>
<input type="text" ng-model="val['hl.maxAnalyzedChars']" name="hl.maxAnalyzedChars" id="hl_maxAnalyzedChars" value="">
<label for="hl_method" title="Choose hl.method">
hl.method
<select ng-model="val['hl.method']" name="hl_method" id="hl_method">
<option ng-selected="selected" value=''>------</option>
<option value="unified">unified</option>
<option value="original">original</option>
<option value="fastVector">fastVector</option>
</select>
</label>
<p class="clearfix"><a ng-show="val['hl']" ng-click="showAdvanced=!showAdvanced">
<span id="add_advanced" ng-class="{open: showAdvanced}">Show advanced</span></a></p>
<div ng-show="showAdvanced">
<div class="fieldset" ng-show="val['hl.method']=='unified'">
<label for="hl_offsetSource" title="Choose hl.offsetSource">
hl.offsetSource
<select ng-model="val['hl.offsetSource']" name="hl.offsetSource" id="hl_offsetSource">
<option ng-selected="selected" value=''>------</option>
<option value="ANALYSIS">ANALYSIS</option>
<option value="POSTINGS">POSTINGS</option>
<option value="POSTINGS_WITH_TERM_VECTORS">POSTINGS_WITH_TERM_VECTORS</option>
<option value="TERM_VECTORS">TERM_VECTORS</option>
</select>
</label>
<label for="hl_fragAlignRatio">hl.fragAlignRatio</label>
<input type="text" ng-model="val['hl.fragAlignRatio']" name="hl.fragAlignRatio" id="hl_fragAlignRatio">
<label for="hl_fragsizeIsMinimum" class="checkbox">
<input type="checkbox" ng-model="val['hl.fragsizeIsMinimum']" name="hl.fragsizeIsMinimum" id="hl_fragsizeIsMinimum" value="true">
hl.fragsizeIsMinimum
</label>
<label for="hl_tag_ellipsis">hl.tag.ellipsis</label>
<input type="text" ng-model="val['hl.tag.ellipsis']" name="hl.tag.ellipsis" id="hl_tag_ellipsis">
<label for="hl_defaultSummary" class="checkbox">
<input type="checkbox" ng-model="val['hl.defaultSummary']" name="hl.defaultSummary" id="hl_defaultSummary">
hl.defaultSummary
</label>
<label for="hl_score_k1">hl.score.k1</label>
<input type="text" ng-model="val['hl.score.k1']" name="hl.score.k1" id="hl_score_k1">
<label for="hl_score_b">hl.score.b</label>
<input type="text" ng-model="val['hl.score.b']" name="hl.score.b" id="hl_score_b">
<label for="hl_score_pivot">hl.score.pivot</label>
<input type="text" ng-model="val['hl.score.pivot']" name="hl.score.pivot" id="hl_score_pivot">
<label for="hl_bs_language">hl.bs.language</label>
<input type="text" ng-model="val['hl.bs.language']" name="hl.bs.language" id="hl_bs_language">
<label for="hl_bs_country">hl.bs.country</label>
<input type="text" ng-model="val['hl.bs.country']" name="hl.bs.country" id="hl_bs_country">
<label for="hl_bs_variant">hl.bs.variant</label>
<input type="text" ng-model="val['hl.bs.variant']" name="hl.bs.variant" id="hl_bs_variant">
<label for="hl_bs_type">
hl.bs.type
<select ng-model="val['hl.bs.type']" name="hl.bs.type" id="hl_bs_type">
<option ng-selected="selected" value=''>------</option>
<option value="SENTENCE">SENTENCE</option>
<option value="SEPARATOR">SEPARATOR</option>
<option value="WORD">WORD</option>
<option value="CHARACTER">CHARACTER</option>
<option value="LINE">LINE</option>
<option value="WHOLE">WHOLE</option>
</select>
</label>
<label for="hl_bs_separator">hl.bs.separator</label>
<input type="text" ng-model="val['hl.bs.separator']" name="hl.bs.separator" id="hl_bs_separator">
<label for="hl_weightMatches" class="checkbox">
<input type="checkbox" ng-model="val['hl.weightMatches']" name="hl.weightMatches" id="hl_weightMatches" value=true>
hl.weightMatches
</label>
</div>
<div class="fieldset" ng-show="val['hl.method']=='original'">
<label for="hl_mergeContiguous" class="checkbox">
<input type="checkbox" ng-model="val['hl.mergeContiguous']" name="hl.mergeContiguous" id="hl_mergeContiguous">
hl.mergeContiguous
</label>
<label for="hl_maxMultiValuedToExamine">hl.maxMultiValuedToExamine</label>
<input type="text" ng-model="val['hl.maxMultiValuedToExamine']" name="hl.maxMultiValuedToExamine" id="hl_maxMultiValuedToExamine">
<label for="hl_maxMultiValuedToMatch">hl.maxMultiValuedToMatch</label>
<input type="text" ng-model="val['hl.maxMultiValuedToMatch']" name="hl.maxMultiValuedToMatch" id="hl_maxMultiValuedToMatch">
<label for="hl_formatter">
hl.formatter
<select ng-model="val['hl.formatter']" name="hl.formatter" id="hl_formatter">
<option ng-selected="selected" value="">------</option>
<option value="simple">simple</option>
</select>
</label>
<label for="hl_fragmenter">
hl.fragmenter
<select ng-model="val['hl.fragmenter']" name="hl.fragmenter" id="hl_fragmenter">
<option ng-selected="selected" value="">------</option>
<option value="gap">gap</option>
<option value="regex">regex</option>
</select>
</label>
<label for="hl_regex_slop">hl.regex.slop</label>
<input type="text" ng-model="val['hl.regex.slop']" name="hl.regex.slop" id="hl_regex_slop">
<label for="hl_regex_pattern">hl.regex.pattern</label>
<input type="text" ng-model="val['hl.regex.pattern']" name="hl.regex.pattern" id="hl_regex_pattern">
<label for="hl_regex_maxAnalyzedChars">hl.regex.maxAnalyzedChars</label>
<input type="text" ng-model="val['hl.regex.maxAnalyzedChars']" name="hl.regex.maxAnalyzedChars" id="hl_regex_maxAnalyzedChars">
<label for="hl_preserveMulti" class="checkbox">
<input type="checkbox" ng-model="val['hl.preserveMulti']" name="hl.preserveMulti" id="hl_preserveMulti">
hl.preserveMulti
</label>
<label for="hl_payloads" class="checkbox">
<input type="checkbox" ng-model="val['hl.payloads']" name="hl.payloads" id="hl_payloads" value=true>
hl.payloads
</label>
</div>
<div class="fieldset" ng-show="val['hl.method']=='original' || val['hl.method']=='fastVector'">
<label for="hl_alternateField">hl.alternateField</label>
<input type="text" ng-model="val['hl.alternateField']" name="hl.alternateField" id="hl_alternateField">
<label for="hl_maxAlternateFieldLength">hl.maxAlternateFieldLength</label>
<input type="text" ng-model="val['hl.maxAlternateFieldLength']" name="hl.maxAlternateFieldLength" id="hl_maxAlternateFieldLength">
<label for="hl_highlightAlternate" class="checkbox">
<input type="checkbox" ng-model="val['hl.highlightAlternate']" name="hl.highlightAlternate" id="hl_highlightAlternate" value=true>
hl.highlightAlternate
</label>
</div>
<div class="fieldset" ng-show="val['hl.method']=='fastVector'">
<label for="hl_fragListBuilder">hl.fragListBuilder</label>
<input type="text" ng-model="val['hl.fragListBuilder']" name="hl.fragListBuilder" id="hl_fragListBuilder">
<label for="hl_fragmentsBuilder">hl.fragmentsBuilder</label>
<input type="text" ng-model="val['hl.fragmentsBuilder']" name="hl.fragmentsBuilder" id="hl_fragmentsBuilder">
<label for="hl_boundaryScanner">hl.boundaryScanner</label>
<input type="text" ng-model="val['hl.boundaryScanner']" name="hl.boundaryScanner" id="hl_boundaryScanner">
<label for="hl_phraseLimit">hl.phraseLimit</label>
<input type="text" ng-model="val['hl.phraseLimit']" name="hl.phraseLimit" id="hl_phraseLimit">
<label for="hl_multiValuedSeparatorChar">hl.multiValuedSeparatorChar</label>
<input type="text" ng-model="val['hl.multiValuedSeparatorChar']" name="hl.multiValuedSeparatorChar" id="hl_multiValuedSeparatorChar">
</div>
</div>
</div>
</fieldset>
<fieldset class="facet optional">
<legend>
<label for="facet" class="checkbox" title="Enable faceting.">
<input type="checkbox" ng-model="val['facet']" name="facet" id="facet">
facet
</label>
</legend>
<div class="fieldset" ng-show="val['facet']">
<label for="facet_query">facet.query</label>
<textarea ng-model="val['facet.query']" name="facet.query" id="facet_query"></textarea>
<label for="facet_field">facet.field</label>
<input type="text" ng-model="val['facet.field']" name="facet.field" id="facet_field">
<label for="facet_prefix">facet.prefix</label>
<input type="text" ng-model="val['facet.prefix']" name="facet.prefix" id="facet_prefix">
<label for="facet_contains">facet.contains</label>
<input type="text" ng-model="val['facet.contains']" name="facet.contains" id="facet_contains">
<label for="facet_contains_ignoreCase" class="checkbox">
<input type="checkbox" ng-model="val['facet.contains.ignoreCase']" name="facet.contains.ignoreCase" id="facet_contains_ignoreCase">
facet.contains.ignoreCase
</label>
<label for="facet_limit">facet.limit</label>
<input type="text" ng-model="val['facet.limit']" name="facet.limit" id="facet_limit">
<label for="facet_matches">facet.matches</label>
<input type="text" ng-model="val['facet.matches']" name="facet.matches" id="facet_matches">
<label for="facet_sort">facet.sort</label>
<select ng-model="val['facet.sort']" id="facet_sort" name="facet.sort" title="Ordering of the facet field constraints">
<option ng-selected="selected" value="">------</option>
<option value="count">count</option>
<option value="index">index</option>
</select>
<label for="facet_mincount">facet.mincount</label>
<input type="text" ng-model="val['facet.mincount']" name="facet.mincount" id="facet_mincount">
<label for="facet_missing" class="checkbox">
<input type="checkbox" ng-model="val['facet.missing']" name="facet.missing" id="facet_missing">
facet.missing
</label>
<label for="json_facet" title="JSON Facet API">
json.facet <a href="https://solr.apache.org/guide/solr/latest/query-guide/json-facet-api.html" target="_blank" class="help"></a>
</label>
<textarea ng-model="val['json.facet']" name="json.facet" id="json_facet" rows="6"></textarea>
</div>
</fieldset>
<fieldset class="spatial optional">
<legend>
<label for="spatial" class="checkbox" title="Show spatial options">
<input type="checkbox" ng-model="val['spatial']" name="spatial" id="spatial">
spatial
</label>
</legend>
<div class="fieldset" ng-show="val['spatial']">
<label for="pt">pt</label>
<input type="text" ng-model="val['pt']" name="pt" id="pt">
<label for="sfield">sfield</label>
<input type="text" ng-model="val['sfield']" name="sfield" id="sfield">
<label for="d">d</label>
<input type="text" ng-model="val['d']" name="d" id="d">
</div>
</fieldset>
<fieldset class="spellcheck optional">
<legend>
<label for="spellcheck" class="checkbox" title="Enable spellchecking.">
<input type="checkbox" ng-model="val['spellcheck']" name="spellcheck" id="spellcheck">
spellcheck
</label>
</legend>
<div class="fieldset" ng-show="val['spellcheck']">
<label for="spellcheck_build" class="checkbox">
<input type="checkbox" ng-model="val['spellcheck.build']" name="spellcheck.build" id="spellcheck_build" value="true">
spellcheck.build
</label>
<label for="spellcheck_reload" class="checkbox">
<input type="checkbox" ng-model="val['spellcheck.reload']" name="spellcheck.reload" id="spellcheck_reload" value="true">
spellcheck.reload
</label>
<label for="spellcheck_q">spellcheck.q</label>
<input type="text" ng-model="val['spellcheck.q']" name="spellcheck.q" id="spellcheck_q">
<label for="spellcheck_dictionary">spellcheck.dictionary</label>
<input type="text" ng-model="val['spellcheck.dictionary']" name="spellcheck.dictionary" id="spellcheck_dictionary">
<label for="spellcheck_count">spellcheck.count</label>
<input type="text" ng-model="val['spellcheck.count']" name="spellcheck.count" id="spellcheck_count">
<label for="spellcheck_onlyMorePopular" class="checkbox">
<input type="checkbox" ng-model="val['spellcheck.onlyMorePopular']" name="spellcheck.onlyMorePopular" id="spellcheck_onlyMorePopular" value="true">
spellcheck.onlyMorePopular
</label>
<label for="spellcheck_extendedResults" class="checkbox">
<input type="checkbox" ng-model="val['spellcheck.extendedResults']" name="spellcheck.extendedResults" id="spellcheck_extendedResults" value="true">
spellcheck.extendedResults
</label>
<label for="spellcheck_collate" class="checkbox">
<input type="checkbox" ng-model="val['spellcheck.collate']" name="spellcheck.collate" id="spellcheck_collate" value="true">
spellcheck.collate
</label>
<label for="spellcheck_maxCollations">spellcheck.maxCollations</label>
<input type="text" ng-model="val['spellcheck.maxCollations']" name="spellcheck.maxCollations" id="spellcheck_maxCollations">
<label for="spellcheck_maxCollationTries">spellcheck.maxCollationTries</label>
<input type="text" ng-model="val['spellcheck.maxCollationTries']" name="spellcheck.maxCollationTries" id="spellcheck_maxCollationTries">
<label for="spellcheck_accuracy">spellcheck.accuracy</label>
<input type="text" ng-model="val['spellcheck.accuracy']" name="spellcheck.accuracy" id="spellcheck_accuracy">
</div>
</fieldset>
<label for="custom_parameters" title="Raw Query Parameters">
<a rel="help">Raw Query Parameters</a>
</label>
<div class="multiple" id="custom_parameters">
<div class="row clearfix" ng-repeat="param in rawParams">
<input type="text" ng-model="param.rawParam" name="rawParamQuery" title="Raw param query.">
<div class="buttons">
<a class="rem" ng-click="removeRawParam($index)"><span></span></a>
<a class="add" ng-click="addRawParam($index)"><span></span></a>
</div>
</div>
</div>
<label for="json_query" title="JSON Request API">
JSON Query <a href="https://solr.apache.org/guide/solr/latest/query-guide/json-request-api.html" target="_blank" class="help"></a>
</label>
<textarea name="json" ng-model="val['json']" id="json_query" title="JSON Query"></textarea>
<button type="submit" ng-click="doQuery()">Execute Query</button>
</form>
</div>
<div id="result">
<div ng-show="response.data" id="response">
<a id="url" class="address-bar" ng-href="{{url}}">{{hostPortContext}}{{url}}</a>
<pre class="syntax language-{{lang}}"><code ng-bind-html="response.data | highlight:lang | unsafe"></code></pre>
</div>
</div>
</div>

View File

@@ -0,0 +1,239 @@
<!--
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="replication" class="clearfix" ng-class="{replicating:settings.isReplicating}">
<div id="frame">
<div id="error" ng-show="progress.ERROR">{{ progress.ERROR }}</div>
<div class="replicating block" ng-show="settings.isReplicating">
<div id="progress">
<div id="start"><div class="info">
<span>{{progress.replicationStartTime}}</span>
</div></div>
<div id="speed"><div class="info">
<span>{{progress.downloadSpeed}}</span>/s
</div></div>
<div id="bar">
<div id="bar-info"><div class="info">
<div class="files"><span>{{progress.numFilesToDownload}}</span> File<span ng-show="progress.numFilesToDownload&gt;1">s</span></div>
<div class="size"><span>{{progress.bytesToDownload}}</span></div>
</div></div>
<div id="eta"><div class="info">
ETA: <span>{{progress.timeRemaining | readableSeconds }}</span>
</div></div>
<div id="done" style="width: {{progress.totalPercentWidth}}">
<div class="percent">
<span>{{progress.totalPercent}}</span>%
</div>
<div id="done-info"><div class="info">
<div class="files"><span>{{progress.numFilesDownloaded}}</span> File<span ng-show="progress.numFilesDownloaded&gt;1">s</span></div>
<div class="size"><span>{{progress.bytesDownloaded}}</span></div>
</div></div>
</div>
</div>
</div>
<div id="current-file" class="clearfix">
<div class="label"><span class="loader">Current File:</span></div>
<div class="file">{{progress.currentFile}}</div>
<div class="progress">
<span class="done">{{progress.currentFileSizeDownloaded}}</span> / <span class="total">{{progress.currentFileSize}}</span> [<span class="percent">{{progress.currentFileSizePercent}}</span>%]
</div>
</div>
</div>
<div id="iterations" class="followerOnly block clearfix" ng-show="isFollower">
<div class="label"><span class="">Iterations:</span></div>
<div class="iterations" ng-show="iterations && showIterations">
<ul>
<li class="{{iteration.status}}" ng-class="{latest:iteration.latest}" ng-repeat="iteration in iterations |limitTo:iterationCount">{{iteration.date}}</li>
</ul>
<span ng-show="iterations.length&gt;1">
<a ng-show="iterationCount==1" ng-click="showIterations()"><span class="expand">Show all Iterations</span></a>
<a ng-show="iterationCount&gt;1" ng-click="hideIterations()"><span class="collapse">Hide past Iterations</span></a>
</span>
</div>
</div>
<div id="details" class="block clearfix">
<table border="0" cellspacing="0" cellpadding="0">
<thead>
<tr>
<td><span>Index</span></td>
<th>Version</th>
<th><abbr title="Generation">Gen</abbr></th>
<th>Size</th>
</tr>
</thead>
<tbody>
<tr class="leaderSearch">
<th>Leader (Searching)</th>
<td class="version" ng-class="{diff:versions.changedVersion}">
<div>{{versions.leaderSearch.version}}</div>
</td>
<td class="generation" ng-class="{diff:versions.changedGeneration}">
<div>{{versions.leaderSearch.generation}}</div>
</td>
<td class="size">
<div>{{versions.leaderSearch.size}}</div>
</td>
</tr>
<tr class="leader">
<th>Leader (Replicable)</th>
<td class="version" ng-class="{diff:versions.changedVersion}">
<div>{{versions.leader.version}}</div>
</td>
<td class="generation" ng-class="{diff:versions.changedGeneration}">
<div>{{versions.leader.generation}}</div>
</td>
<td class="size">
<div>{{versions.leader.size}}</div>
</td>
</tr>
<tr class="follower followerOnly" ng-show="isFollower">
<th>Follower (Searching)</th>
<td class="version" ng-class="{diff:versions.changedVersion}">
<div>{{versions.follower.version}}</div>
</td>
<td class="generation" ng-class="{diff:versions.changedGeneration}">
<div>{{versions.follower.generation}}</div>
</td>
<td class="size">
<div>{{versions.follower.size}}</div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="settings" class="settings block clearfix followerOnly" ng-show="isFollower">
<div class="label"><span>Settings:</span></div>
<ul>
<li class="leaderUrl" ng-show="settings.leaderUrl">
<dl class="clearfix">
<dt>leader url:</dt>
<dd>{{settings.leaderUrl}}</dd>
</dl>
</li>
<li class="isPollingDisabled"><dl class="clearfix">
<dt>polling enable:</dt>
<dd class="ico" ng-class="{'ico-0':settings.isPollingDisabled, 'ico-1':!settings.isPollingDisabled}">
<span ng-show="settings.pollInterval">(interval: {{settings.pollInterval}})</span>&nbsp;
</dd>
</dl></li>
</ul>
</div>
<div id="leader-settings" class="settings block clearfix">
<div class="label"><span>Settings (Leader):</span></div>
<ul>
<li class="replicationEnabled"><dl class="clearfix">
<dt>replication enable:</dt>
<dd class="ico" ng-class="{'ico-0':!leader.replicationEnabled, 'ico-1':leader.replicationEnabled}">&nbsp;</dd>
</dl></li>
<li class="replicateAfter"><dl class="clearfix">
<dt>replicateAfter:</dt>
<dd>{{leader.replicateAfter}}</dd>
</dl></li>
<li class="confFiles" ng-show="leader.files"><dl class="clearfix">
<dt>confFiles:</dt>
<dd><span ng-repeat="file in leader.files"><attr title="{{file.title}}">{{file.name}}</attr>{{ $last ? '' :', '}}</span></dd>
</dl></li>
</ul>
</div>
</div>
<div id="navigation">
<div class="timer" ng-show="isFollower && !settings.isPollingDisabled &&!settings.isReplicating">
<p>Next Run: <span class="approx" ng-show="settings.isApprox">~</span><span class="tick">{{settings.tick | readableSeconds}}</span></p>
<small ng-show="settings.nextExecutionAt">{{settings.nextExecutionAt}}</small>
</div>
<button class="refresh-status" ng-click="refresh()"><span>Refresh Status</span></button>
<div class="followerOnly" ng-show="isFollower">
<button class="optional replicate-now primary" ng-click="execute('fetchindex')" ng-show="!settings.isReplicating"><span>Replicate now</span></button>
<button class="optional abort-replication warn" ng-click="execute('abortfetch')" ng-show="settings.isReplicating"><span>Abort Replication</span></button>
<button class="optional disable-polling" ng-click="execute('disablepoll')" ng-show="!settings.isPollingDisabled"><span>Disable Polling</span></button>
<button class="optional enable-polling" ng-click="execute('enablepoll')" ng-show="settings.isPollingDisabled"><span>Enable Polling</span></button>
</div>
<div class="leaderOnly" ng-show="!isFollower">
<button class="optional disable-replication warn" ng-click="execute('disablereplication')" ng-show="leader.replicationEnabled"><span>Disable Replication</span></button>
<button class="optional enable-replication warn" ng-click="execute('enablereplication')" ng-show="!leader.replicationEnabled"><span>Enable Replication</span></button>
</div>
</div>
</div>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,490 @@
<!--
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>
<button id="manipulateFieldType" class="action" ng-click="toggleManipulateFieldType()"><span>Manipulate Field Type</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_uninvertible">
<input type="checkbox" ng-model="newField.uninvertible" id="add_uninvertible" title="Field should be uninvertible, it is generally recomended to use docValues instead." ng-true-value="'true'" ng-false-value="'false'">
uninvertible
</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 class="action add field-type" data-rel="add" ng-show="showManipulateFieldType" escape-pressed="hideAll()">
<form>
<select id="field_type_manipulation_options"
ng-model="fieldTypeManipulationOption"
chosen
disable-search="true"
ng-change="selectFieldTypeManipulationOption()"
ng-options="f.value for f in fieldTypeManipulationOptions"></select>
<a ng-click="showHelp('fieldTypeManipulationHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
<div id="sampleDocsHelp" class="help" ng-show="helpId === 'fieldTypeManipulationHelp'">
<p>
<a target="_blank" href="https://solr.apache.org/guide/solr/latest/indexing-guide/schema-api.html#add-a-new-field-type">Add a New Field Type</a>: The <b>add-field-type</b> command adds a new field type to your schema.
</p>
<p>
<a target="_blank" href="https://solr.apache.org/guide/solr/latest/indexing-guide/schema-api.html#delete-a-field-type">Delete a Field Type</a>: The <b>delete-field-type</b> command removes a field type from your schema.
</p>
<p>
<a target="_blank" href="https://solr.apache.org/guide/solr/latest/indexing-guide/schema-api.html#replace-a-field-type">Replace a Field Type</a>: The <b>replace-field-type</b> command replaces a field type in your schema.
</p>
</div>
<p class="clearfix">
<textarea rows="20" cols="50" type="text" id="manipulate_field_type" ng-model="fieldTypeObj" focus-when="showManipulateFieldType" placeholder="specify field type operation(add, delete, replace) with field type patterns"></textarea>
</p>
<div ng-repeat="error in manipulateFieldTypeErrors" ng-show="addFieldTypeErrors" class="clearfix note error">
<span>{{error}}</span></div>
<p class="clearfix buttons">
<button type="submit" class="submit" ng-class="{success: added}" ng-click="manipulateFieldType()"><span>{{fieldTypeManipulationOption.label}}</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="display.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" ng-show="analysis.data.className">Field-Type:</dt>
<dd class="field-type" ng-show="analysis.data.className">{{analysis.data.className}}</dd>
<dt class="similarity" ng-show="display.similarity.className">Similarity:</dt>
<dd class="similarity" ng-show="display.similarity.className" data-tip="{{ display.similarity.className }}">{{ display.similarity.details }}</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 && !display.partialState">
<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 ng-href="#/{{core}}/query?q=%7B!term+f%3D{{name | uriencode}}%7D{{term | uriencode}}">{{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</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 && is.field && !showDelete"><button ng-click="toggleDelete()"><span>delete field</span></button></dd>
<dd class="active delete-field" ng-show="isSchemaUpdatable && is.dynamicField && !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="similarity" ng-class="{active: similarity.className}">Global Similarity:</dt>
<dd class="similarity" ng-class="{active: similarity.className}" data-tip="{{ similarity.className }}">{{ similarity.details }}</dd>
</dl>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,308 @@
<!--
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="securityPanel" class="clearfix">
<div ng-show="isSecurityAdminEnabled && !currentUser">
<p class="error-msg"><img src="img/ico/prohibition.png"/>&nbsp;Current user is not authenticated! Security panel is disabled.</p>
</div>
<div ng-show="isSecurityAdminEnabled && !hasSecurityReadPerm">
<p class="error-msg"><img src="img/ico/prohibition.png"/>&nbsp;You do not have permission to view the security panel.</p>
</div>
<div ng-show="!isSecurityAdminEnabled">
<p class="warning-msg"><img src="img/ico/shield--exclamation.png"/>&nbsp;WARNING: Security is not enabled for this server!</p>
<div ng-show="isCloudMode">
<p class="clearfix">Use the <b>bin/solr auth</b> command-line tool to enable security and then reload this panel. For more information, see: <a target="_blank" href="https://solr.apache.org/guide/solr/latest/deployment-guide/authentication-and-authorization-plugins.html#using-security-json-with-solr" class="ref-guide-link">Using security.json with Solr</a></p>
<p class="clearfix"><br/>Example usage of <b>bin/solr auth</b> to enable basic authentication:</p>
<pre>
bin/solr auth enable -type basicAuth -prompt true -z {{zkHost}}
</pre>
</div>
<div ng-show="!isCloudMode">
<p class="clearfix">Create a <b>security.json</b> config file in your Solr home directory and then restart Solr (on all nodes). For more information, see: <a target="_blank" href="https://solr.apache.org/guide/solr/latest/deployment-guide/authentication-and-authorization-plugins.html#using-security-json-with-solr" class="ref-guide-link">Using security.json with Solr</a></p>
</div>
</div>
<div class="main-col" ng-show="isSecurityAdminEnabled && hasSecurityReadPerm">
<div class="block">
<div id="authn">
<h2><span>Security Settings</span></h2>
<div id="authn-content">
<div id="plugins"><span id="tls">TLS enabled? <img ng-show="tls" src="img/ico/tick.png"/><img ng-show="!tls" src="img/ico/cross.png"/></span>
<span id="authnPlugin">Authentication Plugin: <b>{{authenticationPlugin}}</b><span ng-show="multiAuthWithBasic"><a ng-click="showHelp('multiAuthBasicHelp')"><img class="help-ico" src="img/ico/exclamation-button.png"/></a>
<div id="multiAuthBasicHelp" class="help" ng-show="helpId === 'multiAuthBasicHelp'">
<div class="help-top">
<p>When using the <b>MultiAuthPlugin</b>, changes made to <b>Users</b> and <b>Roles</b>, using the panels below, only affect <b>Basic</b> authentication.<br><br><b>
Users</b> and <b>Roles</b> for the other authentication schemes, such as the <b>Bearer</b> scheme (JWTAuthPlugin), are managed by an external provider.
Thus, not all users with access to the system are displayed below; only users managed by the <b>BasicAuthPlugin</b> are displayed on this screen.
</p>
</div>
</div>
</span>
</span>
<span id="authzPlugin">Authorization Plugin: <b>{{authorizationPlugin}}</b></span></div>
<form>
<span ng-show="manageUsersEnabled" id="realm-field">
<label for="realmName">Realm:&nbsp;</label><input disabled class="input-text" type="text" id="realmName" ng-model="realmName">
</span>
<span id="block-field" ng-show="manageUsersEnabled"><label for="block_unknown">Block anonymous requests?</label><input class="input-check" type="checkbox" id="block_unknown" ng-model="blockUnknown" ng-change="onBlockUnknownChange()" ng-true-value="'true'" ng-false-value="'false'"/><a ng-click="showHelp('blockUnknownHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
<div id="blockUnknownHelp" class="help" ng-show="helpId === 'blockUnknownHelp'">
<div class="help-top">
<p>If checked, un-authenticated requests to any Solr endpoint are blocked. If un-checked, then any endpoint that is not protected with a permission will be accessible by anonymous users. Only disable this check if you want to allow un-authenticated access to specific endpoints that are configured with <b>role: null</b>. All other endpoints should be protected with explicit role bindings that require authentication. For more information, see:
<div class="help-anchor"><a target="_blank" href="https://solr.apache.org/guide/solr/latest/deployment-guide/basic-authentication-plugin.html#enable-basic-authentication">Basic Authentication</a></div></p>
</div>
</div>
</span>
<span ng-show="manageUsersEnabled" id="forward-field"><label for="forward_creds">Forward credentials?</label><input class="input-check" type="checkbox" id="forward_creds" ng-model="forwardCredentials" ng-change="onForwardCredsChange()" ng-true-value="'true'" ng-false-value="'false'"/><a ng-click="showHelp('forwardCredsHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
<div id="forwardCredsHelp" class="help" ng-show="helpId === 'forwardCredsHelp'">
<div class="help-top">
<p>If checked, Solr forwards user credentials when making distributed requests to other nodes in the cluster. If un-checked (the default), Solr will use the internal PKI authentication mechanism for distributed requests. For more information, see:
<div class="help-anchor"><a target="_blank" href="https://solr.apache.org/guide/solr/latest/deployment-guide/authentication-and-authorization-plugins.html#pkiauthenticationplugin">PKIAuthenticationPlugin</a></div></p>
</div>
</div>
</span>
</form>
</div>
<div id="error-dialog" class="error-dialog" ng-show="securityAPIError">
<div id="error-dialog-note"><p class="clearfix"><img src="img/ico/prohibition.png"/>&nbsp;{{securityAPIError}}</p></div>
<div id="error-dialog-details"><div ng-show="securityAPIErrorDetails"><textarea rows="10" cols="55">{{securityAPIErrorDetails}}</textarea></div></div>
<div id="error-dialog-buttons" class="clearfix">
<button type="reset" class="error-button" ng-click="closeErrorDialog()"><span>OK</span></button>
</div>
</div>
<div id="user-dialog" class="dialog" ng-show="showUserDialog" escape-pressed="hideAll()">
<div id="user-heading" class="heading">{{userDialogHeader}}<button id="delete-user" ng-show="userDialogMode === 'edit'" class="submit" ng-click="confirmDeleteUser()"><span>Delete</span></button></div>
<form autocomplete="off">
<p class="clearfix"><label for="add_user">Username:</label><input autocomplete="off" ng-disabled="userDialogMode === 'edit'" class="input-text" type="text" id="add_user" ng-model="upsertUser.username" focus-when="showAddField" placeholder="enter a username"></p>
<p class="clearfix"><label for="add_user_roles">Roles:</label><select multiple ng-model="upsertUser.selectedRoles" id="add_user_roles" size="5" ng-options="r for r in roleNames"></select></p>
<p class="clearfix"><label for="add_user">Add New Role:</label><input autocomplete="off" ng-disabled="userDialogMode === 'edit'" class="input-text" type="text" id="add_user_new_role" ng-model="upsertUser.newRole"></p>
<p class="clearfix"><label for="add_user_password">Password:</label><input autocomplete="off" class="input-text" type="password" id="add_user_password" ng-model="upsertUser.password" placeholder="enter a strong password"></p>
<p class="clearfix"><label for="add_user_password2">Confirm password:</label><input autocomplete="off" class="input-text" type="password" id="add_user_password2" ng-model="upsertUser.password2" placeholder="re-enter password"></p>
<div class="formMessageHolder">
<p class="validate-error" ng-show="validationError"><span>{{validationError}}</span></p>
</div>
<p class="clearfix buttons">
<button type="submit" class="submit" ng-click="doUpsertUser()"><span>{{userDialogAction}}</span></button>
<button type="reset" class="reset" ng-click="toggleUserDialog()"><span>Cancel</span></button>
</p>
</form>
</div>
<div id="role-dialog" class="dialog" ng-show="showRoleDialog" escape-pressed="hideAll()">
<div id="role-heading" class="heading">{{roleDialogHeader}}</div>
<form autocomplete="off">
<p class="clearfix"><label for="add_role">Name:</label><input autocomplete="off" ng-disabled="roleDialogMode === 'edit'" class="input-text" type="text" id="add_role" ng-model="upsertRole.name" focus-when="showRoleDialog" placeholder="enter role name"></p>
<p class="clearfix"><label for="add_role_users">Users:</label><select multiple ng-model="upsertRole.selectedUsers" id="add_role_users" size="8" ng-options="u for u in userNames"></select></p>
<!-- <p class="clearfix"><label for="add_role_new_user">Add New User:</label><input class="input-text" type="text" id="add_role_new_user" ng-model="upsertRole.newUser"></p> -->
<p class="clearfix"><label for="add_role_perms">Grant Permissions:</label><select multiple ng-model="upsertRole.grantedPerms" id="add_role_perms" size="8" ng-options="p for p in grantPermissionNames"></select></p>
<div class="formMessageHolder">
<p class="validate-error" ng-show="validationError"><span>{{validationError}}</span></p>
</div>
<p class="clearfix buttons">
<button type="submit" class="submit" ng-click="doUpsertRole()"><span>{{roleDialogAction}}</span></button>
<button type="reset" class="reset" ng-click="toggleRoleDialog()"><span>Cancel</span></button>
</p>
</form>
</div>
<div id="add-permission-dialog" class="dialog" ng-show="showPermDialog" escape-pressed="hideAll()">
<div id="perm-heading" class="heading">{{permDialogHeader}}<button id="delete-perm" ng-show="permDialogMode === 'edit'" class="submit" ng-click="confirmDeletePerm()"><span>Delete</span></button></div>
<form>
<div class="form-field" ng-show="permDialogMode === 'edit'"><label for="add_perm_index">Index:</label><input class="input-text" type="text" id="add_perm_index" ng-model="upsertPerm.index"><a ng-click="showHelp('permIndexHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
<div id="permIndexHelp" class="help" ng-show="helpId === 'permIndexHelp'">
<div class="help-index">
<p>For requests where multiple permissions match, Solr applies the first permission that matches based on a complex ordering logic. In general, more specific permissions should be listed earlier in the configuration. The permission index (1-based) governs its position in the configuration. To re-order a permission, change the index to desired position.
<div class="help-anchor"><a target="_blank" href="https://solr.apache.org/guide/solr/latest/deployment-guide/rule-based-authorization-plugin.html#permission-ordering-and-resolution">Permission Ordering and Resolution</a></div></p>
</div>
</div>
</div>
<div id="perm-select"><label for="predefined">Predefined:</label><select id="predefined"
chosen disable-search="true" allow-single-deselect="true"
ng-change="onPredefinedChanged()"
ng-model="selectedPredefinedPermission"
ng-disabled="permDialogMode === 'edit'"
ng-options="p for p in filteredPredefinedPermissions">
<option value=""></option>
</select><span id="add_perm_custom">or Custom: <input ng-disabled="permDialogMode === 'edit'" ng-change="onPredefinedChanged()" type="text" id="add_perm_name" ng-model="upsertPerm.name"><a ng-click="showHelp('permDialogHelp')"><img class="help-ico" src="img/ico/question-white.png"/></a>
<div id="permDialogHelp" class="help" ng-show="helpId === 'permDialogHelp'">
<div class="help-perm">
<p>Permissions allow you to grant access to protected resources to one or more roles. Solr provides a list of <b>predefined</b> permissions to cover common use cases, such as collection administration. Otherwise, you can define a <b>custom permission</b> for fine-grained control over the API path(s), collection(s), request method(s) and params.
<div class="help-anchor"><a target="_blank" href="https://solr.apache.org/guide/solr/latest/deployment-guide/rule-based-authorization-plugin.html#permissions-2">Rule-based Authorization :: Permissions</a></div></p>
</div>
</div></span>
</div>
<p class="form-field"><label>Roles:</label><select ng-show="manageUserRolesEnabled" multiple ng-model="upsertPerm.selectedRoles" id="add_perm_roles" size="5" ng-options="r for r in roleNamesWithWildcard"></select><input ng-show="!manageUserRolesEnabled" class="input-text" type="text" ng-model="upsertPerm.manualRoles"></p>
<p class="form-field"><label for="add_perm_collection">Collection:</label><input ng-disabled="isPermFieldDisabled" class="input-text" type="text" id="add_perm_collection" ng-model="upsertPerm.collection"></p>
<p class="form-field"><label for="add_perm_path">Path:</label><input ng-disabled="isPermFieldDisabled" type="text" id="add_perm_path" ng-model="upsertPerm.path"></p>
<div class="form-field"><label>Request Method:</label>
<table>
<tr><td><input ng-disabled="isPermFieldDisabled" class="input-check" type="checkbox" id="add_perm_method_get" ng-model="upsertPerm.method.get" ng-true-value="'true'" ng-false-value="'false'"/>GET</td></tr>
<tr><td><input ng-disabled="isPermFieldDisabled" class="input-check" type="checkbox" id="add_perm_method_post" ng-model="upsertPerm.method.post" ng-true-value="'true'" ng-false-value="'false'"/>POST</td></tr>
<tr><td><input ng-disabled="isPermFieldDisabled" class="input-check" type="checkbox" id="add_perm_method_put" ng-model="upsertPerm.method.put" ng-true-value="'true'" ng-false-value="'false'"/>PUT</td></tr>
<tr><td><input ng-disabled="isPermFieldDisabled" class="input-check" type="checkbox" id="add_perm_method_delete" ng-model="upsertPerm.method.delete" ng-true-value="'true'" ng-false-value="'false'"/>DELETE</td></tr>
</table>
</div>
<div class="form-field"><label>Request Params:</label>
<div id="param-rows">
<div class="row clearfix" ng-repeat="p in params">
<input class="param-name" type="text" ng-model="p.name" name="paramName" ng-disabled="isPermFieldDisabled">&nbsp;=&nbsp;<input class="param-value" type="text" ng-model="p.value" name="paramValue" ng-disabled="isPermFieldDisabled">
<div class="param-buttons" ng-show="!isPermFieldDisabled">
<a class="rem" ng-click="removeParam($index)"><span></span></a>
<a class="add" ng-click="addParam($index)"><span></span></a>
</div>
</div>
</div>
</div>
<div class="formMessageHolder">
<p class="validate-error" ng-show="validationError"><span>{{validationError}}</span></p>
</div>
<p class="clearfix buttons">
<button type="submit" class="submit" ng-click="doUpsertPermission()"><span>{{permDialogAction}}</span></button>
<button type="reset" class="reset" ng-click="togglePermDialog()"><span>Cancel</span></button>
</p>
</form>
</div>
</div>
</div>
<div class="block">
<div class="users-left" id="users">
<h2><span>Users</span></h2>
<p ng-show="!manageUsersEnabled" class="external-msg"><img src="img/ico/prohibition.png"/>&nbsp;Users are managed by an external provider.</p>
<div id="users-content" ng-show="manageUsersEnabled">
<div id="user-filters">
Filter users by:&nbsp;<select id="user-filter-type" ng-model="userFilter" ng-change="applyUserFilter()">
<option value=""></option>
<option value="name">name</option>
<option value="role">role</option>
<option value="path">path</option>
<option value="perm">permission</option>
</select>
<select ng-show="userFilter==='role'||userFilter==='perm'" id="user-filter-options" ng-model="userFilterOption" ng-change="onUserFilterOptionChanged()" ng-options="option for option in userFilterOptions"></select>
<input ng-show="userFilter==='name'||userFilter==='path'" type="text" ng-model="userFilterText" id="user-filter-text" ng-change="onUserFilterTextChanged()"/>
<div id="user-actions">
<button id="add-user" class="action" ng-click="showAddUserDialog()" ng-show="hasSecurityEditPerm"><span>Add User</span></button>
</div>
</div>
<div id="users-table">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr ng-class="{odd:$odd}">
<th class="table-hdr td-name">Username</th>
<th class="table-hdr td-roles">Roles</th>
</tr>
<tr class="editable" ng-repeat="u in filteredUsers" ng-class="{odd:$odd}" ng-click="editUser(u)">
<td class="table-data">{{u.username}}</td>
<td class="table-data">{{displayList(u.roles)}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="roles-right" id="roles">
<h2><span>Roles</span></h2>
<p ng-show="!manageUserRolesEnabled" class="external-msg"><img src="img/ico/prohibition.png"/>&nbsp;Roles are managed by an external provider.</p>
<div id="roles-content" ng-show="manageUserRolesEnabled">
<div id="role-filters">
Filter roles by:&nbsp;<select id="role-filter-type" ng-model="roleFilter" ng-change="applyRoleFilter()">
<option value=""></option>
<option value="name">name</option>
<option value="user">user</option>
<option value="path">path</option>
<option value="perm">permission</option>
</select>
<select ng-show="roleFilter==='user'||roleFilter==='perm'" id="role-filter-options" ng-model="roleFilterOption" ng-change="onRoleFilterOptionChanged()" ng-options="option for option in roleFilterOptions"></select>
<input ng-show="roleFilter==='name'||roleFilter==='path'" type="text" ng-model="roleFilterText" id="role-filter-text" ng-change="onRoleFilterTextChanged()"/>
<div id="role-actions">
<button id="add-role" class="action" ng-click="showAddRoleDialog()" ng-show="hasSecurityEditPerm"><span>Add Role</span></button>
</div>
</div>
<div id="roles-table">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr ng-class="{odd:$odd}">
<th class="table-hdr td-role">Role</th>
<th class="table-hdr td-roles">Users</th>
</tr>
<tr class="editable" ng-repeat="r in filteredRoles" ng-class="{odd:$odd}" ng-click="editRole(r)">
<td class="table-data">{{r.name}}</td>
<td class="table-data">{{displayList(r.users)}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="block" id="permissions">
<h2><span>Permissions</span></h2>
<div id="permissions-content">
<div id="perm-filters">
Filter permissions by:&nbsp;<select id="perm-filter-type" ng-model="permFilter" ng-change="applyPermFilter()" ng-options="opt for opt in permFilterTypes"></select>
<select ng-show="permFilter==='role'||permFilter==='user'||permFilter==='collection'" id="perm-filter-options" ng-model="permFilterOption" ng-change="onPermFilterOptionChanged()" ng-options="option for option in permFilterOptions"></select>
<input ng-show="permFilter==='name'||permFilter==='path'" type="text" ng-model="permFilterText" id="perm-filter-text" ng-change="onPermFilterTextChanged()"/>
<div id="perm-actions">
<button id="add-permission" class="action" ng-click="showAddPermDialog()" ng-show="hasSecurityEditPerm && managePermissionsEnabled"><span>Add Permission</span></button>
</div>
</div>
<div id="perms-table">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr ng-class="{odd:$odd}">
<th class="table-hdr td-name">Name</th>
<th class="table-hdr td-roles">Roles</th>
<th class="table-hdr td-coll">Collection</th>
<th class="table-hdr td-path">Path</th>
<th class="table-hdr td-method">Method</th>
<th class="table-hdr td-params">Params</th>
</tr>
<tr class="editable" ng-repeat="p in filteredPerms" ng-class="{odd:$odd}" ng-click="editPerm(p)">
<td class="table-data">{{p.name}}</td>
<td class="table-data">{{displayRoles(p.roles)}}</td>
<td class="table-data">{{p.collectionNames}}</td>
<td class="table-data">{{displayList(p.paths)}}</td>
<td class="table-data">{{displayList(p.method)}}</td>
<td class="table-data">{{displayParams(p.params)}}</td>
</tr>
</tbody>
</table>
</div>
<div ng-show="hasPermWarnings" class="external-msg">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr ng-repeat="w in permWarnings">
<td class="table-warn"><img src="img/ico/exclamation-button.png"/> {{w}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,99 @@
<!--
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="segments">
<div class="clearfix">
<div class="block fieldlist" id="statistics">
<h2><span>Segments</span></h2>
<p id="auto-refresh"><a ng-click="toggleAutoRefresh()" ng-class="{on:autorefresh}">Auto-Refresh</a></p>
<a class="reload" ng-click="refresh()"><span>reload</span></a>
<div class="message-container">
<div class="message"></div>
</div>
<div class="content">
<div id="result">
<div id="response">
<div class="segments-holder">
<ul>
<li>
<dl class="clearfix" style="width:100%;">
<dt>
<div>Size</div>
</dt>
<dd>
<div class="start">0</div>
<div class="w5" ng-repeat="x in xaxis">
<span ng-show="x&gt;0.001">{{x.value}}</span>
<span ng-hide="x&gt;0.001">&nbsp;</span>
</div>
<div class="end">{{segmentMB | number}} MB</div>
</dd>
</dl>
</li>
<li ng-repeat="segment in segments">
<dl class="clearfix" ng-style="{width: segment.totalSize+'%'}">
<dt>
<div>{{ segment.name }}</div>
</dt>
<dd>
<div class="live" ng-class="{'merge-candidate':segment.mergeCandidate}"
ng-style="{width: segment.aliveDocSize+'%'}">&nbsp;</div>
<div class="tooltip">
<div>Segment <b>{{segment.name}}</b>:</div>
<div class="label">#docs:</div>
<div>{{ segment.size | number }}</div>
<div class="label">#dels:</div>
<div>{{ segment.delCount | number }}</div>
<div class="label">size:</div>
<div>{{ segment.sizeInBytes | number }} bytes</div>
<div class="label">age:</div>
<div>{{ segment.age }}</div>
<div class="label">source:</div>
<div>{{ segment.source }}</div>
</div>
<div class="deleted" ng-show="segment.deletedDocSize"
style="width: {{ segment.deletedDocSize }}%; margin-left:{{ segment.aliveDocSize}}%;">
&nbsp;</div>
</dd>
</dl>
</li>
<li>
<dl>
<dt></dt>
<dd>Deletions: {{ deletionsPercentage }}%</dd>
</dl>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,35 @@
<!--
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="sqlquery" class="clearfix">
<div id="form">
<form>
<label for="sqlexpr" title="The SQL Query">
SQL Query Statement
</label>
<textarea name="stmt" ng-model="stmt" id="sqlexp"></textarea>
<button type="submit" ng-click="doQuery()">Execute</button>
<span><a href="https://solr.apache.org/guide/solr/latest/query-guide/sql-query.html" target="_out">syntax help</a></span>
</form>
</div>
<div id="sql-response">
<a ng-show="sqlData" id="url" class="address-bar" ng-href="{{url}}">{{hostPortContext}}{{url}}</a>
<div ng-show="sqlError"> {{sqlError}}</div>
<div ng-show="!sqlError" class="grid" ui-grid="gridOptions" id="sql-response"></div>
</div>
</div>

View File

@@ -0,0 +1,64 @@
<!--
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="stream" class="clearfix">
<div id="form">
<form>
<label for="expr" title="The expression string">
Streaming Expression (expr)
</label>
<textarea name="expr" ng-model="expr" id="expr" title="The expression string.">search(....)</textarea>
<button type="submit" ng-click="doStream()">Execute</button>
<input type="checkbox" ng-model="doExplanation" name="doExplanation" id="doExplanation" value="true">
<label for="explain" class="checkbox" title="Enable Explanation." ng-click="doExplanation = !doExplanation">
with explanation
</label>
</form>
</div>
<div id="result">
<a ng-show="response.data" id="url" class="address-bar" ng-href="{{url}}">{{hostPortContext}}{{url}}</a>
<div ng-show="showExplanation" id="explanation" class="clearfix">
<div id="frame">
<div explanation-graph id="explanation-content" data="explanationData" depth="depth" leaf-count="leafCount" class="content clearfix" ng-show="showGraph">
<div id="legend">
<svg width="100%" height="15">
<g transform="translate(5,10)" class="stream-decorator"><circle r="4.5"></circle></g>
<g transform="translate(15,14)"><text>Stream Decorator</text></g>
<g transform="translate(140,10)" class="stream-source"><circle r="4.5"></circle></g>
<g transform="translate(150,14)"><text>Stream Source</text></g>
<g transform="translate(260,10)" class="graph-source"><circle r="4.5"></circle></g>
<g transform="translate(270,14)"><text>Graph Source</text></g>
<g transform="translate(375,10)" class="datastore"><circle r="4.5"></circle></g>
<g transform="translate(385,14)"><text>Datastore</text></g>
</svg>
</div>
<div id="canvas"></div>
</div>
</div>
</div>
<div id="response">
<pre class="syntax language-json"><code ng-bind-html="response.data | highlight:json | unsafe"></code></pre>
</div>
</div>
</div>

View File

@@ -0,0 +1,65 @@
<!--
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="threads" ng-class="showAllStacktraces ? 'expanded' : 'collapsed'">
<div class="controls">
<a ng-click="toggleStacktraces()">
<span>{{showAllStacktraces?"Hide":"Show"}} all Stacktraces</span>
</a>
</div>
<div id="thread-dump">
<table border="0" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th class="name">name</th>
<th class="time">cpuTime / userTime</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="thread in threads" class="{{$odd?'odd':''}} {{thread.lock?'lock':''}} {{thread.stackTrace?'stacktrace':''}} {{thread.state}}">
<td class="name">
<a title="{{thread.state}}" ng-click="toggleStacktrace(thread)"><span>{{thread.name}} ({{thread.id}})</span></a>
<p title="Waiting on" ng-show="thread.lock">{{thread.lock}}</p>
<div ng-show="thread.showStackTrace">
<ul>
<li ng-repeat="trace in thread.stackTrace track by trace.id">{{trace.trace}}</li>
</ul>
</div>
</td>
<td class="time">{{thread.cpuTime}}<br>{{thread.userTime}}</td>
</tr>
</tbody>
</table>
</div>
<div class="controls">
<a ng-click="toggleStacktraces()">
<span>{{showAllStacktraces?"Hide":"Show"}} all Stacktraces</span>
</a>
</div>
</div>

View File

@@ -0,0 +1,23 @@
<!--
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="unknown" class="clearfix">
<div>
Oops, this URL is unknown to us, redirecting you back to Dashboard
</div>
</div>