Browse Source

Improve coupon management

pull/6794/head
Thomas Kaul 4 weeks ago
parent
commit
2473c6ea99
  1. 62
      apps/client/src/app/components/admin-overview/admin-overview.component.ts

62
apps/client/src/app/components/admin-overview/admin-overview.component.ts

@ -24,6 +24,7 @@ import { NotificationService } from '@ghostfolio/ui/notifications';
import { AdminService, DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { Clipboard, ClipboardModule } from '@angular/cdk/clipboard';
import { CommonModule } from '@angular/common';
import {
ChangeDetectorRef,
@ -42,6 +43,7 @@ import {
MatSlideToggleModule
} from '@angular/material/slide-toggle';
import { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import {
@ -62,6 +64,7 @@ import ms, { StringValue } from 'ms';
@Component({
imports: [
ClipboardModule,
CommonModule,
FormsModule,
GfValueComponent,
@ -72,6 +75,7 @@ import ms, { StringValue } from 'ms';
MatSelectModule,
MatSnackBarModule,
MatSlideToggleModule,
MatTableModule,
ReactiveFormsModule,
RouterModule
],
@ -82,7 +86,8 @@ import ms, { StringValue } from 'ms';
export class GfAdminOverviewComponent implements OnInit {
public activitiesCount: number;
public couponDuration: StringValue = '14 days';
public coupons: Coupon[];
public couponsDataSource = new MatTableDataSource<Coupon>();
public couponsDisplayedColumns = ['code', 'duration', 'actions'];
public hasPermissionForSubscription: boolean;
public hasPermissionForSystemMessage: boolean;
public hasPermissionToSyncDemoUserAccount: boolean;
@ -99,6 +104,7 @@ export class GfAdminOverviewComponent implements OnInit {
private adminService: AdminService,
private cacheService: CacheService,
private changeDetectorRef: ChangeDetectorRef,
private clipboard: Clipboard,
private dataService: DataService,
private destroyRef: DestroyRef,
private notificationService: NotificationService,
@ -188,14 +194,14 @@ export class GfAdminOverviewComponent implements OnInit {
}
public onAddCoupon() {
const coupons = [
...this.coupons,
{
const newCoupon: Coupon = {
code: `${ghostfolioPrefix}${this.generateCouponCode(14)}`,
duration: this.couponDuration
}
];
this.putAdminSetting({ key: PROPERTY_COUPONS, value: coupons });
};
const coupons = [...this.couponsDataSource.data, newCoupon];
this.saveCoupons({ coupons, codeToCopy: newCoupon.code });
}
public onChangeCouponDuration(aCouponDuration: StringValue) {
@ -205,10 +211,11 @@ export class GfAdminOverviewComponent implements OnInit {
public onDeleteCoupon(aCouponCode: string) {
this.notificationService.confirm({
confirmFn: () => {
const coupons = this.coupons.filter((coupon) => {
return coupon.code !== aCouponCode;
const coupons = this.couponsDataSource.data.filter(({ code }) => {
return code !== aCouponCode;
});
this.putAdminSetting({ key: PROPERTY_COUPONS, value: coupons });
this.saveCoupons({ coupons });
},
confirmType: ConfirmationDialogType.Warn,
title: $localize`Do you really want to delete this coupon?`
@ -307,9 +314,13 @@ export class GfAdminOverviewComponent implements OnInit {
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ activitiesCount, settings, userCount, version }) => {
this.activitiesCount = activitiesCount;
this.coupons = (settings[PROPERTY_COUPONS] as Coupon[]) ?? [];
this.couponsDataSource.data =
(settings[PROPERTY_COUPONS] as Coupon[]) ?? [];
this.isDataGatheringEnabled =
settings[PROPERTY_IS_DATA_GATHERING_ENABLED] === false ? false : true;
this.systemMessage = settings[PROPERTY_SYSTEM_MESSAGE] as SystemMessage;
this.userCount = userCount;
this.version = version;
@ -343,4 +354,33 @@ export class GfAdminOverviewComponent implements OnInit {
}, 300);
});
}
private saveCoupons({
codeToCopy,
coupons
}: {
codeToCopy?: string;
coupons: Coupon[];
}) {
this.dataService
.putAdminSetting(PROPERTY_COUPONS, {
value: JSON.stringify(coupons)
})
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.couponsDataSource.data = coupons;
if (codeToCopy) {
this.clipboard.copy(codeToCopy);
this.snackBar.open(
'✅ ' + $localize`${codeToCopy} has been copied to the clipboard`,
undefined,
{ duration: ms('3 seconds') }
);
}
this.changeDetectorRef.markForCheck();
});
}
}

Loading…
Cancel
Save