Skip to content

Commit

Permalink
SHIBUI-1270 Initial commit for comparison
Browse files Browse the repository at this point in the history
  • Loading branch information
rmathis committed Jul 11, 2019
1 parent 70f59e3 commit 59d818e
Show file tree
Hide file tree
Showing 16 changed files with 182 additions and 22 deletions.
47 changes: 47 additions & 0 deletions ui/src/app/metadata/configuration/action/compare.action.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { Action } from '@ngrx/store';
import { MetadataHistory } from '../model/history';
import { MetadataVersion } from '../model/version';
import { Metadata } from '../../domain/domain.type';

export enum CompareActionTypes {
COMPARE_METADATA_REQUEST = '[Compare Version] Compare Version Request',
COMPARE_METADATA_SUCCESS = '[Compare Version] Compare Version Success',
COMPARE_METADATA_ERROR = '[Compare Version] Compare Version Error',
SET_VERSIONS = '[Compare Version] Set Versions',
CLEAR_VERSIONS = '[Compare Version] Clear Versions'
}

export class CompareVersionRequest implements Action {
readonly type = CompareActionTypes.COMPARE_METADATA_REQUEST;

constructor(public payload: MetadataVersion[]) { }
}

export class CompareVersionSuccess implements Action {
readonly type = CompareActionTypes.COMPARE_METADATA_SUCCESS;

constructor(public payload: MetadataHistory) { }
}

export class CompareVersionError implements Action {
readonly type = CompareActionTypes.COMPARE_METADATA_ERROR;

constructor(public payload: any) { }
}

export class SetMetadataVersions implements Action {
readonly type = CompareActionTypes.SET_VERSIONS;

constructor(public payload: Metadata[]) { }
}

export class ClearVersions implements Action {
readonly type = CompareActionTypes.CLEAR_VERSIONS;
}

export type CompareActionsUnion =
| CompareVersionRequest
| CompareVersionSuccess
| CompareVersionError
| SetMetadataVersions
| ClearVersions;
15 changes: 11 additions & 4 deletions ui/src/app/metadata/configuration/configuration.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common';
import { StoreModule } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects';

import { RouterModule } from '@angular/router';
import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap';

import { I18nModule } from '../../i18n/i18n.module';
Expand All @@ -15,7 +15,6 @@ import { ConfigurationPropertyComponent } from './component/configuration-proper
import { PrimitivePropertyComponent } from './component/primitive-property.component';
import { ObjectPropertyComponent } from './component/object-property.component';
import { ArrayPropertyComponent } from './component/array-property.component';
import { RouterModule } from '@angular/router';
import { MetadataOptionsComponent } from './container/metadata-options.component';
import { MetadataXmlComponent } from './container/metadata-xml.component';
import { MetadataHeaderComponent } from './component/metadata-header.component';
Expand All @@ -24,6 +23,8 @@ import { MetadataHistoryService } from './service/history.service';
import { MetadataHistoryComponent } from './container/metadata-history.component';
import { HistoryListComponent } from './component/history-list.component';
import { DomainModule } from '../domain/domain.module';
import { MetadataComparisonComponent } from './container/metadata-comparison.component';
import { CompareVersionEffects } from './effect/compare.effect';

@NgModule({
declarations: [
Expand All @@ -37,7 +38,8 @@ import { DomainModule } from '../domain/domain.module';
ConfigurationComponent,
MetadataHeaderComponent,
MetadataHistoryComponent,
HistoryListComponent
HistoryListComponent,
MetadataComparisonComponent
],
entryComponents: [],
imports: [
Expand Down Expand Up @@ -66,7 +68,12 @@ export class MetadataConfigurationModule {
imports: [
MetadataConfigurationModule,
StoreModule.forFeature('metadata-configuration', fromConfig.reducers),
EffectsModule.forFeature([MetadataConfigurationEffects, MetadataHistoryEffects])
EffectsModule.forFeature(
[
MetadataConfigurationEffects,
MetadataHistoryEffects,
CompareVersionEffects
])
],
providers: []
})
Expand Down
5 changes: 5 additions & 0 deletions ui/src/app/metadata/configuration/configuration.routing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { ConfigurationComponent } from './container/configuration.component';
import { MetadataOptionsComponent } from './container/metadata-options.component';
import { MetadataXmlComponent } from './container/metadata-xml.component';
import { MetadataHistoryComponent } from './container/metadata-history.component';
import { MetadataComparisonComponent } from './container/metadata-comparison.component';

export const ConfigurationRoutes: Routes = [
{
Expand All @@ -24,6 +25,10 @@ export const ConfigurationRoutes: Routes = [
{
path: 'history',
component: MetadataHistoryComponent
},
{
path: 'compare',
component: MetadataComparisonComponent
}
]
}
Expand Down
Empty file.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Component, ChangeDetectionStrategy } from '@angular/core';
import { Observable } from 'rxjs';
import { Store } from '@ngrx/store';
import { ConfigurationState, getVersionCollection } from '../reducer';
import { Metadata } from '../../domain/domain.type';
import { ActivatedRoute } from '@angular/router';

@Component({
selector: 'metadata-comparison',
changeDetection: ChangeDetectionStrategy.OnPush,
templateUrl: './metadata-comparison.component.html',
styleUrls: []
})
export class MetadataComparisonComponent {

versions$: Observable<Metadata[]>;

constructor(
private store: Store<ConfigurationState>,
private activatedRoute: ActivatedRoute
) {
this.activatedRoute.queryParams.subscribe(versions => console.log(versions));
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
<div class="container">
<history-list [history]="history$ | async"></history-list>
<history-list
[history]="history$ | async"
(compare)="compareVersions($event)"></history-list>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Observable } from 'rxjs';
import { Store } from '@ngrx/store';
import { ConfigurationState, getVersionCollection } from '../reducer';
import { MetadataVersion } from '../model/version';
import { CompareVersionRequest } from '../action/compare.action';

@Component({
selector: 'metadata-history',
Expand All @@ -19,4 +20,8 @@ export class MetadataHistoryComponent {
) {
this.history$ = this.store.select(getVersionCollection);
}

compareVersions(versions: MetadataVersion[]): void {
this.store.dispatch(new CompareVersionRequest(versions));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@
[version]="version$ | async"
[versionNumber]="versionNumber$ | async"
[isCurrent]="isCurrent$ | async"></metadata-header>
<div class="px-3 my-3 d-flex justify-content-end">
<!--
<div class="px-3 my-3 d-flex justify-content-between">
<a class="btn btn-link" routerLink="../history">
<i class="fa fa-history sr-hidden"></i>&nbsp;
<translate-i18n key="action.version-history">Version History</translate-i18n>
</a>
-->
<div class="btn-group">
<a class="btn" routerLink="../options" routerLinkActive="btn-primary" translate="action.options">Options</a>
<a class="btn" routerLink="../xml" routerLinkActive="btn-primary" translate="action.xml">XML</a>
Expand Down
28 changes: 28 additions & 0 deletions ui/src/app/metadata/configuration/effect/compare.effect.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { Injectable } from '@angular/core';
import { Effect, Actions, ofType } from '@ngrx/effects';
import { switchMap, catchError, tap, withLatestFrom } from 'rxjs/operators';
import { of } from 'rxjs';
import { MetadataHistoryService } from '../service/history.service';
import { CompareVersionRequest, CompareActionTypes } from '../action/compare.action';
import { Store } from '@ngrx/store';
import { State, getConfigurationModel } from '../reducer';
import { ActivatedRoute, RouterState, RouterStateSnapshot } from '@angular/router';

@Injectable()
export class CompareVersionEffects {

@Effect({dispatch: false})
compareVersionRequest$ = this.actions$.pipe(
ofType<CompareVersionRequest>(CompareActionTypes.COMPARE_METADATA_REQUEST),
withLatestFrom(
this.store.select(getConfigurationModel)
),
tap((data) => console.log(data, '@type' in data[1]))
);

constructor(
private historyService: MetadataHistoryService,
private store: Store<State>,
private actions$: Actions
) { }
}
30 changes: 30 additions & 0 deletions ui/src/app/metadata/configuration/reducer/compare.reducer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { CompareActionTypes, CompareActionsUnion } from '../action/compare.action';
import { Metadata } from '../../domain/domain.type';

export interface State {
models: Metadata[];
loaded: Boolean;
}

export const initialState: State = {
models: [],
loaded: false
};

export function reducer(state = initialState, action: CompareActionsUnion): State {
switch (action.type) {
case CompareActionTypes.SET_VERSIONS:
return {
...state,
models: action.payload,
loaded: true
};
case CompareActionTypes.CLEAR_VERSIONS:
return {
...initialState
};
default: {
return state;
}
}
}
10 changes: 9 additions & 1 deletion ui/src/app/metadata/configuration/reducer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { createSelector, createFeatureSelector } from '@ngrx/store';
import * as fromRoot from '../../../app.reducer';
import * as fromConfiguration from './configuration.reducer';
import * as fromHistory from './history.reducer';
import * as fromCompare from './compare.reducer';
import { WizardStep } from '../../../wizard/model';

import * as utils from '../../domain/utility/configuration';
Expand All @@ -12,11 +13,13 @@ import { getInCollectionFn } from '../../domain/domain.util';
export interface ConfigurationState {
configuration: fromConfiguration.State;
history: fromHistory.HistoryState;
compare: fromCompare.State;
}

export const reducers = {
configuration: fromConfiguration.reducer,
history: fromHistory.reducer
history: fromHistory.reducer,
compare: fromCompare.reducer
};

export interface State extends fromRoot.State {
Expand All @@ -27,6 +30,7 @@ export const getState = createFeatureSelector<ConfigurationState>('metadata-conf

export const getConfigurationStateFn = (state: ConfigurationState) => state.configuration;
export const getHistoryStateFn = (state: ConfigurationState) => state.history;
export const getCompareStateFn = (state: ConfigurationState) => state.compare;

export const getConfigurationState = createSelector(getState, getConfigurationStateFn);
export const getConfigurationModel = createSelector(getConfigurationState, fromConfiguration.getModel);
Expand Down Expand Up @@ -83,3 +87,7 @@ export const getSelectedIsCurrent = createSelector(
return selected ? collection[0].id === selected.id : null;
}
);

// Version Comparison

export const getCompareState = createSelector(getState, getCompareStateFn);
9 changes: 9 additions & 0 deletions ui/src/app/metadata/configuration/service/history.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { MetadataHistory } from '../model/history';
import { PATHS } from '../../configuration/configuration.values';
import { MetadataVersion } from '../model/version';
import { map } from 'rxjs/operators';
import { Metadata } from '../../domain/domain.type';

@Injectable()
export class MetadataHistoryService {
Expand All @@ -24,4 +25,12 @@ export class MetadataHistoryService {
}))
);
}

find(resourceId: string, versions: MetadataVersion, type: string): Observable<Metadata[]> {
return of([]);
}

getVersion(resourceId: string, type: string): Observable<Metadata> {
return of();
}
}
2 changes: 1 addition & 1 deletion ui/src/app/schema-form/widget/array/array.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<span class="text-right" *ngIf="schema.description">
<info-icon [description]="schema.description | translate"></info-icon>
</span>
<small class="form-text text-danger px-2" *ngIf="hasErrors">
<small class="form-text text-danger px-2" *ngIf="hasErrors$ | async">
<ng-container *ngFor="let error of errors$ | async; let first=first;">
<ng-container *ngIf="!first">, </ng-container>
<translate-i18n [key]="messages[error.code]">{{ error.message }}</translate-i18n>
Expand Down
19 changes: 8 additions & 11 deletions ui/src/app/schema-form/widget/array/array.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ export interface FormError {
selector: 'array-component',
templateUrl: `./array.component.html`
})
export class CustomArrayComponent extends ArrayWidget implements AfterViewInit, OnDestroy {
export class CustomArrayComponent extends ArrayWidget implements AfterViewInit {
errors$: Observable<FormError[]>;
hasErrors: boolean;
hasErrors$: Observable<boolean>;
hasErrorSub: Subscription;

messages = {
Expand All @@ -29,18 +29,15 @@ export class CustomArrayComponent extends ArrayWidget implements AfterViewInit,

ngAfterViewInit(): void {
this.errors$ = this.formProperty.errorsChanges.pipe(
map(errors => errors ? errors.filter(err => err.code !== 'UNRESOLVABLE_REFERENCE').reduce((coll, err) => {
coll[err.code] = err;
return coll;
}, {}) : {}),
map(errors => errors ?
errors.filter(err => err.code !== 'UNRESOLVABLE_REFERENCE').reduce((coll, err) => {
coll[err.code] = err;
return coll;
}, {}) : {}),
map(collection => Object.values(collection))
);

this.hasErrorSub = this.errors$.subscribe(e => this.hasErrors = !!e.length);
}

ngOnDestroy(): void {
this.hasErrorSub.unsubscribe();
this.hasErrors$ = this.errors$.pipe(map(errors => !!errors.length));
}

removeItem(index: number, item: FormProperty = null): void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<span class="text-right" *ngIf="schema.description">
<info-icon [description]="schema.description | translate"></info-icon>
</span>
<small class="form-text text-danger px-2" *ngIf="hasErrors">
<small class="form-text text-danger px-2" *ngIf="hasErrors$ | async">
<ng-container *ngFor="let error of errors$ | async; let first=first;">
<ng-container *ngIf="!first">, </ng-container>
<translate-i18n [key]="messages[error.code]">{{ error.message }}</translate-i18n>
Expand Down

0 comments on commit 59d818e

Please sign in to comment.