http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormClustersStepTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/feed/feedFormClustersStepTpl.html b/falcon-ui/app/html/feed/feedFormClustersStepTpl.html index 8d2322f..b33b7f3 100644 --- a/falcon-ui/app/html/feed/feedFormClustersStepTpl.html +++ b/falcon-ui/app/html/feed/feedFormClustersStepTpl.html @@ -17,37 +17,41 @@ * limitations under the License. */ --> -<form name="feedForm"> +<form name="feedForm" novalidate id="feedFormClusterStep"> + <button class="hidden" ng-click="goNext(feedForm.$invalid, 'forms.feed.summary')" ></button> <div ng-repeat="cluster in feed.clusters"> <div class="row"> - <h4 class="col-sm-24">{{capitalize(cluster.type)}} Cluster </h4> + <h4 class="col-xs-24">{{capitalize(cluster.type)}} Cluster </h4> </div> <div class="row detailsBox"> - <div class="col-sm-offset-1 col-sm-22"> + <div class="col-xs-offset-1 col-xs-22"> <div class="row"> <div class="col-xs-24"> <select ng-model="cluster.name" validation-message="{{validations.messages.cluster}}" - ng-required="true" class="col-sm-24 form-control padding0"> + ng-required="true" class="col-xs-24 form-control padding0" id="clusterNameSelect"> <option value="" disabled selected style='display:none;'>-Select cluster-</option> - <option ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option> + <option id="cluster_" ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option> </select> </div> - + <div class="col-xs-24 feedLocationNavBox nopointer"> <h4 class="col-xs-7" ng-show="!feed.storage.fileSystem.active">Default Storage type</h4> <h4 class="col-xs-7" ng-show="feed.storage.fileSystem.active">Storage type</h4> - <div class="col-xs-17 feedLocationNav"> - <div class="btn btn-default pull-right" ng-class="{active: feed.storage.catalog.active}"> + <div class="col-xs-17 feedLocationNav disabled"> + <button class="btn btn-default pull-right" + ng-class="{active: feed.storage.catalog.active}" + ng-disabled="true"> Catalog Storage - </div> - <div class="btn btn-default pull-right" ng-class="{active: feed.storage.fileSystem.active}"> + </button> + <button class="btn btn-default pull-right" + ng-class="{active: feed.storage.fileSystem.active}" + ng-disabled="true"> File System - </div> - <div class="clearfix"></div> + </button> </div> </div> @@ -60,51 +64,85 @@ ng-show="feed.storage.fileSystem.active" ng-repeat="location in cluster.storage.fileSystem.locations"> <label class="light">{{location.type}} path</label> - <input type="text" class="form-control" ng-model="location.path" ng-pattern="validations.patterns.osPath" /> + <input type="text" + placeholder="{{clusterLocationsPlaceHolders[location.type]}}" + class="form-control" + ng-model="location.path" + validation-optional-message="{{validations.messages.path}}" + ng-pattern="validations.patterns.osPath" /> </div> <div class="col-xs-24 mb10" ng-show="feed.storage.catalog.active"> <label class="light">Table uri</label> - <input type="text" class="form-control" ng-model="cluster.storage.catalog.catalogTable.uri" ng-pattern="validations.patterns.osPath"/> + <input type="text" class="form-control" + ng-model="cluster.storage.catalog.catalogTable.uri" + validation-optional-message="{{validations.messages.path}}" + ng-pattern="validations.patterns.osPath"/> </div> - + <div class="clearfix mb20"></div> <label class="col-xs-24"> Validity </label> - - <div class="col-xs-12"> - - <label class="light col-xs-24">Start</label> - - <div class="input-group input-group-xs"> - <span class="input-group-addon btn btn-default entypo calendar" ng-click="openDatePicker($event, cluster.validity.start)"></span> - <input type="text" class="form-control" placeholder="Select start Date" - datepicker-popup="{{dateFormat}}" - ng-model="cluster.validity.start.date" - is-open="cluster.validity.start.opened" - ng-required="true"> - </div> - - </div> - <div class="col-xs-12"> - <timepicker class="timePicker" ng-model="cluster.validity.start.time" hour-step="1" minute-step="1" ></timepicker> - </div> - <div class="col-xs-12"> - - <label class="light col-xs-24">End</label> - - <div class="input-group input-group-xs"> - <span class="input-group-addon btn btn-default entypo calendar" ng-click="openDatePicker($event, cluster.validity.end)"></span> - <input type="text" class="form-control" placeholder="Select end Date" - datepicker-popup="{{dateFormat}}" - ng-model="cluster.validity.end.date" - is-open="cluster.validity.end.opened" - ng-required="true"> + <div class="col-xs-24 validityBox"> + <div class="startDateBox"> + <label>Start + <input type="text" + name="startDateInput" + class="form-control dateInput" + placeholder="mm/dd/yyyy" + datepicker-popup="{{dateFormat}}" + ng-model="cluster.validity.start.date" + is-open="cluster.validity.start.opened" + ng-click="openDatePicker($event, cluster.validity.start)" + ng-change="constructDate()" + ng-required="true" + simple-date> + </label> + <label class="col-xs-24 custom-danger validationMessageGral" + ng-if="!cluster.validity.start.date"> + {{validations.messages.date.empty}} + </label> + </div> + <div class="startTimeBox"> + <label>Time + <timepicker ng-change="constructDate()" + ng-model="cluster.validity.start.time" + hour-step="1" + minute-step="1" + show-meridian="true"> + </timepicker> + </label> + </div> + <div class="endDateBox"> + <label>End + <input type="text" + name="startDateInput" + class="form-control dateInput" + placeholder="mm/dd/yyyy" + datepicker-popup="{{dateFormat}}" + ng-model="cluster.validity.end.date" + is-open="cluster.validity.end.opened" + ng-click="openDatePicker($event, cluster.validity.end)" + ng-change="constructDate()" + ng-required="true" + min-date="cluster.validity.start.date" + simple-date> + </label> + <label class="col-xs-24 custom-danger validationMessageGral" + ng-if="!cluster.validity.end.date"> + {{validations.messages.date.empty}} + </label> + </div> + <div class="endTimeBox"> + <label>Time + <timepicker ng-change="constructDate()" + ng-model="cluster.validity.end.time" + hour-step="1" + minute-step="1" + show-meridian="true"> + </timepicker> + </label> </div> - </div> - <div class="col-xs-12"> - <timepicker class="timePicker" ng-model="cluster.validity.end.time" hour-step="1" minute-step="1" ></timepicker> </div> - <label class="light col-xs-24"> Retention </label> <div class="col-xs-24 inlineInputsGroup"> @@ -122,31 +160,37 @@ </div> <div class="row" ng-if="cluster.type !== 'source'"> - <div class="btn btn-default pull-right btn-xs" ng-click="removeCluster($index)"> - - delete - </div> + <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeCluster($index)"> + <span class="entypo minus"></span> delete + </button> </div> + </div> </div> </div> </div> - - <div class="btn btn-default btn-xs" ng-click="addCluster()"> - + add cluster + <div class="col-xs-24 mt10"> + <button type="button" class="btn btn-default btn-xs" ng-click="addCluster()"> + <span class="entypo plus"></span> add cluster + </button> </div> - <div class="col-xs-24"> - <div class="row feedBottomButtons"> - <div class="btn btn-default col-xs-6" ng-click="goBack('forms.feed.location')" > - Previous - </div> - <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.summary')" > - Next - </div> - <u class="col-xs-3 pull-right" ui-sref="main"> - Cancel - </u> - </div> + + <div class="col-xs-24 mt20"> + <button id="feed.backToStep3" + class="btn prevBtn" + type="button" + ng-click="goBack('forms.feed.location')" + ng-disabled="buttonSpinners.backShow" > + Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" /> + </button> + <button id="feed.step4" class="btn nextBtn pull-right" + ng-click="goNext(feedForm.$invalid, 'forms.feed.summary')" > + Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" /> + </button> + <a class="pull-right" ui-sref="main"> + Cancel + </a> </div> </form> \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html b/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html index 3e2ecb9..2a4f5c4 100644 --- a/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html +++ b/falcon-ui/app/html/feed/feedFormGeneralStepTpl.html @@ -17,80 +17,83 @@ * limitations under the License. */ --> -<form name="feedForm"> +<form name="feedForm" novalidate id="feedFormGeneralStep"> - - <div class="col-sm-24"> + <div class="col-xs-24"> <label class="light">Name</label> <input type="text" class="form-control" ng-disabled="!cloningMode" ng-keydown="validations.acceptNoSpaces($event)" check-name="{type:'feed', check:cloningMode}" ng-class="{fakeInvalid:!validations.nameAvailable}" ng-model="feed.name" ng-required="true" ng-pattern="validations.patterns.name"/> </div> - <div class="col-sm-24"> + <div class="col-xs-24"> <label class="light">Description</label> - <input type="text" class="form-control" + <input type="text" class="form-control" validation-optional-message="{{validations.messages.description}}" ng-model="feed.description" ng-pattern="validations.patterns.freeText"/> </div> - <div class="col-sm-24"> + <div class="col-xs-24"> <label class="light">Tags</label> </div> - <div class="col-sm-24"> + <div class="col-xs-24"> <div ng-repeat="tag in feed.tags"> <div class="row dynamic-table-spacer"> <div class="col-xs-10"> <input type="text" class="form-control" ng-model="tag.key" + validation-optional-message="{{validations.messages.key}}" ng-pattern="validations.patterns.alpha" ng-required="tag.value" placeholder="key"/> </div> <div class="col-xs-11"> - <input type="text" class="form-control" + <input type="text" class="form-control" validation-optional-message="{{validations.messages.value}}" ng-model="tag.value" ng-pattern="validations.patterns.alpha" ng-required="tag.key" placeholder="value"/> </div> <div class="col-xs-3"> - <div class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="$index>0"> + <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="$index>0"> <span class="entypo minus"></span> delete - </div> + </button> </div> </div> </div> </div> - <div class="col-sm-24 dynamic-table-spacer"> - <div class="btn btn-default btn-xs" ng-click="addTag()"> + <div class="col-xs-24 dynamic-table-spacer"> + <button type="button" class="btn btn-default btn-xs" ng-click="addTag()"> <span class="entypo plus"></span> add tag - </div> + </button> </div> - <div class="col-sm-24"> + <div class="col-xs-24"> <label class="light">Groups (comma separated)</label> - <input type="text" class="form-control" + <input type="text" class="form-control" validation-optional-message="{{validations.messages.acl.group}}" ng-pattern="validations.patterns.commaSeparated" ng-model="feed.groups"/> </div> - <h4 class="col-sm-24"> Access Control List </h4> - <div class="col-sm-8"> + <div class="col-xs-24"><h4 class="tittle-in-row">Access Control List</h4></div> + <div class="col-xs-8"> <label class="light">Owner</label> - <input type="text" class="form-control" - ng-pattern="validations.patterns.unixId" - ng-model="feed.ACL.owner"/> + <input type="text" class="form-control" validation-message="{{validations.messages.acl.owner}}" + ng-required="true" + ng-pattern="validations.patterns.unixId" + ng-model="feed.ACL.owner"/> </div> - <div class="col-sm-8"> + <div class="col-xs-8"> <label class="light">Group</label> - <input type="text" class="form-control" - ng-pattern="validations.patterns.unixId" - ng-model="feed.ACL.group"/> + <input type="text" class="form-control" validation-message="{{validations.messages.acl.group}}" + ng-required="true" + ng-pattern="validations.patterns.unixId" + ng-model="feed.ACL.group"/> </div> - <div class="col-sm-8"> + <div class="col-xs-8"> <label class="light">Permissions</label> - <input type="text" class="form-control" - ng-pattern="validations.patterns.unixPermissions" - ng-model="feed.ACL.permission"/> + <input type="text" class="form-control" validation-message="{{validations.messages.acl.permission}}" + ng-required="true" + ng-pattern="validations.patterns.unixPermissions" + ng-model="feed.ACL.permission"/> </div> - <h4 class="col-sm-24">Schema</h4> - <div class="col-sm-12"> + <div class="col-xs-24"><h4 class="tittle-in-row">Schema</h4></div> + <div class="col-xs-12"> <label class="light">Location</label> <input type="text" class="form-control" validation-message="{{validations.messages.location}}" ng-maxlength="200" @@ -98,24 +101,24 @@ ng-model="feed.schema.location" ng-required="true"/> </div> - <div class="col-sm-12"> + <div class="col-xs-12"> <label class="light">Provider</label> <input type="text" class="form-control" validation-message="{{validations.messages.provider}}" ng-pattern="validations.patterns.osPath" ng-model="feed.schema.provider" ng-required="true"/> </div> - - <div class="col-xs-24"> - <div class="feedBottomButtons row"> - <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.properties')"> - Next - </div> - <u class="col-xs-3 pull-right" ng-click="cancel()" ui-sref="main"> - Cancel - </u> - </div> + + <div class="col-xs-24 mt20"> + <button id="feed.step1" class="btn nextBtn col-xs-6 pull-right" + ng-disabled="buttonSpinners.show" + ng-click="goNext(feedForm.$invalid, 'forms.feed.properties')"> + Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" /> + </button> + <a class="pull-right" ui-sref="main"> + Cancel + </a> </div> </form> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormLocationStepTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/feed/feedFormLocationStepTpl.html b/falcon-ui/app/html/feed/feedFormLocationStepTpl.html index 7e5b6c0..7c7355e 100644 --- a/falcon-ui/app/html/feed/feedFormLocationStepTpl.html +++ b/falcon-ui/app/html/feed/feedFormLocationStepTpl.html @@ -17,89 +17,97 @@ * limitations under the License. */ --> -<form name="feedForm"> - <div class="col-xs-24"> - <div class="row"> - <div class="col-xs-24 feedLocationNavBox"> - <h4 class="col-xs-10" ng-show="feed.storage.fileSystem.active">Default Storage type </h4> - <h4 class="col-xs-10" ng-show="feed.storage.catalog.active"> Storage type </h4> +<form name="feedForm" novalidate id="feedFormLocationStep"> + <div class="col-xs-24 locationStep"> + <div class="row"> + <div class="col-xs-24 feedLocationNavBox"> + <h4 class="col-xs-10" ng-show="feed.storage.fileSystem.active">Default Storage type </h4> + <h4 class="col-xs-10" ng-show="feed.storage.catalog.active"> Storage type </h4> + + <div class="col-xs-14 feedLocationNav"> + <button type="button" + class="btn btn-default pull-right" + ng-class="{active: feed.storage.catalog.active}" + ng-click="toggleStorage()"> + Catalog Storage + </button> + <button type="button" + class="btn btn-default pull-right" + ng-class="{active: feed.storage.fileSystem.active}" + ng-click="toggleStorage()"> + File System + </button> - <div class="col-xs-14 feedLocationNav"> - <div class="btn btn-default pull-right" - ng-class="{active: feed.storage.catalog.active}" - ng-click="toggleStorage()"> - Catalog Storage </div> - <div class="btn btn-default pull-right" - ng-class="{active: feed.storage.fileSystem.active}" - ng-click="toggleStorage()"> - File System + <div class="clearfix"></div> + </div> + <h4 class="col-xs-12">Default Location</h4> + <div class="col-xs-24"> + <div ng-show="feed.storage.fileSystem.active" + ng-repeat="location in feed.storage.fileSystem.locations" class="row"> + + <div class="col-xs-8"> + <label class="light">{{capitalize(location.type)}} path</label> + </div> + <div class="pull-right" ng-show="location.focused"> + <label class="light">add</label> + <label ng-repeat="timeVariable in ['${YEAR}', '${MONTH}', '${DAY} ', '${HOUR}']" + ng-click="appendVariable(timeVariable, location, 'path')"> + {{timeVariable}} + </label> + </div> + <div class="clearfix hidden-md"></div> + <div class="col-xs-24"> + <input type="text" class="form-control" validation-message="{{validations.messages.path}}" + ng-required="true" + ng-model="location.path" + ng-pattern="validations.patterns.osPath" + ng-class="{firstInput: $index === 0}" + ng-focus="location.focused = true"/> + </div> </div> - </div> - <div class="clearfix"></div> - </div> - <h4 class="col-xs-12">Default Location</h4> - <div class="col-xs-24"> - <div ng-show="feed.storage.fileSystem.active" - ng-repeat="location in feed.storage.fileSystem.locations" class="row"> - + + + <div ng-show="feed.storage.catalog.active"> <div class="col-xs-8"> - <label class="light">{{capitalize(location.type)}} path</label> + <label class="light">Table uri</label> </div> - <div class="pull-right" ng-show="location.focused"> + + <div class="pull-right" ng-show="feed.storage.catalog.catalogTable.focused"> <label class="light">add</label> <label ng-repeat="timeVariable in ['${YEAR}', '${MONTH}', '${DAY} ', '${HOUR}']" - ng-click="appendVariable(timeVariable, location, 'path')"> + ng-click="appendVariable(timeVariable, feed.storage.catalog.catalogTable, 'uri')"> {{timeVariable}} </label> </div> - <div class="clearfix hidden-md"></div> + <div class="col-xs-24"> - <input type="text" class="form-control" validation-message="{{validations.messages.path}}" - ng-required="true" - ng-model="location.path" - ng-pattern="validations.patterns.osPath" - ng-focus="location.focused = true"/> + <input type="text" class="form-control catalogStorageInput" custom-autofocus + ng-model="feed.storage.catalog.catalogTable.uri" + ng-pattern="validations.patterns.tableUri" + ng-required="feed.storage.catalog.active" validation-message="{{validations.messages.path}}" + ng-focus="feed.storage.catalog.catalogTable.focused = true"/> </div> - </div> - </div> - - - <div ng-show="feed.storage.catalog.active"> - <div class="col-xs-8"> - <label class="light">Table uri</label> - </div> - - <div class="pull-right" ng-show="feed.storage.catalog.catalogTable.focused"> - <label class="light">add</label> - <label ng-repeat="timeVariable in ['${YEAR}', '${MONTH}', '${DAY} ', '${HOUR}']" - ng-click="appendVariable(timeVariable, feed.storage.catalog.catalogTable, 'uri')"> - {{timeVariable}} - </label> - </div> - <div class="col-xs-24"> - <input type="text" class="form-control" - ng-model="feed.storage.catalog.catalogTable.uri" - ng-pattern="validations.patterns.tableUri" - ng-required="feed.storage.catalog.active" validation-message="{{validations.messages.path}}" - ng-focus="feed.storage.catalog.catalogTable.focused = true"/> </div> - </div> - </div> - <div class="row feedBottomButtons"> - <div class="btn btn-default col-xs-6" ng-click="goBack('forms.feed.properties')" > - Previous - </div> - <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.clusters')" > - Next + <div class="row"> + <div class="col-xs-24 mt20"> + <button type="button" + id="feed.backToStep2" class="btn prevBtn" + ng-click="goBack('forms.feed.properties')" + ng-disabled="buttonSpinners.backShow"> + Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" /> + </button> + <button id="feed.step3" class="btn nextBtn pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.clusters')" > + Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" /> + </button> + <a class="pull-right" ui-sref="main"> + Cancel + </a> + </div> </div> - <u class="col-xs-3 pull-right" ui-sref="main"> - Cancel - </u> </div> -</div> </form> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html b/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html index 007fd91..2e4cfd1 100644 --- a/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html +++ b/falcon-ui/app/html/feed/feedFormPropertiesStepTpl.html @@ -17,20 +17,20 @@ * limitations under the License. */ --> -<form name="feedForm"> +<form name="feedForm" novalidate id="feedFormPropertiesStep"> <h5 class="col-xs-24 mb10">Timing</h5> - <div class="col-xs-9 inlineInputsGroup"> + <div class="col-xs-9 inlineInputsGroup"> <div class="light">Frequency</div> <span>Every</span> <input type="text" class="form-control" validation-message="{{validations.messages.number}}" - ng-model="feed.frequency.quantity" + ng-model="feed.frequency.quantity" autofocus ng-required="true" ng-keydown="validations.acceptOnlyNumber($event)" ng-pattern="validations.patterns.twoDigits"/> - <select + <select ng-model="feed.frequency.unit" ng-required="true"> <option selected value="minutes">minutes</option> @@ -40,16 +40,16 @@ </select> </div> - <div class="col-xs-9 inlineInputsGroup"> + <div class="col-xs-9 inlineInputsGroup"> <div class="light"><input type="checkbox" ng-model="feed.lateArrival.active" />Late Arrival</div> <span>Up to</span> - + <input type="text" class="form-control" ng-keydown="validations.acceptOnlyNumber($event)" ng-model="feed.lateArrival.cutOff.quantity" ng-disabled="!feed.lateArrival.active" ng-pattern="validations.patterns.twoDigits" ng-required="feed.lateArrival.active"/> - + <select ng-model="feed.lateArrival.cutOff.unit" ng-disabled="!feed.lateArrival.active" ng-required="feed.lateArrival.active"> @@ -69,11 +69,11 @@ <div class="col-xs-24"> <div class="row mt20"> - <label class="col-xs-5 light">Timezone</label> + <label class="col-xs-5 light">Timezone</label> <time-zone-select ng-model="feed.timezone" class="col-xs-19"></time-zone-select> - + <h5 class="col-xs-24">Properties</h5> - + <div class="col-xs-5"> <label class="light">Name</label> </div> @@ -82,13 +82,13 @@ </div> <div class="col-xs-24" id="feedPropertiesBox"> <div ng-repeat="property in feed.properties" class="row"> - + <label class="col-xs-5">{{property.key}}</label> - + <div class="col-xs-19" ng-if="property.key !== 'timeout' && property.key !== 'jobPriority'"> - <input type="text" class="form-control" - ng-model="property.value" - ng-patter="validations.patterns.alpha"/> + <input type="text" class="form-control" placeholder="{{propPlaceholders[property.key]}}" + ng-model="property.value" validation-optional-message="{{validations.messages.value}}" + ng-pattern="validations.patterns.alpha"/> </div> <div class="col-xs-19 inlineInputsGroup" ng-if="property.key === 'timeout'"> At @@ -97,7 +97,8 @@ ng-pattern="validations.patterns.twoDigits"/> <select ng-model="property.value.unit"> - <option selected value="minutes">minutes</option> + <option value="" disabled selected style='display:none;'>-Select timeout-</option> + <option value="minutes">minutes</option> <option value="hours">hours</option> <option value="days">days</option> <option value="months">months</option> @@ -119,42 +120,42 @@ <div ng-repeat="property in feed.customProperties" class="row"> <div class="col-xs-5 mt10"> <input type="text" class="form-control" placeholder="key" - ng-model="property.key" + ng-model="property.key" validation-optional-message="{{validations.messages.key}}" ng-pattern="validations.patterns.alpha" ng-required="property.value"/> </div> - + <div class="col-xs-15 mt10"> <input type="text" class="form-control" placeholder="value" - ng-model="property.value" + ng-model="property.value" validation-optional-message="{{validations.messages.value}}" ng-pattern="validations.patterns.alpha" ng-required="property.key"/> </div> - <div class="col-xs-4 mt10"> - <div class="btn btn-default btn-xs mt1" ng-click="removeCustomProperty($index)" ng-if="$index>0"> + <div class="col-xs-4 mt10"> + <button type="button" class="btn btn-default btn-xs mt1" ng-click="removeCustomProperty($index)" ng-if="$index>0"> <span class="entypo minus"></span> delete - </div> + </button> </div> </div> </div> <div class="col-xs-24 mt10"> - <div class="btn btn-default btn-xs" ng-click="addCustomProperty()"> + <button type="button" class="btn btn-default btn-xs" ng-click="addCustomProperty()"> <span class="entypo plus"></span> add property - </div> + </button> </div> </div> </div> - <div class="col-xs-24"> - <div class="feedBottomButtons row"> - <div class="btn btn-default col-xs-6" ng-click="goBack('forms.feed.general')"> - Previous - </div> - <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.location')"> - Next - </div> - <u class="col-xs-3 pull-right" ui-sref="main"> - Cancel - </u> - </div> + <div class="col-xs-24 mt20"> + <button id="feed.backToStep1" class="btn prevBtn" type="button" + ng-click="goBack('forms.feed.general')" + ng-disabled="buttonSpinners.backShow"> + Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" /> + </button> + <button id="feed.step2" class="btn nextBtn pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.location')"> + Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" /> + </button> + <a class="pull-right" ui-sref="main"> + Cancel + </a> </div> </form> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html b/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html index f67fa91..a8a4844 100644 --- a/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html +++ b/falcon-ui/app/html/feed/feedFormSummaryStepTpl.html @@ -17,7 +17,7 @@ * limitations under the License. */ --> -<div class="row"> +<div class="row" id="feedFormSummaryStep"> <h4 class="col-sm-24"> General </h4> @@ -122,10 +122,10 @@ <div class="clearfix hidden-md"></div> <div class="col-sm-12"> - <label>Start</label>: {{cluster.validity.start.date}} {{cluster.validity.start.time}} + <label>Start</label>: {{cluster.validity.start.date|date:'yyyy-MM-dd'}} {{cluster.validity.start.time|date:'HH:mm'}} </div> <div class="col-sm-12"> - <label>End</label>: {{cluster.validity.end.date}} {{cluster.validity.end.time}} + <label>End</label>: {{cluster.validity.end.date|date:'yyyy-MM-dd'}} {{cluster.validity.end.time|date:'HH:mm'}} </div> <div class="col-sm-24"> <label>Timezone</label>: {{feed.timezone}} @@ -146,14 +146,18 @@ </div> </div> -<div class="feedBottomButtons row"> - <div class="btn btn-default col-xs-6" ng-click="goBack('forms.feed.clusters')" > - Previous - </div> - <div class="btn btn-default col-xs-6 pull-right" ng-click="saveEntity()"> - Save +<div class="row"> + <div class="col-xs-24 mt20"> + <button id="feed.backToStep4" class="btn prevBtn" type="button" + ng-click="goBack('forms.feed.clusters')" + ng-disabled="buttonSpinners.backShow"> + Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" /> + </button> + <button id="feed.step5" class="btn nextBtn pull-right" ng-click="saveEntity()"> + Save <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" /> + </button> + <a class="pull-right" ui-sref="main"> + Cancel + </a> </div> - <u class="col-xs-3 pull-right" ui-sref="main"> - Cancel - </u> </div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedFormTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/feed/feedFormTpl.html b/falcon-ui/app/html/feed/feedFormTpl.html index c05b963..ee30d54 100644 --- a/falcon-ui/app/html/feed/feedFormTpl.html +++ b/falcon-ui/app/html/feed/feedFormTpl.html @@ -17,78 +17,88 @@ * limitations under the License. */ --> -<div class="col-sm-24 feedForm"> - <div class="col-sm-22 col-sm-offset-2"> - <div class="row"> - <h3 class="col-sm-24"> - New Feed +<div class="col-xs-22 col-xs-offset-1 feedForm" id="feedFormTmpl"> + <div class="col-xs-24"> + <div class="row dt"> + + <h3 id="feed.title" class="col-xs-24"> + <span class="entypo download icon-lg"></span> New Feed </h3> - <div class="col-sm-15 detailsBox"> - <div class="feedProgressBox" ng-class="{ - general:isActive('forms.feed.general'), - properties:isActive('forms.feed.properties'), - location:isActive('forms.feed.location'), - clusters:isActive('forms.feed.clusters'), - summary:isActive('forms.feed.summary') - }"> - <div class="progressBar col-md-24"> - <div> - <span> - <div class="fir">1<span class="entypo check"></span></div> - <h6>General</h6> - </span> - <span> - <div class="sec">2<span class="entypo check"></span></div> - <h6>Properties</h6> - </span> - <span> - <div class="thi">3<span class="entypo check"></span></div> - <h6>Location</h6> - </span> - <span> - <div class="fou">4<span class="entypo check"></span></div> - <h6>Clusters</h6> - </span> - <span> - <div class="fif">5<span class="entypo check"></span></div> - <h6>Summary</h6> - </span> - </div> + <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-20' : !propsOpen}"> + <div class="detailsBox"> + <div class="feedProgressBox" ng-class="{ + general:isActive('forms.feed.general'), + properties:isActive('forms.feed.properties'), + location:isActive('forms.feed.location'), + clusters:isActive('forms.feed.clusters'), + summary:isActive('forms.feed.summary') + }"> + <div class="progressBar col-xs-24"> + <div> + <span> + <div class="fir">1<span class="entypo check"></span></div> + <h6>General</h6> + </span> + <span> + <div class="sec">2<span class="entypo check"></span></div> + <h6>Properties</h6> + </span> + <span> + <div class="thi">3<span class="entypo check"></span></div> + <h6>Location</h6> + </span> + <span> + <div class="fou">4<span class="entypo check"></span></div> + <h6>Clusters</h6> + </span> + <span> + <div class="fif">5<span class="entypo check"></span></div> + <h6>Summary</h6> + </span> + </div> + </div> </div> - </div> - - <div class="row"> - <div class="col-sm-offset-1 col-sm-22"> - <fieldset ng-disabled="!editXmlDisabled"> - <div ui-view class="formViewContainer"></div> - </fieldset> + + <div class="row"> + <div class="col-xs-offset-1 col-xs-22"> + <fieldset ng-disabled="!editXmlDisabled"> + <div ui-view class="formViewContainer"></div> + </fieldset> + </div> </div> </div> - </div> - <div class="col-sm-8 detailsBox col-sm-offset-1"> - <div class="row"> + <div ng-class="{'col-xs-12' : propsOpen, 'col-xs-4' : !propsOpen}"> + <div class="detailsBox"> + <div class="row dt"> - <h5 class="col-xs-13 col-xs-offset-1 noSpecial">XML Preview</h5> - - <div class="col-xs-9"> - <div class="btn btn-default btn-xs pull-right" ng-click="toggleEditXml()" ng-class="{'btn-warning':!editXmlDisabled}"> - Edit XML + <div class="col-xs-13 col-xs-offset-1 noSpecial"> + <h5><i class="pointer glyphicon" ng-click="propsOpen = !propsOpen" ng-class="propsOpen ? 'glyphicon-minus-sign':'glyphicon-plus-sign'"></i> XML Preview</h5> </div> - </div> - <div class="col-xs-24"> - <div class="row"> - <div class="col-sm-22 col-sm-offset-1"> - <textarea ng-model="prettyXml" rows="35" class="form-control" ng-disabled="editXmlDisabled"> - </textarea> - {{xmlEditValidationError}} + <div ng-if="propsOpen" class="col-xs-9"> + <button type="button" + id="feed.editXML" + class="btn btn-default btn-xs pull-right" + ng-click="toggleEditXml()" + ng-class="{'btn-warning':!editXmlDisabled}"> + <div ng-if="editXmlDisabled">Edit XML</div> + <div ng-if="!editXmlDisabled">Finish</div> + </button> + + </div> + + <div ng-show="propsOpen" class="col-sm-24"> + <div class="row"> + <div class="col-sm-22 col-sm-offset-1"> + <textarea ng-model="prettyXml" elastic class="form-control prettyXml" ng-disabled="editXmlDisabled"></textarea> + </div> </div> </div> + </div> - </div> </div> http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/feed/feedSummary.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/feed/feedSummary.html b/falcon-ui/app/html/feed/feedSummary.html new file mode 100644 index 0000000..760e810 --- /dev/null +++ b/falcon-ui/app/html/feed/feedSummary.html @@ -0,0 +1,214 @@ +<!-- +/** + * 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="summaryBox" id="feedFormSummary"> + <div class="row"> + <h5 class="col-sm-24"> + General + </h5> + </div> + + <div class="row"> + <div class="col-sm-12"> + <label>Name</label>: {{feed.name}} + </div> + <div class="col-sm-12"> + <label>Description</label>: {{feed.description}} + </div> + </div> + + <div class="row"> + <h5 class="col-sm-24"> + Tags + </h5> + </div> + + <div class="row"> + <div class="col-sm-24"> + <div ng-repeat="tag in feed.tags | filter:{key: '!!'}"> + {{tag.key}} = {{tag.value}} + </div> + </div> + </div> + + <div class="row"> + <h5 class="col-sm-24"> + Groups + </h5> + </div> + + <div class="row"> + <div class="col-sm-24"> + {{feed.groups}} + </div> + </div> + + <div class="row"> + <h5 class="col-sm-24"> + Access Control List + </h5> + </div> + + <div class="row"> + <div class="col-sm-8"> + <label>Owner</label>: {{feed.ACL.owner}} + </div> + <div class="col-sm-8"> + <label>Group</label>: {{feed.ACL.group}} + </div> + <div class="col-sm-8"> + <label>Permissions</label>: {{feed.ACL.permission}} + </div> + </div> + + <div class="row"> + <h5 class="col-sm-24"> + Schema + </h5> + </div> + + <div class="row"> + <div class="col-sm-12"> + <label>Location</label>: {{feed.schema.location}} + </div> + <div class="col-sm-12"> + <label>Provider</label>: {{feed.schema.provider}} + </div> + </div> + + <div class="row"> + <h5 class="col-sm-24"> + Properties + </h5> + </div> + + <div class="row"> + <div class="col-sm-8"> + <label>Frequency</label>: + <frequency value="feed.frequency" prefix="Every"/> + </div> + <div class="col-sm-8"> + <label>Late Arrival</label>: + <frequency value="feed.lateArrival.cutOff" prefix="Up to"/> + </div> + <div class="col-sm-8"> + <label>Availability Flag</label>: {{feed.availabilityFlag}} + </div> + </div> + + <div class="row"> + <div class="col-sm-8" ng-repeat="property in feed.properties"> + <label>{{property.key}}</label>: + <span ng-if="property.key !== 'timeout'">{{property.value}}</span> + <frequency ng-if="property.key === 'timeout'" value="property.value" prefix="at"/> + </div> + + <div class="col-sm-8" ng-repeat="property in feed.customProperties | filter: {key: '!!'}"> + <label>{{property.key}}</label>: {{property.value}} + </div> + + <h5 class="col-xs-24"> + Default Storage Type: + </h5> + </div> + + <div class="row"> + <div class="col-sm-8 light" ng-show="feed.storage.fileSystem.active">File System</div> + <div class="col-sm-8 light" ng-show="feed.storage.catalog.active">Catalog Storage</div> + </div> + + <div class="row"> + <h5 class="col-sm-24">Default Location:</h5> + </div> + + + <div ng-repeat="location in feed.storage.fileSystem.locations" ng-show="feed.storage.fileSystem.active"> + <div class="row"> + <label class="col-sm-24">{{capitalize(location.type)}}</label> + </div> + + <div class="row"> + <div class="col-sm-24">{{location.path}}</div> + </div> + </div> + + <div ng-show="feed.storage.catalog.active"> + <div class="row"> + <label class="col-sm-24">Table uri</label> + </div> + <div class="row"> + <div class="col-sm-24">{{feed.storage.catalog.catalogTable.uri}}</div> + </div> + </div> + +</div> + +<div class="summaryBox"> + <div ng-repeat="cluster in feed.clusters"> + <div class="row"> + <h5 class="col-sm-24">{{capitalize(cluster.type)}} Cluster</h5> + </div> + <div class="row"> + <div class="col-sm-12"> + <label>Name</label>: {{cluster.name}} + </div> + <div class="clearfix hidden-md"></div> + </div> + <div class="row"> + <div class="col-sm-12"> + <label>Start</label>: {{dateFormatter(entity.start)}} + </div> + <div class="col-sm-12"> + <label>End</label>: {{dateFormatter(entity.end)}} + </div> + </div> + <div class="row"> + <div class="col-sm-24"> + <label>Timezone</label>: {{feed.timezone}} + </div> + </div> + <div class="row"> + <div class="col-sm-24"> + <label>Retention</label>: + <frequency value="cluster.retention" prefix="Archive in"/> + </div> + </div> + </div> + <div class="clearfix hidden-md"></div> + <div class="row"> + <h5 class="col-sm-24">Location</h5> + </div> + + <div ng-repeat="location in cluster.storage.fileSystem.locations" ng-show="cluster.storage.fileSystem"> + <div class="row"> + <label class="col-sm-24">{{capitalize(location.type)}}</label> + </div> + <div class="row"> + <div class="col-sm-24">{{location.path}}</div> + </div> + </div> + <div ng-show="cluster.storage.catalog.active"> + <div class="row"> + <label class="col-sm-24">Table uri</label> + </div> + <div class="row"> + <div class="col-sm-24">{{cluster.storage.catalog.catalogTable.uri}}</div> + </div> + </div> +</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/instanceDetails.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/instanceDetails.html b/falcon-ui/app/html/instanceDetails.html new file mode 100644 index 0000000..b67c041 --- /dev/null +++ b/falcon-ui/app/html/instanceDetails.html @@ -0,0 +1,78 @@ +<!-- +/** + * 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="instanceDetails"> + + <div class="row"> + <div class="col-sm-24"> + <div class="detailsBox"> + <div class="row"> + <div class="col-sm-9"> + <h3 class="instance-title"> + <a href="javascript:void(0);" ng-click="backToEntity()">{{ instance.name }}</a> | {{ instance.instance }} + </h3> + </div> + <div class="col-sm-3 instance-status"> + <span class="text-success">STARTED</span><br/> + {{ instance.startTime | date :'MM/dd/yyyy HH:mm' }} + </div> + <div class="col-sm-5 border-left"> + <h4 class="instance-title"> + Status: <span ng-class="{ + 'blink-success': instance.status == 'RUNNING', + 'text-success': instance.status == 'SUCCEEDED', + 'blink-warning': instance.status == 'WAITING' || instance.status == 'UNKNOWN', + 'blink-danger': instance.status == 'SUSPENDED', + 'text-danger': instance.status == 'FAILED' || instance.status == 'KILLED', + }">{{ instance.status }}</span> + </h4> + </div> + <div class="col-sm-7 buttonCell"> + <div class="btn btn-big btn-xs buttons-to-show" ng-click="resumeInstance()" + ng-disabled="!(instance.status === 'SUSPENDED')"> + <span class="entypo play"></span> <div>Resume</div> + </div> + <div class="btn btn-big btn-xs buttons-to-show" ng-click="reRunInstance()" + ng-disabled="!(instance.status === 'KILLED' || instance.status === 'SUCCEEDED' || instance.status === 'FAILED')"> + <span class="entypo play"></span> <div>Rerun</div> + </div> + <div class="btn btn-big btn-xs buttons-to-show" ng-click="suspendInstance()" ng-disabled="!(instance.status === 'RUNNING')"> + <span class="entypo paus"></span> <div>Suspend</div> + </div> + <div class="btn btn-big btn-xs buttons-to-show" ng-click="killInstance()" ng-disabled="!(instance.status === 'SUSPENDED' || instance.status === 'RUNNING')"> + <span class="entypo stop"></span> <div>Kill</div> + </div> + </div> + </div> + </div> + </div> + </div> + + <div ng-if="instance.status === 'SUCCEEDED'" class="row"> + <div class="col-sm-24"> + <div class="detailsBox"> + <h4> + Lineage + </h4> + <div class="lineage-graph"><lineage-graph type="instance.type" name="instance.name" instance="instance.instance" start="instance.startTime" end="instance.endTime"/></div> + </div> + </div> + </div> + +</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/login.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/login.html b/falcon-ui/app/html/login.html new file mode 100644 index 0000000..556d843 --- /dev/null +++ b/falcon-ui/app/html/login.html @@ -0,0 +1,83 @@ + <!-- + /** + * 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="loginForm" ng-submit="loggUser(loginForm)" novalidate id="loginForm"> + + <div class="col-sm-24 dashboardBox login" ng-class="{showValidationStyle:showLoginVal.show}"> + <div class="row"> + <div class="col-sm-6"></div> + <div class="col-sm-12"> + + <div class="col-sm-15 detailsBox centered"> + <h3>Log In</h3> + + <!--<div class="clearfix hidden-md"> </div>--> + + <!--<div class="row">--> + <!--<div class="col-sm-offset-1 col-sm-22 hint">--> + <!--Default user: ambari-qa   Password: admin--> + <!--</div>--> + <!--</div>--> + + <div class="row"> + <div class="col-sm-offset-1 col-sm-22"> + <div class="clearfix hidden-md"> </div> + </div> + </div> + + <div class="row"> + <div class="col-sm-offset-1 col-sm-22"> + <label class="light">User</label> + <input type="text" class="form-control" + name="user" + ng-model="login.user" + ng-required="true" + ng-class="{'ng-invalid': showLoginVal.userPassInvalid}" + validation-message="{{validations.messages.user}}" + ng-keydown="showLoginVal.userPassInvalid = false" + ng-pattern="validations.patterns.id" autofocus/> + </div> + </div> + + <div class="row"> + <div class="col-sm-23 col-sm-offset-1 custom-danger" ng-if="showLoginVal.userPassInvalid"> + The user/password you have entered is invalid. + </div> + <div class="col-sm-offset-1 col-sm-22"> + <div class="clearfix hidden-md"> </div> + </div> + </div> + + <div class="row"> + <div class="col-sm-offset-1 col-sm-22"> + <button id="login.submit" type="submit" class="btn btn-default col-xs-6 pull-right dynamic-table-spacer"> + Check-In + </button> + </div> + </div> + + </div> + + </div> + <div class="col-sm-6"></div> + </div> + </div> + + </form> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/mainTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/mainTpl.html b/falcon-ui/app/html/mainTpl.html index 4b0116e..890463f 100644 --- a/falcon-ui/app/html/mainTpl.html +++ b/falcon-ui/app/html/mainTpl.html @@ -18,22 +18,58 @@ */ --> -<div class="col-sm-24 dashboardBox"> - <div class="row"> - <div class="col-sm-8"> - <h3>Clusters</h3> - <entity-summary entities="lists.clusterList" type="cluster"></entity-summary> - <entities-list input="lists.clusterList" type="cluster" entity-details="entityDetails" clone="cloneEntity" remove="deleteEntity" edit="editEntity" schedule="scheduleEntity" suspend="suspendEntity" resume="resumeEntity"></entities-list> - </div> - <div class="col-sm-8"> - <h3>Feeds</h3> - <entity-summary entities="lists.feedList" type="feed"></entity-summary> - <entities-list input="lists.feedList" type="feed" entity-details="entityDetails" clone="cloneEntity" remove="deleteEntity" edit="editEntity" schedule="scheduleEntity" suspend="suspendEntity" resume="resumeEntity"></entities-list> +<div class="col-sm-offset-1 col-sm-22"> + + <div class="row searchBoxContainer" id="searchBoxContainer"> + <div class="col-sm-4"></div> + <div class="col-sm-16"> + + <img src="css/img/ajax-loader.gif" class="glyphicon search-loading-icon" ng-show="loading"/> + <i class="glyphicon glyphicon-search search-icon" ng-hide="loading"></i> + + <tags-input ng-model="tags" min-length="1" add-on-space="true" add-from-autocomplete-only="true" + on-tag-added="displayResults()" on-tag-removed="displayResults()" placeholder="Search"> + <auto-complete source="loadTags($query)" min-length="0"></auto-complete> + </tags-input> + + <i id="nsPopover" class="glyphicon glyphicon-question-sign" ng-class="tags.length > 0 ? 'question-icon' : 'remove-icon'" + ns-popover + ns-popover-template="menu" + ns-popover-trigger="click" + ns-popover-theme="ns-popover-tooltip-theme" + ns-popover-timeout="5" + ns-popover-placement="bottom|right"></i> + <script type="text/ng-template" id="menu"> + <div class="triangle"></div> + <!--<div class="ns-popover-tooltip">--> + <!--<h5>Hey there! Want some search tips?</h5>--> + <!--The <strong>first word</strong> you type will be taken as the <strong>Name</strong> of the entity.--> + <!--<br/>--> + <!--You can search <strong>*</strong> for getting all the entities.--> + <!--<br/>--> + <!--The <strong>second and following</strong> words will be taken as <strong> Tags</strong>.--> + <!--<br/>--> + <!--For filtering by type, write <strong>type=feed|process|mirror</strong>--> + <!--</div>--> + <div class="ns-popover-tooltip"> + <h5>Hey there! Want some search tips?</h5> + You can type <strong>*</strong> and select <strong>Name: *</strong> from the autocomplete for getting all the entities. + </div> + </script> + <i class="glyphicon glyphicon-remove remove-icon" ng-if="tags.length > 0" ng-click="clearTags()"></i> + </div> - <div class="col-sm-8"> - <h3>Processes</h3> - <entity-summary entities="lists.processList" type="process"></entity-summary> - <entities-list input="lists.processList" entity-details="entityDetails" type="process" clone="cloneEntity" remove="deleteEntity" edit="editEntity" schedule="scheduleEntity" suspend="suspendEntity" resume="resumeEntity"></entities-list> + <div class="col-sm-4"></div> + </div> + + <div class="col-sm-24 dashboardBox" ng-show="searchList.length > 0" id="dashboardBox"> + <div class="row"> + <div class="col-sm-24"> + <entities-search-list input="searchList" entity-details="entityDetails" clone="cloneEntity" tags="tags" + remove="deleteEntity" edit="editEntity" schedule="scheduleEntity" suspend="suspendEntity" + resume="resumeEntity" focus-search="focusSearch" pages="pages" go-page="goPage"/> + </div> </div> </div> + </div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormClustersStepTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/process/processFormClustersStepTpl.html b/falcon-ui/app/html/process/processFormClustersStepTpl.html index 47886a2..21bf4bf 100644 --- a/falcon-ui/app/html/process/processFormClustersStepTpl.html +++ b/falcon-ui/app/html/process/processFormClustersStepTpl.html @@ -17,80 +17,117 @@ * limitations under the License. */ --> -<form name="processForm" class="mt10"> - <div class="col-sm-offset-1 col-sm-22"> +<form name="processForm" class="mt10" novalidate id="processFormClusterStep"> + <div class="col-xs-offset-1 col-xs-22"> <div ng-repeat="cluster in process.clusters" class="row"> - <div class="col-xs-24 detailsBox processCluster"> - + <div class="col-xs-24 detailsBox processCluster"> + <h5>Cluster</h5> <div class="row"> <div class="col-xs-24"> <label class="light">Name</label> - <select ng-model="cluster.name" ng-required="true" class="form-control padding0" validation-message="{{validations.messages.cluster}}"> + <select ng-model="cluster.name" ng-class="{firstSelectClusterStep: $index === 0}" + ng-required="true" + class="form-control padding0" + validation-message="{{validations.messages.cluster}}"> <option value="" disabled selected style='display:none;'>-Select cluster-</option> <option ng-repeat="clusterItem in clusterList">{{clusterItem.name}}</option> </select> </div> </div> <div class="clearfix"></div> - - <h5>Validity</h5> - <div class="row"> - <div class="col-xs-12"> - - <div>Start</div> - - <div class="input-group input-group-xs"> - <span class="input-group-addon btn btn-default entypo calendar" ng-click="openDatePicker($event, cluster.validity.start)"></span> - <input type="text" class="form-control" placeholder="Start Date" + + <label class="col-xs-24"> Validity </label> + <div class="col-xs-24 validityBox"> + <div class="startDateBox"> + <label>Start + <input type="text" + name="startDateInput" + class="form-control dateInput" + placeholder="mm/dd/yyyy" datepicker-popup="{{dateFormat}}" ng-model="cluster.validity.start.date" is-open="cluster.validity.start.opened" - ng-required="true"> - </div> + ng-click="openDatePicker($event, cluster.validity.start)" + ng-required="true" + simple-date> + </label> + <label class="col-xs-24 custom-danger validationMessageGral" + ng-if="!cluster.validity.start.date"> + {{validations.messages.date.empty}} + </label> + </div> + <div class="startTimeBox"> + <label>Time + <timepicker + ng-model="cluster.validity.start.time" + hour-step="1" + minute-step="1" + show-meridian="true"> + </timepicker> + </label> </div> - - <div class="col-xs-12"> - <div>End</div> - - <div class="input-group input-group-xs"> - <span class="input-group-addon btn btn-default entypo calendar" ng-click="openDatePicker($event, cluster.validity.end)"></span> - <input type="text" class="form-control" placeholder="End Date" + <div class="endDateBox"> + <label>End + <input type="text" + name="endDateInput" + class="form-control dateInput" + placeholder="mm/dd/yyyy" datepicker-popup="{{dateFormat}}" ng-model="cluster.validity.end.date" is-open="cluster.validity.end.opened" - ng-required="true"> - </div> + ng-click="openDatePicker($event, cluster.validity.end)" + ng-required="true" + min-date="cluster.validity.start.date" + simple-date> + </label> + <label class="col-xs-24 custom-danger validationMessageGral" + ng-if="!cluster.validity.end.date"> + {{validations.messages.date.empty}} + </label> </div> + <div class="endTimeBox"> + <label>Time + <timepicker + ng-model="cluster.validity.end.time" + hour-step="1" + minute-step="1" + show-meridian="true"> + </timepicker> + </label> + </div> + <div class="col-xs-24 mt10"> - <div class="btn btn-default pull-right btn-xs" ng-click="removeCluster($index)" ng-if="!$first"> - - delete - </div> + <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeCluster($index)" ng-if="!$first"> + <span class="entypo minus"></span> delete + </button> </div> </div> - - - + + + </div> </div> </div> <div class="col-xs-24 mt10"> - <div class="btn btn-default btn-xs" ng-click="addCluster()"> - + add cluster - </div> + <button type="button" class="btn btn-default btn-xs" ng-click="addCluster()"> + <span class="entypo plus"></span> add cluster + </button> </div> - <div class="col-xs-24"> - <div class="row feedBottomButtons"> - <div class="btn btn-default col-xs-6" ng-click="goBack('forms.process.properties')" > - Previous - </div> - <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(processForm.$invalid, 'forms.process.io')" > - Next - </div> - <u class="col-xs-3 pull-right" ui-sref="main"> - Cancel - </u> - </div> + <div class="col-xs-24 mt20"> + <button class="btn prevBtn" type="button" + ng-click="goBack('forms.process.properties')" + ng-disabled="buttonSpinners.backShow"> + Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" /> + </button> + <button class="btn nextBtn pull-right" + ng-disabled="buttonSpinners.show" + ng-click="goNext(processForm.$invalid, 'forms.process.io')" > + Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" /> + </button> + <a class="pull-right" ui-sref="main"> + Cancel + </a> </div> - + </form> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormGeneralStepTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/process/processFormGeneralStepTpl.html b/falcon-ui/app/html/process/processFormGeneralStepTpl.html index 3f559c8..cc21854 100644 --- a/falcon-ui/app/html/process/processFormGeneralStepTpl.html +++ b/falcon-ui/app/html/process/processFormGeneralStepTpl.html @@ -17,14 +17,14 @@ * limitations under the License. */ --> -<form name="processForm" class="mt10"> - +<form name="processForm" class="mt10" novalidate id="processFormGeneralStep"> + <div class="col-xs-24"> <label class="light">Name</label> <input type="text" class="form-control" ng-keydown="validations.acceptNoSpaces($event)" check-name="{type:'process', check:cloningMode}" ng-class="{fakeInvalid:!validations.nameAvailable}" ng-disabled="!cloningMode" id="entityNameField" ng-model="process.name" - ng-required="true" ng-maxlength="39" ng-pattern="validations.patterns.name"/> + ng-required="true" ng-maxlength="100" ng-pattern="validations.patterns.name"/> </div> <div class="col-xs-24"> @@ -36,55 +36,68 @@ <div class="row dynamic-table-spacer"> <div class="col-xs-10"> <input type="text" class="form-control" ng-model="tag.key" placeholder="key" + validation-optional-message="{{validations.messages.key}}" ng-pattern="validations.patterns.alpha" ng-required="tag.value"/> </div> <div class="col-xs-11"> <input type="text" class="form-control" placeholder="value" + validation-optional-message="{{validations.messages.value}}" ng-model="tag.value" ng-pattern="validations.patterns.alpha" ng-required="tag.key"/> </div> <div class="col-xs-3"> - <div class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="$index>0"> + <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-if="$index>0"> <span class="entypo minus"></span> delete - </div> + </button> </div> </div> </div> </div> <div class="col-xs-24 mt10 mb10"> - <div class="btn btn-default btn-xs" ng-click="addTag()"> + <button type="button" class="btn btn-default btn-xs" ng-click="addTag()"> <span class="entypo plus"></span> add tag - </div> + </button> </div> <h4 class="col-xs-24">Workflow</h4> <div class="col-xs-24"> <div class="light">Name</div> - <input type="text" class="form-control" validation-message="{{validations.messages.engineName}}" + <input type="text" class="form-control" validation-optional-message="{{validations.messages.name}}" id="workflowNameField" ng-model="process.workflow.name" - ng-required="false" - ng-maxlength="39" - ng-pattern="validations.patterns.engineName"/> + ng-maxlength="100" + ng-pattern="validations.patterns.name"/> </div> <div id="engineSection" class="col-xs-24"> <label class="light">Engine</label> <div class="row"> - <div class="col-xs-4" ng-class="{fakeInvalidRadio:!process.workflow.engine}"> - <input type="radio" id="oozieEngineRadio" ng-change="selectWorkflow()" ng-model="process.workflow.engine" value="oozie" ng-required="!process.workflow.engine"/> Oozie + <div class="col-xs-4"> + <input + type="radio" id="oozieEngineRadio" + ng-change="selectWorkflow()" + ng-model="process.workflow.engine" + value="oozie" /> Oozie </div> - <div class="col-xs-4" ng-class="{fakeInvalidRadio:!process.workflow.engine}"> - <input type="radio" id="pigEngineRadio" ng-change="selectWorkflow()" ng-model="process.workflow.engine" value="pig" ng-required="!process.workflow.engine"/> Pig + <div class="col-xs-4"> + <input type="radio" id="pigEngineRadio" + ng-change="selectWorkflow()" + ng-model="process.workflow.engine" + value="pig" /> Pig </div> - <div class="col-xs-4" ng-class="{fakeInvalidRadio:!process.workflow.engine}"> - <input type="radio" id="hiveEngineRadio" ng-change="selectWorkflow()" ng-model="process.workflow.engine" value="hive" ng-required="!process.workflow.engine"/> Hive + <div class="col-xs-4"> + <input type="radio" id="hiveEngineRadio" + ng-change="selectWorkflow()" + ng-model="process.workflow.engine" + value="hive" /> Hive </div> - <select id="engineVersionField" ng-model="process.workflow.version" - ng-required="false" ng-show="process.workflow.engine" validation-message="{{validations.messages.engine}}"> - + + <select id="engineVersionField" + ng-model="process.workflow.version" + ng-show="process.workflow.engine"> + <option value="" disabled selected style='display:none;'>-Select {{process.workflow.engine}} version-</option> - + <option ng-repeat="version in versions" id="{{process.workflow.engine}}Version{{$index}}" value="{{version}}" @@ -92,6 +105,7 @@ {{version}} </option> </select> + </div> </div> <div class="col-xs-24"> @@ -101,19 +115,56 @@ ng-model="process.workflow.path" ng-required="true" ng-maxlength="200" + validation-optional-message="{{validations.messages.path}}" ng-pattern="validations.patterns.osPath"/> </div> - <div class="col-xs-24"> - <div class="feedBottomButtons row"> - <div id="nextButton" - class="btn btn-default col-xs-6 pull-right" ng-click="goNext(processForm.$invalid, 'forms.process.properties')" > - Next - </div> - <u class="col-xs-3 pull-right" ng-click="cancel()" ui-sref="main"> - Cancel - </u> + <div class="aclBox col-xs-24"> + <h4>Access Control List</h4> + <div> + <label>Owner + <input type="text" + name="aclOwnerInput" + ng-model="process.ACL.owner" + ng-pattern="validations.patterns.unixId" + ng-required="true" + class="form-control" + validation-message="{{validations.messages.acl.owner}}"/> + </label> + </div> + <div> + <label>Group + <input type="text" + name="aclGroupInput" + ng-model="process.ACL.group" + ng-pattern="validations.patterns.unixId" + ng-required="true" + class="form-control" + validation-message="{{validations.messages.acl.group}}" /> + </label> </div> + <div> + <label>Permissions + <input type="text" + name="aclPermissionsInput" + ng-model="process.ACL.permission" + ng-pattern="validations.patterns.unixPermissions" + ng-required="true" + class="form-control" + validation-message="{{validations.messages.acl.permission}}" /> + </label> + </div> + </div> + + <div class="col-xs-24 mt20"> + <button id="nextButton" class="btn nextBtn pull-right" + ng-disabled="buttonSpinners.show" + ng-click="goNext(processForm.$invalid, 'forms.process.properties')" > + Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" /> + </button> + <a class="pull-right" ui-sref="main"> + Cancel + </a> </div> </form> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html b/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html index 6ed54e1..528ce14 100644 --- a/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html +++ b/falcon-ui/app/html/process/processFormInputsAndOutputsStepTpl.html @@ -17,22 +17,24 @@ * limitations under the License. */ --> -<form name="processForm"> +<form name="processForm" novalidate id="processFormInOutStep"> <div class="col-sm-offset-1 col-sm-22"> <h4 ng-if="process.inputs.length === 0">Inputs</h4> <div ng-repeat="input in process.inputs" class="row"> <h4 class="col-xs-24">Input</h4> - + <div class="col-xs-24 detailsBox processCluster"> <div class="row"> <div class="col-xs-24"> <label class="light">Name</label> - <input type="text" class="form-control" validation-message="{{validations.messages.name}}" + <input type="text" class="form-control" + ng-class="{firstInput: $index === 0}" + validation-message="{{validations.messages.name}}" ng-model="input.name" ng-required="true" - ng-maxlength="39" + ng-maxlength="100" ng-pattern="validations.patterns.name"/> </div> </div> @@ -40,7 +42,7 @@ <div class="row"> <div class="col-xs-24"> <label class="light">Feed</label> - + <select ng-model="input.feed" ng-required="true" class="col-sm-24 form-control padding0" validation-message="{{validations.messages.feed}}"> <option value="" disabled selected style='display:none;'>-Select feed-</option> @@ -51,52 +53,58 @@ <div class="clearfix"></div> <h5>Instance</h5> - + <div class="row"> <div class="col-xs-12"> <label class="light">Start</label> - + <input type="text" class="form-control" validation-message="{{validations.messages.value}}" ng-model="input.start" ng-required="true" - ng-maxlength="39"/> - + ng-maxlength="100" + on-blur="validateStartEndDate"/> + </div> <div class="col-xs-12"> <label class="light">End</label> - - <input type="text" class="form-control" validation-message="{{validations.messages.value}}" + + <input type="text" class="form-control {{invalidEndDate}}" validation-message="{{validations.messages.value}}" ng-model="input.end" ng-required="true" - ng-maxlength="39"/> + ng-maxlength="100" + on-blur="validateStartEndDate"/> + <label ng-show="invalidEndDate" class="custom-danger nameValidationMessage">End should be equal or greater than Start</label> </div> - + <div class="col-xs-24 mt10"> - <div class="btn btn-default pull-right btn-xs" ng-click="removeInput($index)"> - - delete - </div> + <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeInput($index)"> + <span class="entypo minus"></span> delete + </button> </div> - </div> + </div> </div> </div> - <div class="btn btn-default btn-xs mt10 mb10" ng-click="addInput()"> - + add input - </div> + <button type="button" class="btn btn-default btn-xs mt10 mb10 addInputButton" ng-click="addInput()"> + <span class="entypo plus"></span> add input + </button> <h4 ng-if="process.outputs.length === 0">Outputs</h4> <div ng-repeat="output in process.outputs" class="row"> <h4 class="col-xs-24">Output</h4> - + <div class="col-xs-24 detailsBox processCluster"> <div class="row"> <div class="col-xs-24"> <label class="light">Name</label> - <input type="text" class="form-control" validation-message="{{validations.messages.name.patternInvalid}}" + <input type="text" + ng-class="{firstOutput: $index === 0}" + class="form-control" + validation-message="{{validations.messages.name}}" ng-model="output.name" ng-required="true" - ng-maxlength="39" + ng-maxlength="100" ng-pattern="validations.patterns.id"/> </div> </div> @@ -119,31 +127,37 @@ <input type="text" class="form-control" validation-message="{{validations.messages.value}}" ng-model="output.outputInstance" ng-required="true" - ng-maxlength="39"/> + ng-maxlength="100"/> </div> </div> <div class="row mt10"> - <div class="btn btn-default pull-right btn-xs" ng-click="removeOutput($index)"> - - delete - </div> + <button type="button" class="btn btn-default pull-right btn-xs" ng-click="removeOutput($index)"> + <span class="entypo minus"></span> delete + </button> </div> - + </div> </div> - <div class="btn btn-default btn-xs mb10 mt10" ng-click="addOutput()"> - + add output - </div> + <button type="button" class="btn btn-default btn-xs mb10 mt10" ng-click="addOutput()"> + <span class="entypo plus"></span> add output + </button> </div> - <div class="row feedBottomButtons"> - <div class="btn btn-default col-xs-6" ng-click="goBack('forms.process.clusters')"> - Previous - </div> - <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(processForm.$invalid, 'forms.process.summary')" > - Next + <div class="row"> + <div class="col-xs-24 mt20"> + <button class="btn prevBtn" type="button" + ng-click="goBack('forms.process.clusters')" + ng-disabled="buttonSpinners.backShow"> + Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" /> + </button> + <button class="btn nextBtn pull-right" + ng-disabled="invalidEndDate || buttonSpinners.show" + ng-click="goNext(processForm.$invalid, 'forms.process.summary')" > + Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" /> + </button> + <a class="pull-right" ui-sref="main"> + Cancel + </a> </div> - <u class="col-xs-3 pull-right" ui-sref="main"> - Cancel - </u> </div> </form> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormPropertiesStepTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/process/processFormPropertiesStepTpl.html b/falcon-ui/app/html/process/processFormPropertiesStepTpl.html index 5732060..657a1cb 100644 --- a/falcon-ui/app/html/process/processFormPropertiesStepTpl.html +++ b/falcon-ui/app/html/process/processFormPropertiesStepTpl.html @@ -17,13 +17,13 @@ * limitations under the License. */ --> -<form name="processForm" class="mt10"> +<form name="processForm" class="mt10" novalidate id="processFormPropsStep"> <h5 class="col-xs-24">Timing</h5> <div class="col-xs-24 mb10"> <label class="light">Timezone</label> - <time-zone-select ng-model="process.timezone"></time-zone-select> + <time-zone-select ng-model="process.timezone" id="timeZoneSelect"></time-zone-select> </div> <div class="col-xs-9"> @@ -35,8 +35,8 @@ id="frequencyQuantity" ng-required="true" ng-pattern="validations.patterns.twoDigits"/> - - <select + + <select ng-model="process.frequency.unit" ng-required="true"> <option selected value="minutes">minutes</option> @@ -95,7 +95,7 @@ id="delayQuantity" ng-keydown="validations.acceptOnlyNumber($event)" ng-required="true" ng-pattern="validations.patterns.twoDigits"/> - + <select ng-model="process.retry.delay.unit" ng-required="true" validation-message="{{validations.messages.option}}"> <option value="" disabled selected style='display:none;'>-Select delay-</option> <option value="minutes">minutes</option> @@ -106,17 +106,21 @@ </div> </div> - <div class="col-xs-24"> - <div class="feedBottomButtons row"> - <div class="btn btn-default col-xs-6" ng-click="goBack('forms.process.general')"> - Previous - </div> - <div class="btn btn-default col-xs-6 pull-right" ng-click="goNext(processForm.$invalid, 'forms.process.clusters')" > - Next - </div> - <u class="col-xs-3 pull-right" ui-sref="main"> - Cancel - </u> - </div> + <div class="col-xs-24 mt20"> + <button class="btn prevBtn" + type="button" + ng-click="goBack('forms.process.general')" + ng-disabled="buttonSpinners.backShow"> + Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" /> + </button> + <button class="btn nextBtn pull-right" + ng-disabled="buttonSpinners.show" + ng-click="goNext(processForm.$invalid, 'forms.process.clusters')" > + Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" /> + </button> + <a class="pull-right" ui-sref="main"> + Cancel + </a> </div> + </form> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/falcon/blob/86180d93/falcon-ui/app/html/process/processFormSummaryStepTpl.html ---------------------------------------------------------------------- diff --git a/falcon-ui/app/html/process/processFormSummaryStepTpl.html b/falcon-ui/app/html/process/processFormSummaryStepTpl.html index 6c554da..b60dd4e 100644 --- a/falcon-ui/app/html/process/processFormSummaryStepTpl.html +++ b/falcon-ui/app/html/process/processFormSummaryStepTpl.html @@ -17,7 +17,7 @@ * limitations under the License. */ --> -<form name="processForm" class="mt10"> +<form name="processForm" class="mt10" novalidate id="processFormSummaryStep"> <div class="row"> <h4 class="col-sm-24">Process</h4> @@ -105,11 +105,11 @@ <div class="row"> <div class="col-sm-12"> <label class="col-sm-24">Start</label> - <label class="col-sm-24 light">{{cluster.validity.start.date}} {{cluster.validity.start.time}}</label> + <label class="col-sm-24 light">{{cluster.validity.start.date|date:'yyyy-MM-dd'}} {{cluster.validity.start.time|date:'HH:mm'}}</label> </div> <div class="col-sm-12"> <label class="col-sm-24">End</label> - <label class="col-sm-24 light">{{cluster.validity.end.date}} {{cluster.validity.end.time}}</label> + <label class="col-sm-24 light">{{cluster.validity.end.date|date:'yyyy-MM-dd'}} {{cluster.validity.end.time|date:'HH:mm'}}</label> </div> </div> </div> @@ -152,17 +152,22 @@ </div> <div class="clearfix hidden-md"> </div> - <div class="row feedBottomButtons"> - <div class="btn btn-default col-sm-6" ng-click="goBack('forms.process.io')"> - Previous - </div> - <div class="btn btn-default col-sm-6 pull-right" - ng-disabled="processForm.$invalid" - ng-click="saveEntity()"> - Save + <div class="row"> + <div class="col-xs-24 mt20"> + <button type="button" class="btn prevBtn" + ng-click="goBack('forms.process.io')" + ng-disabled="buttonSpinners.backShow"> + Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" /> + </button> + <button class="btn nextBtn pull-right" + ng-disabled="processForm.$invalid || buttonSpinners.show" + ng-click="saveEntity()"> + Save <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" /> + </button> + <a class="pull-right" ui-sref="main"> + Cancel + </a> </div> - <u class="col-sm-3 pull-right" ui-sref="main"> - Cancel - </u> </div> + </form> \ No newline at end of file
