<!--
/**
 * 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="col-xs-24" ng-show="partitionList.length > 0">
  <input type="checkbox" ng-model="selectPartition" />
  <label class="light">Partition</label>
  <div class="typeButtonsBox mt5" ng-show="selectPartition">
    <div ng-repeat="partition in partitionList">
      <div class="col-xs-16 panel panel-default mb5">
        <div class="partition-panel-body">
          <div class="col-xs-4 mt5">
            {{partition.partitionName}}
          </div>
          <div class="col-xs-12 form-inline">
            <input type="radio" ng-model="partition.mapping" value="mappedPartition"
              ng-change="preparePartitionExpression(partitionList)" />
            <input type="text" class="form-control" ng-model="partition.partitionText"
              ng-change="preparePartitionExpression(partitionList)"
              ng-disabled="partition.mapping!='mappedPartition'" />
            <input type="radio" ng-model="partition.mapping" value="any"
              ng-change="preparePartitionExpression(partitionList)" />
            Any
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
