You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@falcon.apache.org by pe...@apache.org on 2016/08/22 04:48:05 UTC
[12/16] falcon git commit: FALCON-2118 Proposal for new UI changes
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/datasource/datasourceFormGeneralStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/datasource/datasourceFormGeneralStepTpl.html b/falcon-ui/app/html/datasource/datasourceFormGeneralStepTpl.html
new file mode 100644
index 0000000..e5ca971
--- /dev/null
+++ b/falcon-ui/app/html/datasource/datasourceFormGeneralStepTpl.html
@@ -0,0 +1,355 @@
+<!--
+/**
+* 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 plr0px">
+ <div class="col-xs-12">
+ <label class="light" tooltip="datasource.name">Connection Name<mandatory-field></mandatory-field></label>
+ <input type="text" class="form-control" ng-disabled="editingMode" ng-keydown="validations.acceptNoSpaces($event)"
+ check-name="{type:'datasource', check:!editingMode}" ng-class="{fakeInvalid:!validations.nameAvailable}"
+ ng-model="datasource.name" ng-required="true" ng-pattern="validations.patterns.name"/>
+ </div>
+ <div class="col-xs-12">
+ <label class="light" tooltip="cluster.colo">Data Center or Colo Name<mandatory-field></mandatory-field></label>
+ <input type="text" class="form-control"
+ ng-pattern="validations.patterns.name"
+ ng-required="true" ng-disabled="xmlPreview.edit"
+ ng-model="datasource.colo" validation-message="{{validations.messages.colo}}"/>
+ </div>
+ </div>
+ <div class="col-xs-24">
+ <label class="light">Description</label>
+ <input type="text" class="form-control"
+ ng-disabled="xmlPreview.edit"
+ ng-pattern="validations.patterns.freeText"
+ ng-model="datasource.description" />
+ </div>
+ <div class="col-xs-24">
+ <label class="light">Tags</label>
+ </div>
+
+ <div class="col-xs-12">
+ <div ng-repeat="tag in datasource.tags">
+ <div class="row dynamic-table-spacer">
+ <div class="col-xs-8">
+ <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-8">
+ <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-8">
+ <button type="button" class="btn btn-default btn-xs" ng-click="removeTag($index)" ng-disabled="xmlPreview.edit" ng-if="!$first || !$last">
+ <span class="entypo minus"></span> delete
+ </button>
+ <button type="button" class="btn btn-default btn-xs" ng-click="addTag()" ng-disabled="xmlPreview.edit" ng-if="$last">
+ <span class="entypo plus"></span> add tag
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="col-xs-24 plr0px">
+ <div class="col-xs-12">
+ <label class="light">Database Manager<mandatory-field></mandatory-field></label>
+ <select class="form-control padding0 "ng-required="true" validation-message="{{validations.messages.dbManager}}"
+ ng-model="datasource.type" ng-change="getDatabaseDefaultDetails()">
+ <option value="" disabled selected style='display:none;'>- Select Database Manager -</option>
+ <option value="mysql">MySQL</option>
+ <option value="oracle">Oracle</option>
+ <option value="hsql">HSQL</option>
+ <option value="db2">DB2</option>
+ <option value="postgres">Postgres</option>
+ <option value="netezza">Netezza</option>
+ <option value="teradata">Teradata</option>
+ <option value="generic">Generic</option>
+ <!-- <option ng-repeat="driverItem in driverList">{{driverItem.name}}</option> -->
+ </select>
+ </div>
+ <div class="col-xs-12">
+ <label class="light">Connection String<mandatory-field></mandatory-field></label>
+ <input type="text" title="You need to update the connection string to point to your db"
+ ng-required="true"
+ validation-message="{{validations.messages.connectionString}}"
+ class="form-control endpointDefault" ng-class="{endpointChanged:datasourceForm.endpoint.$dirty}"
+ ng-model="datasource.interfaces.interfaces[0].endpoint"/>
+ <!-- <span>jdbc:sqlserver//localhost:80</span> -->
+ </div>
+ </div>
+ <div class="col-xs-24 plr0px">
+ <div class="col-xs-12">
+ <label class="light" tooltip="datasource.driver.jar">Driver Jar<mandatory-field></mandatory-field></label>
+ <div ng-repeat="jar in datasource.driver.jar track by $index" class="col-xs-24 plr0px">
+ <div class="col-xs-16 plr0px">
+ <input type="text" class="form-control" ng-model="jar.value"
+ validation-message="{{validations.messages.driver.jar}}"
+ ng-pattern="validations.patterns.driver"
+ ng-required="true"
+ />
+ </div>
+ <div class="col-xs-4" ng-if="!$first || !$last">
+ <a href="" class="driver-jar-link" ng-click="removeDriverJar($index)" ng-disabled="xmlPreview.edit">- Delete</a>
+ </div>
+ <div class="col-xs-4">
+ <a href="" class="driver-jar-link" ng-click="addDriverJar()" ng-disabled="xmlPreview.edit" ng-if="$last">+ Add</a>
+ </div>
+ </div>
+ </div>
+ <div class="col-xs-12">
+ <label class="light" tooltip="datasource.driver">Driver Class<mandatory-field></mandatory-field></label>
+ <input type="text" name="driverClass" class="form-control" ng-model="datasource.driver.clazz"
+ validation-message="{{validations.messages.driver.clazz}}"
+ ng-required="true"
+ ng-pattern="validations.patterns.driver"
+ />
+ </div>
+ </div>
+ <div class="col-xs-12 plr0px">
+ <div class="col-xs-24">
+ <label class="light">Type<mandatory-field></mandatory-field></label>
+ </div>
+ <div class="col-xs-24">
+ <input type="radio" ng-model="datasource.interfaces.interfaces[0].type" value="readonly" class="ml0" />
+ <label class="light mt5" tooltip="datasource.readMode">Read only</label>
+ <input type="radio" ng-model="datasource.interfaces.interfaces[0].type" value="write"/>
+ <label class="light mt5" tooltip="datasource.writeMode">Write</label>
+ </div>
+ <div class="col-xs-24 plr0px">
+ <div class="col-xs-24">
+ <label class="light" tooltip="datasource.interfaces.credentialType">Credential Type<mandatory-field></mandatory-field></label>
+ </div>
+ <div class="col-xs-24">
+ <input type="radio" ng-model="datasource.interfaces.interfaces[0].credential.type" ng-required="!datasource.interfaces.credential.type" value="password-text" class="ml0" />
+ <label class="light mt5" tooltip="datasource.interfaces.credentialType">Username / Password</label>
+ <input type="radio" ng-model="datasource.interfaces.interfaces[0].credential.type" ng-required="!datasource.interfaces.credential.type" value="password-file"/>
+ <label class="light mt5" tooltip="datasource.interfaces.credentialType">Password File</label>
+ <input type="radio" ng-model="datasource.interfaces.interfaces[0].credential.type" ng-required="!datasource.interfaces.credential.type" value="password-alias"/>
+ <label class="light mt5" tooltip="datasource.interfaces.credentialType">Password Alias</label>
+ <label class="col-xs-24 custom-danger validationMessageGral" ng-if="!datasource.interfaces.interfaces[0].credential.type">
+ {{validations.messages.credential.empty}}
+ </label>
+ </div>
+
+ <div class="col-xs-10" ng-if="datasource.interfaces.interfaces[0].credential.type">
+ <label class="light" tooltip="datasource.userName">Username<mandatory-field></mandatory-field></label>
+ <input type="text" class="form-control" ng-model="datasource.interfaces.interfaces[0].credential.userName"
+ ng-required="true"
+ validation-optional-message="{{validations.messages.userName}}"
+ ng-pattern="validations.patterns.userName"
+ />
+ </div>
+ <div class="col-xs-10" ng-if="datasource.interfaces.interfaces[0].credential.type == 'password-text'">
+ <label class="light" tooltip="datasource.password">Password<mandatory-field></mandatory-field></label>
+ <input type="text" class="form-control" ng-model="datasource.interfaces.interfaces[0].credential.passwordText"
+ ng-required="true"
+ validation-optional-message="{{validations.messages.dbPassword}}"
+ ng-pattern="validations.patterns.password"
+ />
+ </div>
+ <div class="col-xs-10" ng-if="datasource.interfaces.interfaces[0].credential.type == 'password-file'">
+ <label class="light" tooltip="datasource.credential.passwordFile">Password File<mandatory-field></mandatory-field></label>
+ <input type="text" class="form-control" ng-model="datasource.interfaces.interfaces[0].credential.passwordFile"
+ ng-required="true"
+ validation-optional-message="{{validations.messages.passwordFile}}"
+ ng-pattern="validations.patterns.password"
+ />
+ </div>
+ <div class="col-xs-10" ng-if="datasource.interfaces.interfaces[0].credential.type == 'password-alias'">
+ <label class="light" tooltip="datasource.password">Password Alias<mandatory-field></mandatory-field></label>
+ <input type="text" class="form-control" ng-model="datasource.interfaces.interfaces[0].credential.passwordAlias"
+ validation-optional-message="{{validations.messages.passwordAlias}}"
+ ng-required="true"
+ ng-pattern="validations.patterns.password"
+ />
+ </div>
+
+ <div class="col-xs-10" ng-if="datasource.interfaces.interfaces[0].credential.type == 'password-alias'">
+ <label class="light" tooltip="datasource.password">Provider Path<mandatory-field></mandatory-field></label>
+ <input type="text" class="form-control" ng-model="datasource.interfaces.interfaces[0].credential.providerPath"
+ validation-optional-message="{{validations.messages.providerPath}}"
+ ng-required="true"
+ ng-pattern="validations.patterns.password"
+ />
+ </div>
+ </div>
+ </div>
+ <div class="col-xs-24 plr0px">
+ <label class="col-xs-24" tooltip="datasource.properties">Sqoop Properties</label>
+ <div class="col-xs-12">
+ <input type="checkbox" class="ml0"
+ ng-model="((datasource.properties | filter:{name:'directMode'})[0]).value"
+ ng-disabled="xmlPreview.edit" />
+ <label class="light" tooltip="datasource.directMode">Direct</label>
+ <input type="checkbox"
+ ng-model="((datasource.properties | filter:{name:'verboseMode'})[0]).value"
+ ng-disabled="xmlPreview.edit" />
+ <label class="light" tooltip="datasource.verboseMode">Verbose</label>
+ </div>
+ </div>
+ <div class="col-xs-24 plr0px">
+ <div class="col-xs-24">
+ <a href="" class="datasource-link" ng-click="addProperty()" ng-disabled="xmlPreview.edit">+ Add Property</a>
+ </div>
+ <div class="row m0" ng-if="datasource.customProperties.length > 0">
+ <label class="col-xs-8">Property Name</label><label class="col-xs-16">Value</label>
+ </div>
+ <div ng-repeat="property in datasource.customProperties" class="row m0" ng-if="datasource.customProperties.length > 0">
+ <div class="col-xs-8 dynamic-table-spacer">
+ <input type="text" class="form-control" ng-model="property.name"
+ ng-pattern="validations.patterns.propertyName"
+ validation-optional-message="{{validations.messages.name}}"
+ ng-disabled="xmlPreview.edit"
+ ng-required="property.value" placeholder="name" />
+ </div>
+ <div class="col-xs-8 dynamic-table-spacer">
+ <input type="text" class="form-control" ng-model="property.value"
+ validation-optional-message="{{validations.messages.value}}"
+ ng-disabled="xmlPreview.edit"
+ ng-required="property.name" placeholder="value" />
+ </div>
+ <div class="dynamic-table-spacer">
+ <button type="button" class="btn btn-default btn-xs" ng-click="removeProperty($index)"
+ ng-disabled="xmlPreview.edit">
+ <span class="entypo minus"></span> delete
+ </button>
+ </div>
+ </div>
+</div>
+</div>
+<div class="col-xs-24 plr0px">
+ <div class="col-xs-12">
+ <label class="light" tooltip="datasource.parameterFile">Sqoop Parameter File</label>
+ <div class="form-inline">
+ <input type="text" class="form-control" ng-disabled="xmlPreview.edit"
+ ng-model="((datasource.properties | filter:{name:'parameterFile'})[0]).value"
+ validation-optional-message="{{validations.messages.parameterFile}}"/>
+ <!-- <button type="button" class="btn btn-sharp btn-browse" ng-disabled="xmlPreview.edit" ng-click="">
+ <i>Browse</i>
+ </button> -->
+ <!-- <a href="" class="datasource-link" ng-click="addParameter()" ng-disabled="xmlPreview.edit">+ Add Parameters</a> -->
+ <!-- <div class="pull-right">
+ <label class="light" tooltip="datasource.parameters">Parameters</label>
+ <a href="" class="datasource-link">+ Add Parameters</a>
+ </div>
+</div> -->
+<!-- <div class="form-inline pull-right">
+<label class="light" tooltip="datasource.parameterFile">Parameter File</label>
+<input type="text" class="form-control" ng-disabled="xmlPreview.edit"
+ng-model="datasource.parameterFile"
+validation-optional-message="{{validations.messages.parameterFile}}"/>
+<button type="button" class="btn btn-sharp btn-browse" ng-disabled="xmlPreview.edit" ng-click="">
+<i>Browse</i>
+</button>
+</div> -->
+</div>
+</div>
+</div>
+
+<div class="col-xs-12 plr0px">
+ <div class="row m0" ng-if="datasource.parameters.length > 0">
+ <label class="col-xs-8">Parameter Name</label><label class="col-xs-16">Value</label>
+ </div>
+ <div ng-repeat="parameter in datasource.parameters" class="row m0" ng-if="datasource.parameters.length > 0">
+ <div class="col-xs-8 dynamic-table-spacer">
+ <input type="text" class="form-control" ng-model="parameter.name"
+ ng-pattern="validations.patterns.propertyName"
+ validation-optional-message="{{validations.messages.name}}"
+ ng-disabled="xmlPreview.edit"
+ ng-required="parameter.value" placeholder="name" />
+ </div>
+ <div class="col-xs-8 dynamic-table-spacer">
+ <input type="text" class="form-control" ng-model="parameter.value"
+ validation-optional-message="{{validations.messages.value}}"
+ ng-disabled="xmlPreview.edit"
+ ng-required="parameter.name" placeholder="value" />
+ </div>
+ <div class="dynamic-table-spacer">
+ <button type="button" class="btn btn-default btn-xs" ng-click="removeParameter($index)"
+ ng-disabled="xmlPreview.edit">
+ <span class="entypo minus"></span> delete
+ </button>
+ </div>
+</div>
+</div>
+<!-- <div class="pull-right">
+<label class="light" tooltip="datasource.properties">Properties</label>
+<a href="" class="datasource-link">+ Add Properties</a>
+</div> -->
+
+ <div class="col-xs-24 advancedOption" ng-click="expandOptions = !expandOptions" id="snapshotAdvancedOption">
+ <label class="mt15 pointer blink-success">ADVANCED OPTIONS</label>
+ <i class="glyphicon glyphicon-chevron-down mt15" ng-if="!expandOptions"></i>
+ <i class="glyphicon glyphicon-chevron-up mt15" ng-if="expandOptions"></i>
+ </div>
+
+ <div id="advancedOptionsBox" class="col-xs-24 plr0px" ng-class="{expanded:expandOptions}">
+ <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>
+
+ <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">
+ <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>
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/datasource/datasourceFormSummaryStepTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/datasource/datasourceFormSummaryStepTpl.html b/falcon-ui/app/html/datasource/datasourceFormSummaryStepTpl.html
new file mode 100644
index 0000000..29923f9
--- /dev/null
+++ b/falcon-ui/app/html/datasource/datasourceFormSummaryStepTpl.html
@@ -0,0 +1,113 @@
+<!--
+/**
+ * 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="row datasourceSummaryRow" id="datasourceSummaryStep">
+ <h4 class="col-sm-24">
+ General
+ </h4>
+ <div class="col-sm-24">
+ <label>Connection Name</label>: <span>{{datasource.name}}</span>
+ </div>
+ <div class="col-sm-24">
+ <label>Data Center or Colo Name</label>: <span>{{datasource.colo}}</span>
+ </div>
+ <div class="col-sm-24">
+ <label>Description</label>: <span>{{datasource.description}}</span>
+ </div>
+ <div class="col-sm-24">
+ <label>Type</label>: <span>{{datasource.type}}</span>
+ </div>
+
+ <h4 class="col-sm-24">
+ Interfaces
+ </h4>
+ <div class="col-sm-24 plr0px" ng-repeat="interface in datasource.interfaces.interfaces">
+ <div class="col-sm-24">
+ <label>Interface Type</label>: <span>{{interface.type}}</span>
+ </div>
+ <div class="col-sm-24">
+ <label>Interface Endpoint</label>: <span>{{interface.endpoint}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type != ''">
+ <label>Interface Credentials</label>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type != ''">
+ <label>Credential Type</label>: <span>{{interface.credential.type}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type == 'password-text'">
+ <label>User Name</label>: <span>{{interface.credential.userName}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type == 'password-text'">
+ <label>Password Text</label>: <span>{{interface.credential.passwordText}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type == 'password-file'">
+ <label>Password File</label>: <span>{{interface.credential.passwordFile}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type == 'password-alias'">
+ <label>Password Alias</label>: <span>{{interface.credential.passwordAlias}}</span>
+ </div>
+ </div>
+
+ <h4 class="col-sm-24" ng-if="datasource.interfaces.credential.type != ''">
+ Default Credentials
+ </h4>
+ <div class="col-sm-24" ng-if="datasource.interfaces.credential.type != ''">
+ <label>Credential Type</label>: <span>{{datasource.interfaces.credential.type}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-text'">
+ <label>User Name</label>: <span>{{datasource.interfaces.credential.userName}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-text'">
+ <label>Password Text</label>: <span>{{datasource.interfaces.credential.passwordText}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-file'">
+ <label>Password File</label>: <span>{{datasource.interfaces.credential.passwordFile}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-alias'">
+ <label>Password Alias</label>: <span>{{datasource.interfaces.credential.passwordAlias}}</span>
+ </div>
+
+ <h4 class="col-sm-24">
+ Properties
+ </h4>
+ <div class="col-sm-24" ng-repeat="property in datasource.customProperties | filter: {name: '!!'}">
+ <label>{{property.name}}</label>: <span>{{property.value}}</span>
+ </div>
+ <div ng-repeat="property in datasource.properties">
+ <div class="col-sm-24" ng-if="property.value && property.value !== ''">
+ <label>{{property.name}}</label>: <span>{{property.value}}</span>
+ </div>
+ </div>
+</div>
+
+<div class="col-xs-24 mt35 pb15px pl0px">
+ <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.step2" class="btn nextBtn" ng-click="saveEntity()" focus-if>
+ SAVE <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
+ </button>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/datasource/datasourceFormTpl.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/datasource/datasourceFormTpl.html b/falcon-ui/app/html/datasource/datasourceFormTpl.html
new file mode 100644
index 0000000..7a0b7ec
--- /dev/null
+++ b/falcon-ui/app/html/datasource/datasourceFormTpl.html
@@ -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 class="datasourceForm">
+ <div class="col-xs-24">
+ <div class="preview pullOver">
+ <button type="button" class="btn btn-default btn-md pull-right nextBtn" ng-click="toggleclick()" >Preview XML</button>
+ </div>
+ <br/>
+ <div>
+ <div class=" formBoxContainer detailsBox">
+ <div class="datasourceProgressBox" ng-class="{
+ general:isActive('forms.datasource.general'),
+ summary:isActive('forms.datasource.summary')
+ }">
+ <div class="progressBar col-xs-24">
+ <div class="text-center fir" ng-class="{
+ active:isActive('forms.datasource.general'),
+ completed:isCompleted('forms.datasource.general')}">General</div>
+ <div class="text-center fif" ng-class="{
+ active:isActive('forms.datasource.summary'),
+ completed:isCompleted('forms.datasource.summary')}">Summary</div>
+ </div>
+ </div>
+ <div class="row customContainer">
+ <div class="col-xs-offset-1 col-xs-22">
+ <fieldset ng-disabled="!editXmlDisabled">
+ <div class="formViewContainer">
+ <div class="col-xs-24">
+ <label class="title"><span class="entypo download icon-lg entypo-align-sub"></span> NEW DATA SOURCE</label>
+ </div>
+ <div ui-view></div>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ </div>
+
+ <div class="hide xmlPreviewContainer detailsBox">
+ <div class="row dt">
+ <div class="col-xs-24 pt15px">
+ <div class="col-xs-13 noSpecial">
+ <h5>XML Preview</h5>
+ <label style="margin-top: -10px;margin-bottom: -2px;" ng-if="invalidXml" class="custom-danger">Invalid Xml</label>
+ </div>
+
+ <div class="pull-right">
+ <button type="button"
+ id="datasource.editXML"
+ class="btn btn-default btn-xs"
+ ng-click="toggleEditXml()"
+ ng-class="{'btn-warning':!editXmlDisabled}"
+ ng-disabled="invalidXml">
+ <div ng-if="editXmlDisabled">Edit XML</div>
+ <div ng-if="!editXmlDisabled">Finish</div>
+ </button>
+
+ <button type="button"
+ class="btn btn-default btn-xs"
+ ng-if="invalidXml"
+ ng-click="revertXml()">
+ <div>Revert</div>
+ </button>
+ </div>
+ </div>
+ <div class="col-sm-24 showValidationStyle">
+ <textarea ng-model="prettyXml"
+ elastic
+ class="form-control"
+ ng-disabled="editXmlDisabled"
+ ng-class="{fakeInvalid:invalidXml}">
+ </textarea>
+ <!--{{xmlEditValidationError}}-->
+ </div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/datasource/datasourceSummary.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/datasource/datasourceSummary.html b/falcon-ui/app/html/datasource/datasourceSummary.html
new file mode 100644
index 0000000..69e68f8
--- /dev/null
+++ b/falcon-ui/app/html/datasource/datasourceSummary.html
@@ -0,0 +1,95 @@
+<!--
+/**
+ * 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="datasourceFormSummary">
+ <h4 class="col-sm-24">
+ General
+ </h4>
+ <div class="col-sm-24">
+ <label>Connection Name</label>: <span>{{datasource.name}}</span>
+ </div>
+ <div class="col-sm-24">
+ <label>Data Center or Colo Name</label>: <span>{{datasource.colo}}</span>
+ </div>
+ <div class="col-sm-24">
+ <label>Description</label>: <span>{{datasource.description}}</span>
+ </div>
+ <div class="col-sm-24">
+ <label>Type</label>: <span>{{datasource.type}}</span>
+ </div>
+
+ <h4 class="col-sm-24">
+ Interfaces
+ </h4>
+ <div class="col-sm-24 plr0px" ng-repeat="interface in datasource.interfaces.interfaces">
+ <div class="col-sm-24">
+ <label>Interface Type</label>: <span>{{interface.type}}</span>
+ </div>
+ <div class="col-sm-24">
+ <label>Interface Endpoint</label>: <span>{{interface.endpoint}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type != ''">
+ <label>Interface Credentials</label>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type != ''">
+ <label>Credential Type</label>: <span>{{interface.credential.type}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type == 'password-text'">
+ <label>User Name</label>: <span>{{interface.credential.userName}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type == 'password-text'">
+ <label>Password Text</label>: <span>{{interface.credential.passwordText}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type == 'password-file'">
+ <label>Password File</label>: <span>{{interface.credential.passwordFile}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="interface.credential.type == 'password-alias'">
+ <label>Password Alias</label>: <span>{{interface.credential.passwordAlias}}</span>
+ </div>
+ </div>
+
+ <h4 class="col-sm-24" ng-if="datasource.interfaces.credential.type != ''">
+ Default Credentials
+ </h4>
+ <div class="col-sm-24" ng-if="datasource.interfaces.credential.type != ''">
+ <label>Credential Type</label>: <span>{{datasource.interfaces.credential.type}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-text'">
+ <label>User Name</label>: <span>{{datasource.interfaces.credential.userName}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-text'">
+ <label>Password Text</label>: <span>{{datasource.interfaces.credential.passwordText}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-file'">
+ <label>Password File</label>: <span>{{datasource.interfaces.credential.passwordFile}}</span>
+ </div>
+ <div class="col-sm-24" ng-if="datasource.interfaces.credential.type == 'password-alias'">
+ <label>Password Alias</label>: <span>{{datasource.interfaces.credential.passwordAlias}}</span>
+ </div>
+
+ <h4 class="col-sm-24">
+ Properties
+ </h4>
+ <div class="col-sm-24" ng-repeat="property in datasource.customProperties">
+ <label>{{property.name}}</label>: <span>{{property.value}}</span>
+ </div>
+ <div class="col-sm-24" ng-repeat="property in datasource.properties">
+ <label>{{property.name}}</label>: <span>{{property.value}}</span>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/aclPermissions.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/aclPermissions.html b/falcon-ui/app/html/directives/aclPermissions.html
new file mode 100644
index 0000000..13e4b50
--- /dev/null
+++ b/falcon-ui/app/html/directives/aclPermissions.html
@@ -0,0 +1,45 @@
+<!--
+/**
+ * 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 plr0px panel panel-default aclPermission">
+ <div class="col-xs-24 plr0px">
+ <span class="col-xs-4"></span>
+ <span class="col-xs-4 font11px pt5px">Read</span>
+ <span class="col-xs-4 font11px pt5px">Write</span>
+ <span class="col-xs-4 font11px pt5px">Execute</span>
+ </div>
+ <div class="col-xs-24 plr0px">
+ <span class="col-xs-4 font11px pt5px">Owner</span>
+ <span class="col-xs-4"><input type="checkbox" name="owner" value="4" ng-click="calculatePermission('owner')" ng-disabled="xmlPreview.edit"></span>
+ <span class="col-xs-4"><input type="checkbox" name="owner" value="2" ng-click="calculatePermission('owner')" ng-disabled="xmlPreview.edit"></span>
+ <span class="col-xs-4"><input type="checkbox" name="owner" value="1" ng-click="calculatePermission('owner')" ng-disabled="xmlPreview.edit"></span>
+ </div>
+ <div class="col-xs-24 plr0px">
+ <span class="col-xs-4 font11px pt5px">Group</span>
+ <span class="col-xs-4"><input type="checkbox" name="groups" value="4" ng-click="calculatePermission('groups')" ng-disabled="xmlPreview.edit"></span>
+ <span class="col-xs-4"><input type="checkbox" name="groups" value="2" ng-click="calculatePermission('groups')" ng-disabled="xmlPreview.edit"></span>
+ <span class="col-xs-4"><input type="checkbox" name="groups" value="1" ng-click="calculatePermission('groups')" ng-disabled="xmlPreview.edit"></span>
+ </div>
+ <div class="col-xs-24 plr0px">
+ <span class="col-xs-4 font11px pt5px">Others</span>
+ <span class="col-xs-4"><input type="checkbox" name="others" value="4" ng-click="calculatePermission('others')" ng-disabled="xmlPreview.edit"></span>
+ <span class="col-xs-4"><input type="checkbox" name="others" value="2" ng-click="calculatePermission('others')" ng-disabled="xmlPreview.edit"></span>
+ <span class="col-xs-4"><input type="checkbox" name="others" value="1" ng-click="calculatePermission('others')" ng-disabled="xmlPreview.edit"></span>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/dependenciesGraphDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/dependenciesGraphDv.html b/falcon-ui/app/html/directives/dependenciesGraphDv.html
index 7fbba06..9b263fd 100644
--- a/falcon-ui/app/html/directives/dependenciesGraphDv.html
+++ b/falcon-ui/app/html/directives/dependenciesGraphDv.html
@@ -16,4 +16,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
--->
\ No newline at end of file
+-->
+<svg >
+ <g/>
+</svg>
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/entitiesListDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/entitiesListDv.html b/falcon-ui/app/html/directives/entitiesListDv.html
index 7016de1..f791e50 100644
--- a/falcon-ui/app/html/directives/entitiesListDv.html
+++ b/falcon-ui/app/html/directives/entitiesListDv.html
@@ -52,9 +52,9 @@
<span class="entypo play"></span> <div>Resume</div>
</div>
<div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-hide="selectedDisabledButtons.suspend" ng-if="type !== 'cluster'">
- <span class="entypo paus"></span> <div>Suspend</div>
+ <span class="entypo paus"></span> <div>Pause</div>
</div>
- <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeEdit()" ng-hide="selectedRows.length === 0 || selectedRows.length > 1" ng-if="type !== 'cluster'">
+ <div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeEdit()" ng-hide="selectedRows.length === 0 || selectedRows.length > 1">
<span class="entypo cog"></span> <div>Edit</div>
</div>
<div class="btn btn-default btn-xs buttons-to-show" ng-click="scopeClone()" ng-hide="selectedRows.length === 0 || selectedRows.length > 1">
@@ -68,6 +68,8 @@
</div>
</td>
</tr>
+ </tbody>
+ <tbody>
<tr ng-if="input.length === 0 && !server.responses.listLoaded[type]">
<td> loading {{ type }}s </td>
</tr>
@@ -104,4 +106,4 @@
</tr>
</tbody>
-</table>
\ No newline at end of file
+</table>
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/entitiesSearchListDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/entitiesSearchListDv.html b/falcon-ui/app/html/directives/entitiesSearchListDv.html
index 3e356fc..30dee7c 100644
--- a/falcon-ui/app/html/directives/entitiesSearchListDv.html
+++ b/falcon-ui/app/html/directives/entitiesSearchListDv.html
@@ -22,31 +22,39 @@
<table class="listTable table" id="entitiesSearchList">
<thead>
<tr>
- <th><div class="filtersSearchBox"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
+ <th><div class="filtersSearchBox pointer"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
<th><div class="filtersSearchBox pointer" ng-click="toggleSortOrder()">Name <span class="glyphicon glyphicon-sort"></span></div> </th>
<th><div class="filtersSearchBox">Tags</div></th>
- <th><div class="filtersSearchBox">Cluster</div></th>
- <th><div class="filtersSearchBox">Type</div></th>
- <th><div class="filtersSearchBox">Status</div></th>
+ <th ng-if="$parent.$parent.$parent.entityType != 'cluster'"><div class="filtersSearchBox">Cluster</div></th>
+ <th ng-if="$parent.$parent.$parent.entityType != 'cluster'"><div class="filtersSearchBox">Type</div></th>
+ <th ng-if="$parent.$parent.$parent.entityType != 'cluster'"><div class="filtersSearchBox">Status</div></th>
</tr>
+
</thead>
<tbody>
<tr ng-if="input.length > 0" class="buttonsRow">
<td class="buttonCell" colspan="9">
- <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSchedule()" ng-disabled="selectedDisabledButtons.schedule">
+ <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSchedule()" ng-disabled="selectedDisabledButtons.schedule"
+ ng-if="$parent.$parent.$parent.entityType != 'cluster'">
<span class="entypo play"></span> <div>Schedule</div>
</div>
- <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selectedDisabledButtons.resume">
+ <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selectedDisabledButtons.resume"
+ ng-if="$parent.$parent.$parent.entityType != 'cluster'">
<span class="entypo play"></span> <div>Resume</div>
</div>
- <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-disabled="selectedDisabledButtons.suspend">
- <span class="entypo paus"></span> <div>Suspend</div>
+ <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-disabled="selectedDisabledButtons.suspend"
+ ng-if="$parent.$parent.$parent.entityType != 'cluster'">
+ <span class="entypo paus"></span> <div>Pause</div>
</div>
- <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeEdit()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
+ <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeEdit()"
+ ng-disabled="selectedRows.length === 0 || selectedRows.length > 1 || ($parent.$parent.$parent.entityType === 'cluster' && (!isSafeMode() || !isSuperUser()))"
+ ng-class="{disabledEditBtn: $parent.$parent.$parent.entityType === 'cluster' && (!isSafeMode() || !isSuperUser())}"
+ title="{{($parent.$parent.$parent.entityType === '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="scopeClone()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
+ <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeClone()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1"
+ ng-if="$parent.$parent.$parent.entityType != 'cluster'">
<span class="entypo docs"></span> <div>Copy</div>
</div>
<div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeRemove()" ng-disabled="selectedRows.length === 0">
@@ -57,7 +65,8 @@
</div>
</td>
</tr>
-
+ </tbody>
+ <tbody>
<tr ng-if="input.length === 0 && !server.responses.listLoaded">
<td> loading... </td>
</tr>
@@ -72,14 +81,15 @@
ng-class="{
firstEntityRow:$first, lastEntityRow:$last,
rowSelected:checkedRow(item.name)
- }">
+ }"
+ ng-class-odd="'oddRow'" ng-class-even="'evenRow'">
<td class="checkboxCell">
<input type="checkbox" checklist-model="selectedRows" ng-model="$index"
checklist-value="{name:item.name, type:item.type, status:item.status}"
ng-change="checkButtonsToShow()"/>
</td>
<td class="nameCell" ng-init="entityType = item.type | uppercase">
- <button type="button" class="btn btn-default" ng-click="goEntityDetails(item.name, item.type)">
+ <button type="button" class="btn btn-link" ng-click="goEntityDetails(item.name, item.type)">
<span ng-class="displayIcon((item.type | uppercase), item.tags.tag)"></span> {{ item.name }}
</button>
</td>
@@ -88,17 +98,17 @@
{{ tag }}{{$last ? '' : ', '}}
</span>
</td>
- <td>
+ <td ng-if="$parent.$parent.$parent.entityType != 'cluster'">
<span ng-repeat="cluster in item.clusters.cluster">
{{ cluster }}{{$last ? '' : ', '}}
</span>
</td>
- <td>
+ <td ng-if="$parent.$parent.$parent.entityType != 'cluster'">
<span ng-repeat="tag in item.tags.tag" ng-init="type = displayType(tag)">
{{ type | uppercase}}
</span>
</td>
- <td class="stateCell">
+ <td class="stateCell" ng-if="$parent.$parent.$parent.entityType != 'cluster'">
<span ng-class="{'blink-success': item.status == 'RUNNING',
'text-success': item.status == 'SUCCEEDED',
'blink-warning': item.status == 'SUSPENDED',
@@ -114,7 +124,7 @@
</td>
</tr>
- <tr>
+ <tr class="paginationRow">
<td colspan="9">
<nav class="pull-right">
<ul class="pagination">
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/feedFormHdfsStorage.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/feedFormHdfsStorage.html b/falcon-ui/app/html/directives/feedFormHdfsStorage.html
new file mode 100644
index 0000000..143d155
--- /dev/null
+++ b/falcon-ui/app/html/directives/feedFormHdfsStorage.html
@@ -0,0 +1,139 @@
+<!--
+/**
+* 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 plr0px">
+ <div class="col-xs-10 plr0px">
+ <div class="col-xs-24">
+ <label class="light">Cluster<mandatory-field></mandatory-field></label>
+ </div>
+ <div class="col-xs-24">
+ <select ng-model="cluster.name" name="clusterName"
+ class="form-control padding0" ng-required="required"
+ ng-change="findClusterExists(cluster.name, cluster.type, storageInfo.feedClusters)"
+ validation-message="{{validations.messages.cluster}}">
+ <option value="" disabled style='display:none;'>-Select {{cluster.type}} cluster-</option>
+ <option ng-repeat="clusterItem in storageInfo.clustersList"
+ value="{{clusterItem.name}}" ng-selected="cluster.name === clusterItem.name">
+ {{clusterItem.name}}
+ </option>
+ </select>
+ </div>
+ <div class="col-xs-24 custom-danger" ng-show="checkDuplicateClusterOnTarget()">
+ Target cannot be the same as the Source
+ </div>
+ <div class="col-xs-24 custom-danger" ng-show="clusterExists">
+ Cluster is already added
+ </div>
+ <div class="col-xs-24">
+ <label class="light">Data Path<mandatory-field></mandatory-field></label>
+ </div>
+ <div ng-repeat="location in cluster.storage.fileSystem.locations">
+ <div class="col-xs-24" ng-if="location.type==='data'">
+ <input type="text" name="dataPath"
+ placeholder="Enter Data Path"
+ ng-required="cluster.name"
+ validation-optional-message="{{validations.messages.path}}"
+ class="form-control"
+ ng-model="location.path" />
+ </div>
+ </div>
+ <div class="col-xs-24">
+ <a href="" ng-click="toggleAdvancedOptions()">MORE OPTIONS ></a>
+ </div>
+ </div>
+ <div class="col-xs-12 plr0px">
+ <div class="datasourceBox" ng-show="showingAdvancedOptions">
+ <div class="col-xs-24">
+ <label class="light">Statistics Path</label>
+ </div>
+ <div ng-repeat="location in cluster.storage.fileSystem.locations">
+ <div class="col-xs-24" ng-if="location.type==='stats'">
+ <input type="text" class="form-control" ng-model="location.path"/>
+ </div>
+ </div>
+ <div class="col-xs-24 validityBox plr0px">
+ <div class="col-xs-24 plr0px">
+ <div class="col-xs-12 startDateBox">
+ <label class="light">Start<mandatory-field></mandatory-field></label>
+ <input type="text"
+ name="startDateInput"
+ class="form-control dateInput"
+ placeholder="{{dateFormat | lowercase}}"
+ ng-model="cluster.validity.start.date"
+ simple-date-picker />
+ </div>
+ <div class="col-xs-12 startTimeBox">
+ <label class="light">Time<mandatory-field></mandatory-field></label>
+ <timepicker ng-change="constructDate()"
+ ng-model="cluster.validity.start.time"
+ hour-step="1"
+ minute-step="1"
+ show-meridian="true">
+ </timepicker>
+ </div>
+ </div>
+ <label class="col-xs-24 custom-danger validationMessageGral" ng-if="!cluster.validity.start.date">
+ {{validations.messages.date.empty}}
+ </label>
+ <div class="col-xs-24 plr0px">
+ <div class="col-xs-12 endDateBox">
+ <label class="light">End<mandatory-field></mandatory-field></label>
+ <input type="text"
+ name="startDateInput"
+ class="form-control dateInput"
+ placeholder="{{dateFormat | lowercase}}"
+ ng-model="cluster.validity.end.date"
+ simple-date-picker />
+ </div>
+ <div class="col-xs-12 endTimeBox">
+ <label class="light">Time<mandatory-field></mandatory-field></label>
+ <timepicker ng-change="constructDate()"
+ ng-model="cluster.validity.end.time"
+ hour-step="1"
+ minute-step="1"
+ show-meridian="true">
+ </timepicker>
+ </div>
+ </div>
+ <label class="col-xs-24 custom-danger validationMessageGral" ng-if="!cluster.validity.end.date">
+ {{validations.messages.date.empty}}
+ </label>
+ </div>
+ <label class="light col-xs-24">Retention<mandatory-field></mandatory-field></label>
+ <div class="col-xs-24 inlineInputsGroup">
+ <input type="text" class="form-control" ng-model="cluster.retention.quantity"
+ ng-keydown="validations.acceptOnlyNumber($event)" ng-pattern="validations.patterns.twoDigits" />
+ <select ng-model="cluster.retention.unit">
+ <option selected value="minutes">minutes</option>
+ <option value="hours">hours</option>
+ <option value="days">days</option>
+ <option value="months">months</option>
+ </select>
+ </div>
+ </div>
+ </div>
+</div>
+<div class="col-xs-24 mt10">
+ <a ng-click="reset()" ng-if="!storageInfo.readOnly">Reset</a>
+ <button class="btn datasourceBtn" ng-if="!storageInfo.readOnly"
+ ng-disabled="cluster.name==='' || !cluster.storage.fileSystem.locations[0].path || cluster.storage.fileSystem.locations[0].path ==='' || clusterExists"
+ ng-click="addCluster({type : storageInfo.type, dataTransferType : 'hdfs'})">Add {{buttonText}}</button>
+ <button class="btn datasourceBtn" ng-click="deleteCluster()"
+ ng-if="(storageInfo.feedClusters | filter:{type: cluster.type}).length > 1">Delete</button>
+</div>
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/feedFormHiveStorage.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/feedFormHiveStorage.html b/falcon-ui/app/html/directives/feedFormHiveStorage.html
new file mode 100644
index 0000000..655a973
--- /dev/null
+++ b/falcon-ui/app/html/directives/feedFormHiveStorage.html
@@ -0,0 +1,132 @@
+<!--
+/**
+* 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 plr0px">
+ <div class="col-xs-10 plr0px">
+ <div class="datasourceBox">
+ <div class="col-xs-24">
+ <label class="light">Cluster<mandatory-field></mandatory-field></label>
+ </div>
+ <div class="col-xs-24">
+ <select ng-model="cluster.name" class="form-control padding0" ng-required="required"
+ ng-change="findClusterExists(cluster.name, cluster.type, storageInfo.feedClusters)"
+ validation-message="{{validations.messages.cluster}}">
+ <option value="" disabled style='display:none;'>-Select {{cluster.type}} cluster-</option>
+ <option ng-repeat="clusterItem in storageInfo.clustersList"
+ value="{{clusterItem.name}}" ng-selected="cluster.name === clusterItem.name">
+ {{clusterItem.name}}
+ </option>
+ </select>
+ </div>
+ <div class="col-xs-24 custom-danger" ng-show="checkDuplicateClusterOnTarget()">
+ Target cannot be the same as the Source
+ </div>
+ <div class="col-xs-24 custom-danger" ng-show="clusterExists">
+ Cluster is already added
+ </div>
+ <div class="col-xs-24">
+ <label class="light" tooltip="feed.storage.tableUri">
+ Table URI<mandatory-field></mandatory-field>
+ </label>
+ </div>
+ <div class="col-xs-24">
+ <input type="text"
+ placeholder="Enter table uri"
+ class="form-control"
+ ng-required="cluster.name"
+ validation-optional-message="{{validations.messages.tableUri}}"
+ ng-model="cluster.storage.catalog.catalogTable.uri" />
+ </div>
+ <div class="col-xs-24">
+ <a href="" ng-click="toggleAdvancedOptions()">MORE OPTIONS ></a>
+ </div>
+ </div>
+ </div>
+ <div class="col-xs-12 plr0px">
+ <div class="datasourceBox" ng-show="showingAdvancedOptions">
+ <div class="col-xs-24 validityBox plr0px">
+ <div class="col-xs-24 plr0px">
+ <div class="col-xs-12 startDateBox">
+ <label class="light">Start<mandatory-field></mandatory-field></label>
+ <input type="text"
+ name="startDateInput"
+ class="form-control dateInput"
+ placeholder="{{dateFormat | lowercase}}"
+ ng-model="cluster.validity.start.date"
+ simple-date-picker />
+ </div>
+ <div class="col-xs-12 startTimeBox">
+ <label class="light">Time<mandatory-field></mandatory-field></label>
+ <timepicker ng-change="constructDate()"
+ ng-model="cluster.validity.start.time"
+ hour-step="1"
+ minute-step="1"
+ show-meridian="true">
+ </timepicker>
+ </div>
+ </div>
+ <label class="col-xs-24 custom-danger validationMessageGral" ng-if="!cluster.validity.start.date">
+ {{validations.messages.date.empty}}
+ </label>
+ <div class="col-xs-24 plr0px">
+ <div class="col-xs-12 endDateBox">
+ <label class="light">End<mandatory-field></mandatory-field></label>
+ <input type="text"
+ name="startDateInput"
+ class="form-control dateInput"
+ placeholder="{{dateFormat | lowercase}}"
+ ng-model="cluster.validity.end.date"
+ simple-date-picker />
+ </div>
+ <div class="col-xs-12 endTimeBox">
+ <label class="light">Time<mandatory-field></mandatory-field></label>
+ <timepicker ng-change="constructDate()"
+ ng-model="cluster.validity.end.time"
+ hour-step="1"
+ minute-step="1"
+ show-meridian="true">
+ </timepicker>
+ </div>
+ </div>
+ <label class="col-xs-24 custom-danger validationMessageGral" ng-if="!cluster.validity.end.date">
+ {{validations.messages.date.empty}}
+ </label>
+ </div>
+ <label class="light col-xs-24">Retention<mandatory-field></mandatory-field></label>
+ <div class="col-xs-24 inlineInputsGroup">
+ <input type="text" class="form-control" ng-required="required" ng-model="cluster.retention.quantity" ng-keydown="validations.acceptOnlyNumber($event)" ng-pattern="validations.patterns.twoDigits">
+ <select ng-model="cluster.retention.unit" ng-keydown="validations.acceptOnlyNumber({$event:$event})" ng-required="required">
+ <option selected value="minutes">minutes</option>
+ <option value="hours">hours</option>
+ <option value="days">days</option>
+ <option value="months">months</option>
+ </select>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="col-xs-24 mt10">
+ <a ng-click="reset()" ng-if="!storageInfo.readOnly">Reset</a>
+ <button class="btn datasourceBtn" ng-if="!storageInfo.readOnly"
+ ng-disabled="cluster.name === '' || !cluster.storage.catalog.catalogTable.uri || $scope.cluster.name === '' || $scope.cluster.storage.catalog.catalogTable.uri==='' || clusterExists"
+ ng-click="addCluster({type : storageInfo.type, dataTransferType : 'hive'})">Add {{buttonText}}</button>
+ <button class="btn datasourceBtn" ng-click="deleteCluster()"
+ ng-if="(storageInfo.feedClusters | filter:{type: cluster.type}).length > 1">Delete</button>
+</div>
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/instancesListDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/instancesListDv.html b/falcon-ui/app/html/directives/instancesListDv.html
index 5abc9d3..a3cc193 100644
--- a/falcon-ui/app/html/directives/instancesListDv.html
+++ b/falcon-ui/app/html/directives/instancesListDv.html
@@ -17,34 +17,28 @@
* limitations under the License.
*/
-->
-<table class="listTable table" id="instancesList">
+<table class="listTable table">
<thead>
<tr>
- <th><div class="filtersSearchBox vertical-align"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
- <th><div class="filtersSearchBox vertical-align">Instance</div></th>
- <th><div class="filtersSearchBox">Started <span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('startTime')"></span>
- <input type="text" class="form-control dateInput" ng-model="startFilter" ng-keypress="validateDate($event, 'start');"
- ng-enter="filterInstances('startTime')" placeholder="mm/dd/yyyy hh:mm">
- <label class="error" ng-if="startFilterError">Incorrect Date Format</label>
- <label class="error" ng-if="startAfterEndError">Start date should be before end date</label>
- <label class="error" ng-if="startAfterNominalError">Start date should be after nominal start date {{ start }}</label>
- <label class="error" ng-if="startBeforeNominalError">Start date should be before nominal end date {{ end }}</label>
+ <th class="align-top"><div class="filtersSearchBox vertical-align pt35px"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
+ <th class="align-top"><div class="filtersSearchBox vertical-align">Instance</div>
+ <input type="text" class="form-control" placeholder="instance" restrict="reject">
+ </th>
+ <th class="align-top"><div class="filtersSearchBox" ng-class="{showMessage:!startDateValid, showValidationStyle :!startDateValid, validationMessageParent:!startDateValid}">Started <span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('startTime')"></span>
+ <input type="text" title="Date should be entered in {{dateFormat | lowercase}} format." class="form-control dateInput" ng-model="startFilter" ng-enter="filterInstances('startTime')" placeholder="{{dateFormat | lowercase}}" ng-keypress="validateDate($event,'start')">
+ <label class="custom-danger validationMessageGral" ng-if="!startDateValid">You need to provide a valid date</label>
</div></th>
- <th><div class="filtersSearchBox">Ended <span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('endTime')"></span>
- <input type="text" class="form-control dateInput" ng-model="endFilter" ng-keypress="validateDate($event, 'end');"
- ng-enter="filterInstances('endTime')" placeholder="mm/dd/yyyy hh:mm">
- <label class="error" ng-if="endFilterError">Incorrect Date Format</label>
- <label class="error" ng-if="endAfterNominalError">End date should be after nominal start date {{ start }}</label>
- <label class="error" ng-if="endBeforeNominalError">End date should be before nominal end date {{ end }}</label>
+ <th class="align-top"><div class="filtersSearchBox" ng-class="{showMessage:!endDateValid, showValidationStyle :!endDateValid, validationMessageParent:!endDateValid}">Ended <span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('endTime')"></span>
+ <input type="text" title="Date should be entered in {{dateFormat | lowercase}} format." class="form-control dateInput" ng-model="endFilter" ng-enter="filterInstances('startTime')" placeholder="{{dateFormat | lowercase}}" ng-keypress="validateDate($event,'end')">
+ <label class="custom-danger validationMessageGral" ng-if="!endDateValid">You need to provide a valid date</label>
</div></th>
- <th>
+ <th class="align-top">
<div class="filtersSearchBox">Status <span class="glyphicon glyphicon-sort pointer" ng-click="filterInstances('status')"></span>
<select class="form-control padding0" ng-model="statusFilter" ng-change="filterInstances('startTime')">
<option value="">ALL</option>
<option value="RUNNING">RUNNING</option>
<option value="SUCCEEDED">SUCCEEDED</option>
<option value="SUSPENDED">SUSPENDED</option>
- <option value="WAITING">WAITING</option>
<option value="KILLED">KILLED</option>
</select>
</div>
@@ -54,18 +48,18 @@
<tbody>
<tr ng-if="input.length > 0" class="buttonsRow">
- <td class="buttonCell" colspan="9">
+ <td class="buttonCell border0px" colspan="9">
<div class="btn btn-gray btn-xs buttons-to-show" ng-click="download()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
<span class="entypo down"></span> <div>Log</div>
</div>
- <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selectedDisabledButtons.resume">
+ <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selecteisabledButtons.resume">
<span class="entypo play"></span> <div>Resume</div>
</div>
<div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeRerun()" ng-disabled="selectedDisabledButtons.rerun">
<span class="entypo play"></span> <div>Rerun</div>
</div>
<div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-disabled="selectedDisabledButtons.suspend">
- <span class="entypo paus"></span> <div>Suspend</div>
+ <span class="entypo paus"></span> <div>Pause</div>
</div>
<div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeKill()" ng-disabled="selectedDisabledButtons.stop">
<span class="entypo stop"></span> <div>Kill</div>
@@ -107,18 +101,18 @@
<td>
<!--{{ item.startTime }}<br/>-->
<!--{{ item.startTime | date :'yyyy-MM-ddTHH:mm:ssZ' }}<br/>-->
- {{ item.startTime | date :'MM/dd/yyyy HH:mm'}}
+ {{ item.startTime | date : dateFormat}}
</td>
<td>
- {{ item.endTime | date :'MM/dd/yyyy HH:mm'}}
+ {{ item.endTime | date : dateFormat}}
</td>
<td class="stateCell">
<span ng-class="{
- 'blink-success': item.status == 'RUNNING',
- 'text-success': item.status == 'SUCCEEDED',
- 'blink-warning': item.status == 'WAITING' || item.status == 'UNKNOWN',
- 'blink-danger': item.status == 'SUSPENDED',
- 'text-danger': item.status == 'FAILED' || item.status == 'KILLED',
+ 'blink-success': item.status == 'RUNNING',
+ 'text-success': item.status == 'SUCCEEDED',
+ 'blink-warning': item.status == 'WAITING' || item.status == 'UNKNOWN',
+ 'blink-danger': item.status == 'SUSPENDED',
+ 'text-danger': item.status == 'FAILED' || item.status == 'KILLED',
}">{{ item.status }}</span>
</td>
@@ -131,7 +125,7 @@
</td>
</tr>
- <tr>
+ <tr class="paginationRow">
<td colspan="5">
<nav class="pull-right">
<ul class="pagination">
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/lineageGraphDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/lineageGraphDv.html b/falcon-ui/app/html/directives/lineageGraphDv.html
index 93a2896..7e01d78 100644
--- a/falcon-ui/app/html/directives/lineageGraphDv.html
+++ b/falcon-ui/app/html/directives/lineageGraphDv.html
@@ -20,10 +20,10 @@
<div id="lineageGraph">
<h4><small>Legends</small></h4>
<ul class="lineage-legend">
- <li class="lineage-legend-feed-inst">Feed instance</li>
- <li class="lineage-legend-feed-inst lineage-legend-terminal">Feed instance (terminal)</li>
- <li class="lineage-legend-process-inst">Process instance</li>
- <li class="lineage-legend-process-inst lineage-legend-terminal">Process instance (terminal)</li>
+ <li class="lineage-legend-feed-inst"><span>Feed instance</span></li>
+ <li class="lineage-legend-feed-inst lineage-legend-terminal"><span>Feed instance (terminal)</span></li>
+ <li class="lineage-legend-process-inst"><span>Process instance</span></li>
+ <li class="lineage-legend-process-inst lineage-legend-terminal"><span>Process instance (terminal)</span></li>
</ul>
</div>
<div>
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/navDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/navDv.html b/falcon-ui/app/html/directives/navDv.html
index 63046f6..cffc170 100644
--- a/falcon-ui/app/html/directives/navDv.html
+++ b/falcon-ui/app/html/directives/navDv.html
@@ -17,84 +17,216 @@
* limitations under the License.
*/
-->
-<nav class="col-sm-24 navbar navbar-default" role="navigation">
- <div class="col-sm-offset-1 col-sm-22">
- <button class="logoTitle" ui-sref="main">
+<nav class="col-sm-24 navbar navbar-default header1" role="navigation">
+ <div class="col-sm-offset-2 col-sm-20">
+ <a class="btn-link logoTitle" ui-sref="main">
<h1 class="navbar-header">
- <span class="falconLogo"></span> <span>Falcon</span>
+ <span class="falconLogo"></span>
</h1>
- </button>
+ </a>
+ <div class="loginHeaderBox" ng-show="userLogged()">
+ <!--<button type="button" class="btn btn-lg btn-link" data-ng-click="showMenu=!showMenu">
+ <span class="glyphicon glyphicon-th" aria-hidden="true"></span>
+ </button>-->
+ <!-- <div class="dropdown visible-lg-inline-block">
+ <a class="btn btn-link dropdown-toggle" data-ng-click="" id="settingMenu"
+ data-toggle="dropdown" aria-expanded="true" role="button">
+ <span class="glyphicon glyphicon-th"></span>
+ </a>
+ <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="settingMenu">
+ <li role="presentation" role="menuitem" tabindex="-1">
+ <button type="button" class="btn btn-link" data-ng-click="displayEntities('cluster')">
+ Clusters
+ </button>
+ </li>
+ </ul>
+ </div> -->
+ <span class="entypo archive icon-lg entypo-align-sub" title="Clusters" data-ng-click="displayEntities('cluster')"> </span>
+ <span class="separator"> | </span>
+ <span class="notifications">
+ <button class="btn btn-link" ng-click="notify()">
+ <span class="glyphicon glyphicon-bell" title="Notifications"></span>
+ </button>
+ <server-messages></server-messages>
+ </span>
+ <span class="separator"> | </span>
+ <div class="dropdown visible-lg-inline-block">
+ <div class="dropdown-toggle pointer" id="userMenu" data-toggle="dropdown" aria-expanded="true" role="button">
+ <span class="user hide"></span>{{userToken}} <span class="caret"></span>
+ </div>
+ <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="userMenu">
+ <li role="presentation">
+ <a class="btn btn-link" ng-show="userLogged() && !ambariView()" ng-click="logOut()">
+ <span class="glyphicon glyphicon-log-out" title="Logout"></span>
+ Logout
+ </a>
+ </li>
+ <li>
+ <a class="btn btn-link"
+ href="https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.3.4/bk_data_governance/content/ch_hdp_data_governance_overview.html"
+ target="_blank">
+ <span class="glyphicon glyphicon-question-sign" title="Help"></span>
+ Help
+ </a>
+ </li>
+ <li><a class="btn btn-link" href="http://hortonworks.com/hadoop/falcon/" target="_blank">
+ <span class="glyphicon glyphicon-info-sign" title="About"></span>
+ About
+ </a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</nav>
+<nav class="col-sm-24 navbar navbar-default header2" role="navigation" ng-show="userLogged()">
- <div class="createNavWrapper" ng-show="userLogged()">
- <h4>Create an entity</h4>
- <button type="button"
- id="cluster.create"
- ng-click="resetCluster()"
- ng-disabled="isInForm('cluster')"
- ng-class="{disabled:isInForm('cluster')}">
- <span class="entypo archive"></span> <span>Cluster</span>
- </button>
- <button type="button"
- id="feed.create"
- ng-click="resetFeed()"
- ng-disabled="isInForm('feed')"
- ng-class="{disabled:isInForm('feed')}">
- <span class="entypo download"></span> <span>Feed</span>
- </button>
- <button type="button"
- id="process.create"
- ng-click="resetProcess()"
- ng-disabled="isInForm('process')"
- ng-class="{disabled:isInForm('process')}">
- <span class="entypo cycle"></span> <span>Process</span>
- </button>
- <button type="button"
- id="dataset.create"
- ng-click="resetDataset()"
- ng-disabled="isInForm('dataset')"
- ng-class="{disabled:isInForm('dataset')}">
- <span class="glyphicon glyphicon-duplicate"></span> <span>Mirror</span>
- </button>
- </div>
+ <div class="col-sm-16" ng-show="userLogged()">
+ <div class="row searchBoxContainer">
+ <div class=" col-sm-offset-4 col-sm-16">
+ <!--<i class="glyphicon glyphicon-refresh search-loading-icon" ng-show="loading"></i>-->
+ <img src="css/img/ajax-loader.gif" class="glyphicon search-loading-icon" ng-show="loading"/>
+ <!--<tags-input ng-model="tags" min-length="1" add-on-space="true" on-tag-added="displayResults()"-->
+ <!--on-tag-removed="displayResults()"></tags-input>-->
- <div class="uploadNavWrapper" ng-show="userLogged()">
- <h4>Upload an entity</h4>
- <div class="btn-file" ng-class="{fakeFocus: fake.focus}">
- <span class="entypo up"></span>
- <input type="file"
- id="files"
- ng-focus="fake.focus = true"
- ng-blur="fake.focus = false"
- name="files[]"
- multiple
- fileinput-change="handleFile"
- ng-model="fileJson">
- <span>Browse for the XML file</span>
+ <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(true)" placeholder="Search">
+ <auto-complete source="loadTags($query)" min-length="0"></auto-complete>
+ </tags-input>
+ <!--ng-class="tags.length > 0 ? 'question-icon' : 'remove-icon'"-->
+ <i id="nsPopover" class="glyphicon glyphicon-question-sign question-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>
+ <i class="glyphicon glyphicon-search search-icon" ng-hide="loading" ng-click="displayResults()"></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>
+ </script>
+ <i class="glyphicon glyphicon-remove remove-icon" ng-if="tags.length > 0" ng-click="clearTags()"></i>
+ </div>
</div>
- </div>
+ </div>
- <div class="loginHeaderBox">
- <div ng-show="userLogged()">
- <span class="user"></span> <div><strong>{{userToken}}</strong></div>
+ <div class="col-sm-8 uploadNavWrapper">
+ <div class="dropdown">
+ <!--<img src="css/img/32x32_create-entity.png" data-ng-click="showMenu=false" class="dropdown-toggle btn-create"
+ title="Create entity" id="entityMenu" data-toggle="dropdown" aria-expanded="true" role="button" />-->
+ <button class="dropdown-toggle btn-create" title="Create entity" id="entityMenu"
+ data-toggle="dropdown" aria-expanded="true" role="button">
+ Create <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu" role="menu" aria-labelledby="entityMenu">
+ <li role="presentation">
+ <button class="cluster btn btn-link" role="menuitem" tabindex="-1" type="button" id="cluster.create"
+ ng-click="resetCluster()" ng-disabled="isInForm('cluster')">
+ <span title="Cluster">Cluster</span>
+ </button>
+ </li>
+ <li role="presentation">
+ <button class="feed btn btn-link" role="menuitem" tabindex="-1" type="button" id="feed.create"
+ ng-click="resetFeed()" ng-disabled="isInForm('feed')">
+ <span title="Feed">Feed</span>
+ </button>
+ </li>
+ <li role="presentation">
+ <button class="process btn btn-link" role="menuitem" tabindex="-1" type="button" id="process.create"
+ ng-click="resetProcess()" ng-disabled="isInForm('process')">
+ <span title="Process">Process</span>
+ </button>
+ </li>
+ <li role="presentation">
+ <div class="dropdown open">
+ <button class="dataset btn btn-link" role="menuitem" tabindex="-1" type="button" id="dataset.create"
+ ng-click="resetDataset('HDFS')" ng-disabled="isInForm('dataset') && isMirror('HDFS')">
+ <span title="Mirror">Mirror</span>
+ </button>
+ <ul class="dropdown-submenu" role="menu" aria-labelledby="dataset.create">
+ <li role="presentation">
+ <button class="hdfsMirror btn btn-link" role="menuitem" tabindex="-2" type="button"
+ id="hdfsMirror.create" ng-click="resetDataset('HDFS')" ng-disabled="isInForm('dataset') && isMirror('HDFS')">
+ <span title="File System">File System</span>
+ </button>
+ </li>
+ <li role="presentation">
+ <button class="hiveMirror btn btn-link" role="menuitem" tabindex="-2" type="button"
+ id="hiveMirror.create" ng-click="resetDataset('HIVE')" ng-disabled="isInForm('dataset') && isMirror('HIVE')">
+ <span title="Hive">Hive</span>
+ </button>
+ </li>
+ <li role="presentation">
+ <button class="snapshot btn btn-link" role="menuitem" tabindex="-2" type="button"
+ id="snapshot.create" ng-click="resetSnapshot()" ng-disabled="isInForm('snapshot')">
+ <span title="Snapshot">Snapshot</span>
+ </button>
+ </li>
+ </ul>
+ </li>
+ <li role="presentation">
+ <button class="dataset btn btn-link" role="menuitem" tabindex="-1" type="button" id="datasource.create" ng-click="resetDatasource()" ng-disabled="isInForm('datasource')" ng-class="{disabled:isInForm('datasource')}">
+ <span title="Data Source">Data Source</span>
+ </button>
+ </li>
+ </ul>
+ </div>
+ <div class="dropdown">
+ <!--<img src="css/img/32x32_upload.png" data-ng-click="showMenu=false" class="dropdown-toggle btn-upload"
+ title="Upload an entity definition" id="uploadMenu" data-toggle="dropdown"
+ aria-expanded="true" role="button" />-->
+ <button class="dropdown-toggle btn-upload" title="Upload an entity definition" id="uploadMenu"
+ data-toggle="dropdown" aria-expanded="true" role="button">Import<span class="caret"></span></button>
+ <ul class="dropdown-menu" role="menu" aria-labelledby="uploadMenu">
+ <li role="presentation" class="btn-file">
+ <button class="btn btn-link" role="menuitem" tabindex="-1" type="button">
+ <span title="Xml file">Xml file</span>
+ </button>
+ <input type="file"
+ id="files"
+ ng-focus="fake.focus = true"
+ ng-blur="fake.focus = false"
+ name="files[]"
+ multiple
+ fileinput-change="handleFile"
+ ng-model="fileJson" />
+ </li>
+ </ul>
</div>
- <button ng-show="userLogged() && !ambariView() && !isSecureMode()" ng-click="logOut()" ng-class="responses.unreaded > 0 ? 'logoutBT' : ''">
- <span class="glyphicon glyphicon-log-out header-icon"></span> <div><strong class="pointer">Logout</strong></div>
- </button>
+ </div>
+</nav>
- <button ng-click="notify()" ng-blur="hideNotifs()" class="no-outline">
- <span class="badge badge-notify" ng-show="responses.unreaded > 0">{{ responses.unreaded }}</span>
- <span class="glyphicon glyphicon-bell bell-notif header-icon"></span>
- <strong class="pointer">Notifications</strong>
- <div class="notifications">
- <server-messages></server-messages>
+<!--
+<nav class="col-sm-24 navbar navbar-default header3" role="navigation" ng-show="userLogged() && showMenu">
+ <div class="col-sm-offset-4 col-sm-18">
+ <div class="loginHeaderBox">
+ <a class="btn btn-link" ng-click="notify()">
+ <span class="glyphicon glyphicon-bell" title="Notifications"></span>
+ <div class="notifications">
+ <server-messages></server-messages>
+ </div>
+ </a>
+ <a class="btn btn-link" ng-show="userLogged() && !ambariView()" ng-click="logOut()">
+ <span class="glyphicon glyphicon-log-out" title="Logout"></span>
+ </a>
+ <a class="btn btn-link"
+ href="http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.1.1/bk_falcon/bk_falcon-20140422.pdf"
+ target="_blank">
+ <span class="glyphicon glyphicon-question-sign" title="Help"></span>
+ </a>
+ <a class="btn btn-link" href="http://hortonworks.com/hadoop/falcon/" target="_blank">
+ <span class="glyphicon glyphicon-info-sign" title="About"></span>
+ </a>
</div>
- </button>
-
- <a href="http://hortonworks.com/hadoop/falcon/">
- <span class="glyphicon glyphicon-question-sign header-icon"></span> <div>Help</div>
- </a>
</div>
-
- </div>
-</nav>
+</nav>-->
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/serverMessagesDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/serverMessagesDv.html b/falcon-ui/app/html/directives/serverMessagesDv.html
index dd5a2a2..3910831 100644
--- a/falcon-ui/app/html/directives/serverMessagesDv.html
+++ b/falcon-ui/app/html/directives/serverMessagesDv.html
@@ -20,7 +20,7 @@
<div class="messagesArrow notifs" ng-show="server.responses.queue.length > 0"></div>
<div class="messages notifs">
-
+ <div ng-if="showClose" class='notif-close'><button type='button' class='close' ng-click="close()">×</button></div>
<div ng-show="server.responses.showAll" ng-repeat="message in server.responses.queue | reverse" class="message"
ng-class="{ 'color-warning' : message.type === 'warning' || message.type === 'cancel',
'color-success' : message.type === 'success',
http://git-wip-us.apache.org/repos/asf/falcon/blob/76dc2e18/falcon-ui/app/html/directives/timeZoneSelectDv.html
----------------------------------------------------------------------
diff --git a/falcon-ui/app/html/directives/timeZoneSelectDv.html b/falcon-ui/app/html/directives/timeZoneSelectDv.html
index f15bed7..f1ba102 100644
--- a/falcon-ui/app/html/directives/timeZoneSelectDv.html
+++ b/falcon-ui/app/html/directives/timeZoneSelectDv.html
@@ -17,7 +17,8 @@
* limitations under the License.
*/
-->
-<select class="padding0 TZSelect form-control" ng-model="ngModel">
+<select class="padding0 TZSelect form-control" ng-model="ngModel"
+ ng-required="required">
<option value="" disabled style='display:none;'>-Select timezone-</option>
<option value="UTC">UTC</option>
<option value="GMT-12:00">(GMT -12:00) Eniwetok, Kwajalein</option>
@@ -29,7 +30,7 @@
<option value="GMT-06:00">(GMT -6:00) Central Time (US & Canada), Mexico City</option>
<option value="GMT-05:00">(GMT -5:00) Eastern Time (US & Canada), Bogota, Lima</option>
<option value="GMT-04:00">(GMT -4:00) Atlantic Time (Canada), Caracas, La Paz</option>
- <option value="GMT-03:50">(GMT -3:30) Newfoundland</option>
+ <option value="GMT-03:30">(GMT -3:30) Newfoundland</option>
<option value="GMT-03:00">(GMT -3:00) Brazil, Buenos Aires, Georgetown</option>
<option value="GMT-02:00">(GMT -2:00) Mid-Atlantic</option>
<option value="GMT-01:00">(GMT -1:00 hour) Azores, Cape Verde Islands</option>
@@ -37,17 +38,17 @@
<option value="GMT+01:00">(GMT +1:00 hour) Brussels, Copenhagen, Madrid, Paris</option>
<option value="GMT+02:00">(GMT +2:00) Kaliningrad, South Africa</option>
<option value="GMT+03:00">(GMT +3:00) Baghdad, Riyadh, Moscow, St. Petersburg</option>
- <option value="GMT+03:50">(GMT +3:30) Tehran</option>
+ <option value="GMT+03:30">(GMT +3:30) Tehran</option>
<option value="GMT+04:00">(GMT +4:00) Abu Dhabi, Muscat, Baku, Tbilisi</option>
- <option value="GMT+04:50">(GMT +4:30) Kabul</option>
+ <option value="GMT+04:30">(GMT +4:30) Kabul</option>
<option value="GMT+05:00">(GMT +5:00) Ekaterinburg, Islamabad, Karachi, Tashkent</option>
- <option value="GMT+05:50">(GMT +5:30) Bombay, Calcutta, Madras, New Delhi</option>
- <option value="GMT+05:75">(GMT +5:45) Kathmandu</option>
+ <option value="GMT+05:30">(GMT +5:30) Bombay, Calcutta, Madras, New Delhi</option>
+ <option value="GMT+05:45">(GMT +5:45) Kathmandu</option>
<option value="GMT+06:00">(GMT +6:00) Almaty, Dhaka, Colombo</option>
<option value="GMT+07:00">(GMT +7:00) Bangkok, Hanoi, Jakarta</option>
<option value="GMT+08:00">(GMT +8:00) Beijing, Perth, Singapore, Hong Kong</option>
<option value="GMT+09:00">(GMT +9:00) Tokyo, Seoul, Osaka, Sapporo, Yakutsk</option>
- <option value="GMT+09:50">(GMT +9:30) Adelaide, Darwin</option>
+ <option value="GMT+09:30">(GMT +9:30) Adelaide, Darwin</option>
<option value="GMT+10:00">(GMT +10:00) Eastern Australia, Guam, Vladivostok</option>
<option value="GMT+11:00">(GMT +11:00) Magadan, Solomon Islands, New Caledonia</option>
<option value="GMT+12:00">(GMT +12:00) Auckland, Wellington, Fiji, Kamchatka</option>