diff --git a/apps/dsp-app/src/app/app-routing.module.ts b/apps/dsp-app/src/app/app-routing.module.ts
index dc35c08048..7279b18df8 100644
--- a/apps/dsp-app/src/app/app-routing.module.ts
+++ b/apps/dsp-app/src/app/app-routing.module.ts
@@ -1,6 +1,7 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { RouteConstants } from '@dasch-swiss/vre/shared/app-config';
+import { CreateListInfoPageComponent, ListComponent } from '@dasch-swiss/vre/shared/app-list';
import {
ResourceComponent,
ResourcePage2Component,
@@ -18,8 +19,6 @@ import { DataModelsComponent } from './project/data-models/data-models.component
import { DescriptionComponent } from './project/description/description.component';
import { EditProjectFormPageComponent } from './project/edit-project-form-page/edit-project-form-page.component';
import { ImageSettingsComponent } from './project/image-settings/image-settings.component';
-import { ListComponent } from './project/list/list.component';
-import { CreateListInfoPageComponent } from './project/list/reusable-list-info-form/create-list-info-page.component';
import { OntologyFormComponent } from './project/ontology/ontology-form/ontology-form.component';
import { OntologyComponent } from './project/ontology/ontology.component';
import { OntologyClassInstanceComponent } from './project/ontology-classes/ontology-class-instance/ontology-class-instance.component';
diff --git a/apps/dsp-app/src/app/app.module.ts b/apps/dsp-app/src/app/app.module.ts
index e8f599a1eb..bdfb42b83f 100644
--- a/apps/dsp-app/src/app/app.module.ts
+++ b/apps/dsp-app/src/app/app.module.ts
@@ -23,6 +23,11 @@ import {
} from '@dasch-swiss/vre/shared/app-config';
import { AppDatePickerComponent } from '@dasch-swiss/vre/shared/app-date-picker';
import { AppErrorHandler } from '@dasch-swiss/vre/shared/app-error-handler';
+import {
+ CreateListInfoPageComponent,
+ ReusableListInfoFormComponent,
+ ListComponents,
+} from '@dasch-swiss/vre/shared/app-list';
import { NotificationService } from '@dasch-swiss/vre/shared/app-notification';
import {
AppProgressIndicatorComponent,
@@ -39,6 +44,7 @@ import {
MultiLanguageTextareaComponent,
MutiLanguageInputComponent,
} from '@dasch-swiss/vre/shared/app-string-literal';
+import { UiComponents } from '@dasch-swiss/vre/shared/app-ui';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import * as Sentry from '@sentry/angular-ivy';
@@ -49,7 +55,6 @@ import { ColorPickerModule } from 'ngx-color-picker';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
-import { ConfirmDialogComponent } from './main/action/confirm-dialog/confirm-dialog.component';
import { HintComponent } from './main/action/hint/hint.component';
import { LoginFormComponent } from './main/action/login-form/login-form.component';
import { SelectedResourcesComponent } from './main/action/selected-resources/selected-resources.component';
@@ -87,17 +92,6 @@ import { EditProjectFormPageComponent } from './project/edit-project-form-page/e
import { ImageDisplayAbsoluteComponent } from './project/image-settings/image-display-absolute.component';
import { ImageDisplayRatioComponent } from './project/image-settings/image-display-ratio.component';
import { ImageSettingsComponent } from './project/image-settings/image-settings.component';
-import { ActionBubbleComponent } from './project/list/action-bubble/action-bubble.component';
-import { ListItemComponent } from './project/list/list-item/list-item.component';
-import { ListItemElementComponent } from './project/list/list-item-element/list-item-element.component';
-import { CreateListItemDialogComponent } from './project/list/list-item-form/edit-list-item/create-list-item-dialog.component';
-import { EditListItemDialogComponent } from './project/list/list-item-form/edit-list-item/edit-list-item-dialog.component';
-import { ListItemFormComponent } from './project/list/list-item-form/list-item-form.component';
-import { ReusableListItemFormComponent } from './project/list/list-item-form/reusable-list-item-form.component';
-import { ListComponent } from './project/list/list.component';
-import { CreateListInfoPageComponent } from './project/list/reusable-list-info-form/create-list-info-page.component';
-import { EditListInfoDialogComponent } from './project/list/reusable-list-info-form/edit-list-info-dialog.component';
-import { ReusableListInfoFormComponent } from './project/list/reusable-list-info-form/reusable-list-info-form.component';
import { CreateResourceClassDialogComponent } from './project/ontology/create-resource-class-dialog/create-resource-class-dialog.component';
import { EditResourceClassDialogComponent } from './project/ontology/edit-resource-class-dialog/edit-resource-class-dialog.component';
import { OntologyFormComponent } from './project/ontology/ontology-form/ontology-form.component';
@@ -163,8 +157,9 @@ export function httpLoaderFactory(httpClient: HttpClient) {
...ResourcePageComponents,
...RepresentationsComponents,
...CommonToMoveComponents,
+ ...ListComponents,
+ ...UiComponents,
AccountComponent,
- ActionBubbleComponent,
AddUserComponent,
AdminImageDirective,
AdvancedSearchContainerComponent,
@@ -176,7 +171,6 @@ export function httpLoaderFactory(httpClient: HttpClient) {
ColorPickerComponent,
CommonInputComponent,
ComparisonComponent,
- ConfirmDialogComponent,
CookiePolicyComponent,
CreateUserDialogComponent,
CreateResourceClassDialogComponent,
@@ -201,15 +195,8 @@ export function httpLoaderFactory(httpClient: HttpClient) {
KnoraDatePipe,
LoadingButtonDirective,
LinkifyPipe,
- ListComponent,
- EditListInfoDialogComponent,
- EditListItemDialogComponent,
CreateListInfoPageComponent,
ReusableListInfoFormComponent,
- ReusableListItemFormComponent,
- ListItemComponent,
- ListItemElementComponent,
- ListItemFormComponent,
ListViewComponent,
LoginFormComponent,
MembershipComponent,
@@ -261,7 +248,6 @@ export function httpLoaderFactory(httpClient: HttpClient) {
ProjectTileComponent,
DataModelsComponent,
IsFalsyPipe,
- CreateListItemDialogComponent,
ImageDisplayAbsoluteComponent,
MultipleViewerComponent,
],
diff --git a/apps/dsp-app/src/app/project/list/list.component.spec.ts b/apps/dsp-app/src/app/project/list/list.component.spec.ts
deleted file mode 100644
index 375b23fdb7..0000000000
--- a/apps/dsp-app/src/app/project/list/list.component.spec.ts
+++ /dev/null
@@ -1,304 +0,0 @@
-import { OverlayContainer } from '@angular/cdk/overlay';
-import { HarnessLoader } from '@angular/cdk/testing';
-import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
-import { Component, CUSTOM_ELEMENTS_SCHEMA, ViewChild } from '@angular/core';
-import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { ReactiveFormsModule } from '@angular/forms';
-import { MatButtonModule } from '@angular/material/button';
-import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
-import { MatDialogHarness } from '@angular/material/dialog/testing';
-import { MatIconModule } from '@angular/material/icon';
-import { MatSelectModule } from '@angular/material/select';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
-import { MatToolbarModule } from '@angular/material/toolbar';
-import { MatTooltipModule } from '@angular/material/tooltip';
-import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { ActivatedRoute, Router } from '@angular/router';
-import {
- ApiResponseData,
- ListNodeInfo,
- ListsEndpointAdmin,
- ListsResponse,
- MockProjects,
- ProjectResponse,
- ProjectsEndpointAdmin,
- ReadProject,
-} from '@dasch-swiss/dsp-js';
-import { DialogComponent, DialogHeaderComponent } from '@dasch-swiss/vre/shared/app-common-to-move';
-import { AppConfigService, DspApiConnectionToken } from '@dasch-swiss/vre/shared/app-config';
-import { AppLoggingService } from '@dasch-swiss/vre/shared/app-logging';
-import { Session, SessionService } from '@dasch-swiss/vre/shared/app-session';
-import { ApplicationStateService } from '@dasch-swiss/vre/shared/app-state-service';
-import { StringifyStringLiteralPipe } from '@dsp-app/src/app/main/pipes/string-transformation/stringify-string-literal.pipe';
-import { TruncatePipe } from '@dsp-app/src/app/main/pipes/string-transformation/truncate.pipe';
-import { TestConfig } from '@dsp-app/src/test.config';
-import { TranslateModule } from '@ngx-translate/core';
-import { MockProvider } from 'ng-mocks';
-import { of } from 'rxjs';
-import { AjaxResponse } from 'rxjs/ajax';
-import { ListComponent } from './list.component';
-
-/**
- * test Host Component
- */
-@Component({
- template: '',
-})
-class TestHostComponent {
- @ViewChild('listComponent') listComponent: ListComponent;
-}
-
-/**
- * mock ListItem.
- */
-@Component({
- template: '',
-})
-class MockListItemComponent {}
-
-/**
- * mock ListItemForm.
- */
-@Component({
- template: '',
-})
-class MockListItemFormComponent {}
-
-describe('ListComponent', () => {
- let testHostComponent: TestHostComponent;
- let testHostFixture: ComponentFixture;
- let rootLoader: HarnessLoader;
- let overlayContainer: OverlayContainer;
-
- const appInitSpy = {
- dspAppConfig: {
- iriBase: 'http://rdfh.ch',
- },
- };
-
- beforeEach(waitForAsync(() => {
- const dspConnSpyObj = {
- admin: {
- listsEndpoint: jasmine.createSpyObj('listsEndpoint', ['getListsInProject', 'deleteListNode']),
- projectsEndpoint: jasmine.createSpyObj('projectsEndpoint', ['getProjectByIri']),
- },
- };
-
- const sessionServiceSpy = jasmine.createSpyObj('SessionService', ['getSession']);
-
- const applicationStateServiceSpy = jasmine.createSpyObj('ApplicationStateService', ['get']);
-
- const routerSpy = jasmine.createSpyObj('Router', ['navigate', 'navigateByUrl']);
-
- TestBed.configureTestingModule({
- declarations: [
- ListComponent,
- TestHostComponent,
- MockListItemComponent,
- MockListItemFormComponent,
- DialogComponent,
- DialogHeaderComponent,
- StringifyStringLiteralPipe,
- TruncatePipe,
- ],
- imports: [
- BrowserAnimationsModule,
- MatButtonModule,
- MatDialogModule,
- MatIconModule,
- MatSelectModule,
- MatSnackBarModule,
- MatToolbarModule,
- MatTooltipModule,
- ReactiveFormsModule,
- TranslateModule.forRoot(),
- ],
- providers: [
- {
- provide: ActivatedRoute,
- useValue: {
- parent: {
- paramMap: of({
- get: (param: string) => {
- if (param === 'uuid') {
- return TestConfig.ProjectUuid;
- }
- },
- }),
- snapshot: {
- url: [{ path: 'project' }],
- },
- },
- params: of({ list: 'mockList01' }),
- snapshot: {
- params: [{ id: 'http://rdfh.ch/lists/0001/mockList01' }],
- },
- },
- },
- {
- provide: AppConfigService,
- useValue: appInitSpy,
- },
- MockProvider(AppLoggingService),
- {
- provide: DspApiConnectionToken,
- useValue: dspConnSpyObj,
- },
- {
- provide: SessionService,
- useValue: sessionServiceSpy,
- },
- {
- provide: ApplicationStateService,
- useValue: applicationStateServiceSpy,
- },
- {
- provide: Router,
- useValue: routerSpy,
- },
- {
- provide: MAT_DIALOG_DATA,
- useValue: {},
- },
- {
- provide: MatDialogRef,
- useValue: {},
- },
- ],
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
- }).compileComponents();
- }));
-
- afterEach(async () => {
- const dialogs = await rootLoader.getAllHarnesses(MatDialogHarness);
- await Promise.all(dialogs.map(async d => await d.close()));
-
- // angular won't call this for us so we need to do it ourselves to avoid leaks.
- overlayContainer.ngOnDestroy();
- });
-
- describe('Displaying lists', () => {
- beforeEach(() => {
- // mock session service
- const sessionSpy = TestBed.inject(SessionService);
-
- (sessionSpy as jasmine.SpyObj).getSession.and.callFake(() => {
- const session: Session = {
- id: 12345,
- user: {
- name: 'username',
- jwt: 'myToken',
- lang: 'en',
- sysAdmin: true,
- projectAdmin: [],
- },
- };
-
- return session;
- });
-
- // mock application state service
- const applicationStateServiceSpy = TestBed.inject(ApplicationStateService);
-
- (applicationStateServiceSpy as jasmine.SpyObj).get.and.callFake(() => {
- const response: ProjectResponse = new ProjectResponse();
-
- const mockProjects = MockProjects.mockProjects();
-
- response.project = mockProjects.body.projects[0];
-
- return of(response.project as ReadProject);
- });
-
- // mock router
- const routerSpy = TestBed.inject(Router);
-
- (routerSpy as jasmine.SpyObj).navigate.and.stub();
- (routerSpy as jasmine.SpyObj).navigateByUrl.and.stub();
-
- // mock lists endpoint
- const dspConnSpy = TestBed.inject(DspApiConnectionToken);
-
- (dspConnSpy.admin.listsEndpoint as jasmine.SpyObj).getListsInProject.and.callFake(() => {
- const response = new ListsResponse();
-
- response.lists = new Array();
-
- const mockList1 = new ListNodeInfo();
- mockList1.comments = [];
- mockList1.id = 'http://rdfh.ch/lists/0001/mockList01';
- mockList1.isRootNode = true;
- mockList1.labels = [{ language: 'en', value: 'Mock List 01' }];
- mockList1.projectIri = 'http://rdfh.ch/projects/myProjectIri';
-
- const mockList2 = new ListNodeInfo();
- mockList2.comments = [];
- mockList2.id = 'http://rdfh.ch/lists/0001/mockList02';
- mockList2.isRootNode = true;
- mockList2.labels = [{ language: 'en', value: 'Mock List 02' }];
- mockList2.projectIri = 'http://rdfh.ch/projects/myProjectIri';
-
- response.lists.push(mockList1, mockList2);
-
- return of(
- ApiResponseData.fromAjaxResponse({
- response,
- } as AjaxResponse)
- );
- });
-
- // mock projects endpoint
- (dspConnSpy.admin.projectsEndpoint as jasmine.SpyObj).getProjectByIri.and.callFake(() => {
- const response = new ProjectResponse();
-
- const mockProjects = MockProjects.mockProjects();
-
- response.project = mockProjects.body.projects[0];
-
- return of(
- ApiResponseData.fromAjaxResponse({
- response,
- } as AjaxResponse)
- );
- });
-
- testHostFixture = TestBed.createComponent(TestHostComponent);
- testHostComponent = testHostFixture.componentInstance;
- testHostFixture.detectChanges();
-
- overlayContainer = TestBed.inject(OverlayContainer);
- rootLoader = TestbedHarnessEnvironment.documentRootLoader(testHostFixture);
-
- expect(testHostComponent.listComponent.session).toBeTruthy();
- expect(testHostComponent).toBeTruthy();
- });
-
- it('should get the project', () => {
- const mockProject = MockProjects.mockProjects().body.projects[0];
-
- expect(testHostComponent.listComponent.project).toEqual(mockProject);
- });
-
- it('should initialize the list of lists', () => {
- const listOfLists = new Array();
-
- const list1 = new ListNodeInfo();
- list1.comments = [];
- list1.id = 'http://rdfh.ch/lists/0001/mockList01';
- list1.isRootNode = true;
- list1.labels = [{ language: 'en', value: 'Mock List 01' }];
- list1.projectIri = 'http://rdfh.ch/projects/myProjectIri';
-
- const list2 = new ListNodeInfo();
- list2.comments = [];
- list2.id = 'http://rdfh.ch/lists/0001/mockList02';
- list2.isRootNode = true;
- list2.labels = [{ language: 'en', value: 'Mock List 02' }];
- list2.projectIri = 'http://rdfh.ch/projects/myProjectIri';
-
- listOfLists.push(list1, list2);
-
- expect(testHostComponent.listComponent.lists).toEqual(listOfLists);
- });
- });
-});
diff --git a/apps/dsp-app/src/app/project/ontology/ontology.component.ts b/apps/dsp-app/src/app/project/ontology/ontology.component.ts
index fd1ceac5ed..74a8cf2cbd 100644
--- a/apps/dsp-app/src/app/project/ontology/ontology.component.ts
+++ b/apps/dsp-app/src/app/project/ontology/ontology.component.ts
@@ -53,10 +53,10 @@ import {
UserSelectors,
} from '@dasch-swiss/vre/shared/app-state';
import { MultiLanguages } from '@dasch-swiss/vre/shared/app-string-literal';
+import { DialogService } from '@dasch-swiss/vre/shared/app-ui';
import { Actions, ofActionSuccessful, Select, Store } from '@ngxs/store';
import { combineLatest, Observable, Subject } from 'rxjs';
import { map, switchMap, take, takeUntil } from 'rxjs/operators';
-import { DialogService } from '../../main/services/dialog.service';
import { ProjectBase } from '../project-base';
import {
CreateResourceClassDialogComponent,
diff --git a/apps/dsp-app/src/app/project/ontology/resource-class-form/resource-class-form.component.ts b/apps/dsp-app/src/app/project/ontology/resource-class-form/resource-class-form.component.ts
index 31f5b55d51..c3ec6b6128 100644
--- a/apps/dsp-app/src/app/project/ontology/resource-class-form/resource-class-form.component.ts
+++ b/apps/dsp-app/src/app/project/ontology/resource-class-form/resource-class-form.component.ts
@@ -2,13 +2,12 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
import { ClassDefinition, PropertyDefinition } from '@dasch-swiss/dsp-js';
import { getAllEntityDefinitionsAsArray } from '@dasch-swiss/vre/shared/app-api';
-import { CustomRegex } from '@dasch-swiss/vre/shared/app-common';
+import { CustomRegex, atLeastOneStringRequired } from '@dasch-swiss/vre/shared/app-common';
import { OntologyService } from '@dasch-swiss/vre/shared/app-helper-services';
import { OntologiesSelectors } from '@dasch-swiss/vre/shared/app-state';
import { DEFAULT_MULTILANGUAGE_FORM, MultiLanguages } from '@dasch-swiss/vre/shared/app-string-literal';
import { Store } from '@ngxs/store';
import { existingNamesValidator } from '../../../main/directive/existing-name/existing-names.validator';
-import { atLeastOneStringRequired } from '../../../main/form-validators/at-least-one-string-required.validator';
import { ResourceClassForm } from './resource-class-form.type';
@Component({
diff --git a/apps/dsp-app/src/app/project/ontology/resource-class-info/resource-class-info-element.component.ts b/apps/dsp-app/src/app/project/ontology/resource-class-info/resource-class-info-element.component.ts
index b42a1f5ce5..4e2047306f 100644
--- a/apps/dsp-app/src/app/project/ontology/resource-class-info/resource-class-info-element.component.ts
+++ b/apps/dsp-app/src/app/project/ontology/resource-class-info/resource-class-info-element.component.ts
@@ -14,10 +14,10 @@ import { GuiCardinality } from '@dasch-swiss/vre/shared/app-common-to-move';
import { DspApiConnectionToken } from '@dasch-swiss/vre/shared/app-config';
import { DefaultClass, DefaultProperty } from '@dasch-swiss/vre/shared/app-helper-services';
import { OntologiesSelectors, OntologyProperties, PropToDisplay } from '@dasch-swiss/vre/shared/app-state';
+import { DialogService } from '@dasch-swiss/vre/shared/app-ui';
import { Select, Store } from '@ngxs/store';
import { Observable, Subject } from 'rxjs';
import { map, takeUntil } from 'rxjs/operators';
-import { DialogService } from '../../../main/services/dialog.service';
@Component({
selector: 'app-resource-class-info-element',
diff --git a/apps/dsp-app/src/app/project/ontology/resource-class-info/resource-class-property-info/resource-class-property-info.component.ts b/apps/dsp-app/src/app/project/ontology/resource-class-info/resource-class-property-info/resource-class-property-info.component.ts
index bab955311e..05eb8b3d88 100644
--- a/apps/dsp-app/src/app/project/ontology/resource-class-info/resource-class-property-info/resource-class-property-info.component.ts
+++ b/apps/dsp-app/src/app/project/ontology/resource-class-info/resource-class-property-info/resource-class-property-info.component.ts
@@ -27,10 +27,10 @@ import { GuiCardinality } from '@dasch-swiss/vre/shared/app-common-to-move';
import { DspApiConnectionToken } from '@dasch-swiss/vre/shared/app-config';
import { DefaultClass, DefaultProperty, OntologyService } from '@dasch-swiss/vre/shared/app-helper-services';
import { ListsSelectors, OntologiesSelectors } from '@dasch-swiss/vre/shared/app-state';
+import { DialogService } from '@dasch-swiss/vre/shared/app-ui';
import { Store } from '@ngxs/store';
import { Subject } from 'rxjs';
import { switchMap, takeUntil, tap } from 'rxjs/operators';
-import { DialogService } from '../../../../main/services/dialog.service';
// property data structure
export class Property {
diff --git a/apps/dsp-app/src/app/project/reusable-project-form/reusable-project-form.component.ts b/apps/dsp-app/src/app/project/reusable-project-form/reusable-project-form.component.ts
index d2eac5f236..31b487203b 100644
--- a/apps/dsp-app/src/app/project/reusable-project-form/reusable-project-form.component.ts
+++ b/apps/dsp-app/src/app/project/reusable-project-form/reusable-project-form.component.ts
@@ -1,10 +1,9 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { FormBuilder, FormControl, Validators } from '@angular/forms';
+import { arrayLengthGreaterThanZeroValidator, atLeastOneStringRequired } from '@dasch-swiss/vre/shared/app-common';
import { ProjectsSelectors } from '@dasch-swiss/vre/shared/app-state';
import { DEFAULT_MULTILANGUAGE_FORM, MultiLanguages } from '@dasch-swiss/vre/shared/app-string-literal';
import { Store } from '@ngxs/store';
-import { arrayLengthGreaterThanZeroValidator } from '../../main/form-validators/array-length-greater-than-zero-validator';
-import { atLeastOneStringRequired } from '../../main/form-validators/at-least-one-string-required.validator';
import { ProjectForm } from './project-form.type';
import { shortcodeExistsValidator } from './shortcode-exists.validator';
diff --git a/apps/dsp-app/src/app/system/projects/projects-list/projects-list.component.ts b/apps/dsp-app/src/app/system/projects/projects-list/projects-list.component.ts
index 21c024abbd..8ec4dbeee4 100644
--- a/apps/dsp-app/src/app/system/projects/projects-list/projects-list.component.ts
+++ b/apps/dsp-app/src/app/system/projects/projects-list/projects-list.component.ts
@@ -5,11 +5,11 @@ import { ProjectApiService } from '@dasch-swiss/vre/shared/app-api';
import { RouteConstants } from '@dasch-swiss/vre/shared/app-config';
import { ProjectService, SortingService } from '@dasch-swiss/vre/shared/app-helper-services';
import { ProjectsSelectors, UserSelectors } from '@dasch-swiss/vre/shared/app-state';
+import { DialogService } from '@dasch-swiss/vre/shared/app-ui';
import { Select } from '@ngxs/store';
import { Observable, Subject, combineLatest } from 'rxjs';
import { map, takeUntil } from 'rxjs/operators';
import { SortProp } from '../../../main/action/sort-button/sort-button.component';
-import { DialogService } from '../../../main/services/dialog.service';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
diff --git a/apps/dsp-app/src/app/system/users/users-list/users-list.component.ts b/apps/dsp-app/src/app/system/users/users-list/users-list.component.ts
index 5d7c787463..e0f9e0683f 100644
--- a/apps/dsp-app/src/app/system/users/users-list/users-list.component.ts
+++ b/apps/dsp-app/src/app/system/users/users-list/users-list.component.ts
@@ -16,10 +16,10 @@ import {
SetUserAction,
UserSelectors,
} from '@dasch-swiss/vre/shared/app-state';
+import { DialogService } from '@dasch-swiss/vre/shared/app-ui';
import { Actions, ofActionSuccessful, Select, Store } from '@ngxs/store';
import { combineLatest, Observable } from 'rxjs';
import { map, switchMap, take } from 'rxjs/operators';
-import { DialogService } from '../../../main/services/dialog.service';
import { CreateUserDialogComponent } from '../../../user/create-user-page/create-user-dialog.component';
import { EditUserPageComponent } from '../../../user/edit-user-page/edit-user-page.component';
diff --git a/apps/dsp-app/src/app/user/account/account.component.ts b/apps/dsp-app/src/app/user/account/account.component.ts
index 262e596cf2..c1bb054aa1 100644
--- a/apps/dsp-app/src/app/user/account/account.component.ts
+++ b/apps/dsp-app/src/app/user/account/account.component.ts
@@ -4,10 +4,10 @@ import { ReadUser } from '@dasch-swiss/dsp-js';
import { UserApiService } from '@dasch-swiss/vre/shared/app-api';
import { AuthService } from '@dasch-swiss/vre/shared/app-session';
import { LoadUserAction, UserSelectors } from '@dasch-swiss/vre/shared/app-state';
+import { DialogService } from '@dasch-swiss/vre/shared/app-ui';
import { Select, Store } from '@ngxs/store';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
-import { DialogService } from '../../main/services/dialog.service';
import { apiConnectionTokenProvider } from '../../providers/api-connection-token.provider';
@Component({
diff --git a/libs/vre/advanced-search/src/lib/feature/advanced-search/advanced-search.component.ts b/libs/vre/advanced-search/src/lib/feature/advanced-search/advanced-search.component.ts
index c77dc258c4..23e0984081 100644
--- a/libs/vre/advanced-search/src/lib/feature/advanced-search/advanced-search.component.ts
+++ b/libs/vre/advanced-search/src/lib/feature/advanced-search/advanced-search.component.ts
@@ -1,23 +1,23 @@
import { CommonModule } from '@angular/common';
-import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';
+import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, OnInit, Output } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon';
import { ActivatedRoute } from '@angular/router';
import { Constants } from '@dasch-swiss/dsp-js';
+import { DialogService } from '@dasch-swiss/vre/shared/app-ui';
import { take } from 'rxjs/operators';
import { v4 as uuidv4 } from 'uuid';
import { ApiData } from '../../data-access/advanced-search-service/advanced-search.service';
import {
+ AdvancedSearchStateSnapshot,
AdvancedSearchStoreService,
- ParentChildPropertyPair,
OrderByItem,
+ ParentChildPropertyPair,
PropertyFormItem,
PropertyFormListOperations,
SearchItem,
- AdvancedSearchStateSnapshot,
} from '../../data-access/advanced-search-store/advanced-search-store.service';
-import { ConfirmationDialogComponent } from '../../ui/dialog/confirmation-dialog/confirmation-dialog.component';
import { FormActionsComponent } from '../../ui/form-actions/form-actions.component';
import { OntologyResourceFormComponent } from '../../ui/ontology-resource-form/ontology-resource-form.component';
import { OrderByComponent } from '../../ui/order-by/order-by.component';
@@ -82,7 +82,10 @@ export class AdvancedSearchComponent implements OnInit {
constants = Constants;
previousSearchObject: string | null = null;
- constructor(private _dialog: MatDialog) {}
+ constructor(
+ private _dialog: MatDialog,
+ private _dialogService: DialogService
+ ) {}
ngOnInit(): void {
this.store.setState({
@@ -191,12 +194,8 @@ export class AdvancedSearchComponent implements OnInit {
}
handleResetButtonClicked(): void {
- const dialogRef = this._dialog.open(ConfirmationDialogComponent, {});
-
- dialogRef.afterClosed().subscribe((result: boolean) => {
- if (result) {
- this.store.onReset();
- }
+ this._dialogService.afterConfirmation('Are you sure you want to reset the form?').subscribe(() => {
+ this.store.onReset();
});
}
diff --git a/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.html b/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.html
deleted file mode 100644
index 81077a6d8f..0000000000
--- a/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.html
+++ /dev/null
@@ -1,8 +0,0 @@
-
- Are you sure you want to reset the form?
-
-
-
-
-
-
diff --git a/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.scss b/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.scss
deleted file mode 100644
index 3c6bf85809..0000000000
--- a/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-mat-dialog-actions {
- display: flex;
- justify-content: space-between;
- padding: 10px;
-
- .cancel-button,
- .confirm-button {
- flex: 1;
- margin: 0;
- max-width: 100px;
- border: 1px solid #336790;
- }
-
- .cancel-button {
- background-color: #336790;
- color: white;
- }
-
- .confirm-button {
- color:#336790;
- }
-}
diff --git a/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.spec.ts b/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.spec.ts
deleted file mode 100644
index 3ae427e46a..0000000000
--- a/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.spec.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ConfirmationDialogComponent } from './confirmation-dialog.component';
-
-describe('ConfirmationDialogComponent', () => {
- let component: ConfirmationDialogComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- imports: [ConfirmationDialogComponent],
- }).compileComponents();
-
- fixture = TestBed.createComponent(ConfirmationDialogComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.ts b/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.ts
deleted file mode 100644
index be37e63512..0000000000
--- a/libs/vre/advanced-search/src/lib/ui/dialog/confirmation-dialog/confirmation-dialog.component.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { CommonModule } from '@angular/common';
-import { Component } from '@angular/core';
-import { MatButtonModule } from '@angular/material/button';
-import { MatDialogModule } from '@angular/material/dialog';
-
-@Component({
- selector: 'dasch-swiss-confirmation-dialog',
- standalone: true,
- imports: [CommonModule, MatButtonModule, MatDialogModule],
- templateUrl: './confirmation-dialog.component.html',
- styleUrls: ['./confirmation-dialog.component.scss'],
-})
-export class ConfirmationDialogComponent {}
diff --git a/libs/vre/shared/app-common/src/index.ts b/libs/vre/shared/app-common/src/index.ts
index df78f11d76..a42ced0d53 100644
--- a/libs/vre/shared/app-common/src/index.ts
+++ b/libs/vre/shared/app-common/src/index.ts
@@ -4,3 +4,5 @@ export * from './lib/dsp-resource';
export * from './lib/property-info-values.interface';
export * from './lib/common';
export * from './lib/directives/mat-autocomplete-options-scroll.directive';
+export * from './lib/form-validators/at-least-one-string-required.validator';
+export * from './lib/form-validators/array-length-greater-than-zero-validator';
diff --git a/apps/dsp-app/src/app/main/form-validators/array-length-greater-than-zero-validator.ts b/libs/vre/shared/app-common/src/lib/form-validators/array-length-greater-than-zero-validator.ts
similarity index 100%
rename from apps/dsp-app/src/app/main/form-validators/array-length-greater-than-zero-validator.ts
rename to libs/vre/shared/app-common/src/lib/form-validators/array-length-greater-than-zero-validator.ts
diff --git a/apps/dsp-app/src/app/main/form-validators/at-least-one-string-required.validator.ts b/libs/vre/shared/app-common/src/lib/form-validators/at-least-one-string-required.validator.ts
similarity index 100%
rename from apps/dsp-app/src/app/main/form-validators/at-least-one-string-required.validator.ts
rename to libs/vre/shared/app-common/src/lib/form-validators/at-least-one-string-required.validator.ts
diff --git a/libs/vre/shared/app-list/.eslintrc.json b/libs/vre/shared/app-list/.eslintrc.json
new file mode 100644
index 0000000000..6ebf70478b
--- /dev/null
+++ b/libs/vre/shared/app-list/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["../../../../.eslintrc-angular.json"]
+}
diff --git a/libs/vre/shared/app-list/README.md b/libs/vre/shared/app-list/README.md
new file mode 100644
index 0000000000..5a31156aed
--- /dev/null
+++ b/libs/vre/shared/app-list/README.md
@@ -0,0 +1,9 @@
+# vre-shared-app-list
+
+This library was generated with [Nx](https://nx.dev).
+
+
+## Running unit tests
+
+Run `nx test vre-shared-app-list` to execute the unit tests.
+
diff --git a/libs/vre/shared/app-list/jest.config.ts b/libs/vre/shared/app-list/jest.config.ts
new file mode 100644
index 0000000000..c7424f0c3d
--- /dev/null
+++ b/libs/vre/shared/app-list/jest.config.ts
@@ -0,0 +1,22 @@
+/* eslint-disable */
+export default {
+ displayName: 'vre-shared-app-list',
+ preset: '../../../../jest.preset.js',
+ setupFilesAfterEnv: ['/src/test-setup.ts'],
+ coverageDirectory: '../../../../coverage/libs/vre/shared/app-list',
+ transform: {
+ '^.+\\.(ts|mjs|js|html)$': [
+ 'jest-preset-angular',
+ {
+ tsconfig: '/tsconfig.spec.json',
+ stringifyContentPathRegex: '\\.(html|svg)$',
+ },
+ ],
+ },
+ transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
+ snapshotSerializers: [
+ 'jest-preset-angular/build/serializers/no-ng-attributes',
+ 'jest-preset-angular/build/serializers/ng-snapshot',
+ 'jest-preset-angular/build/serializers/html-comment',
+ ]
+};
diff --git a/libs/vre/shared/app-list/project.json b/libs/vre/shared/app-list/project.json
new file mode 100644
index 0000000000..7bca5e9bcc
--- /dev/null
+++ b/libs/vre/shared/app-list/project.json
@@ -0,0 +1,38 @@
+{
+ "name": "vre-shared-app-list",
+ "$schema": "../../../../node_modules/nx/schemas/project-schema.json",
+ "sourceRoot": "libs/vre/shared/app-list/src",
+ "prefix": "dasch-swiss",
+ "tags": [],
+ "projectType": "library",
+ "targets": {
+ "test": {
+ "executor": "@nx/jest:jest",
+ "outputs": [
+ "{workspaceRoot}/coverage/{projectRoot}"
+ ],
+ "options": {
+ "jestConfig": "libs/vre/shared/app-list/jest.config.ts",
+ "passWithNoTests": true
+ },
+ "configurations": {
+ "ci": {
+ "ci": true,
+ "codeCoverage": true
+ }
+ }
+ },
+ "lint": {
+ "executor": "@nx/linter:eslint",
+ "outputs": [
+ "{options.outputFile}"
+ ],
+ "options": {
+ "lintFilePatterns": [
+ "libs/vre/shared/app-list/**/*.ts",
+ "libs/vre/shared/app-list/**/*.html"
+ ]
+ }
+ }
+ }
+}
diff --git a/libs/vre/shared/app-list/src/index.ts b/libs/vre/shared/app-list/src/index.ts
new file mode 100644
index 0000000000..f2a5ce56a6
--- /dev/null
+++ b/libs/vre/shared/app-list/src/index.ts
@@ -0,0 +1,13 @@
+export * from './list.components';
+export * from './lib/list.component';
+export * from './lib/action-bubble/action-bubble.component';
+export * from './lib/list-item/list-item.component';
+export * from './lib/list-item/list-item.service';
+export * from './lib/list-item-element/list-item-element.component';
+export * from './lib/list-item-form/list-item-form.component';
+export * from './lib/list-item-form/reusable-list-item-form.component';
+export * from './lib/list-item-form/edit-list-item/create-list-item-dialog.component';
+export * from './lib/list-item-form/edit-list-item/edit-list-item-dialog.component';
+export * from './lib/reusable-list-info-form/create-list-info-page.component';
+export * from './lib/reusable-list-info-form/edit-list-info-dialog.component';
+export * from './lib/reusable-list-info-form/reusable-list-info-form.component';
diff --git a/apps/dsp-app/src/app/project/list/action-bubble/action-bubble.component.scss b/libs/vre/shared/app-list/src/lib/action-bubble/action-bubble.component.scss
similarity index 100%
rename from apps/dsp-app/src/app/project/list/action-bubble/action-bubble.component.scss
rename to libs/vre/shared/app-list/src/lib/action-bubble/action-bubble.component.scss
diff --git a/apps/dsp-app/src/app/project/list/action-bubble/action-bubble.component.ts b/libs/vre/shared/app-list/src/lib/action-bubble/action-bubble.component.ts
similarity index 96%
rename from apps/dsp-app/src/app/project/list/action-bubble/action-bubble.component.ts
rename to libs/vre/shared/app-list/src/lib/action-bubble/action-bubble.component.ts
index af8c7959da..ec0191b7e6 100644
--- a/apps/dsp-app/src/app/project/list/action-bubble/action-bubble.component.ts
+++ b/libs/vre/shared/app-list/src/lib/action-bubble/action-bubble.component.ts
@@ -5,9 +5,8 @@ import { ListNode } from '@dasch-swiss/dsp-js';
import { ListApiService } from '@dasch-swiss/vre/shared/app-api';
import { DspDialogConfig } from '@dasch-swiss/vre/shared/app-config';
import { MultiLanguages } from '@dasch-swiss/vre/shared/app-string-literal';
+import { DIALOG_LARGE, DialogService } from '@dasch-swiss/vre/shared/app-ui';
import { filter, switchMap } from 'rxjs/operators';
-import { DIALOG_LARGE } from '../../../main/services/dialog-sizes.constant';
-import { DialogService } from '../../../main/services/dialog.service';
import { ListItemService } from '../list-item/list-item.service';
import {
CreateListItemDialogComponent,
diff --git a/apps/dsp-app/src/app/project/list/list-item-element/list-item-element.component.ts b/libs/vre/shared/app-list/src/lib/list-item-element/list-item-element.component.ts
similarity index 100%
rename from apps/dsp-app/src/app/project/list/list-item-element/list-item-element.component.ts
rename to libs/vre/shared/app-list/src/lib/list-item-element/list-item-element.component.ts
diff --git a/apps/dsp-app/src/app/project/list/list-item-form/edit-list-item/create-list-item-dialog.component.ts b/libs/vre/shared/app-list/src/lib/list-item-form/edit-list-item/create-list-item-dialog.component.ts
similarity index 100%
rename from apps/dsp-app/src/app/project/list/list-item-form/edit-list-item/create-list-item-dialog.component.ts
rename to libs/vre/shared/app-list/src/lib/list-item-form/edit-list-item/create-list-item-dialog.component.ts
diff --git a/apps/dsp-app/src/app/project/list/list-item-form/edit-list-item/edit-list-item-dialog.component.ts b/libs/vre/shared/app-list/src/lib/list-item-form/edit-list-item/edit-list-item-dialog.component.ts
similarity index 100%
rename from apps/dsp-app/src/app/project/list/list-item-form/edit-list-item/edit-list-item-dialog.component.ts
rename to libs/vre/shared/app-list/src/lib/list-item-form/edit-list-item/edit-list-item-dialog.component.ts
diff --git a/apps/dsp-app/src/app/project/list/list-item-form/list-item-form.component.ts b/libs/vre/shared/app-list/src/lib/list-item-form/list-item-form.component.ts
similarity index 96%
rename from apps/dsp-app/src/app/project/list/list-item-form/list-item-form.component.ts
rename to libs/vre/shared/app-list/src/lib/list-item-form/list-item-form.component.ts
index abbd804d16..0b02218ced 100644
--- a/apps/dsp-app/src/app/project/list/list-item-form/list-item-form.component.ts
+++ b/libs/vre/shared/app-list/src/lib/list-item-form/list-item-form.component.ts
@@ -2,9 +2,9 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@
import { FormBuilder, Validators } from '@angular/forms';
import { ListInfoResponse, ListNodeInfoResponse } from '@dasch-swiss/dsp-js';
import { ListApiService } from '@dasch-swiss/vre/shared/app-api';
+import { atLeastOneStringRequired } from '@dasch-swiss/vre/shared/app-common';
import { ProjectService } from '@dasch-swiss/vre/shared/app-helper-services';
import { DEFAULT_MULTILANGUAGE_FORM } from '@dasch-swiss/vre/shared/app-string-literal';
-import { atLeastOneStringRequired } from '../../../main/form-validators/at-least-one-string-required.validator';
import { ListItemService } from '../list-item/list-item.service';
@Component({
diff --git a/apps/dsp-app/src/app/project/list/list-item-form/list-item-form.type.ts b/libs/vre/shared/app-list/src/lib/list-item-form/list-item-form.type.ts
similarity index 100%
rename from apps/dsp-app/src/app/project/list/list-item-form/list-item-form.type.ts
rename to libs/vre/shared/app-list/src/lib/list-item-form/list-item-form.type.ts
diff --git a/apps/dsp-app/src/app/project/list/list-item-form/reusable-list-item-form.component.ts b/libs/vre/shared/app-list/src/lib/list-item-form/reusable-list-item-form.component.ts
similarity index 93%
rename from apps/dsp-app/src/app/project/list/list-item-form/reusable-list-item-form.component.ts
rename to libs/vre/shared/app-list/src/lib/list-item-form/reusable-list-item-form.component.ts
index a4c5f77102..7476c5d388 100644
--- a/apps/dsp-app/src/app/project/list/list-item-form/reusable-list-item-form.component.ts
+++ b/libs/vre/shared/app-list/src/lib/list-item-form/reusable-list-item-form.component.ts
@@ -1,7 +1,7 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
+import { atLeastOneStringRequired } from '@dasch-swiss/vre/shared/app-common';
import { DEFAULT_MULTILANGUAGE_FORM, MultiLanguages } from '@dasch-swiss/vre/shared/app-string-literal';
-import { atLeastOneStringRequired } from '../../../main/form-validators/at-least-one-string-required.validator';
import { ListItemForm } from './list-item-form.type';
@Component({
diff --git a/apps/dsp-app/src/app/project/list/list-item/list-item.component.ts b/libs/vre/shared/app-list/src/lib/list-item/list-item.component.ts
similarity index 100%
rename from apps/dsp-app/src/app/project/list/list-item/list-item.component.ts
rename to libs/vre/shared/app-list/src/lib/list-item/list-item.component.ts
diff --git a/apps/dsp-app/src/app/project/list/list-item/list-item.service.ts b/libs/vre/shared/app-list/src/lib/list-item/list-item.service.ts
similarity index 100%
rename from apps/dsp-app/src/app/project/list/list-item/list-item.service.ts
rename to libs/vre/shared/app-list/src/lib/list-item/list-item.service.ts
diff --git a/apps/dsp-app/src/app/project/list/list.component.html b/libs/vre/shared/app-list/src/lib/list.component.html
similarity index 89%
rename from apps/dsp-app/src/app/project/list/list.component.html
rename to libs/vre/shared/app-list/src/lib/list.component.html
index 8e7c72596d..e36a045a67 100644
--- a/apps/dsp-app/src/app/project/list/list.component.html
+++ b/libs/vre/shared/app-list/src/lib/list.component.html
@@ -26,7 +26,9 @@
-
+
Controlled vocabulary configuration