first commit

This commit is contained in:
2025-02-20 14:57:11 +08:00
commit 687bda5ead
1924 changed files with 4379193 additions and 0 deletions
@@ -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>
@@ -0,0 +1,298 @@
<!--
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>
<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" ng-show="showDetails">
<td>{{key}}</td>
<td ng-repeat="host in zkState.details">
{{host[key]}}
</td>
</tr>
<tr ng-repeat="key in ensembleDetailKeys" 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]">
<td rowspan="{{hosts[n.host].nodes.length}}" ng-show="isFirstNodeForHost(key)">
<div class="host-name">{{n.host}}</div>
<span class="host-spec" ng-show="!showDetails[n.host]">
<span title="{{n.system.system.uptime}}">{{n.system.system.name}}</span>
<span title="free: {{n.memFree}}">{{n.memTotal}}</span>
<span title="{{n.system.jvm.name}} {{n.system.jvm.version}}">Java {{n.system.jvm.spec.version}}</span>
<br/>Load: {{n.loadAvg}}
</span>
<div class="host-spec" ng-show="showDetails[n.host]">
{{n.system.system.name}} {{n.system.system.version}}, {{n.system.system.availableProcessors}}cpu<br/>
Uptime: {{n.uptime}}<br/>
<span title="Used: {{n.memUsed}} - includes OS file-cache, and it is normal for it to approach 100%">Memory: {{n.memTotal}}</span><br/>
File descriptors: {{n.openFileDescriptorCount}}/{{n.maxFileDescriptorCount}}<br/>
Disk: <span class="{{n.diskUsedPctStyle}}" title="Nodes may use other disks too">{{n.diskTotal}} used: {{n.diskUsedPct}}%</span><br/>
Load: {{n.loadAvg}}
</div>
<div class="node-spec" ng-click="toggleHostDetails(n.host)">
<a ng-show="showDetails[n.host]">hide details...</a>
<a ng-show="!showDetails[n.host]">show details...</a>
</div>
</td>
<td><div class="node-name"><a href="{{n.base_url}}">{{key.replace(n.host+':', '')}}</a></div>
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>
</td>
<td>
<div class="node-cpu">
<span class="{{n.cpuPctStyle}}">{{n.cpuPct}}%</span>
</div>
</td>
<td>
<div class="node-heap" title="total: {{n.heapTotal}} free: {{n.heapFree}} used%: {{n.heapUsedPct}}%">
<span class="{{n.heapUsedPctStyle}}">{{n.heapUsedPct}}%</span>
</div>
<div class="node-spec" ng-show="showDetails[key]">
Max: {{n.heapTotal}}<br/>
Used: {{n.heapUsed}}
</div>
</td>
<td class="scroll-height-250">
<div>
<div class="node-disk" title="Available disk: {{n.diskTotal}} free: {{n.diskFree}} used by this node: {{n.size}}">
{{n.size}}
</div>
<div class="node-spec" ng-show="showDetails[key]">
Total #docs: {{n.numDocs}}<br/>
Avg size/doc: {{n.sizePerDoc}}
</div>
<div id="chart{{n.id}}" ng-show="showDetails[key]"></div>
</div>
</td>
<td><div class="node-requests" title="1minRate: {{n.req1minRate}} 5minRate: {{n.req5minRate}} 15minRate: {{n.req15minRate}} p75: {{n.reqp75_ms}} p99: {{n.reqp99_ms}}">
RPM: {{n.req15minRate}}<br/>p95: {{n.reqp95_ms}}ms</div>
</td>
<td>
<div ng-show="!n.collections">(none)</div>
<div ng-repeat="c in n.collections | limitTo:showDetails[key]?999:2 track by $index">
<a href="{{n.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">
<div ng-show="!n.cores">(none)</div>
<div ng-repeat="core in n.cores | limitTo:showDetails[key]?999:2 track by $index">
<a class="{{core.leader ? 'leader' : 'replica'}}" href="{{core.base_url + '/#/' + core.core}}">{{ core.label }}</a> ({{core.numDocsHuman}} docs)
<ul class="core-details" ng-show="showDetails[key]">
<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]">
<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" is-radial="isRadial" 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>
@@ -0,0 +1,49 @@
<!--
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="cluster-suggestions">
<h1>Cluster Suggestions</h1>
<br/>
<table id="s-table">
<tr>
<td>Type</td>
<td>Reason</td>
<td>Details</td>
<td>Action</td>
</tr>
<tr ng-if="parsedData.length==0">
<td align="center" colspan="4">NA</td>
</tr>
<tr ng-repeat="x in parsedData">
<td>{{ x.type }}</td>
<td>{{ x.violation.clause }}</td>
<td>node: {{ x.violation.node }}, collection : {{ x.violation.collection }}, shard : {{ x.violation.shard }} &nbsp; </td>
<td>
<div class="s-container">
<input class="s-box1" ng-hide="x.run || x.type =='unresolved-violation'" type="button"
title="{{ x.operation }}" ng-click="postdata(x)" ng-mouseover="showPopover()"
ng-mouseleave="hidePopover()"/>
<div class="s-box2" ng-show="x.loading"><img src="img/loader.gif"></div>
<div class="s-box3" ng-show="x.done"><img src="img/ico/tick.png"></div>
<div class="s-box4" ng-show="x.failed || x.type == 'unresolved-violation'"><img src="img/ico/cross.png"></div>
</div>
</td>
</tr>
</table>
</div>
@@ -0,0 +1,85 @@
<!--
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 fieldlist">
<h2><span>Collection: {{selectedCollection.name}}</span></h2>
<div class="content">
<dl>
<dt>Config name:</dt>
<dd class="value">{{selectedCollection.configName}}</dd>
<dt>Max shards per node:</dt>
<dd class="value">{{selectedCollection.maxShardsPerNode}}</dd>
<dt>Replication factor:</dt>
<dd class="value">{{selectedCollection.replicationFactor}}</dd>
<dt>Auto-add replicas:</dt>
<dd class="ico value" ng-class="selectedCollection.autoAddReplicas=='true' ? 'ico-1' : 'ico-0'"><span>yes</span></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>
@@ -0,0 +1,366 @@
<!--
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 id="frame">
<div id="actions" class="actions clearfix">
<button id="add" class="action" ng-click="showAddCollection()"><span>Add Collection</span></button>
<button id="delete" class="warn requires-core" ng-click="showDeleteCollection()" ng-show="collection"><span>Delete</span></button>
<button id="reload" class="requires-core" ng-click="reloadCollection()" ng-show="collection"
ng-class="{success: reloadSuccess, warn: reloadFailure}"><span>Reload</span></button>
<button id="create-alias" class="action requires-core" ng-click="toggleCreateAlias()"><span>Create Alias</span></button>
<button id="delete-alias" class="action requires-core" ng-click="toggleDeleteAlias()"><span>Delete Alias</span></button>
<div class="action add" data-rel="add" ng-show="showAdd" style="left:0px">
<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"><label for="add_replicationFactor">replicationFactor:</label>
<input type="text" name="replicationFactor" id="add_replicationFactor" ng-model="newCollection.replicationFactor"></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_maxShardsPerNode">maxShardsPerNode:</label>
<input type="text" name="replicationFactor" id="add_maxShardsPerNode" ng-model="newCollection.maxShardsPerNode"></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_autoAddReplicas">autoAddReplicas:</label>
<select name="autoAddReplicas" id="add_autoAddReplicas" ng-model="newCollection.autoAddReplicas">
<option value="true">true</option>
<option value="false">false</option>
</select>
</p>
</div>
<p class="clearfix note error" ng-show="addMessage">
<span>{{addMessage}}</span>
</p>
<p class="clearfix buttons">
<button type="submit" class="submit" 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 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 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 class="submit" ng-click="createAlias()"><span>Create Alias</span></button>
<button type="reset" class="reset" ng-click="cancelCreateAlias()"><span>Cancel</span></button>
</p>
</form>
</div>
<div class="action delete-alias" ng-show="showDeleteAlias">
<form>
<span ng-show="aliases">
<p class="clearfix"><label for="deleteAlias">Alias:</label>
<select id="deleteAlias" ng-model="aliasToDelete" ng-options="alias as alias for (alias, collections) in aliases" 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="deleteAlias()"><span>Delete Alias</span></button>
<button type="reset" class="reset" ng-click="cancelDeleteAlias()"><span>Cancel</span></button>
</p>
</span>
<span ng-hide="aliases">
<p>No aliases to delete.</p>
<p class="clearfix buttons">
<button type="reset" class="reset" ng-click="cancelDeleteAlias()"><span>Cancel</span></button>
</p>
</span>
</form>
</div>
</div>
<div class="requires-core" ng-hide="collection">
<h2>Please select a collection</h2>
</div>
<div id="data" class="requires-core clearfix" ng-show="collection">
<div class="block" id="collection-data">
<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>maxShardsPerNode:</span></dt>
<dd>{{collection.maxShardsPerNode}}</dd>
</dl></li>
<li><dl class="clearfix">
<dt><span>router:</span></dt>
<dd>{{collection.router.name}}</dd>
</dl></li>
<li><dl class="clearfix">
<dt><span>autoAddReplicas:</span></dt>
<dd>{{collection.autoAddReplicas}}</dd>
</dl></li>
</ul>
</div>
</div>
<div class="block" id="shard-data">
<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"><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>
node: {{shard.replicaNodeName}}
</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">
<ul>
<li ng-repeat="c in collections" ng-class="{current: collection.name == c.name}"><a href="#~collections/{{c.name}}">{{c.name}}</a></li>
</ul>
</div>
</div>
@@ -0,0 +1,206 @@
<!--
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_heap-usage-bytes">Heap Memory Usage:</dt>
<dd class="index_heap-usage-bytes value">{{index.indexHeapUsageBytes}}</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="isSlave"> (Slave)</span>
<span ng-show="isMaster"> (Master)</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="masterSearch" ng-show="isMaster">
<th>Master (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="master" ng-show="isMaster">
<th>Master (Replicable)</th>
<td class="version"><div>{{replication.master.replicableVersion || '-'}}</div></td>
<td class="generation"><div>{{replication.master.replicableGeneration || '-'}}</div></td>
<td class="size"><div>-</div></td>
</tr>
<tr class="master" ng-show="isSlave">
<th>Master (Replicable)</th>
<td class="version"><div>{{replication.master.replicableVersion || '-'}}</div></td>
<td class="generation"><div>{{replication.master.replicableGeneration || '-'}}</div></td>
<td class="size"><div>-</div></td>
</tr>
<tr class="masterSearch" ng-show="isSlave">
<th>Master (Searching)</th>
<td class="version"><div>{{replication.slave.masterDetails.indexVersion}}</div></td>
<td class="generation"><div>{{replication.slave.masterDetails.generation}}</div></td>
<td class="size"><div>{{replication.slave.masterDetails.indexSize || '-'}}</div></td>
</tr>
<tr class="slave slaveOnly" ng-show="isSlave">
<th>Slave (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">
<button class="healthcheck-status enabled">Healthcheck Status</button>
</dd>
<dd class="status value ico ico-0" ng-show="!healthcheckStatus">
<button class="healthcheck-status">enable ping</button>
</dd>
</dl>
</div>
</div>
</div>
</div>
@@ -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>
@@ -0,0 +1,209 @@
<!--
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="dataimport" class="clearfix">
<div ng-show="!hasHandlers">The solrconfig.xml file for this index does not have an operational DataImportHandler defined!</div>
<div id="frame" ng-show="hasHandlers">
<div id="error" ng-show="error"></div>
<div id="current_state" class="{{status}}">
<p class="last_update">Last Update: <abbr title="{{lastUpdateUTC}}">{{lastUpdate}}</abbr></p>
<div class="info">
<strong>{{info.text}}<span ng-show="info.timeTaken"> (Duration: {{info.timeTaken | readableSeconds }})</span>
</strong>
<div class="details" ng-show="info.showDetails">
<div class="docs">
<span ng-repeat="doc in info.docs">
<abbr style="display:inline" title="{{ doc.desc }}">{{ doc.name }}</abbr>: {{doc.value | number}}<!-- remove whitespace!
-->&nbsp;<span style="display:inline" ng-show="doc.speed">{{ doc.speed | number}}/s</span><!-- remove whitespace!
--><span style="display:inline" ng-show="!$last">, </span>
</span>
</div>
<div class="dates">
<span ng-repeat="date in info.dates">
<abbr title="{{ date.desc }}">{{ date.name }}</abbr>:
<abbr class="time">{{ date.value | timeago }}</abbr>
</span>
</div>
</div>
<button class="abort-import" ng-class="{warn:!isAborting, success: isAborting}" ng-click="abort()" ng-show="isRunning">
<span ng-show="isAborting">Aborting Import</span>
<span ng-show="!isAborting">Abort Import</span>
</button>
</div>
</div>
<div class="block" id="raw_output" >
<h2>
<a class="toggle" ng-click="toggleRawStatus()"><span>Raw Status-Output</span></a>
</h2>
<div class="message-container" ng-show="showRawStatus">
<div class="message"></div>
</div>
<div class="content" ng-show="showRawStatus">
<div id="raw_output_container"><pre class="syntax language-json"><code ng-bind-html="rawStatus | highlight:'json' | unsafe"></code></pre></div>
</div>
</div>
<div class="block" id="config" ng-class="{debug_mode:isDebugMode}">
<h2 class="clearfix">
<a class="toggle" ng-click="toggleConfiguration()"><span>Configuration</span></a>
<a class="r reload_config" ng-class="{success:reloaded}" ng-click="reload()" title="Reload Configuration">Reload</a>
<a class="r debug_mode" ng-click="toggleDebug()">Debug-Mode</a>
</h2>
<div class="message-container" ng-show="showConfiguration">
<div class="message"></div>
</div>
<div class="content" ng-show="showConfiguration">
<div id="dataimport_config">
<div class="formatted" ng-show="!isDebugMode">
<pre class="syntax language-xml"><code ng-bind-html="config | highlight:'xml'| unsafe"></code></pre>
</div>
<div class="editable" ng-show="isDebugMode">
<textarea ng-model="config"></textarea>
</div>
</div>
</div>
</div>
<div class="block" id="debug_response" ng-show="form.showDebug">
<h2>
<a class="toggle" ng-click="toggleRawDebug()"><span>Raw Debug-Response</span></a>
</h2>
<div class="message-container" ng-show="showRawDebug">
<div class="message"></div>
</div>
<div class="content" ng-show="showRawDebug">
<span ng-hide="rawResponse">
<em>No Request executed</em>
</span>
<span ng-show="rawResponse">
<pre class="syntax language-json"><code ng-bind-html="rawResponse | highlight:'json' | unsafe"></code></pre>
</span>
</div>
</div>
</div>
<div id="form" ng-show="hasHandlers">
<div id="navigation">
<ul>
<li ng-class="{current: currentHandler == handler}" ng-repeat="handler in handlers">
<a href="#/{{form.core}}/dataimport/{{handler}}">{{handler}}</a>
</li>
</ul>
</div>
<form action="#" method="get">
<label for="command">
<a rel="help">Command</a>
</label>
<select name="command" id="command" ng-model="form.command">
<option>full-import</option>
<option>delta-import</option>
</select>
<label for="verbose" class="checkbox">
<input type="checkbox" name="verbose" id="verbose" ng-model="form.verbose">
Verbose
</label>
<label for="clean" class="checkbox">
<input type="checkbox" name="clean" id="clean" ng-model="form.clean">
Clean
</label>
<label for="commit" class="checkbox">
<input type="checkbox" name="commit" id="commit" ng-model="form.commit">
Commit
</label>
<label for="optimize" class="checkbox">
<input type="checkbox" name="optimize" id="optimize" ng-model="form.optimize">
Optimize
</label>
<label for="debug" class="checkbox">
<input type="checkbox" name="debug" id="debug" ng-model="form.showDebug">
Debug
</label>
<label for="entity">
<a rel="help">Entity</a>
</label>
<select ng-model="form.entity" id="entity">
<option value=""></option>
<option ng-repeat="entity in entities">{{entity}}</option>
</select>
<label for="start">
<a rel="help">Start</a>,
<a rel="help">Rows</a>
</label>
<div class="clearfix">
<input type="text" id="start" placeholder="0" ng-model="form.start">
<input type="text" id="rows" placeholder="10" ng-model="form.rows">
</div>
<label for="custom_parameters">
<a rel="help">Custom Parameters</a>
</label>
<input type="text" id="custom_parameters" ng-model="form.custom" placeholder="key1=val1&amp;key2=val2">
</form>
<button class="execute" type="submit" ng-click="submit()">
<span ng-show="isDebugMode">Execute with this Configuration →</span>
<span ng-show="!isDebugMode">Execute</span>
</button>
<button class="refresh-status" ng-click="refreshStatus()" ng-class="{loader: isStatusLoading, success: statusUpdated}"><span>Refresh Status</span></button>
<p id="auto-refresh-status"><a ng-click="updateAutoRefresh()" ng-class="{on:autorefresh}">Auto-Refresh Status</a></p>
</div>
</div>
@@ -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>
@@ -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>
@@ -0,0 +1,261 @@
<!--
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>
</div>
<div class="index-right">
<div class="block" id="system">
<h2><span>System</span>
<small class="bar-desc">{{load_average[0]}} {{load_average[1]}} {{load_average[2]}}</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>
</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>
</div>
</div>
@@ -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}" ng-repeat="value in prop.values">{{value.value}}</dd>
</dl>
</li>
</ul>
</div>
@@ -0,0 +1,56 @@
<!--
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>
<ul class="tree jstree">
<li class="jstree-leaf level-{{logger.level.toLowerCase()}}" ng-class="{'jstree-last':$last}" ng-repeat="logger in logging" ng-include="'logger.html'"></li>
</ul>
</div>
</div>
</div>
<script type="text/ng-template" id="logger.html">
<ins class="trigger jstree-icon">&nbsp;</ins>
<a ng-click="toggleOptions(logger)" class="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-leaf level-{{logger.level.toLowerCase()}}" ng-class="{'jstree-last':$last}" ng-repeat="logger in logger.children" ng-include="'logger.html'"></li>
</ul>
</script>
@@ -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>
@@ -0,0 +1,96 @@
<!--
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">
<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://lucene.apache.org/solr/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="!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>
@@ -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>
@@ -0,0 +1,357 @@
<!--
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" 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="query.q" id="q" title="The query string.">*:*</textarea>
<label for="fq" title="Filter query.">
<a rel="help">fq</a>
</label>
<div class="multiple">
<div class="row clearfix" ng-repeat="filter in filters">
<input type="text" ng-model="filter.fq" id="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="query.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="query.start" id="start" placeholder="0" pattern="[0-9]+" title="Number of leading documents to skip. (Integer)">
<input type="text" name="rows" ng-model="query.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="query.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="query.df" name="df" id="df" value="" title="Default search field">
<label for="custom_parameters">
<a rel="help">Raw Query Parameters</a>
</label>
<input type="text" ng-model="rawParams" id="custom_parameters" value="" placeholder="key1=val1&amp;key2=val2">
<label for="wt" title="The writer type (response format).">
<a rel="help">wt</a>
</label>
<select name="wt" ng-model="query.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 off" class="checkbox" title="Do not indent results.">
<input type="checkbox" ng-model="query.indent" name="indent" id="indent" title="Do not indent results." ng-true-value="'off'" ng-false-value="''">
indent off
</label>
<label for="debugQuery" class="checkbox" title="Show timing and diagnostics.">
<input type="checkbox" ng-model="query.debugQuery" name="debugQuery" id="debugQuery" title="Show timing and diagnostics." ng-true-value="'on'" ng-false-value="''">
debugQuery
</label>
</div>
</fieldset>
<fieldset class="dismax optional">
<legend>
<label for="dismax" class="checkbox" title="Enable dismax.">
<input type="checkbox" ng-model="isDismax" name="defType" id="dismax" value="dismax">
dismax
</label>
</legend>
<div class="fieldset" ng-show="isDismax">
<label for="q_alt" title="Alternate query when 'q' is absent.">q.alt</label>
<input type="text" ng-model="dismax['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="dismax.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="dismax.mm" name="mm" id="mm" title="Min-should-match expression.">
<label for="pf" title="Phrase boosted fields.">pf</label>
<input type="text" ng-model="dismax.pf" name="pf" id="pf" title="Phrase boosted fields.">
<label for="ps" title="Phrase boost slop.">ps</label>
<input type="text" ng-model="dismax.ps" name="ps" id="ps" title="Phrase boost slop.">
<label for="qs" title="Query string phrase slop.">qs</label>
<input type="text" ng-model="dismax.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="dismax.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="dismax.bq" name="bq" id="bq" title="Boost query.">
<label for="bf" title="Boost function (added).">bf</label>
<input type="text" ng-model="dismax.bf" name="bf" id="bf" title="Boost function (added).">
</div>
</fieldset>
<fieldset class="edismax optional">
<legend>
<label for="edismax" class="checkbox" title="Enable edismax.">
<input type="checkbox" ng-model="isEdismax" name="defType" id="edismax" value="edismax">
<strong>e</strong>dismax
</label>
</legend>
<div class="fieldset" ng-show="isEdismax">
<label for="edismax_q_alt" title="Alternate query when 'q' is absent.">q.alt</label>
<input type="text" ng-model="edismax['q.alt']" name="q.alt" id="edismax_q_alt" title="Alternate query when 'q' is absent.">
<label for="edismax_qf" title="Query fields with optional boosts.">qf</label>
<input type="text" ng-model="edismax.qf" name="qf" id="edismax_qf" title="Query fields with optional boosts.">
<label for="edismax_mm" title="Min-should-match expression.">mm</label>
<input type="text" ng-model="edismax.mm" name="mm" id="edismax_mm" title="Min-should-match expression.">
<label for="edismax_pf" title="Phrase boosted fields.">pf</label>
<input type="text" ng-model="edismax.pf" name="pf" id="edismax_pf" title="Phrase boosted fields.">
<label for="edismax_ps" title="Phrase boost slop.">ps</label>
<input type="text" ng-model="edismax.ps" name="ps" id="edismax_ps" title="Phrase boost slop.">
<label for="edismax_qs" title="Query string phrase slop.">qs</label>
<input type="text" ng-model="edismax.qs" name="qs" id="edismax_qs" title="Query string phrase slop.">
<label for="edismax_tie" title="Score tie-breaker. Try 0.1.">tie</label>
<input type="text" ng-model="edismax.tie" name="tie" id="edismax_tie" title="Score tie-breaker. Try 0.1.">
<label for="edismax_bq" title="Boost query.">bq</label>
<input type="text" ng-model="edismax.bq" name="bq" id="edismax_bq" title="Boost query.">
<label for="edismax_bf" title="Boost function (added).">bf</label>
<input type="text" ng-model="edismax.bf" name="bf" id="edismax_bf" title="Boost function (added).">
<label for="edismax_uf" title="User Fields">uf</label>
<input type="text" ng-model="edismax.uf" name="uf" id="edismax_uf" title="User Fields">
<label for="edismax_pf2" title="bigram phrase boost fields">pf2</label>
<input type="text" ng-model="edismax.pf2" name="pf2" id="edismax_pf2" title="bigram phrase boost fields">
<label for="edismax_pf3" title="trigram phrase boost fields">pf3</label>
<input type="text" ng-model="edismax.pf3" name="pf3" id="edismax_pf3" title="trigram phrase boost fields">
<label for="edismax_ps2" title="phrase slop for bigram phrases">ps2</label>
<input type="text" ng-model="edismax.ps2" name="ps2" id="edismax_ps2" title="phrase slop for bigram phrases">
<label for="edismax_ps3" title="phrase slop for trigram phrases">ps3</label>
<input type="text" ng-model="edismax.ps3" name="ps3" id="edismax_ps3" title="phrase slop for trigram phrases">
<label for="edismax_boost" title="multiplicative boost function">boost</label>
<input type="text" ng-model="edismax.boost" name="boost" id="edismax_boost" title="multiplicative boost function">
<label for="edismax_stopwords" class="checkbox" title="remove stopwords from mandatory 'matching' component">
<input type="checkbox" ng-model="edismax.stopwords" name="stopwords" id="edismax_stopwords">
stopwords
</label>
<label for="edismax_lowercaseOperators" class="checkbox" title="Enable lower-case 'and' and 'or' as operators">
<input type="checkbox" ng-model="edismax.lowercaseOperators" name="lowercaseOperators" id="edismax_lowercaseOperators">
lowercaseOperators
</label>
</div>
</fieldset>
<fieldset class="hl optional">
<legend>
<label for="hl" class="checkbox" title="Enable highlighting.">
<input type="checkbox" ng-model="isHighlight" name="hl" id="hl" value="true">
hl
</label>
</legend>
<div class="fieldset" ng-show="isHighlight">
<label for="hl_fl" title="Fields to highlight on.">hl.fl</label>
<input type="text" ng-model="hl['hl.fl']" name="hl.fl" id="hl_fl" value="" title="Fields to highlight on.">
<label for="hl_simple_pre">hl.simple.pre</label>
<input type="text" ng-model="hl['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="hl['hl.simple.post']" name="hl.simple.post" id="hl_simple_post" value="</em>">
<label for="hl_requireFieldMatch" class="checkbox">
<input type="checkbox" ng-model="hl['hl.requireFieldMatch']" name="hl.requireFieldMatch" id="hl_requireFieldMatch" value="true">
hl.requireFieldMatch
</label>
<label for="hl_usePhraseHighlighter" class="checkbox">
<input type="checkbox" ng-model="hl['usePhraseHighLighter']" name="hl.usePhraseHighlighter" id="hl_usePhraseHighlighter" value="true">
hl.usePhraseHighlighter
</label>
<label for="hl_highlightMultiTerm" class="checkbox">
<input type="checkbox" ng-model="hl['hightlightMultiTerm']" name="hl.highlightMultiTerm" id="hl_highlightMultiTerm" value="true">
hl.highlightMultiTerm
</label>
</div>
</fieldset>
<fieldset class="facet optional">
<legend>
<label for="facet" class="checkbox" title="Enable faceting.">
<input type="checkbox" ng-model="isFacet" name="facet" id="facet">
facet
</label>
</legend>
<div class="fieldset" ng-show="isFacet">
<label for="facet_query">facet.query</label>
<textarea ng-model="facet['facet.query']" name="facet.query" id="facet_query"></textarea>
<label for="facet_field">facet.field</label>
<input type="text" ng-model="facet['facet.field']" name="facet.field" id="facet_field">
<label for="facet_prefix">facet.prefix</label>
<input type="text" ng-model="facet['facet.prefix']" name="facet.prefix" id="facet_prefix">
</div>
</fieldset>
<fieldset class="spatial optional">
<legend>
<label for="spatial" class="checkbox" title="Show spatial options">
<input type="checkbox" ng-model="isSpatial" name="spatial" id="spatial">
spatial
</label>
</legend>
<div class="fieldset" ng-show="isSpatial">
<label for="pt">pt</label>
<input type="text" ng-model="spatial.pt" name="pt" id="pt">
<label for="sfield">sfield</label>
<input type="text" ng-model="spatial.sfield" name="sfield" id="sfield">
<label for="d">d</label>
<input type="text" ng-model="spatial.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="isSpellcheck" name="spellcheck" id="spellcheck">
spellcheck
</label>
</legend>
<div class="fieldset" ng-show="isSpellcheck">
<label for="spellcheck_build" class="checkbox">
<input type="checkbox" ng-model="spellcheck['spellcheck.build']" name="spellcheck.build" id="spellcheck_build" value="true">
spellcheck.build
</label>
<label for="spellcheck_reload" class="checkbox">
<input type="checkbox" ng-model="spellcheck['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="spellcheck['spellcheck.q']" name="spellcheck.q" id="spellcheck_q">
<label for="spellcheck_dictionary">spellcheck.dictionary</label>
<input type="text" ng-model="spellcheck['spellcheck.dictionary']" name="spellcheck.dictionary" id="spellcheck_dictionary">
<label for="spellcheck_count">spellcheck.count</label>
<input type="text" ng-model="spellcheck['spellcheck.count']" name="spellcheck.count" id="spellcheck_count">
<label for="spellcheck_onlyMorePopular" class="checkbox">
<input type="checkbox" ng-model="spellcheck['spellcheck.onlyMorePopular']" name="spellcheck.onlyMorePopular" id="spellcheck_onlyMorePopular" value="true">
spellcheck.onlyMorePopular
</label>
<label for="spellcheck_extendedResults" class="checkbox">
<input type="checkbox" ng-model="spellcheck['spellcheck.extendedResults']" name="spellcheck.extendedResults" id="spellcheck_extendedResults" value="true">
spellcheck.extendedResults
</label>
<label for="spellcheck_collate" class="checkbox">
<input type="checkbox" ng-model="spellcheck['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="spellcheck['spellcheck.maxCollations']" name="spellcheck.maxCollations" id="spellcheck_maxCollations">
<label for="spellcheck_maxCollationTries">spellcheck.maxCollationTries</label>
<input type="text" ng-model="spellcheck['spellcheck.maxCollationTries']" name="spellcheck.maxCollationTries" id="spellcheck_maxCollationTries">
<label for="spellcheck_accuracy">spellcheck.accuracy</label>
<input type="text" ng-model="spellcheck['spellcheck.accuracy']" name="spellcheck.accuracy" id="spellcheck_accuracy">
</div>
</fieldset>
<button type="submit" ng-click="doQuery()">Execute Query</button>
</form>
</div>
<div id="result">
<a ng-show="response.data" id="url" class="address-bar" ng-href="{{url}}">{{hostPortContext}}{{url}}</a>
<div id="response">
<pre class="syntax language-{{lang}}"><code ng-bind-html="response.data | highlight:lang | unsafe"></code></pre>
</div>
</div>
</div>
@@ -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>5.1 MB</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="slaveOnly block clearfix" ng-show="isSlave">
<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="masterSearch">
<th>Master (Searching)</th>
<td class="version" ng-class="{diff:versions.changedVersion}">
<div>{{versions.masterSearch.version}}</div>
</td>
<td class="generation" ng-class="{diff:versions.changedGeneration}">
<div>{{versions.masterSearch.generation}}</div>
</td>
<td class="size">
<div>{{versions.masterSearch.size}}</div>
</td>
</tr>
<tr class="master">
<th>Master (Replicable)</th>
<td class="version" ng-class="{diff:versions.changedVersion}">
<div>{{versions.master.version}}</div>
</td>
<td class="generation" ng-class="{diff:versions.changedGeneration}">
<div>{{versions.master.generation}}</div>
</td>
<td class="size">
<div>{{versions.master.size}}</div>
</td>
</tr>
<tr class="slave slaveOnly" ng-show="isSlave">
<th>Slave (Searching)</th>
<td class="version" ng-class="{diff:versions.changedVersion}">
<div>{{versions.slave.version}}</div>
</td>
<td class="generation" ng-class="{diff:versions.changedGeneration}">
<div>{{versions.slave.generation}}</div>
</td>
<td class="size">
<div>{{versions.slave.size}}</div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="settings" class="settings block clearfix slaveOnly" ng-show="isSlave">
<div class="label"><span>Settings:</span></div>
<ul>
<li class="masterUrl" ng-show="settings.masterUrl">
<dl class="clearfix">
<dt>master url:</dt>
<dd>{{settings.masterUrl}}</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="master-settings" class="settings block clearfix">
<div class="label"><span>Settings (Master):</span></div>
<ul>
<li class="replicationEnabled"><dl class="clearfix">
<dt>replication enable:</dt>
<dd class="ico" ng-class="{'ico-0':!master.replicationEnabled, 'ico-1':master.replicationEnabled}">&nbsp;</dd>
</dl></li>
<li class="replicateAfter"><dl class="clearfix">
<dt>replicateAfter:</dt>
<dd>{{master.replicateAfter}}</dd>
</dl></li>
<li class="confFiles" ng-show="master.files"><dl class="clearfix">
<dt>confFiles:</dt>
<dd><span ng-repeat="file in master.files"><attr title="{{file.title}}">{{file.name}}</attr>{{ $last ? '' :', '}}</span></dd>
</dl></li>
</ul>
</div>
</div>
<div id="navigation">
<div class="timer" ng-show="isSlave && !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="slaveOnly" ng-show="isSlave">
<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="masterOnly" ng-show="!isSlave">
<button class="optional disable-replication warn" ng-click="execute('disablereplication')" ng-show="master.replicationEnabled"><span>Disable Replication</span></button>
<button class="optional enable-replication warn" ng-click="execute('enablereplication')" ng-show="!master.replicationEnabled"><span>Enable Replication</span></button>
</div>
</div>
</div>
@@ -0,0 +1,455 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<div id="schema" class="loaded">
<div class="clearfix">
<div id="frame">
<div id="actions" class="actions clearfix" ng-show="isSchemaUpdatable">
<button id="addField" class="action" ng-click="toggleAddField()"><span>Add Field</span></button>
<button id="addDynamicField" class="action" ng-click="toggleAddDynamicField()"><span>Add Dynamic Field</span></button>
<button id="addCopyField" class="action" ng-click="toggleAddCopyField()"><span>Add Copy Field</span></button>
<div class="action add" data-rel="add" ng-show="showAddField" escape-pressed="hideAll()">
<p class="clearfix"><label for="add_name">name:</label>
<input type="text" id="add_name" ng-model="newField.name" focus-when="showAddField" placeholder="enter a field name"></p>
<p class="clearfix"><label for="add_type">field type:</label>
<select chosen type="text" id="add_type" ng-model="newField.type" ng-options="type for type in types"></select>
</p>
<p class="clearfix" ng-show="adding=='field'"><label for="add_default">default:</label>
<input type="text" id="add_default" ng-model="newField.default" placeholder="enter a default value if needed"></p>
<p class="clearfix">
<label class="checkbox" for="add_stored">
<input type="checkbox" ng-model="newField.stored" id="add_stored" title="Full field should be stored in index." ng-true-value="'true'" ng-false-value="'false'">
stored
</label>
</p>
<p class="clearfix">
<label class="checkbox" for="add_indexed">
<input type="checkbox" ng-model="newField.indexed" id="add_indexed" title="Field should be indexed." ng-true-value="'true'" ng-false-value="'false'">
indexed
</label>
</p>
<p class="clearfix">
<label class="checkbox" for="add_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>
<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 {{dynamicFields}} / {{dynamicFields.length()}}</dt>
<dd class="dynamic-field" ng-class="{active: selectedType=='Dynamic Field'}" ng-repeat="field in leftbar.dynamicFields"><a href="#/{{core}}/schema?dynamic-field={{field}}">{{field}}</a></dd>
<dt class="type" ng-class="{active: selectedType=='Type'}" ng-show="leftbar.types">Type</dt>
<dd class="type" ng-class="{active: selectedType=='Type'}" ng-repeat="type in leftbar.types"><a href="#/{{core}}/schema?type={{type}}">{{type}}</a></dd>
<dt></dt>
<dd class="active delete-field" ng-show="isSchemaUpdatable &amp;&amp; leftbar.fields &amp;&amp;!showDelete"><button ng-click="toggleDelete()"><span>delete field</span></button></dd>
<dd class="active delete-field" ng-show="isSchemaUpdatable &amp;&amp; leftbar.dynamicFields &amp;&amp;!showDelete"><button ng-click="toggleDelete()"><span>delete dynamic field</span></button></dd>
<div class="action delete" ng-show="showDelete">
<form class="delete">
<p class="clearfix"><em>Are you sure you want to delete this {{selectedType}}?</em></p>
<div ng-repeat="error in deleteErrors" ng-show="deleteErrors" class="clearfix note error">
<span>{{error}}</span></div>
<p class="clearfix buttons">
<button class="submit" ng-class="{success: deleted}" ng-click="delete()"><span>Delete</span></button>
<button type="reset" class="reset" ng-click="toggleDelete()"><span>Cancel</span></button>
</p>
</form>
</div>
</dl>
<dl class="ukf-dsf">
<dt class="unique-key-field" ng-class="{active: isUniqueKeyField}" ng-show="uniqueKeyField">Unique Key Field</dt>
<dd class="unique-key-field" ng-class="{active: isUniqueKeyField}"><a ng-href="#/{{core}}/schema?field={{uniqueKeyField}}">{{uniqueKeyField}}</a></dd>
<dt class="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>
@@ -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>
@@ -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>
@@ -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>