%PDF- %PDF-
Direktori : /home/graphicd/public_html/vebto/public/client/ |
Current File : /home/graphicd/public_html/vebto/public/client/72-es5.d07d4f25b7726ef08d00.js.map |
{"version":3,"sources":["webpack:///src/common/notifications/notification-subscriptions/notification-subscriptions.service.ts","webpack:///src/common/notifications/notification-subscriptions/notification-subscriptions.component.html","webpack:///src/common/notifications/notification-subscriptions/notification-subscriptions.component.ts","webpack:///src/common/notifications/notification-subscriptions/notification-subscriptions-resolver.service.ts","webpack:///src/common/shared/pagination-widget/pagination-widget.component.html","webpack:///src/common/shared/pagination-widget/pagination-widget.component.ts","webpack:///src/common/notifications/notification-page/notification-page.component.ts","webpack:///src/common/notifications/notifications.module.ts","webpack:///src/common/notifications/notifications-routing.module.ts","webpack:///src/common/notifications/notification-page/notification-page.component.html","webpack:///src/common/shared/pagination-widget/pagination-widget.module.ts"],"names":["NotificationSubscriptionsService","http","userId","this","get","selections","put","NotificationSubscriptionsComponent","route","api","currentUser","toast","cd","settings","availableChannels","loading$","BehaviorSubject","supportsBrowserNotifications","window","form","data","subscribe","groupedNotifications","subscriptions","available_channels","initialUserSelections","user_selections","forEach","group","s","addNotifFormField","notif_id","notifId","channelGroup","channel","initial","find","channels","control","value","disabled","Notification","permission","valueChanges","pipe","filter","isChecked","_","open","setValue","emitEvent","markForCheck","requestPermission","then","addControl","channelName","newValue","allRowsSelectedFor","Object","values","controls","c","markAsDirty","every","some","next","payload","getPayload","updateUserSubscriptions","finalize","markAsPristine","entries","dirty","map","saveSettings","NotificationSubscriptionsResolverService","router","state","getAll","catchError","navigate","E","mergeMap","response","of","NotificationPageComponent","NotificationsModule","PaginationWidgetComponent","pageChanged","numberOfPages","last_page","iterator","Array","from","keys","n","currentPage","current_page","page","queryParams","replaceUrl","newPage","selectPage","prevPage","nextPage","routes","path","component","notifications","breakpoints","pagination$","loadPage","snapshot","load","perPage","pagination","markedNotif","id","read_at","markAsRead","resolve","permissions","NotificationsRoutingModule","PaginationWidgetModule"],"mappings":"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","file":"x","sourcesContent":["import {Injectable} from '@angular/core';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {\n NotificationSubscriptionGroup,\n NotificationSubscriptionsResponse\n} from '@common/notifications/notification-subscriptions/notification-subscription';\n\nexport type UpdateNotificationSubscriptionsPayload = {\n notif_id: string;\n channels: {[key: string]: boolean};\n}[];\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationSubscriptionsService {\n constructor(private http: AppHttpClient) {}\n\n public getAll(userId: number): BackendResponse<NotificationSubscriptionsResponse> {\n return this.http.get(`notifications/${userId}/subscriptions`);\n }\n\n public updateUserSubscriptions(userId: number, selections: UpdateNotificationSubscriptionsPayload): BackendResponse<void> {\n return this.http.put(`notifications/${userId}/subscriptions`, {selections});\n }\n}\n","<material-navbar\n [menuPosition]=\"settings.get('vebto.navbar.defaultPosition')\"\n class=\"box-shadow\"\n></material-navbar>\n\n<div class=\"be-container\">\n <form class=\"table material-panel\" (ngSubmit)=\"saveSettings()\">\n <div class=\"setting-group\" *ngFor=\"let group of groupedNotifications; let first = first\">\n <div class=\"row\">\n <div class=\"name-column strong\" trans>{{ group.group_name }}</div>\n <ng-container *ngIf=\"first\">\n <div class=\"channel-column\" *ngFor=\"let channelName of availableChannels\">\n <div class=\"channel-name\" trans>{{ channelName }}</div>\n <mat-checkbox\n (change)=\"$event ? toggleAllRowsFor(channelName) : null\"\n [checked]=\"allRowsSelectedFor(channelName)\"\n [indeterminate]=\"someRowsSelectedFor(channelName) && !allRowsSelectedFor(channelName)\"\n [disabled]=\"channelName === 'browser' && !supportsBrowserNotifications\"\n >\n </mat-checkbox>\n </div>\n </ng-container>\n </div>\n <div [formGroup]=\"form\">\n <div\n class=\"row indent\"\n *ngFor=\"let subscription of group.subscriptions; let last = last\"\n [class.no-border]=\"last\"\n [formGroupName]=\"subscription.notif_id\"\n >\n <div class=\"name-column\" trans>{{ subscription.name }}</div>\n <div class=\"channel-column\" *ngFor=\"let channelName of availableChannels\">\n <mat-checkbox [formControlName]=\"channelName\"></mat-checkbox>\n </div>\n </div>\n </div>\n </div>\n\n <button\n mat-raised-button\n color=\"accent\"\n class=\"submit-button\"\n [disabled]=\"loading$ | async\"\n trans\n >\n Save Settings\n </button>\n </form>\n</div>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n OnInit,\n} from '@angular/core';\nimport {ActivatedRoute} from '@angular/router';\nimport {\n NotificationSubscription,\n NotificationSubscriptionGroup,\n NotificationSubscriptionsResponse,\n} from '@common/notifications/notification-subscriptions/notification-subscription';\nimport {\n NotificationSubscriptionsService,\n UpdateNotificationSubscriptionsPayload,\n} from '@common/notifications/notification-subscriptions/notification-subscriptions.service';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {BehaviorSubject} from 'rxjs';\nimport {filter, finalize} from 'rxjs/operators';\nimport {Settings} from '@common/core/config/settings.service';\nimport {FormControl, FormGroup} from '@angular/forms';\n\n@Component({\n selector: 'notification-subscriptions',\n templateUrl: './notification-subscriptions.component.html',\n styleUrls: ['./notification-subscriptions.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NotificationSubscriptionsComponent implements OnInit {\n private initialUserSelections: NotificationSubscription[];\n groupedNotifications: NotificationSubscriptionGroup[];\n availableChannels: string[] = [];\n loading$ = new BehaviorSubject<boolean>(false);\n supportsBrowserNotifications = ('Notification' in window);\n form = new FormGroup({});\n\n constructor(\n private route: ActivatedRoute,\n private api: NotificationSubscriptionsService,\n private currentUser: CurrentUser,\n private toast: Toast,\n private cd: ChangeDetectorRef,\n public settings: Settings\n ) {}\n\n ngOnInit() {\n this.route.data.subscribe((data: {api: NotificationSubscriptionsResponse}) => {\n this.groupedNotifications = data.api.subscriptions;\n this.availableChannels = data.api.available_channels;\n this.initialUserSelections = data.api.user_selections;\n this.groupedNotifications.forEach(group => {\n group.subscriptions.forEach(s => this.addNotifFormField(s.notif_id));\n });\n });\n }\n\n public addNotifFormField(notifId: string) {\n const channelGroup = new FormGroup({});\n this.availableChannels.forEach(channel => {\n const initial = this.initialUserSelections.find(s => s.notif_id === notifId)\n ?.channels[channel];\n const disabled = channel === 'browser' && !this.supportsBrowserNotifications;\n const control = new FormControl({value: initial ?? false, disabled});\n if (channel === 'browser' && Notification.permission !== 'granted') {\n control.valueChanges.pipe(filter(isChecked => isChecked)).subscribe(_ => {\n if (Notification.permission === 'denied') {\n this.toast.open(\n 'Notifications blocked. Please enable them for this site from browser settings.'\n );\n control.setValue(false, {emitEvent: false});\n this.cd.markForCheck();\n } else {\n Notification.requestPermission().then(permission => {\n if (permission !== 'granted') {\n control.setValue(false, {emitEvent: false});\n this.cd.markForCheck();\n }\n });\n }\n });\n }\n channelGroup.addControl(channel, control);\n });\n this.form.addControl(notifId, channelGroup);\n }\n\n public toggleAllRowsFor(channelName: string) {\n const newValue = !this.allRowsSelectedFor(channelName);\n Object.values(this.form.controls).forEach(c => {\n (c as FormGroup).controls[channelName].setValue(newValue);\n (c as FormGroup).controls[channelName].markAsDirty();\n });\n }\n\n public allRowsSelectedFor(channelName: string): boolean {\n return Object.values(this.form.controls).every(control => {\n return (control as FormGroup).controls[channelName].value === true;\n });\n }\n\n public someRowsSelectedFor(channelName: string): boolean {\n return Object.values(this.form.controls).some(control => {\n return (control as FormGroup).controls[channelName].value === true;\n });\n }\n\n public saveSettings() {\n this.loading$.next(true);\n const payload = this.getPayload();\n this.api\n .updateUserSubscriptions(this.currentUser.get('id'), payload)\n .pipe(finalize(() => this.loading$.next(false)))\n .subscribe(() => {\n this.form.markAsPristine();\n this.toast.open('Notification settings updated.');\n });\n }\n\n private getPayload(): UpdateNotificationSubscriptionsPayload {\n return Object.entries(this.form.controls)\n .filter(([_, control]) => control.dirty)\n .map(([notifId, control]) => {\n return {notif_id: notifId, channels: control.value};\n });\n }\n}\n","import {Injectable} from '@angular/core';\nimport {ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot} from '@angular/router';\nimport {catchError, mergeMap} from 'rxjs/operators';\nimport {EMPTY, Observable, of} from 'rxjs';\nimport {NotificationSubscriptionsService} from '@common/notifications/notification-subscriptions/notification-subscriptions.service';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {NotificationSubscriptionsResponse} from '@common/notifications/notification-subscriptions/notification-subscription';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationSubscriptionsResolverService implements Resolve<Observable<NotificationSubscriptionsResponse>> {\n constructor(\n private router: Router,\n private subscriptions: NotificationSubscriptionsService,\n private currentUser: CurrentUser,\n ) {}\n\n resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<NotificationSubscriptionsResponse> {\n return this.subscriptions.getAll(+this.currentUser.get('id')).pipe(\n catchError(() => {\n this.router.navigate(['/account/settings']);\n return EMPTY; //\n }),\n mergeMap(response => {\n if (response) {\n return of(response);\n } else {\n this.router.navigate(['/account/settings']);\n return EMPTY;\n }\n })\n );\n }\n}\n","<ul class=\"page-numbers unstyled-list\">\n <li>\n <button type=\"button\" class=\"prev\" [disabled]=\"disabled\" (click)=\"prevPage()\" mat-button trans>Previous</button>\n </li>\n <li *ngFor=\"let page of iterator\">\n <button type=\"button\" class=\"page-number-button\" [disabled]=\"disabled\" [class.active]=\"currentPage === page\" (click)=\"selectPage(page)\" mat-flat-button color=\"gray\">{{page}}</button>\n </li>\n <li>\n <button type=\"button\" class=\"next\" [disabled]=\"disabled\" (click)=\"nextPage()\" mat-button trans>Next</button>\n </li>\n</ul>\n","import {ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output} from '@angular/core';\nimport {PaginationResponse} from '@common/core/types/pagination/pagination-response';\nimport {Router} from '@angular/router';\n\n@Component({\n selector: 'pagination-widget',\n templateUrl: './pagination-widget.component.html',\n styleUrls: ['./pagination-widget.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PaginationWidgetComponent {\n private numberOfPages: number;\n public iterator: number[];\n public currentPage: number;\n\n @HostBinding('class.hidden') get shouldHide() {\n return this.numberOfPages < 2;\n }\n\n @Output() pageChanged = new EventEmitter<number>();\n\n @Input() disabled = true;\n @Input() set pagination(value: PaginationResponse<any>) {\n if (value) {\n this.numberOfPages = value.last_page > 10 ? 10 : value.last_page;\n if (this.numberOfPages > 1) {\n this.iterator = Array.from(Array(this.numberOfPages).keys()).map(n => n + 1);\n this.currentPage = value.current_page;\n }\n }\n }\n\n constructor(private router: Router) {}\n\n public selectPage(page: number) {\n if (this.currentPage !== page) {\n this.currentPage = page;\n this.pageChanged.next(page);\n this.router.navigate([], {queryParams: {page}, replaceUrl: true});\n }\n }\n\n public nextPage() {\n const newPage = this.currentPage + 1;\n this.selectPage(newPage <= this.numberOfPages ? newPage : this.currentPage);\n }\n\n public prevPage() {\n const newPage = this.currentPage - 1;\n this.selectPage(newPage >= 1 ? newPage : this.currentPage);\n }\n}\n","import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core';\nimport {Settings} from '@common/core/config/settings.service';\nimport {NotificationService} from '@common/notifications/notification-list/notification.service';\nimport {BreakpointsService} from '@common/core/ui/breakpoints.service';\nimport {ActivatedRoute} from '@angular/router';\nimport {BehaviorSubject} from 'rxjs';\nimport {PaginationResponse} from '@common/core/types/pagination/pagination-response';\nimport {DatabaseNotification} from '@common/notifications/database-notification';\n\n@Component({\n selector: 'notification-page',\n templateUrl: './notification-page.component.html',\n styleUrls: ['./notification-page.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NotificationPageComponent implements OnInit {\n public pagination$ = new BehaviorSubject<PaginationResponse<DatabaseNotification>>(null);\n\n constructor(\n public settings: Settings,\n public notifications: NotificationService,\n public breakpoints: BreakpointsService,\n private route: ActivatedRoute,\n ) {}\n\n ngOnInit() {\n this.loadPage(this.route.snapshot.queryParams.page || 1);\n }\n\n public loadPage(page: number) {\n this.notifications.load({page, perPage: 25})\n .subscribe(response => {\n this.pagination$.next(response.pagination);\n });\n }\n\n public markAsRead(markedNotif: DatabaseNotification) {\n const notification = this.pagination$.value.data.find(n => n.id === markedNotif.id);\n notification.read_at = markedNotif.read_at;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NotificationsRoutingModule } from './notifications-routing.module';\nimport { NotificationSubscriptionsComponent } from './notification-subscriptions/notification-subscriptions.component';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { ImageOrIconModule } from '@common/core/ui/image-or-icon/image-or-icon.module';\nimport { NotificationListModule } from '@common/notifications/notification-list/notification-list.module';\nimport { MaterialNavbarModule } from '@common/core/ui/material-navbar/material-navbar.module';\nimport { NotificationPageComponent } from './notification-page/notification-page.component';\nimport {PaginationWidgetModule} from '@common/shared/pagination-widget/pagination-widget.module';\nimport {MatButtonModule} from '@angular/material/button';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport { TranslationsModule } from '../core/translations/translations.module';\n\n\n@NgModule({\n declarations: [\n NotificationSubscriptionsComponent,\n NotificationPageComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NotificationsRoutingModule,\n MaterialNavbarModule,\n ImageOrIconModule,\n NotificationListModule,\n PaginationWidgetModule,\n TranslationsModule,\n\n // material\n MatCheckboxModule,\n MatButtonModule,\n ]\n})\nexport class NotificationsModule {\n}\n","import {NgModule} from '@angular/core';\nimport {Routes, RouterModule} from '@angular/router';\nimport {NotificationSubscriptionsComponent} from './notification-subscriptions/notification-subscriptions.component';\nimport {NotificationSubscriptionsResolverService} from './notification-subscriptions/notification-subscriptions-resolver.service';\nimport {NotificationPageComponent} from '@common/notifications/notification-page/notification-page.component';\n\n\nconst routes: Routes = [\n {\n path: '',\n component: NotificationPageComponent,\n },\n {\n path: 'settings',\n component: NotificationSubscriptionsComponent,\n resolve: {api: NotificationSubscriptionsResolverService},\n data: {permissions: ['notification.subscribe']},\n }\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class NotificationsRoutingModule {\n}\n","<material-navbar [menuPosition]=\"settings.get('vebto.navbar.defaultPosition')\"></material-navbar>\n<div class=\"be-container\">\n <notification-list [notifications]=\"(pagination$ | async)?.data\" [compact]=\"breakpoints.isMobile$ | async\" (markedAsRead)=\"markAsRead($event)\"></notification-list>\n <pagination-widget [pagination]=\"pagination$ | async\" [disabled]=\"notifications.loading$ | async\" (pageChanged)=\"loadPage($event)\"></pagination-widget>\n</div>\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {PaginationWidgetComponent} from '@common/shared/pagination-widget/pagination-widget.component';\nimport { MatButtonModule } from '@angular/material/button';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\n\n\n@NgModule({\n declarations: [\n PaginationWidgetComponent,\n ],\n imports: [\n CommonModule,\n MatButtonModule,\n TranslationsModule,\n ],\n exports: [\n PaginationWidgetComponent,\n ]\n})\nexport class PaginationWidgetModule {\n}\n"]}