// 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 gitiles}

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 /}
    {/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 /}
    {/call}
    {if $moreTagsUrl}
      <a href="{$moreTagsUrl}">{msg desc="link to view more tags"}More...{/msg}</a>
    {/if}
  {/if}
{/template}
