X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Fshared-custom-markup%2Fcustom-markup.service.ts;h=231e52d0a57d8c74b96c78fdfbd14c4fbb8e2fd6;hb=674d903b0e993b3a67836f3dabba80282d9900ab;hp=db5f64ee80bc6b72ed2a8f4c5ee023c1b8185fa7;hpb=9105634f16e5dfc66df198f23dbfae77dff2d821;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 db5f64ee8..231e52d0a 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 { first } from 'rxjs/operators' import { ComponentRef, Injectable } from '@angular/core' import { MarkdownService } from '@app/core' import { @@ -19,8 +20,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 +47,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 () { @@ -60,23 +65,30 @@ export class CustomMarkupService { for (const selector of Object.keys(this.htmlBuilders)) { rootElement.querySelectorAll(selector) - .forEach((e: HTMLElement) => { - try { - const element = this.execHTMLBuilder(selector, e) - // Insert as first child - e.insertBefore(element, e.firstChild) - } catch (err) { - console.error('Cannot inject component %s.', selector, err) - } - }) + .forEach((e: HTMLElement) => { + try { + const element = this.execHTMLBuilder(selector, e) + // Insert as first child + e.insertBefore(element, e.firstChild) + } catch (err) { + console.error('Cannot inject component %s.', selector, err) + } + }) } + 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 = component.instance.loaded.pipe(first()).toPromise() + loadedPromises.push(p) + } + this.dynamicElementService.injectElement(e, component) } catch (err) { console.error('Cannot inject component %s.', selector, err) @@ -84,7 +96,7 @@ export class CustomMarkupService { }) } - return rootElement + return { rootElement, componentsLoaded: Promise.all(loadedPromises) } } private getSupportedTags () { @@ -122,7 +134,13 @@ export class CustomMarkupService { const data = el.dataset as ChannelMiniatureMarkupData const component = this.dynamicElementService.createElement(ChannelMiniatureMarkupComponent) - this.dynamicElementService.setModel(component, { name: data.name }) + const model = { + name: data.name, + displayLatestVideo: this.buildBoolean(data.displayLatestVideo) ?? true, + displayDescription: this.buildBoolean(data.displayDescription) ?? true + } + + this.dynamicElementService.setModel(component, model) return component } @@ -132,10 +150,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) @@ -162,11 +180,18 @@ 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, + + filter: this.buildBoolean(data.onlyLocal) ? 'local' as VideoFilter : undefined } this.dynamicElementService.setModel(component, model) @@ -177,23 +202,40 @@ 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.classList.add('peertube-container') + root.innerHTML = content + + const layoutClass = data.layout + ? 'layout-' + data.layout + : 'layout-column' + + root.classList.add('peertube-container', layoutClass) 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