// 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 type="text" class="u-monospace CloneRepo-command"
         onclick="this.focus();if(this.selectionStart==this.selectionEnd){lb}this.select(){rb}"
         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}
{/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}
