Add plugin placeholder elements support

This commit is contained in:
Chocobozzz 2021-04-12 11:10:57 +02:00
parent c96e457bde
commit 62bc0352d9
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
8 changed files with 47 additions and 7 deletions

View File

@ -16,6 +16,8 @@
[playlist]="playlist" class="playlist" [playlist]="playlist" class="playlist"
(videoFound)="onPlaylistVideoFound($event)" (videoFound)="onPlaylistVideoFound($event)"
></my-video-watch-playlist> ></my-video-watch-playlist>
<my-plugin-placeholder pluginId="player-next"></my-plugin-placeholder>
</div> </div>
<div class="row"> <div class="row">

View File

@ -5,8 +5,7 @@ import { CommonModule } from '@angular/common'
import { NgModule, Optional, SkipSelf } from '@angular/core' import { NgModule, Optional, SkipSelf } from '@angular/core'
import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
import { PeerTubeSocket } from '@app/core/notification/peertube-socket.service' import { PeerTubeSocket } from '@app/core/notification/peertube-socket.service'
import { HooksService } from '@app/core/plugins/hooks.service' import { HooksService, PluginService } from '@app/core/plugins'
import { PluginService } from '@app/core/plugins/plugin.service'
import { AuthService } from './auth' import { AuthService } from './auth'
import { ConfirmService } from './confirm' import { ConfirmService } from './confirm'
import { CheatSheetComponent } from './hotkeys' import { CheatSheetComponent } from './hotkeys'
@ -15,7 +14,7 @@ import { throwIfAlreadyLoaded } from './module-import-guard'
import { Notifier } from './notification' import { Notifier } from './notification'
import { HtmlRendererService, LinkifierService, MarkdownService } from './renderer' import { HtmlRendererService, LinkifierService, MarkdownService } from './renderer'
import { RestExtractor, RestService } from './rest' import { RestExtractor, RestService } from './rest'
import { LoginGuard, RedirectService, UserRightGuard, UnloggedGuard } from './routing' import { LoginGuard, RedirectService, UnloggedGuard, UserRightGuard } from './routing'
import { CanDeactivateGuard } from './routing/can-deactivate-guard.service' import { CanDeactivateGuard } from './routing/can-deactivate-guard.service'
import { ServerConfigResolver } from './routing/server-config-resolver.service' import { ServerConfigResolver } from './routing/server-config-resolver.service'
import { ScopedTokensService } from './scoped-tokens' import { ScopedTokensService } from './scoped-tokens'

View File

@ -0,0 +1 @@
export * from './plugin-placeholder.component'

View File

@ -0,0 +1,15 @@
import { Component, Input } from '@angular/core'
import { PluginElementPlaceholder } from '@shared/models'
@Component({
selector: 'my-plugin-placeholder',
template: '<div [id]="getId()"></div>'
})
export class PluginPlaceholderComponent {
@Input() pluginId: PluginElementPlaceholder
getId () {
return 'plugin-placeholder-' + this.pluginId
}
}

View File

@ -33,6 +33,7 @@ import { DateToggleComponent } from './date'
import { FeedComponent } from './feeds' import { FeedComponent } from './feeds'
import { LoaderComponent, SmallLoaderComponent } from './loaders' import { LoaderComponent, SmallLoaderComponent } from './loaders'
import { HelpComponent, ListOverflowComponent, SimpleSearchInputComponent, TopMenuDropdownComponent } from './misc' import { HelpComponent, ListOverflowComponent, SimpleSearchInputComponent, TopMenuDropdownComponent } from './misc'
import { PluginPlaceholderComponent } from './plugins'
import { UserHistoryService, UserNotificationsComponent, UserNotificationService, UserQuotaComponent } from './users' import { UserHistoryService, UserNotificationsComponent, UserNotificationService, UserQuotaComponent } from './users'
import { RedundancyService, VideoImportService, VideoOwnershipService, VideoService } from './video' import { RedundancyService, VideoImportService, VideoOwnershipService, VideoService } from './video'
import { VideoCaptionService } from './video-caption' import { VideoCaptionService } from './video-caption'
@ -92,7 +93,9 @@ import { VideoChannelService } from './video-channel'
SimpleSearchInputComponent, SimpleSearchInputComponent,
UserQuotaComponent, UserQuotaComponent,
UserNotificationsComponent UserNotificationsComponent,
PluginPlaceholderComponent
], ],
exports: [ exports: [
@ -144,7 +147,9 @@ import { VideoChannelService } from './video-channel'
SimpleSearchInputComponent, SimpleSearchInputComponent,
UserQuotaComponent, UserQuotaComponent,
UserNotificationsComponent UserNotificationsComponent,
PluginPlaceholderComponent
], ],
providers: [ providers: [

View File

@ -7,6 +7,7 @@ export * from './peertube-plugin-index.model'
export * from './peertube-plugin-latest-version.model' export * from './peertube-plugin-latest-version.model'
export * from './peertube-plugin.model' export * from './peertube-plugin.model'
export * from './plugin-client-scope.type' export * from './plugin-client-scope.type'
export * from './plugin-element-placeholder.type'
export * from './plugin-package-json.model' export * from './plugin-package-json.model'
export * from './plugin-playlist-privacy-manager.model' export * from './plugin-playlist-privacy-manager.model'
export * from './plugin-settings-manager.model' export * from './plugin-settings-manager.model'

View File

@ -0,0 +1 @@
export type PluginElementPlaceholder = 'player-next'

View File

@ -15,7 +15,7 @@
- [Add custom routes](#add-custom-routes) - [Add custom routes](#add-custom-routes)
- [Add external auth methods](#add-external-auth-methods) - [Add external auth methods](#add-external-auth-methods)
- [Add new transcoding profiles](#add-new-transcoding-profiles) - [Add new transcoding profiles](#add-new-transcoding-profiles)
- [Helpers](#helpers) - [Server helpers](#server-helpers)
- [Client API (themes & plugins)](#client-api-themes--plugins) - [Client API (themes & plugins)](#client-api-themes--plugins)
- [Plugin static route](#plugin-static-route) - [Plugin static route](#plugin-static-route)
- [Notifier](#notifier) - [Notifier](#notifier)
@ -26,6 +26,7 @@
- [Get server config](#get-server-config) - [Get server config](#get-server-config)
- [Add custom fields to video form](#add-custom-fields-to-video-form) - [Add custom fields to video form](#add-custom-fields-to-video-form)
- [Register settings script](#register-settings-script) - [Register settings script](#register-settings-script)
- [HTML placeholder elements](#html-placeholder-elements)
- [Publishing](#publishing) - [Publishing](#publishing)
- [Write a plugin/theme](#write-a-plugintheme) - [Write a plugin/theme](#write-a-plugintheme)
- [Clone the quickstart repository](#clone-the-quickstart-repository) - [Clone the quickstart repository](#clone-the-quickstart-repository)
@ -424,7 +425,7 @@ async function register ({
During live transcode input options are applied once for each target resolution. During live transcode input options are applied once for each target resolution.
Plugins are responsible for detecting such situation and applying input options only once if necessary. Plugins are responsible for detecting such situation and applying input options only once if necessary.
### Helpers #### Server helpers
PeerTube provides your plugin some helpers. For example: PeerTube provides your plugin some helpers. For example:
@ -628,6 +629,21 @@ async function register ({ registerSettingsScript }) {
} }
``` ```
#### HTML placeholder elements
PeerTube provides some HTML id so plugins can easily insert their own element:
```
async function register (...) {
const elem = document.createElement('div')
elem.className = 'hello-world-h4'
elem.innerHTML = '<h4>Hello everybody! This is an element next to the player</h4>'
document.getElementById('plugin-placeholder-player-next').appendChild(elem)
}
```
See the complete list on https://docs.joinpeertube.org/api-plugins
### Publishing ### Publishing