mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-19 21:03:17 -07:00
Reworked the tv details page request section
This commit is contained in:
parent
fad49a251d
commit
1de4af0907
25 changed files with 398 additions and 60 deletions
|
@ -50,7 +50,7 @@ namespace Ombi.Store.Repository.Requests
|
|||
return "Common.ProcessingRequest";
|
||||
}
|
||||
|
||||
if (!Approved && !Available)
|
||||
if (!Approved && !Available && Requested)
|
||||
{
|
||||
return "Common.PendingApproval";
|
||||
}
|
||||
|
|
|
@ -9,12 +9,10 @@
|
|||
<span>{{getAvailbilityStatus()}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<img [routerLink]="generateDetailsLink()" id="cardImage" src="{{result.posterPath}}" class="image"
|
||||
alt="{{result.title}}">
|
||||
|
||||
<div class="middle">
|
||||
<a class="poster-overlay" [routerLink]="generateDetailsLink()">
|
||||
<a class="poster-overlay">
|
||||
<div class="summary">
|
||||
<div class="title">{{result.title}}</div>
|
||||
<div class="small-text ellipsis">{{result.overview}}</div>
|
||||
|
|
|
@ -19,6 +19,7 @@ import { ArtistReleasePanel } from "./artist/panels/artist-release-panel/artist-
|
|||
import { IssuesPanelComponent } from "./shared/issues-panel/issues-panel.component";
|
||||
import { TvAdvancedOptionsComponent } from "./tv/panels/tv-advanced-options/tv-advanced-options.component";
|
||||
import { RequestBehalfComponent } from "./shared/request-behalf/request-behalf.component";
|
||||
import { TvRequestGridComponent } from "./tv/panels/tv-request-grid/tv-request-grid.component";
|
||||
|
||||
export const components: any[] = [
|
||||
MovieDetailsComponent,
|
||||
|
@ -40,6 +41,7 @@ export const components: any[] = [
|
|||
ArtistReleasePanel,
|
||||
RequestBehalfComponent,
|
||||
IssuesPanelComponent,
|
||||
TvRequestGridComponent,
|
||||
];
|
||||
|
||||
export const entryComponents: any[] = [
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
|
||||
<mat-tab-group>
|
||||
<mat-tab *ngFor="let season of tv.seasonRequests">
|
||||
|
||||
<ng-template mat-tab-label>
|
||||
<div class="{{getStatusClass(season)}} top-right">
|
||||
<span>{{ 'Requests.Season' | translate }} {{season.seasonNumber}}</span>
|
||||
</div>
|
||||
</ng-template>
|
||||
|
||||
<table mat-table [dataSource]="season.episodes" class="mat-elevation-z8">
|
||||
|
||||
<ng-container matColumnDef="select">
|
||||
<th mat-header-cell *matHeaderCellDef>
|
||||
<mat-checkbox *ngIf="isSeasonCheckable(season)" (change)="$event ? masterToggle(season.episodes) : null"
|
||||
[checked]="selection.hasValue() && isAllSelected(season.episodes)"
|
||||
[indeterminate]="selection.hasValue() && !isAllSelected(season.episodes)">
|
||||
</mat-checkbox>
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let row">
|
||||
<mat-checkbox *ngIf="!row.available && !row.requested && !row.approved" (click)="$event.stopPropagation()"
|
||||
(change)="$event ? selection.toggle(row) : null"
|
||||
[checked]="selection.isSelected(row)">
|
||||
</mat-checkbox>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="number">
|
||||
<th mat-header-cell *matHeaderCellDef> # </th>
|
||||
<td mat-cell *matCellDef="let element"> {{element.episodeNumber}} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="title">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'Requests.GridTitle' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let element"> {{element.title}} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="airDate">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'Requests.AirDate' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let element"> {{element.airDate | amLocal | amDateFormat: 'L' }}</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="status">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'Requests.GridStatus' | translate }} </th>
|
||||
<td mat-cell *matCellDef="let ep">
|
||||
<div class="{{getEpisodeStatusClass(ep)}} top-right">
|
||||
<span>{{ep.requestStatus | translate}}</span>
|
||||
</div>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"
|
||||
(click)="selection.toggle(row)">
|
||||
</tr>
|
||||
</table>
|
||||
</mat-tab>
|
||||
|
||||
</mat-tab-group>
|
||||
|
||||
<!-- <div *ngIf="isAdmin">
|
||||
<button *ngIf="!request.approved" mat-raised-button color="accent" (click)="approve(request);"> {{ 'Common.Approve' | translate }}</button>
|
||||
<button *ngIf="!request.available" mat-raised-button color="warn" (click)="changeAvailability(request, true);">{{ 'Requests.MarkAvailable' | translate }}</button>
|
||||
<button *ngIf="request.available" mat-raised-button color="warn" (click)="changeAvailability(request, false);">{{ 'Requests.MarkUnavailable' | translate }}</button>
|
||||
<button *ngIf="!request.denied" mat-raised-button color="danger" (click)="deny(request);">{{ 'Requests.Deny' | translate }}</button>
|
||||
</div>
|
||||
-->
|
||||
|
||||
|
||||
<button *ngIf="!tv.fullyAvailable && requestable" mat-fab color="accent" class="floating-fab" [matMenuTriggerFor]="aboveMenu">
|
||||
<mat-icon>add</mat-icon></button>
|
||||
<mat-menu #aboveMenu="matMenu" yPosition="above">
|
||||
|
||||
<button mat-menu-item (click)="requestAllSeasons()">{{'Search.TvShows.AllSeasons' | translate }}</button>
|
||||
|
||||
<button mat-menu-item (click)="requestFirstSeason()">{{ 'Search.TvShows.FirstSeason' | translate }}</button>
|
||||
|
||||
<button mat-menu-item (click)="requestLatestSeason()">{{ 'Search.TvShows.LatestSeason' | translate }}</button>
|
||||
|
||||
<button mat-menu-item (click)="submitRequests()">{{ 'Common.Request' | translate }}</button>
|
||||
</mat-menu>
|
|
@ -0,0 +1,44 @@
|
|||
.floating-fab {
|
||||
position: fixed;
|
||||
right: 3%;
|
||||
bottom: 6%;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
|
||||
.top-right span:before{
|
||||
content: '';
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
-moz-border-radius: 7.5px;
|
||||
-webkit-border-radius: 7.5px;
|
||||
border-radius: 7.5px;
|
||||
margin-right:5px;
|
||||
}
|
||||
|
||||
.top-right.available span{
|
||||
display:block;
|
||||
}
|
||||
|
||||
.top-right.available span:before{
|
||||
display: inline-block;
|
||||
background-color: #1DE9B6;
|
||||
}
|
||||
|
||||
.top-right.approved span {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.top-right.approved span:before{
|
||||
display: inline-block;
|
||||
background-color: #ff5722;
|
||||
}
|
||||
|
||||
.top-right.requested span {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.top-right.requested span:before{
|
||||
display: inline-block;
|
||||
background-color: #ffd740;
|
||||
}
|
|
@ -0,0 +1,215 @@
|
|||
import { Component, Input } from "@angular/core";
|
||||
import { IChildRequests, IEpisodesRequests, INewSeasonRequests, ISeasonsViewModel, ITvRequestViewModel, RequestType } from "../../../../../interfaces";
|
||||
import { RequestService } from "../../../../../services/request.service";
|
||||
import { MessageService } from "../../../../../services";
|
||||
import { DenyDialogComponent } from "../../../shared/deny-dialog/deny-dialog.component";
|
||||
import { ISearchTvResultV2 } from "../../../../../interfaces/ISearchTvResultV2";
|
||||
import { MatDialog } from "@angular/material/dialog";
|
||||
import { SelectionModel } from "@angular/cdk/collections";
|
||||
|
||||
@Component({
|
||||
templateUrl: "./tv-request-grid.component.html",
|
||||
styleUrls: ["./tv-request-grid.component.scss"],
|
||||
selector: "tv-request-grid"
|
||||
})
|
||||
export class TvRequestGridComponent {
|
||||
@Input() public tv: ISearchTvResultV2;
|
||||
@Input() public tvRequest: IChildRequests[];
|
||||
@Input() public isAdmin: boolean;
|
||||
public selection = new SelectionModel<IEpisodesRequests>(true, []);
|
||||
|
||||
public get requestable() {
|
||||
return this.tv?.seasonRequests?.length > 0
|
||||
}
|
||||
|
||||
public displayedColumns: string[] = ['select', 'number', 'title', 'airDate', 'status'];
|
||||
|
||||
constructor(private requestService: RequestService, private notificationService: MessageService,
|
||||
private dialog: MatDialog) {
|
||||
|
||||
}
|
||||
|
||||
public async submitRequests() {
|
||||
// Make sure something has been selected
|
||||
const selected = this.selection.hasValue();
|
||||
if (!selected && !this.tv.requestAll && !this.tv.firstSeason && !this.tv.latestSeason) {
|
||||
this.notificationService.send("You need to select some episodes!", "OK");
|
||||
return;
|
||||
}
|
||||
|
||||
this.tv.requested = true;
|
||||
|
||||
const viewModel = <ITvRequestViewModel>{
|
||||
firstSeason: this.tv.firstSeason, latestSeason: this.tv.latestSeason, requestAll: this.tv.requestAll, tvDbId: this.tv.id,
|
||||
requestOnBehalf: null
|
||||
};
|
||||
viewModel.seasons = [];
|
||||
this.tv.seasonRequests.forEach((season) => {
|
||||
const seasonsViewModel = <ISeasonsViewModel>{ seasonNumber: season.seasonNumber, episodes: [] };
|
||||
if (!this.tv.latestSeason && !this.tv.requestAll && !this.tv.firstSeason) {
|
||||
season.episodes.forEach(ep => {
|
||||
if (this.selection.isSelected(ep)) {
|
||||
ep.requested = true;
|
||||
seasonsViewModel.episodes.push({ episodeNumber: ep.episodeNumber });
|
||||
}
|
||||
});
|
||||
}
|
||||
viewModel.seasons.push(seasonsViewModel);
|
||||
});
|
||||
|
||||
const requestResult = await this.requestService.requestTv(viewModel).toPromise();
|
||||
|
||||
if (requestResult.result) {
|
||||
this.notificationService.send(
|
||||
`Request for ${this.tv.title} has been added successfully`);
|
||||
|
||||
this.selection.clear();
|
||||
|
||||
} else {
|
||||
this.notificationService.send(requestResult.errorMessage ? requestResult.errorMessage : requestResult.message);
|
||||
}
|
||||
}
|
||||
|
||||
public async approve(request: IChildRequests) {
|
||||
const result = await this.requestService.approveChild({
|
||||
id: request.id
|
||||
}).toPromise();
|
||||
|
||||
if (result.result) {
|
||||
request.approved = true;
|
||||
request.denied = false;
|
||||
request.seasonRequests.forEach((season) => {
|
||||
season.episodes.forEach((ep) => {
|
||||
ep.approved = true;
|
||||
});
|
||||
});
|
||||
this.notificationService.send("Request has been approved", "Ok");
|
||||
} else {
|
||||
this.notificationService.send(result.errorMessage, "Ok");
|
||||
}
|
||||
}
|
||||
|
||||
public changeAvailability(request: IChildRequests, available: boolean) {
|
||||
request.available = available;
|
||||
request.seasonRequests.forEach((season) => {
|
||||
season.episodes.forEach((ep) => {
|
||||
ep.available = available;
|
||||
});
|
||||
});
|
||||
if (available) {
|
||||
this.requestService.markTvAvailable({ id: request.id }).subscribe(x => {
|
||||
if (x.result) {
|
||||
this.notificationService.send(
|
||||
`This request is now available`);
|
||||
} else {
|
||||
this.notificationService.send("Request Available", x.message ? x.message : x.errorMessage);
|
||||
request.approved = false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
this.requestService.markTvUnavailable({ id: request.id }).subscribe(x => {
|
||||
if (x.result) {
|
||||
this.notificationService.send(
|
||||
`This request is now unavailable`);
|
||||
} else {
|
||||
this.notificationService.send("Request Available", x.message ? x.message : x.errorMessage);
|
||||
request.approved = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
public async deny(request: IChildRequests) {
|
||||
const dialogRef = this.dialog.open(DenyDialogComponent, {
|
||||
width: '250px',
|
||||
data: {requestId: request.id, requestType: RequestType.tvShow}
|
||||
});
|
||||
|
||||
dialogRef.afterClosed().subscribe(result => {
|
||||
request.denied = true;
|
||||
request.seasonRequests.forEach((season) => {
|
||||
season.episodes.forEach((ep) => {
|
||||
ep.approved = false;
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public async requestAllSeasons() {
|
||||
this.tv.requestAll = true;
|
||||
await this.submitRequests();
|
||||
}
|
||||
|
||||
public async requestFirstSeason() {
|
||||
this.tv.firstSeason = true;
|
||||
await this.submitRequests();
|
||||
}
|
||||
|
||||
public async requestLatestSeason() {
|
||||
this.tv.latestSeason = true;
|
||||
await this.submitRequests();
|
||||
}
|
||||
|
||||
/** Whether the number of selected elements matches the total number of rows. */
|
||||
public isAllSelected(dataSource: IEpisodesRequests[]) {
|
||||
const numSelected = this.selection.selected.length;
|
||||
const numRows = dataSource.length;
|
||||
return numSelected === numRows;
|
||||
}
|
||||
|
||||
/** Selects all rows if they are not all selected; otherwise clear selection. */
|
||||
public masterToggle(dataSource: IEpisodesRequests[]) {
|
||||
this.isAllSelected(dataSource) ?
|
||||
this.selection.clear() :
|
||||
dataSource.forEach(row => {
|
||||
if (!row.available && !row.requested && !row.approved) {
|
||||
this.selection.select(row)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public isSeasonCheckable(season: INewSeasonRequests) {
|
||||
const seasonAvailable = season.episodes.every((ep) => {
|
||||
return ep.available || ep.requested || ep.approved;
|
||||
});
|
||||
return !seasonAvailable;
|
||||
}
|
||||
|
||||
public getStatusClass(season: INewSeasonRequests): string {
|
||||
const seasonAvailable = season.episodes.every((ep) => {
|
||||
return ep.available;
|
||||
});
|
||||
if (seasonAvailable) {
|
||||
return "available";
|
||||
}
|
||||
|
||||
const seasonPending = season.episodes.some((ep) => {
|
||||
return ep.requested && !ep.approved
|
||||
});
|
||||
if (seasonPending) {
|
||||
return "requested";
|
||||
}
|
||||
|
||||
const seasonApproved = season.episodes.some((ep) => {
|
||||
return ep.requested && ep.approved
|
||||
});
|
||||
if (seasonApproved) {
|
||||
return "approved";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public getEpisodeStatusClass(ep: IEpisodesRequests): string {
|
||||
if (ep.available) {
|
||||
return "available";
|
||||
}
|
||||
|
||||
if (ep.requested && !ep.approved) {
|
||||
return "requested";
|
||||
}
|
||||
|
||||
if (ep.requested && ep.approved) {
|
||||
return "approved";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -15,7 +15,7 @@
|
|||
</div>
|
||||
</mat-panel-title>
|
||||
<mat-panel-description>
|
||||
Requested By '{{request.requestedUser.userAlias}}' on
|
||||
{{'Requests.RequestedBy' | translate}} '{{request.requestedUser.userAlias}}' on
|
||||
{{request.requestedDate | amLocal | amDateFormat: 'LL' }}
|
||||
<span *ngIf="request.denied"> - {{request.deniedReason}}</span>
|
||||
</mat-panel-description>
|
||||
|
@ -29,7 +29,7 @@
|
|||
|
||||
|
||||
<ng-container matColumnDef="number">
|
||||
<th mat-header-cell *matHeaderCellDef> {{ 'Requests.Number' | translate }} </th>
|
||||
<th mat-header-cell *matHeaderCellDef> # </th>
|
||||
<td mat-cell *matCellDef="let element"> {{element.episodeNumber}} </td>
|
||||
</ng-container>
|
||||
|
||||
|
|
|
@ -36,9 +36,9 @@
|
|||
|
||||
<div class="col-12 col-lg-5 col-xl-5 media-row">
|
||||
|
||||
<button *ngIf="!tv.fullyAvailable" mat-raised-button class="btn-spacing" color="primary"
|
||||
<!-- <button *ngIf="!tv.fullyAvailable" mat-raised-button class="btn-spacing" color="primary"
|
||||
(click)="request()"><i class="fa fa-plus"></i>
|
||||
{{ 'Common.Request' | translate }}</button>
|
||||
{{ 'Common.Request' | translate }}</button> -->
|
||||
|
||||
<button *ngIf="tv.fullyAvailable" mat-raised-button class="btn-spacing" color="accent"
|
||||
[disabled]>
|
||||
|
@ -106,10 +106,17 @@
|
|||
|
||||
<!--Just some space yo-->
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-10">
|
||||
<tv-request-grid [tvRequest]="tvRequest" [isAdmin]="isAdmin" [tv]="tv"></tv-request-grid>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-2">
|
||||
|
||||
<!--Just some space yo-->
|
||||
|
||||
</div>
|
||||
<div class="col-12 col-md-10">
|
||||
<div class="issuesPanel">
|
||||
<issues-panel [providerId]="tv.theTvDbId" [isAdmin]="isAdmin"></issues-panel>
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
<div class="spinner-container">
|
||||
<mat-spinner *ngIf="loading" [color]="'accent'"></mat-spinner>
|
||||
</div>
|
||||
<div *ngIf="!loading" mat-dialog-content class="background">
|
||||
<div mat-dialog-content class="background">
|
||||
<div *ngIf="!requestable">
|
||||
{{'MediaDetails.EpisodeSelector.NoEpisodes' | translate}}
|
||||
</div>
|
||||
|
@ -22,9 +19,9 @@
|
|||
<mat-expansion-panel>
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
<mat-checkbox *ngIf="!season.seasonAvailable" (click)="$event.stopPropagation();" (change)="seasonChanged($event, season)">
|
||||
<mat-checkbox *ngIf="!season.seasonAvailable && isSeasonCheckable(season)" (click)="$event.stopPropagation();" (change)="seasonChanged($event, season)">
|
||||
Season {{season.seasonNumber}}</mat-checkbox>
|
||||
<span *ngIf="season.seasonAvailable">Season {{season.seasonNumber}}</span>
|
||||
<span *ngIf="season.seasonAvailable || !isSeasonCheckable(season)">Season {{season.seasonNumber}}</span>
|
||||
</mat-panel-title>
|
||||
<mat-panel-description>
|
||||
<!-- Description -->
|
||||
|
@ -51,14 +48,7 @@
|
|||
{{ep.airDateDisplay }}
|
||||
</div>
|
||||
<div class="col-3">
|
||||
<ng-template [ngIf]="ep.available"><span class="label label-success" id="availableLabel">{{'Common.Available' | translate}}</span></ng-template>
|
||||
<ng-template [ngIf]="ep.requested && ep.approved && !ep.available "><span class="label label-info" id="processingRequestLabel">{{'Common.ProcessingRequest' | translate}}</span></ng-template>
|
||||
<ng-template [ngIf]="ep.selected"><span class="label label-info" id="selectedLabel">Selected</span></ng-template>
|
||||
<ng-template [ngIf]="ep.requested && !ep.approved && !ep.available && !ep.selected"><span class="label label-warning"
|
||||
id="pendingApprovalLabel">{{'Common.PendingApproval' | translate}}</span>
|
||||
</ng-template>
|
||||
<ng-template [ngIf]="!ep.requested && !ep.available && !ep.approved && !ep.selected"><span class="label label-danger"
|
||||
id="notRequetsedLabel">Not Requested</span></ng-template>
|
||||
{{ep.requestStatus | translate}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -14,9 +14,8 @@ export interface EpisodeRequestData {
|
|||
selector: "episode-request",
|
||||
templateUrl: "episode-request.component.html",
|
||||
})
|
||||
export class EpisodeRequestComponent implements OnInit {
|
||||
export class EpisodeRequestComponent {
|
||||
|
||||
public loading: boolean;
|
||||
public get requestable() {
|
||||
return this.data?.series?.seasonRequests?.length > 0
|
||||
}
|
||||
|
@ -24,11 +23,6 @@ export class EpisodeRequestComponent implements OnInit {
|
|||
constructor(public dialogRef: MatDialogRef<EpisodeRequestComponent>, @Inject(MAT_DIALOG_DATA) public data: EpisodeRequestData,
|
||||
private requestService: RequestService, private notificationService: MessageService) { }
|
||||
|
||||
public ngOnInit() {
|
||||
this.loading = true;
|
||||
|
||||
this.loading = false;
|
||||
}
|
||||
|
||||
public async submitRequests() {
|
||||
// Make sure something has been selected
|
||||
|
@ -99,6 +93,13 @@ export class EpisodeRequestComponent implements OnInit {
|
|||
});
|
||||
}
|
||||
|
||||
public isSeasonCheckable(season: INewSeasonRequests) {
|
||||
const seasonAvailable = season.episodes.every((ep) => {
|
||||
return ep.available || ep.requested || ep.approved;
|
||||
});
|
||||
return !seasonAvailable;
|
||||
}
|
||||
|
||||
public async requestAllSeasons() {
|
||||
this.data.series.requestAll = true;
|
||||
await this.submitRequests();
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Последен сезон",
|
||||
"Select": "Изберете...",
|
||||
"SubmitRequest": "Подаване на заявка",
|
||||
"Season": "Сезон: {{seasonNumber}}",
|
||||
"Season": "Сезон {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Избиране на всичко в сезона {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Премахване",
|
||||
"Deny": "Отказване",
|
||||
"DenyReason": "Deny Reason",
|
||||
"Season": "Сезон:",
|
||||
"Season": "Сезон",
|
||||
"GridTitle": "Заглавие",
|
||||
"AirDate": "Дата на излъчване",
|
||||
"GridStatus": "Състояние",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Seneste sæson",
|
||||
"Select": "Vælg ...",
|
||||
"SubmitRequest": "Send anmodning",
|
||||
"Season": "Sæson: {{seasonNumber}}",
|
||||
"Season": "Sæson {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Vælg alle i sæson {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Fjern",
|
||||
"Deny": "Afvis",
|
||||
"DenyReason": "Deny Reason",
|
||||
"Season": "Sæson:",
|
||||
"Season": "Sæson",
|
||||
"GridTitle": "Titel",
|
||||
"AirDate": "Sendt",
|
||||
"GridStatus": "Status",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "aktuellste Staffel",
|
||||
"Select": "Wähle...",
|
||||
"SubmitRequest": "Anfrage einreichen",
|
||||
"Season": "Staffel: {{seasonNumber}}",
|
||||
"Season": "Staffel {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Markiere alles in Staffel {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Entfernen",
|
||||
"Deny": "Ablehnen",
|
||||
"DenyReason": "Ablehnungsgrund",
|
||||
"Season": "Staffel:",
|
||||
"Season": "Staffel",
|
||||
"GridTitle": "Titel",
|
||||
"AirDate": "Erstausstrahlung",
|
||||
"GridStatus": "Status",
|
||||
|
|
|
@ -117,7 +117,7 @@
|
|||
"LatestSeason": "Latest Season",
|
||||
"Select": "Select ...",
|
||||
"SubmitRequest": "Submit Request",
|
||||
"Season": "Season: {{seasonNumber}}",
|
||||
"Season": "Season {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Select All in Season {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -147,7 +147,7 @@
|
|||
"Remove": "Remove",
|
||||
"Deny": "Deny",
|
||||
"DenyReason": "Deny Reason",
|
||||
"Season": "Season:",
|
||||
"Season": "Season",
|
||||
"GridTitle": "Title",
|
||||
"AirDate": "AirDate",
|
||||
"GridStatus": "Status",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Última temporada",
|
||||
"Select": "Selecciona...",
|
||||
"SubmitRequest": "Enviar solicitud",
|
||||
"Season": "Temporada: {{seasonNumber}}",
|
||||
"Season": "Temporada {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Seleccionar todo en temporada {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Eliminar",
|
||||
"Deny": "Denegar",
|
||||
"DenyReason": "Razón Denegada",
|
||||
"Season": "Temporada:",
|
||||
"Season": "Temporada",
|
||||
"GridTitle": "Título",
|
||||
"AirDate": "Fecha de estreno",
|
||||
"GridStatus": "Estado",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Dernière saison",
|
||||
"Select": "Sélectionner...",
|
||||
"SubmitRequest": "Envoyer la demande",
|
||||
"Season": "Saison: {{seasonNumber}}",
|
||||
"Season": "Saison {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Tout sélectionner dans la saison {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Supprimer",
|
||||
"Deny": "Refuser",
|
||||
"DenyReason": "Raison de refus",
|
||||
"Season": "Saison :",
|
||||
"Season": "Saison",
|
||||
"GridTitle": "Titre",
|
||||
"AirDate": "Date de diffusion",
|
||||
"GridStatus": "Statut",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Utolsó évad",
|
||||
"Select": "Kiválasztás...",
|
||||
"SubmitRequest": "Kérés küldése",
|
||||
"Season": "Évad: {{seasonNumber}}",
|
||||
"Season": "Évad {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Egész {{seasonNumber}}. évad kiválasztása"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Törlés",
|
||||
"Deny": "Elutasítás",
|
||||
"DenyReason": "Deny Reason",
|
||||
"Season": "Évad:",
|
||||
"Season": "Évad",
|
||||
"GridTitle": "Cím",
|
||||
"AirDate": "Bemutató",
|
||||
"GridStatus": "Állapot",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Ultima Stagione",
|
||||
"Select": "Seleziona ...",
|
||||
"SubmitRequest": "Invia richiesta",
|
||||
"Season": "Stagione: {{seasonNumber}}",
|
||||
"Season": "Stagione {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Seleziona Tutto nella Stagione {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Elimina",
|
||||
"Deny": "Nega",
|
||||
"DenyReason": "Nega Motivo",
|
||||
"Season": "Stagione:",
|
||||
"Season": "Stagione",
|
||||
"GridTitle": "Titolo",
|
||||
"AirDate": "Data di trasmissione",
|
||||
"GridStatus": "Stato",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Laatste Seizoen",
|
||||
"Select": "Selecteer...",
|
||||
"SubmitRequest": "Verzoek Indienen",
|
||||
"Season": "Seizoen: {{seasonNumber}}",
|
||||
"Season": "Seizoen {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Selecteer Alles in het Seizoen {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Verwijderen",
|
||||
"Deny": "Weigeren",
|
||||
"DenyReason": "Reden van afwijzing",
|
||||
"Season": "Seizoen:",
|
||||
"Season": "Seizoen",
|
||||
"GridTitle": "Titel",
|
||||
"AirDate": "Uitzenddatum",
|
||||
"GridStatus": "Status",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Siste sesong",
|
||||
"Select": "Velg...",
|
||||
"SubmitRequest": "Send forespørsel",
|
||||
"Season": "Sesong: {{seasonNumber}}",
|
||||
"Season": "Sesong {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Velg alle i sesong {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Fjern",
|
||||
"Deny": "Avslå",
|
||||
"DenyReason": "Deny Reason",
|
||||
"Season": "Sesong:",
|
||||
"Season": "Sesong",
|
||||
"GridTitle": "Tittel",
|
||||
"AirDate": "Sendedato",
|
||||
"GridStatus": "Status",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Najnowszy sezon",
|
||||
"Select": "Wybierz…",
|
||||
"SubmitRequest": "Dodaj zgłoszenie",
|
||||
"Season": "Sezon: {{seasonNumber}}",
|
||||
"Season": "Sezon {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Wybierz wszystkie w sezonie {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Usuń",
|
||||
"Deny": "Odrzuć",
|
||||
"DenyReason": "Powód odrzucenia",
|
||||
"Season": "Sezon:",
|
||||
"Season": "Sezon",
|
||||
"GridTitle": "Tytuł",
|
||||
"AirDate": "Data emisji",
|
||||
"GridStatus": "Status",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Latest Season",
|
||||
"Select": "Select ...",
|
||||
"SubmitRequest": "Submit Request",
|
||||
"Season": "Season: {{seasonNumber}}",
|
||||
"Season": "Season {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Select All in Season {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Remove",
|
||||
"Deny": "Deny",
|
||||
"DenyReason": "Deny Reason",
|
||||
"Season": "Season:",
|
||||
"Season": "Season",
|
||||
"GridTitle": "Title",
|
||||
"AirDate": "AirDate",
|
||||
"GridStatus": "Status",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Последний сезон",
|
||||
"Select": "Выбрать...",
|
||||
"SubmitRequest": "Подать запрос",
|
||||
"Season": "Сезон: {{seasonNumber}}",
|
||||
"Season": "Сезон {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Выбрать все в сезоне {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Удалить",
|
||||
"Deny": "Отклонить",
|
||||
"DenyReason": "Deny Reason",
|
||||
"Season": "Сезон:",
|
||||
"Season": "Сезон",
|
||||
"GridTitle": "Название",
|
||||
"AirDate": "Дата",
|
||||
"GridStatus": "Статус",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Posledná séria",
|
||||
"Select": "Vybrať ...",
|
||||
"SubmitRequest": "Poslať žiadosť",
|
||||
"Season": "Séria: {{seasonNumber}}",
|
||||
"Season": "Séria {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Vybrať všetko v danej sérii {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Odstrániť",
|
||||
"Deny": "Odmietnuť",
|
||||
"DenyReason": "Deny Reason",
|
||||
"Season": "Séria:",
|
||||
"Season": "Séria",
|
||||
"GridTitle": "Názov",
|
||||
"AirDate": "Dátum vysielania",
|
||||
"GridStatus": "Stav",
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
"LatestSeason": "Senaste säsongen",
|
||||
"Select": "Välj...",
|
||||
"SubmitRequest": "Skicka begäran",
|
||||
"Season": "Säsong: {{seasonNumber}}",
|
||||
"Season": "Säsong {{seasonNumber}}",
|
||||
"SelectAllInSeason": "Välj alla avsnitt i säsong {{seasonNumber}}"
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +146,7 @@
|
|||
"Remove": "Ta bort",
|
||||
"Deny": "Neka",
|
||||
"DenyReason": "Anledning för nekande",
|
||||
"Season": "Säsong:",
|
||||
"Season": "Säsong",
|
||||
"GridTitle": "Titel",
|
||||
"AirDate": "Releasedatum",
|
||||
"GridStatus": "Status",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue