Skip to content

Commit

Permalink
feat(jobs-manager): clean finished groups
Browse files Browse the repository at this point in the history
  • Loading branch information
ElonH committed Jun 14, 2020
1 parent 6af3b10 commit 188fcdf
Show file tree
Hide file tree
Showing 5 changed files with 200 additions and 3 deletions.
26 changes: 26 additions & 0 deletions src/app/@dataflow/rclone/core-stats-delete-flow.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { AjaxFlowInteralNode, CombErr, FlowOutNode } from '../core';
import { IRcloneServer } from '../extra';
import { PostFlow } from './post-flow';

export interface CoreStatsDeleteFlowParamsNode {
group: string;
}

export interface CoreStatsDeleteFlowInNode extends CoreStatsDeleteFlowParamsNode, IRcloneServer {}

export abstract class CoreStatsDeleteFlow extends PostFlow<
CoreStatsDeleteFlowInNode,
FlowOutNode,
CoreStatsDeleteFlowParamsNode
> {
// public prerequest$: Observable<CombErr<CoreStatsDeleteFlowInNode>>;
protected cmd = 'core/stats-delete';
protected cacheSupport = false;
protected params = (pre: CombErr<CoreStatsDeleteFlowInNode>): CoreStatsDeleteFlowParamsNode => {
if (pre[1].length !== 0 || !pre[0].group) return {} as any;
return { group: pre[0].group };
};
protected reconstructAjaxResult(x: AjaxFlowInteralNode): CombErr<FlowOutNode> {
return x;
}
}
1 change: 1 addition & 0 deletions src/app/@dataflow/rclone/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ export * from './operations-fsinfo-flow';
export * from './operations-about-flow';
export * from './get-flow';
export * from './download-file-flow';
export * from './core-stats-delete-flow';
123 changes: 123 additions & 0 deletions src/app/pages/jobs/dialogs/clean-finished-groups.dialog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import { Component, OnInit } from '@angular/core';
import { DialogRef, ModalComponent } from 'ngx-modialog-7';
// tslint:disable-next-line: no-submodule-imports
import { DialogPreset } from 'ngx-modialog-7/plugins/vex';
import { Observable, of, Subject, zip } from 'rxjs';
import { concatMap, delay, map, switchMap, withLatestFrom } from 'rxjs/operators';
import { CombErr } from '../../../@dataflow/core';
import {
CoreStatsDeleteFlow,
CoreStatsDeleteFlowInNode,
CoreStatsFlow,
ListGroupFlow,
} from '../../../@dataflow/rclone';
import { ConnectionService } from '../../connection.service';

@Component({
template: `
<nb-card>
<nb-card-header>
Select groups to be deleted
</nb-card-header>
<nb-card-body [nbSpinner]="loading" spinnerMessage="Loading...">
<nb-list>
<nb-list-item
*ngFor="let item of finishedGroup; index as idx"
(click)="check[idx] = !check[idx]; $event.preventDefault()"
>
<nb-checkbox [(checked)]="check[idx]"> </nb-checkbox>
<label>{{ item }}</label>
</nb-list-item>
</nb-list>
</nb-card-body>
<nb-card-footer>
<button nbButton (click)="dialog.dismiss()" status="danger">Close</button>
<button class="push-to-right" nbButton (click)="confirm()" status="success">
Confirm
</button>
</nb-card-footer>
</nb-card>
`,
styles: [
`
nb-card {
margin: calc(-1em - 5px);
}
nb-card-header,
nb-card-footer {
display: flex;
}
label {
padding-left: 0.75rem;
}
.push-to-right {
margin-left: auto;
}
`,
],
})
export class CleanFinishedGroupDialogComponent implements ModalComponent<DialogPreset>, OnInit {
public context: DialogPreset;
finishedGroup: string[] = [];
check: boolean[] = [];
loading = false;

constructor(public dialog: DialogRef<DialogPreset>, private cmdService: ConnectionService) {
this.context = dialog.context;
}

deleteTrigger = new Subject<string[]>();
deleteStates$: CoreStatsDeleteFlow;

confirm() {
this.deleteTrigger.next(this.finishedGroup.filter((_, idx) => this.check[idx]));
this.dialog.close();
}

ngOnInit() {
const outer = this;
const trigger = new Subject();
const listGroup$ = new (class extends ListGroupFlow {
public prerequest$ = trigger.pipe(
withLatestFrom(outer.cmdService.listCmd$.verify(this.cmd)),
map(x => x[1])
);
})();
listGroup$.deploy();
const stats$ = new (class extends CoreStatsFlow {
public prerequest$ = trigger.pipe(
withLatestFrom(outer.cmdService.listCmd$.verify(this.cmd)),
map(x => x[1])
);
})();
stats$.deploy();

this.loading = true;
listGroup$.clearCache();
stats$.clearCache();
zip(listGroup$.getOutput(), stats$.getOutput()).subscribe(([list, stats]) => {
this.loading = false;
if (list[1].length !== 0 || stats[1].length !== 0) return;
const transferring = stats[0]['core-stats'].transferring;
this.finishedGroup = !transferring
? list[0].groups
: list[0].groups.filter(x => !transferring.some(y => x === y.group));
this.check = this.finishedGroup.map(() => true);
});
trigger.next();

this.deleteStates$ = new (class extends CoreStatsDeleteFlow {
public prerequest$: Observable<CombErr<CoreStatsDeleteFlowInNode>> = outer.deleteTrigger.pipe(
withLatestFrom(outer.cmdService.listCmd$.verify(this.cmd)),
switchMap(([groups, y]) => {
if (y[1].length !== 0) return of([{}, y[1]] as any);
return of(...groups.map(group => [{ ...y[0], group }, []]));
}),
// TODO: need a tasks queue
concatMap(x => of(x).pipe(delay(1000)))
);
})();
this.deleteStates$.deploy();
this.deleteStates$.getOutput().subscribe();
}
}
44 changes: 42 additions & 2 deletions src/app/pages/jobs/jobs.component.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { overlayConfigFactory } from 'ngx-modialog-7';
// tslint:disable-next-line: no-submodule-imports
import { Modal, VEXModalContext } from 'ngx-modialog-7/plugins/vex';
import { combineLatest, Subject } from 'rxjs';
import { map, takeWhile } from 'rxjs/operators';
import { CombErr } from '../../@dataflow/core';
import { CoreStatsFlow, CoreStatsFlowInNode, ListGroupFlow } from '../../@dataflow/rclone';
import { ConnectionService } from '../connection.service';
import { CleanFinishedGroupDialogComponent } from './dialogs/clean-finished-groups.dialog';

@Component({
selector: 'app-jobs',
Expand All @@ -12,6 +16,7 @@ import { ConnectionService } from '../connection.service';
<nb-sidebar tag="group" *showItBootstrap="['xl', 'lg', 'md']">
<nb-card-header>
Groups
<nb-icon icon="trash-2-outline" (click)="clearGroups()"></nb-icon>
<nb-icon
[ngClass]="{ 'infinte-rotate': refreshing }"
icon="refresh"
Expand All @@ -38,9 +43,14 @@ import { ConnectionService } from '../connection.service';
<nb-layout-column>
<nb-card *hideItBootstrap="['xl', 'lg', 'md']">
<nb-card-header>
<nb-icon
icon="trash-2-outline"
style="margin: auto auto auto 0;"
(click)="clearGroups()"
></nb-icon>
<nb-select
placeholder="Groups"
style="max-width: calc(100% - 1em - 1.5rem); width: calc(100% - 1em - 1.5rem);"
style="max-width: calc(100% - 2em - 3rem); width: calc(100% - 2em - 3rem);"
[(selected)]="activeGroup"
(selectedChange)="activateGroup(activeGroup)"
>
Expand Down Expand Up @@ -100,6 +110,9 @@ import { ConnectionService } from '../connection.service';
border-color: #edf1f7;
border-left-width: 0.0668rem;
}
:host nb-select ::ng-deep button {
min-width: unset;
}
:host ::ng-deep .scrollable {
display: contents;
}
Expand All @@ -125,7 +138,7 @@ import { ConnectionService } from '../connection.service';
],
})
export class JobsComponent implements OnInit, OnDestroy {
constructor(private cmdService: ConnectionService) {}
constructor(private cmdService: ConnectionService, public modal: Modal) {}
public activeGroup = '';
public groups: string[] = [];

Expand All @@ -142,6 +155,33 @@ export class JobsComponent implements OnInit, OnDestroy {
this.activeGroup = group;
this.statsTrigger.next(group);
}

public clearGroups() {
this.modal
.confirm()
.className('flat-attack')
.message(`Cleaning finished groups?`)
.isBlocking(true)
.open()
.result.then(
ok => {
if (!ok) return;
this.modal
.open(
CleanFinishedGroupDialogComponent,
overlayConfigFactory({ isBlocking: true }, VEXModalContext)
)
.result.then(
confirm => {
if (confirm) this.refreshList();
},
() => {}
);
},
() => {}
);
}

ngOnInit(): void {
const outer = this;
this.visable = true;
Expand Down
9 changes: 8 additions & 1 deletion src/app/pages/jobs/jobs.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,27 @@ import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';

import {
NbButtonModule,
NbCardModule,
NbCheckboxModule,
NbIconModule,
NbLayoutModule,
NbListModule,
NbSelectModule,
NbSidebarModule,
NbSpinnerModule,
} from '@nebular/theme';
import { ChartsModule } from 'ng2-charts';
import { TableModule } from 'ngx-easy-table';
import { ResponsiveModule } from 'ngx-responsive';
import { RngModule } from '../../components/rng.module';
import { CleanFinishedGroupDialogComponent } from './dialogs/clean-finished-groups.dialog';
import { JobsRoutingModule } from './jobs-routing.module';
import { JobsComponent } from './jobs.component';
import { TransfersComponent } from './transferring/transferring.component';

@NgModule({
declarations: [JobsComponent, TransfersComponent],
declarations: [JobsComponent, TransfersComponent, CleanFinishedGroupDialogComponent],
imports: [
CommonModule,
ResponsiveModule,
Expand All @@ -32,6 +36,9 @@ import { TransfersComponent } from './transferring/transferring.component';
ChartsModule,
RngModule,
NbSelectModule,
NbButtonModule,
NbCheckboxModule,
NbSpinnerModule,
],
})
export class JobsModule {}

0 comments on commit 188fcdf

Please sign in to comment.