From 38adbc5ac418c07c2af544b3e1aed4ad1860e961 Mon Sep 17 00:00:00 2001 From: Abhinegi2 Date: Thu, 19 Dec 2024 16:08:34 +0530 Subject: [PATCH 1/9] initial setup of public form listing --- .../admin-entity-public-forms-component.html | 3 ++ .../admin-entity-public-forms-component.scss | 0 ...dmin-entity-public-forms-component.spec.ts | 0 .../admin-entity-public-forms-component.ts | 37 +++++++++++++++++++ .../admin-entity/admin-entity.component.html | 14 ++++++- .../admin-entity/admin-entity.component.ts | 4 +- 6 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html create mode 100644 src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.scss create mode 100644 src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts create mode 100644 src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html new file mode 100644 index 0000000000..c4d859f102 --- /dev/null +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.scss b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts new file mode 100644 index 0000000000..540f7e87c6 --- /dev/null +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts @@ -0,0 +1,37 @@ +import { Component, Input, OnInit } from "@angular/core"; +import { EntityConstructor } from "app/core/entity/model/entity"; +import { DynamicComponentDirective } from "app/core/config/dynamic-components/dynamic-component.directive"; + +@Component({ + selector: "app-admin-entity-public-forms-component", + standalone: true, + templateUrl: "./admin-entity-public-forms-component.html", + styleUrls: [ + "./admin-entity-public-forms-component.scss", + ], + imports: [ + DynamicComponentDirective, + ], +}) +export class AdminEntityPublicFormsComponent implements OnInit { + @Input() entityConstructor: EntityConstructor; +config: any; + + ngOnInit(): void { + console.log(this.entityConstructor.ENTITY_TYPE,"chjebciueb") + this.config = { + component: "RelatedEntities", + config: { + entityType: "PublicFormConfig", + property: this.entityConstructor.ENTITY_TYPE, + columns: [ + "title", + "description", + "entity", + "route" + ] + } + } + } + +} diff --git a/src/app/core/admin/admin-entity/admin-entity.component.html b/src/app/core/admin/admin-entity/admin-entity.component.html index 6bcf628e7b..86ad8ac113 100644 --- a/src/app/core/admin/admin-entity/admin-entity.component.html +++ b/src/app/core/admin/admin-entity/admin-entity.component.html @@ -39,7 +39,13 @@ > General Settings - + + Public Forms + @@ -74,6 +80,12 @@ [(generalSettings)]="configEntitySettings" > } + @case ("publicForm") { + + } } diff --git a/src/app/core/admin/admin-entity/admin-entity.component.ts b/src/app/core/admin/admin-entity/admin-entity.component.ts index a1f76cf795..f0c9cfb0c5 100644 --- a/src/app/core/admin/admin-entity/admin-entity.component.ts +++ b/src/app/core/admin/admin-entity/admin-entity.component.ts @@ -33,6 +33,7 @@ import { AdminEntityDetailsComponent } from "../admin-entity-details/admin-entit import { AdminEntityGeneralSettingsComponent } from "./admin-entity-general-settings/admin-entity-general-settings.component"; import { BetaFeatureComponent } from "../../../features/coming-soon/beta-feature/beta-feature.component"; import { DynamicComponentConfig } from "../../config/dynamic-components/dynamic-component-config.interface"; +import { AdminEntityPublicFormsComponent } from "../admin-entity-public-forms/admin-entity-public-forms-component"; @Component({ selector: "app-admin-entity", @@ -54,6 +55,7 @@ import { DynamicComponentConfig } from "../../config/dynamic-components/dynamic- AdminEntityDetailsComponent, AdminEntityGeneralSettingsComponent, BetaFeatureComponent, + AdminEntityPublicFormsComponent, ], templateUrl: "./admin-entity.component.html", styleUrl: "./admin-entity.component.scss", @@ -66,7 +68,7 @@ export class AdminEntityComponent implements OnInit { configDetailsView: DynamicComponentConfig; configListView: DynamicComponentConfig; configEntitySettings: EntityConfig; - protected mode: "details" | "list" | "general" = "details"; + protected mode: "details" | "list" | "general" | "publicForm" = "details"; @ContentChild(TemplateRef) templateRef: TemplateRef; From 5e5dfe897ac6fa2152d2a30a938fc73a285dc305 Mon Sep 17 00:00:00 2001 From: Abhinegi2 Date: Wed, 25 Dec 2024 12:47:39 +0530 Subject: [PATCH 2/9] lint fixes --- .../admin-entity-public-forms-component.html | 4 +-- .../admin-entity-public-forms-component.ts | 26 ++++++------------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html index c4d859f102..7b6a379ab4 100644 --- a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html @@ -1,3 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts index 540f7e87c6..920e0f44d6 100644 --- a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts @@ -6,32 +6,22 @@ import { DynamicComponentDirective } from "app/core/config/dynamic-components/dy selector: "app-admin-entity-public-forms-component", standalone: true, templateUrl: "./admin-entity-public-forms-component.html", - styleUrls: [ - "./admin-entity-public-forms-component.scss", - ], - imports: [ - DynamicComponentDirective, - ], + styleUrls: ["./admin-entity-public-forms-component.scss"], + imports: [DynamicComponentDirective], }) export class AdminEntityPublicFormsComponent implements OnInit { @Input() entityConstructor: EntityConstructor; -config: any; + config: any; ngOnInit(): void { - console.log(this.entityConstructor.ENTITY_TYPE,"chjebciueb") - this.config = { + console.log(this.entityConstructor.ENTITY_TYPE, "chjebciueb"); + this.config = { component: "RelatedEntities", config: { entityType: "PublicFormConfig", property: this.entityConstructor.ENTITY_TYPE, - columns: [ - "title", - "description", - "entity", - "route" - ] - } - } + columns: ["title", "description", "entity", "route"], + }, + }; } - } From c797063be5d6a0ba8426824a49146cc04f99db17 Mon Sep 17 00:00:00 2001 From: Abhinegi2 Date: Wed, 25 Dec 2024 18:39:40 +0530 Subject: [PATCH 3/9] updated test --- ...dmin-entity-public-forms-component.spec.ts | 32 +++++++++++++++++++ .../admin-entity-public-forms-component.ts | 3 ++ 2 files changed, 35 insertions(+) diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts index e69de29bb2..9b59aa9335 100644 --- a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts @@ -0,0 +1,32 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { AdminEntityPublicFormsComponent } from "./admin-entity-public-forms-component"; +import { Entity, EntityConstructor } from "app/core/entity/model/entity"; +import { componentRegistry, ComponentRegistry } from "app/dynamic-components"; + +describe("AdminEntityPublicFormsComponent", () => { + let component: AdminEntityPublicFormsComponent; + let fixture: ComponentFixture; + const mockEntityConstructor: EntityConstructor = class MockEntity extends Entity { + constructor(public id?: string) { + super(id); + } + }; + mockEntityConstructor.ENTITY_TYPE = "Child"; + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [], + imports: [AdminEntityPublicFormsComponent], + providers: [{ provide: ComponentRegistry, useValue: componentRegistry }], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminEntityPublicFormsComponent); + component = fixture.componentInstance; + component.entityConstructor = mockEntityConstructor; + }); + + it("should create the component", () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts index 920e0f44d6..30f2b8c80b 100644 --- a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts @@ -21,6 +21,9 @@ export class AdminEntityPublicFormsComponent implements OnInit { entityType: "PublicFormConfig", property: this.entityConstructor.ENTITY_TYPE, columns: ["title", "description", "entity", "route"], + filter: { + entity: this.entityConstructor.ENTITY_TYPE, + }, }, }; } From a1f86699cffa75744a16d1f17d0e00ea59d0e3b9 Mon Sep 17 00:00:00 2001 From: Abhinegi2 Date: Wed, 25 Dec 2024 18:45:01 +0530 Subject: [PATCH 4/9] lint fixes --- .../admin-entity-public-forms-component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html index 7b6a379ab4..54cf6a2160 100644 --- a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html @@ -1 +1 @@ - \ No newline at end of file + From 2a89a397f4aaad1448db2d23f49cf9aa0a6421ef Mon Sep 17 00:00:00 2001 From: Abhinegi2 Date: Wed, 25 Dec 2024 18:49:45 +0530 Subject: [PATCH 5/9] minor changes --- src/app/core/admin/admin-entity/admin-entity.component.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/core/admin/admin-entity/admin-entity.component.html b/src/app/core/admin/admin-entity/admin-entity.component.html index 86ad8ac113..3b912f7c35 100644 --- a/src/app/core/admin/admin-entity/admin-entity.component.html +++ b/src/app/core/admin/admin-entity/admin-entity.component.html @@ -82,8 +82,7 @@ } @case ("publicForm") { } } From 234c23deab8de56acbcdd242c8008d9b1bc5b4af Mon Sep 17 00:00:00 2001 From: Abhinegi2 Date: Thu, 26 Dec 2024 12:50:32 +0530 Subject: [PATCH 6/9] updated interface --- .../admin-entity-public-forms-component.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts index 30f2b8c80b..3c683b79e9 100644 --- a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts @@ -11,16 +11,15 @@ import { DynamicComponentDirective } from "app/core/config/dynamic-components/dy }) export class AdminEntityPublicFormsComponent implements OnInit { @Input() entityConstructor: EntityConstructor; - config: any; + config: Config; ngOnInit(): void { - console.log(this.entityConstructor.ENTITY_TYPE, "chjebciueb"); this.config = { component: "RelatedEntities", config: { entityType: "PublicFormConfig", property: this.entityConstructor.ENTITY_TYPE, - columns: ["title", "description", "entity", "route"], + columns: ["title", "entity", "route", "description"], filter: { entity: this.entityConstructor.ENTITY_TYPE, }, @@ -28,3 +27,14 @@ export class AdminEntityPublicFormsComponent implements OnInit { }; } } +interface Config { + component: string; + config: { + entityType: string; + property: string; + columns: string[]; + filter: { + entity: string; + }; + }; +} From 0163f86717ade22f1cadfa93088761d8a0d67a02 Mon Sep 17 00:00:00 2001 From: Sebastian Leidig Date: Fri, 3 Jan 2025 14:16:07 +0100 Subject: [PATCH 7/9] remove unused imports --- .../admin-entity-details.component.ts | 2 -- .../admin-entity-list/admin-entity-list.component.ts | 11 ++--------- .../admin-entity-general-settings.component.ts | 5 +---- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/app/core/admin/admin-entity-details/admin-entity-details/admin-entity-details.component.ts b/src/app/core/admin/admin-entity-details/admin-entity-details/admin-entity-details.component.ts index 85f1a9828b..c0e5a2a69f 100644 --- a/src/app/core/admin/admin-entity-details/admin-entity-details/admin-entity-details.component.ts +++ b/src/app/core/admin/admin-entity-details/admin-entity-details/admin-entity-details.component.ts @@ -9,7 +9,6 @@ import { NgForOf, NgIf } from "@angular/common"; import { MatTabsModule } from "@angular/material/tabs"; import { FaIconComponent } from "@fortawesome/angular-fontawesome"; import { MatButtonModule } from "@angular/material/button"; -import { EntityTypeLabelPipe } from "../../../common-components/entity-type-label/entity-type-label.pipe"; import { ViewTitleComponent } from "../../../common-components/view-title/view-title.component"; import { AdminSectionHeaderComponent } from "../../building-blocks/admin-section-header/admin-section-header.component"; import { AdminEntityFormComponent } from "../admin-entity-form/admin-entity-form.component"; @@ -31,7 +30,6 @@ import { AdminTabTemplateDirective } from "../../building-blocks/admin-tabs/admi MatTabsModule, FaIconComponent, MatButtonModule, - EntityTypeLabelPipe, ViewTitleComponent, AdminSectionHeaderComponent, AdminEntityFormComponent, diff --git a/src/app/core/admin/admin-entity-list/admin-entity-list.component.ts b/src/app/core/admin/admin-entity-list/admin-entity-list.component.ts index 1056392ab7..43153159e9 100644 --- a/src/app/core/admin/admin-entity-list/admin-entity-list.component.ts +++ b/src/app/core/admin/admin-entity-list/admin-entity-list.component.ts @@ -7,9 +7,6 @@ import { ViewChild, } from "@angular/core"; import { CommonModule } from "@angular/common"; -import { FilterComponent } from "../../filter/filter/filter.component"; -import { MatTab, MatTabGroup } from "@angular/material/tabs"; -import { EntitiesTableComponent } from "../../common-components/entities-table/entities-table.component"; import { EntityConstructor } from "../../entity/model/entity"; import { EntityListConfig, @@ -29,7 +26,6 @@ import { moveItemInArray, } from "@angular/cdk/drag-drop"; import { FaIconComponent } from "@fortawesome/angular-fontawesome"; -import { MatIconButton } from "@angular/material/button"; import { MatFormField, MatLabel } from "@angular/material/form-field"; import { MatSelect } from "@angular/material/select"; import { AdminTabsComponent } from "../building-blocks/admin-tabs/admin-tabs.component"; @@ -41,16 +37,11 @@ import { ViewTitleComponent } from "../../common-components/view-title/view-titl standalone: true, imports: [ CommonModule, - FilterComponent, - MatTabGroup, - EntitiesTableComponent, - MatTab, EntityFieldsMenuComponent, MatTableModule, EntityFieldLabelComponent, CdkDrag, FaIconComponent, - MatIconButton, CdkDropList, MatFormField, MatLabel, @@ -92,11 +83,13 @@ export class AdminEntityListComponent implements OnChanges, AfterViewInit { this.initAvailableFields(); } } + ngAfterViewInit() { const placeholderElement = this.placeholder.element.nativeElement; placeholderElement.style.display = "none"; placeholderElement.parentNode.removeChild(placeholderElement); } + /** * Config allows to not have columnGroups and by default then display all `columns`, * create an initial columnGroup in this case to allow full editing. diff --git a/src/app/core/admin/admin-entity/admin-entity-general-settings/admin-entity-general-settings.component.ts b/src/app/core/admin/admin-entity/admin-entity-general-settings/admin-entity-general-settings.component.ts index 5d8a2728ba..750966b981 100644 --- a/src/app/core/admin/admin-entity/admin-entity-general-settings/admin-entity-general-settings.component.ts +++ b/src/app/core/admin/admin-entity/admin-entity-general-settings/admin-entity-general-settings.component.ts @@ -25,8 +25,6 @@ import { EntitySchemaField } from "app/core/entity/schema/entity-schema-field"; import { AdminEntityService } from "../../admin-entity.service"; import { StringDatatype } from "../../../basic-datatypes/string/string.datatype"; import { HelpButtonComponent } from "../../../common-components/help-button/help-button.component"; -import { MatSort } from "@angular/material/sort"; -import { EntityFieldLabelComponent } from "../../../common-components/entity-field-label/entity-field-label.component"; import { AnonymizeOptionsComponent } from "../../admin-entity-details/admin-entity-field/anonymize-options/anonymize-options.component"; import { FaIconComponent } from "@fortawesome/angular-fontawesome"; @@ -54,8 +52,6 @@ import { FaIconComponent } from "@fortawesome/angular-fontawesome"; CommonModule, MatTooltipModule, HelpButtonComponent, - MatSort, - EntityFieldLabelComponent, AnonymizeOptionsComponent, FaIconComponent, ], @@ -162,6 +158,7 @@ export class AdminEntityGeneralSettingsComponent implements OnInit { ...unselectedOptions, ]; } + objectToLabel = (v: SimpleDropdownValue) => v?.label; objectToValue = (v: SimpleDropdownValue) => v?.key; } From 1cade15bde47df47d10b25a7346bd42bf31f6fd7 Mon Sep 17 00:00:00 2001 From: Sebastian Leidig Date: Fri, 3 Jan 2025 15:15:35 +0100 Subject: [PATCH 8/9] refactor(core): add option to entities-table to open full details view as popup --- .../entities-table.component.ts | 21 +++++++++++++++- .../related-entities.component.ts | 3 ++- .../dialog-view/dialog-view.component.spec.ts | 25 ++++++++----------- .../ui/dialog-view/dialog-view.component.ts | 18 ++++++------- 4 files changed, 41 insertions(+), 26 deletions(-) diff --git a/src/app/core/common-components/entities-table/entities-table.component.ts b/src/app/core/common-components/entities-table/entities-table.component.ts index 432fc692be..86130381e2 100644 --- a/src/app/core/common-components/entities-table/entities-table.component.ts +++ b/src/app/core/common-components/entities-table/entities-table.component.ts @@ -80,6 +80,7 @@ export class EntitiesTableComponent { this.updateFilteredData(); this.isLoading = false; } + private lastSelectedIndex: number = null; private lastSelection: boolean = null; _records: T[] = []; @@ -122,6 +123,7 @@ export class EntitiesTableComponent { .map((col) => col.id) .join(""); } + _customColumns: FormFieldConfig[]; _columns: FormFieldConfig[] = []; @@ -151,12 +153,14 @@ export class EntitiesTableComponent { this.sortIsInferred = true; } } + _columnsToDisplay: string[]; @Input() set entityType(value: EntityConstructor) { this._entityType = value; this.customColumns = this._customColumns; } + _entityType: EntityConstructor; /** how to sort data by default during initialization */ @@ -185,6 +189,7 @@ export class EntitiesTableComponent { this._filter = value ?? {}; this.updateFilteredData(); } + _filter: DataFilter = {}; /** output the currently displayed records, whenever filters for the user change */ @Output() filteredRecordsChange = new EventEmitter(true); @@ -206,7 +211,15 @@ export class EntitiesTableComponent { @Input() getBackgroundColor?: (rec: T) => string = (rec: T) => rec.getColor(); idForSavingPagination: string; - @Input() clickMode: "popup" | "navigate" | "none" = "popup"; + /** + * The action the system triggers when a user clicks on an entry (row): + * - popup: open dialog with simplified form with the given fields only + * - navigate: route the app to the details view of the entity + * - popup-details: open dialog with the full EntityDetails view + * - none: do not trigger any automatic action + */ + @Input() clickMode: "popup" | "navigate" | "popup-details" | "none" = "popup"; + /** * Emits the entity being clicked in the table - or the newly created entity from the "create" button. */ @@ -220,6 +233,7 @@ export class EntitiesTableComponent { this._selectable = v; this.columnsToDisplay = this._columnsToDisplay; } + _selectable: boolean = false; readonly ACTIONCOLUMN_SELECT = "__select"; @@ -251,6 +265,7 @@ export class EntitiesTableComponent { this._editable = v; this.columnsToDisplay = this._columnsToDisplay; } + _editable: boolean = true; readonly ACTIONCOLUMN_EDIT = "__edit"; /** @@ -354,6 +369,9 @@ export class EntitiesTableComponent { case "popup": this.formDialog.openFormPopup(entity, this._customColumns); break; + case "popup-details": + this.formDialog.openView(entity, "EntityDetails"); + break; case "navigate": this.router.navigate([ entity.getConstructor().route, @@ -431,6 +449,7 @@ export class EntitiesTableComponent { this.updateFilteredData(); this.showInactiveChange.emit(value); } + _showInactive: boolean = false; @Output() showInactiveChange = new EventEmitter(); diff --git a/src/app/core/entity-details/related-entities/related-entities.component.ts b/src/app/core/entity-details/related-entities/related-entities.component.ts index 726d0dc7bd..9fc3e9e79a 100644 --- a/src/app/core/entity-details/related-entities/related-entities.component.ts +++ b/src/app/core/entity-details/related-entities/related-entities.component.ts @@ -73,6 +73,7 @@ export class RelatedEntitiesComponent implements OnInit { this._columns = value.map((c) => toFormFieldConfig(c)); this.updateColumnsToDisplayForScreenSize(); } + protected _columns: FormFieldConfig[]; columnsToDisplay: string[]; @@ -87,7 +88,7 @@ export class RelatedEntitiesComponent implements OnInit { */ @Input() showInactive: boolean; - @Input() clickMode: "popup" | "navigate" = "popup"; + @Input() clickMode: "popup" | "navigate" | "popup-details" = "popup"; @Input() editable: boolean = true; data: E[]; diff --git a/src/app/core/ui/dialog-view/dialog-view.component.spec.ts b/src/app/core/ui/dialog-view/dialog-view.component.spec.ts index c7ac425842..200f04a53e 100644 --- a/src/app/core/ui/dialog-view/dialog-view.component.spec.ts +++ b/src/app/core/ui/dialog-view/dialog-view.component.spec.ts @@ -3,9 +3,9 @@ import { DialogViewComponent } from "./dialog-view.component"; import { MAT_DIALOG_DATA } from "@angular/material/dialog"; import { ComponentRegistry } from "../../../dynamic-components"; import { Component } from "@angular/core"; -import { EntityConfigService } from "../../entity/entity-config.service"; import { FontAwesomeTestingModule } from "@fortawesome/angular-fontawesome/testing"; -import { Entity } from "../../entity/model/entity"; +import { Router } from "@angular/router"; +import { TestEntity } from "../../../utils/test-utils/TestEntity"; @Component({ template: ``, @@ -17,11 +17,11 @@ describe("DialogViewComponent", () => { let fixture: ComponentFixture; let mockDialogData; - let mockEntityConfigService: jasmine.SpyObj; + let mockRouter: Partial; beforeEach(() => { mockDialogData = {}; - mockEntityConfigService = jasmine.createSpyObj(["getDetailsViewConfig"]); + mockRouter = { config: [] }; TestBed.configureTestingModule({ imports: [DialogViewComponent, FontAwesomeTestingModule], @@ -34,7 +34,7 @@ describe("DialogViewComponent", () => { provide: ComponentRegistry, useValue: { get: () => async () => MockComponent }, }, - { provide: EntityConfigService, useValue: mockEntityConfigService }, + { provide: Router, useValue: mockRouter }, ], }); }); @@ -63,14 +63,14 @@ describe("DialogViewComponent", () => { })); it("should add view config for given entity type as config", fakeAsync(() => { - const testEntity = new Entity(); + const testEntity = new TestEntity(); mockDialogData.config = { dialogDetail: "1" }; mockDialogData.entity = testEntity; - mockEntityConfigService.getDetailsViewConfig.and.returnValue({ - config: { - viewConfig: "2", - }, - } as any); + + const testRouteConfig = { config: { viewConfig: "2" } }; + mockRouter.config.push({ path: "test-entity/:id", data: testRouteConfig }); + mockRouter.config.push({ path: "other", data: {} }); + createComponent(); expect(component.config).toEqual({ @@ -78,8 +78,5 @@ describe("DialogViewComponent", () => { viewConfig: "2", entity: testEntity, }); - expect(mockEntityConfigService.getDetailsViewConfig).toHaveBeenCalledWith( - Entity, - ); })); }); diff --git a/src/app/core/ui/dialog-view/dialog-view.component.ts b/src/app/core/ui/dialog-view/dialog-view.component.ts index c020b9357f..7f898b9a0b 100644 --- a/src/app/core/ui/dialog-view/dialog-view.component.ts +++ b/src/app/core/ui/dialog-view/dialog-view.component.ts @@ -1,6 +1,5 @@ import { Component, Inject, Injector } from "@angular/core"; import { CommonModule } from "@angular/common"; -import { DynamicComponentDirective } from "../../config/dynamic-components/dynamic-component.directive"; import { MAT_DIALOG_DATA, MatDialogActions, @@ -10,11 +9,11 @@ import { } from "@angular/material/dialog"; import { EntityConfigService } from "../../entity/entity-config.service"; import { Entity } from "../../entity/model/entity"; -import { ViewTitleComponent } from "../../common-components/view-title/view-title.component"; import { DialogCloseComponent } from "../../common-components/dialog-close/dialog-close.component"; -import { CdkPortalOutlet } from "@angular/cdk/portal"; import { DynamicComponentPipe } from "../../config/dynamic-components/dynamic-component.pipe"; import { AbstractViewComponent } from "../abstract-view/abstract-view.component"; +import { Router } from "@angular/router"; +import { PREFIX_VIEW_CONFIG } from "../../config/dynamic-routing/view-config.interface"; /** * Wrapper component for a modal/dialog view @@ -28,11 +27,8 @@ import { AbstractViewComponent } from "../abstract-view/abstract-view.component" standalone: true, imports: [ CommonModule, - DynamicComponentDirective, - ViewTitleComponent, DialogCloseComponent, MatDialogClose, - CdkPortalOutlet, DynamicComponentPipe, MatDialogTitle, MatDialogContent, @@ -48,8 +44,8 @@ export class DialogViewComponent extends AbstractViewComponent { constructor( @Inject(MAT_DIALOG_DATA) dialogData: DialogViewData, - private entityConfigService: EntityConfigService, injector: Injector, + router: Router, ) { super(injector, true); @@ -57,10 +53,12 @@ export class DialogViewComponent extends AbstractViewComponent { let viewConfig = {}; if (dialogData.entity) { + const detailsRoute = EntityConfigService.getDetailsViewId( + dialogData.entity.getConstructor(), + ).substring(PREFIX_VIEW_CONFIG.length); viewConfig = - this.entityConfigService.getDetailsViewConfig( - dialogData.entity.getConstructor(), - )?.config ?? {}; + router.config.find((route) => route.path === detailsRoute)?.data + ?.config ?? {}; } if (dialogData.entity) { From a5d65584891cfa6aa09dbef0609cc12cad3b3f32 Mon Sep 17 00:00:00 2001 From: Sebastian Leidig Date: Fri, 3 Jan 2025 15:17:44 +0100 Subject: [PATCH 9/9] improve embedded admin-public-forms --- .../admin-entity-public-forms-component.html | 21 ++++++++- ...dmin-entity-public-forms-component.spec.ts | 22 ++++----- .../admin-entity-public-forms-component.ts | 47 +++++++------------ .../demo-public-form-generator.service.ts | 3 +- 4 files changed, 48 insertions(+), 45 deletions(-) diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html index 54cf6a2160..c19d8dab8f 100644 --- a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.html @@ -1 +1,20 @@ - +
+ You can share the link to a "Public Form" with people who do not have an + account or embed it in your website. People can submit new records through + this form without logging in. For example, you can let participants + self-register this way and then review their data later. +
+ + + Public Forms + + +
+ +
diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts index 9b59aa9335..cae1649bc6 100644 --- a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.spec.ts @@ -1,29 +1,23 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { AdminEntityPublicFormsComponent } from "./admin-entity-public-forms-component"; -import { Entity, EntityConstructor } from "app/core/entity/model/entity"; -import { componentRegistry, ComponentRegistry } from "app/dynamic-components"; +import { MockedTestingModule } from "../../../utils/mocked-testing.module"; +import { TestEntity } from "../../../utils/test-utils/TestEntity"; describe("AdminEntityPublicFormsComponent", () => { let component: AdminEntityPublicFormsComponent; let fixture: ComponentFixture; - const mockEntityConstructor: EntityConstructor = class MockEntity extends Entity { - constructor(public id?: string) { - super(id); - } - }; - mockEntityConstructor.ENTITY_TYPE = "Child"; + beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [], - imports: [AdminEntityPublicFormsComponent], - providers: [{ provide: ComponentRegistry, useValue: componentRegistry }], + imports: [ + AdminEntityPublicFormsComponent, + MockedTestingModule.withState(), + ], }).compileComponents(); - }); - beforeEach(() => { fixture = TestBed.createComponent(AdminEntityPublicFormsComponent); component = fixture.componentInstance; - component.entityConstructor = mockEntityConstructor; + component.entityConstructor = TestEntity; }); it("should create the component", () => { diff --git a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts index 3c683b79e9..cd12917733 100644 --- a/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts +++ b/src/app/core/admin/admin-entity-public-forms/admin-entity-public-forms-component.ts @@ -1,40 +1,29 @@ -import { Component, Input, OnInit } from "@angular/core"; +import { Component, Input } from "@angular/core"; import { EntityConstructor } from "app/core/entity/model/entity"; -import { DynamicComponentDirective } from "app/core/config/dynamic-components/dynamic-component.directive"; +import { ViewTitleComponent } from "../../common-components/view-title/view-title.component"; +import { RelatedEntitiesComponent } from "../../entity-details/related-entities/related-entities.component"; @Component({ selector: "app-admin-entity-public-forms-component", standalone: true, templateUrl: "./admin-entity-public-forms-component.html", - styleUrls: ["./admin-entity-public-forms-component.scss"], - imports: [DynamicComponentDirective], + styleUrls: [ + "./admin-entity-public-forms-component.scss", + "../admin-entity/admin-entity-styles.scss", + ], + imports: [ViewTitleComponent, RelatedEntitiesComponent], }) -export class AdminEntityPublicFormsComponent implements OnInit { +export class AdminEntityPublicFormsComponent { + /** + * The entity type for which to display public forms for. + */ @Input() entityConstructor: EntityConstructor; - config: Config; - ngOnInit(): void { - this.config = { - component: "RelatedEntities", - config: { - entityType: "PublicFormConfig", - property: this.entityConstructor.ENTITY_TYPE, - columns: ["title", "entity", "route", "description"], - filter: { - entity: this.entityConstructor.ENTITY_TYPE, - }, - }, - }; - } -} -interface Config { - component: string; - config: { - entityType: string; - property: string; - columns: string[]; - filter: { - entity: string; - }; + /** + * Fake entity instance to correctly filter/link related PublicFormConfigs + * using the standard related-entities component. + */ + protected dummyEntity: any = { + getId: () => this.entityConstructor.ENTITY_TYPE, }; } diff --git a/src/app/features/public-form/demo-public-form-generator.service.ts b/src/app/features/public-form/demo-public-form-generator.service.ts index 88e23c7e35..0406652bae 100644 --- a/src/app/features/public-form/demo-public-form-generator.service.ts +++ b/src/app/features/public-form/demo-public-form-generator.service.ts @@ -15,10 +15,11 @@ export class DemoPublicFormGeneratorService extends DemoDataGenerator