Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(project): proof of new project workflow concept (DEV-1001) #765

Merged
merged 19 commits into from Jun 16, 2022
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
43 changes: 30 additions & 13 deletions src/app/app-routing.module.ts
Expand Up @@ -8,10 +8,13 @@ import { HelpComponent } from './main/help/help.component';
import { MainComponent } from './main/main.component';
import { StatusComponent } from './main/status/status.component';
import { OntologyClassInstanceComponent } from './project/beta/ontology-classes/ontology-class-instance/ontology-class-instance.component';
import { SettingsComponent } from './project/beta/settings/settings.component';
// project
import { BoardComponent } from './project/board/board.component';
import { CollaborationComponent } from './project/collaboration/collaboration.component';
import { ListInfoFormComponent } from './project/list/list-info-form/list-info-form.component';
import { ListComponent } from './project/list/list.component';
import { OntologyFormComponent } from './project/ontology/ontology-form/ontology-form.component';
import { OntologyComponent } from './project/ontology/ontology.component';
import { PermissionComponent } from './project/permission/permission.component';
import { ProjectComponent } from './project/project.component';
Expand Down Expand Up @@ -111,6 +114,11 @@ const routes: Routes = [
path: 'info', // old path setup to avoid 404 when typing beta in front of project
redirectTo: ''
},
{
path: 'add-ontology',
component: OntologyFormComponent,
canActivate: [AuthGuard]
},
{
path: 'ontology',
component: HintComponent,
Expand All @@ -135,6 +143,11 @@ const routes: Routes = [
path: 'ontology/:onto/:class/:instance',
component: OntologyClassInstanceComponent,
},
{
path: 'add-list',
component: ListInfoFormComponent,
canActivate: [AuthGuard]
},
{
path: 'list',
component: HintComponent,
Expand All @@ -147,19 +160,23 @@ const routes: Routes = [
},
{
path: 'settings',
component: StatusComponent,
data: { status: 501, comment: 'Here you will be able to configure the project: e.g. setup collaboration and permissions.' },
canActivate: [AuthGuard]
},
{
path: 'settings/collaboration',
component: CollaborationComponent,
canActivate: [AuthGuard]
},
{
path: 'settings/permissions',
component: PermissionComponent,
canActivate: [AuthGuard]
component: SettingsComponent,
canActivate: [AuthGuard],
children: [
{
path: '',
pathMatch: 'full',
redirectTo: 'collaboration'
},
{
path: 'collaboration',
component: CollaborationComponent
},
{
path: 'permissions',
component: PermissionComponent
},
]
},
{
path: '**',
Expand Down
4 changes: 3 additions & 1 deletion src/app/app.module.ts
Expand Up @@ -164,6 +164,7 @@ import { TextComponent } from './workspace/resource/representation/text/text.com
import { OntologyClassesComponent } from './project/beta/ontology-classes/ontology-classes.component';
import { OntologyClassItemComponent } from './project/beta/ontology-classes/ontology-class-item/ontology-class-item.component';
import { OntologyClassInstanceComponent } from './project/beta/ontology-classes/ontology-class-instance/ontology-class-instance.component';
import { SettingsComponent } from './project/beta/settings/settings.component';

// translate: AoT requires an exported function for factories
export function httpLoaderFactory(httpClient: HttpClient) {
Expand Down Expand Up @@ -314,7 +315,8 @@ export function httpLoaderFactory(httpClient: HttpClient) {
TextComponent,
OntologyClassesComponent,
OntologyClassItemComponent,
OntologyClassInstanceComponent
OntologyClassInstanceComponent,
SettingsComponent
],
imports: [
AngularSplitModule.forRoot(),
Expand Down
2 changes: 1 addition & 1 deletion src/app/main/action/hint/hint.component.html
@@ -1,5 +1,5 @@
<div class="hint" [innerHtml]="content"></div>

<a mat-button [href]="documentation" target="_blank" color="primary" class="external-url">
<a *ngIf="documentation" mat-button [href]="documentation" target="_blank" color="primary" class="external-url">
Read more in the user guide<mat-icon class="suffix">launch</mat-icon>
</a>
26 changes: 13 additions & 13 deletions src/app/main/dialog/dialog.component.html
Expand Up @@ -32,12 +32,12 @@
<!-- TODO: create a mat dialog actions component with the following buttons: Cancel to reset and OK to confirm action -->
<mat-dialog-actions>
<button mat-button mat-dialog-close class="cancel-button center" [mat-dialog-close]="false">
Cancel
No, keep it
</button>
<span class="fill-remaining-space"></span>
<button mat-button mat-raised-button [color]="'warn'" class="confirm-button center"
[mat-dialog-close]="true">
Suspend
Yes, suspend
</button>
</mat-dialog-actions>
</div>
Expand Down Expand Up @@ -179,12 +179,12 @@
Do you want to delete this node?
<mat-dialog-actions>
<button mat-button mat-dialog-close class="cancel-button center" [mat-dialog-close]="false">
Cancel
No, keep it
</button>
<span class="fill-remaining-space"></span>
<button mat-button mat-raised-button [color]="'warn'" class="confirm-button center"
[mat-dialog-close]="true">
Delete
Yes, delete
</button>
</mat-dialog-actions>
</div>
Expand All @@ -208,12 +208,12 @@
Do you want to delete this list?
<mat-dialog-actions>
<button mat-button mat-dialog-close class="cancel-button center" [mat-dialog-close]="false">
Cancel
No, keep it
</button>
<span class="fill-remaining-space"></span>
<button mat-button mat-raised-button [color]="'warn'" class="confirm-button center"
[mat-dialog-close]="true">
Delete
Yes, delete
</button>
</mat-dialog-actions>
</div>
Expand All @@ -237,12 +237,12 @@
Do you want to delete this data model?
<mat-dialog-actions>
<button mat-button mat-dialog-close class="cancel-button center" [mat-dialog-close]="false">
Cancel
No, keep it
</button>
<span class="fill-remaining-space"></span>
<button mat-button mat-raised-button [color]="'warn'" class="confirm-button center"
[mat-dialog-close]="true">
Delete
Yes, delete
</button>
</mat-dialog-actions>
</div>
Expand All @@ -268,12 +268,12 @@
Do you want to delete this resource class?
<mat-dialog-actions>
<button mat-button mat-dialog-close class="cancel-button center" [mat-dialog-close]="false">
Cancel
No, keep it
</button>
<span class="fill-remaining-space"></span>
<button mat-button mat-raised-button [color]="'warn'" class="confirm-button center"
[mat-dialog-close]="true">
Delete
Yes, delete
</button>
</mat-dialog-actions>
</div>
Expand Down Expand Up @@ -308,12 +308,12 @@
Do you want to delete this property?
<mat-dialog-actions>
<button mat-button mat-dialog-close class="cancel-button center" [mat-dialog-close]="false">
Cancel
No, keep it
</button>
<span class="fill-remaining-space"></span>
<button mat-button mat-raised-button [color]="'warn'" class="confirm-button center"
[mat-dialog-close]="true">
Delete
Yes, delete
</button>
</mat-dialog-actions>
</div>
Expand Down Expand Up @@ -347,7 +347,7 @@
<span class="fill-remaining-space"></span>
<button mat-button mat-raised-button [color]="'primary'" class="confirm-button center"
[mat-dialog-close]="{confirmed: true, comment: comment}" [disabled]="!comment">
Save
Update
</button>
</mat-dialog-actions>
</div>
Expand Down
Expand Up @@ -27,11 +27,14 @@

<!-- add new resource instance if instance id is called "add" -->
<div class="single-instance-form" *ngIf="instanceId && instanceId === 'add'">
<h3>Create new {{classId}} instance</h3>
<h3>Create new resource of type: {{resClass?.label}}</h3>
<app-resource-instance-form
[selectedResourceClassIri]="classId"
[selectedProject]="projectId">
</app-resource-instance-form>
</div>

<!-- display single resource instance if instance id exists and is not called "add" -->
<div class="single-instance" *ngIf="instanceId && instanceId !== 'add'">
<app-resource [resourceIri]="resourceIri"></app-resource>
</div>
@@ -1,6 +1,8 @@
import { Component } from '@angular/core';
import { Component, OnChanges } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { ReadOntology, ResourceClassDefinition } from '@dasch-swiss/dsp-js';
import { AppInitService } from 'src/app/app-init.service';
import { CacheService } from 'src/app/main/cache/cache.service';
import { OntologyService } from 'src/app/project/ontology/ontology.service';
import { FilteredResources, SearchParams } from 'src/app/workspace/results/list-view/list-view.component';
import { SplitSize } from 'src/app/workspace/results/results.component';
Expand All @@ -10,13 +12,21 @@ import { SplitSize } from 'src/app/workspace/results/results.component';
templateUrl: './ontology-class-instance.component.html',
styleUrls: ['./ontology-class-instance.component.scss']
})
export class OntologyClassInstanceComponent {
export class OntologyClassInstanceComponent implements OnChanges {

projectId: string;

ontoId: string;

// id (iri) of resource class
classId: string;

resClass: ResourceClassDefinition;

// uuid of resource instance
instanceId: string;
// id (iri) or resource instance
resourceIri: string;

searchParams: SearchParams;

Expand All @@ -30,6 +40,7 @@ export class OntologyClassInstanceComponent {

constructor(
private _ais: AppInitService,
private _cache: CacheService,
private _route: ActivatedRoute,
private _ontologyService: OntologyService
) {
Expand All @@ -46,16 +57,22 @@ export class OntologyClassInstanceComponent {
const className = params['class'];

// get the resource class id from route
this.classId = `${iriBase}/ontology/${projectCode}/${ontologyName}/v2#${className}`;
this.ontoId = `${iriBase}/ontology/${projectCode}/${ontologyName}/v2`;
this.classId = `${this.ontoId}#${className}`;

this.instanceId = params['instance'];
if (this.instanceId) {
// single instance
// single instance view

if (this.instanceId === 'add') {
// create new res class instance: display res instance form
this.ngOnChanges();
} else {
// get the single resource instance
this.resourceIri = `${this._ais.dspAppConfig.iriBase}/${projectCode}/${this.instanceId}`;
}
} else {
// display all resource instances of this resource class
this.searchParams = {
query: this._setGravsearch(this.classId),
mode: 'gravsearch'
Expand All @@ -64,6 +81,16 @@ export class OntologyClassInstanceComponent {
});
}

ngOnChanges() {
this._cache.get('currentProjectOntologies').subscribe(
(ontologies: ReadOntology[]) => {
// find ontology of current resource class to get the class label
const classes = ontologies[ontologies.findIndex(onto => onto.id === this.ontoId)].getAllClassDefinitions();
this.resClass = <ResourceClassDefinition>classes[classes.findIndex(res => res.id === this.classId)];
}
);
}

openSelectedResources(res: FilteredResources) {

this.selectedResources = res;
Expand Down
@@ -1,14 +1,15 @@
<span class="link" [routerLink]="link">
<h2 matLine class="label mat-subheading-1">{{resClass.label}}</h2>
<span matLine class="instances">
{{results | i18nPlural: itemPluralMapping['instance']}}
{{results | i18nPlural: itemPluralMapping['resource']}}
</span>
</span>

<span class="overlay-buttons hover-only">
<span class="overlay-buttons hover-only" *ngIf="projectMember">
<!-- with the following button, it should be possible to edit the resource class in a quick way; but maybe we don't need it
<button mat-icon-button class="conf" [routerLink]="link + '/conf'">
<mat-icon>tune</mat-icon>
</button>
</button> -->
<button mat-icon-button class="add" [routerLink]="link + '/add'">
<mat-icon>add</mat-icon>
</button>
Expand Down
Expand Up @@ -14,6 +14,8 @@ export class OntologyClassItemComponent implements OnInit {

@Input() resClass: ClassDefinition;

@Input() projectMember: boolean;

gravsearch: string;

results: number;
Expand All @@ -22,9 +24,9 @@ export class OntologyClassItemComponent implements OnInit {

// i18n setup
itemPluralMapping = {
instance: {
'=1': '1 instance',
other: '# instances'
resource: {
'=1': '1 resource',
other: '# resources'
}
};

Expand Down
@@ -1,5 +1,5 @@
<mat-list-item *ngFor="let class of classesToDisplay">
<app-ontology-class-item [resClass]="class">
<app-ontology-class-item [resClass]="class" [projectMember]="projectMember">

</app-ontology-class-item>
</mat-list-item>
Expand Up @@ -11,6 +11,8 @@ export class OntologyClassesComponent implements OnInit {

@Input() resClasses: ClassDefinition[];

@Input() projectMember: boolean;

classesToDisplay: ClassDefinition[] = [];

constructor(
Expand Down
8 changes: 8 additions & 0 deletions src/app/project/beta/settings/settings.component.html
@@ -0,0 +1,8 @@
<nav mat-tab-nav-bar mat-align-tabs="center" class="settings navigation" animationDuration="0ms">
<a mat-tab-link *ngFor="let link of navigation; let first = first" id="{{link.route}}" [routerLink]="link.route"
routerLinkActive="active-tab" #rla="routerLinkActive" [active]="rla.isActive">
<mat-icon class="tab-icon">{{link.icon}}</mat-icon>
{{link.label}}
</a>
</nav>
<router-outlet></router-outlet>
1 change: 1 addition & 0 deletions src/app/project/beta/settings/settings.component.scss
@@ -0,0 +1 @@

29 changes: 29 additions & 0 deletions src/app/project/beta/settings/settings.component.spec.ts
@@ -0,0 +1,29 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';

import { SettingsComponent } from './settings.component';

describe('SettingsComponent', () => {
let component: SettingsComponent;
let fixture: ComponentFixture<SettingsComponent>;

beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ SettingsComponent ],
imports: [
RouterTestingModule
]
})
.compileComponents();
});

beforeEach(() => {
fixture = TestBed.createComponent(SettingsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});