mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-14 09:12:57 -07:00
Did the vote settings and frontend !wip
This commit is contained in:
parent
a93fdc66ac
commit
64a741a60d
11 changed files with 157 additions and 4 deletions
|
@ -54,6 +54,12 @@
|
||||||
<i class="fa fa-user"></i> {{ 'NavigationBar.UserManagement' | translate }}</a>
|
<i class="fa fa-user"></i> {{ 'NavigationBar.UserManagement' | translate }}</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<ul *ngIf="voteEnabled" class="nav navbar-nav">
|
||||||
|
<li id="Vote" [routerLinkActive]="['active']">
|
||||||
|
<a [routerLink]="['/vote']">
|
||||||
|
<i class="fa fa-thumbs-o-up"></i> {{ 'NavigationBar.Vote' | translate }}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<ul *ngIf="hasRole('Admin') || hasRole('PowerUser')" class="nav navbar-nav donation">
|
<ul *ngIf="hasRole('Admin') || hasRole('PowerUser')" class="nav navbar-nav donation">
|
||||||
<li>
|
<li>
|
||||||
|
|
|
@ -23,6 +23,7 @@ export class AppComponent implements OnInit {
|
||||||
public updateAvailable: boolean;
|
public updateAvailable: boolean;
|
||||||
public currentUrl: string;
|
public currentUrl: string;
|
||||||
public userAccessToken: string;
|
public userAccessToken: string;
|
||||||
|
public voteEnabled = false;
|
||||||
|
|
||||||
private checkedForUpdate: boolean;
|
private checkedForUpdate: boolean;
|
||||||
|
|
||||||
|
@ -54,6 +55,7 @@ export class AppComponent implements OnInit {
|
||||||
|
|
||||||
this.settingsService.getCustomization().subscribe(x => this.customizationSettings = x);
|
this.settingsService.getCustomization().subscribe(x => this.customizationSettings = x);
|
||||||
this.settingsService.issueEnabled().subscribe(x => this.issuesEnabled = x);
|
this.settingsService.issueEnabled().subscribe(x => this.issuesEnabled = x);
|
||||||
|
this.settingsService.voteEnabled().subscribe(x => this.voteEnabled =x);
|
||||||
|
|
||||||
this.router.events.subscribe((event: NavigationStart) => {
|
this.router.events.subscribe((event: NavigationStart) => {
|
||||||
this.currentUrl = event.url;
|
this.currentUrl = event.url;
|
||||||
|
|
|
@ -231,3 +231,10 @@ export interface IJobSettingsViewModel {
|
||||||
result: boolean;
|
result: boolean;
|
||||||
message: string;
|
message: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IVoteSettings extends ISettings {
|
||||||
|
enabled: boolean;
|
||||||
|
movieVoteMax: number;
|
||||||
|
musicVoteMax: number;
|
||||||
|
tvShowVoteMax: number;
|
||||||
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import {
|
||||||
IThemes,
|
IThemes,
|
||||||
IUpdateSettings,
|
IUpdateSettings,
|
||||||
IUserManagementSettings,
|
IUserManagementSettings,
|
||||||
|
IVoteSettings,
|
||||||
} from "../interfaces";
|
} from "../interfaces";
|
||||||
|
|
||||||
import { ServiceHelpers } from "./service.helpers";
|
import { ServiceHelpers } from "./service.helpers";
|
||||||
|
@ -284,6 +285,18 @@ export class SettingsService extends ServiceHelpers {
|
||||||
.post<boolean>(`${this.url}/issues`, JSON.stringify(settings), {headers: this.headers});
|
.post<boolean>(`${this.url}/issues`, JSON.stringify(settings), {headers: this.headers});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getVoteSettings(): Observable<IVoteSettings> {
|
||||||
|
return this.http.get<IVoteSettings>(`${this.url}/vote`, {headers: this.headers});
|
||||||
|
}
|
||||||
|
|
||||||
|
public voteEnabled(): Observable<boolean> {
|
||||||
|
return this.http.get<boolean>(`${this.url}/voteenabled`, {headers: this.headers});
|
||||||
|
}
|
||||||
|
|
||||||
|
public saveVoteSettings(settings: IVoteSettings): Observable<boolean> {
|
||||||
|
return this.http.post<boolean>(`${this.url}/vote`, JSON.stringify(settings), {headers: this.headers});
|
||||||
|
}
|
||||||
|
|
||||||
public getNewsletterSettings(): Observable<INewsletterNotificationSettings> {
|
public getNewsletterSettings(): Observable<INewsletterNotificationSettings> {
|
||||||
return this.http.get<INewsletterNotificationSettings>(`${this.url}/notifications/newsletter`, {headers: this.headers});
|
return this.http.get<INewsletterNotificationSettings>(`${this.url}/notifications/newsletter`, {headers: this.headers});
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ import { SickRageComponent } from "./sickrage/sickrage.component";
|
||||||
import { SonarrComponent } from "./sonarr/sonarr.component";
|
import { SonarrComponent } from "./sonarr/sonarr.component";
|
||||||
import { UpdateComponent } from "./update/update.component";
|
import { UpdateComponent } from "./update/update.component";
|
||||||
import { UserManagementComponent } from "./usermanagement/usermanagement.component";
|
import { UserManagementComponent } from "./usermanagement/usermanagement.component";
|
||||||
|
import { VoteComponent } from "./vote/vote.component";
|
||||||
import { WikiComponent } from "./wiki.component";
|
import { WikiComponent } from "./wiki.component";
|
||||||
|
|
||||||
import { SettingsMenuComponent } from "./settingsmenu.component";
|
import { SettingsMenuComponent } from "./settingsmenu.component";
|
||||||
|
@ -75,6 +76,7 @@ const routes: Routes = [
|
||||||
{ path: "MassEmail", component: MassEmailComponent, canActivate: [AuthGuard] },
|
{ path: "MassEmail", component: MassEmailComponent, canActivate: [AuthGuard] },
|
||||||
{ path: "Newsletter", component: NewsletterComponent, canActivate: [AuthGuard] },
|
{ path: "Newsletter", component: NewsletterComponent, canActivate: [AuthGuard] },
|
||||||
{ path: "Lidarr", component: LidarrComponent, canActivate: [AuthGuard] },
|
{ path: "Lidarr", component: LidarrComponent, canActivate: [AuthGuard] },
|
||||||
|
{ path: "Vote", component: VoteComponent, canActivate: [AuthGuard] },
|
||||||
];
|
];
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
|
@ -127,6 +129,7 @@ const routes: Routes = [
|
||||||
MassEmailComponent,
|
MassEmailComponent,
|
||||||
NewsletterComponent,
|
NewsletterComponent,
|
||||||
LidarrComponent,
|
LidarrComponent,
|
||||||
|
VoteComponent,
|
||||||
],
|
],
|
||||||
exports: [
|
exports: [
|
||||||
RouterModule,
|
RouterModule,
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<li [routerLinkActive]="['active']"><a [routerLink]="['/Settings/Issues']">Issues</a></li>
|
<li [routerLinkActive]="['active']"><a [routerLink]="['/Settings/Issues']">Issues</a></li>
|
||||||
<li [routerLinkActive]="['active']"><a [routerLink]="['/Settings/UserManagement']">User Importer</a></li>
|
<li [routerLinkActive]="['active']"><a [routerLink]="['/Settings/UserManagement']">User Importer</a></li>
|
||||||
<li [routerLinkActive]="['active']"><a [routerLink]="['/Settings/Authentication']">Authentication</a></li>
|
<li [routerLinkActive]="['active']"><a [routerLink]="['/Settings/Authentication']">Authentication</a></li>
|
||||||
|
<li [routerLinkActive]="['active']"><a [routerLink]="['/Settings/Vote']">Vote</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
|
50
src/Ombi/ClientApp/app/settings/vote/vote.component.html
Normal file
50
src/Ombi/ClientApp/app/settings/vote/vote.component.html
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
<settings-menu></settings-menu>
|
||||||
|
<wiki [url]="'https://github.com/tidusjar/Ombi/wiki/Vote-Settings'"></wiki>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<legend>Vote</legend>
|
||||||
|
<form *ngIf="form" novalidate [formGroup]="form" (ngSubmit)="onSubmit(form)" style="padding-top:5%;">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="checkbox">
|
||||||
|
<input type="checkbox" id="enable" formControlName="enabled" ng-checked="form.enabled">
|
||||||
|
<label for="enable">Enable</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>Vote limits tell Ombi how many votes the request needs before approval.</p>
|
||||||
|
<p>e.g. If the Movie vote limit is 10, it requires 10 Upvotes from 10 different users before it will be approved.</p>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="movieVoteMax" class="control-label">Movie Vote Limit</label>
|
||||||
|
<input type="number" class="form-control form-control-custom form-small" min="1" id="movieVoteMax" [ngClass]="{'form-error': form.get('movieVoteMax').hasError('min')}"
|
||||||
|
formControlName="movieVoteMax" ng-checked="form.movieVoteMax">
|
||||||
|
|
||||||
|
<small *ngIf="form.get('movieVoteMax').hasError('min')" class="error-text">The limit needs to be greater than or equal to 1</small>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="musicVoteMax" class="control-label">Music Vote Limit</label>
|
||||||
|
<input type="number" class="form-control form-control-custom form-small" min="1" id="musicVoteMax" [ngClass]="{'form-error': form.get('movieVoteMax').hasError('min')}"
|
||||||
|
formControlName="musicVoteMax" ng-checked="form.musicVoteMax">
|
||||||
|
<small *ngIf="form.get('movieVoteMax').hasError('min')" class="error-text">The limit needs to be greater than or equal to 1</small>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tvShowVoteMax" class="control-label">TV Show Vote Limit</label>
|
||||||
|
<input type="number" class="form-control form-control-custom form-small" min="1" id="tvShowVoteMax" [ngClass]="{'form-error': form.get('movieVoteMax').hasError('min')}"
|
||||||
|
formControlName="tvShowVoteMax" ng-checked="form.tvShowVoteMax">
|
||||||
|
<small *ngIf="form.get('movieVoteMax').hasError('min')" class="error-text">The limit needs to be greater than or equal to 1</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<div>
|
||||||
|
<button type="submit" [disabled]="form.invalid" class="btn btn-primary-outline ">Submit</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</fieldset>
|
44
src/Ombi/ClientApp/app/settings/vote/vote.component.ts
Normal file
44
src/Ombi/ClientApp/app/settings/vote/vote.component.ts
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
import { Component, OnInit } from "@angular/core";
|
||||||
|
import { FormBuilder, FormGroup, Validators } from "@angular/forms";
|
||||||
|
|
||||||
|
import { NotificationService, SettingsService } from "../../services";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
templateUrl: "./vote.component.html",
|
||||||
|
})
|
||||||
|
export class VoteComponent implements OnInit {
|
||||||
|
|
||||||
|
public form: FormGroup;
|
||||||
|
|
||||||
|
constructor(private settingsService: SettingsService,
|
||||||
|
private readonly fb: FormBuilder,
|
||||||
|
private notificationService: NotificationService) { }
|
||||||
|
|
||||||
|
public ngOnInit() {
|
||||||
|
this.settingsService.getVoteSettings().subscribe(x => {
|
||||||
|
this.form = this.fb.group({
|
||||||
|
enabled: [x.enabled],
|
||||||
|
movieVoteMax: [x.movieVoteMax, Validators.min(1)],
|
||||||
|
musicVoteMax: [x.musicVoteMax, Validators.min(1)],
|
||||||
|
tvShowVoteMax: [x.tvShowVoteMax, Validators.min(1)],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public onSubmit(form: FormGroup) {
|
||||||
|
if (form.invalid) {
|
||||||
|
this.notificationService.error("Please check your entered values");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const settings = form.value;
|
||||||
|
|
||||||
|
this.settingsService.saveVoteSettings(settings).subscribe(x => {
|
||||||
|
if (x) {
|
||||||
|
this.notificationService.success("Successfully saved the Vote settings");
|
||||||
|
} else {
|
||||||
|
this.notificationService.success("There was an error when saving the Vote settings");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -599,12 +599,11 @@ namespace Ombi.Controllers
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Save the Issues settings.
|
/// Save the Vote settings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="settings">The settings.</param>
|
/// <param name="settings">The settings.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost("Issues")]
|
[HttpPost("Issues")]
|
||||||
[AllowAnonymous]
|
|
||||||
public async Task<bool> IssueSettings([FromBody]IssueSettings settings)
|
public async Task<bool> IssueSettings([FromBody]IssueSettings settings)
|
||||||
{
|
{
|
||||||
return await Save(settings);
|
return await Save(settings);
|
||||||
|
@ -629,6 +628,35 @@ namespace Ombi.Controllers
|
||||||
return issues.Enabled;
|
return issues.Enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Save the Vote settings.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="settings">The settings.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost("vote")]
|
||||||
|
public async Task<bool> VoteSettings([FromBody]VoteSettings settings)
|
||||||
|
{
|
||||||
|
return await Save(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the Vote Settings.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("vote")]
|
||||||
|
public async Task<VoteSettings> VoteSettings()
|
||||||
|
{
|
||||||
|
return await Get<VoteSettings>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[AllowAnonymous]
|
||||||
|
[HttpGet("voteenabled")]
|
||||||
|
public async Task<bool> VoteEnabled()
|
||||||
|
{
|
||||||
|
var vote = await Get<VoteSettings>();
|
||||||
|
return vote.Enabled;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Saves the email notification settings.
|
/// Saves the email notification settings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -172,8 +172,6 @@ namespace Ombi
|
||||||
{
|
{
|
||||||
// Generate a API Key
|
// Generate a API Key
|
||||||
settings.ApiKey = Guid.NewGuid().ToString("N");
|
settings.ApiKey = Guid.NewGuid().ToString("N");
|
||||||
var userManager = app.ApplicationServices.GetService<OmbiUserManager>();
|
|
||||||
userManager.CreateAsync(new OmbiUser {UserName = "API User", UserType = UserType.LocalUser}).Wait();
|
|
||||||
ombiService.SaveSettings(settings);
|
ombiService.SaveSettings(settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
"Requests": "Requests",
|
"Requests": "Requests",
|
||||||
"UserManagement": "User Management",
|
"UserManagement": "User Management",
|
||||||
"Issues":"Issues",
|
"Issues":"Issues",
|
||||||
|
"Vote":"Vote",
|
||||||
"Donate": "Donate!",
|
"Donate": "Donate!",
|
||||||
"DonateLibraryMaintainer": "Donate to Library Maintainer",
|
"DonateLibraryMaintainer": "Donate to Library Maintainer",
|
||||||
"DonateTooltip":
|
"DonateTooltip":
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue