<!--
/**
 * 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.
 */
-->
<form name="datasourceForm" novalidate id="datasourceFormGeneralStep">
	<div class="col-xs-24"><label>Access Control List</label></div>
	<div class="col-xs-24 plr0px">
		<div class="col-xs-8">
			<label class="light">Owner<mandatory-field></mandatory-field></label>
			<input type="text" class="form-control" validation-message="{{validations.messages.acl.owner}}"
						 ng-required="true"
						 ng-pattern="validations.patterns.unixId"
						 ng-model="datasource.ACL.owner"/>
		</div>
		<div class="col-xs-8">
			<label class="light">Group<mandatory-field></mandatory-field></label>
			<input type="text" class="form-control" validation-message="{{validations.messages.acl.group}}"
						 ng-required="true"
						 ng-pattern="validations.patterns.unixId"
						 ng-model="datasource.ACL.group"/>
		</div>
		<div class="col-xs-24">
			<div class="col-xs-8 plr0px">
				<label class="light">Permissions<mandatory-field></mandatory-field></label>
				<acl-permissions acl-model="datasource.ACL.permission"></acl-permissions>
			</div>
		</div>
		</div>

		<div class="col-xs-24">
			<div class="pull-right">
				<button id="datasource.step2" class="btn btn-datasource"
		         ng-disabled="buttonSpinners.validateShow"
		         ng-click="validate()">
		      Test <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.validateShow" />
		    </button>
			</div>
	  </div>

  <div class="col-xs-24 pb15px mt35">
		<button id="datasource.backToStep1" class="btn prevBtn" type="button" ng-click="goBack()" ng-disabled="buttonSpinners.backShow">
			PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow">
		</button>
		<div class="pull-right">
	    <a class="btn cnclBtn" ui-sref="main">
	      CANCEL
	    </a>
	    <button id="datasource.step1" class="btn nextBtn"
	         ng-disabled="buttonSpinners.show"
	         ng-click="goNext(datasourceForm.$invalid)"
					 scroll-to-error>
	      NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
	    </button>
		</div>
  </div>

</form>
