]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Refactor plugin card
authorChocobozzz <me@florianbigard.com>
Wed, 29 Dec 2021 09:41:48 +0000 (10:41 +0100)
committerChocobozzz <me@florianbigard.com>
Wed, 29 Dec 2021 09:41:48 +0000 (10:41 +0100)
14 files changed:
client/src/app/+admin/admin.module.ts
client/src/app/+admin/plugins/index.ts
client/src/app/+admin/plugins/plugin-list-installed/index.ts [new file with mode: 0644]
client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.html
client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.scss
client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.ts
client/src/app/+admin/plugins/plugin-search/index.ts [new file with mode: 0644]
client/src/app/+admin/plugins/plugin-search/plugin-search.component.html
client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts
client/src/app/+admin/plugins/plugin-show-installed/index.ts [new file with mode: 0644]
client/src/app/+admin/plugins/shared/index.ts [new file with mode: 0644]
client/src/app/+admin/plugins/shared/plugin-card.component.html [new file with mode: 0644]
client/src/app/+admin/plugins/shared/plugin-card.component.scss [moved from client/src/app/+admin/plugins/shared/plugin-list.component.scss with 94% similarity]
client/src/app/+admin/plugins/shared/plugin-card.component.ts [new file with mode: 0644]

index 36a68ba9190277807e0bda83e0571e4fadc940f6..dbced0e866fed49f7159a6d1ef501ac3860bb225 100644 (file)
@@ -41,11 +41,14 @@ import {
   VideoAdminService,
   VideoListComponent
 } from './overview'
-import { PluginListInstalledComponent } from './plugins/plugin-list-installed/plugin-list-installed.component'
-import { PluginSearchComponent } from './plugins/plugin-search/plugin-search.component'
-import { PluginShowInstalledComponent } from './plugins/plugin-show-installed/plugin-show-installed.component'
-import { PluginsComponent } from './plugins/plugins.component'
-import { PluginApiService } from './plugins/shared/plugin-api.service'
+import {
+  PluginApiService,
+  PluginCardComponent,
+  PluginListInstalledComponent,
+  PluginsComponent,
+  PluginSearchComponent,
+  PluginShowInstalledComponent
+} from './plugins'
 import { JobService, LogsComponent, LogsService } from './system'
 import { DebugComponent, DebugService } from './system/debug'
 import { JobsComponent } from './system/jobs/jobs.component'
@@ -99,6 +102,7 @@ import { JobsComponent } from './system/jobs/jobs.component'
     PluginListInstalledComponent,
     PluginSearchComponent,
     PluginShowInstalledComponent,
+    PluginCardComponent,
 
     JobsComponent,
     LogsComponent,
index b75a94556017f1ca7b7b4d754974595322370fe2..c70b6568effd0ca5f7dbf07c6075e1f71493c861 100644 (file)
@@ -1 +1,6 @@
 export * from './plugins.component'
+export * from './shared'
+export * from './plugin-list-installed'
+export * from './plugin-search'
+export * from './plugin-show-installed'
+
diff --git a/client/src/app/+admin/plugins/plugin-list-installed/index.ts b/client/src/app/+admin/plugins/plugin-list-installed/index.ts
new file mode 100644 (file)
index 0000000..0704fd2
--- /dev/null
@@ -0,0 +1 @@
+export * from './plugin-list-installed.component'
index b42bd27c5381c3bac46007d630b8314db6bb66f9..2591c9a506bbeb19e9b792bdb0f8757d0b3014b8 100644 (file)
@@ -7,39 +7,21 @@
 </div>
 
 <div class="plugins" myInfiniteScroller (nearOfBottom)="onNearOfBottom()" [dataObservable]="onDataSubject.asObservable()">
-  <div class="card plugin" *ngFor="let plugin of plugins">
-    <div class="card-body">
-      <div class="first-row">
-        <span class="plugin-name">{{ plugin.name }}</span>
-
-        <span class="plugin-version">{{ plugin.version }}</span>
-
-        <a class="plugin-icon" target="_blank" rel="noopener noreferrer" [href]="plugin.homepage" i18n-title title="Plugin homepage (new window)">
-          <my-global-icon iconName="home"></my-global-icon>
-        </a>
-
-        <a class="plugin-icon" target="_blank" rel="noopener noreferrer" [href]="getPluginOrThemeHref(plugin.name)" i18n-title title="Plugin homepage (new window)">
-          <my-global-icon iconName="npm"></my-global-icon>
-        </a>
-
-        <div class="buttons">
-          <my-edit-button
-            *ngIf="!isTheme(plugin)" [routerLink]="getShowRouterLink(plugin)" label="Settings" i18n-label
-            [responsiveLabel]="true"
-          ></my-edit-button>
-
-          <my-button
-            class="update-button" *ngIf="isUpdateAvailable(plugin)" (click)="update(plugin)" [loading]="isUpdating(plugin)"
-            [label]="getUpdateLabel(plugin)" icon="refresh" [attr.disabled]="isUpdating(plugin)" [responsiveLabel]="true"
-          ></my-button>
-
-          <my-delete-button (click)="uninstall(plugin)" label="Uninstall" i18n-label [responsiveLabel]="true"></my-delete-button>
-        </div>
-      </div>
-
-      <div class="second-row">
-        <div class="description">{{ plugin.description }}</div>
+  <ng-container *ngFor="let plugin of plugins">
+    <my-plugin-card [plugin]="plugin" [version]="plugin.version" [pluginType]="pluginType">
+      <div ngProjectAs="buttons">
+        <my-edit-button
+          *ngIf="!isTheme(plugin)" [routerLink]="getShowRouterLink(plugin)" label="Settings" i18n-label
+          [responsiveLabel]="true"
+        ></my-edit-button>
+
+        <my-button
+          class="update-button" *ngIf="isUpdateAvailable(plugin)" (click)="update(plugin)" [loading]="isUpdating(plugin)"
+          [label]="getUpdateLabel(plugin)" icon="refresh" [attr.disabled]="isUpdating(plugin)" [responsiveLabel]="true"
+        ></my-button>
+
+        <my-delete-button (click)="uninstall(plugin)" label="Uninstall" i18n-label [responsiveLabel]="true"></my-delete-button>
       </div>
-    </div>
-  </div>
+    </my-plugin-card>
+  </ng-container>
 </div>
index 5fa117d5118bc83252e43024aadf666c3d3ed195..4039f2a0249b0b2463be610b209fce8fd19bdbd2 100644 (file)
@@ -4,3 +4,8 @@
 .update-button[disabled=true] ::ng-deep .action-button {
   cursor: default !important;
 }
+
+my-edit-button,
+my-button {
+  @include margin-right(10px);
+}
index 85f9879bf941ec8b152070e4fe79a43687f1a31d..6fd238848a823c872d809d2b2ac973dea85b8507 100644 (file)
@@ -12,7 +12,6 @@ import { PeerTubePlugin, PluginType } from '@shared/models'
   templateUrl: './plugin-list-installed.component.html',
   styleUrls: [
     '../shared/toggle-plugin-type.scss',
-    '../shared/plugin-list.component.scss',
     './plugin-list-installed.component.scss'
   ]
 })
diff --git a/client/src/app/+admin/plugins/plugin-search/index.ts b/client/src/app/+admin/plugins/plugin-search/index.ts
new file mode 100644 (file)
index 0000000..5bb90a6
--- /dev/null
@@ -0,0 +1 @@
+export * from './plugin-search.component'
index a0d2287022ce85212b9df4e803f85995b9b1b010..14f28f7efe7d2f71e56cd68d5728148f483f689b 100644 (file)
 </div>
 
 <div class="plugins" myInfiniteScroller (nearOfBottom)="onNearOfBottom()" [dataObservable]="onDataSubject.asObservable()">
-  <div class="card plugin" *ngFor="let plugin of plugins">
-    <div class="card-body">
-      <div class="first-row">
-        <span class="plugin-name">{{ plugin.name }}</span>
-
-        <span class="plugin-version">{{ plugin.latestVersion }}</span>
-
-        <a class="plugin-icon" target="_blank" rel="noopener noreferrer" [href]="plugin.homepage" i18n-title title="Plugin homepage (new window)">
-          <my-global-icon iconName="home"></my-global-icon>
-        </a>
-
-        <a class="plugin-icon" target="_blank" rel="noopener noreferrer" [href]="getPluginOrThemeHref(plugin.name)" i18n-title title="Plugin npm package (new window)">
-          <my-global-icon iconName="npm"></my-global-icon>
-        </a>
-
-        <span *ngIf="plugin.installed" class="badge badge-success">Installed</span>
-
+  <ng-container *ngFor="let plugin of plugins" >
+    <my-plugin-card [plugin]="plugin" [version]="plugin.latestVersion" [pluginType]="pluginType">
+      <div ngProjectAs="badges">
+        <span i18n *ngIf="plugin.installed" class="badge badge-success">Installed</span>
 
         <span *ngIf="plugin.official" class="badge badge-primary" i18n i18n-title title="This plugin is developed by Framasoft">
           Official
         </span>
-
-        <div class="buttons">
-          <my-edit-button
-            *ngIf="plugin.installed === true && !isThemeSearch()" [routerLink]="getShowRouterLink(plugin)"
-            label="Settings" i18n-label [responsiveLabel]="true"
-          ></my-edit-button>
-
-          <my-button
-            class="update-button" *ngIf="plugin.installed === false" (click)="install(plugin)"
-            [loading]="isInstalling(plugin)" label="Install" [responsiveLabel]="true"
-            icon="cloud-download" [attr.disabled]="isInstalling(plugin)"
-          ></my-button>
-        </div>
       </div>
 
-      <div class="second-row">
-        <div class="description">{{ plugin.description }}</div>
+      <div ngProjectAs="buttons">
+        <my-edit-button
+          *ngIf="plugin.installed === true && !isThemeSearch()" [routerLink]="getShowRouterLink(plugin)"
+          label="Settings" i18n-label [responsiveLabel]="true"
+        ></my-edit-button>
+
+        <my-button
+          class="update-button" *ngIf="plugin.installed === false" (click)="install(plugin)"
+          [loading]="isInstalling(plugin)" label="Install" [responsiveLabel]="true"
+          icon="cloud-download" [attr.disabled]="isInstalling(plugin)"
+        ></my-button>
       </div>
-    </div>
-  </div>
+
+    </my-plugin-card>
+  </ng-container>
 </div>
index 803777eb30a49c4114d75d99dc644469cd2a5875..ef704c83bdeae6d5fbf27b4b583cc810ddc27265 100644 (file)
@@ -11,7 +11,6 @@ import { PeerTubePluginIndex, PluginType } from '@shared/models'
   templateUrl: './plugin-search.component.html',
   styleUrls: [
     '../shared/toggle-plugin-type.scss',
-    '../shared/plugin-list.component.scss',
     './plugin-search.component.scss'
   ]
 })
@@ -115,10 +114,6 @@ export class PluginSearchComponent implements OnInit {
     return !!this.installing[plugin.npmName]
   }
 
-  getPluginOrThemeHref (name: string) {
-    return this.pluginApiService.getPluginOrThemeHref(this.pluginType, name)
-  }
-
   getShowRouterLink (plugin: PeerTubePluginIndex) {
     return [ '/admin', 'plugins', 'show', this.pluginService.nameToNpmName(plugin.name, this.pluginType) ]
   }
diff --git a/client/src/app/+admin/plugins/plugin-show-installed/index.ts b/client/src/app/+admin/plugins/plugin-show-installed/index.ts
new file mode 100644 (file)
index 0000000..8aeceb9
--- /dev/null
@@ -0,0 +1 @@
+export * from './plugin-show-installed.component'
diff --git a/client/src/app/+admin/plugins/shared/index.ts b/client/src/app/+admin/plugins/shared/index.ts
new file mode 100644 (file)
index 0000000..de037c4
--- /dev/null
@@ -0,0 +1,2 @@
+export * from './plugin-api.service'
+export * from './plugin-card.component'
diff --git a/client/src/app/+admin/plugins/shared/plugin-card.component.html b/client/src/app/+admin/plugins/shared/plugin-card.component.html
new file mode 100644 (file)
index 0000000..c9fe620
--- /dev/null
@@ -0,0 +1,27 @@
+<div class="card plugin">
+  <div class="card-body">
+    <div class="first-row">
+      <span class="plugin-name">{{ plugin.name }}</span>
+
+      <span class="plugin-version">{{ version }}</span>
+
+      <a class="plugin-icon" target="_blank" rel="noopener noreferrer" [href]="plugin.homepage" i18n-title title="Plugin homepage (new window)">
+        <my-global-icon iconName="home"></my-global-icon>
+      </a>
+
+      <a class="plugin-icon" target="_blank" rel="noopener noreferrer" [href]="getPluginOrThemeHref(plugin.name)" i18n-title title="Plugin homepage (new window)">
+        <my-global-icon iconName="npm"></my-global-icon>
+      </a>
+
+      <ng-content select="badges"></ng-content>
+
+      <div class="buttons">
+        <ng-content select="buttons"></ng-content>
+      </div>
+    </div>
+
+    <div class="second-row">
+      <div class="description">{{ plugin.description }}</div>
+    </div>
+  </div>
+</div>
similarity index 94%
rename from client/src/app/+admin/plugins/shared/plugin-list.component.scss
rename to client/src/app/+admin/plugins/shared/plugin-card.component.scss
index 01c6ee64dddf37e5bf03cf283b99da6e1415ba29..608064722bf1fe4861760db5f3a0756e78e426b8 100644 (file)
 
   .buttons {
     @include margin-left(auto);
-    width: max-content;
 
-    > *:not(:last-child) {
-      @include margin-right(10px);
-    }
+    width: max-content;
   }
 }
 
diff --git a/client/src/app/+admin/plugins/shared/plugin-card.component.ts b/client/src/app/+admin/plugins/shared/plugin-card.component.ts
new file mode 100644 (file)
index 0000000..462a6c2
--- /dev/null
@@ -0,0 +1,24 @@
+import { Component, Input } from '@angular/core'
+import { PeerTubePlugin, PeerTubePluginIndex, PluginType } from '@shared/models'
+import { PluginApiService } from './plugin-api.service'
+
+@Component({
+  selector: 'my-plugin-card',
+  templateUrl: './plugin-card.component.html',
+  styleUrls: [ './plugin-card.component.scss' ]
+})
+
+export class PluginCardComponent {
+  @Input() plugin: PeerTubePluginIndex | PeerTubePlugin
+  @Input() version: string
+  @Input() pluginType: PluginType
+
+  constructor (
+    private pluginApiService: PluginApiService
+  ) {
+  }
+
+  getPluginOrThemeHref (name: string) {
+    return this.pluginApiService.getPluginOrThemeHref(this.pluginType, name)
+  }
+}