1
0
Fork 0

Add max rows to videos list

This commit is contained in:
Chocobozzz 2021-06-09 10:59:20 +02:00
parent 61cbafc1f8
commit 5d6395af72
No known key found for this signature in database
GPG key ID: 583A612D890159BE
10 changed files with 80 additions and 42 deletions

View file

@ -14,7 +14,7 @@
} }
.margin-content { .margin-content {
@include grid-videos-miniature-layout; @include grid-videos-miniature-layout-with-margins;
} }
@media screen and (max-width: $mobile-view) { @media screen and (max-width: $mobile-view) {

View file

@ -8,7 +8,7 @@
} }
.margin-content { .margin-content {
@include grid-videos-miniature-layout; @include grid-videos-miniature-layout-with-margins;
} }
.section { .section {

View file

@ -1,20 +1,24 @@
.custom-markup-container { .custom-markup-container {
::ng-deep .peertube-container { ::ng-deep .peertube-container {
margin: 30px 0 15px;
&.layout-row {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
&.layout-column {
display: flex;
flex-direction: column;
}
.header {
margin: 30px 0 15px;
}
h4 { h4 {
margin-bottom: 0; margin-bottom: 0;
} }
.layout-row {
display: flex;
flex-direction: row;
}
.layout-column {
display: flex;
flex-direction: column;
}
} }
} }

View file

@ -168,11 +168,15 @@ export class CustomMarkupService {
const model = { const model = {
onlyDisplayTitle: this.buildBoolean(data.onlyDisplayTitle) ?? false, onlyDisplayTitle: this.buildBoolean(data.onlyDisplayTitle) ?? false,
maxRows: this.buildNumber(data.maxRows) ?? -1,
sort: data.sort || '-publishedAt', sort: data.sort || '-publishedAt',
count: this.buildNumber(data.count) || 10,
categoryOneOf: this.buildArrayNumber(data.categoryOneOf) ?? [], categoryOneOf: this.buildArrayNumber(data.categoryOneOf) ?? [],
languageOneOf: this.buildArrayString(data.languageOneOf) ?? [], languageOneOf: this.buildArrayString(data.languageOneOf) ?? [],
filter: this.buildBoolean(data.onlyLocal) ? 'local' as VideoFilter : undefined,
count: this.buildNumber(data.count) || 10 filter: this.buildBoolean(data.onlyLocal) ? 'local' as VideoFilter : undefined
} }
this.dynamicElementService.setModel(component, model) this.dynamicElementService.setModel(component, model)
@ -183,11 +187,16 @@ export class CustomMarkupService {
private containerBuilder (el: HTMLElement) { private containerBuilder (el: HTMLElement) {
const data = el.dataset as ContainerMarkupData const data = el.dataset as ContainerMarkupData
// Move inner HTML in the new element we'll create
const content = el.innerHTML
el.innerHTML = ''
const root = document.createElement('div') const root = document.createElement('div')
root.innerHTML = content
const layoutClass = data.layout const layoutClass = data.layout
? 'layout-' + data.layout ? 'layout-' + data.layout
: 'layout-row' : 'layout-column'
root.classList.add('peertube-container', layoutClass) root.classList.add('peertube-container', layoutClass)
@ -195,16 +204,23 @@ export class CustomMarkupService {
root.setAttribute('width', data.width) root.setAttribute('width', data.width)
} }
if (data.title) { if (data.title || data.description) {
const titleElement = document.createElement('h4') const headerElement = document.createElement('div')
titleElement.innerText = data.title headerElement.classList.add('header')
root.appendChild(titleElement)
}
if (data.description) { if (data.title) {
const descriptionElement = document.createElement('div') const titleElement = document.createElement('h4')
descriptionElement.innerText = data.description titleElement.innerText = data.title
root.appendChild(descriptionElement) headerElement.appendChild(titleElement)
}
if (data.description) {
const descriptionElement = document.createElement('div')
descriptionElement.innerText = data.description
headerElement.append(descriptionElement)
}
root.insertBefore(headerElement, root.firstChild)
} }
return root return root

View file

@ -1,8 +1,13 @@
<div class="videos"> <div class="root">
<my-video-miniature <div class="videos" [ngStyle]="limitRowsStyle()">
*ngFor="let video of videos"
[video]="video" [user]="getUser()" [displayAsRow]="false" <div class="video-wrapper" *ngFor="let video of videos">
[displayVideoActions]="false" [displayOptions]="displayOptions" <my-video-miniature
> [video]="video" [user]="getUser()" [displayAsRow]="false"
</my-video-miniature> [displayVideoActions]="false" [displayOptions]="displayOptions"
>
</my-video-miniature>
</div>
</div>
</div> </div>

View file

@ -1,10 +1,7 @@
@import '_variables'; @import '_variables';
@import '_mixins'; @import '_mixins';
@import '_miniature';
my-video-miniature { .root {
@include margin-right(15px); @include grid-videos-miniature-layout;
display: inline-block;
min-width: $video-thumbnail-width;
max-width: $video-thumbnail-width;
} }

View file

@ -20,6 +20,7 @@ export class VideosListMarkupComponent implements OnInit {
@Input() count: number @Input() count: number
@Input() onlyDisplayTitle: boolean @Input() onlyDisplayTitle: boolean
@Input() filter: VideoFilter @Input() filter: VideoFilter
@Input() maxRows: number
videos: Video[] videos: Video[]
@ -43,6 +44,16 @@ export class VideosListMarkupComponent implements OnInit {
return this.auth.getUser() return this.auth.getUser()
} }
limitRowsStyle () {
if (this.maxRows <= 0) return {}
return {
'grid-template-rows': `repeat(${this.maxRows}, 1fr)`,
'grid-auto-rows': '0', // Set height to 0 for autogenerated grid rows
'overflow-y': 'hidden' // Hide grid items that overflow
}
}
ngOnInit () { ngOnInit () {
if (this.onlyDisplayTitle) { if (this.onlyDisplayTitle) {
for (const key of Object.keys(this.displayOptions)) { for (const key of Object.keys(this.displayOptions)) {

View file

@ -51,7 +51,7 @@ $icon-size: 16px;
} }
.margin-content { .margin-content {
@include grid-videos-miniature-layout; @include grid-videos-miniature-layout-with-margins;
} }
.display-as-row.videos { .display-as-row.videos {

View file

@ -118,8 +118,6 @@
} }
@mixin grid-videos-miniature-layout { @mixin grid-videos-miniature-layout {
@include grid-videos-miniature-margins;
@media screen and (min-width: $mobile-view) { @media screen and (min-width: $mobile-view) {
.videos, .videos,
.playlists { .playlists {
@ -156,3 +154,8 @@
} }
} }
} }
@mixin grid-videos-miniature-layout-with-margins {
@include grid-videos-miniature-margins;
@include grid-videos-miniature-layout;
}

View file

@ -25,14 +25,16 @@ export type ChannelMiniatureMarkupData = {
export type VideosListMarkupData = { export type VideosListMarkupData = {
onlyDisplayTitle?: string // boolean onlyDisplayTitle?: string // boolean
maxRows?: string // number
sort?: string sort?: string
count?: string count?: string // number
categoryOneOf?: string // coma separated values categoryOneOf?: string // coma separated values
languageOneOf?: string // coma separated values languageOneOf?: string // coma separated values
onlyLocal?: string // boolean onlyLocal?: string // boolean
} }
export type ButtonMarkupData = { export type ButtonMarkupData = {