diff --git a/e2e/integration/LinkingChildToSchool.cy.ts b/e2e/integration/LinkingChildToSchool.cy.ts index 87e7b1c93a..e34cb8b00f 100644 --- a/e2e/integration/LinkingChildToSchool.cy.ts +++ b/e2e/integration/LinkingChildToSchool.cy.ts @@ -24,9 +24,9 @@ describe("Scenario: Linking a child to a school - E2E test", function () { .click(); // choose the school to add - cy.get('[ng-reflect-placeholder="Select School"]') - .type("E2E School", { force: true }) - .click(); + cy.contains("mat-form-field", "School") + .find("[matInput]") + .type("E2E School{enter}"); // save school in child profile cy.contains("button", "Save").click({ force: true }); diff --git a/src/app/child-dev-project/attendance/add-day-attendance/roll-call/roll-call.component.spec.ts b/src/app/child-dev-project/attendance/add-day-attendance/roll-call/roll-call.component.spec.ts index c099ff8f3e..89ea35ac7d 100644 --- a/src/app/child-dev-project/attendance/add-day-attendance/roll-call/roll-call.component.spec.ts +++ b/src/app/child-dev-project/attendance/add-day-attendance/roll-call/roll-call.component.spec.ts @@ -9,7 +9,6 @@ import { import { RollCallComponent } from "./roll-call.component"; import { Note } from "../../../notes/model/note"; import { By } from "@angular/platform-browser"; -import { ConfigService } from "../../../../core/config/config.service"; import { Child } from "../../../children/model/child"; import { LoggingService } from "../../../../core/logging/logging.service"; import { MockedTestingModule } from "../../../../utils/mocked-testing.module"; @@ -18,6 +17,7 @@ import { LoginState } from "../../../../core/session/session-states/login-state. import { SimpleChange } from "@angular/core"; import { AttendanceLogicalStatus } from "../../model/attendance-status"; import { ChildrenService } from "../../../children/children.service"; +import { ConfigurableEnumService } from "../../../../core/configurable-enum/configurable-enum.service"; const PRESENT = { id: "PRESENT", @@ -82,8 +82,8 @@ describe("RollCallComponent", () => { it("should display all available attendance status to select", async () => { const options = [PRESENT, ABSENT]; - const configService = TestBed.inject(ConfigService); - spyOn(configService, "getConfigurableEnumValues").and.returnValue(options); + const enumService = TestBed.inject(ConfigurableEnumService); + spyOn(enumService, "getEnumValues").and.returnValue(options); component.eventEntity.addChild(participant1); await component.ngOnChanges(dummyChanges); fixture.detectChanges(); diff --git a/src/app/child-dev-project/attendance/add-day-attendance/roll-call/roll-call.component.ts b/src/app/child-dev-project/attendance/add-day-attendance/roll-call/roll-call.component.ts index a5e364a548..a9534843d5 100644 --- a/src/app/child-dev-project/attendance/add-day-attendance/roll-call/roll-call.component.ts +++ b/src/app/child-dev-project/attendance/add-day-attendance/roll-call/roll-call.component.ts @@ -13,7 +13,6 @@ import { } from "../../model/attendance-status"; import { Note } from "../../../notes/model/note"; import { EventAttendance } from "../../model/event-attendance"; -import { ConfigService } from "../../../../core/config/config.service"; import { EntityMapperService } from "../../../../core/entity/entity-mapper.service"; import { Child } from "../../../children/model/child"; import { LoggingService } from "../../../../core/logging/logging.service"; @@ -32,6 +31,7 @@ import { HammerModule, } from "@angular/platform-browser"; import Hammer from "hammerjs"; +import { ConfigurableEnumService } from "../../../../core/configurable-enum/configurable-enum.service"; // Only allow horizontal swiping class HorizontalHammerConfig extends HammerGestureConfig { @@ -114,7 +114,7 @@ export class RollCallComponent implements OnChanges { children: Child[] = []; constructor( - private configService: ConfigService, + private enumService: ConfigurableEnumService, private entityMapper: EntityMapperService, private formDialog: FormDialogService, private loggingService: LoggingService @@ -156,10 +156,9 @@ export class RollCallComponent implements OnChanges { } private loadAttendanceStatusTypes() { - this.availableStatus = - this.configService.getConfigurableEnumValues<AttendanceStatusType>( - ATTENDANCE_STATUS_CONFIG_ID - ); + this.availableStatus = this.enumService.getEnumValues<AttendanceStatusType>( + ATTENDANCE_STATUS_CONFIG_ID + ); } private async loadParticipants() { diff --git a/src/app/child-dev-project/attendance/attendance.service.ts b/src/app/child-dev-project/attendance/attendance.service.ts index e8b2fcf17e..a3bf6e8234 100644 --- a/src/app/child-dev-project/attendance/attendance.service.ts +++ b/src/app/child-dev-project/attendance/attendance.service.ts @@ -160,6 +160,7 @@ export class AttendanceService { sinceDate?: Date ): Promise<ActivityAttendance[]> { const periods = new Map<number, ActivityAttendance>(); + function getOrCreateAttendancePeriod(event) { const month = new Date(event.date.getFullYear(), event.date.getMonth()); let attMonth = periods.get(month.getTime()); @@ -192,11 +193,7 @@ export class AttendanceService { until: Date ): Promise<ActivityAttendance[]> { const matchingEvents = await this.getEventsOnDate(from, until); - - const groupedEvents: Map<string, EventNote[]> = groupBy( - matchingEvents, - "relatesTo" - ); + const groupedEvents = groupBy(matchingEvents, "relatesTo"); const records = []; for (const [activityId, activityEvents] of groupedEvents) { diff --git a/src/app/child-dev-project/attendance/dashboard-widgets/attendance-week-dashboard/attendance-week-dashboard.component.ts b/src/app/child-dev-project/attendance/dashboard-widgets/attendance-week-dashboard/attendance-week-dashboard.component.ts index a93f28dd75..4ff2193532 100644 --- a/src/app/child-dev-project/attendance/dashboard-widgets/attendance-week-dashboard/attendance-week-dashboard.component.ts +++ b/src/app/child-dev-project/attendance/dashboard-widgets/attendance-week-dashboard/attendance-week-dashboard.component.ts @@ -144,10 +144,10 @@ export class AttendanceWeekDashboardComponent .forEach((r) => lowAttendanceCases.add(r.childId)); } - const groupedRecords = groupBy(records, "childId"); - this.tableDataSource.data = Array.from(lowAttendanceCases.values()).map( - (childId) => groupedRecords.get(childId) - ); + const groups = groupBy(records, "childId"); + this.tableDataSource.data = groups + .filter(([childId]) => lowAttendanceCases.has(childId)) + .map(([_, attendance]) => attendance); this.loadingDone = true; } diff --git a/src/app/child-dev-project/children/dashboard-widgets/children-bmi-dashboard/children-bmi-dashboard.component.ts b/src/app/child-dev-project/children/dashboard-widgets/children-bmi-dashboard/children-bmi-dashboard.component.ts index c4f490f5fd..5b0cd96a3b 100644 --- a/src/app/child-dev-project/children/dashboard-widgets/children-bmi-dashboard/children-bmi-dashboard.component.ts +++ b/src/app/child-dev-project/children/dashboard-widgets/children-bmi-dashboard/children-bmi-dashboard.component.ts @@ -55,9 +55,8 @@ export class ChildrenBmiDashboardComponent async loadBMIData() { // Maybe replace this by a smart index function const healthChecks = await this.entityMapper.loadType(HealthCheck); - const healthCheckMap = groupBy(healthChecks, "child"); const BMIs: BmiRow[] = []; - healthCheckMap.forEach((checks, childId) => { + groupBy(healthChecks, "child").forEach(([childId, checks]) => { const latest = checks.reduce((prev, cur) => cur.date > prev.date ? cur : prev ); diff --git a/src/app/child-dev-project/children/dashboard-widgets/entity-count-dashboard/entity-count-dashboard.component.ts b/src/app/child-dev-project/children/dashboard-widgets/entity-count-dashboard/entity-count-dashboard.component.ts index a52d3311f7..7ce332b2d9 100644 --- a/src/app/child-dev-project/children/dashboard-widgets/entity-count-dashboard/entity-count-dashboard.component.ts +++ b/src/app/child-dev-project/children/dashboard-widgets/entity-count-dashboard/entity-count-dashboard.component.ts @@ -13,6 +13,7 @@ import { FontAwesomeModule } from "@fortawesome/angular-fontawesome"; import { Angulartics2Module } from "angulartics2"; import { DashboardWidgetComponent } from "../../../../core/dashboard/dashboard-widget/dashboard-widget.component"; import { WidgetContentComponent } from "../../../../core/dashboard/dashboard-widget/widget-content/widget-content.component"; +import { groupBy } from "../../../../utils/utils"; @DynamicComponent("ChildrenCountDashboard") @DynamicComponent("EntityCountDashboard") @@ -63,7 +64,7 @@ export class EntityCountDashboardComponent async ngOnInit() { const entities = await this.entityMapper.loadType(this.entity); - this.updateCounts(entities); + this.updateCounts(entities.filter((e) => e.isActive)); } goToChildrenList(filterId: string) { @@ -74,31 +75,16 @@ export class EntityCountDashboardComponent } private updateCounts(entities: Entity[]) { - this.totalEntities = 0; - - const countMap = new Map<any, number>(); - entities.forEach((entity) => { - if (entity.isActive) { - let count = countMap.get(entity[this.groupBy]); - if (count === undefined) { - count = 0; - } - - count++; - this.totalEntities++; - countMap.set(entity[this.groupBy], count); - } + this.totalEntities = entities.length; + const groups = groupBy(entities, this.groupBy as keyof Entity); + this.entityGroupCounts = groups.map(([group, entities]) => { + const label = extractHumanReadableLabel(group); + return { + label: label, + value: entities.length, + id: group?.["id"] || label, + }; }); - - this.entityGroupCounts = Array.from(countMap.entries()) // direct use of Map creates change detection problems - .map((entry) => { - const label = extractHumanReadableLabel(entry[0]); - return { - label: label, - value: entry[1], - id: entry[0]?.id || label, - }; - }); this.loading = false; } } diff --git a/src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts b/src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts index 6eeaa035d4..70d214c042 100644 --- a/src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts +++ b/src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts @@ -1,13 +1,10 @@ import { Center } from "../../model/child"; -export const centersWithProbability: Array<Center> = [ - // multiple entries for the same value increase its probability - { id: "alipore", label: $localize`:center:Alipore` }, +export const centersUnique: Center[] = [ { id: "alipore", label: $localize`:center:Alipore` }, { id: "tollygunge", label: $localize`:center:Tollygunge` }, { id: "barabazar", label: $localize`:center:Barabazar` }, ]; -export const centersUnique = centersWithProbability.filter( - (value, index, self) => self.indexOf(value) === index -); +// multiple entries for the same value increase its probability +export const centersWithProbability = [0, 0, 1, 2].map((i) => centersUnique[i]); diff --git a/src/app/child-dev-project/notes/model/note.spec.ts b/src/app/child-dev-project/notes/model/note.spec.ts index 2209d07770..1e6db00e0f 100644 --- a/src/app/child-dev-project/notes/model/note.spec.ts +++ b/src/app/child-dev-project/notes/model/note.spec.ts @@ -24,7 +24,7 @@ import { import { testEntitySubclass } from "../../../core/entity/model/entity.spec"; import { defaultInteractionTypes } from "../../../core/config/default-config/default-interaction-types"; import { Ordering } from "../../../core/configurable-enum/configurable-enum-ordering"; -import { createTestingConfigService } from "../../../core/config/testing-config-service"; +import { createTestingConfigurableEnumService } from "../../../core/configurable-enum/configurable-enum-testing"; const testStatusTypes: ConfigurableEnumConfig<AttendanceStatusType> = [ { @@ -86,7 +86,7 @@ describe("Note", () => { entitySchemaService = new EntitySchemaService(); entitySchemaService.registerSchemaDatatype( - new ConfigurableEnumDatatype(createTestingConfigService(testConfigs)) + new ConfigurableEnumDatatype(createTestingConfigurableEnumService()) ); })); diff --git a/src/app/child-dev-project/notes/note-details/note-details.component.spec.ts b/src/app/child-dev-project/notes/note-details/note-details.component.spec.ts index 69e5552e78..a9f5192c14 100644 --- a/src/app/child-dev-project/notes/note-details/note-details.component.spec.ts +++ b/src/app/child-dev-project/notes/note-details/note-details.component.spec.ts @@ -35,7 +35,7 @@ describe("NoteDetailsComponent", () => { let children: Child[]; let testNote: Note; - beforeEach(() => { + beforeEach(async () => { children = [new Child("1"), new Child("2"), new Child("3")]; testNote = generateTestNote(children); @@ -46,7 +46,7 @@ describe("NoteDetailsComponent", () => { const dialogRefMock = { beforeClosed: () => EMPTY, close: () => {} }; - TestBed.configureTestingModule({ + await TestBed.configureTestingModule({ imports: [ NoteDetailsComponent, MockedTestingModule.withState(LoginState.LOGGED_IN, children), diff --git a/src/app/child-dev-project/schools/child-school-overview/child-school-overview.component.ts b/src/app/child-dev-project/schools/child-school-overview/child-school-overview.component.ts index cb8890ba81..e56ef8e9ad 100644 --- a/src/app/child-dev-project/schools/child-school-overview/child-school-overview.component.ts +++ b/src/app/child-dev-project/schools/child-school-overview/child-school-overview.component.ts @@ -143,7 +143,7 @@ export class ChildSchoolOverviewComponent newRelation.start = this.allRecords.length && this.allRecords[0].end ? moment(this.allRecords[0].end).add(1, "day").toDate() - : new Date(); + : moment().startOf("day").toDate(); } else if (mode === "school") { newRelation.schoolId = entityId; } diff --git a/src/app/core/config-setup/config-import-parser.service.ts b/src/app/core/config-setup/config-import-parser.service.ts index 701c96acf2..724a45d822 100644 --- a/src/app/core/config-setup/config-import-parser.service.ts +++ b/src/app/core/config-setup/config-import-parser.service.ts @@ -25,6 +25,7 @@ export class ConfigImportParserService { "appConfig:usage-analytics", "navigationMenu", "view:", + // TODO what do we do with these? "enum:interaction-type", "enum:warning-levels", "view:note", diff --git a/src/app/core/config/config-fix.ts b/src/app/core/config/config-fix.ts index 169f2bda6c..2dd6533bdc 100644 --- a/src/app/core/config/config-fix.ts +++ b/src/app/core/config/config-fix.ts @@ -1,17 +1,7 @@ -import { defaultAttendanceStatusTypes } from "./default-config/default-attendance-status-types"; -import { defaultInteractionTypes } from "./default-config/default-interaction-types"; import { Child } from "../../child-dev-project/children/model/child"; import { School } from "../../child-dev-project/schools/model/school"; import { ChildSchoolRelation } from "../../child-dev-project/children/model/childSchoolRelation"; import { EventNote } from "../../child-dev-project/attendance/model/event-note"; -import { genders } from "../../child-dev-project/children/model/genders"; -import { materials } from "../../child-dev-project/children/educational-material/model/materials"; -import { - mathLevels, - readingLevels, -} from "../../child-dev-project/children/aser/model/skill-levels"; -import { warningLevels } from "../../child-dev-project/warning-levels"; -import { ratingAnswers } from "../../features/historical-data/model/rating-answers"; // prettier-ignore export const defaultJsonConfig = { @@ -89,68 +79,6 @@ export const defaultJsonConfig = { }, ] }, - - - "enum:interaction-type": defaultInteractionTypes, - "enum:attendance-status": defaultAttendanceStatusTypes, - "enum:reading-levels": readingLevels, - "enum:math-levels": mathLevels, - "enum:genders": genders, - "enum:materials": materials, - "enum:warning-levels": warningLevels, - "enum:document-status": [ - { - "id": "", - "label": "", - "_ordinal": 0, - }, - { - "id": "OK (copy with us)", - "label": $localize`:Document status:OK (copy with us)`, - "_ordinal": 1, - }, - { - "id": "OK (copy needed for us)", - "label": $localize`:Document status:OK (copy needed for us)`, - "_ordinal": 2, - }, - { - "id": "needs correction", - "label": $localize`:Document status:needs correction`, - "_ordinal": 3, - }, - { - "id": "applied", - "label": $localize`:Document status:applied`, - "_ordinal": 4, - }, - { - "id": "doesn't have", - "label": $localize`:Document status:doesn't have`, - "_ordinal": 5, - }, - { - "id": "not eligible", - "label": $localize`:Document status:not eligible`, - "_ordinal": 6, - } - ], - "enum:center": [ - { - "id": "alipore", - "label": $localize`:center:Alipore` - }, - { - "id": "tollygunge", - "label": $localize`:center:Tollygunge` - }, - { - "id": "barabazar", - "label": $localize`:center:Barabazar` - } - ], - "enum:rating-answer": ratingAnswers, - "view:": { "component": "Dashboard", "config": { @@ -294,21 +222,21 @@ export const defaultJsonConfig = { } ], "exportConfig": [ - {"label": "event_id", "query": "_id"}, - {"label": "date", "query": "date"}, - {"label": "event title", "query": "subject"}, - {"label": "event type", "query": "category"}, - {"label": "event description", "query": "text"}, + { "label": "event_id", "query": "_id" }, + { "label": "date", "query": "date" }, + { "label": "event title", "query": "subject" }, + { "label": "event type", "query": "category" }, + { "label": "event description", "query": "text" }, { "query": ":getAttendanceArray(true)", "subQueries": [ { "query": ".participant:toEntities(Child)", "subQueries": [ - {"label": "participant_id", "query": "_id"}, - {"label": "participant", "query": "name"}, - {"label": "gender", "query": "gender"}, - {"label": "religion", "query": "religion"}, + { "label": "participant_id", "query": "_id" }, + { "label": "participant", "query": "name" }, + { "label": "gender", "query": "gender" }, + { "label": "religion", "query": "religion" }, ] }, { @@ -318,8 +246,8 @@ export const defaultJsonConfig = { { "query": ".school:toEntities(School)", "subQueries": [ - {"label": "school_name", "query": "name"}, - {"label": "school_id", "query": "entityId"} + { "label": "school_name", "query": "name" }, + { "label": "school_id", "query": "entityId" } ] } ], @@ -683,7 +611,7 @@ export const defaultJsonConfig = { "config": { "rightSide": { "entityType": School.ENTITY_TYPE, - "availableFilters": [{"id": "language"}], + "availableFilters": [{ "id": "language" }], }, } } @@ -747,11 +675,11 @@ export const defaultJsonConfig = { component: "HistoricalDataComponent", config: [ "date", - {id: "isMotivatedDuringClass", visibleFrom: "lg"}, - {id: "isParticipatingInClass", visibleFrom: "lg"}, - {id: "isInteractingWithOthers", visibleFrom: "lg"}, - {id: "doesHomework", visibleFrom: "lg"}, - {id: "asksQuestions", visibleFrom: "lg"}, + { id: "isMotivatedDuringClass", visibleFrom: "lg" }, + { id: "isParticipatingInClass", visibleFrom: "lg" }, + { id: "isInteractingWithOthers", visibleFrom: "lg" }, + { id: "doesHomework", visibleFrom: "lg" }, + { id: "asksQuestions", visibleFrom: "lg" }, ] } ] @@ -796,9 +724,9 @@ export const defaultJsonConfig = { }, ], "exportConfig": [ - {label: "Title", query: "title"}, - {label: "Type", query: "type"}, - {label: "Assigned users", query: "assignedTo"} + { label: "Title", query: "title" }, + { label: "Type", query: "type" }, + { label: "Assigned users", query: "assignedTo" } ] } }, @@ -913,7 +841,7 @@ export const defaultJsonConfig = { "aggregationDefinitions": [ { "query": `${EventNote.ENTITY_TYPE}:toArray[* date >= ? & date <= ?]`, - groupBy: {label: "Type", property: "category"}, + groupBy: { label: "Type", property: "category" }, "subQueries": [ { query: ":getAttendanceArray:getAttendanceReport", @@ -1115,10 +1043,10 @@ export const defaultJsonConfig = { config: { rightSide: { entityType: School.ENTITY_TYPE, - prefilter: {"privateSchool": true}, - availableFilters: [{"id": "language"}], + prefilter: { "privateSchool": true }, + availableFilters: [{ "id": "language" }], }, - leftSide: {entityType: Child.ENTITY_TYPE}, + leftSide: { entityType: Child.ENTITY_TYPE }, } }, "appConfig:matching-entities": { @@ -1145,7 +1073,7 @@ export const defaultJsonConfig = { "entity": "Todo", "columns": ["deadline", "subject", "assignedTo", "startDate", "relatedEntities"], "filters": [ - {"id": "assignedTo"}, + { "id": "assignedTo" }, { "id": "due-status", diff --git a/src/app/core/config/config.service.spec.ts b/src/app/core/config/config.service.spec.ts index 7db2a4381b..ef003d22eb 100644 --- a/src/app/core/config/config.service.spec.ts +++ b/src/app/core/config/config.service.spec.ts @@ -5,6 +5,8 @@ import { Config } from "./config"; import { firstValueFrom, Subject } from "rxjs"; import { UpdatedEntity } from "../entity/model/entity-update"; import { LoggingService } from "../logging/logging.service"; +import { ConfigurableEnum } from "../configurable-enum/configurable-enum"; +import { EntityAbility } from "../permissions/ability/entity-ability"; describe("ConfigService", () => { let service: ConfigService; @@ -12,17 +14,30 @@ describe("ConfigService", () => { const updateSubject = new Subject<UpdatedEntity<Config>>(); beforeEach(() => { - entityMapper = jasmine.createSpyObj(["load", "save", "receiveUpdates"]); + entityMapper = jasmine.createSpyObj([ + "load", + "save", + "receiveUpdates", + "saveAll", + "loadType", + ]); entityMapper.receiveUpdates.and.returnValue(updateSubject); entityMapper.load.and.rejectWith(); + entityMapper.loadType.and.resolveTo([]); + entityMapper.saveAll.and.resolveTo([]); + entityMapper.save.and.resolveTo([]); TestBed.configureTestingModule({ providers: [ { provide: EntityMapperService, useValue: entityMapper }, ConfigService, LoggingService, + EntityAbility, ], }); service = TestBed.inject(ConfigService); + TestBed.inject(EntityAbility).update([ + { subject: "all", action: "manage" }, + ]); }); it("should be created", () => { @@ -51,6 +66,7 @@ describe("ConfigService", () => { const testConfig = new Config(); testConfig.data = { testKey: "testValue" }; updateSubject.next({ type: "new", entity: testConfig }); + tick(); expect(service.getConfig("testKey")).toBe("testValue"); return expectAsync(configLoaded).toBeResolvedTo(testConfig); @@ -63,7 +79,7 @@ describe("ConfigService", () => { "other:1": { name: "wrong" }, "test:2": { name: "second" }, }; - entityMapper.load.and.returnValue(Promise.resolve(testConfig)); + entityMapper.load.and.resolveTo(testConfig); service.loadConfig(); tick(); const result = service.getAllConfigs<any>("test:"); @@ -76,7 +92,7 @@ describe("ConfigService", () => { it("should return single field", fakeAsync(() => { const testConfig = new Config(); testConfig.data = { first: "correct", second: "wrong" }; - entityMapper.load.and.returnValue(Promise.resolve(testConfig)); + entityMapper.load.and.resolveTo(testConfig); service.loadConfig(); tick(); const result = service.getConfig<any>("first"); @@ -92,12 +108,82 @@ describe("ConfigService", () => { expect(lastCall.data).toEqual({ test: "data" }); }); - it("should create export config string", () => { + it("should create export config string", fakeAsync(() => { const config = new Config(); config.data = { first: "foo", second: "bar" }; const expected = JSON.stringify(config.data); updateSubject.next({ entity: config, type: "update" }); + tick(); const result = service.exportConfig(); expect(result).toEqual(expected); + })); + + it("should save enum configs to db it they dont exist yet", async () => { + entityMapper.saveAll.and.resolveTo(); + const data = { + "enum:1": [{ id: "some_id", label: "Some Label" }], + "enum:two": [], + "some:other": {}, + }; + const enum1 = new ConfigurableEnum("1"); + enum1.values = data["enum:1"]; + const enumTwo = new ConfigurableEnum("two"); + enumTwo.values = []; + + await initConfig(data); + + expect(entityMapper.saveAll).toHaveBeenCalledWith([enum1, enumTwo]); + const config = entityMapper.save.calls.mostRecent().args[0] as Config; + expect(config.data).toEqual({ "some:other": {} }); + }); + + it("should not fail config initialization if changed config cannot be saved", async () => { + entityMapper.saveAll.and.rejectWith(); + let configUpdate: Config; + service.configUpdates.subscribe((config) => (configUpdate = config)); + + await expectAsync(initConfig({ some: "config" })).toBeResolved(); + + expect(service.getConfig("some")).toBe("config"); + expect(configUpdate.data).toEqual({ some: "config" }); }); + + it("should not save enums that already exist in db", async () => { + entityMapper.loadType.and.resolveTo([new ConfigurableEnum("1")]); + entityMapper.save.and.resolveTo(); + + await initConfig({ "enum:1": [], "enum:2": [], some: "config" }); + + expect(entityMapper.saveAll).toHaveBeenCalledWith([ + new ConfigurableEnum("2"), + ]); + expect(entityMapper.save).toHaveBeenCalledWith(jasmine.any(Config)); + expect(service.getConfig("enum:1")).toBeUndefined(); + expect(service.getConfig("some")).toBe("config"); + }); + + it("should not save config if nothing has been changed", async () => { + await initConfig({ some: "config", other: "config" }); + + expect(entityMapper.save).not.toHaveBeenCalled(); + expect(entityMapper.saveAll).not.toHaveBeenCalled(); + }); + + it("should not save config if permissions prevent it", async () => { + // user can only read config + TestBed.inject(EntityAbility).update([ + { subject: "Config", action: "read" }, + ]); + + await initConfig({ "enum:1": [], other: "config" }); + + expect(entityMapper.save).not.toHaveBeenCalled(); + }); + + function initConfig(data) { + const config = new Config(); + config.data = data; + entityMapper.load.and.resolveTo(config); + return service.loadConfig(); + } }); diff --git a/src/app/core/config/config.service.ts b/src/app/core/config/config.service.ts index f3c840f776..3cee91e7fc 100644 --- a/src/app/core/config/config.service.ts +++ b/src/app/core/config/config.service.ts @@ -2,13 +2,11 @@ import { Injectable } from "@angular/core"; import { EntityMapperService } from "../entity/entity-mapper.service"; import { Config } from "./config"; import { Observable, ReplaySubject } from "rxjs"; -import { - CONFIGURABLE_ENUM_CONFIG_PREFIX, - ConfigurableEnumConfig, - ConfigurableEnumValue, -} from "../configurable-enum/configurable-enum.interface"; +import { CONFIGURABLE_ENUM_CONFIG_PREFIX } from "../configurable-enum/configurable-enum.interface"; import { filter } from "rxjs/operators"; import { LoggingService } from "../logging/logging.service"; +import { ConfigurableEnum } from "../configurable-enum/configurable-enum"; +import { EntityAbility } from "../permissions/ability/entity-ability"; /** * Access dynamic app configuration retrieved from the database @@ -28,7 +26,8 @@ export class ConfigService { constructor( private entityMapper: EntityMapperService, - private logger: LoggingService + private logger: LoggingService, + private ability: EntityAbility ) { this.loadConfig(); this.entityMapper @@ -38,15 +37,15 @@ export class ConfigService { } async loadConfig(): Promise<void> { - this.entityMapper + return this.entityMapper .load(Config, Config.CONFIG_KEY) - .then((config) => this.detectLegacyConfig(config)) .then((config) => this.updateConfigIfChanged(config)) .catch(() => {}); } - private updateConfigIfChanged(config: Config) { + private async updateConfigIfChanged(config: Config) { if (!this.currentConfig || config._rev !== this.currentConfig?._rev) { + await this.detectLegacyConfig(config); this.currentConfig = config; this._configUpdates.next(config); } @@ -64,19 +63,6 @@ export class ConfigService { return this.currentConfig.data[id]; } - /** - * Get the array of pre-defined values for the given configurable enum id. - * @param id - */ - public getConfigurableEnumValues<T extends ConfigurableEnumValue>( - id: string - ): ConfigurableEnumConfig<T> { - if (!id.startsWith(CONFIGURABLE_ENUM_CONFIG_PREFIX)) { - id = CONFIGURABLE_ENUM_CONFIG_PREFIX + id; - } - return this.getConfig<any>(id); - } - public getAllConfigs<T>(prefix: string): T[] { const matchingConfigs = []; for (const id of Object.keys(this.currentConfig.data)) { @@ -88,7 +74,7 @@ export class ConfigService { return matchingConfigs; } - private detectLegacyConfig(config: Config): Config { + private async detectLegacyConfig(config: Config): Promise<Config> { // ugly but easy ... could use https://www.npmjs.com/package/jsonpath-plus in future const configString = JSON.stringify(config); if ( @@ -106,6 +92,40 @@ export class ConfigService { ); } + await this.migrateEnumsToEntities(config).catch((err) => + this.logger.error(`ConfigurableEnum migration error: ${err}`) + ); + return config; } + + private async migrateEnumsToEntities(config: Config) { + const enumValues = Object.entries(config.data).filter(([key]) => + key.startsWith(CONFIGURABLE_ENUM_CONFIG_PREFIX) + ); + if (enumValues.length === 0) { + return; + } + const existingEnums = await this.entityMapper + .loadType(ConfigurableEnum) + .then((res) => res.map((e) => e.getId())); + + const newEnums: ConfigurableEnum[] = []; + enumValues.forEach(([key, value]) => { + const id = key.replace(CONFIGURABLE_ENUM_CONFIG_PREFIX, ""); + if (!existingEnums.includes(id)) { + const newEnum = new ConfigurableEnum(id); + newEnum.values = value as any; + newEnums.push(newEnum); + } + delete config.data[key]; + }); + + if (this.ability.can("create", ConfigurableEnum)) { + await this.entityMapper.saveAll(newEnums); + } + if (this.ability.can("update", config)) { + await this.entityMapper.save(config); + } + } } diff --git a/src/app/core/config/testing-config-service.ts b/src/app/core/config/testing-config-service.ts index 81c8134754..f173a722e9 100644 --- a/src/app/core/config/testing-config-service.ts +++ b/src/app/core/config/testing-config-service.ts @@ -9,7 +9,8 @@ export function createTestingConfigService( ): ConfigService { const configService = new ConfigService( mockEntityMapper(), - new LoggingService() + new LoggingService(), + { can: () => true } as any ); configService["currentConfig"] = new Config(Config.CONFIG_KEY, configsObject); return configService; diff --git a/src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.html b/src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.html new file mode 100644 index 0000000000..710964a9d8 --- /dev/null +++ b/src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.html @@ -0,0 +1,32 @@ +<input + #inputElement + [formControl]="autocompleteForm" + class="autocomplete-input" + matInput + style="text-overflow: ellipsis" + [matAutocomplete]="autoSuggestions" + (focusin)="onFocusIn()" + (focusout)="onFocusOut($event)" +/> +<mat-autocomplete + #autoSuggestions="matAutocomplete" + (optionSelected)="select($event.option.value)" + autoActiveFirstOption +> + <mat-option + *ngFor="let item of autocompleteSuggestedOptions | async" + [value]="item" + > + <mat-checkbox *ngIf="multi" [checked]="item.selected"></mat-checkbox> + <ng-template + [ngTemplateOutlet]="templateRef" + [ngTemplateOutletContext]="{ $implicit: item.initial }" + ></ng-template> + </mat-option> + <mat-option + *ngIf="createOption && showAddOption && inputElement.value" + [value]="inputElement.value" + > + <em>Add option</em> {{ inputElement.value }} + </mat-option> +</mat-autocomplete> diff --git a/src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.spec.ts b/src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.spec.ts new file mode 100644 index 0000000000..6b8d4986aa --- /dev/null +++ b/src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.spec.ts @@ -0,0 +1,179 @@ +import { + ComponentFixture, + fakeAsync, + flush, + TestBed, + tick, +} from "@angular/core/testing"; + +import { BasicAutocompleteComponent } from "./basic-autocomplete.component"; +import { School } from "../../../child-dev-project/schools/model/school"; +import { Child } from "../../../child-dev-project/children/model/child"; +import { Entity } from "../../entity/model/entity"; +import { FontAwesomeTestingModule } from "@fortawesome/angular-fontawesome/testing"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { MatDialogModule } from "@angular/material/dialog"; +import { TestbedHarnessEnvironment } from "@angular/cdk/testing/testbed"; +import { HarnessLoader } from "@angular/cdk/testing"; +import { MatInputHarness } from "@angular/material/input/testing"; +import { MatAutocompleteHarness } from "@angular/material/autocomplete/testing"; +import { + FormControl, + FormGroup, + NgControl, + NgForm, + Validators, +} from "@angular/forms"; + +describe("BasicAutocompleteComponent", () => { + let component: BasicAutocompleteComponent<any, any>; + let fixture: ComponentFixture<BasicAutocompleteComponent<any, any>>; + let loader: HarnessLoader; + let testControl: FormControl; + const entityToId = (e: Entity) => e?.getId(); + + beforeEach(async () => { + testControl = new FormControl(""); + const formGroup = new FormGroup({ testControl }); + await TestBed.configureTestingModule({ + imports: [ + BasicAutocompleteComponent, + FontAwesomeTestingModule, + NoopAnimationsModule, + MatDialogModule, + ], + providers: [{ provide: NgForm, useValue: formGroup }], + }) + .overrideComponent(BasicAutocompleteComponent, { + // overwrite @Self dependency + add: { + providers: [ + { provide: NgControl, useValue: { control: testControl } }, + ], + }, + }) + .compileComponents(); + + fixture = TestBed.createComponent(BasicAutocompleteComponent); + loader = TestbedHarnessEnvironment.loader(fixture); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); + + it("should correctly show the autocomplete values", async () => { + const school1 = School.create({ name: "Aaa" }); + const school2 = School.create({ name: "aab" }); + const school3 = School.create({ name: "cde" }); + component.options = [school1, school2, school3]; + let currentAutocompleteSuggestions: School[]; + component.autocompleteSuggestedOptions.subscribe( + (value) => (currentAutocompleteSuggestions = value.map((o) => o.asValue)) + ); + + component.autocompleteForm.setValue(""); + expect(currentAutocompleteSuggestions).toEqual([school1, school2, school3]); + component.autocompleteForm.setValue("Aa"); + expect(currentAutocompleteSuggestions).toEqual([school1, school2]); + component.autocompleteForm.setValue("Aab"); + expect(currentAutocompleteSuggestions).toEqual([school2]); + }); + + it("should show name of the selected entity", async () => { + const child1 = Child.create("First Child"); + const child2 = Child.create("Second Child"); + component.value = child1.getId(); + component.options = [child1, child2]; + component.valueMapper = entityToId; + + component.ngOnChanges({ value: true, options: true, valueMapper: true }); + fixture.detectChanges(); + + expect(component.autocompleteForm).toHaveValue("First Child"); + const inputElement = await loader.getHarness(MatInputHarness); + await expectAsync(inputElement.getValue()).toBeResolvedTo("First Child"); + }); + + it("should have the correct entity selected when it's name is entered", () => { + const child1 = Child.create("First Child"); + const child2 = Child.create("Second Child"); + component.options = [child1, child2]; + component.valueMapper = entityToId; + + component.select({ asValue: child1.getId() } as any); + + expect(component.value).toBe(child1.getId()); + }); + + it("should reset if nothing has been selected", fakeAsync(() => { + const first = Child.create("First"); + const second = Child.create("Second"); + component.options = [first, second]; + component.valueMapper = entityToId; + + component.select({ asValue: first.getId() } as any); + expect(component.value).toBe(first.getId()); + + component.autocompleteForm.setValue("Non existent"); + component.onFocusOut({} as any); + tick(); + + expect(component.value).toBe(undefined); + flush(); + })); + + it("should disable the form if the control is disabled", () => { + component.disabled = false; + expect(component.autocompleteForm.disabled).toBeFalse(); + component.disabled = true; + expect(component.autocompleteForm.disabled).toBeTrue(); + }); + + it("should initialize the options in multi select mode", async () => { + const autocomplete = await loader.getHarness(MatAutocompleteHarness); + component.options = [0, 1, 2]; + component.multi = true; + component.value = [0, 1]; + component.ngOnChanges({ options: true, value: true }); + + component.showAutocomplete(); + component.autocomplete.openPanel(); + const options = await autocomplete.getOptions(); + expect(options).toHaveSize(3); + + await options[2].click(); + await options[1].click(); + + expect(component.value).toEqual([0, 2]); + }); + + it("should clear the input when focusing in multi select mode", () => { + component.multi = true; + component.options = ["some", "values", "and", "other", "options"]; + component.value = ["some", "values"]; + component.ngOnChanges({ value: true, options: true }); + expect(component.autocompleteForm).toHaveValue("some, values"); + + component.onFocusIn(); + expect(component.autocompleteForm).toHaveValue(""); + + component.onFocusOut({} as any); + expect(component.autocompleteForm).toHaveValue("some, values"); + }); + + it("should update the error state if the form is invalid", () => { + testControl.setValidators([Validators.required]); + testControl.setValue(null); + component.ngDoCheck(); + + expect(component.errorState).toBeFalse(); + + testControl.markAsTouched(); + component.ngDoCheck(); + + expect(component.errorState).toBeTrue(); + }); +}); diff --git a/src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.ts b/src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.ts new file mode 100644 index 0000000000..7433e9064c --- /dev/null +++ b/src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.ts @@ -0,0 +1,284 @@ +import { + Component, + ContentChild, + ElementRef, + Input, + OnChanges, + Optional, + Self, + TemplateRef, + ViewChild, +} from "@angular/core"; +import { AsyncPipe, NgForOf, NgIf, NgTemplateOutlet } from "@angular/common"; +import { MatFormFieldControl } from "@angular/material/form-field"; +import { + FormControl, + FormGroupDirective, + NgControl, + NgForm, + ReactiveFormsModule, +} from "@angular/forms"; +import { MatInputModule } from "@angular/material/input"; +import { + MatAutocompleteModule, + MatAutocompleteTrigger, +} from "@angular/material/autocomplete"; +import { concat, of, skip } from "rxjs"; +import { MatCheckboxModule } from "@angular/material/checkbox"; +import { filter, map, startWith } from "rxjs/operators"; +import { ConfirmationDialogService } from "../../confirmation-dialog/confirmation-dialog.service"; +import { ErrorStateMatcher } from "@angular/material/core"; +import { CustomFormControlDirective } from "./custom-form-control.directive"; +import { coerceBooleanProperty } from "@angular/cdk/coercion"; + +interface SelectableOption<O, V> { + initial: O; + asString: string; + asValue: V; + selected: boolean; +} + +/** Custom `MatFormFieldControl` for telephone number input. */ +@Component({ + selector: "app-basic-autocomplete", + templateUrl: "basic-autocomplete.component.html", + providers: [ + { provide: MatFormFieldControl, useExisting: BasicAutocompleteComponent }, + ], + standalone: true, + imports: [ + ReactiveFormsModule, + MatInputModule, + MatAutocompleteModule, + NgForOf, + MatCheckboxModule, + NgIf, + AsyncPipe, + NgTemplateOutlet, + ], +}) +export class BasicAutocompleteComponent<O, V = O> + extends CustomFormControlDirective<V | V[]> + implements OnChanges +{ + @ContentChild(TemplateRef) templateRef: TemplateRef<O>; + @ViewChild("inputElement") inputElement: ElementRef<HTMLInputElement>; + @ViewChild(MatAutocompleteTrigger) autocomplete: MatAutocompleteTrigger; + + @Input() valueMapper = (option: O) => option as unknown as V; + @Input() optionToString = (option) => option?.toString(); + @Input() createOption: (input: string) => O; + @Input() multi?: boolean; + + autocompleteForm = new FormControl(""); + autocompleteSuggestedOptions = this.autocompleteForm.valueChanges.pipe( + filter((val) => typeof val === "string"), + map((val) => this.updateAutocomplete(val)), + startWith([]) + ); + showAddOption = false; + private addOptionTimeout: any; + private delayedBlur: any; + + get disabled(): boolean { + return this._disabled; + } + + set disabled(value: boolean) { + this._disabled = coerceBooleanProperty(value); + this._disabled + ? this.autocompleteForm.disable() + : this.autocompleteForm.enable(); + this.stateChanges.next(); + } + + @Input() set options(options: O[]) { + this._options = options.map((o) => this.toSelectableOption(o)); + } + + private _options: SelectableOption<O, V>[] = []; + + constructor( + elementRef: ElementRef<HTMLElement>, + private confirmation: ConfirmationDialogService, + errorStateMatcher: ErrorStateMatcher, + @Optional() @Self() ngControl: NgControl, + @Optional() parentForm: NgForm, + @Optional() parentFormGroup: FormGroupDirective + ) { + super( + elementRef, + errorStateMatcher, + ngControl, + parentForm, + parentFormGroup + ); + } + + ngOnChanges(changes: { [key in keyof this]?: any }) { + if (changes.valueMapper) { + this._options.forEach( + (opt) => (opt.asValue = this.valueMapper(opt.initial)) + ); + } + if (changes.optionToString) { + this._options.forEach( + (opt) => (opt.asString = this.optionToString(opt.initial)) + ); + } + if (changes.value || changes.options) { + this.setInitialInputValue(); + } + } + + showAutocomplete() { + this.autocompleteSuggestedOptions = concat( + of(this._options), + this.autocompleteSuggestedOptions.pipe(skip(1)) + ); + } + + private updateAutocomplete(inputText: string): SelectableOption<O, V>[] { + let filteredOptions = this._options; + this.showAddOption = false; + clearTimeout(this.addOptionTimeout); + if (inputText) { + filteredOptions = this._options.filter((option) => + option.asString.toLowerCase().includes(inputText.toLowerCase()) + ); + const exists = this._options.find( + (o) => o.asString.toLowerCase() === inputText.toLowerCase() + ); + if (!exists) { + // show 'add option' after short timeout if user doesn't enter anything + this.addOptionTimeout = setTimeout( + () => (this.showAddOption = true), + 1000 + ); + } + } + return filteredOptions; + } + + private setInitialInputValue() { + if (this.multi) { + this._options + .filter(({ asValue }) => (this.value as V[])?.includes(asValue)) + .forEach((o) => (o.selected = true)); + this.displaySelectedOptions(); + } else { + const selected = this._options.find( + ({ asValue }) => asValue === this.value + ); + this.autocompleteForm.setValue(selected?.asString ?? ""); + } + } + + private displaySelectedOptions() { + this.autocompleteForm.setValue( + this._options + .filter((o) => o.selected) + .map((o) => o.asString) + .join(", ") + ); + } + + select(selected: string | SelectableOption<O, V>) { + if (typeof selected === "string") { + this.createNewOption(selected); + return; + } + + if (selected) { + this.selectOption(selected); + } else { + this.autocompleteForm.setValue(""); + this.value = undefined; + } + this.onChange(this.value); + } + + async createNewOption(option: string) { + const userConfirmed = await this.confirmation.getConfirmation( + $localize`Create new option`, + `Do you want to create the new option "${option}"?` + ); + if (userConfirmed) { + const newOption = this.toSelectableOption(this.createOption(option)); + this._options.push(newOption); + this.select(newOption); + } + } + + private selectOption(option: SelectableOption<O, V>) { + if (this.multi) { + option.selected = !option.selected; + this.value = this._options + .filter((o) => o.selected) + .map((o) => o.asValue); + // re-open autocomplete to select next option + this.autocompleteForm.setValue(""); + setTimeout(() => this.autocomplete.openPanel(), 100); + } else { + this.autocompleteForm.setValue(option.asString); + this.value = option.asValue; + } + } + + private toSelectableOption(opt: O): SelectableOption<O, V> { + return { + initial: opt, + asValue: this.valueMapper(opt), + asString: this.optionToString(opt), + selected: false, + }; + } + + onFocusIn() { + clearTimeout(this.delayedBlur); + if (!this.focused) { + if (this.multi) { + this.autocompleteForm.setValue(""); + } + this.focus(); + } + } + + onFocusOut(event: FocusEvent) { + if ( + !this.elementRef.nativeElement.contains(event.relatedTarget as Element) + ) { + if (!this.autocomplete.panelOpen) { + this.notifyFocusOut(); + } else { + // trigger focus out once panel is closed + this.delayedBlur = setTimeout(() => this.notifyFocusOut(), 100); + } + } + } + + private notifyFocusOut() { + if (this.multi) { + this.displaySelectedOptions(); + } else { + const inputValue = this.autocompleteForm.value; + const selectedOption = this._options.find( + ({ asValue }) => asValue === this._value + ); + if (selectedOption?.asString !== inputValue) { + // try to select the option that matches the input string + const matchingOption = this._options.find( + ({ asString }) => asString.toLowerCase() === inputValue.toLowerCase() + ); + this.select(matchingOption); + } + } + this.blur(); + } + + onContainerClick(event: MouseEvent) { + if ((event.target as Element).tagName.toLowerCase() != "input") { + this.inputElement.nativeElement.focus(); + } + } +} diff --git a/src/app/core/configurable-enum/basic-autocomplete/custom-form-control.directive.ts b/src/app/core/configurable-enum/basic-autocomplete/custom-form-control.directive.ts new file mode 100644 index 0000000000..c986873d5d --- /dev/null +++ b/src/app/core/configurable-enum/basic-autocomplete/custom-form-control.directive.ts @@ -0,0 +1,142 @@ +import { + AbstractControl, + ControlValueAccessor, + FormGroupDirective, + NgControl, + NgForm, +} from "@angular/forms"; +import { MatFormFieldControl } from "@angular/material/form-field"; +import { + Directive, + DoCheck, + ElementRef, + HostBinding, + Input, + OnDestroy, +} from "@angular/core"; +import { Subject } from "rxjs"; +import { coerceBooleanProperty } from "@angular/cdk/coercion"; +import { ErrorStateMatcher } from "@angular/material/core"; + +@Directive() +export abstract class CustomFormControlDirective<T> + implements ControlValueAccessor, MatFormFieldControl<T>, OnDestroy, DoCheck +{ + static nextId = 0; + @HostBinding() + id = `custom-form-control-${CustomFormControlDirective.nextId++}`; + // eslint-disable-next-line @angular-eslint/no-input-rename + @Input("aria-describedby") userAriaDescribedBy: string; + @Input() placeholder: string; + @Input() required = false; + + stateChanges = new Subject<void>(); + focused = false; + touched = false; + errorState = false; + controlType = "custom-control"; + onChange = (_: any) => {}; + onTouched = () => {}; + + get empty() { + return !this.value; + } + + get shouldLabelFloat() { + return this.focused || !this.empty; + } + + @Input() + get disabled(): boolean { + return this._disabled; + } + + set disabled(value: boolean) { + this._disabled = coerceBooleanProperty(value); + this.stateChanges.next(); + } + + _disabled = false; + + @Input() get value(): T { + return this._value; + } + + set value(value: T) { + this._value = value; + this.stateChanges.next(); + } + + _value: T; + + constructor( + public elementRef: ElementRef<HTMLElement>, + public errorStateMatcher: ErrorStateMatcher, + public ngControl: NgControl, + public parentForm: NgForm, + public parentFormGroup: FormGroupDirective + ) { + if (this.ngControl != null) { + this.ngControl.valueAccessor = this; + } + } + + ngOnDestroy() { + this.stateChanges.complete(); + } + + focus() { + this.focused = true; + this.stateChanges.next(); + } + + blur() { + this.touched = true; + this.focused = false; + this.onTouched(); + this.stateChanges.next(); + } + + setDescribedByIds(ids: string[]) { + const controlElement = this.elementRef.nativeElement.querySelector( + ".autocomplete-input" + )!; + controlElement.setAttribute("aria-describedby", ids.join(" ")); + } + + abstract onContainerClick(event: MouseEvent); + + writeValue(val: T): void { + this.value = val; + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouched = fn; + } + + setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; + } + + /** + * Updates the error state based on the form control + * Taken from {@link https://github.com/angular/components/blob/a1d5614f18066c0c2dc2580c7b5099e8f68a8e74/src/material/core/common-behaviors/error-state.ts#L59} + */ + ngDoCheck() { + const oldState = this.errorState; + const parent = this.parentFormGroup || this.parentForm; + const control = this.ngControl + ? (this.ngControl.control as AbstractControl) + : null; + const newState = this.errorStateMatcher.isErrorState(control, parent); + + if (newState !== oldState) { + this.errorState = newState; + this.stateChanges.next(); + } + } +} diff --git a/src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.spec.ts b/src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.spec.ts index 6edfe5cb1f..041efe6e0f 100644 --- a/src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.spec.ts +++ b/src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.spec.ts @@ -22,9 +22,9 @@ import { Entity } from "../../entity/model/entity"; import { DatabaseField } from "../../entity/database-field.decorator"; import { EntitySchemaService } from "../../entity/schema/entity-schema.service"; import { TestBed, waitForAsync } from "@angular/core/testing"; -import { ConfigService } from "../../config/config.service"; import { DatabaseEntity } from "../../entity/database-entity.decorator"; import { ConfigurableEnumModule } from "../configurable-enum.module"; +import { ConfigurableEnumService } from "../configurable-enum.service"; describe("ConfigurableEnumDatatype", () => { const TEST_CONFIG: ConfigurableEnumConfig = [ @@ -48,15 +48,15 @@ describe("ConfigurableEnumDatatype", () => { } let entitySchemaService: EntitySchemaService; - let configService: jasmine.SpyObj<ConfigService>; + let enumService: jasmine.SpyObj<ConfigurableEnumService>; beforeEach(waitForAsync(() => { - configService = jasmine.createSpyObj("configService", ["getConfig"]); - configService.getConfig.and.returnValue(TEST_CONFIG); + enumService = jasmine.createSpyObj(["getEnumValues"]); + enumService.getEnumValues.and.returnValue(TEST_CONFIG); TestBed.configureTestingModule({ imports: [ConfigurableEnumModule], - providers: [{ provide: ConfigService, useValue: configService }], + providers: [{ provide: ConfigurableEnumService, useValue: enumService }], }); entitySchemaService = diff --git a/src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.ts b/src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.ts index 09126d3828..a2b6477db2 100644 --- a/src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.ts +++ b/src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.ts @@ -1,11 +1,7 @@ import { EntitySchemaDatatype } from "../../entity/schema/entity-schema-datatype"; -import { - CONFIGURABLE_ENUM_CONFIG_PREFIX, - ConfigurableEnumConfig, - ConfigurableEnumValue, -} from "../configurable-enum.interface"; -import { ConfigService } from "../../config/config.service"; +import { ConfigurableEnumValue } from "../configurable-enum.interface"; import { EntitySchemaField } from "../../entity/schema/entity-schema-field"; +import { ConfigurableEnumService } from "../configurable-enum.service"; export class ConfigurableEnumDatatype implements EntitySchemaDatatype<ConfigurableEnumValue> @@ -14,7 +10,7 @@ export class ConfigurableEnumDatatype public readonly viewComponent = "DisplayConfigurableEnum"; public readonly editComponent = "EditConfigurableEnum"; - constructor(private configService: ConfigService) {} + constructor(private enumService: ConfigurableEnumService) {} /** * transforms Objects of InteractionType to strings to save in DB @@ -34,12 +30,8 @@ export class ConfigurableEnumDatatype schemaField: EntitySchemaField ): ConfigurableEnumValue { let enumId = schemaField.additional || schemaField.innerDataType; - if (!enumId.startsWith(CONFIGURABLE_ENUM_CONFIG_PREFIX)) { - enumId = CONFIGURABLE_ENUM_CONFIG_PREFIX + enumId; - } - - let enumOption = this.configService - .getConfig<ConfigurableEnumConfig>(enumId) + let enumOption = this.enumService + .getEnumValues(enumId) ?.find((option) => option.id === value); if (!enumOption) { enumOption = this.generateOptionForInvalid(value); @@ -50,7 +42,7 @@ export class ConfigurableEnumDatatype /** * Build a dummy option so that invalid values are not lost on the next save and users can manually correct issues. - * @param enumId + * @param optionValue * @private */ private generateOptionForInvalid(optionValue: string) { diff --git a/src/app/core/configurable-enum/configurable-enum-directive/configurable-enum.directive.spec.ts b/src/app/core/configurable-enum/configurable-enum-directive/configurable-enum.directive.spec.ts index 7880a8f281..c40c42ff40 100644 --- a/src/app/core/configurable-enum/configurable-enum-directive/configurable-enum.directive.spec.ts +++ b/src/app/core/configurable-enum/configurable-enum-directive/configurable-enum.directive.spec.ts @@ -1,23 +1,20 @@ import { ConfigurableEnumDirective } from "./configurable-enum.directive"; -import { ConfigService } from "../../config/config.service"; import { ViewContainerRef } from "@angular/core"; -import { - CONFIGURABLE_ENUM_CONFIG_PREFIX, - ConfigurableEnumConfig, -} from "../configurable-enum.interface"; +import { ConfigurableEnumConfig } from "../configurable-enum.interface"; +import { ConfigurableEnumService } from "../configurable-enum.service"; describe("ConfigurableEnumDirective", () => { let testTemplateRef; let mockViewContainerRef: jasmine.SpyObj<ViewContainerRef>; - let mockConfigService: jasmine.SpyObj<ConfigService>; + let mockEnumService: jasmine.SpyObj<ConfigurableEnumService>; beforeEach(() => { testTemplateRef = {}; mockViewContainerRef = jasmine.createSpyObj("mockViewContainerRef", [ "createEmbeddedView", ]); - mockConfigService = jasmine.createSpyObj("mockConfigService", [ - "getConfig", + mockEnumService = jasmine.createSpyObj("mockConfigService", [ + "getEnumValues", ]); }); @@ -25,7 +22,7 @@ describe("ConfigurableEnumDirective", () => { const directive = new ConfigurableEnumDirective( testTemplateRef, mockViewContainerRef, - mockConfigService + mockEnumService ); expect(directive).toBeTruthy(); }); @@ -36,18 +33,18 @@ describe("ConfigurableEnumDirective", () => { { id: "1", label: "A" }, { id: "2", label: "B" }, ]; - mockConfigService.getConfig.and.returnValue(testEnumValues); + mockEnumService.getEnumValues.and.returnValue(testEnumValues); const directive = new ConfigurableEnumDirective( testTemplateRef, mockViewContainerRef, - mockConfigService + mockEnumService ); directive.appConfigurableEnumOf = testEnumConfigId; - expect(mockConfigService.getConfig).toHaveBeenCalledWith( - CONFIGURABLE_ENUM_CONFIG_PREFIX + testEnumConfigId + expect(mockEnumService.getEnumValues).toHaveBeenCalledWith( + testEnumConfigId ); expect(mockViewContainerRef.createEmbeddedView).toHaveBeenCalledTimes( testEnumValues.length diff --git a/src/app/core/configurable-enum/configurable-enum-directive/configurable-enum.directive.ts b/src/app/core/configurable-enum/configurable-enum-directive/configurable-enum.directive.ts index ea0d201062..be4db3854d 100644 --- a/src/app/core/configurable-enum/configurable-enum-directive/configurable-enum.directive.ts +++ b/src/app/core/configurable-enum/configurable-enum-directive/configurable-enum.directive.ts @@ -1,9 +1,5 @@ import { Directive, Input, TemplateRef, ViewContainerRef } from "@angular/core"; -import { - CONFIGURABLE_ENUM_CONFIG_PREFIX, - ConfigurableEnumConfig, -} from "../configurable-enum.interface"; -import { ConfigService } from "../../config/config.service"; +import { ConfigurableEnumService } from "../configurable-enum.service"; /** * Enumerate over all {@link ConfigurableEnumConfig} values for the given enum config id. @@ -22,12 +18,7 @@ export class ConfigurableEnumDirective { * @param enumConfigId */ @Input() set appConfigurableEnumOf(enumConfigId: string) { - if (!enumConfigId.startsWith(CONFIGURABLE_ENUM_CONFIG_PREFIX)) { - enumConfigId = CONFIGURABLE_ENUM_CONFIG_PREFIX + enumConfigId; - } - - const options = - this.configService.getConfig<ConfigurableEnumConfig>(enumConfigId); + const options = this.enumService.getEnumValues(enumConfigId); for (const item of options) { this.viewContainerRef.createEmbeddedView(this.templateRef, { $implicit: item, @@ -39,14 +30,10 @@ export class ConfigurableEnumDirective { * For implementation details see * https://www.talkinghightech.com/en/create-ngfor-directive/ and * https://angular.io/guide/structural-directives#write-a-structural-directive - * - * @param templateRef - * @param viewContainerRef - * @param configService */ constructor( private templateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef, - private configService: ConfigService + private enumService: ConfigurableEnumService ) {} } diff --git a/src/app/core/configurable-enum/configurable-enum-testing.ts b/src/app/core/configurable-enum/configurable-enum-testing.ts new file mode 100644 index 0000000000..7df737d413 --- /dev/null +++ b/src/app/core/configurable-enum/configurable-enum-testing.ts @@ -0,0 +1,42 @@ +import { genders } from "../../child-dev-project/children/model/genders"; +import { materials } from "../../child-dev-project/children/educational-material/model/materials"; +import { + mathLevels, + readingLevels, +} from "../../child-dev-project/children/aser/model/skill-levels"; +import { ConfigurableEnum } from "./configurable-enum"; +import { ConfigurableEnumService } from "./configurable-enum.service"; +import { NEVER, of } from "rxjs"; +import { defaultInteractionTypes } from "../config/default-config/default-interaction-types"; +import { warningLevels } from "../../child-dev-project/warning-levels"; +import { ratingAnswers } from "../../features/historical-data/model/rating-answers"; +import { centersUnique } from "../../child-dev-project/children/demo-data-generators/fixtures/centers"; +import { defaultAttendanceStatusTypes } from "../config/default-config/default-attendance-status-types"; + +export const demoEnums = Object.entries({ + genders: genders, + materials: materials, + "math-levels": mathLevels, + "reading-levels": readingLevels, + "warning-levels": warningLevels, + "rating-answer": ratingAnswers, + center: centersUnique, + "attendance-status": defaultAttendanceStatusTypes, + "interaction-type": defaultInteractionTypes, +}).map(([key, value]) => { + const e = new ConfigurableEnum(key); + e.values = value; + return e; +}); + +export function createTestingConfigurableEnumService() { + let service: ConfigurableEnumService; + service = new ConfigurableEnumService( + { + receiveUpdates: () => NEVER, + loadType: () => Promise.resolve(demoEnums), + } as any, + { configUpdates: of(undefined) } as any + ); + return service; +} diff --git a/src/app/core/configurable-enum/configurable-enum.module.ts b/src/app/core/configurable-enum/configurable-enum.module.ts index a454f8a9ce..cf26fa9dfe 100644 --- a/src/app/core/configurable-enum/configurable-enum.module.ts +++ b/src/app/core/configurable-enum/configurable-enum.module.ts @@ -1,7 +1,7 @@ import { NgModule } from "@angular/core"; -import { ConfigService } from "../config/config.service"; import { EntitySchemaService } from "../entity/schema/entity-schema.service"; import { ConfigurableEnumDatatype } from "./configurable-enum-datatype/configurable-enum-datatype"; +import { ConfigurableEnumService } from "./configurable-enum.service"; /** * Provides a generic functionality to define enums (collections of selectable options) in the config database @@ -47,11 +47,11 @@ import { ConfigurableEnumDatatype } from "./configurable-enum-datatype/configura @NgModule({}) export class ConfigurableEnumModule { constructor( - private configService: ConfigService, + private enumService: ConfigurableEnumService, private entitySchemaService: EntitySchemaService ) { this.entitySchemaService.registerSchemaDatatype( - new ConfigurableEnumDatatype(configService) + new ConfigurableEnumDatatype(enumService) ); } } diff --git a/src/app/core/configurable-enum/configurable-enum.service.spec.ts b/src/app/core/configurable-enum/configurable-enum.service.spec.ts new file mode 100644 index 0000000000..b5e26e5872 --- /dev/null +++ b/src/app/core/configurable-enum/configurable-enum.service.spec.ts @@ -0,0 +1,42 @@ +import { TestBed } from "@angular/core/testing"; +import { ConfigurableEnumService } from "./configurable-enum.service"; +import { EntityMapperService } from "../entity/entity-mapper.service"; +import { ConfigService } from "../config/config.service"; +import { NEVER, of } from "rxjs"; + +describe("ConfigurableEnumService", () => { + let service: ConfigurableEnumService; + let mockEntityMapper: jasmine.SpyObj<EntityMapperService>; + let mockConfigService: jasmine.SpyObj<ConfigService>; + beforeEach(async () => { + mockEntityMapper = jasmine.createSpyObj([ + "save", + "loadType", + "receiveUpdates", + ]); + mockEntityMapper.receiveUpdates.and.returnValue(NEVER); + mockEntityMapper.loadType.and.resolveTo([]); + mockConfigService = jasmine.createSpyObj([], { configUpdates: of({}) }); + await TestBed.configureTestingModule({ + providers: [ + { provide: EntityMapperService, useValue: mockEntityMapper }, + { provide: ConfigService, useValue: mockConfigService }, + ], + }).compileComponents(); + service = TestBed.inject(ConfigurableEnumService); + }); + + it("should create", () => { + expect(service).toBeTruthy(); + }); + + it("should create a new enum if it cannot be found", () => { + const newEnum = service.getEnum("new-id"); + + expect(newEnum.getId()).toEqual("new-id"); + expect(newEnum.values).toEqual([]); + expect(mockEntityMapper.save).toHaveBeenCalledWith(newEnum); + // returns same enum in consecutive calls + expect(service.getEnum("new-id")).toBe(newEnum); + }); +}); diff --git a/src/app/core/configurable-enum/configurable-enum.service.ts b/src/app/core/configurable-enum/configurable-enum.service.ts new file mode 100644 index 0000000000..52a5359610 --- /dev/null +++ b/src/app/core/configurable-enum/configurable-enum.service.ts @@ -0,0 +1,46 @@ +import { Injectable } from "@angular/core"; +import { ConfigService } from "../config/config.service"; +import { ConfigurableEnum } from "./configurable-enum"; +import { EntityMapperService } from "../entity/entity-mapper.service"; +import { ConfigurableEnumValue } from "./configurable-enum.interface"; +import { Entity } from "../entity/model/entity"; + +@Injectable({ providedIn: "root" }) +export class ConfigurableEnumService { + private enums = new Map<string, ConfigurableEnum>(); + + constructor( + private entityMapper: EntityMapperService, + configService: ConfigService + ) { + configService.configUpdates.subscribe(() => this.preLoadEnums()); + this.entityMapper + .receiveUpdates(ConfigurableEnum) + .subscribe(({ entity }) => this.cacheEnum(entity)); + } + + async preLoadEnums() { + const allEnums = await this.entityMapper.loadType(ConfigurableEnum); + allEnums.forEach((entity) => this.cacheEnum(entity)); + } + + private cacheEnum(entity: ConfigurableEnum) { + return this.enums.set(entity.getId(true), entity); + } + + getEnumValues<T extends ConfigurableEnumValue = ConfigurableEnumValue>( + id: string + ): T[] { + return this.getEnum(id).values as T[]; + } + + getEnum(id: string): ConfigurableEnum { + const entityId = Entity.createPrefixedId(ConfigurableEnum.ENTITY_TYPE, id); + if (!this.enums.has(entityId)) { + const newEnum = new ConfigurableEnum(id); + this.cacheEnum(newEnum); + this.entityMapper.save(newEnum); + } + return this.enums.get(entityId); + } +} diff --git a/src/app/core/configurable-enum/configurable-enum.ts b/src/app/core/configurable-enum/configurable-enum.ts new file mode 100644 index 0000000000..a2f3cf1412 --- /dev/null +++ b/src/app/core/configurable-enum/configurable-enum.ts @@ -0,0 +1,9 @@ +import { Entity } from "../entity/model/entity"; +import { DatabaseEntity } from "../entity/database-entity.decorator"; +import { ConfigurableEnumValue } from "./configurable-enum.interface"; +import { DatabaseField } from "../entity/database-field.decorator"; + +@DatabaseEntity("ConfigurableEnum") +export class ConfigurableEnum extends Entity { + @DatabaseField() values: ConfigurableEnumValue[] = []; +} diff --git a/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html b/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html new file mode 100644 index 0000000000..9a15479ab0 --- /dev/null +++ b/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html @@ -0,0 +1,36 @@ +<h1 matDialogTitle i18n="title of dropdown options popup dialog"> + Edit dropdown options +</h1> +<app-dialog-close mat-dialog-close></app-dialog-close> +<mat-dialog-content + style="max-width: 400px; padding-top: 5px" + cdkDropList + (cdkDropListDropped)="drop($event)" +> + <mat-form-field + *ngFor="let v of enumEntity.values; let i = index" + cdkDrag + class="full-width" + appearance="fill" + > + <fa-icon + icon="grip-vertical" + matIconPrefix + class="grab-icon margin-right-small" + ></fa-icon> + <input matInput [(ngModel)]="v.label"/> + <button mat-icon-button matIconSuffix (click)="delete(v, i)"> + <fa-icon icon="trash"></fa-icon> + </button> + </mat-form-field> +</mat-dialog-content> + +<mat-dialog-actions> + <button + mat-raised-button + mat-dialog-close + i18n="Close popup" + > + Close + </button> +</mat-dialog-actions> diff --git a/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.scss b/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.scss new file mode 100644 index 0000000000..d8a5349df9 --- /dev/null +++ b/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.scss @@ -0,0 +1,4 @@ +.grab-icon { + cursor: grab; + padding-left: 5px; +} diff --git a/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.spec.ts b/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.spec.ts new file mode 100644 index 0000000000..85605b90a1 --- /dev/null +++ b/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.spec.ts @@ -0,0 +1,84 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; + +import { ConfigureEnumPopupComponent } from "./configure-enum-popup.component"; +import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; +import { ConfigurableEnum } from "../configurable-enum"; +import { EntityMapperService } from "../../entity/entity-mapper.service"; +import { EMPTY } from "rxjs"; +import { FontAwesomeTestingModule } from "@fortawesome/angular-fontawesome/testing"; +import { + mockEntityMapper, + MockEntityMapperService, +} from "../../entity/mock-entity-mapper-service"; +import { genders } from "../../../child-dev-project/children/model/genders"; +import { Child } from "../../../child-dev-project/children/model/child"; +import { ConfirmationDialogService } from "../../confirmation-dialog/confirmation-dialog.service"; +import { + entityRegistry, + EntityRegistry, +} from "../../entity/database-entity.decorator"; + +describe("ConfigureEnumPopupComponent", () => { + let component: ConfigureEnumPopupComponent; + let fixture: ComponentFixture<ConfigureEnumPopupComponent>; + let entityMapper: MockEntityMapperService; + + beforeEach(async () => { + entityMapper = mockEntityMapper(); + await TestBed.configureTestingModule({ + imports: [ConfigureEnumPopupComponent, FontAwesomeTestingModule], + providers: [ + { provide: MAT_DIALOG_DATA, useValue: new ConfigurableEnum() }, + { provide: MatDialogRef, useValue: { afterClosed: () => EMPTY } }, + { provide: EntityMapperService, useValue: entityMapper }, + { provide: EntityRegistry, useValue: entityRegistry }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(ConfigureEnumPopupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); + + it("should show a popup if user tries to delete an enum that is still in use", async () => { + component.enumEntity = new ConfigurableEnum("genders"); + component.enumEntity.values = genders; + const male = genders.find((g) => g.id === "M"); + const female = genders.find((g) => g.id === "F"); + const m1 = new Child(); + m1.gender = male; + const m2 = new Child(); + m2.gender = male; + const f1 = new Child(); + f1.gender = female; + const other = new Child(); + entityMapper.addAll([m1, m2, f1, other]); + const confirmationSpy = spyOn( + TestBed.inject(ConfirmationDialogService), + "getConfirmation" + ); + + await component.delete(male, genders.indexOf(male)); + + expect(confirmationSpy).toHaveBeenCalledWith( + "Delete option", + jasmine.stringContaining( + `The option is still used in 2 ${Child.label} records.` + ) + ); + + entityMapper.delete(m1); + entityMapper.delete(m2); + + await component.delete(male, genders.indexOf(male)); + + expect(confirmationSpy).toHaveBeenCalledWith( + "Delete option", + `Are you sure that you want to delete the option "${male.label}"?` + ); + }); +}); diff --git a/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts b/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts new file mode 100644 index 0000000000..479cbf662c --- /dev/null +++ b/src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts @@ -0,0 +1,124 @@ +import { Component, Inject } from "@angular/core"; +import { + MAT_DIALOG_DATA, + MatDialogModule, + MatDialogRef, +} from "@angular/material/dialog"; +import { ConfigurableEnum } from "../configurable-enum"; +import { NgForOf } from "@angular/common"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatInputModule } from "@angular/material/input"; +import { FormsModule } from "@angular/forms"; +import { DialogCloseComponent } from "../../common-components/dialog-close/dialog-close.component"; +import { EntityMapperService } from "../../entity/entity-mapper.service"; +import { + CdkDrag, + CdkDragDrop, + CdkDropList, + moveItemInArray, +} from "@angular/cdk/drag-drop"; +import { FontAwesomeModule } from "@fortawesome/angular-fontawesome"; +import { ConfigurableEnumValue } from "../configurable-enum.interface"; +import { MatButtonModule } from "@angular/material/button"; +import { ConfirmationDialogService } from "../../confirmation-dialog/confirmation-dialog.service"; +import { EntityRegistry } from "../../entity/database-entity.decorator"; +import { Entity } from "../../entity/model/entity"; + +@Component({ + selector: "app-configure-enum-popup", + templateUrl: "./configure-enum-popup.component.html", + styleUrls: ["./configure-enum-popup.component.scss"], + imports: [ + MatDialogModule, + NgForOf, + MatFormFieldModule, + MatInputModule, + DialogCloseComponent, + FormsModule, + CdkDropList, + CdkDrag, + FontAwesomeModule, + MatButtonModule, + ], + standalone: true, +}) +export class ConfigureEnumPopupComponent { + constructor( + @Inject(MAT_DIALOG_DATA) public enumEntity: ConfigurableEnum, + private dialog: MatDialogRef<ConfigureEnumPopupComponent>, + private entityMapper: EntityMapperService, + private confirmationService: ConfirmationDialogService, + private entities: EntityRegistry + ) { + this.dialog + .afterClosed() + .subscribe(() => this.entityMapper.save(this.enumEntity)); + } + + drop(event: CdkDragDrop<string[]>) { + moveItemInArray( + this.enumEntity.values, + event.previousIndex, + event.currentIndex + ); + } + + async delete(value: ConfigurableEnumValue, index: number) { + const existingUsages = await this.getUsages(value); + let deletionText = $localize`Are you sure that you want to delete the option "${value.label}"?`; + if (existingUsages.length > 0) { + deletionText += $localize` The option is still used in ${existingUsages.join( + ", " + )} records. If deleted, the records will not be lost but specially marked.`; + } + const confirmed = await this.confirmationService.getConfirmation( + $localize`Delete option`, + deletionText + ); + if (confirmed) { + this.enumEntity.values.splice(index, 1); + await this.entityMapper.save(this.enumEntity); + } + } + + private async getUsages(value: ConfigurableEnumValue) { + const enumMap: { [key in string]: string[] } = {}; + for (const entity of this.entities.values()) { + const schemaFields = [...entity.schema.entries()] + .filter( + ([_, schema]) => + schema.innerDataType === this.enumEntity.getId() || + schema.additional === this.enumEntity.getId() + ) + .map(([name]) => name); + if (schemaFields.length > 0) { + enumMap[entity.ENTITY_TYPE] = schemaFields; + } + } + const entityPromises = Object.entries(enumMap).map(([entityType, props]) => + this.entityMapper + .loadType(entityType) + .then((entities) => this.getEntitiesWithValue(entities, props, value)) + ); + const possibleEntities = await Promise.all(entityPromises); + return possibleEntities + .filter((entities) => entities.length > 0) + .map( + (entities) => `${entities.length} ${entities[0].getConstructor().label}` + ); + } + + private getEntitiesWithValue( + res: Entity[], + props: string[], + value: ConfigurableEnumValue + ) { + return res.filter((entity) => + props.some( + (prop) => + entity[prop]?.id === value?.id || + entity[prop]?.map?.((v) => v.id).includes(value.id) + ) + ); + } +} diff --git a/src/app/core/configurable-enum/demo-configurable-enum-generator.service.ts b/src/app/core/configurable-enum/demo-configurable-enum-generator.service.ts new file mode 100644 index 0000000000..268ecaba27 --- /dev/null +++ b/src/app/core/configurable-enum/demo-configurable-enum-generator.service.ts @@ -0,0 +1,20 @@ +import { Injectable } from "@angular/core"; +import { DemoDataGenerator } from "../demo-data/demo-data-generator"; +import { ConfigurableEnum } from "./configurable-enum"; +import { demoEnums } from "./configurable-enum-testing"; + +@Injectable() +export class DemoConfigurableEnumGeneratorService extends DemoDataGenerator<ConfigurableEnum> { + static provider() { + return [ + { + provide: DemoConfigurableEnumGeneratorService, + useClass: DemoConfigurableEnumGeneratorService, + }, + ]; + } + + protected generateEntities(): ConfigurableEnum[] { + return demoEnums; + } +} diff --git a/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.html b/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.html new file mode 100644 index 0000000000..ba203de7e2 --- /dev/null +++ b/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.html @@ -0,0 +1,8 @@ +<ng-container *ngFor="let val of iterableValue; let i = index"> + <span + [style.background-color]="val.color" + [ngClass]="{ colored: val.color }" + >{{ val.label }}</span + > + <ng-container *ngIf="i !== iterableValue.length - 1">, </ng-container> +</ng-container> diff --git a/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.scss b/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.scss new file mode 100644 index 0000000000..6ca1460f59 --- /dev/null +++ b/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.scss @@ -0,0 +1,4 @@ +.colored { + padding: 5px; + border-radius: 4px; +} diff --git a/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.spec.ts b/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.spec.ts index fea9a5b0ce..7ec79b0531 100644 --- a/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.spec.ts +++ b/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.spec.ts @@ -1,7 +1,5 @@ import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; import { DisplayConfigurableEnumComponent } from "./display-configurable-enum.component"; -import { Note } from "../../../child-dev-project/notes/model/note"; -import { Ordering } from "../configurable-enum-ordering"; describe("DisplayConfigurableEnumComponent", () => { let component: DisplayConfigurableEnumComponent; @@ -16,35 +14,13 @@ describe("DisplayConfigurableEnumComponent", () => { beforeEach(() => { fixture = TestBed.createComponent(DisplayConfigurableEnumComponent); component = fixture.componentInstance; - component.value = { id: "testCategory", label: "Test Category" }; + component.onInitFromDynamicConfig({ + value: { id: "testCategory", label: "Test Category" }, + } as any); fixture.detectChanges(); }); it("should create", () => { expect(component).toBeTruthy(); }); - - it("displays value's label", () => { - expect(fixture.debugElement.nativeElement.innerHTML).toBe("Test Category"); - }); - - it("should use the background color is available", () => { - const elem = fixture.debugElement.nativeElement; - expect(elem.style["background-color"]).toBe(""); - - const value: Ordering.EnumValue = { - label: "withColor", - id: "WITH_COLOR", - color: "black", - _ordinal: 1, - }; - const entity = new Note(); - entity.warningLevel = value; - component.onInitFromDynamicConfig({ id: "warningLevel", entity, value }); - fixture.detectChanges(); - - expect(elem.style["background-color"]).toBe("black"); - expect(elem.style.padding).toBe("5px"); - expect(elem.style["border-radius"]).toBe("4px"); - }); }); diff --git a/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.ts b/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.ts index 157fb7c21c..f2970718bc 100644 --- a/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.ts +++ b/src/app/core/configurable-enum/display-configurable-enum/display-configurable-enum.component.ts @@ -1,8 +1,9 @@ -import { Component, HostBinding } from "@angular/core"; +import { Component } from "@angular/core"; import { ViewPropertyConfig } from "app/core/entity-components/entity-list/EntityListConfig"; import { ViewDirective } from "../../entity-components/entity-utils/view-components/view.directive"; import { DynamicComponent } from "../../view/dynamic-components/dynamic-component.decorator"; import { ConfigurableEnumValue } from "../configurable-enum.interface"; +import { NgClass, NgForOf, NgIf } from "@angular/common"; /** * This component displays a {@link ConfigurableEnumValue} as text. @@ -11,20 +12,22 @@ import { ConfigurableEnumValue } from "../configurable-enum.interface"; @DynamicComponent("DisplayConfigurableEnum") @Component({ selector: "app-display-configurable-enum", - template: `{{ value?.label }}`, + templateUrl: "./display-configurable-enum.component.html", + styleUrls: ["./display-configurable-enum.component.scss"], standalone: true, + imports: [NgForOf, NgIf, NgClass], }) -export class DisplayConfigurableEnumComponent extends ViewDirective<ConfigurableEnumValue> { - @HostBinding("style.background-color") private style; - @HostBinding("style.padding") private padding; - @HostBinding("style.border-radius") private radius; +export class DisplayConfigurableEnumComponent extends ViewDirective< + ConfigurableEnumValue | ConfigurableEnumValue[] +> { + iterableValue: ConfigurableEnumValue[] = []; onInitFromDynamicConfig(config: ViewPropertyConfig) { super.onInitFromDynamicConfig(config); - if (this.value?.color) { - this.style = this.value.color; - this.padding = "5px"; - this.radius = "4px"; + if (Array.isArray(this.value)) { + this.iterableValue = this.value; + } else if (this.value) { + this.iterableValue = [this.value]; } } } diff --git a/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.html b/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.html index a09e5d1b12..be688f4c0a 100644 --- a/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.html +++ b/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.html @@ -1,24 +1,7 @@ -<mat-form-field [formGroup]="parent"> - <mat-label> - {{ label }} - </mat-label> - <mat-select - [formControlName]="formControlName" - [multiple]="multi" - [compareWith]="compareFun" - > - <mat-option *appConfigurableEnum="let o of enumId" [value]="o"> - {{ o.label }} - </mat-option> - - <mat-option *ngFor="let o of invalidOptions" [value]="o"> - {{ o.label }} - </mat-option> - </mat-select> - <mat-error - *ngIf="formControl.errors?.required" - i18n="Error message for any input" - > - This field is required - </mat-error> -</mat-form-field> +<app-enum-dropdown + [form]="formControl" + [label]="label" + [enumId]="enumId" + [multi]="multi" +> +</app-enum-dropdown> diff --git a/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.spec.ts b/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.spec.ts index bb791c4bef..0a95a64516 100644 --- a/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.spec.ts +++ b/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.spec.ts @@ -1,61 +1,33 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { EditConfigurableEnumComponent } from "./edit-configurable-enum.component"; -import { FormBuilder, FormControl, ReactiveFormsModule } from "@angular/forms"; -import { NoopAnimationsModule } from "@angular/platform-browser/animations"; -import { ConfigService } from "../../config/config.service"; -import { DatabaseEntity } from "../../entity/database-entity.decorator"; -import { DatabaseField } from "../../entity/database-field.decorator"; +import { FormControl, FormGroup } from "@angular/forms"; +import { MockedTestingModule } from "../../../utils/mocked-testing.module"; +import { EntitySchemaField } from "../../entity/schema/entity-schema-field"; import { Entity } from "../../entity/model/entity"; -import { ConfigurableEnumValue } from "../configurable-enum.interface"; +import { ConfigurableEnumService } from "../configurable-enum.service"; +import { ConfigurableEnum } from "../configurable-enum"; describe("EditConfigurableEnumComponent", () => { let component: EditConfigurableEnumComponent; let fixture: ComponentFixture<EditConfigurableEnumComponent>; - let mockConfigService: jasmine.SpyObj<ConfigService>; - const testEnum: ConfigurableEnumValue[] = [ - { id: "1", label: "option-1" }, - { id: "2", label: "option-2" }, - ]; - - @DatabaseEntity("EditEnumTest") - class EditEnumTest extends Entity { - @DatabaseField({ dataType: "configurable-enum", additional: "test-enum" }) - enum: ConfigurableEnumValue; - - @DatabaseField({ - dataType: "array", - innerDataType: "configurable-enum", - additional: "test-enum", - }) - enumMulti: ConfigurableEnumValue[]; - } - - let testFormGroup; - beforeEach(async () => { - testFormGroup = new FormBuilder().group({ - enum: new FormControl(), - enumMulti: new FormControl(), - }); - - mockConfigService = jasmine.createSpyObj(["getConfig"]); - mockConfigService.getConfig.and.returnValue(testEnum); await TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule, - ReactiveFormsModule, - EditConfigurableEnumComponent, + imports: [EditConfigurableEnumComponent, MockedTestingModule.withState()], + providers: [ + { + provide: ConfigurableEnumService, + useValue: { getEnum: () => new ConfigurableEnum() }, + }, ], - providers: [{ provide: ConfigService, useValue: mockConfigService }], }).compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(EditConfigurableEnumComponent); component = fixture.componentInstance; - initForEntity(new EditEnumTest(), "enum"); + initWithSchema({ innerDataType: "some-id" }); fixture.detectChanges(); }); @@ -63,37 +35,29 @@ describe("EditConfigurableEnumComponent", () => { expect(component).toBeTruthy(); }); - it("should add [invalid option] option from entity if given", () => { - const testEntity = new EditEnumTest(); - const invalidOption = { - id: "INVALID", - isInvalidOption: true, - label: "[invalid option] INVALID", - }; - const invalid2 = { - id: "X2", - isInvalidOption: true, - label: "[invalid option] X2", - }; - - testEntity.enum = invalidOption; - initForEntity(testEntity, "enum"); - expect(component.invalidOptions).toEqual([invalidOption]); + it("should extract the enum ID", () => { + initWithSchema({ innerDataType: "some-id" }); + expect(component.enumId).toBe("some-id"); - testEntity.enumMulti = [invalidOption, invalid2]; - initForEntity(testEntity, "enumMulti"); - expect(component.invalidOptions).toEqual([invalidOption, invalid2]); + initWithSchema({ dataType: "array", additional: "other-id" }); + expect(component.enumId).toBe("other-id"); }); - function initForEntity(entity: EditEnumTest, field: "enum" | "enumMulti") { - const formControl = testFormGroup.controls[field]; - formControl.setValue(entity[field]); + it("should detect multi selection mode", () => { + initWithSchema({ innerDataType: "some-id" }); + expect(component.multi).toBeFalse(); + + initWithSchema({ dataType: "array", additional: "some-id" }); + expect(component.multi).toBeTrue(); + }); + function initWithSchema(schema: EntitySchemaField) { + const fromGroup = new FormGroup({ test: new FormControl() }); component.onInitFromDynamicConfig({ - formControl: formControl, - formFieldConfig: { id: field }, - propertySchema: entity.getSchema().get(field), - entity: entity, + formControl: fromGroup.get("test"), + formFieldConfig: { id: "test" }, + propertySchema: schema, + entity: new Entity(), }); } }); diff --git a/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.ts b/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.ts index cfe6ed6795..fe86c25714 100644 --- a/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.ts +++ b/src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.ts @@ -6,12 +6,12 @@ import { import { ConfigurableEnumValue } from "../configurable-enum.interface"; import { DynamicComponent } from "../../view/dynamic-components/dynamic-component.decorator"; import { arrayEntitySchemaDatatype } from "../../entity/schema-datatypes/datatype-array"; -import { compareEnums } from "../../../utils/utils"; import { MatFormFieldModule } from "@angular/material/form-field"; import { ReactiveFormsModule } from "@angular/forms"; import { MatSelectModule } from "@angular/material/select"; import { ConfigurableEnumDirective } from "../configurable-enum-directive/configurable-enum.directive"; -import { NgForOf, NgIf } from "@angular/common"; +import { NgIf } from "@angular/common"; +import { EnumDropdownComponent } from "../enum-dropdown/enum-dropdown.component"; @DynamicComponent("EditConfigurableEnum") @Component({ @@ -23,15 +23,13 @@ import { NgForOf, NgIf } from "@angular/common"; MatSelectModule, ConfigurableEnumDirective, NgIf, - NgForOf, + EnumDropdownComponent, ], standalone: true, }) export class EditConfigurableEnumComponent extends EditComponent<ConfigurableEnumValue> { enumId: string; multi = false; - compareFun = compareEnums; - invalidOptions: ConfigurableEnumValue[] = []; onInitFromDynamicConfig(config: EditPropertyConfig<ConfigurableEnumValue>) { super.onInitFromDynamicConfig(config); @@ -42,20 +40,5 @@ export class EditConfigurableEnumComponent extends EditComponent<ConfigurableEnu config.formFieldConfig.additional || config.propertySchema.additional || config.propertySchema.innerDataType; - - this.invalidOptions = this.prepareInvalidOptions(); - } - - private prepareInvalidOptions(): ConfigurableEnumValue[] { - let additionalOptions; - if (!this.multi && this.formControl.value?.isInvalidOption) { - additionalOptions = [this.formControl.value]; - } - if (this.multi) { - additionalOptions = this.formControl.value?.filter( - (o) => o.isInvalidOption - ); - } - return additionalOptions ?? []; } } diff --git a/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.html b/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.html new file mode 100644 index 0000000000..031d7ada0c --- /dev/null +++ b/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.html @@ -0,0 +1,30 @@ +<mat-form-field> + <mat-label>{{label}}</mat-label> + <app-basic-autocomplete + #autocomplete + [formControl]="form" + [multi]="multi" + [options]="options" + [optionToString]="enumValueToString" + [createOption]="createNewOption" + > + <ng-template let-item>{{ item.label }}</ng-template> + </app-basic-autocomplete> + <fa-icon + *ngIf="form.enabled && !!createNewOption" + icon="wrench" + class="caret-suffix" + matSuffix + (click)="openSettings($event)" + ></fa-icon> + <fa-icon + *ngIf="form.enabled" + icon="caret-down" + class="caret-suffix" + (click)="autocomplete.showAutocomplete()" + matSuffix + ></fa-icon> + <mat-error *ngIf="form.errors"> + <app-error-hint [form]="form"></app-error-hint> + </mat-error> +</mat-form-field> diff --git a/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.scss b/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.scss new file mode 100644 index 0000000000..58e875b11c --- /dev/null +++ b/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.scss @@ -0,0 +1,6 @@ +@use "src/styles/variables/sizes"; + +.caret-suffix { + cursor: pointer; + padding: 0 sizes.$small; +} diff --git a/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.spec.ts b/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.spec.ts new file mode 100644 index 0000000000..a43a931483 --- /dev/null +++ b/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.spec.ts @@ -0,0 +1,117 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; + +import { EnumDropdownComponent } from "./enum-dropdown.component"; +import { FormControl } from "@angular/forms"; +import { SimpleChange } from "@angular/core"; +import { ConfigurableEnumService } from "../configurable-enum.service"; +import { ConfigurableEnum } from "../configurable-enum"; +import { MockedTestingModule } from "../../../utils/mocked-testing.module"; +import { EntityMapperService } from "../../entity/entity-mapper.service"; +import { MatDialog } from "@angular/material/dialog"; +import { of } from "rxjs"; + +describe("EnumDropdownComponent", () => { + let component: EnumDropdownComponent; + let fixture: ComponentFixture<EnumDropdownComponent>; + let mockDialog: jasmine.SpyObj<MatDialog>; + beforeEach(async () => { + mockDialog = jasmine.createSpyObj(["open"]); + await TestBed.configureTestingModule({ + imports: [EnumDropdownComponent, MockedTestingModule.withState()], + providers: [ + { + provide: ConfigurableEnumService, + useValue: { getEnum: () => new ConfigurableEnum() }, + }, + { provide: MatDialog, useValue: mockDialog }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(EnumDropdownComponent); + component = fixture.componentInstance; + + component.form = new FormControl(); + component.enumId = "test-enum"; + component.ngOnChanges({ + form: new SimpleChange(null, component.form, true), + enumId: new SimpleChange(null, component.enumId, true), + }); + + fixture.detectChanges(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); + + it("should add [invalid option] option from entity if given", () => { + const invalidOption = { + id: "INVALID", + isInvalidOption: true, + label: "[invalid option] INVALID", + }; + const invalid2 = { + id: "X2", + isInvalidOption: true, + label: "[invalid option] X2", + }; + + component.form = new FormControl(invalidOption); + component.ngOnChanges({ + form: new SimpleChange(null, component.form, false), + }); + expect(component.invalidOptions).toEqual([invalidOption]); + + component.form = new FormControl([invalidOption, invalid2]); + component.multi = true; + component.ngOnChanges({ + form: new SimpleChange(null, component.form, false), + }); + expect(component.invalidOptions).toEqual([invalidOption, invalid2]); + }); + + it("should extend the existing enum with the new option", () => { + const saveSpy = spyOn(TestBed.inject(EntityMapperService), "save"); + const enumEntity = new ConfigurableEnum(); + enumEntity.values = [{ id: "1", label: "first" }]; + component.enumEntity = enumEntity; + + const res = component.createNewOption("second"); + + expect(res).toEqual({ id: "second", label: "second" }); + expect(enumEntity.values).toEqual([ + { id: "1", label: "first" }, + { id: "second", label: "second" }, + ]); + expect(saveSpy).toHaveBeenCalledWith(enumEntity); + }); + + it("should open the configure enum dialog and re-initialize the available options afterwards", () => { + component.enumEntity = new ConfigurableEnum(); + component.enumEntity.values = [{ id: "1", label: "1" }]; + component.form = new FormControl({ + id: "a", + label: "a", + isInvalidOption: true, + }); + + component.ngOnChanges({ form: true } as any); + + expect(component.options).toEqual([ + { id: "1", label: "1" }, + { id: "a", label: "a", isInvalidOption: true }, + ]); + + mockDialog.open.and.returnValue({ afterClosed: () => of({}) } as any); + component.enumEntity.values.push({ id: "2", label: "2" }); + + component.openSettings({ stopPropagation: () => {} } as any); + + expect(mockDialog.open).toHaveBeenCalled(); + expect(component.options).toEqual([ + { id: "1", label: "1" }, + { id: "2", label: "2" }, + { id: "a", label: "a", isInvalidOption: true }, + ]); + }); +}); diff --git a/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.ts b/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.ts new file mode 100644 index 0000000000..31adbc342a --- /dev/null +++ b/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.component.ts @@ -0,0 +1,95 @@ +import { Component, Input, OnChanges, SimpleChanges } from "@angular/core"; +import { MatSelectModule } from "@angular/material/select"; +import { FormControl, ReactiveFormsModule } from "@angular/forms"; +import { ConfigurableEnumDirective } from "../configurable-enum-directive/configurable-enum.directive"; +import { NgForOf, NgIf } from "@angular/common"; +import { ConfigurableEnumValue } from "../configurable-enum.interface"; +import { BasicAutocompleteComponent } from "../basic-autocomplete/basic-autocomplete.component"; +import { ConfigurableEnumService } from "../configurable-enum.service"; +import { EntityMapperService } from "../../entity/entity-mapper.service"; +import { ConfigurableEnum } from "../configurable-enum"; +import { EntityAbility } from "../../permissions/ability/entity-ability"; +import { MatDialog } from "@angular/material/dialog"; +import { ConfigureEnumPopupComponent } from "../configure-enum-popup/configure-enum-popup.component"; +import { FontAwesomeModule } from "@fortawesome/angular-fontawesome"; +import { ErrorHintComponent } from "../../entity-components/entity-utils/error-hint/error-hint.component"; + +@Component({ + selector: "app-enum-dropdown", + templateUrl: "./enum-dropdown.component.html", + styleUrls: ["./enum-dropdown.component.scss"], + standalone: true, + imports: [ + MatSelectModule, + ReactiveFormsModule, + ConfigurableEnumDirective, + NgIf, + NgForOf, + BasicAutocompleteComponent, + FontAwesomeModule, + ErrorHintComponent, + ], +}) +export class EnumDropdownComponent implements OnChanges { + @Input() form: FormControl; // cannot be named "formControl" - otherwise the angular directive grabs this + @Input() label: string; + @Input() enumId: string; + @Input() multi = false; + + enumEntity: ConfigurableEnum; + invalidOptions: ConfigurableEnumValue[] = []; + options: ConfigurableEnumValue[]; + canEdit = false; + enumValueToString = (v: ConfigurableEnumValue) => v?.label; + createNewOption: (input: string) => ConfigurableEnumValue; + + constructor( + private enumService: ConfigurableEnumService, + private entityMapper: EntityMapperService, + private ability: EntityAbility, + private dialog: MatDialog + ) {} + + ngOnChanges(changes: SimpleChanges): void { + if (changes.hasOwnProperty("enumId")) { + this.enumEntity = this.enumService.getEnum(this.enumId); + this.canEdit = this.ability.can("update", this.enumEntity); + if (this.canEdit) { + this.createNewOption = this.addNewOption.bind(this); + } + } + if (changes.hasOwnProperty("enumId") || changes.hasOwnProperty("form")) { + this.invalidOptions = this.prepareInvalidOptions(); + } + this.options = [...this.enumEntity.values, ...this.invalidOptions]; + } + + private prepareInvalidOptions(): ConfigurableEnumValue[] { + let additionalOptions; + if (!this.multi && this.form.value?.isInvalidOption) { + additionalOptions = [this.form.value]; + } + if (this.multi) { + additionalOptions = this.form.value?.filter((o) => o.isInvalidOption); + } + return additionalOptions ?? []; + } + + private addNewOption(name: string) { + const option = { id: name, label: name }; + this.enumEntity.values.push(option); + this.entityMapper.save(this.enumEntity); + return option; + } + + openSettings(event: Event) { + event.stopPropagation(); + this.dialog + .open(ConfigureEnumPopupComponent, { data: this.enumEntity }) + .afterClosed() + .subscribe( + () => + (this.options = [...this.enumEntity.values, ...this.invalidOptions]) + ); + } +} diff --git a/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.stories.ts b/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.stories.ts new file mode 100644 index 0000000000..c163aa02da --- /dev/null +++ b/src/app/core/configurable-enum/enum-dropdown/enum-dropdown.stories.ts @@ -0,0 +1,64 @@ +import { Meta, Story } from "@storybook/angular/types-6-0"; +import { moduleMetadata } from "@storybook/angular"; +import { StorybookBaseModule } from "../../../utils/storybook-base.module"; +import { EnumDropdownComponent } from "./enum-dropdown.component"; +import { FormControl } from "@angular/forms"; +import { centersUnique } from "../../../child-dev-project/children/demo-data-generators/fixtures/centers"; +import { EntityMapperService } from "../../entity/entity-mapper.service"; +import { mockEntityMapper } from "../../entity/mock-entity-mapper-service"; +import { ConfigurableEnum } from "../configurable-enum"; +import { ConfigurableEnumService } from "../configurable-enum.service"; + +const centerEnum = Object.assign(new ConfigurableEnum("center"), { + values: centersUnique, +}); + +export default { + title: "Core/EntityComponents/Entity Property Fields/Enum Dropdown", + component: EnumDropdownComponent, + decorators: [ + moduleMetadata({ + imports: [EnumDropdownComponent, StorybookBaseModule], + providers: [ + { + provide: EntityMapperService, + useValue: mockEntityMapper([centerEnum]), + }, + { + provide: ConfigurableEnumService, + useValue: { getEnum: () => centerEnum }, + }, + ], + }), + ], +} as Meta; + +const Template: Story<EnumDropdownComponent> = ( + args: EnumDropdownComponent +) => ({ + props: args, +}); + +export const Primary = Template.bind({}); +Primary.args = { + form: new FormControl(""), + label: "test field", + enumId: "center", +}; + +const disabledControl = new FormControl(centersUnique[0]); +disabledControl.disable(); +export const Disabled = Template.bind({}); +Disabled.args = { + form: disabledControl, + label: "test field", + enumId: "center", +}; + +export const Multi = Template.bind({}); +Multi.args = { + form: new FormControl([centersUnique[0], centersUnique[2]]), + label: "test field", + enumId: "center", + multi: true, +}; diff --git a/src/app/core/demo-data/demo-data.module.ts b/src/app/core/demo-data/demo-data.module.ts index 808204dbd2..3abd466245 100644 --- a/src/app/core/demo-data/demo-data.module.ts +++ b/src/app/core/demo-data/demo-data.module.ts @@ -36,11 +36,15 @@ import { DemoUserGeneratorService } from "../user/demo-user-generator.service"; import { DemoHistoricalDataGenerator } from "../../features/historical-data/demo-historical-data-generator"; import { DemoPermissionGeneratorService } from "../permissions/demo-permission-generator.service"; import { DemoTodoGeneratorService } from "../../features/todos/model/demo-todo-generator.service"; +import { DemoConfigurableEnumGeneratorService } from "../configurable-enum/demo-configurable-enum-generator.service"; import { DemoPublicFormGeneratorService } from "../../features/public-form/demo-public-form-generator.service"; const demoDataGeneratorProviders = [ + ...DemoPermissionGeneratorService.provider(), ...DemoPublicFormGeneratorService.provider(), ...DemoConfigGeneratorService.provider(), + ...DemoUserGeneratorService.provider(), + ...DemoConfigurableEnumGeneratorService.provider(), ...DemoChildGenerator.provider({ count: 120 }), ...DemoSchoolGenerator.provider({ count: 8 }), ...DemoChildSchoolRelationGenerator.provider(), @@ -58,12 +62,10 @@ const demoDataGeneratorProviders = [ }), ...DemoHealthCheckGeneratorService.provider(), ...DemoProgressDashboardWidgetGeneratorService.provider(), - ...DemoUserGeneratorService.provider(), ...DemoHistoricalDataGenerator.provider({ minCountAttributes: 2, maxCountAttributes: 5, }), - ...DemoPermissionGeneratorService.provider(), ...DemoTodoGeneratorService.provider(), ]; diff --git a/src/app/core/demo-data/demo-data.service.ts b/src/app/core/demo-data/demo-data.service.ts index 62b7bb017d..90e07958e8 100644 --- a/src/app/core/demo-data/demo-data.service.ts +++ b/src/app/core/demo-data/demo-data.service.ts @@ -38,11 +38,8 @@ export class DemoDataServiceConfig { * * This may also include providers for services a DemoDataGenerator depends on. */ - dataGeneratorProviders: ( - | ValueProvider - | ClassProvider - | FactoryProvider - )[] = []; + dataGeneratorProviders: (ValueProvider | ClassProvider | FactoryProvider)[] = + []; } /** diff --git a/src/app/core/entity-components/entity-list/entity-list.component.spec.ts b/src/app/core/entity-components/entity-list/entity-list.component.spec.ts index 02409d4aeb..f28da23f9a 100644 --- a/src/app/core/entity-components/entity-list/entity-list.component.spec.ts +++ b/src/app/core/entity-components/entity-list/entity-list.component.spec.ts @@ -131,7 +131,6 @@ describe("EntityListComponent", () => { createComponent(); await initComponentInputs(); expect(component.selectedColumnGroupIndex).toBe(1); - console.log("component groups", component.columnGroups); const tabGroup = await loader.getHarness(MatTabGroupHarness); const groups = await tabGroup.getTabs(); diff --git a/src/app/core/entity-components/entity-list/filter-generator.service.ts b/src/app/core/entity-components/entity-list/filter-generator.service.ts index c19dc34f16..49cf21f1df 100644 --- a/src/app/core/entity-components/entity-list/filter-generator.service.ts +++ b/src/app/core/entity-components/entity-list/filter-generator.service.ts @@ -9,20 +9,20 @@ import { PrebuiltFilterConfig, } from "./EntityListConfig"; import { Entity, EntityConstructor } from "../../entity/model/entity"; -import { ConfigService } from "../../config/config.service"; import { LoggingService } from "../../logging/logging.service"; import { EntitySchemaField } from "../../entity/schema/entity-schema-field"; import { FilterComponentSettings } from "./filter-component.settings"; import { EntityMapperService } from "../../entity/entity-mapper.service"; import { EntityRegistry } from "../../entity/database-entity.decorator"; import { FilterService } from "../../filter/filter.service"; +import { ConfigurableEnumService } from "../../configurable-enum/configurable-enum.service"; @Injectable({ providedIn: "root", }) export class FilterGeneratorService { constructor( - private configService: ConfigService, + private enumService: ConfigurableEnumService, private loggingService: LoggingService, private entities: EntityRegistry, private entityMapperService: EntityMapperService, @@ -141,7 +141,7 @@ export class FilterGeneratorService { }, ]; - const enumValues = this.configService.getConfigurableEnumValues(enumId); + const enumValues = this.enumService.getEnumValues(enumId); const key = property + ".id"; for (const enumValue of enumValues) { diff --git a/src/app/core/entity-components/entity-select/edit-entity-array/entity-reference-array.stories.ts b/src/app/core/entity-components/entity-select/edit-entity-array/entity-reference-array.stories.ts index 5a44e82f90..26ce68a0ea 100644 --- a/src/app/core/entity-components/entity-select/edit-entity-array/entity-reference-array.stories.ts +++ b/src/app/core/entity-components/entity-select/edit-entity-array/entity-reference-array.stories.ts @@ -5,7 +5,7 @@ import { EntityFormComponent } from "../../entity-form/entity-form/entity-form.c import { FormFieldConfig } from "../../entity-form/entity-form/FormConfig"; import { EntityMapperService } from "../../../entity/entity-mapper.service"; import { - entityFormStorybookDefaulParameters, + entityFormStorybookDefaultParameters, StorybookBaseModule, } from "../../../../utils/storybook-base.module"; import { DatabaseEntity } from "../../../entity/database-entity.decorator"; @@ -24,10 +24,7 @@ export default { component: EntityFormComponent, decorators: [ moduleMetadata({ - imports: [ - EntityFormComponent, - StorybookBaseModule, - ], + imports: [EntityFormComponent, StorybookBaseModule], providers: [ EntitySchemaService, { @@ -37,7 +34,7 @@ export default { ], }), ], - parameters: entityFormStorybookDefaulParameters, + parameters: entityFormStorybookDefaultParameters, } as Meta; const Template: Story<EntityFormComponent> = (args: EntityFormComponent) => ({ diff --git a/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.html b/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.html index 9baf974579..2036d46527 100644 --- a/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.html +++ b/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.html @@ -1,64 +1,23 @@ -<mat-form-field [formGroup]="parent" floatLabel="always"> - <!-- - This input contains the actual value, i.e. the id of the entity. - It is filled in automatically in code after the user has chosen a correct value. - - We also set floatLabel to always because the label is attached to the wrong input - --> - <input matInput [formControl]="formControl" hidden/> - <mat-label>{{ label }}</mat-label> - - <app-display-entity - class="block-wrapper" - [entityToDisplay]="selectedEntity" - *ngIf="selectedEntity && formControl.disabled" - ></app-display-entity> - <!-- - This input contains the display value (i.e. the value that the user chooses and sees when he clicks 'update') - Which is the name of the entity in many cases. - --> - <input - #inputElement - matInput - [placeholder]="placeholder" - [disabled]="formControl.disabled" - [hidden]="formControl.disabled" - [matAutocomplete]="autoSuggestions" - #trigger=matAutocompleteTrigger - [value]="selectedEntity?.toString()" - (keyup)="updateAutocomplete(inputElement.value)" - (focusin)="updateAutocomplete('')" - (focusout)="select(inputElement.value)" - /> - <button - mat-icon-button matIconSuffix type="button" - (click)="updateAutocomplete(''); trigger.openPanel()" +<mat-form-field> + <mat-label>{{label}}</mat-label> + <app-basic-autocomplete + #autocomplete + [formControl]="formControl" + [options]="entities" + [valueMapper]="entityToId" > - <fa-icon icon="caret-down"></fa-icon> - </button> - - <mat-autocomplete - #autoSuggestions="matAutocomplete" - (optionSelected)="select($event.option.value)" - autoActiveFirstOption - > - <!-- Optional header --> - <ng-content select="mat-option"></ng-content> - <mat-option - *ngFor="let entity of autocompleteEntities | async" - [value]="entity" - > + <ng-template let-item> <app-display-entity - [entityToDisplay]="entity" + [entityToDisplay]="item" [linkDisabled]="true" ></app-display-entity> - </mat-option> - </mat-autocomplete> - - <mat-error - *ngIf="formControl.hasError('required')" - i18n="Error message for any input" - > - This field is required - </mat-error> + </ng-template> + </app-basic-autocomplete> + <fa-icon + *ngIf="formControl.enabled" + icon="caret-down" + class="caret-suffix" + (click)="autocomplete.showAutocomplete()" + matSuffix + ></fa-icon> </mat-form-field> diff --git a/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.scss b/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.scss index b1387128db..d038e23e96 100644 --- a/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.scss +++ b/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.scss @@ -1,5 +1,11 @@ @use "../../entity-utils/common-styles" as *; +@use "src/styles/variables/sizes"; .block-wrapper { @include entity-block-border; } + +.caret-suffix { + cursor: pointer; + padding: 0 sizes.$small; +} diff --git a/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.spec.ts b/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.spec.ts index 99e42eec90..c02fd0720c 100644 --- a/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.spec.ts +++ b/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.spec.ts @@ -10,7 +10,6 @@ import { EntityMapperService } from "../../../entity/entity-mapper.service"; import { EntityFormService } from "../../entity-form/entity-form.service"; import { ChildSchoolRelation } from "../../../../child-dev-project/children/model/childSchoolRelation"; import { School } from "../../../../child-dev-project/schools/model/school"; -import { Child } from "../../../../child-dev-project/children/model/child"; import { MockedTestingModule } from "../../../../utils/mocked-testing.module"; import { FormControl } from "@angular/forms"; @@ -46,7 +45,7 @@ describe("EditSingleEntityComponent", () => { expect(component).toBeTruthy(); }); - it("should show all entities of the given type", fakeAsync(() => { + it("should load all entities of the given type as options", fakeAsync(() => { const school1 = School.create({ name: "First School" }); const school2 = School.create({ name: "Second School " }); loadTypeSpy.and.resolveTo([school1, school2]); @@ -56,71 +55,8 @@ describe("EditSingleEntityComponent", () => { expect(loadTypeSpy).toHaveBeenCalled(); expect(component.entities).toEqual([school1, school2]); - component.updateAutocomplete(""); - expect(component.autocompleteEntities.value).toEqual([school1, school2]); })); - it("should correctly show the autocomplete values", () => { - const school1 = School.create({ name: "Aaa" }); - const school2 = School.create({ name: "aab" }); - const school3 = School.create({ name: "cde" }); - component.entities = [school1, school2, school3]; - - component.updateAutocomplete(""); - expect(component.autocompleteEntities.value).toEqual([ - school1, - school2, - school3, - ]); - component.updateAutocomplete("Aa"); - expect(component.autocompleteEntities.value).toEqual([school1, school2]); - component.updateAutocomplete("Aab"); - expect(component.autocompleteEntities.value).toEqual([school2]); - }); - - it("should show name of the selected entity", fakeAsync(() => { - const child1 = Child.create("First Child"); - const child2 = Child.create("Second Child"); - component.formControl.setValue(child1.getId()); - loadTypeSpy.and.resolveTo([child1, child2]); - - initComponent(); - tick(); - fixture.detectChanges(); - - expect(component.selectedEntity).toBe(child1); - expect(component.input.nativeElement.value).toEqual("First Child"); - })); - - it("Should have the correct entity selected when it's name is entered", () => { - const child1 = Child.create("First Child"); - const child2 = Child.create("Second Child"); - component.entities = [child1, child2]; - - component.select("First Child"); - - expect(component.selectedEntity).toBe(child1); - expect(component.formControl).toHaveValue(child1.getId()); - }); - - it("Should unselect if no entity can be matched", () => { - const first = Child.create("First"); - const second = Child.create("Second"); - component.entities = [first, second]; - - component.select(first); - expect(component.selectedEntity).toBe(first); - expect(component.formControl.value).toBe(first.getId()); - - component.select("second"); - expect(component.selectedEntity).toBe(second); - expect(component.formControl.value).toBe(second.getId()); - - component.select("NonExistent"); - expect(component.selectedEntity).toBe(undefined); - expect(component.formControl.value).toBe(undefined); - }); - function initComponent(): Promise<any> { return component.onInitFromDynamicConfig({ formFieldConfig: { id: "childId" }, diff --git a/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.ts b/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.ts index 999d4137ef..e77391a831 100644 --- a/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.ts +++ b/src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.ts @@ -1,20 +1,17 @@ -import { Component, ElementRef, ViewChild } from "@angular/core"; +import { Component } from "@angular/core"; import { EditComponent, EditPropertyConfig, } from "../../entity-utils/dynamic-form-components/edit-component"; import { Entity } from "../../../entity/model/entity"; -import { BehaviorSubject } from "rxjs"; import { DynamicComponent } from "../../../view/dynamic-components/dynamic-component.decorator"; import { EntityMapperService } from "../../../entity/entity-mapper.service"; -import { MatFormFieldModule } from "@angular/material/form-field"; -import { ReactiveFormsModule } from "@angular/forms"; -import { MatInputModule } from "@angular/material/input"; import { DisplayEntityComponent } from "../display-entity/display-entity.component"; -import { AsyncPipe, NgForOf, NgIf } from "@angular/common"; -import { MatAutocompleteModule } from "@angular/material/autocomplete"; -import { MatButtonModule } from "@angular/material/button"; +import { BasicAutocompleteComponent } from "../../../configurable-enum/basic-autocomplete/basic-autocomplete.component"; +import { ReactiveFormsModule } from "@angular/forms"; +import { MatFormFieldModule } from "@angular/material/form-field"; import { FontAwesomeModule } from "@fortawesome/angular-fontawesome"; +import { NgIf } from "@angular/common"; @DynamicComponent("EditSingleEntity") @Component({ @@ -22,74 +19,28 @@ import { FontAwesomeModule } from "@fortawesome/angular-fontawesome"; templateUrl: "./edit-single-entity.component.html", styleUrls: ["./edit-single-entity.component.scss"], imports: [ - MatFormFieldModule, - ReactiveFormsModule, - MatInputModule, + BasicAutocompleteComponent, DisplayEntityComponent, - NgIf, - MatAutocompleteModule, - MatButtonModule, + ReactiveFormsModule, + MatFormFieldModule, FontAwesomeModule, - AsyncPipe, - NgForOf, + NgIf, ], standalone: true, }) export class EditSingleEntityComponent extends EditComponent<string> { entities: Entity[] = []; - placeholder: string; - autocompleteEntities = new BehaviorSubject<Entity[]>([]); - selectedEntity?: Entity; - - @ViewChild("inputElement") input: ElementRef; + entityToId = (e: Entity) => e?.getId(); constructor(private entityMapperService: EntityMapperService) { super(); } - updateAutocomplete(inputText: string) { - let filteredEntities = this.entities; - if (inputText) { - filteredEntities = this.entities.filter((entity) => - entity.toString().toLowerCase().includes(inputText.toLowerCase()) - ); - } - this.autocompleteEntities.next(filteredEntities); - } - async onInitFromDynamicConfig(config: EditPropertyConfig<string>) { super.onInitFromDynamicConfig(config); - this.placeholder = $localize`:Placeholder for input to set an entity|context Select User:Select ${ - config.formFieldConfig.label || config.propertySchema?.label - }`; const entityType: string = config.formFieldConfig.additional || config.propertySchema.additional; this.entities = await this.entityMapperService.loadType(entityType); this.entities.sort((e1, e2) => e1.toString().localeCompare(e2.toString())); - const selectedEntity = this.entities.find( - (entity) => entity.getId() === this.formControl.value - ); - if (selectedEntity) { - this.selectedEntity = selectedEntity; - } - } - - select(selected: string | Entity) { - let entity: Entity; - if (typeof selected === "string") { - entity = this.entities.find( - (e) => e.toString().toLowerCase() === selected.toLowerCase() - ); - } else { - entity = selected; - } - - if (entity) { - this.selectedEntity = entity; - this.formControl.setValue(entity.getId()); - } else { - this.selectedEntity = undefined; - this.formControl.setValue(undefined); - } } } diff --git a/src/app/core/entity-components/entity-select/edit-single-entity/entity-reference.stories.ts b/src/app/core/entity-components/entity-select/edit-single-entity/entity-reference.stories.ts index 6984eb6974..2aec8a3fcd 100644 --- a/src/app/core/entity-components/entity-select/edit-single-entity/entity-reference.stories.ts +++ b/src/app/core/entity-components/entity-select/edit-single-entity/entity-reference.stories.ts @@ -5,7 +5,7 @@ import { EntityFormComponent } from "../../entity-form/entity-form/entity-form.c import { FormFieldConfig } from "../../entity-form/entity-form/FormConfig"; import { EntityMapperService } from "../../../entity/entity-mapper.service"; import { - entityFormStorybookDefaulParameters, + entityFormStorybookDefaultParameters, StorybookBaseModule, } from "../../../../utils/storybook-base.module"; import { DatabaseEntity } from "../../../entity/database-entity.decorator"; @@ -27,10 +27,7 @@ export default { component: EntityFormComponent, decorators: [ moduleMetadata({ - imports: [ - EntityFormComponent, - StorybookBaseModule, - ], + imports: [EntityFormComponent, StorybookBaseModule], providers: [ EntitySchemaService, { @@ -40,7 +37,7 @@ export default { ], }), ], - parameters: entityFormStorybookDefaulParameters, + parameters: entityFormStorybookDefaultParameters, } as Meta; const Template: Story<EntityFormComponent> = (args: EntityFormComponent) => ({ diff --git a/src/app/core/entity-components/entity-select/entity-select/entity-select.stories.ts b/src/app/core/entity-components/entity-select/entity-select/entity-select.stories.ts index 2520e739ca..811268a77b 100644 --- a/src/app/core/entity-components/entity-select/entity-select/entity-select.stories.ts +++ b/src/app/core/entity-components/entity-select/entity-select/entity-select.stories.ts @@ -1,14 +1,20 @@ -import { Story, Meta } from "@storybook/angular/types-6-0"; +import { Meta, Story } from "@storybook/angular/types-6-0"; import { moduleMetadata } from "@storybook/angular"; import { Child } from "../../../../child-dev-project/children/model/child"; -import { Database } from "../../../database/database"; import { BackupService } from "../../../admin/services/backup.service"; import { EntityMapperService } from "../../../entity/entity-mapper.service"; -import { ChildrenService } from "../../../../child-dev-project/children/children.service"; import { BehaviorSubject } from "rxjs"; import { EntitySelectComponent } from "./entity-select.component"; import { StorybookBaseModule } from "../../../../utils/storybook-base.module"; import { School } from "../../../../child-dev-project/schools/model/school"; +import { + componentRegistry, + ComponentRegistry, +} from "../../../../dynamic-components"; +import { ChildBlockComponent } from "../../../../child-dev-project/children/child-block/child-block.component"; +import { SchoolBlockComponent } from "../../../../child-dev-project/schools/school-block/school-block.component"; +import { Database } from "../../../database/database"; +import { ChildrenService } from "../../../../child-dev-project/children/children.service"; const child1 = new Child(); child1.name = "First Child"; @@ -53,6 +59,7 @@ export default { ]), }, }, + { provide: ComponentRegistry, useValue: componentRegistry }, { provide: Database, useValue: {} }, { provide: ChildrenService, useValue: {} }, ], @@ -74,6 +81,9 @@ export default { }, } as Meta; +componentRegistry.add("ChildBlock", async () => ChildBlockComponent); +componentRegistry.add("SchoolBlock", async () => SchoolBlockComponent); + const Template: Story<EntitySelectComponent<Child>> = ( args: EntitySelectComponent<Child> ) => ({ diff --git a/src/app/core/entity-components/entity-subrecord/entity-subrecord/entity-subrecord.stories.ts b/src/app/core/entity-components/entity-subrecord/entity-subrecord/entity-subrecord.stories.ts index 70266b2ead..bf22584166 100644 --- a/src/app/core/entity-components/entity-subrecord/entity-subrecord/entity-subrecord.stories.ts +++ b/src/app/core/entity-components/entity-subrecord/entity-subrecord/entity-subrecord.stories.ts @@ -5,7 +5,6 @@ import { Note } from "../../../../child-dev-project/notes/model/note"; import { EntityMapperService } from "../../../entity/entity-mapper.service"; import { DatePipe } from "@angular/common"; import { DemoNoteGeneratorService } from "../../../../child-dev-project/notes/demo-data/demo-note-generator.service"; -import { ConfigService } from "../../../config/config.service"; import { EntitySchemaService } from "../../../entity/schema/entity-schema.service"; import { DemoChildGenerator } from "../../../../child-dev-project/children/demo-data-generators/demo-child-generator.service"; import { DemoUserGeneratorService } from "../../../user/demo-user-generator.service"; @@ -18,19 +17,15 @@ import { MockedTestingModule } from "../../../../utils/mocked-testing.module"; import { AbilityService } from "../../../permissions/ability/ability.service"; import { faker } from "../../../demo-data/faker"; import { StorybookBaseModule } from "../../../../utils/storybook-base.module"; -import { mockEntityMapper } from "../../../entity/mock-entity-mapper-service"; import { Ability } from "@casl/ability"; import { EntityAbility } from "../../../permissions/ability/entity-ability"; -import { LoggingService } from "../../../logging/logging.service"; +import { ConfigurableEnumService } from "../../../configurable-enum/configurable-enum.service"; -const configService = new ConfigService( - mockEntityMapper(), - new LoggingService() -); +const enumService = { + getEnumValues: () => [], +} as unknown as ConfigurableEnumService; const schemaService = new EntitySchemaService(); -schemaService.registerSchemaDatatype( - new ConfigurableEnumDatatype(configService) -); +schemaService.registerSchemaDatatype(new ConfigurableEnumDatatype(enumService)); const childGenerator = new DemoChildGenerator({ count: 10 }); const userGenerator = new DemoUserGeneratorService(); const data = new DemoNoteGeneratorService( @@ -64,7 +59,6 @@ export default { }, }, { provide: EntitySchemaService, useValue: schemaService }, - { provide: ConfigService, useValue: configService }, DatePipe, { provide: ChildrenService, diff --git a/src/app/core/entity-components/entity-subrecord/entity-subrecord/value-accessor.ts b/src/app/core/entity-components/entity-subrecord/entity-subrecord/value-accessor.ts index 791fc9c72a..6f2af736f5 100644 --- a/src/app/core/entity-components/entity-subrecord/entity-subrecord/value-accessor.ts +++ b/src/app/core/entity-components/entity-subrecord/entity-subrecord/value-accessor.ts @@ -41,6 +41,6 @@ export function getReadableValue(value: any): any { } } -function isConfigurableEnum(value: any): value is ConfigurableEnumValue { +export function isConfigurableEnum(value: any): value is ConfigurableEnumValue { return typeof value === "object" && value && "label" in value; } diff --git a/src/app/core/entity-components/entity-utils/dynamic-form-components/edit-boolean/edit-boolean.stories.ts b/src/app/core/entity-components/entity-utils/dynamic-form-components/edit-boolean/edit-boolean.stories.ts index 1adeff1627..bdc906a38d 100644 --- a/src/app/core/entity-components/entity-utils/dynamic-form-components/edit-boolean/edit-boolean.stories.ts +++ b/src/app/core/entity-components/entity-utils/dynamic-form-components/edit-boolean/edit-boolean.stories.ts @@ -8,7 +8,7 @@ import { Entity } from "../../../../entity/model/entity"; import { DatabaseField } from "../../../../entity/database-field.decorator"; import { DatabaseEntity } from "../../../../entity/database-entity.decorator"; import { - entityFormStorybookDefaulParameters, + entityFormStorybookDefaultParameters, StorybookBaseModule, } from "../../../../../utils/storybook-base.module"; @@ -27,7 +27,7 @@ export default { ], }), ], - parameters: entityFormStorybookDefaulParameters, + parameters: entityFormStorybookDefaultParameters, } as Meta; const Template: Story<EntityFormComponent> = (args: EntityFormComponent) => ({ diff --git a/src/app/core/entity-components/entity-utils/dynamic-form-components/edit-number/edit-number.stories.ts b/src/app/core/entity-components/entity-utils/dynamic-form-components/edit-number/edit-number.stories.ts index b7c2369eef..54a16e5e31 100644 --- a/src/app/core/entity-components/entity-utils/dynamic-form-components/edit-number/edit-number.stories.ts +++ b/src/app/core/entity-components/entity-utils/dynamic-form-components/edit-number/edit-number.stories.ts @@ -1,7 +1,6 @@ -import { Story, Meta } from "@storybook/angular/types-6-0"; +import { Meta, Story } from "@storybook/angular/types-6-0"; import { moduleMetadata } from "@storybook/angular"; import { EntitySchemaService } from "../../../../entity/schema/entity-schema.service"; -import { EntityFormComponent } from "../../../entity-form/entity-form/entity-form.component"; import { FormFieldConfig } from "../../../entity-form/entity-form/FormConfig"; import { EntityMapperService } from "../../../../entity/entity-mapper.service"; import { Entity } from "../../../../entity/model/entity"; @@ -9,30 +8,38 @@ import { DatabaseField } from "../../../../entity/database-field.decorator"; import { DatabaseEntity } from "../../../../entity/database-entity.decorator"; import { EditNumberComponent } from "./edit-number.component"; import { - entityFormStorybookDefaulParameters, + entityFormStorybookDefaultParameters, StorybookBaseModule, } from "../../../../../utils/storybook-base.module"; +import { AppModule } from "../../../../../app.module"; +import { mockEntityMapper } from "../../../../entity/mock-entity-mapper-service"; +import { FormComponent } from "../../../entity-details/form/form.component"; export default { title: "Core/EntityComponents/Entity Property Fields/Number", - component: EntityFormComponent, + component: FormComponent, decorators: [ moduleMetadata({ - imports: [EntityFormComponent, EditNumberComponent, StorybookBaseModule], + imports: [ + FormComponent, + EditNumberComponent, + AppModule, + StorybookBaseModule, + ], providers: [ EntitySchemaService, { provide: EntityMapperService, - useValue: { save: () => Promise.resolve() }, + useValue: mockEntityMapper(), }, ], }), ], - parameters: entityFormStorybookDefaulParameters, + parameters: entityFormStorybookDefaultParameters, } as Meta; -const Template: Story<EntityFormComponent> = (args: EntityFormComponent) => ({ - component: EntityFormComponent, +const Template: Story<FormComponent<any>> = (args: FormComponent<any>) => ({ + component: FormComponent, props: args, }); diff --git a/src/app/core/entity/model/entity.spec.ts b/src/app/core/entity/model/entity.spec.ts index 487f2e0e8d..111e5bff2a 100644 --- a/src/app/core/entity/model/entity.spec.ts +++ b/src/app/core/entity/model/entity.spec.ts @@ -20,7 +20,8 @@ import { EntitySchemaService } from "../schema/entity-schema.service"; import { DatabaseField } from "../database-field.decorator"; import { ConfigurableEnumDatatype } from "../../configurable-enum/configurable-enum-datatype/configurable-enum-datatype"; import { DatabaseEntity } from "../database-entity.decorator"; -import { createTestingConfigService } from "../../config/testing-config-service"; +import { createTestingConfigurableEnumService } from "../../configurable-enum/configurable-enum-testing"; +import { fakeAsync, tick } from "@angular/core/testing"; describe("Entity", () => { let entitySchemaService: EntitySchemaService; @@ -162,12 +163,12 @@ export function testEntitySubclass( expect(Entity.extractTypeFromId(entity._id)).toBe(entityType); }); - it("should only load and store properties defined in the schema", () => { + it("should only load and store properties defined in the schema", fakeAsync(() => { const schemaService = new EntitySchemaService(); - const configService = createTestingConfigService(); schemaService.registerSchemaDatatype( - new ConfigurableEnumDatatype(configService) + new ConfigurableEnumDatatype(createTestingConfigurableEnumService()) ); + tick(); const entity = new entityClass(); schemaService.loadDataIntoEntity( @@ -179,5 +180,5 @@ export function testEntitySubclass( delete rawData.searchIndices; } expect(rawData).toEqual(expectedDatabaseFormat); - }); + })); } diff --git a/src/app/core/export/data-transformation-service/data-transformation.service.ts b/src/app/core/export/data-transformation-service/data-transformation.service.ts index 4b52082c18..a20f4fc45c 100644 --- a/src/app/core/export/data-transformation-service/data-transformation.service.ts +++ b/src/app/core/export/data-transformation-service/data-transformation.service.ts @@ -67,7 +67,7 @@ export class DataTransformationService { const result: ExportRow[] = []; if (groupByProperty) { const groups = groupBy(data, groupByProperty.property); - for (const [group, values] of groups.entries()) { + for (const [group, values] of groups) { const groupColumn: ExportColumnConfig = { label: groupByProperty.label, query: `:setString(${getReadableValue(group)})`, diff --git a/src/app/core/filter/filter.service.spec.ts b/src/app/core/filter/filter.service.spec.ts index 4ce3b4abd0..c1687dc72e 100644 --- a/src/app/core/filter/filter.service.spec.ts +++ b/src/app/core/filter/filter.service.spec.ts @@ -4,16 +4,19 @@ import { FilterService } from "./filter.service"; import { defaultInteractionTypes } from "../config/default-config/default-interaction-types"; import { DataFilter } from "../entity-components/entity-subrecord/entity-subrecord/entity-subrecord-config"; import { Note } from "../../child-dev-project/notes/model/note"; -import { ConfigService } from "../config/config.service"; -import { createTestingConfigService } from "../config/testing-config-service"; +import { ConfigurableEnumService } from "../configurable-enum/configurable-enum.service"; +import { createTestingConfigurableEnumService } from "../configurable-enum/configurable-enum-testing"; describe("FilterService", () => { let service: FilterService; - beforeEach(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ providers: [ - { provide: ConfigService, useValue: createTestingConfigService() }, + { + provide: ConfigurableEnumService, + useValue: createTestingConfigurableEnumService(), + }, ], }); service = TestBed.inject(FilterService); diff --git a/src/app/core/filter/filter.service.ts b/src/app/core/filter/filter.service.ts index aee83a1784..f5bcd30e43 100644 --- a/src/app/core/filter/filter.service.ts +++ b/src/app/core/filter/filter.service.ts @@ -1,6 +1,5 @@ import { Injectable } from "@angular/core"; import { EntitySchemaField } from "../entity/schema/entity-schema-field"; -import { ConfigService } from "../config/config.service"; import { DataFilter } from "../entity-components/entity-subrecord/entity-subrecord/entity-subrecord-config"; import { Entity } from "../entity/model/entity"; import { @@ -11,6 +10,7 @@ import { compare, } from "@ucast/mongo2js"; import moment from "moment"; +import { ConfigurableEnumService } from "../configurable-enum/configurable-enum.service"; /** * Utility service to help handling and aligning filters with entities. @@ -25,7 +25,7 @@ export class FilterService { { compare: this.extendedCompare.bind(this) } ) as Filter; - constructor(private configService: ConfigService) {} + constructor(private enumService: ConfigurableEnumService) {} /** * Builds a predicate for a given filter object. @@ -83,9 +83,7 @@ export class FilterService { } private parseConfigurableEnumValue(property: EntitySchemaField, value) { - const enumValues = this.configService.getConfigurableEnumValues( - property.innerDataType - ); + const enumValues = this.enumService.getEnumValues(property.innerDataType); return enumValues.find(({ id }) => id === value["id"]); } diff --git a/src/app/core/session/login/login.component.spec.ts b/src/app/core/session/login/login.component.spec.ts index 898d2141db..2af9ccf772 100644 --- a/src/app/core/session/login/login.component.spec.ts +++ b/src/app/core/session/login/login.component.spec.ts @@ -31,12 +31,16 @@ import { MockedTestingModule } from "../../../utils/mocked-testing.module"; import { AuthService } from "../auth/auth.service"; import { Subject } from "rxjs"; import { ActivatedRoute, Router } from "@angular/router"; +import { TestbedHarnessEnvironment } from "@angular/cdk/testing/testbed"; +import { HarnessLoader } from "@angular/cdk/testing"; +import { MatInputHarness } from "@angular/material/input/testing"; describe("LoginComponent", () => { let component: LoginComponent; let fixture: ComponentFixture<LoginComponent>; let mockSessionService: jasmine.SpyObj<SessionService>; let loginState = new Subject(); + let loader: HarnessLoader; beforeEach(waitForAsync(() => { mockSessionService = jasmine.createSpyObj(["login"], { loginState }); @@ -51,6 +55,7 @@ describe("LoginComponent", () => { beforeEach(() => { fixture = TestBed.createComponent(LoginComponent); + loader = TestbedHarnessEnvironment.loader(fixture); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -85,13 +90,13 @@ describe("LoginComponent", () => { expect(component.errorMessage).toBeTruthy(); })); - it("should focus the first input element on initialization", fakeAsync(() => { + it("should focus the first input element on initialization", fakeAsync(async () => { component.ngAfterViewInit(); tick(); fixture.detectChanges(); - const firstInputElement = document.getElementsByTagName("input")[0]; - expect(document.activeElement).toBe(firstInputElement); + const firstInputElement = await loader.getHarness(MatInputHarness); + await expectAsync(firstInputElement.isFocused()).toBeResolvedTo(true); })); it("should route to redirect uri once state changes to 'logged-in'", () => { diff --git a/src/app/features/file/couchdb-file.service.spec.ts b/src/app/features/file/couchdb-file.service.spec.ts index 9bd55eaed6..fadc1702cb 100644 --- a/src/app/features/file/couchdb-file.service.spec.ts +++ b/src/app/features/file/couchdb-file.service.spec.ts @@ -63,6 +63,10 @@ describe("CouchdbFileService", () => { service = TestBed.inject(CouchdbFileService); }); + afterEach(() => { + Entity.schema.delete("testProp"); + }); + it("should be created", () => { expect(service).toBeTruthy(); }); diff --git a/src/app/features/location/edit-location/edit-location.stories.ts b/src/app/features/location/edit-location/edit-location.stories.ts index 8bab690134..7bcd8e3b1f 100644 --- a/src/app/features/location/edit-location/edit-location.stories.ts +++ b/src/app/features/location/edit-location/edit-location.stories.ts @@ -1,6 +1,6 @@ import { moduleMetadata } from "@storybook/angular"; import { - entityFormStorybookDefaulParameters, + entityFormStorybookDefaultParameters, StorybookBaseModule, } from "../../../utils/storybook-base.module"; import { Meta, Story } from "@storybook/angular/types-6-0"; @@ -33,7 +33,7 @@ export default { ], }), ], - parameters: entityFormStorybookDefaulParameters, + parameters: entityFormStorybookDefaultParameters, } as Meta; @DatabaseEntity("LocationTest") diff --git a/src/app/features/location/map/map.component.spec.ts b/src/app/features/location/map/map.component.spec.ts index a16b0d0dce..178a259486 100644 --- a/src/app/features/location/map/map.component.spec.ts +++ b/src/app/features/location/map/map.component.spec.ts @@ -92,6 +92,7 @@ describe("MapComponent", () => { }); marker.fireEvent("click"); + Child.schema.delete("address"); }); it("should open a popup with the same marker data", async () => { diff --git a/src/app/features/matching-entities/matching-entities/matching-entities.stories.ts b/src/app/features/matching-entities/matching-entities/matching-entities.stories.ts index 3b37cf14d9..0260aeb771 100644 --- a/src/app/features/matching-entities/matching-entities/matching-entities.stories.ts +++ b/src/app/features/matching-entities/matching-entities/matching-entities.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from "@storybook/angular/types-6-0"; +import { Meta, Story } from "@storybook/angular/types-6-0"; import { moduleMetadata } from "@storybook/angular"; import { MatchingEntitiesComponent } from "./matching-entities.component"; import { StorybookBaseModule } from "../../../utils/storybook-base.module"; @@ -15,6 +15,7 @@ import { centersUnique } from "../../../child-dev-project/children/demo-data-gen import { genders } from "../../../child-dev-project/children/model/genders"; import { FormDialogService } from "../../../core/form-dialog/form-dialog.service"; import { EntitySchemaField } from "../../../core/entity/schema/entity-schema-field"; +import { ConfigurableEnumService } from "../../../core/configurable-enum/configurable-enum.service"; const addressSchema: EntitySchemaField = { label: "Address", @@ -70,10 +71,15 @@ export default { { provide: DownloadService, useValue: null }, { provide: EntitySchemaService, - useFactory: (configService: ConfigService) => { + useFactory: ( + entityMapper: EntityMapperService, + configService: ConfigService + ) => { const schemaService = new EntitySchemaService(); schemaService.registerSchemaDatatype( - new ConfigurableEnumDatatype(configService) + new ConfigurableEnumDatatype( + new ConfigurableEnumService(entityMapper, configService) + ) ); return schemaService; }, diff --git a/src/app/features/reporting/data-aggregation.service.ts b/src/app/features/reporting/data-aggregation.service.ts index 3a7cb62379..d745f73d57 100644 --- a/src/app/features/reporting/data-aggregation.service.ts +++ b/src/app/features/reporting/data-aggregation.service.ts @@ -1,6 +1,7 @@ import { Injectable } from "@angular/core"; import { QueryService } from "../../core/export/query.service"; import { GroupByDescription, ReportRow } from "./report-row"; +import { groupBy } from "../../utils/utils"; export interface Aggregation { query: string; @@ -90,24 +91,24 @@ export class DataAggregationService { for (let i = properties.length; i > 0; i--) { const currentProperty = properties[i - 1]; const remainingProperties = properties.slice(i); - const groupingResults = this.groupBy(data, currentProperty); - for (const grouping of groupingResults) { + const groupingResults = groupBy(data, currentProperty); + for (const [group, entries] of groupingResults) { const groupingValues = additionalValues.concat({ property: currentProperty, - value: grouping.value, + value: group, }); const newRow: ReportRow = { header: { label: label, groupedBy: groupingValues, - result: grouping.data.length, + result: entries.length, }, subRows: [], }; newRow.subRows.push( ...(await this.calculateAggregations( aggregations, - grouping.data, + entries, groupingValues )) ); @@ -116,7 +117,7 @@ export class DataAggregationService { remainingProperties, aggregations, label, - grouping.data, + entries, groupingValues )) ); @@ -125,22 +126,4 @@ export class DataAggregationService { } return resultRows; } - - private groupBy<ENTITY, PROPERTY extends keyof ENTITY>( - data: ENTITY[], - groupByProperty: PROPERTY - ): { value: ENTITY[PROPERTY]; data: ENTITY[] }[] { - return data.reduce((allGroups, currentElement) => { - const currentValue = currentElement[groupByProperty]; - let existingGroup = allGroups.find( - (group) => group.value === currentValue - ); - if (!existingGroup) { - existingGroup = { value: currentValue, data: [] }; - allGroups.push(existingGroup); - } - existingGroup.data.push(currentElement); - return allGroups; - }, new Array<{ value: ENTITY[PROPERTY]; data: ENTITY[] }>()); - } } diff --git a/src/app/utils/database-testing.module.ts b/src/app/utils/database-testing.module.ts index 4ad5d01c28..694d3af51e 100644 --- a/src/app/utils/database-testing.module.ts +++ b/src/app/utils/database-testing.module.ts @@ -8,6 +8,8 @@ import { environment } from "../../environments/environment"; import { createTestingConfigService } from "../core/config/testing-config-service"; import { AppModule } from "../app.module"; import { ComponentRegistry } from "../dynamic-components"; +import { ConfigurableEnumService } from "../core/configurable-enum/configurable-enum.service"; +import { createTestingConfigurableEnumService } from "../core/configurable-enum/configurable-enum-testing"; /** * Utility module that creates a simple environment where a correctly configured database and session is set up. @@ -24,6 +26,10 @@ import { ComponentRegistry } from "../dynamic-components"; providers: [ { provide: SessionService, useClass: LocalSession }, { provide: ConfigService, useValue: createTestingConfigService() }, + { + provide: ConfigurableEnumService, + useValue: createTestingConfigurableEnumService(), + }, ], }) export class DatabaseTestingModule { diff --git a/src/app/utils/mocked-testing.module.ts b/src/app/utils/mocked-testing.module.ts index 475f73b189..3509a9e944 100644 --- a/src/app/utils/mocked-testing.module.ts +++ b/src/app/utils/mocked-testing.module.ts @@ -20,6 +20,8 @@ import { HttpClientTestingModule } from "@angular/common/http/testing"; import { ReactiveFormsModule } from "@angular/forms"; import { AppModule } from "../app.module"; import { ComponentRegistry } from "../dynamic-components"; +import { ConfigurableEnumService } from "../core/configurable-enum/configurable-enum.service"; +import { createTestingConfigurableEnumService } from "../core/configurable-enum/configurable-enum-testing"; export const TEST_USER = "test"; export const TEST_PASSWORD = "pass"; @@ -74,6 +76,10 @@ export class MockedTestingModule { { provide: SessionService, useValue: session }, { provide: EntityMapperService, useValue: mockedEntityMapper }, { provide: ConfigService, useValue: createTestingConfigService() }, + { + provide: ConfigurableEnumService, + useValue: createTestingConfigurableEnumService(), + }, { provide: Database, useValue: session.getDatabase() }, ], }; diff --git a/src/app/utils/storybook-base.module.ts b/src/app/utils/storybook-base.module.ts index 07ecc67000..99f9481e4a 100644 --- a/src/app/utils/storybook-base.module.ts +++ b/src/app/utils/storybook-base.module.ts @@ -21,7 +21,10 @@ import { createTestingConfigService } from "../core/config/testing-config-servic import { componentRegistry } from "../dynamic-components"; import { AppModule } from "../app.module"; -export const entityFormStorybookDefaulParameters = { +componentRegistry.allowDuplicates(); +entityRegistry.allowDuplicates(); + +export const entityFormStorybookDefaultParameters = { controls: { exclude: ["_columns"], }, @@ -65,7 +68,5 @@ export const mockAbilityService = { export class StorybookBaseModule { constructor(icons: FaIconLibrary) { icons.addIconPacks(fas, far); - entityRegistry.allowDuplicates(); - componentRegistry.allowDuplicates(); } } diff --git a/src/app/utils/utils.spec.ts b/src/app/utils/utils.spec.ts index bf53f1ed9f..676045bc43 100644 --- a/src/app/utils/utils.spec.ts +++ b/src/app/utils/utils.spec.ts @@ -1,4 +1,4 @@ -import { calculateAge, isValidDate, sortByAttribute } from "./utils"; +import { calculateAge, groupBy, isValidDate, sortByAttribute } from "./utils"; import moment from "moment"; describe("Utils", () => { @@ -62,4 +62,19 @@ describe("Utils", () => { expect(sortedDesc).toEqual([third, second, first]); }); + + it("should create groups with the same ID, not just object equality", () => { + const first = { a: { id: "a", label: "A" } }; + const second = { a: { id: "a", label: "A" } }; + const third = { a: { id: "b", label: "B" } }; + // we don't have object equality + expect(first.a).not.toBe(second.a); + + const groups = groupBy([first, second, third], "a"); + + expect(groups).toEqual([ + [{ id: "a", label: "A" }, [first, second]], + [{ id: "b", label: "B" }, [third]], + ]); + }); }); diff --git a/src/app/utils/utils.ts b/src/app/utils/utils.ts index 5d4d51439c..10fb6f88db 100644 --- a/src/app/utils/utils.ts +++ b/src/app/utils/utils.ts @@ -5,6 +5,7 @@ import { Router } from "@angular/router"; import { ConfigurableEnumValue } from "../core/configurable-enum/configurable-enum.interface"; import { FactoryProvider, Injector } from "@angular/core"; +import { isConfigurableEnum } from "../core/entity-components/entity-subrecord/entity-subrecord/value-accessor"; export function isValidDate(date: any): boolean { return ( @@ -26,23 +27,41 @@ export function getParentUrl(router: Router): string { } /** - * Group an array by the given property into a map of parts of the array. + * Group an array by the given property. * * @param array A simple array to be grouped. * @param propertyToGroupBy The key of the property in the elements by whose value the result is grouped. + * @returns an array where the first entry is the value of this group and the second all entries that have this value. */ -export function groupBy<T>( +export function groupBy<T, P extends keyof T>( array: T[], - propertyToGroupBy: keyof T -): Map<string, T[]> { - return array.reduce( - (entryMap, element) => - entryMap.set(element[propertyToGroupBy], [ - ...(entryMap.get(element[propertyToGroupBy]) || []), - element, - ]), - new Map() - ); + propertyToGroupBy: P +): [T[P], T[]][] { + return array.reduce((allGroups, currentElement) => { + const currentValue = currentElement[propertyToGroupBy]; + let existingGroup = allGroups.find(([group]) => + equals(group, currentValue) + ); + if (!existingGroup) { + existingGroup = [currentValue, []]; + allGroups.push(existingGroup); + } + existingGroup[1].push(currentElement); + return allGroups; + }, new Array<[T[P], T[]]>()); +} + +/** + * Comparing two values for equality that might be different than just object equality + * @param a + * @param b + */ +function equals(a, b): boolean { + if (isConfigurableEnum(a) && isConfigurableEnum(b)) { + return a.id === b.id; + } else { + return a === b; + } } export function calculateAge(dateOfBirth: Date): number { diff --git a/src/assets/locale/messages.de.xlf b/src/assets/locale/messages.de.xlf index c10d81bf91..4a086d39fc 100644 --- a/src/assets/locale/messages.de.xlf +++ b/src/assets/locale/messages.de.xlf @@ -1149,15 +1149,15 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">36</context> + <context context-type="linenumber">26</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">593</context> + <context context-type="linenumber">526</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">940</context> + <context context-type="linenumber">873</context> </context-group> </trans-unit> <trans-unit id="9127604588498960753" datatype="html"> @@ -1411,6 +1411,22 @@ <context context-type="linenumber">75</context> </context-group> </trans-unit> + <trans-unit id="2468578017924444574" datatype="html"> + <source>Example form</source> + <target state="translated">Beispiel Formular</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/public-form/demo-public-form-generator.service.ts</context> + <context context-type="linenumber">18</context> + </context-group> + </trans-unit> + <trans-unit id="5065162821808701761" datatype="html"> + <source>This is a form that can be shared as a link or embedded in a website. It can be filled by users without having an account. For example you can let participants self-register their details and just review the records within Aam Digital.</source> + <target state="translated">Dieses Formular kann als Link geteilt oder auf einer Webseite eingebunden werden. Nutzer:innen können es ohne einen Account ausfüllen. Zum Beispiel können sich damit interessierte Teilnehmer:innen selbst registrieren und Sie können die Daten in Aam Digital überprüfen.</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/public-form/demo-public-form-generator.service.ts</context> + <context context-type="linenumber">19</context> + </context-group> + </trans-unit> <trans-unit id="f215ed23a0b8105ae47ef80cf65fe765631dd94a" datatype="html"> <source> Submit Form </source> <target state="translated"> Abschicken </target> @@ -1434,7 +1450,7 @@ <target state="translated">Formular erfolgreich übermittelt</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/public-form/public-form.component.ts</context> - <context context-type="linenumber">58</context> + <context context-type="linenumber">62</context> </context-group> </trans-unit> <trans-unit id="339729126805226016" datatype="html"> @@ -1585,7 +1601,7 @@ <target state="translated">Neue Daten importieren?</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">75</context> + <context context-type="linenumber">76</context> </context-group> </trans-unit> <trans-unit id="1690350829788615736" datatype="html"> @@ -1595,7 +1611,7 @@ Dadurch werden <x id="PH" equiv-text="csvFile.data.length"/> Einträge aus der Datei importiert.</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">76</context> + <context context-type="linenumber">77</context> </context-group> </trans-unit> <trans-unit id="5345022420402242415" datatype="html"> @@ -1603,7 +1619,7 @@ <target state="translated"><x id="PH" equiv-text="refText"/>Alle existierende Einträge mit der TransactionID: '<x id="PH_1" equiv-text="importMeta.transactionId"/>' werden gelöscht!</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">79</context> + <context context-type="linenumber">80</context> </context-group> </trans-unit> <trans-unit id="4fd611f679282abb73122b03bfed3724dba9b6bf" datatype="html"> @@ -1900,14 +1916,34 @@ <context context-type="linenumber">113</context> </context-group> </trans-unit> + <trans-unit id="22ee8aecedfcdfcd3313bc6c5f0e80175bfafd58" datatype="html"> + <source> Select displayed locations +</source> + <target state="translated"> Wähle angezeigte Orte aus +</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/location/map/map-properties-popup/map-properties-popup.component.html</context> + <context context-type="linenumber">1,3</context> + </context-group> + <note priority="1" from="description">Title of popup to select locations that are displayed in the map</note> + </trans-unit> + <trans-unit id="c2d0ac9f528bbd5f53fd34269fde8b59e029621b" datatype="html"> + <source>Apply</source> + <target state="translated">Anwenden</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/location/map/map-properties-popup/map-properties-popup.component.html</context> + <context context-type="linenumber">18</context> + </context-group> + <note priority="1" from="description">Button for closing popup and applying changes</note> + </trans-unit> <trans-unit id="2549737213024136740" datatype="html"> - <source><x id="PH" equiv-text="res"/> km</source> + <source><x id="PH" equiv-text="closest"/> km</source> <target state="translated"><x id="PH" equiv-text="res"/> km</target> <note priority="1" from="description">e.g. 5 km</note> <note priority="1" from="meaning">distance with unit</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/location/view-distance/view-distance.component.ts</context> - <context context-type="linenumber">73</context> + <context context-type="linenumber">65</context> </context-group> </trans-unit> <trans-unit id="4bc0107bf7dcdac8c02c5ced13ad79c23c253148" datatype="html"> @@ -1922,11 +1958,11 @@ <trans-unit id="a4cdca73d44b64c6cfa677e10047ccd7e4a41e2a" datatype="html"> <source> Select <x id="INTERPOLATION" equiv-text="{{ side.entityType?.label }}"/> </source> <target state="translated"><x id="INTERPOLATION" equiv-text="{{ side.entityType.label }}"/> auswählen </target> + <note priority="1" from="description">header of section with entities available for selection</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.html</context> - <context context-type="linenumber">55,56</context> + <context context-type="linenumber">54</context> </context-group> - <note priority="1" from="description">header of section with entities available for selection</note> </trans-unit> <trans-unit id="4566094167890982095" datatype="html"> <source>create matching</source> @@ -1934,7 +1970,7 @@ <note priority="1" from="description">Matching button label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.ts</context> - <context context-type="linenumber">85</context> + <context context-type="linenumber">91</context> </context-group> </trans-unit> <trans-unit id="1779552786277618671" datatype="html"> @@ -1943,7 +1979,7 @@ <note priority="1" from="description">Matching View column name</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.ts</context> - <context context-type="linenumber">273</context> + <context context-type="linenumber">312</context> </context-group> </trans-unit> <trans-unit id="54fdb618c658224c6fbd4e10a947f91ea7611913" datatype="html"> @@ -2004,20 +2040,20 @@ <trans-unit id="1237640232293738415" datatype="html"> <source>Aam Digital - DEMO (automatically generated data)</source> <target state="translated">Aam Digital - DEMO (automatisch generierte Daten)</target> + <note priority="1" from="description">Page title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">22</context> + <context context-type="linenumber">12</context> </context-group> - <note priority="1" from="description">Page title</note> </trans-unit> <trans-unit id="6570363013146073520" datatype="html"> <source>Dashboard</source> <target state="translated">Dashboard</target> + <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">31</context> + <context context-type="linenumber">21</context> </context-group> - <note priority="1" from="description">Menu item</note> </trans-unit> <trans-unit id="7026624912846603653" datatype="html"> <source>Schools</source> @@ -2029,11 +2065,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">41</context> + <context context-type="linenumber">31</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">409</context> + <context context-type="linenumber">342</context> </context-group> </trans-unit> <trans-unit id="4817207543436133742" datatype="html"> @@ -2042,25 +2078,25 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">46</context> + <context context-type="linenumber">36</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">691</context> + <context context-type="linenumber">624</context> </context-group> </trans-unit> <trans-unit id="6904866445262015585" datatype="html"> <source>Tasks</source> <target state="translated">Aufgaben</target> + <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">56</context> + <context context-type="linenumber">46</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/todos/model/todo.ts</context> <context context-type="linenumber">32</context> </context-group> - <note priority="1" from="description">Menu item</note> </trans-unit> <trans-unit id="5041354590769758251" datatype="html"> <source>Admin</source> @@ -2068,7 +2104,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">61</context> + <context context-type="linenumber">51</context> </context-group> </trans-unit> <trans-unit id="1071721880474488785" datatype="html"> @@ -2077,7 +2113,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">66</context> + <context context-type="linenumber">56</context> </context-group> </trans-unit> <trans-unit id="4555457172864212828" datatype="html"> @@ -2086,7 +2122,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">71</context> + <context context-type="linenumber">61</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/user/user.ts</context> @@ -2099,7 +2135,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">76</context> + <context context-type="linenumber">66</context> </context-group> </trans-unit> <trans-unit id="657496228690855434" datatype="html"> @@ -2108,7 +2144,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">81</context> + <context context-type="linenumber">71</context> </context-group> </trans-unit> <trans-unit id="7911416166208830577" datatype="html"> @@ -2117,61 +2153,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">86</context> - </context-group> - </trans-unit> - <trans-unit id="6691439998827511114" datatype="html"> - <source>OK (copy with us)</source> - <target state="translated">OK (Kopie eingereicht)</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">109</context> - </context-group> - </trans-unit> - <trans-unit id="7233426447535381432" datatype="html"> - <source>OK (copy needed for us)</source> - <target state="translated">OK (Kopie fehlt noch)</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">114</context> - </context-group> - </trans-unit> - <trans-unit id="7892131631225988542" datatype="html"> - <source>needs correction</source> - <target state="translated">benötigt Korrektur</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">119</context> - </context-group> - </trans-unit> - <trans-unit id="7543632648034985521" datatype="html"> - <source>applied</source> - <target state="translated">beantragt</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">124</context> - </context-group> - </trans-unit> - <trans-unit id="2743017402754335830" datatype="html"> - <source>doesn't have</source> - <target state="translated">nicht vorhanden</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">129</context> - </context-group> - </trans-unit> - <trans-unit id="6322199449220989816" datatype="html"> - <source>not eligible</source> - <target state="translated">nicht berechtigt</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">134</context> + <context context-type="linenumber">76</context> </context-group> </trans-unit> <trans-unit id="2935152225387412918" datatype="html"> @@ -2181,7 +2163,7 @@ <note priority="1" from="meaning">Dashboard shortcut widget</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">163</context> + <context context-type="linenumber">91</context> </context-group> </trans-unit> <trans-unit id="2111561618518210212" datatype="html"> @@ -2191,16 +2173,26 @@ <note priority="1" from="meaning">Dashboard shortcut widget</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">168</context> + <context context-type="linenumber">96</context> </context-group> </trans-unit> + <trans-unit id="7749314122565677607" datatype="html"> + <source>Public Registration Form</source> + <target state="translated">Öffentliches Regstrierungsformular</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> + <context context-type="linenumber">101</context> + </context-group> + <note priority="1" from="description">open public form</note> + <note priority="1" from="meaning">Dashboard shortcut widget</note> + </trans-unit> <trans-unit id="2329598843423950672" datatype="html"> <source>last week</source> <target state="translated">letzte Woche</target> <note priority="1" from="description">Attendance week dashboard widget label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">215</context> + <context context-type="linenumber">148</context> </context-group> </trans-unit> <trans-unit id="6802197953477344728" datatype="html"> @@ -2209,7 +2201,7 @@ <note priority="1" from="description">Attendance week dashboard widget label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">222</context> + <context context-type="linenumber">155</context> </context-group> </trans-unit> <trans-unit id="8955128195791312286" datatype="html"> @@ -2218,7 +2210,7 @@ <note priority="1" from="description">Attendance week dashboard widget label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">208</context> + <context context-type="linenumber">141</context> </context-group> </trans-unit> <trans-unit id="1813769493203572551" datatype="html"> @@ -2227,7 +2219,7 @@ <note priority="1" from="description">Title for notes overview</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">244</context> + <context context-type="linenumber">177</context> </context-group> </trans-unit> <trans-unit id="2798807656507405918" datatype="html"> @@ -2236,11 +2228,11 @@ <note priority="1" from="description">Translated name of default column group</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">254</context> + <context context-type="linenumber">187</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">258</context> + <context context-type="linenumber">191</context> </context-group> </trans-unit> <trans-unit id="1002165214775409029" datatype="html"> @@ -2249,19 +2241,19 @@ <note priority="1" from="description">Translated name of mobile column group</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">255</context> + <context context-type="linenumber">188</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">268</context> + <context context-type="linenumber">201</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">525</context> + <context context-type="linenumber">458</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">579</context> + <context context-type="linenumber">512</context> </context-group> </trans-unit> <trans-unit id="6309181788204949218" datatype="html"> @@ -2270,7 +2262,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">355</context> + <context context-type="linenumber">288</context> </context-group> </trans-unit> <trans-unit id="8878700331247603166" datatype="html"> @@ -2279,7 +2271,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">374</context> + <context context-type="linenumber">307</context> </context-group> </trans-unit> <trans-unit id="7910125616758063638" datatype="html"> @@ -2288,7 +2280,7 @@ <note priority="1" from="description">Filename of markdown help page (make sure the filename you enter as a translation actually exists on the server!)</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">388</context> + <context context-type="linenumber">321</context> </context-group> </trans-unit> <trans-unit id="3686284950598311784" datatype="html"> @@ -2297,7 +2289,7 @@ <note priority="1" from="description">Label for private schools filter - true case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">410</context> + <context context-type="linenumber">343</context> </context-group> </trans-unit> <trans-unit id="6264204010127975648" datatype="html"> @@ -2306,7 +2298,7 @@ <note priority="1" from="description">Label for private schools filter - false case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">411</context> + <context context-type="linenumber">344</context> </context-group> </trans-unit> <trans-unit id="8781767917622107949" datatype="html"> @@ -2315,15 +2307,15 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">423</context> + <context context-type="linenumber">356</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">615</context> + <context context-type="linenumber">548</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">798</context> + <context context-type="linenumber">731</context> </context-group> </trans-unit> <trans-unit id="2562531496877210322" datatype="html"> @@ -2332,7 +2324,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">451</context> + <context context-type="linenumber">384</context> </context-group> </trans-unit> <trans-unit id="2309808536212982229" datatype="html"> @@ -2341,7 +2333,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">460</context> + <context context-type="linenumber">393</context> </context-group> </trans-unit> <trans-unit id="1130652265542107236" datatype="html"> @@ -2350,7 +2342,7 @@ <note priority="1" from="description">Column label for age of child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">482</context> + <context context-type="linenumber">415</context> </context-group> </trans-unit> <trans-unit id="8539945035792949854" datatype="html"> @@ -2359,7 +2351,7 @@ <note priority="1" from="description">Column label for school attendance of child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">500</context> + <context context-type="linenumber">433</context> </context-group> </trans-unit> <trans-unit id="249709194006018190" datatype="html"> @@ -2368,7 +2360,7 @@ <note priority="1" from="description">Column label for coaching attendance of child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">509</context> + <context context-type="linenumber">442</context> </context-group> </trans-unit> <trans-unit id="7691138136265271231" datatype="html"> @@ -2377,11 +2369,11 @@ <note priority="1" from="description">Translated name of default column group</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">524</context> + <context context-type="linenumber">457</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">528</context> + <context context-type="linenumber">461</context> </context-group> </trans-unit> <trans-unit id="3007651244935433751" datatype="html"> @@ -2390,7 +2382,7 @@ <note priority="1" from="description">Column group name</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">541</context> + <context context-type="linenumber">474</context> </context-group> </trans-unit> <trans-unit id="2041675390931385838" datatype="html"> @@ -2399,11 +2391,11 @@ <note priority="1" from="description">Column group name</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">564</context> + <context context-type="linenumber">497</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">713</context> + <context context-type="linenumber">646</context> </context-group> </trans-unit> <trans-unit id="8204176479746810612" datatype="html"> @@ -2412,7 +2404,7 @@ <note priority="1" from="description">Active children filter label - true case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">594</context> + <context context-type="linenumber">527</context> </context-group> </trans-unit> <trans-unit id="1859131936150262113" datatype="html"> @@ -2421,7 +2413,7 @@ <note priority="1" from="description">Active children filter label - false case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">595</context> + <context context-type="linenumber">528</context> </context-group> </trans-unit> <trans-unit id="3465962430409924123" datatype="html"> @@ -2430,7 +2422,7 @@ <note priority="1" from="description">Header for form section</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">643</context> + <context context-type="linenumber">576</context> </context-group> </trans-unit> <trans-unit id="2332815950113444124" datatype="html"> @@ -2439,7 +2431,7 @@ <note priority="1" from="description">Header for form section</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">644</context> + <context context-type="linenumber">577</context> </context-group> </trans-unit> <trans-unit id="4030110180919534153" datatype="html"> @@ -2448,7 +2440,7 @@ <note priority="1" from="description">Header for form section</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">645</context> + <context context-type="linenumber">578</context> </context-group> </trans-unit> <trans-unit id="8020402390620783618" datatype="html"> @@ -2457,7 +2449,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">652</context> + <context context-type="linenumber">585</context> </context-group> </trans-unit> <trans-unit id="3222319974146977156" datatype="html"> @@ -2466,7 +2458,7 @@ <note priority="1" from="description">Title inside a panel</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">655</context> + <context context-type="linenumber">588</context> </context-group> </trans-unit> <trans-unit id="3424557526203996215" datatype="html"> @@ -2475,7 +2467,7 @@ <note priority="1" from="description">Title inside a panel</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">675</context> + <context context-type="linenumber">608</context> </context-group> </trans-unit> <trans-unit id="5318391578409221199" datatype="html"> @@ -2484,17 +2476,17 @@ <note priority="1" from="description">Child details section title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">679</context> + <context context-type="linenumber">612</context> </context-group> </trans-unit> <trans-unit id="6315228090956745353" datatype="html"> <source>Notes & Tasks</source> <target state="translated">Notizen & Aufgaben</target> + <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">700</context> + <context context-type="linenumber">633</context> </context-group> - <note priority="1" from="description">Panel title</note> </trans-unit> <trans-unit id="6935402381663920930" datatype="html"> <source>Height & Weight Tracking</source> @@ -2502,7 +2494,7 @@ <note priority="1" from="description">Title inside a panel</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">726</context> + <context context-type="linenumber">659</context> </context-group> </trans-unit> <trans-unit id="5035769065128916110" datatype="html"> @@ -2511,7 +2503,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">732</context> + <context context-type="linenumber">665</context> </context-group> </trans-unit> <trans-unit id="3778494590546555291" datatype="html"> @@ -2520,7 +2512,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">741</context> + <context context-type="linenumber">674</context> </context-group> </trans-unit> <trans-unit id="134488380944428715" datatype="html"> @@ -2538,7 +2530,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">828</context> + <context context-type="linenumber">761</context> </context-group> </trans-unit> <trans-unit id="4310513583397103775" datatype="html"> @@ -2547,7 +2539,7 @@ <note priority="1" from="description">Name of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">843</context> + <context context-type="linenumber">776</context> </context-group> </trans-unit> <trans-unit id="3930255838623626363" datatype="html"> @@ -2556,7 +2548,7 @@ <note priority="1" from="description">Label of report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">847</context> + <context context-type="linenumber">780</context> </context-group> </trans-unit> <trans-unit id="6949266734896136969" datatype="html"> @@ -2565,7 +2557,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">852</context> + <context context-type="linenumber">785</context> </context-group> </trans-unit> <trans-unit id="619224002419753333" datatype="html"> @@ -2574,7 +2566,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">855</context> + <context context-type="linenumber">788</context> </context-group> </trans-unit> <trans-unit id="9152633939608005299" datatype="html"> @@ -2583,7 +2575,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">859</context> + <context context-type="linenumber">792</context> </context-group> </trans-unit> <trans-unit id="5107681519279730939" datatype="html"> @@ -2592,7 +2584,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">864</context> + <context context-type="linenumber">797</context> </context-group> </trans-unit> <trans-unit id="1157409611503106802" datatype="html"> @@ -2601,7 +2593,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">868</context> + <context context-type="linenumber">801</context> </context-group> </trans-unit> <trans-unit id="6819111098994891506" datatype="html"> @@ -2610,7 +2602,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">873</context> + <context context-type="linenumber">806</context> </context-group> </trans-unit> <trans-unit id="7965975699466463064" datatype="html"> @@ -2619,7 +2611,7 @@ <note priority="1" from="description">Name of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">881</context> + <context context-type="linenumber">814</context> </context-group> </trans-unit> <trans-unit id="691530937011261622" datatype="html"> @@ -2628,7 +2620,7 @@ <note priority="1" from="description">Name of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">898</context> + <context context-type="linenumber">831</context> </context-group> </trans-unit> <trans-unit id="5910775518786454299" datatype="html"> @@ -2637,15 +2629,7 @@ <note priority="1" from="description">center</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">5</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">6</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">141</context> + <context context-type="linenumber">4</context> </context-group> </trans-unit> <trans-unit id="449116330532787155" datatype="html"> @@ -2654,11 +2638,7 @@ <note priority="1" from="description">center</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">7</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">145</context> + <context context-type="linenumber">5</context> </context-group> </trans-unit> <trans-unit id="1264264408873477158" datatype="html"> @@ -2667,11 +2647,7 @@ <note priority="1" from="description">center</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">8</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">149</context> + <context context-type="linenumber">6</context> </context-group> </trans-unit> <trans-unit id="8056881763442606556" datatype="html"> @@ -2763,7 +2739,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">758</context> + <context context-type="linenumber">691</context> </context-group> </trans-unit> <trans-unit id="8194554728555410336" datatype="html"> @@ -2776,7 +2752,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1021</context> + <context context-type="linenumber">954</context> </context-group> </trans-unit> <trans-unit id="4663189107944878630" datatype="html"> @@ -2898,7 +2874,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">51</context> + <context context-type="linenumber">41</context> </context-group> </trans-unit> <trans-unit id="2502008676398493538" datatype="html"> @@ -3019,15 +2995,15 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">477</context> + <context context-type="linenumber">410</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">909</context> + <context context-type="linenumber">842</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">993</context> + <context context-type="linenumber">926</context> </context-group> </trans-unit> <trans-unit id="4540981870704644649" datatype="html"> @@ -3052,11 +3028,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">412</context> + <context context-type="linenumber">345</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">596</context> + <context context-type="linenumber">529</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity-components/entity-list/filter-generator.service.ts</context> @@ -3137,7 +3113,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1035</context> + <context context-type="linenumber">968</context> </context-group> </trans-unit> <trans-unit id="7508893828342265603" datatype="html"> @@ -3401,7 +3377,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">488</context> + <context context-type="linenumber">421</context> </context-group> </trans-unit> <trans-unit id="888341446683346521" datatype="html"> @@ -3554,11 +3530,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">493</context> + <context context-type="linenumber">426</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">604</context> + <context context-type="linenumber">537</context> </context-group> </trans-unit> <trans-unit id="2ec188e825960640e8275e39da1e285f3c3507ca" datatype="html"> @@ -3682,11 +3658,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">813</context> + <context context-type="linenumber">746</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">891</context> + <context context-type="linenumber">824</context> </context-group> </trans-unit> <trans-unit id="5944812089887969249" datatype="html"> @@ -3788,11 +3764,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">280</context> + <context context-type="linenumber">213</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">554</context> + <context context-type="linenumber">487</context> </context-group> </trans-unit> <trans-unit id="5676017837022350033" datatype="html"> @@ -3841,7 +3817,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">939</context> + <context context-type="linenumber">872</context> </context-group> </trans-unit> <trans-unit id="5656406101358002984" datatype="html"> @@ -3854,7 +3830,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">518</context> + <context context-type="linenumber">451</context> </context-group> </trans-unit> <trans-unit id="7290235740931562779" datatype="html"> @@ -3876,7 +3852,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">886</context> + <context context-type="linenumber">819</context> </context-group> </trans-unit> <trans-unit id="1669277742108379782" datatype="html"> @@ -4089,11 +4065,11 @@ <note priority="1" from="description">Label for the address of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">946</context> + <context context-type="linenumber">879</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1014</context> + <context context-type="linenumber">947</context> </context-group> </trans-unit> <trans-unit id="326998402864900242" datatype="html"> @@ -4102,7 +4078,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">953</context> + <context context-type="linenumber">886</context> </context-group> </trans-unit> <trans-unit id="744862547206313189" datatype="html"> @@ -4111,7 +4087,7 @@ <note priority="1" from="description">Label for the religion of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">960</context> + <context context-type="linenumber">893</context> </context-group> </trans-unit> <trans-unit id="3701890980067993407" datatype="html"> @@ -4120,7 +4096,7 @@ <note priority="1" from="description">Label for the mother tongue of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">967</context> + <context context-type="linenumber">900</context> </context-group> </trans-unit> <trans-unit id="5917260200950510520" datatype="html"> @@ -4129,7 +4105,7 @@ <note priority="1" from="description">Tooltip description for the mother tongue of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">968</context> + <context context-type="linenumber">901</context> </context-group> </trans-unit> <trans-unit id="8073272694481457912" datatype="html"> @@ -4138,7 +4114,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">975</context> + <context context-type="linenumber">908</context> </context-group> </trans-unit> <trans-unit id="6479918860876850014" datatype="html"> @@ -4147,7 +4123,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">982</context> + <context context-type="linenumber">915</context> </context-group> </trans-unit> <trans-unit id="6187083324285537481" datatype="html"> @@ -4156,7 +4132,7 @@ <note priority="1" from="description">Label for if a school is a private school</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1000</context> + <context context-type="linenumber">933</context> </context-group> </trans-unit> <trans-unit id="2826581353496868063" datatype="html"> @@ -4165,7 +4141,7 @@ <note priority="1" from="description">Label for the language of a school</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1007</context> + <context context-type="linenumber">940</context> </context-group> </trans-unit> <trans-unit id="1350851235390292372" datatype="html"> @@ -4174,7 +4150,7 @@ <note priority="1" from="description">Label for the timing of a school</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1028</context> + <context context-type="linenumber">961</context> </context-group> </trans-unit> <trans-unit id="491478187387824276" datatype="html"> @@ -4183,7 +4159,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1047</context> + <context context-type="linenumber">980</context> </context-group> </trans-unit> <trans-unit id="5554741364017709807" datatype="html"> @@ -4192,7 +4168,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1048</context> + <context context-type="linenumber">981</context> </context-group> </trans-unit> <trans-unit id="9160848464711606837" datatype="html"> @@ -4201,7 +4177,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1056</context> + <context context-type="linenumber">989</context> </context-group> </trans-unit> <trans-unit id="6624198636467931210" datatype="html"> @@ -4210,7 +4186,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1057</context> + <context context-type="linenumber">990</context> </context-group> </trans-unit> <trans-unit id="7677901685281516160" datatype="html"> @@ -4219,7 +4195,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1065</context> + <context context-type="linenumber">998</context> </context-group> </trans-unit> <trans-unit id="6491820978569500382" datatype="html"> @@ -4228,7 +4204,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1066</context> + <context context-type="linenumber">999</context> </context-group> </trans-unit> <trans-unit id="6408161334810687727" datatype="html"> @@ -4237,7 +4213,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1074</context> + <context context-type="linenumber">1007</context> </context-group> </trans-unit> <trans-unit id="8707102520644001588" datatype="html"> @@ -4246,7 +4222,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1075</context> + <context context-type="linenumber">1008</context> </context-group> </trans-unit> <trans-unit id="3032098280590391265" datatype="html"> @@ -4255,7 +4231,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1083</context> + <context context-type="linenumber">1016</context> </context-group> </trans-unit> <trans-unit id="5793656352870786735" datatype="html"> @@ -4264,7 +4240,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1084</context> + <context context-type="linenumber">1017</context> </context-group> </trans-unit> <trans-unit id="7922989125096435449" datatype="html"> @@ -4273,7 +4249,7 @@ <note priority="1" from="description">Label of user phone</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1095</context> + <context context-type="linenumber">1028</context> </context-group> </trans-unit> <trans-unit id="8808439168445495463" datatype="html"> @@ -4288,11 +4264,22 @@ <trans-unit id="5175452770249467211" datatype="html"> <source>[invalid option]</source> <target state="translated">[ungültige Option]</target> + <note priority="1" from="description">enum option label prefix for invalid id dummy</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.ts</context> - <context context-type="linenumber">61</context> + <context context-type="linenumber">53</context> </context-group> - <note priority="1" from="description">enum option label prefix for invalid id dummy</note> + </trans-unit> + <trans-unit id="f02662520a5f60c9da28cdebbe9c17f34b4439c8" datatype="html"> + <source> Edit dropdown options +</source> + <target state="translated"> Bearbeite Auswahl-Optionen +</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html</context> + <context context-type="linenumber">2,3</context> + </context-group> + <note priority="1" from="description">title of dropdown options popup dialog</note> </trans-unit> <trans-unit id="3448462145758383019" datatype="html"> <source>Total</source> @@ -4300,7 +4287,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">913</context> + <context context-type="linenumber">846</context> </context-group> </trans-unit> <trans-unit id="6522877977962061564" datatype="html"> @@ -4309,7 +4296,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">917</context> + <context context-type="linenumber">850</context> </context-group> </trans-unit> <trans-unit id="5639297788212274461" datatype="html"> @@ -4318,7 +4305,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">921</context> + <context context-type="linenumber">854</context> </context-group> </trans-unit> <trans-unit id="3973270758175692787" datatype="html"> @@ -4327,7 +4314,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">925</context> + <context context-type="linenumber">858</context> </context-group> </trans-unit> <trans-unit id="f10d5109ec72341c3a043905f31ccbfdd4c59923" datatype="html"> @@ -4525,7 +4512,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">60</context> + <context context-type="linenumber">61</context> </context-group> </trans-unit> <trans-unit id="e67bebb0291cbe76b190e83225878cdd3a8a6df6" datatype="html"> @@ -4715,12 +4702,8 @@ <target state="translated">Dieses Feld ist erforderlich</target> <note priority="1" from="description">Error message for any input</note> <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.html</context> - <context context-type="linenumber">21</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.html</context> - <context context-type="linenumber">62</context> + <context context-type="sourcefile">src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.html</context> + <context context-type="linenumber">57</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-text-with-autocomplete/edit-text-with-autocomplete.component.html</context> @@ -4731,6 +4714,14 @@ <context context-type="linenumber">23</context> </context-group> </trans-unit> + <trans-unit id="5432260252143962374" datatype="html"> + <source>Create new option</source> + <target state="translated">Erstelle eine neue Option</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.ts</context> + <context context-type="linenumber">188</context> + </context-group> + </trans-unit> <trans-unit id="8998179362936748717" datatype="html"> <source>OK</source> <target state="translated">OK</target> @@ -4802,16 +4793,6 @@ <context context-type="linenumber">16</context> </context-group> </trans-unit> - <trans-unit id="4668912478133095886" datatype="html"> - <source>Select <x id="PH" equiv-text="config.formFieldConfig.label || config.propertySchema?.label"/></source> - <target state="translated"><x id="PH" equiv-text="this.label"/> auswählen</target> - <note priority="1" from="description">context Select User</note> - <note priority="1" from="meaning">Placeholder for input to set an entity</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.ts</context> - <context context-type="linenumber">62</context> - </context-group> - </trans-unit> <trans-unit id="1f05f87b0643c90a090870fcfdb99d888b556f23" datatype="html"> <source>Creating new record.</source> <target state="translated">Erstelle neuen Eintrag.</target> @@ -4897,7 +4878,7 @@ <target state="translated">Daten vorbereiten (indizieren)</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity/database-indexing/database-indexing.service.ts</context> - <context context-type="linenumber">60</context> + <context context-type="linenumber">59</context> </context-group> </trans-unit> <trans-unit id="7922101943521622219" datatype="html"> @@ -4929,18 +4910,50 @@ <trans-unit id="396111f33ef48eef016cd0eedb7be2ef882d7430" datatype="html"> <source> Close </source> <target state="translated">Schließen</target> - <note priority="1" from="description">Generic close button</note> + <note priority="1" from="description">Close popup</note> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html</context> + <context context-type="linenumber">34</context> + </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/changelog/changelog.component.html</context> <context context-type="linenumber">54</context> </context-group> </trans-unit> + <trans-unit id="1729165161001518929" datatype="html"> + <source>Are you sure that you want to delete the option <x id="PH" equiv-text="value.label"/>?</source> + <target state="translated">Sind Sie sicher, dass Sie die Option <x id="PH" equiv-text="value.label"/> löschen wollen?</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">68</context> + </context-group> + </trans-unit> + <trans-unit id="6524829042498938726" datatype="html"> + <source> The option is still used in <x id="PH" equiv-text="existingUsages.join( + ", " + )"/> records. If deleted, the records will not be lost but specially marked</source> + <target state="translated"> Die Option wird noch in <x id="PH" equiv-text="existingUsages.join( + ", " + )"/> Einträgen genutzt. Falls Sie die Option dennoch löschen, werden die Einträge nicht gelöscht aber gesondert markiert.</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">70,72</context> + </context-group> + </trans-unit> + <trans-unit id="3767101596108414700" datatype="html"> + <source>Delete option</source> + <target state="translated">Option Löschen</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">75</context> + </context-group> + </trans-unit> <trans-unit id="2566001175328025157" datatype="html"> <source>No Changelog Available</source> <target state="translated">Kein Changelog verfügbar</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/changelog/changelog.component.ts</context> - <context context-type="linenumber">87</context> + <context context-type="linenumber">89</context> </context-group> </trans-unit> <trans-unit id="7795087408392131030" datatype="html"> @@ -4948,7 +4961,7 @@ <target state="translated">Neuste Änderungen konnten nicht geladen werden: <x id="PH" equiv-text="error"/></target> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/latest-changes.service.ts</context> - <context context-type="linenumber">131</context> + <context context-type="linenumber">121</context> </context-group> </trans-unit> <trans-unit id="2896181875024748753" datatype="html"> @@ -5181,7 +5194,7 @@ <note priority="1" from="description">Navigate to user profile page</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/ui/ui/ui.component.html</context> - <context context-type="linenumber">84</context> + <context context-type="linenumber">85</context> </context-group> </trans-unit> <trans-unit id="8bf270adb01cb85e970eb6465bc3167bb04598de" datatype="html"> @@ -5190,7 +5203,7 @@ <note priority="1" from="description">Sign out of the app</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/ui/ui/ui.component.html</context> - <context context-type="linenumber">89</context> + <context context-type="linenumber">90</context> </context-group> </trans-unit> <trans-unit id="1265dade629b76077f2ee5866dc1ed2f8cf03860" datatype="html"> @@ -5461,7 +5474,7 @@ <target state="translated">Import abgeschlossen</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">59</context> + <context context-type="linenumber">60</context> </context-group> </trans-unit> <trans-unit id="1906738132039774080" datatype="html"> diff --git a/src/assets/locale/messages.fr.xlf b/src/assets/locale/messages.fr.xlf index bb97a4b3cb..a9be18cbac 100644 --- a/src/assets/locale/messages.fr.xlf +++ b/src/assets/locale/messages.fr.xlf @@ -85,7 +85,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1035</context> + <context context-type="linenumber">968</context> </context-group> </trans-unit> <trans-unit id="7508893828342265603" datatype="html"> @@ -244,7 +244,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">886</context> + <context context-type="linenumber">819</context> </context-group> </trans-unit> <trans-unit id="1669277742108379782" datatype="html"> @@ -741,11 +741,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">493</context> + <context context-type="linenumber">426</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">604</context> + <context context-type="linenumber">537</context> </context-group> </trans-unit> <trans-unit id="2ec188e825960640e8275e39da1e285f3c3507ca" datatype="html"> @@ -869,11 +869,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">813</context> + <context context-type="linenumber">746</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">891</context> + <context context-type="linenumber">824</context> </context-group> </trans-unit> <trans-unit id="5944812089887969249" datatype="html"> @@ -956,11 +956,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">412</context> + <context context-type="linenumber">345</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">596</context> + <context context-type="linenumber">529</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity-components/entity-list/filter-generator.service.ts</context> @@ -1045,7 +1045,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">758</context> + <context context-type="linenumber">691</context> </context-group> </trans-unit> <trans-unit id="5910775518786454299" datatype="html"> @@ -1054,15 +1054,7 @@ <note priority="1" from="description">center</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">5</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">6</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">141</context> + <context context-type="linenumber">4</context> </context-group> </trans-unit> <trans-unit id="449116330532787155" datatype="html"> @@ -1071,11 +1063,7 @@ <note priority="1" from="description">center</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">7</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">145</context> + <context context-type="linenumber">5</context> </context-group> </trans-unit> <trans-unit id="1264264408873477158" datatype="html"> @@ -1084,11 +1072,7 @@ <note priority="1" from="description">center</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">8</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">149</context> + <context context-type="linenumber">6</context> </context-group> </trans-unit> <trans-unit id="8056881763442606556" datatype="html"> @@ -1180,15 +1164,15 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">477</context> + <context context-type="linenumber">410</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">909</context> + <context context-type="linenumber">842</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">993</context> + <context context-type="linenumber">926</context> </context-group> </trans-unit> <trans-unit id="4540981870704644649" datatype="html"> @@ -1268,11 +1252,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">280</context> + <context context-type="linenumber">213</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">554</context> + <context context-type="linenumber">487</context> </context-group> </trans-unit> <trans-unit id="5676017837022350033" datatype="html"> @@ -1321,7 +1305,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1021</context> + <context context-type="linenumber">954</context> </context-group> </trans-unit> <trans-unit id="3933358723756013068" datatype="html"> @@ -1334,7 +1318,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">939</context> + <context context-type="linenumber">872</context> </context-group> </trans-unit> <trans-unit id="4378796785985219718" datatype="html"> @@ -1347,7 +1331,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">488</context> + <context context-type="linenumber">421</context> </context-group> </trans-unit> <trans-unit id="888341446683346521" datatype="html"> @@ -1641,7 +1625,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">518</context> + <context context-type="linenumber">451</context> </context-group> </trans-unit> <trans-unit id="7290235740931562779" datatype="html"> @@ -2201,15 +2185,15 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">36</context> + <context context-type="linenumber">26</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">593</context> + <context context-type="linenumber">526</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">940</context> + <context context-type="linenumber">873</context> </context-group> </trans-unit> <trans-unit id="9127604588498960753" datatype="html"> @@ -2239,7 +2223,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">51</context> + <context context-type="linenumber">41</context> </context-group> </trans-unit> <trans-unit id="2502008676398493538" datatype="html"> @@ -2647,6 +2631,22 @@ <context context-type="linenumber">75</context> </context-group> </trans-unit> + <trans-unit id="2468578017924444574" datatype="html"> + <source>Example form</source> + <target state="new">Example form</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/public-form/demo-public-form-generator.service.ts</context> + <context context-type="linenumber">18</context> + </context-group> + </trans-unit> + <trans-unit id="5065162821808701761" datatype="html"> + <source>This is a form that can be shared as a link or embedded in a website. It can be filled by users without having an account. For example you can let participants self-register their details and just review the records within Aam Digital.</source> + <target state="new">This is a form that can be shared as a link or embedded in a website. It can be filled by users without having an account. For example you can let participants self-register their details and just review the records within Aam Digital.</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/public-form/demo-public-form-generator.service.ts</context> + <context context-type="linenumber">19</context> + </context-group> + </trans-unit> <trans-unit id="f215ed23a0b8105ae47ef80cf65fe765631dd94a" datatype="html"> <source> Submit Form </source> <target state="new"> Submit Form </target> @@ -2670,7 +2670,7 @@ <target state="new">Successfully submitted form</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/public-form/public-form.component.ts</context> - <context context-type="linenumber">58</context> + <context context-type="linenumber">62</context> </context-group> </trans-unit> <trans-unit id="339729126805226016" datatype="html"> @@ -3011,11 +3011,11 @@ <trans-unit id="1237640232293738415" datatype="html"> <source>Aam Digital - DEMO (automatically generated data)</source> <target state="new">Aam Digital - DEMO (automatically generated data)</target> + <note priority="1" from="description">Page title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">22</context> + <context context-type="linenumber">12</context> </context-group> - <note priority="1" from="description">Page title</note> </trans-unit> <trans-unit id="6570363013146073520" datatype="html"> <source>Dashboard</source> @@ -3023,7 +3023,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">31</context> + <context context-type="linenumber">21</context> </context-group> </trans-unit> <trans-unit id="7026624912846603653" datatype="html"> @@ -3036,11 +3036,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">41</context> + <context context-type="linenumber">31</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">409</context> + <context context-type="linenumber">342</context> </context-group> </trans-unit> <trans-unit id="134488380944428715" datatype="html"> @@ -3058,7 +3058,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">61</context> + <context context-type="linenumber">51</context> </context-group> </trans-unit> <trans-unit id="1071721880474488785" datatype="html"> @@ -3067,7 +3067,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">66</context> + <context context-type="linenumber">56</context> </context-group> </trans-unit> <trans-unit id="4555457172864212828" datatype="html"> @@ -3076,7 +3076,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">71</context> + <context context-type="linenumber">61</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/user/user.ts</context> @@ -3089,7 +3089,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">76</context> + <context context-type="linenumber">66</context> </context-group> </trans-unit> <trans-unit id="657496228690855434" datatype="html"> @@ -3098,7 +3098,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">81</context> + <context context-type="linenumber">71</context> </context-group> </trans-unit> <trans-unit id="7911416166208830577" datatype="html"> @@ -3107,61 +3107,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">86</context> - </context-group> - </trans-unit> - <trans-unit id="6691439998827511114" datatype="html"> - <source>OK (copy with us)</source> - <target state="translated">OK (copie avec nous)</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">109</context> - </context-group> - </trans-unit> - <trans-unit id="7233426447535381432" datatype="html"> - <source>OK (copy needed for us)</source> - <target state="translated">OK (nous avons besoin de la copie)</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">114</context> - </context-group> - </trans-unit> - <trans-unit id="7892131631225988542" datatype="html"> - <source>needs correction</source> - <target state="translated">besoin de correction</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">119</context> - </context-group> - </trans-unit> - <trans-unit id="7543632648034985521" datatype="html"> - <source>applied</source> - <target state="translated">Remis</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">124</context> - </context-group> - </trans-unit> - <trans-unit id="2743017402754335830" datatype="html"> - <source>doesn't have</source> - <target state="translated">n'a pas</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">129</context> - </context-group> - </trans-unit> - <trans-unit id="6322199449220989816" datatype="html"> - <source>not eligible</source> - <target state="translated">non éligible</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">134</context> + <context context-type="linenumber">76</context> </context-group> </trans-unit> <trans-unit id="2935152225387412918" datatype="html"> @@ -3171,7 +3117,7 @@ <note priority="1" from="meaning">Dashboard shortcut widget</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">163</context> + <context context-type="linenumber">91</context> </context-group> </trans-unit> <trans-unit id="2111561618518210212" datatype="html"> @@ -3181,8 +3127,18 @@ <note priority="1" from="meaning">Dashboard shortcut widget</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">168</context> + <context context-type="linenumber">96</context> + </context-group> + </trans-unit> + <trans-unit id="7749314122565677607" datatype="html"> + <source>Public Registration Form</source> + <target state="new">Public Registration Form</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> + <context context-type="linenumber">101</context> </context-group> + <note priority="1" from="description">open public form</note> + <note priority="1" from="meaning">Dashboard shortcut widget</note> </trans-unit> <trans-unit id="2329598843423950672" datatype="html"> <source>last week</source> @@ -3190,7 +3146,7 @@ <note priority="1" from="description">Attendance week dashboard widget label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">215</context> + <context context-type="linenumber">148</context> </context-group> </trans-unit> <trans-unit id="6802197953477344728" datatype="html"> @@ -3199,7 +3155,7 @@ <note priority="1" from="description">Attendance week dashboard widget label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">222</context> + <context context-type="linenumber">155</context> </context-group> </trans-unit> <trans-unit id="8955128195791312286" datatype="html"> @@ -3208,7 +3164,7 @@ <note priority="1" from="description">Attendance week dashboard widget label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">208</context> + <context context-type="linenumber">141</context> </context-group> </trans-unit> <trans-unit id="1813769493203572551" datatype="html"> @@ -3217,7 +3173,7 @@ <note priority="1" from="description">Title for notes overview</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">244</context> + <context context-type="linenumber">177</context> </context-group> </trans-unit> <trans-unit id="2798807656507405918" datatype="html"> @@ -3226,11 +3182,11 @@ <note priority="1" from="description">Translated name of default column group</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">254</context> + <context context-type="linenumber">187</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">258</context> + <context context-type="linenumber">191</context> </context-group> </trans-unit> <trans-unit id="1002165214775409029" datatype="html"> @@ -3239,19 +3195,19 @@ <note priority="1" from="description">Translated name of mobile column group</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">255</context> + <context context-type="linenumber">188</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">268</context> + <context context-type="linenumber">201</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">525</context> + <context context-type="linenumber">458</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">579</context> + <context context-type="linenumber">512</context> </context-group> </trans-unit> <trans-unit id="6309181788204949218" datatype="html"> @@ -3260,7 +3216,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">355</context> + <context context-type="linenumber">288</context> </context-group> </trans-unit> <trans-unit id="8878700331247603166" datatype="html"> @@ -3269,7 +3225,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">374</context> + <context context-type="linenumber">307</context> </context-group> </trans-unit> <trans-unit id="7910125616758063638" datatype="html"> @@ -3278,7 +3234,7 @@ <note priority="1" from="description">Filename of markdown help page (make sure the filename you enter as a translation actually exists on the server!)</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">388</context> + <context context-type="linenumber">321</context> </context-group> </trans-unit> <trans-unit id="3686284950598311784" datatype="html"> @@ -3287,7 +3243,7 @@ <note priority="1" from="description">Label for private schools filter - true case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">410</context> + <context context-type="linenumber">343</context> </context-group> </trans-unit> <trans-unit id="6264204010127975648" datatype="html"> @@ -3296,7 +3252,7 @@ <note priority="1" from="description">Label for private schools filter - false case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">411</context> + <context context-type="linenumber">344</context> </context-group> </trans-unit> <trans-unit id="6187083324285537481" datatype="html"> @@ -3305,7 +3261,7 @@ <note priority="1" from="description">Label for if a school is a private school</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1000</context> + <context context-type="linenumber">933</context> </context-group> </trans-unit> <trans-unit id="8781767917622107949" datatype="html"> @@ -3314,15 +3270,15 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">423</context> + <context context-type="linenumber">356</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">615</context> + <context context-type="linenumber">548</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">798</context> + <context context-type="linenumber">731</context> </context-group> </trans-unit> <trans-unit id="2562531496877210322" datatype="html"> @@ -3331,7 +3287,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">451</context> + <context context-type="linenumber">384</context> </context-group> </trans-unit> <trans-unit id="2309808536212982229" datatype="html"> @@ -3340,7 +3296,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">460</context> + <context context-type="linenumber">393</context> </context-group> </trans-unit> <trans-unit id="1130652265542107236" datatype="html"> @@ -3349,7 +3305,7 @@ <note priority="1" from="description">Column label for age of child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">482</context> + <context context-type="linenumber">415</context> </context-group> </trans-unit> <trans-unit id="8539945035792949854" datatype="html"> @@ -3358,7 +3314,7 @@ <note priority="1" from="description">Column label for school attendance of child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">500</context> + <context context-type="linenumber">433</context> </context-group> </trans-unit> <trans-unit id="249709194006018190" datatype="html"> @@ -3367,7 +3323,7 @@ <note priority="1" from="description">Column label for coaching attendance of child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">509</context> + <context context-type="linenumber">442</context> </context-group> </trans-unit> <trans-unit id="3007651244935433751" datatype="html"> @@ -3376,7 +3332,7 @@ <note priority="1" from="description">Column group name</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">541</context> + <context context-type="linenumber">474</context> </context-group> </trans-unit> <trans-unit id="7691138136265271231" datatype="html"> @@ -3385,11 +3341,11 @@ <note priority="1" from="description">Translated name of default column group</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">524</context> + <context context-type="linenumber">457</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">528</context> + <context context-type="linenumber">461</context> </context-group> </trans-unit> <trans-unit id="2041675390931385838" datatype="html"> @@ -3398,11 +3354,11 @@ <note priority="1" from="description">Column group name</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">564</context> + <context context-type="linenumber">497</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">713</context> + <context context-type="linenumber">646</context> </context-group> </trans-unit> <trans-unit id="8204176479746810612" datatype="html"> @@ -3411,7 +3367,7 @@ <note priority="1" from="description">Active children filter label - true case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">594</context> + <context context-type="linenumber">527</context> </context-group> </trans-unit> <trans-unit id="1859131936150262113" datatype="html"> @@ -3420,7 +3376,7 @@ <note priority="1" from="description">Active children filter label - false case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">595</context> + <context context-type="linenumber">528</context> </context-group> </trans-unit> <trans-unit id="3465962430409924123" datatype="html"> @@ -3429,7 +3385,7 @@ <note priority="1" from="description">Header for form section</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">643</context> + <context context-type="linenumber">576</context> </context-group> </trans-unit> <trans-unit id="2332815950113444124" datatype="html"> @@ -3438,7 +3394,7 @@ <note priority="1" from="description">Header for form section</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">644</context> + <context context-type="linenumber">577</context> </context-group> </trans-unit> <trans-unit id="4030110180919534153" datatype="html"> @@ -3447,7 +3403,7 @@ <note priority="1" from="description">Header for form section</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">645</context> + <context context-type="linenumber">578</context> </context-group> </trans-unit> <trans-unit id="8020402390620783618" datatype="html"> @@ -3456,7 +3412,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">652</context> + <context context-type="linenumber">585</context> </context-group> </trans-unit> <trans-unit id="3222319974146977156" datatype="html"> @@ -3465,7 +3421,7 @@ <note priority="1" from="description">Title inside a panel</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">655</context> + <context context-type="linenumber">588</context> </context-group> </trans-unit> <trans-unit id="3424557526203996215" datatype="html"> @@ -3474,7 +3430,7 @@ <note priority="1" from="description">Title inside a panel</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">675</context> + <context context-type="linenumber">608</context> </context-group> </trans-unit> <trans-unit id="5318391578409221199" datatype="html"> @@ -3483,17 +3439,17 @@ <note priority="1" from="description">Child details section title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">679</context> + <context context-type="linenumber">612</context> </context-group> </trans-unit> <trans-unit id="6315228090956745353" datatype="html"> <source>Notes & Tasks</source> <target state="new">Notes & Tasks</target> + <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">700</context> + <context context-type="linenumber">633</context> </context-group> - <note priority="1" from="description">Panel title</note> </trans-unit> <trans-unit id="4817207543436133742" datatype="html"> <source>Attendance</source> @@ -3501,25 +3457,25 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">46</context> + <context context-type="linenumber">36</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">691</context> + <context context-type="linenumber">624</context> </context-group> </trans-unit> <trans-unit id="6904866445262015585" datatype="html"> <source>Tasks</source> <target state="new">Tasks</target> + <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">56</context> + <context context-type="linenumber">46</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/todos/model/todo.ts</context> <context context-type="linenumber">32</context> </context-group> - <note priority="1" from="description">Menu item</note> </trans-unit> <trans-unit id="6935402381663920930" datatype="html"> <source>Height & Weight Tracking</source> @@ -3527,7 +3483,7 @@ <note priority="1" from="description">Title inside a panel</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">726</context> + <context context-type="linenumber">659</context> </context-group> </trans-unit> <trans-unit id="5035769065128916110" datatype="html"> @@ -3536,7 +3492,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">732</context> + <context context-type="linenumber">665</context> </context-group> </trans-unit> <trans-unit id="3778494590546555291" datatype="html"> @@ -3545,7 +3501,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">741</context> + <context context-type="linenumber">674</context> </context-group> </trans-unit> <trans-unit id="6470725856224531255" datatype="html"> @@ -3554,7 +3510,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">828</context> + <context context-type="linenumber">761</context> </context-group> </trans-unit> <trans-unit id="4310513583397103775" datatype="html"> @@ -3563,7 +3519,7 @@ <note priority="1" from="description">Name of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">843</context> + <context context-type="linenumber">776</context> </context-group> </trans-unit> <trans-unit id="3930255838623626363" datatype="html"> @@ -3572,7 +3528,7 @@ <note priority="1" from="description">Label of report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">847</context> + <context context-type="linenumber">780</context> </context-group> </trans-unit> <trans-unit id="6949266734896136969" datatype="html"> @@ -3581,7 +3537,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">852</context> + <context context-type="linenumber">785</context> </context-group> </trans-unit> <trans-unit id="619224002419753333" datatype="html"> @@ -3590,7 +3546,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">855</context> + <context context-type="linenumber">788</context> </context-group> </trans-unit> <trans-unit id="9152633939608005299" datatype="html"> @@ -3599,7 +3555,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">859</context> + <context context-type="linenumber">792</context> </context-group> </trans-unit> <trans-unit id="5107681519279730939" datatype="html"> @@ -3608,7 +3564,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">864</context> + <context context-type="linenumber">797</context> </context-group> </trans-unit> <trans-unit id="1157409611503106802" datatype="html"> @@ -3617,7 +3573,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">868</context> + <context context-type="linenumber">801</context> </context-group> </trans-unit> <trans-unit id="6819111098994891506" datatype="html"> @@ -3626,7 +3582,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">873</context> + <context context-type="linenumber">806</context> </context-group> </trans-unit> <trans-unit id="7965975699466463064" datatype="html"> @@ -3635,7 +3591,7 @@ <note priority="1" from="description">Name of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">881</context> + <context context-type="linenumber">814</context> </context-group> </trans-unit> <trans-unit id="691530937011261622" datatype="html"> @@ -3644,7 +3600,7 @@ <note priority="1" from="description">Name of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">898</context> + <context context-type="linenumber">831</context> </context-group> </trans-unit> <trans-unit id="3448462145758383019" datatype="html"> @@ -3653,7 +3609,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">913</context> + <context context-type="linenumber">846</context> </context-group> </trans-unit> <trans-unit id="6522877977962061564" datatype="html"> @@ -3662,7 +3618,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">917</context> + <context context-type="linenumber">850</context> </context-group> </trans-unit> <trans-unit id="5639297788212274461" datatype="html"> @@ -3671,7 +3627,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">921</context> + <context context-type="linenumber">854</context> </context-group> </trans-unit> <trans-unit id="3973270758175692787" datatype="html"> @@ -3680,7 +3636,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">925</context> + <context context-type="linenumber">858</context> </context-group> </trans-unit> <trans-unit id="6304432362546770951" datatype="html"> @@ -3689,11 +3645,11 @@ <note priority="1" from="description">Label for the address of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">946</context> + <context context-type="linenumber">879</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1014</context> + <context context-type="linenumber">947</context> </context-group> </trans-unit> <trans-unit id="326998402864900242" datatype="html"> @@ -3702,7 +3658,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">953</context> + <context context-type="linenumber">886</context> </context-group> </trans-unit> <trans-unit id="744862547206313189" datatype="html"> @@ -3711,7 +3667,7 @@ <note priority="1" from="description">Label for the religion of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">960</context> + <context context-type="linenumber">893</context> </context-group> </trans-unit> <trans-unit id="3701890980067993407" datatype="html"> @@ -3720,7 +3676,7 @@ <note priority="1" from="description">Label for the mother tongue of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">967</context> + <context context-type="linenumber">900</context> </context-group> </trans-unit> <trans-unit id="5917260200950510520" datatype="html"> @@ -3729,7 +3685,7 @@ <note priority="1" from="description">Tooltip description for the mother tongue of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">968</context> + <context context-type="linenumber">901</context> </context-group> </trans-unit> <trans-unit id="8073272694481457912" datatype="html"> @@ -3738,7 +3694,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">975</context> + <context context-type="linenumber">908</context> </context-group> </trans-unit> <trans-unit id="6479918860876850014" datatype="html"> @@ -3747,7 +3703,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">982</context> + <context context-type="linenumber">915</context> </context-group> </trans-unit> <trans-unit id="2826581353496868063" datatype="html"> @@ -3756,7 +3712,7 @@ <note priority="1" from="description">Label for the language of a school</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1007</context> + <context context-type="linenumber">940</context> </context-group> </trans-unit> <trans-unit id="1350851235390292372" datatype="html"> @@ -3765,7 +3721,7 @@ <note priority="1" from="description">Label for the timing of a school</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1028</context> + <context context-type="linenumber">961</context> </context-group> </trans-unit> <trans-unit id="491478187387824276" datatype="html"> @@ -3774,7 +3730,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1047</context> + <context context-type="linenumber">980</context> </context-group> </trans-unit> <trans-unit id="5554741364017709807" datatype="html"> @@ -3783,7 +3739,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1048</context> + <context context-type="linenumber">981</context> </context-group> </trans-unit> <trans-unit id="9160848464711606837" datatype="html"> @@ -3792,7 +3748,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1056</context> + <context context-type="linenumber">989</context> </context-group> </trans-unit> <trans-unit id="6624198636467931210" datatype="html"> @@ -3801,7 +3757,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1057</context> + <context context-type="linenumber">990</context> </context-group> </trans-unit> <trans-unit id="7677901685281516160" datatype="html"> @@ -3810,7 +3766,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1065</context> + <context context-type="linenumber">998</context> </context-group> </trans-unit> <trans-unit id="6491820978569500382" datatype="html"> @@ -3819,7 +3775,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1066</context> + <context context-type="linenumber">999</context> </context-group> </trans-unit> <trans-unit id="6408161334810687727" datatype="html"> @@ -3828,7 +3784,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1074</context> + <context context-type="linenumber">1007</context> </context-group> </trans-unit> <trans-unit id="8707102520644001588" datatype="html"> @@ -3837,7 +3793,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1075</context> + <context context-type="linenumber">1008</context> </context-group> </trans-unit> <trans-unit id="3032098280590391265" datatype="html"> @@ -3846,7 +3802,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1083</context> + <context context-type="linenumber">1016</context> </context-group> </trans-unit> <trans-unit id="5793656352870786735" datatype="html"> @@ -3855,7 +3811,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1084</context> + <context context-type="linenumber">1017</context> </context-group> </trans-unit> <trans-unit id="7922989125096435449" datatype="html"> @@ -3864,7 +3820,7 @@ <note priority="1" from="description">Label of user phone</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1095</context> + <context context-type="linenumber">1028</context> </context-group> </trans-unit> <trans-unit id="4663189107944878630" datatype="html"> @@ -3973,23 +3929,30 @@ <trans-unit id="5175452770249467211" datatype="html"> <source>[invalid option]</source> <target state="new">[invalid option]</target> + <note priority="1" from="description">enum option label prefix for invalid id dummy</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.ts</context> - <context context-type="linenumber">61</context> + <context context-type="linenumber">53</context> </context-group> - <note priority="1" from="description">enum option label prefix for invalid id dummy</note> + </trans-unit> + <trans-unit id="f02662520a5f60c9da28cdebbe9c17f34b4439c8" datatype="html"> + <source> Edit dropdown options +</source> + <target state="new"> Edit dropdown options +</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html</context> + <context context-type="linenumber">2,3</context> + </context-group> + <note priority="1" from="description">title of dropdown options popup dialog</note> </trans-unit> <trans-unit id="7a39368f9393f9bf97632d275e023ffbbe594be8" datatype="html"> <source> This field is required </source> <target state="translated"> Ce champ doit être rempli </target> <note priority="1" from="description">Error message for any input</note> <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.html</context> - <context context-type="linenumber">21</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.html</context> - <context context-type="linenumber">62</context> + <context context-type="sourcefile">src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.html</context> + <context context-type="linenumber">57</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-text-with-autocomplete/edit-text-with-autocomplete.component.html</context> @@ -4000,6 +3963,14 @@ <context context-type="linenumber">23</context> </context-group> </trans-unit> + <trans-unit id="5432260252143962374" datatype="html"> + <source>Create new option</source> + <target state="new">Create new option</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.ts</context> + <context context-type="linenumber">188</context> + </context-group> + </trans-unit> <trans-unit id="8998179362936748717" datatype="html"> <source>OK</source> <target state="translated"> OK </target> @@ -4372,16 +4343,6 @@ <context context-type="linenumber">16</context> </context-group> </trans-unit> - <trans-unit id="4668912478133095886" datatype="html"> - <source>Select <x id="PH" equiv-text="config.formFieldConfig.label || config.propertySchema?.label"/></source> - <target state="translated">Sélectionner <x id="PH" equiv-text="this.label"/></target> - <note priority="1" from="description">context Select User</note> - <note priority="1" from="meaning">Placeholder for input to set an entity</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.ts</context> - <context context-type="linenumber">62</context> - </context-group> - </trans-unit> <trans-unit id="1f05f87b0643c90a090870fcfdb99d888b556f23" datatype="html"> <source>Creating new record.</source> <target state="new">Creating new record.</target> @@ -4468,7 +4429,7 @@ <target state="translated">Préparation des données (Indexation)</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity/database-indexing/database-indexing.service.ts</context> - <context context-type="linenumber">60</context> + <context context-type="linenumber">59</context> </context-group> </trans-unit> <trans-unit id="5210270493533766316" datatype="html"> @@ -4508,7 +4469,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">60</context> + <context context-type="linenumber">61</context> </context-group> </trans-unit> <trans-unit id="b861ed5da3dd3eb5d9c310853179eafc152d7b68" datatype="html"> @@ -4549,18 +4510,50 @@ <trans-unit id="396111f33ef48eef016cd0eedb7be2ef882d7430" datatype="html"> <source> Close </source> <target state="translated"> Fermer </target> - <note priority="1" from="description">Generic close button</note> + <note priority="1" from="description">Close popup</note> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html</context> + <context context-type="linenumber">34</context> + </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/changelog/changelog.component.html</context> <context context-type="linenumber">54</context> </context-group> </trans-unit> + <trans-unit id="1729165161001518929" datatype="html"> + <source>Are you sure that you want to delete the option <x id="PH" equiv-text="value.label"/>?</source> + <target state="new">Are you sure that you want to delete the option <x id="PH" equiv-text="value.label"/>?</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">68</context> + </context-group> + </trans-unit> + <trans-unit id="6524829042498938726" datatype="html"> + <source> The option is still used in <x id="PH" equiv-text="existingUsages.join( + ", " + )"/> records. If deleted, the records will not be lost but specially marked</source> + <target state="new"> The option is still used in <x id="PH" equiv-text="existingUsages.join( + ", " + )"/> records. If deleted, the records will not be lost but specially marked</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">70,72</context> + </context-group> + </trans-unit> + <trans-unit id="3767101596108414700" datatype="html"> + <source>Delete option</source> + <target state="new">Delete option</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">75</context> + </context-group> + </trans-unit> <trans-unit id="2566001175328025157" datatype="html"> <source>No Changelog Available</source> <target state="translated">Aucun historique des modifications disponible</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/changelog/changelog.component.ts</context> - <context context-type="linenumber">87</context> + <context context-type="linenumber">89</context> </context-group> </trans-unit> <trans-unit id="7795087408392131030" datatype="html"> @@ -4568,7 +4561,7 @@ <target state="translated">Les dernières modifications n'ont pas pu être chargées: <x id="PH" equiv-text="error"/></target> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/latest-changes.service.ts</context> - <context context-type="linenumber">131</context> + <context context-type="linenumber">121</context> </context-group> </trans-unit> <trans-unit id="2896181875024748753" datatype="html"> @@ -4858,7 +4851,7 @@ <note priority="1" from="description">Navigate to user profile page</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/ui/ui/ui.component.html</context> - <context context-type="linenumber">84</context> + <context context-type="linenumber">85</context> </context-group> </trans-unit> <trans-unit id="8bf270adb01cb85e970eb6465bc3167bb04598de" datatype="html"> @@ -4867,7 +4860,7 @@ <note priority="1" from="description">Sign out of the app</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/ui/ui/ui.component.html</context> - <context context-type="linenumber">89</context> + <context context-type="linenumber">90</context> </context-group> </trans-unit> <trans-unit id="406df86e338f5992ef27c4bc35dda98e3e651e34" datatype="html"> @@ -5129,7 +5122,7 @@ <target state="new">Import completed</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">59</context> + <context context-type="linenumber">60</context> </context-group> </trans-unit> <trans-unit id="2a62a59d9424e9e869061ebf3e8f8b8f95411571" datatype="html"> @@ -5167,7 +5160,7 @@ <target state="translated">Importer de nouvelles données ?</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">75</context> + <context context-type="linenumber">76</context> </context-group> </trans-unit> <trans-unit id="1690350829788615736" datatype="html"> @@ -5177,7 +5170,7 @@ This will add or update <x id="PH" equiv-text="csvFile.data.length"/> records from the loaded file.</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">76</context> + <context context-type="linenumber">77</context> </context-group> </trans-unit> <trans-unit id="5345022420402242415" datatype="html"> @@ -5185,7 +5178,7 @@ <target state="new"><x id="PH" equiv-text="refText"/> All existing records imported with the transaction id '<x id="PH_1" equiv-text="importMeta.transactionId"/>' will be deleted!</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">79</context> + <context context-type="linenumber">80</context> </context-group> </trans-unit> <trans-unit id="4fd611f679282abb73122b03bfed3724dba9b6bf" datatype="html"> @@ -5482,14 +5475,34 @@ <context context-type="linenumber">113</context> </context-group> </trans-unit> + <trans-unit id="22ee8aecedfcdfcd3313bc6c5f0e80175bfafd58" datatype="html"> + <source> Select displayed locations +</source> + <target state="new"> Select displayed locations +</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/location/map/map-properties-popup/map-properties-popup.component.html</context> + <context context-type="linenumber">1,3</context> + </context-group> + <note priority="1" from="description">Title of popup to select locations that are displayed in the map</note> + </trans-unit> + <trans-unit id="c2d0ac9f528bbd5f53fd34269fde8b59e029621b" datatype="html"> + <source>Apply</source> + <target state="new">Apply</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/location/map/map-properties-popup/map-properties-popup.component.html</context> + <context context-type="linenumber">18</context> + </context-group> + <note priority="1" from="description">Button for closing popup and applying changes</note> + </trans-unit> <trans-unit id="2549737213024136740" datatype="html"> - <source><x id="PH" equiv-text="res"/> km</source> + <source><x id="PH" equiv-text="closest"/> km</source> <target state="new"><x id="PH" equiv-text="res"/> km</target> <note priority="1" from="description">e.g. 5 km</note> <note priority="1" from="meaning">distance with unit</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/location/view-distance/view-distance.component.ts</context> - <context context-type="linenumber">73</context> + <context context-type="linenumber">65</context> </context-group> </trans-unit> <trans-unit id="4bc0107bf7dcdac8c02c5ced13ad79c23c253148" datatype="html"> @@ -5504,11 +5517,11 @@ <trans-unit id="a4cdca73d44b64c6cfa677e10047ccd7e4a41e2a" datatype="html"> <source> Select <x id="INTERPOLATION" equiv-text="{{ side.entityType?.label }}"/> </source> <target state="translated"> Select <x id="INTERPOLATION" equiv-text="{{ side.entityType.label }}"/> </target> + <note priority="1" from="description">header of section with entities available for selection</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.html</context> - <context context-type="linenumber">55,56</context> + <context context-type="linenumber">54</context> </context-group> - <note priority="1" from="description">header of section with entities available for selection</note> </trans-unit> <trans-unit id="4566094167890982095" datatype="html"> <source>create matching</source> @@ -5516,7 +5529,7 @@ <note priority="1" from="description">Matching button label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.ts</context> - <context context-type="linenumber">85</context> + <context context-type="linenumber">91</context> </context-group> </trans-unit> <trans-unit id="1779552786277618671" datatype="html"> @@ -5525,7 +5538,7 @@ <note priority="1" from="description">Matching View column name</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.ts</context> - <context context-type="linenumber">273</context> + <context context-type="linenumber">312</context> </context-group> </trans-unit> <trans-unit id="1906738132039774080" datatype="html"> diff --git a/src/assets/locale/messages.it.xlf b/src/assets/locale/messages.it.xlf index a4ff7a3d8f..eaf962f429 100644 --- a/src/assets/locale/messages.it.xlf +++ b/src/assets/locale/messages.it.xlf @@ -63,7 +63,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">886</context> + <context context-type="linenumber">819</context> </context-group> </trans-unit> <trans-unit id="1669277742108379782" datatype="html"> @@ -662,11 +662,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">813</context> + <context context-type="linenumber">746</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">891</context> + <context context-type="linenumber">824</context> </context-group> </trans-unit> <trans-unit id="5944812089887969249" datatype="html"> @@ -783,7 +783,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1035</context> + <context context-type="linenumber">968</context> </context-group> </trans-unit> <trans-unit id="7508893828342265603" datatype="html"> @@ -1024,7 +1024,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">758</context> + <context context-type="linenumber">691</context> </context-group> </trans-unit> <trans-unit id="5910775518786454299" datatype="html"> @@ -1033,15 +1033,7 @@ <note priority="1" from="description">center</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">5</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">6</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">141</context> + <context context-type="linenumber">4</context> </context-group> </trans-unit> <trans-unit id="449116330532787155" datatype="html"> @@ -1050,11 +1042,7 @@ <note priority="1" from="description">center</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">7</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">145</context> + <context context-type="linenumber">5</context> </context-group> </trans-unit> <trans-unit id="1264264408873477158" datatype="html"> @@ -1063,11 +1051,7 @@ <note priority="1" from="description">center</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">8</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">149</context> + <context context-type="linenumber">6</context> </context-group> </trans-unit> <trans-unit id="8056881763442606556" datatype="html"> @@ -1342,7 +1326,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">518</context> + <context context-type="linenumber">451</context> </context-group> </trans-unit> <trans-unit id="7290235740931562779" datatype="html"> @@ -1395,15 +1379,15 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">477</context> + <context context-type="linenumber">410</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">909</context> + <context context-type="linenumber">842</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">993</context> + <context context-type="linenumber">926</context> </context-group> </trans-unit> <trans-unit id="4540981870704644649" datatype="html"> @@ -1483,11 +1467,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">280</context> + <context context-type="linenumber">213</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">554</context> + <context context-type="linenumber">487</context> </context-group> </trans-unit> <trans-unit id="5676017837022350033" datatype="html"> @@ -1536,7 +1520,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1021</context> + <context context-type="linenumber">954</context> </context-group> </trans-unit> <trans-unit id="3933358723756013068" datatype="html"> @@ -1549,7 +1533,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">939</context> + <context context-type="linenumber">872</context> </context-group> </trans-unit> <trans-unit id="9099121471164431783" datatype="html"> @@ -1570,11 +1554,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">493</context> + <context context-type="linenumber">426</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">604</context> + <context context-type="linenumber">537</context> </context-group> </trans-unit> <trans-unit id="4378796785985219718" datatype="html"> @@ -1587,7 +1571,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">488</context> + <context context-type="linenumber">421</context> </context-group> </trans-unit> <trans-unit id="888341446683346521" datatype="html"> @@ -2193,15 +2177,15 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">36</context> + <context context-type="linenumber">26</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">593</context> + <context context-type="linenumber">526</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">940</context> + <context context-type="linenumber">873</context> </context-group> </trans-unit> <trans-unit id="9127604588498960753" datatype="html"> @@ -2231,7 +2215,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">51</context> + <context context-type="linenumber">41</context> </context-group> </trans-unit> <trans-unit id="2502008676398493538" datatype="html"> @@ -2356,11 +2340,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">412</context> + <context context-type="linenumber">345</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">596</context> + <context context-type="linenumber">529</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity-components/entity-list/filter-generator.service.ts</context> @@ -2725,20 +2709,20 @@ <trans-unit id="1237640232293738415" datatype="html"> <source>Aam Digital - DEMO (automatically generated data)</source> <target state="new">Aam Digital - DEMO (automatically generated data)</target> + <note priority="1" from="description">Page title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">22</context> + <context context-type="linenumber">12</context> </context-group> - <note priority="1" from="description">Page title</note> </trans-unit> <trans-unit id="6570363013146073520" datatype="html"> <source>Dashboard</source> <target state="new">Dashboard</target> + <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">31</context> + <context context-type="linenumber">21</context> </context-group> - <note priority="1" from="description">Menu item</note> </trans-unit> <trans-unit id="7026624912846603653" datatype="html"> <source>Schools</source> @@ -2750,11 +2734,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">41</context> + <context context-type="linenumber">31</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">409</context> + <context context-type="linenumber">342</context> </context-group> </trans-unit> <trans-unit id="4817207543436133742" datatype="html"> @@ -2763,25 +2747,25 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">46</context> + <context context-type="linenumber">36</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">691</context> + <context context-type="linenumber">624</context> </context-group> </trans-unit> <trans-unit id="6904866445262015585" datatype="html"> <source>Tasks</source> <target state="new">Tasks</target> + <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">56</context> + <context context-type="linenumber">46</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/todos/model/todo.ts</context> <context context-type="linenumber">32</context> </context-group> - <note priority="1" from="description">Menu item</note> </trans-unit> <trans-unit id="5041354590769758251" datatype="html"> <source>Admin</source> @@ -2789,7 +2773,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">61</context> + <context context-type="linenumber">51</context> </context-group> </trans-unit> <trans-unit id="1071721880474488785" datatype="html"> @@ -2798,7 +2782,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">66</context> + <context context-type="linenumber">56</context> </context-group> </trans-unit> <trans-unit id="4555457172864212828" datatype="html"> @@ -2807,7 +2791,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">71</context> + <context context-type="linenumber">61</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/user/user.ts</context> @@ -2821,7 +2805,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">76</context> + <context context-type="linenumber">66</context> </context-group> </trans-unit> <trans-unit id="657496228690855434" datatype="html"> @@ -2830,7 +2814,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">81</context> + <context context-type="linenumber">71</context> </context-group> </trans-unit> <trans-unit id="7911416166208830577" datatype="html"> @@ -2839,61 +2823,7 @@ <note priority="1" from="description">Menu item</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">86</context> - </context-group> - </trans-unit> - <trans-unit id="6691439998827511114" datatype="html"> - <source>OK (copy with us)</source> - <target state="new">OK (copy with us)</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">109</context> - </context-group> - </trans-unit> - <trans-unit id="7233426447535381432" datatype="html"> - <source>OK (copy needed for us)</source> - <target state="new">OK (copy needed for us)</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">114</context> - </context-group> - </trans-unit> - <trans-unit id="7892131631225988542" datatype="html"> - <source>needs correction</source> - <target state="new">needs correction</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">119</context> - </context-group> - </trans-unit> - <trans-unit id="7543632648034985521" datatype="html"> - <source>applied</source> - <target state="new">applied</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">124</context> - </context-group> - </trans-unit> - <trans-unit id="2743017402754335830" datatype="html"> - <source>doesn't have</source> - <target state="new">doesn't have</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">129</context> - </context-group> - </trans-unit> - <trans-unit id="6322199449220989816" datatype="html"> - <source>not eligible</source> - <target state="new">not eligible</target> - <note priority="1" from="description">Document status</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">134</context> + <context context-type="linenumber">76</context> </context-group> </trans-unit> <trans-unit id="2935152225387412918" datatype="html"> @@ -2903,7 +2833,7 @@ <note priority="1" from="meaning">Dashboard shortcut widget</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">163</context> + <context context-type="linenumber">91</context> </context-group> </trans-unit> <trans-unit id="2111561618518210212" datatype="html"> @@ -2913,16 +2843,26 @@ <note priority="1" from="meaning">Dashboard shortcut widget</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">168</context> + <context context-type="linenumber">96</context> </context-group> </trans-unit> + <trans-unit id="7749314122565677607" datatype="html"> + <source>Public Registration Form</source> + <target state="new">Public Registration Form</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> + <context context-type="linenumber">101</context> + </context-group> + <note priority="1" from="description">open public form</note> + <note priority="1" from="meaning">Dashboard shortcut widget</note> + </trans-unit> <trans-unit id="2329598843423950672" datatype="html"> <source>last week</source> <target state="new">last week</target> <note priority="1" from="description">Attendance week dashboard widget label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">215</context> + <context context-type="linenumber">148</context> </context-group> </trans-unit> <trans-unit id="6802197953477344728" datatype="html"> @@ -2931,7 +2871,7 @@ <note priority="1" from="description">Attendance week dashboard widget label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">222</context> + <context context-type="linenumber">155</context> </context-group> </trans-unit> <trans-unit id="8955128195791312286" datatype="html"> @@ -2940,7 +2880,7 @@ <note priority="1" from="description">Attendance week dashboard widget label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">208</context> + <context context-type="linenumber">141</context> </context-group> </trans-unit> <trans-unit id="1813769493203572551" datatype="html"> @@ -2949,7 +2889,7 @@ <note priority="1" from="description">Title for notes overview</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">244</context> + <context context-type="linenumber">177</context> </context-group> </trans-unit> <trans-unit id="2798807656507405918" datatype="html"> @@ -2958,11 +2898,11 @@ <note priority="1" from="description">Translated name of default column group</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">254</context> + <context context-type="linenumber">187</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">258</context> + <context context-type="linenumber">191</context> </context-group> </trans-unit> <trans-unit id="1002165214775409029" datatype="html"> @@ -2971,19 +2911,19 @@ <note priority="1" from="description">Translated name of mobile column group</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">255</context> + <context context-type="linenumber">188</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">268</context> + <context context-type="linenumber">201</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">525</context> + <context context-type="linenumber">458</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">579</context> + <context context-type="linenumber">512</context> </context-group> </trans-unit> <trans-unit id="6309181788204949218" datatype="html"> @@ -2992,7 +2932,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">355</context> + <context context-type="linenumber">288</context> </context-group> </trans-unit> <trans-unit id="8878700331247603166" datatype="html"> @@ -3001,7 +2941,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">374</context> + <context context-type="linenumber">307</context> </context-group> </trans-unit> <trans-unit id="7910125616758063638" datatype="html"> @@ -3010,7 +2950,7 @@ <note priority="1" from="description">Filename of markdown help page (make sure the filename you enter as a translation actually exists on the server!)</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">388</context> + <context context-type="linenumber">321</context> </context-group> </trans-unit> <trans-unit id="3686284950598311784" datatype="html"> @@ -3019,7 +2959,7 @@ <note priority="1" from="description">Label for private schools filter - true case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">410</context> + <context context-type="linenumber">343</context> </context-group> </trans-unit> <trans-unit id="6264204010127975648" datatype="html"> @@ -3028,7 +2968,7 @@ <note priority="1" from="description">Label for private schools filter - false case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">411</context> + <context context-type="linenumber">344</context> </context-group> </trans-unit> <trans-unit id="8781767917622107949" datatype="html"> @@ -3037,15 +2977,15 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">423</context> + <context context-type="linenumber">356</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">615</context> + <context context-type="linenumber">548</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">798</context> + <context context-type="linenumber">731</context> </context-group> </trans-unit> <trans-unit id="2562531496877210322" datatype="html"> @@ -3054,7 +2994,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">451</context> + <context context-type="linenumber">384</context> </context-group> </trans-unit> <trans-unit id="2309808536212982229" datatype="html"> @@ -3063,7 +3003,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">460</context> + <context context-type="linenumber">393</context> </context-group> </trans-unit> <trans-unit id="1130652265542107236" datatype="html"> @@ -3072,7 +3012,7 @@ <note priority="1" from="description">Column label for age of child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">482</context> + <context context-type="linenumber">415</context> </context-group> </trans-unit> <trans-unit id="8539945035792949854" datatype="html"> @@ -3081,7 +3021,7 @@ <note priority="1" from="description">Column label for school attendance of child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">500</context> + <context context-type="linenumber">433</context> </context-group> </trans-unit> <trans-unit id="249709194006018190" datatype="html"> @@ -3090,7 +3030,7 @@ <note priority="1" from="description">Column label for coaching attendance of child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">509</context> + <context context-type="linenumber">442</context> </context-group> </trans-unit> <trans-unit id="7691138136265271231" datatype="html"> @@ -3099,11 +3039,11 @@ <note priority="1" from="description">Translated name of default column group</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">524</context> + <context context-type="linenumber">457</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">528</context> + <context context-type="linenumber">461</context> </context-group> </trans-unit> <trans-unit id="3007651244935433751" datatype="html"> @@ -3112,7 +3052,7 @@ <note priority="1" from="description">Column group name</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">541</context> + <context context-type="linenumber">474</context> </context-group> </trans-unit> <trans-unit id="2041675390931385838" datatype="html"> @@ -3121,11 +3061,11 @@ <note priority="1" from="description">Column group name</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">564</context> + <context context-type="linenumber">497</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">713</context> + <context context-type="linenumber">646</context> </context-group> </trans-unit> <trans-unit id="8204176479746810612" datatype="html"> @@ -3134,7 +3074,7 @@ <note priority="1" from="description">Active children filter label - true case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">594</context> + <context context-type="linenumber">527</context> </context-group> </trans-unit> <trans-unit id="1859131936150262113" datatype="html"> @@ -3143,7 +3083,7 @@ <note priority="1" from="description">Active children filter label - false case</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">595</context> + <context context-type="linenumber">528</context> </context-group> </trans-unit> <trans-unit id="3465962430409924123" datatype="html"> @@ -3152,7 +3092,7 @@ <note priority="1" from="description">Header for form section</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">643</context> + <context context-type="linenumber">576</context> </context-group> </trans-unit> <trans-unit id="2332815950113444124" datatype="html"> @@ -3161,7 +3101,7 @@ <note priority="1" from="description">Header for form section</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">644</context> + <context context-type="linenumber">577</context> </context-group> </trans-unit> <trans-unit id="4030110180919534153" datatype="html"> @@ -3170,7 +3110,7 @@ <note priority="1" from="description">Header for form section</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">645</context> + <context context-type="linenumber">578</context> </context-group> </trans-unit> <trans-unit id="8020402390620783618" datatype="html"> @@ -3179,7 +3119,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">652</context> + <context context-type="linenumber">585</context> </context-group> </trans-unit> <trans-unit id="3222319974146977156" datatype="html"> @@ -3188,7 +3128,7 @@ <note priority="1" from="description">Title inside a panel</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">655</context> + <context context-type="linenumber">588</context> </context-group> </trans-unit> <trans-unit id="3424557526203996215" datatype="html"> @@ -3197,7 +3137,7 @@ <note priority="1" from="description">Title inside a panel</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">675</context> + <context context-type="linenumber">608</context> </context-group> </trans-unit> <trans-unit id="5318391578409221199" datatype="html"> @@ -3206,17 +3146,17 @@ <note priority="1" from="description">Child details section title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">679</context> + <context context-type="linenumber">612</context> </context-group> </trans-unit> <trans-unit id="6315228090956745353" datatype="html"> <source>Notes & Tasks</source> <target state="new">Notes & Tasks</target> + <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">700</context> + <context context-type="linenumber">633</context> </context-group> - <note priority="1" from="description">Panel title</note> </trans-unit> <trans-unit id="6935402381663920930" datatype="html"> <source>Height & Weight Tracking</source> @@ -3224,7 +3164,7 @@ <note priority="1" from="description">Title inside a panel</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">726</context> + <context context-type="linenumber">659</context> </context-group> </trans-unit> <trans-unit id="5035769065128916110" datatype="html"> @@ -3233,7 +3173,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">732</context> + <context context-type="linenumber">665</context> </context-group> </trans-unit> <trans-unit id="3778494590546555291" datatype="html"> @@ -3242,7 +3182,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">741</context> + <context context-type="linenumber">674</context> </context-group> </trans-unit> <trans-unit id="134488380944428715" datatype="html"> @@ -3260,7 +3200,7 @@ <note priority="1" from="description">Panel title</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">828</context> + <context context-type="linenumber">761</context> </context-group> </trans-unit> <trans-unit id="4310513583397103775" datatype="html"> @@ -3269,7 +3209,7 @@ <note priority="1" from="description">Name of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">843</context> + <context context-type="linenumber">776</context> </context-group> </trans-unit> <trans-unit id="3930255838623626363" datatype="html"> @@ -3278,7 +3218,7 @@ <note priority="1" from="description">Label of report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">847</context> + <context context-type="linenumber">780</context> </context-group> </trans-unit> <trans-unit id="6949266734896136969" datatype="html"> @@ -3287,7 +3227,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">852</context> + <context context-type="linenumber">785</context> </context-group> </trans-unit> <trans-unit id="619224002419753333" datatype="html"> @@ -3296,7 +3236,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">855</context> + <context context-type="linenumber">788</context> </context-group> </trans-unit> <trans-unit id="9152633939608005299" datatype="html"> @@ -3305,7 +3245,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">859</context> + <context context-type="linenumber">792</context> </context-group> </trans-unit> <trans-unit id="5107681519279730939" datatype="html"> @@ -3314,7 +3254,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">864</context> + <context context-type="linenumber">797</context> </context-group> </trans-unit> <trans-unit id="1157409611503106802" datatype="html"> @@ -3323,7 +3263,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">868</context> + <context context-type="linenumber">801</context> </context-group> </trans-unit> <trans-unit id="6819111098994891506" datatype="html"> @@ -3332,7 +3272,7 @@ <note priority="1" from="description">Label for report query</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">873</context> + <context context-type="linenumber">806</context> </context-group> </trans-unit> <trans-unit id="7965975699466463064" datatype="html"> @@ -3341,7 +3281,7 @@ <note priority="1" from="description">Name of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">881</context> + <context context-type="linenumber">814</context> </context-group> </trans-unit> <trans-unit id="691530937011261622" datatype="html"> @@ -3350,7 +3290,7 @@ <note priority="1" from="description">Name of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">898</context> + <context context-type="linenumber">831</context> </context-group> </trans-unit> <trans-unit id="8808439168445495463" datatype="html"> @@ -3365,11 +3305,22 @@ <trans-unit id="5175452770249467211" datatype="html"> <source>[invalid option]</source> <target state="new">[invalid option]</target> + <note priority="1" from="description">enum option label prefix for invalid id dummy</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.ts</context> - <context context-type="linenumber">61</context> + <context context-type="linenumber">53</context> </context-group> - <note priority="1" from="description">enum option label prefix for invalid id dummy</note> + </trans-unit> + <trans-unit id="f02662520a5f60c9da28cdebbe9c17f34b4439c8" datatype="html"> + <source> Edit dropdown options +</source> + <target state="new"> Edit dropdown options +</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html</context> + <context context-type="linenumber">2,3</context> + </context-group> + <note priority="1" from="description">title of dropdown options popup dialog</note> </trans-unit> <trans-unit id="3448462145758383019" datatype="html"> <source>Total</source> @@ -3377,7 +3328,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">913</context> + <context context-type="linenumber">846</context> </context-group> </trans-unit> <trans-unit id="6522877977962061564" datatype="html"> @@ -3386,7 +3337,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">917</context> + <context context-type="linenumber">850</context> </context-group> </trans-unit> <trans-unit id="5639297788212274461" datatype="html"> @@ -3395,7 +3346,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">921</context> + <context context-type="linenumber">854</context> </context-group> </trans-unit> <trans-unit id="3973270758175692787" datatype="html"> @@ -3404,7 +3355,7 @@ <note priority="1" from="description">Name of a column of a report</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">925</context> + <context context-type="linenumber">858</context> </context-group> </trans-unit> <trans-unit id="7686955204733532706" datatype="html"> @@ -3422,11 +3373,11 @@ <note priority="1" from="description">Label for the address of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">946</context> + <context context-type="linenumber">879</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1014</context> + <context context-type="linenumber">947</context> </context-group> </trans-unit> <trans-unit id="326998402864900242" datatype="html"> @@ -3435,7 +3386,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">953</context> + <context context-type="linenumber">886</context> </context-group> </trans-unit> <trans-unit id="744862547206313189" datatype="html"> @@ -3444,7 +3395,7 @@ <note priority="1" from="description">Label for the religion of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">960</context> + <context context-type="linenumber">893</context> </context-group> </trans-unit> <trans-unit id="3701890980067993407" datatype="html"> @@ -3453,7 +3404,7 @@ <note priority="1" from="description">Label for the mother tongue of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">967</context> + <context context-type="linenumber">900</context> </context-group> </trans-unit> <trans-unit id="5917260200950510520" datatype="html"> @@ -3462,7 +3413,7 @@ <note priority="1" from="description">Tooltip description for the mother tongue of a child</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">968</context> + <context context-type="linenumber">901</context> </context-group> </trans-unit> <trans-unit id="8073272694481457912" datatype="html"> @@ -3471,7 +3422,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">975</context> + <context context-type="linenumber">908</context> </context-group> </trans-unit> <trans-unit id="6479918860876850014" datatype="html"> @@ -3480,7 +3431,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">982</context> + <context context-type="linenumber">915</context> </context-group> </trans-unit> <trans-unit id="6187083324285537481" datatype="html"> @@ -3489,7 +3440,7 @@ <note priority="1" from="description">Label for if a school is a private school</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1000</context> + <context context-type="linenumber">933</context> </context-group> </trans-unit> <trans-unit id="2826581353496868063" datatype="html"> @@ -3498,7 +3449,7 @@ <note priority="1" from="description">Label for the language of a school</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1007</context> + <context context-type="linenumber">940</context> </context-group> </trans-unit> <trans-unit id="1350851235390292372" datatype="html"> @@ -3507,7 +3458,7 @@ <note priority="1" from="description">Label for the timing of a school</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1028</context> + <context context-type="linenumber">961</context> </context-group> </trans-unit> <trans-unit id="491478187387824276" datatype="html"> @@ -3516,7 +3467,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1047</context> + <context context-type="linenumber">980</context> </context-group> </trans-unit> <trans-unit id="5554741364017709807" datatype="html"> @@ -3525,7 +3476,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1048</context> + <context context-type="linenumber">981</context> </context-group> </trans-unit> <trans-unit id="9160848464711606837" datatype="html"> @@ -3534,7 +3485,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1056</context> + <context context-type="linenumber">989</context> </context-group> </trans-unit> <trans-unit id="6624198636467931210" datatype="html"> @@ -3543,7 +3494,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1057</context> + <context context-type="linenumber">990</context> </context-group> </trans-unit> <trans-unit id="7677901685281516160" datatype="html"> @@ -3552,7 +3503,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1065</context> + <context context-type="linenumber">998</context> </context-group> </trans-unit> <trans-unit id="6491820978569500382" datatype="html"> @@ -3561,7 +3512,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1066</context> + <context context-type="linenumber">999</context> </context-group> </trans-unit> <trans-unit id="6408161334810687727" datatype="html"> @@ -3570,7 +3521,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1074</context> + <context context-type="linenumber">1007</context> </context-group> </trans-unit> <trans-unit id="8707102520644001588" datatype="html"> @@ -3579,7 +3530,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1075</context> + <context context-type="linenumber">1008</context> </context-group> </trans-unit> <trans-unit id="3032098280590391265" datatype="html"> @@ -3588,7 +3539,7 @@ <note priority="1" from="description">Label for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1083</context> + <context context-type="linenumber">1016</context> </context-group> </trans-unit> <trans-unit id="5793656352870786735" datatype="html"> @@ -3597,7 +3548,7 @@ <note priority="1" from="description">Description for a child attribute</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1084</context> + <context context-type="linenumber">1017</context> </context-group> </trans-unit> <trans-unit id="7922989125096435449" datatype="html"> @@ -3606,7 +3557,7 @@ <note priority="1" from="description">Label of user phone</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1095</context> + <context context-type="linenumber">1028</context> </context-group> </trans-unit> <trans-unit id="4663189107944878630" datatype="html"> @@ -3699,12 +3650,8 @@ <target state="new"> This field is required </target> <note priority="1" from="description">Error message for any input</note> <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.html</context> - <context context-type="linenumber">21</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.html</context> - <context context-type="linenumber">62</context> + <context context-type="sourcefile">src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.html</context> + <context context-type="linenumber">57</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-text-with-autocomplete/edit-text-with-autocomplete.component.html</context> @@ -3715,6 +3662,14 @@ <context context-type="linenumber">23</context> </context-group> </trans-unit> + <trans-unit id="5432260252143962374" datatype="html"> + <source>Create new option</source> + <target state="new">Create new option</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.ts</context> + <context context-type="linenumber">188</context> + </context-group> + </trans-unit> <trans-unit id="8998179362936748717" datatype="html"> <source>OK</source> <target state="new">OK</target> @@ -4078,16 +4033,6 @@ <context context-type="linenumber">16</context> </context-group> </trans-unit> - <trans-unit id="4668912478133095886" datatype="html"> - <source>Select <x id="PH" equiv-text="config.formFieldConfig.label || config.propertySchema?.label"/></source> - <target state="new">Selezionane <x id="PH" equiv-text="config.formFieldConfig.label || config.propertySchema?.label"/></target> - <note priority="1" from="description">context Select User</note> - <note priority="1" from="meaning">Placeholder for input to set an entity</note> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.ts</context> - <context context-type="linenumber">62</context> - </context-group> - </trans-unit> <trans-unit id="1f05f87b0643c90a090870fcfdb99d888b556f23" datatype="html"> <source>Creating new record.</source> <target state="new">Creating new record.</target> @@ -4186,7 +4131,7 @@ <target state="translated">Preparazione dei dati</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity/database-indexing/database-indexing.service.ts</context> - <context context-type="linenumber">60</context> + <context context-type="linenumber">59</context> </context-group> </trans-unit> <trans-unit id="5210270493533766316" datatype="html"> @@ -4226,7 +4171,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">60</context> + <context context-type="linenumber">61</context> </context-group> </trans-unit> <trans-unit id="e67bebb0291cbe76b190e83225878cdd3a8a6df6" datatype="html"> @@ -4353,18 +4298,50 @@ <trans-unit id="396111f33ef48eef016cd0eedb7be2ef882d7430" datatype="html"> <source> Close </source> <target state="translated"> Chiudere </target> - <note priority="1" from="description">Generic close button</note> + <note priority="1" from="description">Close popup</note> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html</context> + <context context-type="linenumber">34</context> + </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/changelog/changelog.component.html</context> <context context-type="linenumber">54</context> </context-group> </trans-unit> + <trans-unit id="1729165161001518929" datatype="html"> + <source>Are you sure that you want to delete the option <x id="PH" equiv-text="value.label"/>?</source> + <target state="new">Are you sure that you want to delete the option <x id="PH" equiv-text="value.label"/>?</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">68</context> + </context-group> + </trans-unit> + <trans-unit id="6524829042498938726" datatype="html"> + <source> The option is still used in <x id="PH" equiv-text="existingUsages.join( + ", " + )"/> records. If deleted, the records will not be lost but specially marked</source> + <target state="new"> The option is still used in <x id="PH" equiv-text="existingUsages.join( + ", " + )"/> records. If deleted, the records will not be lost but specially marked</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">70,72</context> + </context-group> + </trans-unit> + <trans-unit id="3767101596108414700" datatype="html"> + <source>Delete option</source> + <target state="new">Delete option</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">75</context> + </context-group> + </trans-unit> <trans-unit id="2566001175328025157" datatype="html"> <source>No Changelog Available</source> <target state="translated">Nessun registro delle modifiche disponibile</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/changelog/changelog.component.ts</context> - <context context-type="linenumber">87</context> + <context context-type="linenumber">89</context> </context-group> </trans-unit> <trans-unit id="7795087408392131030" datatype="html"> @@ -4372,7 +4349,7 @@ <target state="translated">Impossibile caricare le ultime modifiche: <x id="PH" equiv-text="error"/></target> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/latest-changes.service.ts</context> - <context context-type="linenumber">131</context> + <context context-type="linenumber">121</context> </context-group> </trans-unit> <trans-unit id="2896181875024748753" datatype="html"> @@ -4842,7 +4819,7 @@ Please try again. If the problem persists contact Aam Digital support.</target> <note priority="1" from="description">Navigate to user profile page</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/ui/ui/ui.component.html</context> - <context context-type="linenumber">84</context> + <context context-type="linenumber">85</context> </context-group> </trans-unit> <trans-unit id="8bf270adb01cb85e970eb6465bc3167bb04598de" datatype="html"> @@ -4851,7 +4828,7 @@ Please try again. If the problem persists contact Aam Digital support.</target> <note priority="1" from="description">Sign out of the app</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/ui/ui/ui.component.html</context> - <context context-type="linenumber">89</context> + <context context-type="linenumber">90</context> </context-group> </trans-unit> <trans-unit id="406df86e338f5992ef27c4bc35dda98e3e651e34" datatype="html"> @@ -5113,7 +5090,7 @@ Please try again. If the problem persists contact Aam Digital support.</target> <target state="new">Import completed</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">59</context> + <context context-type="linenumber">60</context> </context-group> </trans-unit> <trans-unit id="6880068429772311753" datatype="html"> @@ -5121,7 +5098,7 @@ Please try again. If the problem persists contact Aam Digital support.</target> <target state="new">Import new data?</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">75</context> + <context context-type="linenumber">76</context> </context-group> </trans-unit> <trans-unit id="1690350829788615736" datatype="html"> @@ -5131,7 +5108,7 @@ Please try again. If the problem persists contact Aam Digital support.</target> This will add or update <x id="PH" equiv-text="csvFile.data.length"/> records from the loaded file.</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">76</context> + <context context-type="linenumber">77</context> </context-group> </trans-unit> <trans-unit id="5345022420402242415" datatype="html"> @@ -5139,7 +5116,7 @@ Please try again. If the problem persists contact Aam Digital support.</target> <target state="new"><x id="PH" equiv-text="refText"/> All existing records imported with the transaction id '<x id="PH_1" equiv-text="importMeta.transactionId"/>' will be deleted!</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">79</context> + <context context-type="linenumber">80</context> </context-group> </trans-unit> <trans-unit id="4fd611f679282abb73122b03bfed3724dba9b6bf" datatype="html"> @@ -5439,14 +5416,34 @@ Please try again. If the problem persists contact Aam Digital support.</target> <context context-type="linenumber">113</context> </context-group> </trans-unit> + <trans-unit id="22ee8aecedfcdfcd3313bc6c5f0e80175bfafd58" datatype="html"> + <source> Select displayed locations +</source> + <target state="new"> Select displayed locations +</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/location/map/map-properties-popup/map-properties-popup.component.html</context> + <context context-type="linenumber">1,3</context> + </context-group> + <note priority="1" from="description">Title of popup to select locations that are displayed in the map</note> + </trans-unit> + <trans-unit id="c2d0ac9f528bbd5f53fd34269fde8b59e029621b" datatype="html"> + <source>Apply</source> + <target state="new">Apply</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/location/map/map-properties-popup/map-properties-popup.component.html</context> + <context context-type="linenumber">18</context> + </context-group> + <note priority="1" from="description">Button for closing popup and applying changes</note> + </trans-unit> <trans-unit id="2549737213024136740" datatype="html"> - <source><x id="PH" equiv-text="res"/> km</source> + <source><x id="PH" equiv-text="closest"/> km</source> <target state="new"><x id="PH" equiv-text="res"/> km</target> <note priority="1" from="description">e.g. 5 km</note> <note priority="1" from="meaning">distance with unit</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/location/view-distance/view-distance.component.ts</context> - <context context-type="linenumber">73</context> + <context context-type="linenumber">65</context> </context-group> </trans-unit> <trans-unit id="4bc0107bf7dcdac8c02c5ced13ad79c23c253148" datatype="html"> @@ -5461,11 +5458,11 @@ Please try again. If the problem persists contact Aam Digital support.</target> <trans-unit id="a4cdca73d44b64c6cfa677e10047ccd7e4a41e2a" datatype="html"> <source> Select <x id="INTERPOLATION" equiv-text="{{ side.entityType?.label }}"/> </source> <target state="translated"> Select <x id="INTERPOLATION" equiv-text="{{ side.entityType.label }}"/> </target> + <note priority="1" from="description">header of section with entities available for selection</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.html</context> - <context context-type="linenumber">55,56</context> + <context context-type="linenumber">54</context> </context-group> - <note priority="1" from="description">header of section with entities available for selection</note> </trans-unit> <trans-unit id="4566094167890982095" datatype="html"> <source>create matching</source> @@ -5473,7 +5470,7 @@ Please try again. If the problem persists contact Aam Digital support.</target> <note priority="1" from="description">Matching button label</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.ts</context> - <context context-type="linenumber">85</context> + <context context-type="linenumber">91</context> </context-group> </trans-unit> <trans-unit id="1779552786277618671" datatype="html"> @@ -5482,7 +5479,7 @@ Please try again. If the problem persists contact Aam Digital support.</target> <note priority="1" from="description">Matching View column name</note> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.ts</context> - <context context-type="linenumber">273</context> + <context context-type="linenumber">312</context> </context-group> </trans-unit> <trans-unit id="6680431077518392028" datatype="html"> @@ -5739,6 +5736,22 @@ Please try again. If the problem persists contact Aam Digital support.</target> <context context-type="linenumber">75</context> </context-group> </trans-unit> + <trans-unit id="2468578017924444574" datatype="html"> + <source>Example form</source> + <target state="new">Example form</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/public-form/demo-public-form-generator.service.ts</context> + <context context-type="linenumber">18</context> + </context-group> + </trans-unit> + <trans-unit id="5065162821808701761" datatype="html"> + <source>This is a form that can be shared as a link or embedded in a website. It can be filled by users without having an account. For example you can let participants self-register their details and just review the records within Aam Digital.</source> + <target state="new">This is a form that can be shared as a link or embedded in a website. It can be filled by users without having an account. For example you can let participants self-register their details and just review the records within Aam Digital.</target> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/public-form/demo-public-form-generator.service.ts</context> + <context context-type="linenumber">19</context> + </context-group> + </trans-unit> <trans-unit id="f215ed23a0b8105ae47ef80cf65fe765631dd94a" datatype="html"> <source> Submit Form </source> <target state="new"> Submit Form </target> @@ -5762,7 +5775,7 @@ Please try again. If the problem persists contact Aam Digital support.</target> <target state="new">Successfully submitted form</target> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/public-form/public-form.component.ts</context> - <context context-type="linenumber">58</context> + <context context-type="linenumber">62</context> </context-group> </trans-unit> <trans-unit id="1906738132039774080" datatype="html"> diff --git a/src/assets/locale/messages.xlf b/src/assets/locale/messages.xlf index 7bd1128dc8..cb03256f81 100644 --- a/src/assets/locale/messages.xlf +++ b/src/assets/locale/messages.xlf @@ -56,7 +56,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">886</context> + <context context-type="linenumber">819</context> </context-group> <note priority="1" from="description">Events of an attendance</note> </trans-unit> @@ -607,11 +607,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">813</context> + <context context-type="linenumber">746</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">891</context> + <context context-type="linenumber">824</context> </context-group> <note priority="1" from="description">Label for the participants of a recurring activity</note> </trans-unit> @@ -719,7 +719,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1035</context> + <context context-type="linenumber">968</context> </context-group> <note priority="1" from="description">Label for the remarks of a ASER result</note> </trans-unit> @@ -930,7 +930,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">758</context> + <context context-type="linenumber">691</context> </context-group> <note priority="1" from="description">Child status</note> </trans-unit> @@ -938,15 +938,7 @@ <source>Alipore</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">5</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">6</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">141</context> + <context context-type="linenumber">4</context> </context-group> <note priority="1" from="description">center</note> </trans-unit> @@ -954,11 +946,7 @@ <source>Tollygunge</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">7</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">145</context> + <context context-type="linenumber">5</context> </context-group> <note priority="1" from="description">center</note> </trans-unit> @@ -966,11 +954,7 @@ <source>Barabazar</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts</context> - <context context-type="linenumber">8</context> - </context-group> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">149</context> + <context context-type="linenumber">6</context> </context-group> <note priority="1" from="description">center</note> </trans-unit> @@ -1216,7 +1200,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">518</context> + <context context-type="linenumber">451</context> </context-group> <note priority="1" from="description">Table header, Short for Body Mass Index</note> </trans-unit> @@ -1264,15 +1248,15 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">477</context> + <context context-type="linenumber">410</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">909</context> + <context context-type="linenumber">842</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">993</context> + <context context-type="linenumber">926</context> </context-group> <note priority="1" from="description">Label for the name of a child</note> </trans-unit> @@ -1344,11 +1328,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">280</context> + <context context-type="linenumber">213</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">554</context> + <context context-type="linenumber">487</context> </context-group> <note priority="1" from="description">Label for the status of a child</note> </trans-unit> @@ -1392,7 +1376,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1021</context> + <context context-type="linenumber">954</context> </context-group> <note priority="1" from="description">Label for the phone number of a child</note> </trans-unit> @@ -1404,7 +1388,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">939</context> + <context context-type="linenumber">872</context> </context-group> <note priority="1" from="description">Label for the child of a relation</note> </trans-unit> @@ -1424,11 +1408,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">493</context> + <context context-type="linenumber">426</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">604</context> + <context context-type="linenumber">537</context> </context-group> <note priority="1" from="description">Label for the school of a relation</note> </trans-unit> @@ -1440,7 +1424,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">488</context> + <context context-type="linenumber">421</context> </context-group> <note priority="1" from="description">Label for the class of a relation</note> </trans-unit> @@ -1954,7 +1938,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">51</context> + <context context-type="linenumber">41</context> </context-group> <note priority="1" from="description">label (plural) for entity</note> </trans-unit> @@ -1966,15 +1950,15 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">36</context> + <context context-type="linenumber">26</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">593</context> + <context context-type="linenumber">526</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">940</context> + <context context-type="linenumber">873</context> </context-group> <note priority="1" from="description">Label for the children of a note</note> </trans-unit> @@ -2101,11 +2085,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">412</context> + <context context-type="linenumber">345</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">596</context> + <context context-type="linenumber">529</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity-components/entity-list/filter-generator.service.ts</context> @@ -2245,11 +2229,11 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">41</context> + <context context-type="linenumber">31</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">409</context> + <context context-type="linenumber">342</context> </context-group> <note priority="1" from="description">label (plural) for entity</note> </trans-unit> @@ -2439,7 +2423,7 @@ <source>Aam Digital - DEMO (automatically generated data)</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">22</context> + <context context-type="linenumber">12</context> </context-group> <note priority="1" from="description">Page title</note> </trans-unit> @@ -2447,7 +2431,7 @@ <source>Dashboard</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">31</context> + <context context-type="linenumber">21</context> </context-group> <note priority="1" from="description">Menu item</note> </trans-unit> @@ -2455,11 +2439,11 @@ <source>Attendance</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">46</context> + <context context-type="linenumber">36</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">691</context> + <context context-type="linenumber">624</context> </context-group> <note priority="1" from="description">Menu item</note> </trans-unit> @@ -2467,7 +2451,7 @@ <source>Tasks</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">56</context> + <context context-type="linenumber">46</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/todos/model/todo.ts</context> @@ -2479,7 +2463,7 @@ <source>Admin</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">61</context> + <context context-type="linenumber">51</context> </context-group> <note priority="1" from="description">Menu item</note> </trans-unit> @@ -2487,7 +2471,7 @@ <source>Import</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">66</context> + <context context-type="linenumber">56</context> </context-group> <note priority="1" from="description">Menu item</note> </trans-unit> @@ -2495,7 +2479,7 @@ <source>Users</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">71</context> + <context context-type="linenumber">61</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/user/user.ts</context> @@ -2507,7 +2491,7 @@ <source>Reports</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">76</context> + <context context-type="linenumber">66</context> </context-group> <note priority="1" from="description">Menu item</note> </trans-unit> @@ -2515,7 +2499,7 @@ <source>Database Conflicts</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">81</context> + <context context-type="linenumber">71</context> </context-group> <note priority="1" from="description">Menu item</note> </trans-unit> @@ -2523,63 +2507,15 @@ <source>Help</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">86</context> + <context context-type="linenumber">76</context> </context-group> <note priority="1" from="description">Menu item</note> </trans-unit> - <trans-unit id="6691439998827511114" datatype="html"> - <source>OK (copy with us)</source> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">109</context> - </context-group> - <note priority="1" from="description">Document status</note> - </trans-unit> - <trans-unit id="7233426447535381432" datatype="html"> - <source>OK (copy needed for us)</source> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">114</context> - </context-group> - <note priority="1" from="description">Document status</note> - </trans-unit> - <trans-unit id="7892131631225988542" datatype="html"> - <source>needs correction</source> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">119</context> - </context-group> - <note priority="1" from="description">Document status</note> - </trans-unit> - <trans-unit id="7543632648034985521" datatype="html"> - <source>applied</source> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">124</context> - </context-group> - <note priority="1" from="description">Document status</note> - </trans-unit> - <trans-unit id="2743017402754335830" datatype="html"> - <source>doesn't have</source> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">129</context> - </context-group> - <note priority="1" from="description">Document status</note> - </trans-unit> - <trans-unit id="6322199449220989816" datatype="html"> - <source>not eligible</source> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">134</context> - </context-group> - <note priority="1" from="description">Document status</note> - </trans-unit> <trans-unit id="2935152225387412918" datatype="html"> <source>Record Attendance</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">163</context> + <context context-type="linenumber">91</context> </context-group> <note priority="1" from="description">record attendance shortcut</note> <note priority="1" from="meaning">Dashboard shortcut widget</note> @@ -2588,16 +2524,25 @@ <source>Add Child</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">168</context> + <context context-type="linenumber">96</context> </context-group> <note priority="1" from="description">record attendance shortcut</note> <note priority="1" from="meaning">Dashboard shortcut widget</note> </trans-unit> + <trans-unit id="7749314122565677607" datatype="html"> + <source>Public Registration Form</source> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> + <context context-type="linenumber">101</context> + </context-group> + <note priority="1" from="description">open public form</note> + <note priority="1" from="meaning">Dashboard shortcut widget</note> + </trans-unit> <trans-unit id="8955128195791312286" datatype="html"> <source>this week</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">208</context> + <context context-type="linenumber">141</context> </context-group> <note priority="1" from="description">Attendance week dashboard widget label</note> </trans-unit> @@ -2605,7 +2550,7 @@ <source>last week</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">215</context> + <context context-type="linenumber">148</context> </context-group> <note priority="1" from="description">Attendance week dashboard widget label</note> </trans-unit> @@ -2613,7 +2558,7 @@ <source>Late last week</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">222</context> + <context context-type="linenumber">155</context> </context-group> <note priority="1" from="description">Attendance week dashboard widget label</note> </trans-unit> @@ -2621,7 +2566,7 @@ <source>Notes & Reports</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">244</context> + <context context-type="linenumber">177</context> </context-group> <note priority="1" from="description">Title for notes overview</note> </trans-unit> @@ -2629,11 +2574,11 @@ <source>Standard</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">254</context> + <context context-type="linenumber">187</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">258</context> + <context context-type="linenumber">191</context> </context-group> <note priority="1" from="description">Translated name of default column group</note> </trans-unit> @@ -2641,19 +2586,19 @@ <source>Mobile</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">255</context> + <context context-type="linenumber">188</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">268</context> + <context context-type="linenumber">201</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">525</context> + <context context-type="linenumber">458</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">579</context> + <context context-type="linenumber">512</context> </context-group> <note priority="1" from="description">Translated name of mobile column group</note> </trans-unit> @@ -2661,7 +2606,7 @@ <source>User Information</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">355</context> + <context context-type="linenumber">288</context> </context-group> <note priority="1" from="description">Panel title</note> </trans-unit> @@ -2669,7 +2614,7 @@ <source>Security</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">374</context> + <context context-type="linenumber">307</context> </context-group> <note priority="1" from="description">Panel title</note> </trans-unit> @@ -2677,7 +2622,7 @@ <source>assets/help/help.en.md</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">388</context> + <context context-type="linenumber">321</context> </context-group> <note priority="1" from="description">Filename of markdown help page (make sure the filename you enter as a translation actually exists on the server!)</note> </trans-unit> @@ -2685,7 +2630,7 @@ <source>Private</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">410</context> + <context context-type="linenumber">343</context> </context-group> <note priority="1" from="description">Label for private schools filter - true case</note> </trans-unit> @@ -2693,7 +2638,7 @@ <source>Government</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">411</context> + <context context-type="linenumber">344</context> </context-group> <note priority="1" from="description">Label for private schools filter - false case</note> </trans-unit> @@ -2701,15 +2646,15 @@ <source>Basic Information</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">423</context> + <context context-type="linenumber">356</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">615</context> + <context context-type="linenumber">548</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">798</context> + <context context-type="linenumber">731</context> </context-group> <note priority="1" from="description">Panel title</note> </trans-unit> @@ -2717,7 +2662,7 @@ <source>Students</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">451</context> + <context context-type="linenumber">384</context> </context-group> <note priority="1" from="description">Panel title</note> </trans-unit> @@ -2725,7 +2670,7 @@ <source>Activities</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">460</context> + <context context-type="linenumber">393</context> </context-group> <note priority="1" from="description">Panel title</note> </trans-unit> @@ -2733,7 +2678,7 @@ <source>Age</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">482</context> + <context context-type="linenumber">415</context> </context-group> <note priority="1" from="description">Column label for age of child</note> </trans-unit> @@ -2741,7 +2686,7 @@ <source>Attendance (School)</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">500</context> + <context context-type="linenumber">433</context> </context-group> <note priority="1" from="description">Column label for school attendance of child</note> </trans-unit> @@ -2749,7 +2694,7 @@ <source>Attendance (Coaching)</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">509</context> + <context context-type="linenumber">442</context> </context-group> <note priority="1" from="description">Column label for coaching attendance of child</note> </trans-unit> @@ -2757,11 +2702,11 @@ <source>Basic Info</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">524</context> + <context context-type="linenumber">457</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">528</context> + <context context-type="linenumber">461</context> </context-group> <note priority="1" from="description">Translated name of default column group</note> </trans-unit> @@ -2769,7 +2714,7 @@ <source>School Info</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">541</context> + <context context-type="linenumber">474</context> </context-group> <note priority="1" from="description">Column group name</note> </trans-unit> @@ -2777,11 +2722,11 @@ <source>Health</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">564</context> + <context context-type="linenumber">497</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">713</context> + <context context-type="linenumber">646</context> </context-group> <note priority="1" from="description">Column group name</note> </trans-unit> @@ -2789,7 +2734,7 @@ <source>Active</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">594</context> + <context context-type="linenumber">527</context> </context-group> <note priority="1" from="description">Active children filter label - true case</note> </trans-unit> @@ -2797,7 +2742,7 @@ <source>Inactive</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">595</context> + <context context-type="linenumber">528</context> </context-group> <note priority="1" from="description">Active children filter label - false case</note> </trans-unit> @@ -2805,7 +2750,7 @@ <source>Personal Information</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">643</context> + <context context-type="linenumber">576</context> </context-group> <note priority="1" from="description">Header for form section</note> </trans-unit> @@ -2813,7 +2758,7 @@ <source>Additional</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">644</context> + <context context-type="linenumber">577</context> </context-group> <note priority="1" from="description">Header for form section</note> </trans-unit> @@ -2821,7 +2766,7 @@ <source>Scholar activities</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">645</context> + <context context-type="linenumber">578</context> </context-group> <note priority="1" from="description">Header for form section</note> </trans-unit> @@ -2829,7 +2774,7 @@ <source>Education</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">652</context> + <context context-type="linenumber">585</context> </context-group> <note priority="1" from="description">Panel title</note> </trans-unit> @@ -2837,7 +2782,7 @@ <source>School History</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">655</context> + <context context-type="linenumber">588</context> </context-group> <note priority="1" from="description">Title inside a panel</note> </trans-unit> @@ -2845,7 +2790,7 @@ <source>ASER Results</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">675</context> + <context context-type="linenumber">608</context> </context-group> <note priority="1" from="description">Title inside a panel</note> </trans-unit> @@ -2853,7 +2798,7 @@ <source>Find a suitable new school</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">679</context> + <context context-type="linenumber">612</context> </context-group> <note priority="1" from="description">Child details section title</note> </trans-unit> @@ -2861,7 +2806,7 @@ <source>Notes & Tasks</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">700</context> + <context context-type="linenumber">633</context> </context-group> <note priority="1" from="description">Panel title</note> </trans-unit> @@ -2869,7 +2814,7 @@ <source>Height & Weight Tracking</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">726</context> + <context context-type="linenumber">659</context> </context-group> <note priority="1" from="description">Title inside a panel</note> </trans-unit> @@ -2877,7 +2822,7 @@ <source>Educational Materials</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">732</context> + <context context-type="linenumber">665</context> </context-group> <note priority="1" from="description">Panel title</note> </trans-unit> @@ -2885,7 +2830,7 @@ <source>Observations</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">741</context> + <context context-type="linenumber">674</context> </context-group> <note priority="1" from="description">Panel title</note> </trans-unit> @@ -2893,7 +2838,7 @@ <source>Events & Attendance</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">828</context> + <context context-type="linenumber">761</context> </context-group> <note priority="1" from="description">Panel title</note> </trans-unit> @@ -2901,7 +2846,7 @@ <source>Basic Report</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">843</context> + <context context-type="linenumber">776</context> </context-group> <note priority="1" from="description">Name of a report</note> </trans-unit> @@ -2909,7 +2854,7 @@ <source>All children</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">847</context> + <context context-type="linenumber">780</context> </context-group> <note priority="1" from="description">Label of report query</note> </trans-unit> @@ -2917,7 +2862,7 @@ <source>All schools</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">852</context> + <context context-type="linenumber">785</context> </context-group> <note priority="1" from="description">Label for report query</note> </trans-unit> @@ -2925,7 +2870,7 @@ <source>Children attending a school</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">855</context> + <context context-type="linenumber">788</context> </context-group> <note priority="1" from="description">Label for report query</note> </trans-unit> @@ -2933,7 +2878,7 @@ <source>Governmental schools</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">859</context> + <context context-type="linenumber">792</context> </context-group> <note priority="1" from="description">Label for report query</note> </trans-unit> @@ -2941,7 +2886,7 @@ <source>Children attending a governmental school</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">864</context> + <context context-type="linenumber">797</context> </context-group> <note priority="1" from="description">Label for report query</note> </trans-unit> @@ -2949,7 +2894,7 @@ <source>Private schools</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">868</context> + <context context-type="linenumber">801</context> </context-group> <note priority="1" from="description">Label for report query</note> </trans-unit> @@ -2957,7 +2902,7 @@ <source>Children attending a private school</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">873</context> + <context context-type="linenumber">806</context> </context-group> <note priority="1" from="description">Label for report query</note> </trans-unit> @@ -2965,7 +2910,7 @@ <source>Event Report</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">881</context> + <context context-type="linenumber">814</context> </context-group> <note priority="1" from="description">Name of a report</note> </trans-unit> @@ -2973,7 +2918,7 @@ <source>Attendance Report</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">898</context> + <context context-type="linenumber">831</context> </context-group> <note priority="1" from="description">Name of a report</note> </trans-unit> @@ -2981,7 +2926,7 @@ <source>Total</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">913</context> + <context context-type="linenumber">846</context> </context-group> <note priority="1" from="description">Name of a column of a report</note> </trans-unit> @@ -2989,7 +2934,7 @@ <source>Present</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">917</context> + <context context-type="linenumber">850</context> </context-group> <note priority="1" from="description">Name of a column of a report</note> </trans-unit> @@ -2997,7 +2942,7 @@ <source>Rate</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">921</context> + <context context-type="linenumber">854</context> </context-group> <note priority="1" from="description">Name of a column of a report</note> </trans-unit> @@ -3005,7 +2950,7 @@ <source>Late</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">925</context> + <context context-type="linenumber">858</context> </context-group> <note priority="1" from="description">Name of a column of a report</note> </trans-unit> @@ -3013,11 +2958,11 @@ <source>Address</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">946</context> + <context context-type="linenumber">879</context> </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1014</context> + <context context-type="linenumber">947</context> </context-group> <note priority="1" from="description">Label for the address of a child</note> </trans-unit> @@ -3025,7 +2970,7 @@ <source>Blood Group</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">953</context> + <context context-type="linenumber">886</context> </context-group> <note priority="1" from="description">Label for a child attribute</note> </trans-unit> @@ -3033,7 +2978,7 @@ <source>Religion</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">960</context> + <context context-type="linenumber">893</context> </context-group> <note priority="1" from="description">Label for the religion of a child</note> </trans-unit> @@ -3041,7 +2986,7 @@ <source>Mother Tongue</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">967</context> + <context context-type="linenumber">900</context> </context-group> <note priority="1" from="description">Label for the mother tongue of a child</note> </trans-unit> @@ -3049,7 +2994,7 @@ <source>The primary language spoken at home</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">968</context> + <context context-type="linenumber">901</context> </context-group> <note priority="1" from="description">Tooltip description for the mother tongue of a child</note> </trans-unit> @@ -3057,7 +3002,7 @@ <source>Last Dental Check-Up</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">975</context> + <context context-type="linenumber">908</context> </context-group> <note priority="1" from="description">Label for a child attribute</note> </trans-unit> @@ -3065,7 +3010,7 @@ <source>Birth certificate</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">982</context> + <context context-type="linenumber">915</context> </context-group> <note priority="1" from="description">Label for a child attribute</note> </trans-unit> @@ -3073,7 +3018,7 @@ <source>Private School</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1000</context> + <context context-type="linenumber">933</context> </context-group> <note priority="1" from="description">Label for if a school is a private school</note> </trans-unit> @@ -3081,7 +3026,7 @@ <source>Language</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1007</context> + <context context-type="linenumber">940</context> </context-group> <note priority="1" from="description">Label for the language of a school</note> </trans-unit> @@ -3089,7 +3034,7 @@ <source>School Timing</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1028</context> + <context context-type="linenumber">961</context> </context-group> <note priority="1" from="description">Label for the timing of a school</note> </trans-unit> @@ -3097,7 +3042,7 @@ <source>Motivated</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1047</context> + <context context-type="linenumber">980</context> </context-group> <note priority="1" from="description">Label for a child attribute</note> </trans-unit> @@ -3105,7 +3050,7 @@ <source>The child is motivated during the class.</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1048</context> + <context context-type="linenumber">981</context> </context-group> <note priority="1" from="description">Description for a child attribute</note> </trans-unit> @@ -3113,7 +3058,7 @@ <source>Participating</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1056</context> + <context context-type="linenumber">989</context> </context-group> <note priority="1" from="description">Label for a child attribute</note> </trans-unit> @@ -3121,7 +3066,7 @@ <source>The child is actively participating in the class.</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1057</context> + <context context-type="linenumber">990</context> </context-group> <note priority="1" from="description">Description for a child attribute</note> </trans-unit> @@ -3129,7 +3074,7 @@ <source>Interacting</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1065</context> + <context context-type="linenumber">998</context> </context-group> <note priority="1" from="description">Label for a child attribute</note> </trans-unit> @@ -3137,7 +3082,7 @@ <source>The child interacts with other students during the class.</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1066</context> + <context context-type="linenumber">999</context> </context-group> <note priority="1" from="description">Description for a child attribute</note> </trans-unit> @@ -3145,7 +3090,7 @@ <source>Homework</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1074</context> + <context context-type="linenumber">1007</context> </context-group> <note priority="1" from="description">Label for a child attribute</note> </trans-unit> @@ -3153,7 +3098,7 @@ <source>The child does its homework.</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1075</context> + <context context-type="linenumber">1008</context> </context-group> <note priority="1" from="description">Description for a child attribute</note> </trans-unit> @@ -3161,7 +3106,7 @@ <source>Asking Questions</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1083</context> + <context context-type="linenumber">1016</context> </context-group> <note priority="1" from="description">Label for a child attribute</note> </trans-unit> @@ -3169,7 +3114,7 @@ <source>The child is asking questions during the class.</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1084</context> + <context context-type="linenumber">1017</context> </context-group> <note priority="1" from="description">Description for a child attribute</note> </trans-unit> @@ -3177,7 +3122,7 @@ <source>Contact</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/config/config-fix.ts</context> - <context context-type="linenumber">1095</context> + <context context-type="linenumber">1028</context> </context-group> <note priority="1" from="description">Label of user phone</note> </trans-unit> @@ -3273,33 +3218,80 @@ </context-group> <note priority="1" from="description">Interaction type/Category of a Note</note> </trans-unit> + <trans-unit id="7a39368f9393f9bf97632d275e023ffbbe594be8" datatype="html"> + <source> This field is required </source> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.html</context> + <context context-type="linenumber">57,58</context> + </context-group> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-text-with-autocomplete/edit-text-with-autocomplete.component.html</context> + <context context-type="linenumber">32,33</context> + </context-group> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/todos/recurring-interval/edit-recurring-interval/edit-recurring-interval.component.html</context> + <context context-type="linenumber">23,25</context> + </context-group> + <note priority="1" from="description">Error message for any input</note> + </trans-unit> + <trans-unit id="5432260252143962374" datatype="html"> + <source>Create new option</source> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/basic-autocomplete/basic-autocomplete.component.ts</context> + <context context-type="linenumber">188</context> + </context-group> + </trans-unit> <trans-unit id="5175452770249467211" datatype="html"> <source>[invalid option]</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/configurable-enum/configurable-enum-datatype/configurable-enum-datatype.ts</context> - <context context-type="linenumber">61</context> + <context context-type="linenumber">53</context> </context-group> <note priority="1" from="description">enum option label prefix for invalid id dummy</note> </trans-unit> - <trans-unit id="7a39368f9393f9bf97632d275e023ffbbe594be8" datatype="html"> - <source> This field is required </source> + <trans-unit id="f02662520a5f60c9da28cdebbe9c17f34b4439c8" datatype="html"> + <source> Edit dropdown options +</source> <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/configurable-enum/edit-configurable-enum/edit-configurable-enum.component.html</context> - <context context-type="linenumber">21,23</context> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html</context> + <context context-type="linenumber">2,3</context> </context-group> + <note priority="1" from="description">title of dropdown options popup dialog</note> + </trans-unit> + <trans-unit id="396111f33ef48eef016cd0eedb7be2ef882d7430" datatype="html"> + <source> Close </source> <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.html</context> - <context context-type="linenumber">62,63</context> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.html</context> + <context context-type="linenumber">34,35</context> </context-group> <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-text-with-autocomplete/edit-text-with-autocomplete.component.html</context> - <context context-type="linenumber">32,33</context> + <context context-type="sourcefile">src/app/core/latest-changes/changelog/changelog.component.html</context> + <context context-type="linenumber">54,56</context> </context-group> + <note priority="1" from="description">Close popup</note> + </trans-unit> + <trans-unit id="1729165161001518929" datatype="html"> + <source>Are you sure that you want to delete the option <x id="PH" equiv-text="value.label"/>?</source> <context-group purpose="location"> - <context context-type="sourcefile">src/app/features/todos/recurring-interval/edit-recurring-interval/edit-recurring-interval.component.html</context> - <context context-type="linenumber">23,25</context> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">68</context> + </context-group> + </trans-unit> + <trans-unit id="6524829042498938726" datatype="html"> + <source> The option is still used in <x id="PH" equiv-text="existingUsages.join( + ", " + )"/> records. If deleted, the records will not be lost but specially marked</source> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">70,72</context> + </context-group> + </trans-unit> + <trans-unit id="3767101596108414700" datatype="html"> + <source>Delete option</source> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/core/configurable-enum/configure-enum-popup/configure-enum-popup.component.ts</context> + <context context-type="linenumber">75</context> </context-group> - <note priority="1" from="description">Error message for any input</note> </trans-unit> <trans-unit id="8998179362936748717" datatype="html"> <source>OK</source> @@ -3592,15 +3584,6 @@ <note priority="1" from="description">context 10 in total</note> <note priority="1" from="meaning">Displaying the amount of involved entities</note> </trans-unit> - <trans-unit id="4668912478133095886" datatype="html"> - <source>Select <x id="PH" equiv-text="config.formFieldConfig.label || config.propertySchema?.label"/></source> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/entity-components/entity-select/edit-single-entity/edit-single-entity.component.ts</context> - <context context-type="linenumber">62,64</context> - </context-group> - <note priority="1" from="description">context Select User</note> - <note priority="1" from="meaning">Placeholder for input to set an entity</note> - </trans-unit> <trans-unit id="1f05f87b0643c90a090870fcfdb99d888b556f23" datatype="html"> <source>Creating new record.</source> <context-group purpose="location"> @@ -3723,7 +3706,7 @@ <source>Preparing data (Indexing)</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/entity/database-indexing/database-indexing.service.ts</context> - <context context-type="linenumber">60</context> + <context context-type="linenumber">59</context> </context-group> </trans-unit> <trans-unit id="5210270493533766316" datatype="html"> @@ -3758,7 +3741,7 @@ </context-group> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">60</context> + <context context-type="linenumber">61</context> </context-group> <note priority="1" from="description">Undo deleting an entity</note> </trans-unit> @@ -3864,26 +3847,18 @@ <context context-type="linenumber">46,48</context> </context-group> </trans-unit> - <trans-unit id="396111f33ef48eef016cd0eedb7be2ef882d7430" datatype="html"> - <source> Close </source> - <context-group purpose="location"> - <context context-type="sourcefile">src/app/core/latest-changes/changelog/changelog.component.html</context> - <context context-type="linenumber">54,56</context> - </context-group> - <note priority="1" from="description">Generic close button</note> - </trans-unit> <trans-unit id="2566001175328025157" datatype="html"> <source>No Changelog Available</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/changelog/changelog.component.ts</context> - <context context-type="linenumber">87</context> + <context context-type="linenumber">89</context> </context-group> </trans-unit> <trans-unit id="7795087408392131030" datatype="html"> <source>Could not load latest changes: <x id="PH" equiv-text="error"/></source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/latest-changes/latest-changes.service.ts</context> - <context context-type="linenumber">131</context> + <context context-type="linenumber">121</context> </context-group> </trans-unit> <trans-unit id="2896181875024748753" datatype="html"> @@ -4289,7 +4264,7 @@ Please try again. If the problem persists contact Aam Digital support.</source> <source><x id="START_TAG_FA_ICON" ctype="x-fa_icon" equiv-text="<fa-icon icon="user">"/><x id="CLOSE_TAG_FA_ICON" ctype="x-fa_icon" equiv-text="</fa-icon>"/> Profile </source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/ui/ui/ui.component.html</context> - <context context-type="linenumber">84,86</context> + <context context-type="linenumber">85,87</context> </context-group> <note priority="1" from="description">Navigate to user profile page</note> </trans-unit> @@ -4297,7 +4272,7 @@ Please try again. If the problem persists contact Aam Digital support.</source> <source><x id="START_TAG_FA_ICON" ctype="x-fa_icon" equiv-text="<fa-icon icon="sign-out-alt">"/><x id="CLOSE_TAG_FA_ICON" ctype="x-fa_icon" equiv-text="</fa-icon>"/> Sign out </source> <context-group purpose="location"> <context context-type="sourcefile">src/app/core/ui/ui/ui.component.html</context> - <context context-type="linenumber">89,91</context> + <context context-type="linenumber">90,92</context> </context-group> <note priority="1" from="description">Sign out of the app</note> </trans-unit> @@ -4523,14 +4498,14 @@ Please try again. If the problem persists contact Aam Digital support.</source> <source>Import completed</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">59</context> + <context context-type="linenumber">60</context> </context-group> </trans-unit> <trans-unit id="6880068429772311753" datatype="html"> <source>Import new data?</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">75</context> + <context context-type="linenumber">76</context> </context-group> </trans-unit> <trans-unit id="1690350829788615736" datatype="html"> @@ -4538,14 +4513,14 @@ Please try again. If the problem persists contact Aam Digital support.</source> This will add or update <x id="PH" equiv-text="data.length"/> records from the loaded file.</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">76,77</context> + <context context-type="linenumber">77,78</context> </context-group> </trans-unit> <trans-unit id="5345022420402242415" datatype="html"> <source><x id="PH" equiv-text="refText"/> All existing records imported with the transaction id '<x id="PH_1" equiv-text="importMeta.transactionId"/>' will be deleted!</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/data-import/data-import.service.ts</context> - <context context-type="linenumber">79</context> + <context context-type="linenumber">80</context> </context-group> </trans-unit> <trans-unit id="4fd611f679282abb73122b03bfed3724dba9b6bf" datatype="html"> @@ -4809,11 +4784,28 @@ Please try again. If the problem persists contact Aam Digital support.</source> </context-group> <note priority="1" from="description">help text in map popup</note> </trans-unit> + <trans-unit id="22ee8aecedfcdfcd3313bc6c5f0e80175bfafd58" datatype="html"> + <source> Select displayed locations +</source> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/location/map/map-properties-popup/map-properties-popup.component.html</context> + <context context-type="linenumber">1,3</context> + </context-group> + <note priority="1" from="description">Title of popup to select locations that are displayed in the map</note> + </trans-unit> + <trans-unit id="c2d0ac9f528bbd5f53fd34269fde8b59e029621b" datatype="html"> + <source>Apply</source> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/location/map/map-properties-popup/map-properties-popup.component.html</context> + <context context-type="linenumber">18</context> + </context-group> + <note priority="1" from="description">Button for closing popup and applying changes</note> + </trans-unit> <trans-unit id="2549737213024136740" datatype="html"> - <source><x id="PH" equiv-text="res"/> km</source> + <source><x id="PH" equiv-text="closest"/> km</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/location/view-distance/view-distance.component.ts</context> - <context context-type="linenumber">73</context> + <context context-type="linenumber">65</context> </context-group> <note priority="1" from="description">e.g. 5 km</note> <note priority="1" from="meaning">distance with unit</note> @@ -4830,7 +4822,7 @@ Please try again. If the problem persists contact Aam Digital support.</source> <source> Select <x id="INTERPOLATION" equiv-text="{{ side.entityType?.label }}"/> </source> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.html</context> - <context context-type="linenumber">55,56</context> + <context context-type="linenumber">54,55</context> </context-group> <note priority="1" from="description">header of section with entities available for selection</note> </trans-unit> @@ -4838,7 +4830,7 @@ Please try again. If the problem persists contact Aam Digital support.</source> <source>create matching</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.ts</context> - <context context-type="linenumber">85</context> + <context context-type="linenumber">91</context> </context-group> <note priority="1" from="description">Matching button label</note> </trans-unit> @@ -4846,7 +4838,7 @@ Please try again. If the problem persists contact Aam Digital support.</source> <source>Distance</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/matching-entities/matching-entities/matching-entities.component.ts</context> - <context context-type="linenumber">273</context> + <context context-type="linenumber">312</context> </context-group> <note priority="1" from="description">Matching View column name</note> </trans-unit> @@ -5077,6 +5069,20 @@ Please try again. If the problem persists contact Aam Digital support.</source> </context-group> <note priority="1" from="description">The progress, e.g. of a certain activity</note> </trans-unit> + <trans-unit id="2468578017924444574" datatype="html"> + <source>Example form</source> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/public-form/demo-public-form-generator.service.ts</context> + <context context-type="linenumber">18</context> + </context-group> + </trans-unit> + <trans-unit id="5065162821808701761" datatype="html"> + <source>This is a form that can be shared as a link or embedded in a website. It can be filled by users without having an account. For example you can let participants self-register their details and just review the records within Aam Digital.</source> + <context-group purpose="location"> + <context context-type="sourcefile">src/app/features/public-form/demo-public-form-generator.service.ts</context> + <context context-type="linenumber">19</context> + </context-group> + </trans-unit> <trans-unit id="f215ed23a0b8105ae47ef80cf65fe765631dd94a" datatype="html"> <source> Submit Form </source> <context-group purpose="location"> @@ -5097,7 +5103,7 @@ Please try again. If the problem persists contact Aam Digital support.</source> <source>Successfully submitted form</source> <context-group purpose="location"> <context context-type="sourcefile">src/app/features/public-form/public-form.component.ts</context> - <context context-type="linenumber">58</context> + <context context-type="linenumber">62</context> </context-group> </trans-unit> <trans-unit id="1906738132039774080" datatype="html"> diff --git a/src/styles/variables/_colors.scss b/src/styles/variables/_colors.scss index 0a5f02ef47..75e0cddc38 100644 --- a/src/styles/variables/_colors.scss +++ b/src/styles/variables/_colors.scss @@ -26,6 +26,7 @@ $warn : mat.get-color-from-palette($warn-palette); $error : mat.get-color-from-palette($err-palette); $muted : rgba(0, 0, 0, 0.54); +$disabled : rgba(0, 0, 0, 0.38); /* * Quantized warning-levels. Each level represents a color from green (all is OK)