<!--
/**
 * 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 class="container" id="entityDetails">

  <div class="row pt15px">
    <div class="col-sm-24 detailsHeaders pl0px">
	<button class="btn" title="Back to search" ui-sref="main">< </button>
		<span class="entityName">{{entity.name}}</span>
        <span ng-class="{'blink-success': entity.status == 'RUNNING',
                     'text-success': entity.status == 'SUCCEEDED',
                     'blink-warning': entity.status == 'SUSPENDED',
                     'blink-danger': entity.status == 'UNKNOWN'}"  ng-if="entity.type != 'cluster'">
                     {{entity.status}}</span>
    <br><br>
    <div class="pull-left">
      <table>
        <tbody>
          <tr>
            <td class="buttonCell" colspan="9">
          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scheduleEntity()" ng-if="entity.type != 'cluster' && entity.status == 'SUBMITTED'">
            <span class="entypo play"></span> <div>Schedule</div>
          </div>
          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="resumeEntity()" ng-if="entity.type != 'cluster' && entity.status == 'SUSPENDED'">
            <span class="entypo play"></span> <div>Resume</div>
          </div>
          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="suspendEntity()" ng-if="entity.type != 'cluster' && entity.status == 'RUNNING'">
            <span class="entypo paus"></span> <div>Pause</div>
          </div>
          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="editEntity()"
            ng-disabled="entity.type === 'cluster' && (!isSafeMode() || !isSuperUser())"
            ng-class="{disabledEditBtn: entity.type === 'cluster' && (!isSafeMode() || !isSuperUser())}"
            title="{{(entity.type === 'cluster' && !isSafeMode() || (!isSuperUser())) ? 'Cluster entity update can only be performed by superuser during safemode' : ''}}">
            <span class="entypo cog"></span> <div>Edit</div>
          </div>
          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="cloneEntity()"  ng-if="entity.type != 'cluster'">
            <span class="entypo docs"></span> <div>Copy</div>
          </div>
          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="deleteEntity()">
            <span class="entypo trash"></span> <div>Delete</div>
          </div>
          <div class="btn btn-gray btn-xs buttons-to-show" ng-click="downloadEntity()">
            <span class="entypo down"></span> <div>XML</div>
          </div>
        </td>
      </tr>
      </tbody>
      </table>

    </div>
    </div>
  </div>
<!--*
	<h3 class="link-icons entity-title entity-link-null" id="entity-title">
		{{entity.name}} <button type="button" class="detailsBT">
		<span ng-class="displayIcon((entity.type | uppercase), entity.model)"></span> {{entityTypeLabel}}
	</button>
	</h3>-->

	<div class="row pt15px" ng-if="entity.type != 'cluster'">
		<div class="col-sm-24 pl0px">
			<div class="entityDetailsBox">
			<div class="dependencies-graph"><dependencies-graph name="entity.name" type="entity.type"/></div>
			</div>
		</div>
	</div>

	<div class="row pt15px">
		<div class="col-sm-16 entityDetailsBox p10px" ng-if="entity.type != 'cluster'">
			<div>
				<h4>
					INSTANCES
				</h4>
				<instances-list input="instancesList" type="entity.type" name="entity.name" instance-details="instanceDetails"
												pages="pages" go-page="goPage" next-pages="nextPages" prev-pages="prevPages" change-pages-set="changePagesSet"
												start="entity.start" end="entity.end"/>
			</div>
		</div>
		<div ng-class="{'col-sm-8': entity.type !== 'cluster', 'col-sm-24': entity.type === 'cluster'}">
			<div class="summaryBox" ng-init="propsOpen = entity.type === 'cluster'">
				<div class="row">
					<div class="col-sm-21">
						<h4>
							PROPERTIES
						</h4>
					</div>
					<div class="col-sm-3">
						<h4 ng-hide="entity.type === 'cluster'" class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-chevron-up':'glyphicon-chevron-down'"></h4>
					</div>
				</div>
        <div ng-show="propsOpen" class="animate-show">
					<div ng-if="entity.type == 'feed'" ui-view="feedSummary"></div>
          <div ng-if="entity.type == 'cluster'" ui-view="clusterSummary"></div>
          <div ng-if="entity.type == 'process' && entityTypeLabel == 'Process'" ui-view="processSummary"></div>
          <div ng-if="entity.type == 'process' && entityTypeLabel == 'Snapshot'" ui-view="snapshotSummary"></div>
          <div ng-if="entity.type == 'process' && (entityTypeLabel == 'HDFS Mirror' || entityTypeLabel == 'Hive Mirror')"
            ui-view="datasetSummary"></div>
				</div>
			</div>
		</div>
	</div>

</div>
