/**
 * @license
 * Copyright (C) 2020 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.
 */
import {html} from '@polymer/polymer/lib/utils/html-tag.js';

export const htmlTemplate = html`
    <style include="gr-form-styles">
      /* Workaround for empty style block - see https://github.com/Polymer/tools/issues/408 */
    </style>
    <style include="gr-table-styles">
      /* Workaround for empty style block - see https://github.com/Polymer/tools/issues/408 */
    </style>
    <style include="shared-styles">
      .tags td.name {
        min-width: 25em;
      }
      td.name,
      td.revision,
      td.message {
        word-break: break-word;
      }
      td.revision.tags {
        width: 27em;
      }
      td.message,
      td.tagger {
        max-width: 15em;
      }
      .editing .editItem {
        display: inherit;
      }
      .editItem,
      .editing .editBtn,
      .canEdit .revisionNoEditing,
      .editing .revisionWithEditing,
      .revisionEdit,
      .hideItem {
        display: none;
      }
      .revisionEdit gr-button {
        margin-left: var(--spacing-m);
      }
      .editBtn {
        margin-left: var(--spacing-l);
      }
      .canEdit .revisionEdit{
        align-items: center;
        display: flex;
      }
      .deleteButton:not(.show) {
        display: none;
      }
      .tagger.hide {
        display: none;
      }
    </style>
    <style include="gr-table-styles">
      /* Workaround for empty style block - see https://github.com/Polymer/tools/issues/408 */
    </style>
    <gr-list-view create-new="[[_loggedIn]]" filter="[[_filter]]" items-per-page="[[_itemsPerPage]]" items="[[_items]]" loading="[[_loading]]" offset="[[_offset]]" on-create-clicked="_handleCreateClicked" path="[[_getPath(_repo, detailType)]]">
      <table id="list" class="genericList gr-form-styles">
        <tbody><tr class="headerRow">
          <th class="name topHeader">Name</th>
          <th class="revision topHeader">Revision</th>
          <th class\$="message topHeader [[_hideIfBranch(detailType)]]">
            Message</th>
          <th class\$="tagger topHeader [[_hideIfBranch(detailType)]]">
            Tagger</th>
          <th class="repositoryBrowser topHeader">
            Repository Browser</th>
          <th class="delete topHeader"></th>
        </tr>
        <tr id="loading" class\$="loadingMsg [[computeLoadingClass(_loading)]]">
          <td>Loading...</td>
        </tr>
        </tbody><tbody class\$="[[computeLoadingClass(_loading)]]">
          <template is="dom-repeat" items="[[_shownItems]]">
            <tr class="table">
              <td class\$="[[detailType]] name">[[_stripRefs(item.ref, detailType)]]</td>
              <td class\$="[[detailType]] revision [[_computeCanEditClass(item.ref, detailType, _isOwner)]]">
                <span class="revisionNoEditing">
                  [[item.revision]]
                </span>
                <span class\$="revisionEdit [[_computeEditingClass(_isEditing)]]">
                  <span class="revisionWithEditing">
                    [[item.revision]]
                  </span>
                  <gr-button link="" on-click="_handleEditRevision" class="editBtn">
                    edit
                  </gr-button>
                  <iron-input bind-value="{{_revisedRef}}" class="editItem">
                    <input is="iron-input" bind-value="{{_revisedRef}}">
                  </iron-input>
                  <gr-button link="" on-click="_handleCancelRevision" class="cancelBtn editItem">
                    Cancel
                  </gr-button>
                  <gr-button link="" on-click="_handleSaveRevision" class="saveBtn editItem" disabled="[[!_revisedRef]]">
                    Save
                  </gr-button>
                </span>
              </td>
              <td class\$="message [[_hideIfBranch(detailType)]]">
                [[_computeMessage(item.message)]]
              </td>
              <td class\$="tagger [[_hideIfBranch(detailType)]]">
                <div class\$="tagger [[_computeHideTagger(item.tagger)]]">
                  <gr-account-link account="[[item.tagger]]">
                  </gr-account-link>
                  (<gr-date-formatter has-tooltip="" date-str="[[item.tagger.date]]">
                  </gr-date-formatter>)
                </div>
              </td>
              <td class="repositoryBrowser">
                <template is="dom-repeat" items="[[_computeWeblink(item)]]" as="link">
                  <a href\$="[[link.url]]" class="webLink" rel="noopener" target="_blank">
                    ([[link.name]])
                  </a>
                </template>
              </td>
              <td class="delete">
                <gr-button link="" class\$="deleteButton [[_computeHideDeleteClass(_isOwner, item.can_delete)]]" on-click="_handleDeleteItem">
                  Delete
                </gr-button>
              </td>
            </tr>
          </template>
        </tbody>
      </table>
      <gr-overlay id="overlay" with-backdrop="">
        <gr-confirm-delete-item-dialog class="confirmDialog" on-confirm="_handleDeleteItemConfirm" on-cancel="_handleConfirmDialogCancel" item="[[_refName]]" item-type="[[detailType]]"></gr-confirm-delete-item-dialog>
      </gr-overlay>
    </gr-list-view>
    <gr-overlay id="createOverlay" with-backdrop="">
      <gr-dialog id="createDialog" disabled="[[!_hasNewItemName]]" confirm-label="Create" on-confirm="_handleCreateItem" on-cancel="_handleCloseCreate">
        <div class="header" slot="header">
          Create [[_computeItemName(detailType)]]
        </div>
        <div class="main" slot="main">
          <gr-create-pointer-dialog id="createNewModal" detail-type="[[_computeItemName(detailType)]]" has-new-item-name="{{_hasNewItemName}}" item-detail="[[detailType]]" repo-name="[[_repo]]"></gr-create-pointer-dialog>
        </div>
      </gr-dialog>
    </gr-overlay>
    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
`;
