blob: e7fcea9e29b37c4235700ffb80dc3bf834200259 [file] [log] [blame]
<!--
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="box-body">
<ul class="timeline">
<!-- Base Info -->
<li class="time-label">
<span class="bg-blue">#1. Basic Information</span>
</li>
<li>
<span class="fa fa-file-text bg-aqua"></span>
<div class="timeline-item">
<div class="timeline-body">
<div class="form-group">
<label>Policy Name</label>
<input type="text" class="form-control" ng-model="policy.name" ng-readonly="!newPolicy" />
</div>
<div class="form-group">
<label>Description <small class="text-muted">[Optional]</small></label>
<textarea class="form-control" ng-model="policy.description" rows="3"></textarea>
</div>
</div>
</div>
</li>
<!-- Alert Stream -->
<li class="time-label" ng-class="{disabled: !checkBasicInfo()}">
<span class="bg-blue">#2. Alert Stream</span>
</li>
<li ng-class="{disabled: !checkBasicInfo()}">
<span class="fa fa-rocket bg-aqua"></span>
<div class="timeline-item">
<div class="timeline-body">
<label>Input Stream</label>
<ul class="list-unstyled with-margin">
<li ng-repeat="stream in policy.inputStreams track by $index">
[<a class="fa fa-times" ng-click="removeStream(stream)"></a>] {{stream}}
</li>
<li ng-if="policy.inputStreams.length === 0"><span class="fa fa-ban"></span> (empty list)</li>
</ul>
<div class="inner-block">
<div class="form-group">
<label>Application</label>
<select class="form-control" ng-model="selectedApplication" ng-change="refreshStreamSelect()">
<option ng-repeat="(app, list) in applications track by $index" value="{{app}}">
{{app}}
</option>
</select>
</div>
<div class="form-group">
<label>Stream</label>
<select class="form-control" ng-model="selectedStream">
<option ng-repeat="stream in applications[selectedApplication] track by $index" value="{{stream.streamId}}">
[{{stream.siteId}}]
{{stream.streamId}}
{{checkAddStream(stream.streamId) ? '' : '(Already Added)'}}
</option>
</select>
</div>
<button class="btn btn-success" ng-click="addStream()" ng-disabled="!checkAddStream(selectedStream)">
<span class="fa fa-plus"></span> Add Stream
</button>
</div>
<label>Output Stream</label>
<ul class="list-unstyled with-margin">
<li ng-repeat="stream in policy.outputStreams track by $index">
[<a class="fa fa-times" ng-click="removeOutputStream(stream)"></a>] {{stream}}
</li>
<li ng-if="policy.outputStreams.length === 0"><span class="fa fa-ban"></span> (empty list)</li>
</ul>
<div class="inner-block">
<div class="form-group">
<input type="text" class="form-control" ng-model="outputStream" />
</div>
<button class="btn btn-success" ng-click="addOutputStream()" ng-disabled="!checkAddOutputStream()">
<span class="fa fa-plus"></span> Add Stream
</button>
</div>
</div>
</div>
</li>
<!-- Definition -->
<li class="time-label" ng-class="{disabled: !checkAlertStream()}">
<span class="bg-blue">#3. Definition</span>
</li>
<li ng-class="{disabled: !checkAlertStream()}">
<span class="fa fa-pencil bg-aqua"></span>
<div class="timeline-item">
<div class="timeline-body">
<div class="form-group">
<label>Definition</label>
<textarea class="form-control" ng-model="policy.definition.value" rows="8"></textarea>
</div>
<div class="form-group" ng-class="{'has-warning': !checkNumber(policy.parallelismHint)}">
<label>
Parallelism Hint
<small class="text-muted" ng-if="!checkNumber(policy.parallelismHint)">- Number Only</small>
</label>
<input type="number" class="form-control" ng-model="policy.parallelismHint" />
</div>
<label>Partition <small class="text-muted">[Optional]</small></label>
<ul class="list-unstyled with-margin">
<li ng-repeat="partition in policy.partitionSpec track by $index">
[<a class="fa fa-times" ng-click="removePartition(partition)"></a>]
[<span class="text-primary">{{partition.type}}</span>]
{{partition.streamId}}:
<strong class="text-success">{{partition.columns.join(", ")}}</strong>
</li>
<li ng-if="policy.partitionSpec.length === 0"><span class="fa fa-ban"></span> (empty list)</li>
</ul>
<div class="inner-block">
<div class="form-group">
<label>Stream</label>
<select class="form-control" ng-model="partitionStream">
<option ng-repeat="stream in policy.inputStreams track by $index" value="{{stream}}">
{{stream}}
</option>
</select>
</div>
<div class="form-group">
<label>Type</label>
<select class="form-control" ng-model="partitionType">
<option>GROUPBY</option>
<option>GLOBAL</option>
<option>SHUFFLE</option>
</select>
</div>
<div class="form-group">
<label>Columns</label>
<div>
<label class="checkbox-inline" ng-repeat="column in getPartitionColumns() track by $index">
<input type="checkbox"
ng-checked="partitionColumns[column.name]"
ng-click="partitionColumns[column.name] = !partitionColumns[column.name]"
/>{{column.name}}
</label>
</div>
</div>
<button class="btn btn-success" ng-click="addPartition()" ng-disabled="!checkAddPartition()">
<span class="fa fa-plus"></span> Add Partition
</button>
</div>
</div>
</div>
</li>
<!-- Publisher Configuration -->
<li class="time-label" ng-class="{disabled: !checkDefinition()}">
<span class="bg-blue">#4. Publisher Configuration</span>
</li>
<li ng-class="{disabled: !checkDefinition()}">
<span class="fa fa-envelope bg-aqua"></span>
<div class="timeline-item">
<div class="timeline-body">
<label>Publisher</label>
<ul class="list-unstyled with-margin block-list">
<li ng-repeat="publisher in publisherList track by publisher.name">
<a class="pull-right fa fa-times" ng-click="removePublisher(publisher)"></a>
<p>
<strong>Name:</strong>
{{publisher.name}}
</p>
<p>
<strong>Type:</strong>
{{publisher.type}}
</p>
<p>
<strong>DeDup-Interval Min:</strong>
{{publisher.dedupIntervalMin}}
</p>
<p ng-repeat="field in publisherTypes[publisher.type] track by $index">
<strong>{{field}}:</strong>
{{publisher.properties[field]}}
</p>
</li>
<li ng-if="publisherList.length === 0" class="no-decorate"><span class="fa fa-ban"></span> (empty list)</li>
</ul>
<div class="inner-block">
<div class="form-group">
<label>Name</label>
<input type="text" class="form-control" ng-model="publisher.name" />
</div>
<div class="form-group">
<label>DeDup-Interval Min</label>
<input type="text" class="form-control" ng-model="publisher.dedupIntervalMin" />
</div>
<div class="form-group">
<label>Type</label>
<select class="form-control" ng-model="publisherType">
<option ng-repeat="(type, fields) in publisherTypes track by $index"
value="{{type}}">{{type}}</option>
</select>
</div>
<div class="form-group" ng-repeat="field in publisherTypes[publisherType] track by $index">
<label>{{field}}</label>
<input type="text" class="form-control" ng-model="publisherProps[field]" />
</div>
<button class="btn btn-success" ng-click="addPublisher()" ng-disabled="!checkAddPublisher()">
<span class="fa fa-plus"></span> Add Publisher
</button>
</div>
</div>
</div>
</li>
</ul>
<pre class="hide">{{policy | json : "\t"}}</pre>
</div>
<div class="box-footer text-right">
<button class="btn btn-primary" ng-disabled="!checkDefinition() || policyLock" ng-click="createPolicy()">
{{newPolicy ? 'New' : 'Update'}} Policy
</button>
</div>