mirror of
https://github.com/Terncode/pixel.horse.git
synced 2026-09-24 21:55:52 +02:00
Archive commit
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
ng-template(#searchTooltip)
|
||||
.text-left.help-tooltip
|
||||
div: em search by:
|
||||
div name:<account_name> #[em - account name]
|
||||
div note:<note_text> #[em - note contents]
|
||||
div email:<email_fragment> #[em - email fragment]
|
||||
div role:<role_name> #[em - role]
|
||||
div exact:<name> #[em - exact account name]
|
||||
div ignores:<count> #[em - amount of ignores (at least)]
|
||||
div ponies:<count> #[em - amount of ponies (at least)]
|
||||
div auths:<count> #[em - amount of auths (at least)]
|
||||
div old:<number_of_days> #[em - days since last visit]
|
||||
div disabled! #[em - list accounts with disabled auths]
|
||||
div locked! #[em - list accounts with locked auths]
|
||||
div spam/swering/timeouts/limits:<number>
|
||||
|
||||
ng-template(#duplicatesPopover)
|
||||
a.text-secondary.d-block(*ngFor="let e of duplicateEntries" (click)="search = e")
|
||||
| {{e}}
|
||||
|
||||
.d-block.d-sm-flex
|
||||
input.form-control.form-control-sm.admin-search(type="search" placeholder="search" [(ngModel)]="search")
|
||||
.btn-group.btn-group-sm.ml-1
|
||||
button.btn.btn-default((click)="refresh(true)")
|
||||
fa-icon([icon]="syncIcon" size="lg")
|
||||
button.btn(btnCheckbox [(ngModel)]="autoRefresh" [btnHighlight]="autoRefresh")
|
||||
| auto
|
||||
.btn-group.btn-group-sm.ml-1
|
||||
button.btn.btn-sm.btn-danger(
|
||||
*ngIf="duplicateEntries?.length" [popover]="duplicatesPopover" [outsideClick]="true"
|
||||
placement="bottom" containerClass="popover-wide")
|
||||
| Duplicates ({{duplicateEntries.length}})
|
||||
button.btn.btn-sm.btn-danger((click)="refreshDuplicates()" title="Refresh duplicates")
|
||||
fa-icon([icon]="syncIcon" size="lg")
|
||||
.btn-group.btn-group-sm.ml-1(btnRadioGroup [(ngModel)]="showOnly")
|
||||
button.btn(*ngFor="let f of filters" [btnRadio]="f" [btnHighlight]="showOnly === f") {{f}}
|
||||
button.btn.btn-sm.ml-1((click)="not = !not" [btnHighlight]="not") not
|
||||
button.btn.btn-sm.btn-default.ml-2((click)="createAccount()") create account
|
||||
|
||||
.d-block.d-sm-flex.justify-content-between.align-items-start
|
||||
.pl-1([tooltip]="searchTooltip" placement="bottom" containerClass="tooltip-pre" style="width: 280px;")
|
||||
small.text-muted
|
||||
fa-icon.mr-1([icon]="filterIcon")
|
||||
| filters
|
||||
.d-block.d-sm-flex.mt-2
|
||||
fa-icon.text-muted.mr-3(*ngIf="loading" [icon]="spinnerIcon" [spin]="true" size="2x" style="margin-top: 3px")
|
||||
strong.text-muted.mr-3(style="margin-top: 6px")
|
||||
| {{totalItems === 99999999 ? '' : totalItems}}
|
||||
pagination(
|
||||
[totalItems]="totalItems" [itemsPerPage]="itemsPerPage" [(ngModel)]="currentPage"
|
||||
[maxSize]="15" [directionLinks]="false" [boundaryLinks]="true")
|
||||
|
||||
table.table.table-fixed.table-striped.table-hover.table-sm
|
||||
thead
|
||||
tr
|
||||
th.col-time created
|
||||
th.col-time last visit
|
||||
th.col-account name
|
||||
th.col-email emails
|
||||
th.col-auth auths
|
||||
th.col-origin origins
|
||||
th ponies
|
||||
th(style="width: 40px;")
|
||||
tbody
|
||||
tr(*ngFor="let a of itemsOnPageIds")
|
||||
td.col-time
|
||||
time-field([time]="info.account?.createdAt")
|
||||
td.col-time
|
||||
time-field([time]="info.account?.lastVisit")
|
||||
td.col-account
|
||||
account-info-remote(#info [accountId]="a")
|
||||
td.col-email
|
||||
email-list([emails]="info.account?.emails")
|
||||
td.col-auth
|
||||
auth-list-remote([accountId]="a")
|
||||
td.col-origin
|
||||
origin-list-remote([accountId]="a")
|
||||
td
|
||||
pony-list-remote([accountId]="a")
|
||||
td(style="width: 40px;")
|
||||
.btn-group.btn-group-xs
|
||||
button.btn.btn-xs.btn-default(
|
||||
(click)="$event.shiftKey ? chatLog.add(info.account) : chatLog.show(info.account)" title="Show chat")
|
||||
fa-icon([icon]="commentIcon" [fixedWidth]="true")
|
||||
|
||||
admin-chat-log(#chatLog)
|
||||
|
||||
.admin-bottom-padding
|
||||
@@ -0,0 +1,123 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import { debounce } from 'lodash';
|
||||
import { Account } from '../../../common/adminInterfaces';
|
||||
import { AdminModel } from '../../services/adminModel';
|
||||
import { faSync, faComment, faFilter, faEraser, faSpinner } from '../../../client/icons';
|
||||
|
||||
let autoRefresh = false;
|
||||
let showOnly = 'all';
|
||||
let search = '';
|
||||
let currentPage = 0;
|
||||
let not = false;
|
||||
|
||||
@Component({
|
||||
selector: 'admin-accounts',
|
||||
templateUrl: 'admin-accounts.pug',
|
||||
})
|
||||
export class AdminAccounts implements OnInit {
|
||||
readonly syncIcon = faSync;
|
||||
readonly filterIcon = faFilter;
|
||||
readonly commentIcon = faComment;
|
||||
readonly eraserIcon = faEraser;
|
||||
readonly spinnerIcon = faSpinner;
|
||||
readonly filters = [
|
||||
'all',
|
||||
'banned',
|
||||
'timed out',
|
||||
'with flags',
|
||||
'notes',
|
||||
'supporters',
|
||||
];
|
||||
totalItems = 99999999;
|
||||
itemsOnPageIds: string[] = [];
|
||||
itemsPerPage = 20;
|
||||
loading = false;
|
||||
private expanded = new Set<string>();
|
||||
constructor(public model: AdminModel, private router: Router) {
|
||||
}
|
||||
get showOnly() {
|
||||
return showOnly;
|
||||
}
|
||||
set showOnly(value) {
|
||||
if (showOnly !== value) {
|
||||
showOnly = value;
|
||||
this.refresh();
|
||||
}
|
||||
}
|
||||
get not() {
|
||||
return not;
|
||||
}
|
||||
set not(value) {
|
||||
if (not !== value) {
|
||||
not = value;
|
||||
this.refresh();
|
||||
}
|
||||
}
|
||||
get autoRefresh() {
|
||||
return autoRefresh;
|
||||
}
|
||||
set autoRefresh(value) {
|
||||
autoRefresh = value;
|
||||
}
|
||||
get currentPage() {
|
||||
return currentPage;
|
||||
}
|
||||
set currentPage(value) {
|
||||
if (currentPage !== value) {
|
||||
currentPage = value;
|
||||
this.refresh();
|
||||
}
|
||||
}
|
||||
get search() {
|
||||
return search;
|
||||
}
|
||||
set search(value) {
|
||||
if (search !== value) {
|
||||
search = value;
|
||||
this.execSearch();
|
||||
}
|
||||
}
|
||||
private execSearch = debounce(() => this.refresh(), 500);
|
||||
get duplicateEntries() {
|
||||
return this.model.duplicateEntries;
|
||||
}
|
||||
refreshDuplicates() {
|
||||
this.model.checkDuplicateEntries(true);
|
||||
}
|
||||
limit(account: Account) {
|
||||
return this.expanded.has(account._id) ? 99999 : 2;
|
||||
}
|
||||
expand(account: Account) {
|
||||
this.expanded.add(account._id);
|
||||
}
|
||||
ngOnInit() {
|
||||
this.model.accountPromise
|
||||
.then(() => this.refresh());
|
||||
}
|
||||
refresh(force = false) {
|
||||
this.loading = true;
|
||||
this.model.findAccounts({
|
||||
search: this.search.trim(),
|
||||
not: this.not,
|
||||
showOnly: this.showOnly,
|
||||
page: this.currentPage - 1,
|
||||
itemsPerPage: this.itemsPerPage,
|
||||
force,
|
||||
}).then(result => {
|
||||
if (result && result.page === (this.currentPage - 1)) {
|
||||
this.totalItems = result.totalItems;
|
||||
this.itemsOnPageIds = result.accounts;
|
||||
this.loading = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
createAccount() {
|
||||
const name = prompt('enter new account name');
|
||||
|
||||
if (name) {
|
||||
this.model.createAccount(name)
|
||||
.then(id => this.router.navigate(['accounts', id]));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user