X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Fshared-custom-markup%2Fcustom-markup.service.ts;h=a959b336d18b555619dbdddbf9b29b85cacefbd1;hb=082d32eb8873190e48329b61b91f87d71f3cf812;hp=aa5dbe64360be4e63b87915f75179fc69593e309;hpb=61cbafc1f80a33a895b54b15751a42e0d78af231;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/shared/shared-custom-markup/custom-markup.service.ts b/client/src/app/shared/shared-custom-markup/custom-markup.service.ts index aa5dbe643..a959b336d 100644 --- a/client/src/app/shared/shared-custom-markup/custom-markup.service.ts +++ b/client/src/app/shared/shared-custom-markup/custom-markup.service.ts @@ -1,3 +1,4 @@ +import { firstValueFrom } from 'rxjs' import { ComponentRef, Injectable } from '@angular/core' import { MarkdownService } from '@app/core' import { @@ -6,7 +7,6 @@ import { ContainerMarkupData, EmbedMarkupData, PlaylistMiniatureMarkupData, - VideoFilter, VideoMiniatureMarkupData, VideosListMarkupData } from '@shared/models' @@ -19,8 +19,9 @@ import { VideoMiniatureMarkupComponent, VideosListMarkupComponent } from './peertube-custom-tags' +import { CustomMarkupComponent } from './peertube-custom-tags/shared' -type AngularBuilderFunction = (el: HTMLElement) => ComponentRef +type AngularBuilderFunction = (el: HTMLElement) => ComponentRef type HTMLBuilderFunction = (el: HTMLElement) => HTMLElement @Injectable() @@ -45,7 +46,10 @@ export class CustomMarkupService { private dynamicElementService: DynamicElementService, private markdown: MarkdownService ) { - this.customMarkdownRenderer = async (text: string) => this.buildElement(text) + this.customMarkdownRenderer = (text: string) => { + return this.buildElement(text) + .then(({ rootElement }) => rootElement) + } } getCustomMarkdownRenderer () { @@ -71,12 +75,19 @@ export class CustomMarkupService { }) } + const loadedPromises: Promise[] = [] + for (const selector of Object.keys(this.angularBuilders)) { rootElement.querySelectorAll(selector) .forEach((e: HTMLElement) => { try { const component = this.execAngularBuilder(selector, e) + if (component.instance.loaded) { + const p = firstValueFrom(component.instance.loaded) + loadedPromises.push(p) + } + this.dynamicElementService.injectElement(e, component) } catch (err) { console.error('Cannot inject component %s.', selector, err) @@ -84,7 +95,7 @@ export class CustomMarkupService { }) } - return rootElement + return { rootElement, componentsLoaded: Promise.all(loadedPromises) } } private getSupportedTags () { @@ -138,10 +149,10 @@ export class CustomMarkupService { const component = this.dynamicElementService.createElement(ButtonMarkupComponent) const model = { - theme: data.theme, + theme: data.theme ?? 'primary', href: data.href, label: data.label, - blankTarget: this.buildBoolean(data.blankTarget) + blankTarget: this.buildBoolean(data.blankTarget) ?? false } this.dynamicElementService.setModel(component, model) @@ -168,11 +179,20 @@ export class CustomMarkupService { const model = { onlyDisplayTitle: this.buildBoolean(data.onlyDisplayTitle) ?? false, + maxRows: this.buildNumber(data.maxRows) ?? -1, + sort: data.sort || '-publishedAt', + count: this.buildNumber(data.count) || 10, + categoryOneOf: this.buildArrayNumber(data.categoryOneOf) ?? [], languageOneOf: this.buildArrayString(data.languageOneOf) ?? [], - filter: this.buildBoolean(data.onlyLocal) ? 'local' as VideoFilter : undefined, - count: this.buildNumber(data.count) || 10 + + accountHandle: data.accountHandle || undefined, + channelHandle: data.channelHandle || undefined, + + isLive: this.buildBoolean(data.isLive), + + isLocal: this.buildBoolean(data.onlyLocal) ? true : undefined } this.dynamicElementService.setModel(component, model) @@ -183,28 +203,42 @@ export class CustomMarkupService { private containerBuilder (el: HTMLElement) { 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') + root.innerHTML = content const layoutClass = data.layout ? 'layout-' + data.layout - : 'layout-row' + : 'layout-column' root.classList.add('peertube-container', layoutClass) + root.style.justifyContent = data.justifyContent || 'space-between' + if (data.width) { root.setAttribute('width', data.width) } - if (data.title) { - const titleElement = document.createElement('h4') - titleElement.innerText = data.title - root.appendChild(titleElement) - } + if (data.title || data.description) { + const headerElement = document.createElement('div') + headerElement.classList.add('header') + + if (data.title) { + const titleElement = document.createElement('h4') + titleElement.innerText = data.title + headerElement.appendChild(titleElement) + } + + if (data.description) { + const descriptionElement = document.createElement('div') + descriptionElement.innerText = data.description + headerElement.append(descriptionElement) + } - if (data.description) { - const descriptionElement = document.createElement('div') - descriptionElement.innerText = data.description - root.appendChild(descriptionElement) + root.insertBefore(headerElement, root.firstChild) } return root