Before script has been separated on two groups: for learning type and course category and for school and sorting. It means when school is choosen, learning type and course category resets on update. TODO: need to add pagination
97 lines
2.6 KiB
Plaintext
97 lines
2.6 KiB
Plaintext
package bootstrap
|
||
|
||
import "strconv"
|
||
|
||
type IndexCourseCategoryItem struct {
|
||
ID string
|
||
Name string
|
||
Description string
|
||
ExampleThemes []string
|
||
Count int
|
||
}
|
||
|
||
// courseItemCard is a card that renders a single course thematic item
|
||
// that holds multiple learning types. It expected to have a basic description
|
||
// and an amount of items.
|
||
templ courseItemCard(item IndexCourseCategoryItem) {
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<h5 class="card-title">{ item.Name }</h5>
|
||
<hr/>
|
||
<p>{ item.Description }</p>
|
||
if len(item.ExampleThemes) > 0 {
|
||
<p>В данной категории вы можете найти курсы по темам:</p>
|
||
<ul>
|
||
for _, exampleItem := range item.ExampleThemes {
|
||
<li>
|
||
<span class="d-inline-block text-truncate col-8">{ exampleItem }</span>
|
||
</li>
|
||
}
|
||
</ul>
|
||
}
|
||
<div class="d-flex justify-content-between align-items-center">
|
||
<a href={ templ.URL("/courses/" + item.ID) } class="btn btn-sm btn-outline-primary col-6">
|
||
Open
|
||
</a>
|
||
<small class="text-body-secondary">
|
||
{ strconv.Itoa(item.Count) } items.
|
||
</small>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
}
|
||
|
||
templ courseCategory(items []IndexCourseCategoryItem) {
|
||
<div class="container w-75 mb-4">
|
||
<div class="row g-4">
|
||
for _, item := range items {
|
||
<div class="col-12 col-md-8 col-lg-4">
|
||
@courseItemCard(item)
|
||
</div>
|
||
}
|
||
</div>
|
||
</div>
|
||
}
|
||
|
||
type Pagination struct {
|
||
Page int
|
||
TotalPages int
|
||
BaseURL string
|
||
}
|
||
|
||
templ pagination(p Pagination) {
|
||
if p.Page > 0 && p.TotalPages > 0 {
|
||
<nav aria-label="Page navigation">
|
||
<ul class="pagination justify-content-center">
|
||
<li class={ "page-item" , templ.KV("disabled", p.Page==1), }>
|
||
<a href={ templ.URL(p.BaseURL + "?page=" + strconv.Itoa(p.Page-1)) } class="page-link">Previous</a>
|
||
</li>
|
||
for i := max(p.Page-2, 1); i < min(p.TotalPages, 10); i++ {
|
||
<li
|
||
class={ "page-item" , templ.KV("active", p.Page==i), }
|
||
>
|
||
<a href={ templ.URL(p.BaseURL + "?page=" + strconv.Itoa(i)) } class="page-link">{ strconv.Itoa(i) }</a>
|
||
</li>
|
||
}
|
||
<li class={ "page-item" , templ.KV("disabled", p.Page==p.TotalPages), }>
|
||
<a href={ templ.URL(p.BaseURL + "?page=" + strconv.Itoa(p.Page+1)) } class="page-link">Next</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
}
|
||
}
|
||
|
||
type MainPageParams struct {
|
||
Breadcrumbs BreadcrumbsParams
|
||
Categories []IndexCourseCategoryItem
|
||
Pagination Pagination
|
||
}
|
||
|
||
templ MainPage(pageType PageKind, s stats, params MainPageParams) {
|
||
@root(pageType, s) {
|
||
@listCoursesSectionHeader(params.Breadcrumbs)
|
||
@courseCategory(params.Categories)
|
||
@pagination(params.Pagination)
|
||
}
|
||
}
|