// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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.
{namespace com.google.gitiles.templates.RepositoryIndex}

import * as common from 'com/google/gitiles/templates/Common.soy';
import * as refList from 'com/google/gitiles/templates/RefList.soy';

/**
 * Index page for a repository.
 */
{template repositoryIndex stricthtml="false"}
  {@param repositoryName: ?}  /** name of this repository. */
  {@param? menuEntries: ?}  /** menu entries. */
  {@param? customVariant: ?}  /** variant name for custom styling. */
  {@param breadcrumbs: ?}  /** breadcrumbs for this page. */
  {@param cloneUrl: ?}  /** clone URL for this repository. */
  {@param description: ?}  /** description text of the repository. */
  {@param? mirroredFromUrl: ?}  /** URL this repository is mirrored from. */
  {@param branches: ?}  /** list of branch objects with url, name, and isHead keys. */
  {@param? moreBranchesUrl: ?}  /** URL to show more branches, if necessary. */
  {@param tags: ?}  /** list of tag objects with url and name keys. */
  {@param? moreTagsUrl: ?}  /** URL to show more branches, if necessary. */
  {@param hasLog: ?}  /** whether a log should be shown for HEAD. */
  {@param? readmeHtml: ?}  /** optional rendered README.md contents. */
  {@inject staticUrls: ?}
{if $readmeHtml}
  {call common.header data="all"}
    {param title: $repositoryName /}
    {param repositoryName: null /}
    {param menuEntries: $menuEntries /}
    {param customVariant: $customVariant /}
    {param breadcrumbs: $breadcrumbs /}
    {param css: [$staticUrls['DOC_CSS_URL']] /}
  {/call}
{else}
  {call common.header}
    {param title: $repositoryName /}
    {param repositoryName: null /}
    {param menuEntries: $menuEntries /}
    {param customVariant: $customVariant /}
    {param breadcrumbs: $breadcrumbs /}
  {/call}
{/if}

{if $description}
  <h2 class="RepoDescription">{$description}</h2>
{/if}

{if $mirroredFromUrl}
  <div class="RepoMirroredFrom">
    {msg desc="Informational text describing source of repository"}
      Mirrored from <a href="{$mirroredFromUrl}">{$mirroredFromUrl}</a>
    {/msg}
  </div>
{/if}

<div class="CloneRepo">
  <div class="CloneRepo-title">Clone this repo:</div>
  <input id="clone-repo-input" type="text" class="u-monospace CloneRepo-command"
         readonly="readonly" value="git clone {$cloneUrl}">
</div>

{if $hasLog and (length($branches) or length($tags))}
  <div class="RepoShortlog">
    <div class="RepoShortlog-refs">
      {call branches_ data="all" /}
      {call tags_ data="all" /}
    </div>
    <div class="RepoShortlog-log">
      {call common.streamingPlaceholder /}
      {if $readmeHtml}
        <div class="doc RepoIndexDoc">{$readmeHtml}</div>
      {/if}
    </div>
  </div>

{elseif $hasLog}
  {call common.streamingPlaceholder /}
{elseif length($branches) or length($tags)}
  {call branches_ data="all" /}
  {call tags_ data="all" /}
{else}
  <h1 class="EmptyRepo-header">Empty Repository</h1>
  <p class="EmptyRepo-description">This repository is empty. Push to it to show branches and history.</p>
{/if}

{call common.footer}
  {param customVariant: $customVariant /}
{/call}

<script>
  {lb}
    let f = document.getElementById("clone-repo-input");
    f.onclick = () => {lb}
      f.focus();
      if (f.selectionStart === f.selectionEnd) {lb}
          f.select();
      {rb}
    {rb};
  {rb}
</script>

{/template}

/**
 * List of branches.
 */
{template branches_ visibility="private"}
  {@param? branches: ?}  /** list of branch objects with url and name keys. */
  {@param? moreBranchesUrl: ?}  /** URL to show more branches, if necessary. */
  {if length($branches)}
    {call refList.refList}
      {param type: 'Branches' /}
      {param refs: $branches /}
      {param variant: 'responsive' /}
    {/call}
    {if $moreBranchesUrl}
      <a href="{$moreBranchesUrl}">{msg desc="link to view more branches"}More...{/msg}</a>
    {/if}
  {/if}
{/template}

/**
 * List of tags.
 */
{template tags_ visibility="private"}
  {@param? tags: ?}  /** list of branch objects with url and name keys. */
  {@param? moreTagsUrl: ?}  /** URL to show more tags, if necessary. */
  {if length($tags)}
    {call refList.refList}
      {param type: 'Tags' /}
      {param refs: $tags /}
      {param variant: 'responsive' /}
    {/call}
    {if $moreTagsUrl}
      <a href="{$moreTagsUrl}">{msg desc="link to view more tags"}More...{/msg}</a>
    {/if}
  {/if}
{/template}
