<!--
 * 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="fontLoader" style="margin-top:-10px">
    <i class="fa fa-refresh fa-spin-custom"></i>
</div>
<form name="tagDefinitionform" class="css-form hide" data-id="createTagForm">
    <div class="form-group">
        {{#if create}}
        <input class="form-control row-margin-bottom" data-id="tagName" placeholder="Name(required)" autofocus>
        </input>
        {{else}}
        <h4 class="ellipsis"><span data-id="title"></span></h4>
        </input>
        {{/if}}
        <input class="form-control row-margin-bottom" data-id="description" value="{{description}}" placeholder="Description">
        </input>
        {{#if create}}
        <div class="row row-margin-bottom">
            <div class="col-md-12">
                <span>Select tags to inherit attributes(optional)</span>
                <p class="attributeText">Attributes define additional properties for the tag</p>
                <select class="form-control" data-id="parentTagList" multiple="multiple"></select>
            </div>
        </div>
        <div class="clearfix">
            <span class="pull-left">Attributes(optional)</span>
            <button type="button" class="btn btn-success btn-sm pull-right" data-id="attributeData"><i class="fa fa-plus"></i> Add New Attribute</button>
        </div>
        {{/if}}
        <div data-id="addAttributeDiv">
        </div>
    </div>
</form>
