<!--
Copyright (C) 2017 The Android Open Source Project

Licensed 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.
-->

<link rel="import" href="../../../bower_components/polymer/polymer.html">
<link rel="import" href="../../../behaviors/gr-access-behavior/gr-access-behavior.html">
<link rel="import" href="../../../bower_components/paper-toggle-button/paper-toggle-button.html">
<link rel="import" href="../../../styles/gr-form-styles.html">
<link rel="import" href="../../../styles/gr-menu-page-styles.html">
<link rel="import" href="../../../styles/shared-styles.html">
<link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
<link rel="import" href="../../shared/gr-button/gr-button.html">
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
<link rel="import" href="../gr-rule-editor/gr-rule-editor.html">

<dom-module id="gr-permission">
  <template>
    <style include="shared-styles">
      :host {
        display: block;
        margin-bottom: .7em;
      }
      .header {
        align-items: baseline;
        display: flex;
        justify-content: space-between;
        margin: .3em .7em;
      }
      .rules {
        background: #fafafa;
        border: 1px solid #d1d2d3;
        border-bottom: 0;
      }
      .editing .rules {
        border-bottom: 1px solid #d1d2d3;
      }
      .title {
        margin-bottom: .3em;
      }
      #addRule,
      #removeBtn {
        display: none;
      }
      .right {
        display: flex;
        align-items: center;
      }
      .editing #removeBtn {
        display: block;
        margin-left: 1.5em;
      }
      .editing #addRule {
        display: block;
        padding: .7em;
      }
      #deletedContainer,
      .deleted #mainContainer {
        display: none;
      }
      .deleted #deletedContainer {
        align-items: baseline;
        border: 1px solid #d1d2d3;
        display: flex;
        justify-content: space-between;
        padding: .7em;
      }
      #mainContainer {
        display: block;
      }
    </style>
    <style include="gr-form-styles"></style>
    <style include="gr-menu-page-styles"></style>
    <section
        id="permission"
        class$="gr-form-styles [[_computeSectionClass(editing, _deleted)]]">
      <div id="mainContainer">
        <div class="header">
          <span class="title">[[name]]</span>
          <div class="right">
            <template is=dom-if if="[[!_permissionIsOwnerOrGlobal(permission.id, section)]]">
              <paper-toggle-button
                  id="exclusiveToggle"
                  checked="{{permission.value.exclusive}}"
                  on-change="_handleValueChange"
                  disabled$="[[!editing]]"></paper-toggle-button>Exclusive
            </template>
            <gr-button
                link
                id="removeBtn"
                on-tap="_handleRemovePermission">Remove</gr-button>
          </div>
        </div><!-- end header -->
        <div class="rules">
          <template
              is="dom-repeat"
              items="{{_rules}}"
              as="rule">
            <gr-rule-editor
                label="[[_label]]"
                editing="[[editing]]"
                group-id="[[rule.id]]"
                group-name="[[_computeGroupName(groups, rule.id)]]"
                permission="[[permission.id]]"
                rule="{{rule}}"
                section="[[section]]"></gr-rule-editor>
          </template>
          <div id="addRule">
            <gr-autocomplete
                id="groupAutocomplete"
                text="{{_groupFilter}}"
                query="[[_query]]"
                placeholder="Add group"
                on-commit="_handleAddRuleItem">
            </gr-autocomplete>
          </div>
          <!-- end addRule -->
        </div> <!-- end rules -->
      </div><!-- end mainContainer -->
      <div id="deletedContainer">
        <span>[[name]] was deleted</span>
        <gr-button
            link
            id="undoRemoveBtn"
            on-tap="_handleUndoRemove">Undo</gr-button>
      </div><!-- end deletedContainer -->
    </section>
    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
  </template>
  <script src="gr-permission.js"></script>
</dom-module>
