{{/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you 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.
*/}}{{/*
   Generates the SQL download model table.
*/}}

<table class="table table-bordered">
    <thead>
    <tr>
        <th style="text-align: left">Name</th>
        <th style="text-align: left">Version</th>
        <th style="text-align: left">Download Link</th>
    </tr>
    </thead>
    <tbody>
        {{ range .Site.Data.sql_models }}
            {{ if eq .category "model" }}{{ if eq .builtin nil }}
            {{ if eq .versions nil }}
            <tr>
                <td style="text-align: left">{{- .name -}}</td>
                <td></td>
                <td style="text-align: left">
                    {{ if $.Site.Params.IsStable }}
                        <a href="{{- partial "docs/interpolate" .sql_url -}}">Download</a>
                        (<a href="{{- partial "docs/interpolate" .sql_url -}}.asc">asc</a>,
                        <a href="{{- partial "docs/interpolate" .sql_url -}}.sha1">sha1</a>) </td>
                    {{ else }}
                        Only available for stable versions.</td>
                    {{ end }}
            </tr>
            {{ else }}
                {{ $name := .name }}
                {{ range .versions }}
                    <tr>
                        <td style="text-align: left">{{- $name -}}</td>
                        <td>{{- .version -}}</td>
                        <td style="text-align: left">
                            {{ if $.Site.Params.IsStable }}
                                <a href="{{- partial "docs/interpolate" .sql_url -}}">Download</a>
                                (<a href="{{- partial "docs/interpolate" .sql_url -}}.asc">asc</a>,
                                <a href="{{- partial "docs/interpolate" .sql_url -}}.sha1">sha1</a>) </td>
                            {{ else }}
                                Only available for stable versions.</td>
                            {{ end }}
                    </tr>
                {{ end }}
            {{ end }}
            {{ end }}{{ end }}
        {{ end }}
    </tbody>
</table>

