Skip to content

Commit

Permalink
Merge branch 'master' into SHIBUI-680
Browse files Browse the repository at this point in the history
  • Loading branch information
dima767 committed Aug 15, 2018
2 parents 70c7b46 + cf7f219 commit ce446f5
Show file tree
Hide file tree
Showing 32 changed files with 776 additions and 57 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { TestBed, ComponentFixture } from '@angular/core/testing';
import { ReactiveFormsModule } from '@angular/forms';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { ViewChild, Component } from '@angular/core';
import { Observable, of } from 'rxjs';
import { PreviewDialogComponent } from './preview-dialog.component';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { NgbActiveModalStub } from '../../../../testing/modal.stub';

@Component({
template: `<preview-dialog></preview-dialog>`
})
class TestHostComponent {
@ViewChild(PreviewDialogComponent)
public formUnderTest: PreviewDialogComponent;
}


describe('Advanced Info Form Component', () => {
let fixture: ComponentFixture<TestHostComponent>;
let instance: TestHostComponent;

beforeEach(() => {
TestBed.configureTestingModule({
providers: [
{ provide: NgbActiveModal, useClass: NgbActiveModalStub }
],
imports: [
NoopAnimationsModule,
ReactiveFormsModule
],
declarations: [
PreviewDialogComponent,
TestHostComponent
],
});

fixture = TestBed.createComponent(TestHostComponent);
instance = fixture.componentInstance;
fixture.detectChanges();
});

it('should compile', () => {
expect(fixture).toBeDefined();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,9 @@ describe('EntityAttributesFilter Entity', () => {
expect(entity).toBeDefined();
expect(entity.resourceId).toBe('foo');
expect(entity.enabled).toBe(entity.filterEnabled);
expect(entity.id).toBe(entity.resourceId);
expect(entity.getId()).toBe(entity.entityId);
expect(entity.getDisplayId()).toBe(entity.entityId);
expect(entity.isDraft()).toBe(false);
});
});
3 changes: 3 additions & 0 deletions ui/src/app/metadata/domain/model/metadata-order.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export interface ProviderOrder {
resourceIds: string[];
}
16 changes: 15 additions & 1 deletion ui/src/app/metadata/domain/service/provider.service.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

import { MetadataProvider } from '../../domain/model';
import { FileBackedHttpMetadataProvider } from '../model/providers';
import { ProviderOrder } from '../model/metadata-order';


@Injectable()
export class MetadataProviderService {

readonly endpoint = '/MetadataResolvers';
readonly order = '/MetadataResolversPositionOrder';
readonly base = '/api';

constructor(
private http: HttpClient
) {}
query(): Observable<MetadataProvider[]> {
return this.http.get<MetadataProvider[]>(`${this.base}${this.endpoint}`, {});
return this.http.get<MetadataProvider[]>(`${this.base}${this.endpoint}`).pipe(
map(providers => providers.filter(p => p['@type'] !== 'BaseMetadataResolver'))
);
}

find(id: string): Observable<MetadataProvider> {
Expand All @@ -29,4 +35,12 @@ export class MetadataProviderService {
save(provider: MetadataProvider): Observable<MetadataProvider> {
return this.http.post<MetadataProvider>(`${this.base}${this.endpoint}`, provider);
}

getOrder(): Observable<ProviderOrder> {
return this.http.get<ProviderOrder>(`${this.base}${this.order}`);
}

setOrder(order: ProviderOrder): Observable<ProviderOrder> {
return this.http.post<ProviderOrder>(`${this.base}${this.order}`, order);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
<div class="card-header" (click)="toggle.emit(provider)" (keydown.space)="toggle.emit(provider)" tabindex="0">
<div class="d-flex">
<div class="reorder-card">
<p class="text-center text-primary font-weight-bold">1</p>
<button class="btn btn-link" disabled>
<p class="text-center text-primary font-weight-bold">{{ index }}</p>
<button class="btn btn-link" (click)="changeOrderDown.emit(provider); $event.stopPropagation();" [disabled]="last">
<i class="fa text-info fa-lg fa-chevron-circle-down" aria-hidden="true"></i>
</button>
<button class="btn btn-link pull-right" disabled>
<button class="btn btn-link pull-right" (click)="changeOrderUp.emit(provider); $event.stopPropagation();" [disabled]="first">
<i class="fa text-info fa-lg fa-chevron-circle-up" aria-hidden="true"></i>
</button>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ import { EntityItemComponent } from './entity-item.component';

export class ProviderItemComponent extends EntityItemComponent {
@Input() provider: MetadataProvider;
@Input() index: number;
@Input() first: boolean;
@Input() last: boolean;

@Output() viewFilters: EventEmitter<MetadataProvider> = new EventEmitter();

@Output() changeOrderUp: EventEmitter<MetadataProvider> = new EventEmitter();
@Output() changeOrderDown: EventEmitter<MetadataProvider> = new EventEmitter();
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,19 @@
</div>
<div class="p-3">
<ul class="list-unstyled m-0">
<li *ngFor="let provider of providers$ | async; index as i"
<li *ngFor="let provider of providers$ | async; index as i; first as isFirst; last as isLast;"
[class.mt-2]="i > 0">
<provider-item
[index]="i + 1"
[first]="isFirst"
[last]="isLast"
[provider]="provider"
[isOpen]="(providersOpen$ | async)[provider.resourceId]"
(select)="edit(provider)"
(viewFilters)="gotoFilters(provider)"
(toggle)="toggleEntity(provider)">
(toggle)="toggleEntity(provider)"
(changeOrderUp)="updateOrderUp($event)"
(changeOrderDown)="updateOrderDown($event)">
</provider-item>
</li>
</ul>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,33 @@
import { Component } from '@angular/core';
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { MetadataProvider } from '../../domain/model';
import { Observable } from '../../../../../node_modules/rxjs';
import { Store } from '@ngrx/store';

import { ProviderState, getAllProviders } from '../../provider/reducer';
import * as fromDashboard from '../reducer';
import { ProviderState, getOrderedProviders } from '../../provider/reducer';
import { getOpenProviders } from '../reducer';
import { ToggleEntityDisplay } from '../action/manager.action';
import { map } from 'rxjs/operators';
import { ChangeOrderUp, ChangeOrderDown } from '../../provider/action/collection.action';

@Component({
selector: 'dashboard-providers-list',
templateUrl: './dashboard-providers-list.component.html'
})

export class DashboardProvidersListComponent {
export class DashboardProvidersListComponent implements OnInit {

providers$: Observable<MetadataProvider[]>;
providersOpen$: Observable<{ [key: string]: boolean }>;

constructor(
private store: Store<ProviderState>,
private router: Router
) {
this.providers$ = this.store.select(getAllProviders).pipe(
map(providers => providers.filter(p => p['@type'] !== 'BaseMetadataResolver'))
);
this.providersOpen$ = store.select(fromDashboard.getOpenProviders);
) { }

ngOnInit(): void {
this.providers$ = this.store.select(getOrderedProviders);
this.providersOpen$ = this.store.select(getOpenProviders);
}

view(id: string, page: string): void {
Expand All @@ -44,4 +45,12 @@ export class DashboardProvidersListComponent {
toggleEntity(provider: MetadataProvider): void {
this.store.dispatch(new ToggleEntityDisplay(provider.resourceId));
}

updateOrderUp(provider: MetadataProvider): void {
this.store.dispatch(new ChangeOrderUp(provider.resourceId));
}

updateOrderDown(provider: MetadataProvider): void {
this.store.dispatch(new ChangeOrderDown(provider.resourceId));
}
}
72 changes: 70 additions & 2 deletions ui/src/app/metadata/provider/action/collection.action.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Action } from '@ngrx/store';
import { MetadataProvider } from '../../domain/model/metadata-provider';
import { Update } from '@ngrx/entity';
import { ProviderOrder } from '../../domain/model/metadata-order';

export enum ProviderCollectionActionTypes {
UPDATE_PROVIDER_REQUEST = '[Metadata Provider] Update Request',
Expand All @@ -21,7 +22,18 @@ export enum ProviderCollectionActionTypes {

REMOVE_PROVIDER_REQUEST = '[Metadata Provider Collection] Remove Provider Request',
REMOVE_PROVIDER_SUCCESS = '[Metadata Provider Collection] Remove Provider Success',
REMOVE_PROVIDER_FAIL = '[Metadata Provider Collection] Remove Provider Fail'
REMOVE_PROVIDER_FAIL = '[Metadata Provider Collection] Remove Provider Fail',

SET_ORDER_PROVIDER_REQUEST = '[Metadata Provider Collection] Set Order Provider Request',
SET_ORDER_PROVIDER_SUCCESS = '[Metadata Provider Collection] Set Order Remove Provider Success',
SET_ORDER_PROVIDER_FAIL = '[Metadata Provider Collection] Set Order Remove Provider Fail',

GET_ORDER_PROVIDER_REQUEST = '[Metadata Provider Collection] Get Order Remove Provider Request',
GET_ORDER_PROVIDER_SUCCESS = '[Metadata Provider Collection] Get Order Remove Provider Success',
GET_ORDER_PROVIDER_FAIL = '[Metadata Provider Collection] Get Order Remove Provider Fail',

CHANGE_PROVIDER_ORDER_UP = '[Metadata Provider Collection] Change Order Up',
CHANGE_PROVIDER_ORDER_DOWN = '[Metadata Provider Collection] Change Order Down',
}

export class LoadProviderRequest implements Action {
Expand Down Expand Up @@ -114,6 +126,54 @@ export class RemoveProviderFail implements Action {
constructor(public payload: MetadataProvider) { }
}

export class SetOrderProviderRequest implements Action {
readonly type = ProviderCollectionActionTypes.SET_ORDER_PROVIDER_REQUEST;

constructor(public payload: ProviderOrder) { }
}

export class SetOrderProviderSuccess implements Action {
readonly type = ProviderCollectionActionTypes.SET_ORDER_PROVIDER_SUCCESS;

constructor() { }
}

export class SetOrderProviderFail implements Action {
readonly type = ProviderCollectionActionTypes.SET_ORDER_PROVIDER_FAIL;

constructor(public payload: Error) { }
}

export class GetOrderProviderRequest implements Action {
readonly type = ProviderCollectionActionTypes.GET_ORDER_PROVIDER_REQUEST;

constructor() { }
}

export class GetOrderProviderSuccess implements Action {
readonly type = ProviderCollectionActionTypes.GET_ORDER_PROVIDER_SUCCESS;

constructor(public payload: ProviderOrder) { }
}

export class GetOrderProviderFail implements Action {
readonly type = ProviderCollectionActionTypes.GET_ORDER_PROVIDER_FAIL;

constructor(public payload: Error) { }
}

export class ChangeOrderUp implements Action {
readonly type = ProviderCollectionActionTypes.CHANGE_PROVIDER_ORDER_UP;

constructor(public payload: string) { }
}

export class ChangeOrderDown implements Action {
readonly type = ProviderCollectionActionTypes.CHANGE_PROVIDER_ORDER_DOWN;

constructor(public payload: string) { }
}

export type ProviderCollectionActionsUnion =
| LoadProviderRequest
| LoadProviderSuccess
Expand All @@ -129,4 +189,12 @@ export type ProviderCollectionActionsUnion =
| RemoveProviderFail
| UpdateProviderRequest
| UpdateProviderSuccess
| UpdateProviderFail;
| UpdateProviderFail
| SetOrderProviderRequest
| SetOrderProviderSuccess
| SetOrderProviderFail
| GetOrderProviderRequest
| GetOrderProviderSuccess
| GetOrderProviderFail
| ChangeOrderUp
| ChangeOrderDown;
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<ng-container>
<div aria-label="Save your information? modal" role="region" tabindex="0">
<div class="modal-header">
<h4 class="modal-title" i18n="@@message--unsaved-dialog-title">Save your information?</h4>
</div>
<div class="modal-body">
<p i18n="@@message--unsaved-editor">You have not saved your changes. If you exit this screen, your changes will be lost.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" (click)="this.close()">
<span i18n="@@action--discard-changes" aria-label="Discard changes, go back to dashboard">Discard Changes</span>
</button>
<button type="button" class="btn btn-secondary" (click)="this.dismiss()" i18n="@@action--cancel" aria-label="Close modal and go back to editing">Cancel</button>
</div>
</div>
</ng-container>
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { Component, ViewChild } from '@angular/core';
import { TestBed, async, ComponentFixture} from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { SharedModule } from '../../../shared/shared.module';
import { UnsavedProviderComponent } from './unsaved-provider.dialog';
import { NgbActiveModalStub } from '../../../../testing/modal.stub';

@Component({
template: `
<unsaved-provider></unsaved-provider>
`
})
class TestHostComponent {
@ViewChild(UnsavedProviderComponent)
public componentUnderTest: UnsavedProviderComponent;
}

describe('Unsaved Provider Dialog Component', () => {

let fixture: ComponentFixture<TestHostComponent>;
let instance: TestHostComponent;
let cmp: UnsavedProviderComponent;

beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [],
declarations: [
UnsavedProviderComponent,
TestHostComponent
],
providers: [
{ provide: NgbActiveModal, useClass: NgbActiveModalStub }
]
}).compileComponents();

fixture = TestBed.createComponent(TestHostComponent);
instance = fixture.componentInstance;
cmp = instance.componentUnderTest;
fixture.detectChanges();
}));

it('should instantiate the component', async(() => {
expect(cmp).toBeTruthy();
}));
});
27 changes: 27 additions & 0 deletions ui/src/app/metadata/provider/component/unsaved-provider.dialog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Component, Input } from '@angular/core';

import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { Store, Action } from '@ngrx/store';
import { Subject } from 'rxjs/Subject';

import * as fromEditor from '../reducer';

@Component({
selector: 'unsaved-provider',
templateUrl: './unsaved-provider.dialog.html'
})
export class UnsavedProviderComponent {
readonly subject: Subject<boolean> = new Subject<boolean>();

constructor(
public activeModal: NgbActiveModal
) { }

close(): void {
this.activeModal.close();
}

dismiss(): void {
this.activeModal.dismiss();
}
}
Loading

0 comments on commit ce446f5

Please sign in to comment.