diff options
Diffstat (limited to 'client/src/app/modal')
6 files changed, 275 insertions, 0 deletions
diff --git a/client/src/app/modal/instance-config-warning-modal.component.html b/client/src/app/modal/instance-config-warning-modal.component.html new file mode 100644 index 000000000..64f14e69b --- /dev/null +++ b/client/src/app/modal/instance-config-warning-modal.component.html | |||
@@ -0,0 +1,45 @@ | |||
1 | <ng-template #modal let-hide="close"> | ||
2 | <div class="modal-header"> | ||
3 | <h4 i18n class="modal-title">Configuration warning!</h4> | ||
4 | <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon> | ||
5 | </div> | ||
6 | |||
7 | <div class="modal-body"> | ||
8 | |||
9 | <p i18n>Hello dear administrator. You enabled user registration on your instance but you did not configure the following fields:</p> | ||
10 | |||
11 | <ul> | ||
12 | <li i18n *ngIf="about.instance.name.toLowerCase() === 'peertube'">Instance name</li> | ||
13 | <li i18n *ngIf="isDefaultShortDescription(about.instance.shortDescription)">Instance short description</li> | ||
14 | |||
15 | <li i18n *ngIf="!about.instance.administrator">Who you are</li> | ||
16 | <li i18n *ngIf="!about.instance.maintenanceLifetime">How long you plan to maintain your instance</li> | ||
17 | <li i18n *ngIf="!about.instance.businessModel">How you plan to pay your instance</li> | ||
18 | |||
19 | <li i18n *ngIf="!about.instance.moderationInformation">How you will moderate your instance</li> | ||
20 | <li i18n *ngIf="!about.instance.terms">Instance terms</li> | ||
21 | </ul> | ||
22 | |||
23 | <p> | ||
24 | Please consider to configure these fields to help people to choose <strong>the appropriate instance</strong>. | ||
25 | Without them, your instance may not be referenced on <a target="_blank" rel="noopener noreferrer" href="https://joinpeertube.org">JoinPeerTube website</a>. | ||
26 | </p> | ||
27 | |||
28 | <div class="configure-instance"> | ||
29 | <a i18n href="/admin/config/edit-custom" target="_blank" rel="noopener noreferrer">Configure these fields</a> | ||
30 | </div> | ||
31 | |||
32 | </div> | ||
33 | |||
34 | <div class="modal-footer inputs"> | ||
35 | <my-peertube-checkbox | ||
36 | inputName="stopDisplayModal" [(ngModel)]="stopDisplayModal" | ||
37 | i18n-labelText labelText="Don't show me this warning anymore" | ||
38 | > | ||
39 | |||
40 | </my-peertube-checkbox> | ||
41 | |||
42 | <span i18n class="action-button action-button-cancel" (click)="hide()">Close</span> | ||
43 | </div> | ||
44 | |||
45 | </ng-template> | ||
diff --git a/client/src/app/modal/instance-config-warning-modal.component.scss b/client/src/app/modal/instance-config-warning-modal.component.scss new file mode 100644 index 000000000..ff62a1b9c --- /dev/null +++ b/client/src/app/modal/instance-config-warning-modal.component.scss | |||
@@ -0,0 +1,22 @@ | |||
1 | @import '_mixins'; | ||
2 | @import '_variables'; | ||
3 | |||
4 | .action-button-cancel { | ||
5 | margin-right: 0 !important; | ||
6 | } | ||
7 | |||
8 | .modal-body { | ||
9 | font-size: 15px; | ||
10 | } | ||
11 | |||
12 | li { | ||
13 | margin-bottom: 10px; | ||
14 | } | ||
15 | |||
16 | .configure-instance { | ||
17 | text-align: center; | ||
18 | font-weight: 600; | ||
19 | font-size: 18px; | ||
20 | margin-top: 40px; | ||
21 | margin-bottom: 10px; | ||
22 | } | ||
diff --git a/client/src/app/modal/instance-config-warning-modal.component.ts b/client/src/app/modal/instance-config-warning-modal.component.ts new file mode 100644 index 000000000..742a7dd41 --- /dev/null +++ b/client/src/app/modal/instance-config-warning-modal.component.ts | |||
@@ -0,0 +1,47 @@ | |||
1 | import { Component, ElementRef, ViewChild } from '@angular/core' | ||
2 | import { Notifier } from '@app/core' | ||
3 | import { NgbModal } from '@ng-bootstrap/ng-bootstrap' | ||
4 | import { About } from '@shared/models/server' | ||
5 | import { UserService } from '@app/shared' | ||
6 | |||
7 | @Component({ | ||
8 | selector: 'my-instance-config-warning-modal', | ||
9 | templateUrl: './instance-config-warning-modal.component.html', | ||
10 | styleUrls: [ './instance-config-warning-modal.component.scss' ] | ||
11 | }) | ||
12 | export class InstanceConfigWarningModalComponent { | ||
13 | @ViewChild('modal', { static: true }) modal: ElementRef | ||
14 | |||
15 | stopDisplayModal = false | ||
16 | about: About | ||
17 | |||
18 | constructor ( | ||
19 | private userService: UserService, | ||
20 | private modalService: NgbModal, | ||
21 | private notifier: Notifier | ||
22 | ) { } | ||
23 | |||
24 | show (about: About) { | ||
25 | this.about = about | ||
26 | |||
27 | const ref = this.modalService.open(this.modal) | ||
28 | |||
29 | ref.result.finally(() => { | ||
30 | if (this.stopDisplayModal === true) this.doNotOpenAgain() | ||
31 | }) | ||
32 | } | ||
33 | |||
34 | isDefaultShortDescription (description: string) { | ||
35 | return description === 'PeerTube, a federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly ' + | ||
36 | 'in the web browser with WebTorrent and Angular.' | ||
37 | } | ||
38 | |||
39 | private doNotOpenAgain () { | ||
40 | this.userService.updateMyProfile({ noInstanceConfigWarningModal: true }) | ||
41 | .subscribe( | ||
42 | () => console.log('We will not open the instance config warning modal again.'), | ||
43 | |||
44 | err => this.notifier.error(err.message) | ||
45 | ) | ||
46 | } | ||
47 | } | ||
diff --git a/client/src/app/modal/welcome-modal.component.html b/client/src/app/modal/welcome-modal.component.html new file mode 100644 index 000000000..09ff2163b --- /dev/null +++ b/client/src/app/modal/welcome-modal.component.html | |||
@@ -0,0 +1,67 @@ | |||
1 | <ng-template #modal let-hide="close"> | ||
2 | <div class="modal-header"> | ||
3 | <h4 i18n class="modal-title">Welcome on PeerTube dear administrator!</h4> | ||
4 | <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon> | ||
5 | </div> | ||
6 | |||
7 | <div class="modal-body"> | ||
8 | |||
9 | <div class="block-documentation"> | ||
10 | <div i18n class="subtitle">Documentation</div> | ||
11 | |||
12 | <div class="columns"> | ||
13 | <a class="link-block" href="https://docs.joinpeertube.org/#/maintain-tools" target="_blank" rel="noopener noreferrer"> | ||
14 | <a class="link-title" href="https://docs.joinpeertube.org/#/maintain-tools" target="_blank" rel="noopener noreferrer">CLI</a> | ||
15 | |||
16 | <div>Upload or import videos, parse logs, prune storage directories, reset user password...</div> | ||
17 | </a> | ||
18 | |||
19 | <a class="link-block" href="https://docs.joinpeertube.org/#/admin-following-instances" target="_blank" rel="noopener noreferrer"> | ||
20 | <a class="link-title" href="https://docs.joinpeertube.org/#/admin-following-instances" target="_blank" rel="noopener noreferrer">Administer</a> | ||
21 | |||
22 | <div>Managing users, following other instances, dealing with spammers...</div> | ||
23 | </a> | ||
24 | |||
25 | <a class="link-block" href="https://docs.joinpeertube.org/#/use-setup-account" target="_blank" rel="noopener noreferrer"> | ||
26 | <a class="link-title" href="https://docs.joinpeertube.org/#/use-setup-account" target="_blank" rel="noopener noreferrer">Use</a> | ||
27 | |||
28 | <div>Setup your account, managing video playlists, discover third-party applications...</div> | ||
29 | </a> | ||
30 | </div> | ||
31 | </div> | ||
32 | |||
33 | <div class="block-configuration"> | ||
34 | <div i18n class="subtitle">It's time to configure your instance!</div> | ||
35 | |||
36 | <p i18n> | ||
37 | Choosing your <strong>instance name</strong>, <strong>setting up a description</strong>, specifying <strong>who you are</strong>, | ||
38 | why <strong>you created your instance</strong> and <strong>how long</strong> you plan to <strong>maintain your it</strong> | ||
39 | is very important for visitors to understand on what type of instance they are. | ||
40 | </p> | ||
41 | |||
42 | <p i18n> | ||
43 | If you want to open registrations, please decide what are <strong>your moderation rules</strong>, fill your <strong>instance terms</strong> | ||
44 | and specify the categories and languages you speak. This way, you will help users to register on <strong>the appropriate</strong> PeerTube instance. | ||
45 | </p> | ||
46 | |||
47 | <div class="configure-instance"> | ||
48 | <a i18n href="/admin/config/edit-custom" target="_blank" rel="noopener noreferrer">Configure your instance</a> | ||
49 | </div> | ||
50 | </div> | ||
51 | |||
52 | <div class="block-links"> | ||
53 | <div i18n class="subtitle">Useful links</div> | ||
54 | |||
55 | <ul> | ||
56 | <li>Official PeerTube website (news, support, contribute...): <a href="https://joinpeertube.org" target="_blank" rel="noopener noreferrer">https://joinpeertube.org</a></li> | ||
57 | |||
58 | <li>Put your instance on the public PeerTube index: <a href="https://instances.joinpeertube.org/instances">https://instances.joinpeertube.org/instances</a></li> | ||
59 | </ul> | ||
60 | </div> | ||
61 | </div> | ||
62 | |||
63 | <div class="modal-footer inputs"> | ||
64 | <span i18n class="action-button action-button-submit" (click)="hide()">Understood!</span> | ||
65 | </div> | ||
66 | |||
67 | </ng-template> | ||
diff --git a/client/src/app/modal/welcome-modal.component.scss b/client/src/app/modal/welcome-modal.component.scss new file mode 100644 index 000000000..8bb6973f4 --- /dev/null +++ b/client/src/app/modal/welcome-modal.component.scss | |||
@@ -0,0 +1,56 @@ | |||
1 | @import '_mixins'; | ||
2 | @import '_variables'; | ||
3 | |||
4 | .modal-body { | ||
5 | font-size: 15px; | ||
6 | } | ||
7 | |||
8 | .subtitle { | ||
9 | font-weight: $font-semibold; | ||
10 | margin-bottom: 10px; | ||
11 | font-size: 16px; | ||
12 | } | ||
13 | |||
14 | .block-documentation .subtitle { | ||
15 | margin-bottom: 20px; | ||
16 | } | ||
17 | |||
18 | .block-configuration, | ||
19 | .block-instance { | ||
20 | margin-top: 30px; | ||
21 | } | ||
22 | |||
23 | li { | ||
24 | margin-bottom: 10px; | ||
25 | } | ||
26 | |||
27 | .configure-instance { | ||
28 | text-align: center; | ||
29 | font-weight: 600; | ||
30 | font-size: 18px; | ||
31 | margin: 20px 0 40px 0; | ||
32 | } | ||
33 | |||
34 | .columns { | ||
35 | display: flex; | ||
36 | |||
37 | .link-block { | ||
38 | @include disable-default-a-behaviour; | ||
39 | |||
40 | color: var(--mainForegroundColor); | ||
41 | padding: 10px; | ||
42 | transition: background-color 0.2s ease-in; | ||
43 | |||
44 | &:hover { | ||
45 | background-color: rgba(0, 0, 0, 0.05); | ||
46 | } | ||
47 | |||
48 | .link-title { | ||
49 | font-size: 16px; | ||
50 | font-weight: $font-semibold; | ||
51 | display: flex; | ||
52 | justify-content: center; | ||
53 | margin-bottom: 5px; | ||
54 | } | ||
55 | } | ||
56 | } | ||
diff --git a/client/src/app/modal/welcome-modal.component.ts b/client/src/app/modal/welcome-modal.component.ts new file mode 100644 index 000000000..05412a4cd --- /dev/null +++ b/client/src/app/modal/welcome-modal.component.ts | |||
@@ -0,0 +1,38 @@ | |||
1 | import { Component, ElementRef, ViewChild } from '@angular/core' | ||
2 | import { Notifier } from '@app/core' | ||
3 | import { NgbModal } from '@ng-bootstrap/ng-bootstrap' | ||
4 | import { UserService } from '@app/shared' | ||
5 | |||
6 | @Component({ | ||
7 | selector: 'my-welcome-modal', | ||
8 | templateUrl: './welcome-modal.component.html', | ||
9 | styleUrls: [ './welcome-modal.component.scss' ] | ||
10 | }) | ||
11 | export class WelcomeModalComponent { | ||
12 | @ViewChild('modal', { static: true }) modal: ElementRef | ||
13 | |||
14 | constructor ( | ||
15 | private userService: UserService, | ||
16 | private modalService: NgbModal, | ||
17 | private notifier: Notifier | ||
18 | ) { } | ||
19 | |||
20 | show () { | ||
21 | const ref = this.modalService.open(this.modal,{ | ||
22 | backdrop: 'static', | ||
23 | keyboard: false, | ||
24 | size: 'lg' | ||
25 | }) | ||
26 | |||
27 | ref.result.finally(() => this.doNotOpenAgain()) | ||
28 | } | ||
29 | |||
30 | private doNotOpenAgain () { | ||
31 | this.userService.updateMyProfile({ noWelcomeModal: true }) | ||
32 | .subscribe( | ||
33 | () => console.log('We will not open the welcome modal again.'), | ||
34 | |||
35 | err => this.notifier.error(err.message) | ||
36 | ) | ||
37 | } | ||
38 | } | ||