diff --git a/.github/workflows/pull-request-update.yml b/.github/workflows/pull-request-update.yml index 1888a9d1d7..a205fcff60 100644 --- a/.github/workflows/pull-request-update.yml +++ b/.github/workflows/pull-request-update.yml @@ -28,6 +28,19 @@ jobs: BUILD=${{ false }} cache-from: type=gha cache-to: type=gha,mode=max + - name: Run tests with timezone + uses: docker/build-push-action@v3 + with: + context: ./ + file: ./build/Dockerfile + builder: ${{ steps.buildx.outputs.name }} + target: builder + build-args: | + RUN_TESTS=${{ true }} + TZ=America/Detroit + BUILD=${{ false }} + cache-from: type=gha + cache-to: type=gha,mode=max deploy-prod-image: runs-on: ubuntu-latest steps: diff --git a/build/Dockerfile b/build/Dockerfile index b974d2043e..5407c2439a 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -3,7 +3,7 @@ # Run the following commands from the root folder to build, run and kill the application # >> docker build -f build/Dockerfile -t aam-digital . # >> docker run -p=80:80 aam-digital -FROM node:16.14.2-alpine3.15 as builder +FROM node:16.14.2-alpine3.15 AS builder WORKDIR /app COPY package*.json ./ @@ -32,6 +32,12 @@ RUN if [ "$UPLOAD_COVERAGE" = true ] ; then \ chmod +x ./cc-test-reporter &&\ ./cc-test-reporter before-build ; fi +ARG TZ +RUN if [ -n "${TZ}" ] ; then \ + apk --no-cache add tzdata && \ + cp /usr/share/zoneinfo/Europe/Brussels /etc/localtime && \ + echo "$TZ" > /etc/timezone ; fi + # When set to true, chromium is installed an tests are executed ARG RUN_TESTS=false ARG CHROME_BIN=/usr/bin/chromium-browser @@ -59,7 +65,7 @@ ARG SENTRY_ORG ARG SENTRY_PROJECT RUN if [ "$SENTRY_AUTH_TOKEN" != "" ] ; then \ npm install -g @sentry/cli &&\ - sentry-cli --auth-token=$SENTRY_AUTH_TOKEN releases --org=$SENTRY_ORG --project=$SENTRY_PROJECT files ndb-core@$APP_VERSION upload-sourcemaps dist && \ + sentry-cli --auth-token="$SENTRY_AUTH_TOKEN" releases --org="$SENTRY_ORG" --project="$SENTRY_PROJECT" files "ndb-core@$APP_VERSION" upload-sourcemaps dist && \ rm dist/*.map ; fi ### PROD image diff --git a/src/app/child-dev-project/attendance/attendance.service.spec.ts b/src/app/child-dev-project/attendance/attendance.service.spec.ts index a66a0e7989..923acaae5e 100644 --- a/src/app/child-dev-project/attendance/attendance.service.spec.ts +++ b/src/app/child-dev-project/attendance/attendance.service.spec.ts @@ -41,10 +41,10 @@ describe("AttendanceService", () => { activity1 = RecurringActivity.create("activity 1"); activity2 = RecurringActivity.create("activity 2"); - e1_1 = createEvent(new Date("2020-01-01"), activity1.getId(true)); - e1_2 = createEvent(new Date("2020-01-02"), activity1.getId(true)); - e1_3 = createEvent(new Date("2020-03-02"), activity1.getId(true)); - e2_1 = createEvent(new Date("2020-01-01"), activity2.getId(true)); + e1_1 = createEvent(moment("2020-01-01").toDate(), activity1.getId(true)); + e1_2 = createEvent(moment("2020-01-02").toDate(), activity1.getId(true)); + e1_3 = createEvent(moment("2020-03-02").toDate(), activity1.getId(true)); + e2_1 = createEvent(moment("2020-01-01").toDate(), activity2.getId(true)); TestBed.configureTestingModule({ imports: [DatabaseTestingModule], @@ -69,24 +69,32 @@ describe("AttendanceService", () => { }); it("gets events for a date", async () => { - const actualEvents = await service.getEventsOnDate(new Date("2020-01-01")); + const actualEvents = await service.getEventsOnDate( + moment("2020-01-01").toDate(), + ); expectEntitiesToMatch(actualEvents, [e1_1, e2_1]); }); it("gets events including Notes for a date", async () => { - const note1 = Note.create(new Date("2020-01-01"), "manual event note 1"); + const note1 = Note.create( + moment("2020-01-01").toDate(), + "manual event note 1", + ); note1.addChild("1"); note1.addChild("2"); note1.category = meetingInteractionCategory; await entityMapper.save(note1); - const note2 = Note.create(new Date("2020-01-02"), "manual event note 2"); + const note2 = Note.create( + moment("2020-01-02").toDate(), + "manual event note 2", + ); note2.addChild("1"); note2.category = meetingInteractionCategory; await entityMapper.save(note2); const nonMeetingNote = Note.create( - new Date("2020-01-02"), + moment("2020-01-02").toDate(), "manual event note 3", ); nonMeetingNote.addChild("1"); @@ -94,15 +102,17 @@ describe("AttendanceService", () => { await entityMapper.save(nonMeetingNote); const actualEvents = await service.getEventsOnDate( - new Date("2020-01-01"), - new Date("2020-01-02"), + moment("2020-01-01").toDate(), + moment("2020-01-02").toDate(), ); expectEntitiesToMatch(actualEvents, [e1_1, e1_2, e2_1, note1, note2]); }); it("gets empty array for a date without events", async () => { - const actualEvents = await service.getEventsOnDate(new Date("2007-01-01")); + const actualEvents = await service.getEventsOnDate( + moment("2007-01-01").toDate(), + ); expect(actualEvents).toBeEmpty(); }); @@ -210,7 +220,7 @@ describe("AttendanceService", () => { const childSchoolRelation = new ChildSchoolRelation(); childSchoolRelation.childId = "testChild"; childSchoolRelation.schoolId = "testSchool"; - childSchoolRelation.start = new Date("2020-01-01"); + childSchoolRelation.start = moment("2020-01-01").toDate(); const testActivity = RecurringActivity.create("new activity"); testActivity.linkedGroups.push("testSchool"); @@ -329,10 +339,10 @@ describe("AttendanceService", () => { it("should load the events for a date with date-picker format", async () => { const datePickerDate = new Date( - new Date("2021-04-05").setHours(0, 0, 0, 0), + moment("2021-04-05").toDate().setHours(0, 0, 0, 0), ); const sameDayEvent = EventNote.create( - new Date("2021-04-05"), + moment("2021-04-05").toDate(), "Same Day Event", ); sameDayEvent.category = meetingInteractionCategory; diff --git a/src/app/child-dev-project/attendance/attendance.service.ts b/src/app/child-dev-project/attendance/attendance.service.ts index fe21b9c1ba..9b289f2970 100644 --- a/src/app/child-dev-project/attendance/attendance.service.ts +++ b/src/app/child-dev-project/attendance/attendance.service.ts @@ -32,9 +32,13 @@ export class AttendanceService { by_date: { map: `(doc) => { if (doc._id.startsWith("${EventNote.ENTITY_TYPE}")) { - var d = new Date(doc.date || null); - var dString = d.getFullYear() + "-" + String(d.getMonth()+1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0") - emit(dString); + if (doc.date && doc.date.length === 10) { + emit(doc.date); + } else { + var d = new Date(doc.date || null); + var dString = d.getFullYear() + "-" + String(d.getMonth()+1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0"); + emit(dString); + } } }`, }, @@ -42,8 +46,13 @@ export class AttendanceService { by_activity: { map: `(doc) => { if (doc._id.startsWith("${EventNote.ENTITY_TYPE}") && doc.relatesTo) { - var d = new Date(doc.date || null); - var dString = d.getFullYear() + "-" + String(d.getMonth()+1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0") + var dString; + if (doc.date && doc.date.length === 10) { + dString = doc.date; + } else { + var d = new Date(doc.date || null); + dString = d.getFullYear() + "-" + String(d.getMonth()+1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0"); + } emit(doc.relatesTo + "_" + dString); } }`, diff --git a/src/app/child-dev-project/children/children-components.ts b/src/app/child-dev-project/children/children-components.ts index bf7e52a181..569caea244 100644 --- a/src/app/child-dev-project/children/children-components.ts +++ b/src/app/child-dev-project/children/children-components.ts @@ -45,11 +45,11 @@ export const childrenComponents: ComponentTuple[] = [ ).then((c) => c.ChildrenBmiDashboardComponent), ], [ - "EducationalMaterial", + "RelatedEntitiesWithSummary", () => import( - "./educational-material/educational-material-component/educational-material.component" - ).then((c) => c.EducationalMaterialComponent), + "../../core/entity-details/related-entities-with-summary/related-entities-with-summary.component" + ).then((c) => c.RelatedEntitiesWithSummaryComponent), ], [ "BmiBlock", diff --git a/src/app/child-dev-project/children/children.service.spec.ts b/src/app/child-dev-project/children/children.service.spec.ts index 92565d43ed..371750d700 100644 --- a/src/app/child-dev-project/children/children.service.spec.ts +++ b/src/app/child-dev-project/children/children.service.spec.ts @@ -269,6 +269,22 @@ describe("ChildrenService", () => { res = await service.getNotesRelatedTo(s1.getId(true)); expect(res).toEqual([n1]); }); + + it("should return the correct notes in a timespan", async () => { + const n1 = Note.create(moment("2023-01-01").toDate()); + const n2 = Note.create(moment("2023-01-02").toDate()); + const n3 = Note.create(moment("2023-01-03").toDate()); + const n4 = Note.create(moment("2023-01-03").toDate()); + const n5 = Note.create(moment("2023-01-04").toDate()); + await entityMapper.saveAll([n1, n2, n3, n4, n5]); + + const res = await service.getNotesInTimespan( + moment("2023-01-02"), + moment("2023-01-03"), + ); + + expect(res).toEqual(jasmine.arrayWithExactContents([n2, n3, n4])); + }); }); function generateChildEntities(): Child[] { diff --git a/src/app/child-dev-project/children/children.service.ts b/src/app/child-dev-project/children/children.service.ts index cbad2d6b26..89a281a693 100644 --- a/src/app/child-dev-project/children/children.service.ts +++ b/src/app/child-dev-project/children/children.service.ts @@ -222,9 +222,12 @@ export class ChildrenService { map: `(doc) => { if (!doc._id.startsWith("${Note.ENTITY_TYPE}")) return; if (!Array.isArray(doc.children) || !doc.date) return; - var d = new Date(doc.date || null); - var dString = d.getFullYear() + "-" + String(d.getMonth()+1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0") - emit(dString); + if (doc.date.length === 10) { + emit(doc.date); + } else { + var d = new Date(doc.date || null); + emit(d.getFullYear() + "-" + String(d.getMonth()+1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0")); + } }`, }, }, @@ -246,12 +249,15 @@ export class ChildrenService { map: `(doc) => { if (!doc._id.startsWith("${Note.ENTITY_TYPE}")) return; if (!Array.isArray(doc.relatedEntities)) return; - - var d = new Date(doc.date || null); - var dateString = d.getFullYear() + "-" + String(d.getMonth()+1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0") - + var dString; + if (doc.date && doc.date.length === 10) { + dString = doc.date; + } else { + var d = new Date(doc.date || null); + dString = d.getFullYear() + "-" + String(d.getMonth()+1).padStart(2, "0") + "-" + String(d.getDate()).padStart(2, "0"); + } doc.relatedEntities.forEach((relatedEntity) => { - emit([relatedEntity, dateString]); + emit([relatedEntity, dString]); }); }`, }, diff --git a/src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.html b/src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.html deleted file mode 100644 index abfd833c5c..0000000000 --- a/src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.html +++ /dev/null @@ -1,15 +0,0 @@ - - - -
- - Total: {{ summary }}
-
- - Average: {{ avgSummary }}
-
-
diff --git a/src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.ts b/src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.ts deleted file mode 100644 index 5a065632c3..0000000000 --- a/src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { Component, Input, OnInit } from "@angular/core"; -import { NgFor, NgIf } from "@angular/common"; -import { EducationalMaterial } from "../model/educational-material"; -import { Child } from "../../model/child"; -import { FormFieldConfig } from "../../../../core/common-components/entity-form/entity-form/FormConfig"; -import { DynamicComponent } from "../../../../core/config/dynamic-components/dynamic-component.decorator"; -import { EntityMapperService } from "../../../../core/entity/entity-mapper/entity-mapper.service"; -import { applyUpdate } from "../../../../core/entity/model/entity-update"; -import { filter } from "rxjs/operators"; -import { UntilDestroy, untilDestroyed } from "@ngneat/until-destroy"; -import { EntitySubrecordComponent } from "../../../../core/common-components/entity-subrecord/entity-subrecord/entity-subrecord.component"; - -/** - * Displays educational materials of a child, such as a pencil, rulers, e.t.c - * as well as a summary - */ -@DynamicComponent("EducationalMaterial") -@UntilDestroy() -@Component({ - selector: "app-educational-material", - templateUrl: "./educational-material.component.html", - imports: [ - EntitySubrecordComponent, - NgIf, - NgFor - ], - standalone: true, -}) -export class EducationalMaterialComponent implements OnInit { - @Input() entity: Child; - @Input() summaries: { total?: boolean; average?: boolean } = { total: true }; - records: EducationalMaterial[] = []; - summary = ""; - avgSummary = ""; - - @Input() config: { columns: FormFieldConfig[] } = { - columns: [ - { id: "date", visibleFrom: "xs" }, - { id: "materialType", visibleFrom: "xs" }, - { id: "materialAmount", visibleFrom: "md" }, - { id: "description", visibleFrom: "md" }, - ], - }; - - constructor(private entityMapper: EntityMapperService) { - this.entityMapper - .receiveUpdates(EducationalMaterial) - .pipe( - untilDestroyed(this), - filter( - ({ entity, type }) => - type === "remove" || entity.child === this.entity.getId(), - ), - ) - .subscribe((update) => { - this.records = applyUpdate(this.records, update); - this.updateSummary(); - }); - } - - ngOnInit() { - return this.loadData(); - } - - /** - * Loads the data for a given child and updates the summary - * @param id The id of the child to load the data for - */ - private async loadData() { - const allMaterials = await this.entityMapper.loadType(EducationalMaterial); - this.records = allMaterials.filter( - (mat) => mat.child === this.entity.getId(), - ); - this.updateSummary(); - } - - newRecordFactory = () => { - const newAtt = new EducationalMaterial(Date.now().toString()); - - // use last entered date as default, otherwise today's date - newAtt.date = this.records.length > 0 ? this.records[0].date : new Date(); - newAtt.child = this.entity.getId(); - - return newAtt; - }; - - /** - * update the summary or generate a new one. - * The summary contains no duplicates and is in a - * human-readable format - */ - updateSummary() { - const summary = new Map(); - const average = new Map(); - - this.records.forEach((m) => { - const { materialType, materialAmount } = m; - const label = materialType?.label; - - if (label) { - summary.set(label, (summary.get(label) || { count: 0, sum: 0 })); - summary.get(label)!.count++; - summary.get(label)!.sum += materialAmount; - } - }); - - if(this.summaries.total) { - const summaryArray = Array.from(summary.entries(), ([label, { sum }]) => `${label}: ${sum}`); - this.summary = summaryArray.join(", "); - } - - if(this.summaries.average) { - const avgSummaryArray = Array.from(summary.entries(), ([label, { count, sum }]) => { - const avg = parseFloat((sum / count).toFixed(2)); - average.set(label, avg); - return `${label}: ${avg}`; - }); - this.avgSummary = avgSummaryArray.join(", "); - } - } -} diff --git a/src/app/core/basic-datatypes/date/date-range-filter/date-range-filter-panel/date-range-filter-panel.component.spec.ts b/src/app/core/basic-datatypes/date/date-range-filter/date-range-filter-panel/date-range-filter-panel.component.spec.ts index 44ca08bc13..b63dc2ae5f 100644 --- a/src/app/core/basic-datatypes/date/date-range-filter/date-range-filter-panel/date-range-filter-panel.component.spec.ts +++ b/src/app/core/basic-datatypes/date/date-range-filter/date-range-filter-panel/date-range-filter-panel.component.spec.ts @@ -23,7 +23,7 @@ describe("DateRangeFilterPanelComponent", () => { beforeEach(async () => { dateFilter = new DateFilter("test", "Test", defaultDateFilters); dateFilter.selectedOption = "1"; - jasmine.clock().mockDate(new Date("2023-04-08")); + jasmine.clock().mockDate(moment("2023-04-08").toDate()); await TestBed.configureTestingModule({ imports: [MatNativeDateModule], providers: [ @@ -73,8 +73,8 @@ describe("DateRangeFilterPanelComponent", () => { await cells[12].select(); const filterRange = dateFilter.getDateRange(); - expect(filterRange.start).toEqual(new Date("2023-04-08")); - expect(filterRange.end).toEqual(new Date("2023-04-13")); + expect(filterRange.start).toEqual(moment("2023-04-08").toDate()); + expect(filterRange.end).toEqual(moment("2023-04-13").toDate()); }); it("should set the dates selected via the preset options", async () => { diff --git a/src/app/core/basic-datatypes/date/date-range-filter/date-range-filter.component.spec.ts b/src/app/core/basic-datatypes/date/date-range-filter/date-range-filter.component.spec.ts index 03fb26ac5d..69b266e69c 100644 --- a/src/app/core/basic-datatypes/date/date-range-filter/date-range-filter.component.spec.ts +++ b/src/app/core/basic-datatypes/date/date-range-filter/date-range-filter.component.spec.ts @@ -6,6 +6,7 @@ import { MatNativeDateModule } from "@angular/material/core"; import { NoopAnimationsModule } from "@angular/platform-browser/animations"; import { DateFilter } from "../../../filter/filters/filters"; import { defaultDateFilters } from "./date-range-filter-panel/date-range-filter-panel.component"; +import moment from "moment"; describe("DateRangeFilterComponent", () => { let component: DateRangeFilterComponent; @@ -33,7 +34,7 @@ describe("DateRangeFilterComponent", () => { component.filterConfig = dateFilter; expect(component.dateFilter.getFilter()).toEqual({}); - jasmine.clock().mockDate(new Date("2023-05-18")); + jasmine.clock().mockDate(moment("2023-05-18").toDate()); dateFilter.selectedOption = "0"; component.filterConfig = dateFilter; let expectedDataFilter = { @@ -101,8 +102,8 @@ describe("DateRangeFilterComponent", () => { it("should set the correct date filter when changing the date range manually", () => { component.filterConfig = new DateFilter("test", "test", []); - component.fromDate = new Date("2021-10-28"); - component.toDate = new Date("2024-02-12"); + component.fromDate = moment("2021-10-28").toDate(); + component.toDate = moment("2024-02-12").toDate(); component.dateChangedManually(); diff --git a/src/app/core/basic-datatypes/map/map.datatype.spec.ts b/src/app/core/basic-datatypes/map/map.datatype.spec.ts index e24a2947f4..b811a6f6b9 100644 --- a/src/app/core/basic-datatypes/map/map.datatype.spec.ts +++ b/src/app/core/basic-datatypes/map/map.datatype.spec.ts @@ -20,6 +20,7 @@ import { TestBed, waitForAsync } from "@angular/core/testing"; import { DatabaseField } from "../../entity/database-field.decorator"; import { EntitySchemaService } from "../../entity/schema/entity-schema.service"; import { MockedTestingModule } from "../../../utils/mocked-testing.module"; +import moment from "moment"; describe("Schema data type: map", () => { class TestEntity extends Entity { @@ -39,8 +40,8 @@ describe("Schema data type: map", () => { it("converts contained dates to month for saving", () => { const id = "test1"; const entity = new TestEntity(id); - entity.dateMap.set("a", new Date("2020-01-01")); - entity.dateMap.set("b", new Date("1999-01-25")); + entity.dateMap.set("a", moment("2020-01-01").toDate()); + entity.dateMap.set("b", moment("1999-01-25").toDate()); const rawData = entitySchemaService.transformEntityToDatabaseFormat(entity); diff --git a/src/app/core/basic-datatypes/schema-embed/schema-embed.datatype.spec.ts b/src/app/core/basic-datatypes/schema-embed/schema-embed.datatype.spec.ts index bccebe1bdc..530b7b2b5e 100644 --- a/src/app/core/basic-datatypes/schema-embed/schema-embed.datatype.spec.ts +++ b/src/app/core/basic-datatypes/schema-embed/schema-embed.datatype.spec.ts @@ -20,6 +20,7 @@ import { DatabaseField } from "../../entity/database-field.decorator"; import { EntitySchemaService } from "../../entity/schema/entity-schema.service"; import { TestBed, waitForAsync } from "@angular/core/testing"; import { MockedTestingModule } from "../../../utils/mocked-testing.module"; +import moment from "moment"; describe("Schema data type: schema-embed", () => { class InnerClass { @@ -55,7 +56,7 @@ describe("Schema data type: schema-embed", () => { it("applies inner schema transformation for database format", () => { const entity = new TestEntity(); - entity.embedded.value = new Date("2020-01-01"); + entity.embedded.value = moment("2020-01-01").toDate(); const rawData = entitySchemaService.transformEntityToDatabaseFormat(entity); expect(rawData.embedded.value).toEqual("2020-01"); diff --git a/src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts b/src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts index d7215e2c0b..f7fd6c9cb5 100644 --- a/src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts +++ b/src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts @@ -1,11 +1,10 @@ -import { Injectable } from "@angular/core"; +import { Injectable, NgZone } from "@angular/core"; import { MatDialog } from "@angular/material/dialog"; import { ConfirmationDialogButton, ConfirmationDialogComponent, YesNoButtons, } from "./confirmation-dialog/confirmation-dialog.component"; -import { map } from "rxjs/operators"; import { firstValueFrom } from "rxjs"; /** @@ -25,7 +24,10 @@ import { firstValueFrom } from "rxjs"; */ @Injectable({ providedIn: "root" }) export class ConfirmationDialogService { - constructor(private dialog: MatDialog) {} + constructor( + private dialog: MatDialog, + private ngZone: NgZone, + ) {} /** * Open a dialog with the given configuration. @@ -42,18 +44,17 @@ export class ConfirmationDialogService { buttons: ConfirmationDialogButton[] = YesNoButtons, closeButton = true, ): Promise { - return firstValueFrom( - this.dialog - .open(ConfirmationDialogComponent, { - data: { - title: title, - text: text, - buttons: buttons, - closeButton: closeButton, - }, - }) - .afterClosed(), - ); + const dialogRef = this.ngZone.run(() => { + return this.dialog.open(ConfirmationDialogComponent, { + data: { + title: title, + text: text, + buttons: buttons, + closeButton: closeButton, + }, + }); + }); + return firstValueFrom(dialogRef.afterClosed()); } getDiscardConfirmation() { diff --git a/src/app/core/common-components/edit-text-with-autocomplete/edit-text-with-autocomplete.component.spec.ts b/src/app/core/common-components/edit-text-with-autocomplete/edit-text-with-autocomplete.component.spec.ts index 98277cf35d..1259659bb2 100644 --- a/src/app/core/common-components/edit-text-with-autocomplete/edit-text-with-autocomplete.component.spec.ts +++ b/src/app/core/common-components/edit-text-with-autocomplete/edit-text-with-autocomplete.component.spec.ts @@ -13,8 +13,10 @@ describe("EditTextWithAutocompleteComponent", () => { let component: EditTextWithAutocompleteComponent; let fixture: ComponentFixture; let loadTypeSpy: jasmine.Spy; + let mockConfirmationDialog: jasmine.SpyObj; beforeEach(waitForAsync(() => { + mockConfirmationDialog = jasmine.createSpyObj(["getConfirmation"]); TestBed.configureTestingModule({ imports: [ EditTextWithAutocompleteComponent, @@ -23,7 +25,7 @@ describe("EditTextWithAutocompleteComponent", () => { providers: [ { provide: ConfirmationDialogService, - useValue: new ConfirmationDialogService(null), + useValue: mockConfirmationDialog, }, ], }).compileComponents(); @@ -149,11 +151,7 @@ describe("EditTextWithAutocompleteComponent", () => { rA1.assignedTo = ["user1", "user2"]; rA1.linkedGroups = ["group1", "group2"]; loadTypeSpy.and.resolveTo([rA1, rA2]); - const confirmationDialogueSpy: jasmine.Spy = spyOn( - TestBed.inject(ConfirmationDialogService), - "getConfirmation", - ); - confirmationDialogueSpy.and.resolveTo(true); + mockConfirmationDialog.getConfirmation.and.resolveTo(true); await component.ngOnInit(); component.formControl.setValue("test1"); diff --git a/src/app/core/common-components/entity-form/entity-form/entity-form.component.spec.ts b/src/app/core/common-components/entity-form/entity-form/entity-form.component.spec.ts index b5eb05e358..e57589da85 100644 --- a/src/app/core/common-components/entity-form/entity-form/entity-form.component.spec.ts +++ b/src/app/core/common-components/entity-form/entity-form/entity-form.component.spec.ts @@ -110,6 +110,24 @@ describe("EntityFormComponent", () => { ); }); + it("should clear field in form for properties removed in updated remote entity", async () => { + const originalEntity = { projectNumber: "p1", name: "test" }; + const formValues = { projectNumber: "p2", name: "test" }; + const remoteValues = { + _rev: "new rev", + }; + await expectApplyChangesPopup( + "no", + originalEntity, + formValues, + remoteValues, + { + projectNumber: "p2", + _rev: "new rev", + }, + ); + }); + it("should not show popup if date was saved as day-only", async () => { const form = { dateOfBirth: new DateWithAge() }; const dateOnly = new DateWithAge(); diff --git a/src/app/core/common-components/entity-form/entity-form/entity-form.component.ts b/src/app/core/common-components/entity-form/entity-form/entity-form.component.ts index 5c9516dcdd..fd806f216b 100644 --- a/src/app/core/common-components/entity-form/entity-form/entity-form.component.ts +++ b/src/app/core/common-components/entity-form/entity-form/entity-form.component.ts @@ -88,48 +88,43 @@ export class EntityFormComponent } } - private async applyChanges(entity: T) { - if (this.formIsUpToDate(entity)) { - Object.assign(this.entity, entity as any); + private async applyChanges(externallyUpdatedEntity: T) { + if (this.formIsUpToDate(externallyUpdatedEntity)) { + Object.assign(this.entity, externallyUpdatedEntity); return; } + + const userEditedFields = Object.entries(this.form.getRawValue()).filter( + ([key]) => this.form.controls[key].dirty, + ); + let userEditsWithoutConflicts = userEditedFields.filter(([key]) => + // no conflict with updated values + this.entityEqualsFormValue( + externallyUpdatedEntity[key], + this.initialFormValues[key], + ), + ); if ( - this.changesOnlyAffectPristineFields(entity) || - (await this.confirmationDialog.getConfirmation( + userEditsWithoutConflicts.length !== userEditedFields.length && + !(await this.confirmationDialog.getConfirmation( $localize`Load changes?`, $localize`Local changes are in conflict with updated values synced from the server. Do you want the local changes to be overwritten with the latest values?`, )) ) { - Object.assign(this.initialFormValues, entity); - this.form.patchValue(entity as any); - Object.assign(this.entity, entity as any); + // user "resolved" conflicts by confirming to overwrite + userEditsWithoutConflicts = userEditedFields; } - } - private changesOnlyAffectPristineFields(updatedEntity: T) { - if (this.form.pristine) { - return true; - } - - const dirtyFields = Object.entries(this.form.controls).filter( - ([_, form]) => form.dirty, - ); - for (const [key] of dirtyFields) { - if ( - this.entityEqualsFormValue( - updatedEntity[key], - this.initialFormValues[key], - ) - ) { - // keep our pending form field changes - delete updatedEntity[key]; - } else { - // dirty form field has conflicting change - return false; - } - } + // apply update to all pristine (not user-edited) fields and update base entity (to avoid conflicts when saving) + Object.assign(this.entity, externallyUpdatedEntity); + Object.assign(this.initialFormValues, externallyUpdatedEntity); + this.form.reset(externallyUpdatedEntity as any); - return true; + // re-apply user-edited fields + userEditsWithoutConflicts.forEach(([key, value]) => { + this.form.get(key).setValue(value); + this.form.get(key).markAsDirty(); + }); } private formIsUpToDate(entity: T): boolean { diff --git a/src/app/core/config/config-fix.ts b/src/app/core/config/config-fix.ts index 333e83ca6f..0c160bf969 100644 --- a/src/app/core/config/config-fix.ts +++ b/src/app/core/config/config-fix.ts @@ -706,14 +706,24 @@ export const defaultJsonConfig = { "components": [ { "title": "", - "component": "EducationalMaterial", + "component": "RelatedEntitiesWithSummary", "config": { - "summaries": { - total: true, - average: true, + "entityType": EducationalMaterial.ENTITY_TYPE, + "property": "child", + "columns": [ + { "id": "date", "visibleFrom": "xs" }, + { "id": "materialType", "visibleFrom": "xs" }, + { "id": "materialAmount", "visibleFrom": "md" }, + { "id": "description", "visibleFrom": "md" }, + ], + "summaries": { + "countProperty": "materialAmount", + "groupBy": "materialType", + "total": true, + "average": false } } - } + } ] }, { diff --git a/src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html b/src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html new file mode 100644 index 0000000000..c59e53e42c --- /dev/null +++ b/src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html @@ -0,0 +1,16 @@ + + +
+ + Total: {{ summarySum }}
+
+ + Average: {{ summaryAvg }}
+
+
diff --git a/src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.spec.ts b/src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.spec.ts similarity index 50% rename from src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.spec.ts rename to src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.spec.ts index 9068e33c8e..5c17e54951 100644 --- a/src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.spec.ts +++ b/src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.spec.ts @@ -1,17 +1,23 @@ -import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; - -import { EducationalMaterialComponent } from "./educational-material.component"; -import { Child } from "../../model/child"; -import { MockedTestingModule } from "../../../../utils/mocked-testing.module"; -import { EducationalMaterial } from "../model/educational-material"; -import { ConfigurableEnumValue } from "../../../../core/basic-datatypes/configurable-enum/configurable-enum.interface"; -import { EntityMapperService } from "../../../../core/entity/entity-mapper/entity-mapper.service"; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, + waitForAsync, +} from "@angular/core/testing"; + +import { RelatedEntitiesWithSummaryComponent } from "./related-entities-with-summary.component"; +import { Child } from "../../../child-dev-project/children/model/child"; +import { MockedTestingModule } from "../../../utils/mocked-testing.module"; +import { EducationalMaterial } from "../../../child-dev-project/children/educational-material/model/educational-material"; +import { ConfigurableEnumValue } from "../../basic-datatypes/configurable-enum/configurable-enum.interface"; +import { EntityMapperService } from "../../entity/entity-mapper/entity-mapper.service"; import { Subject } from "rxjs"; -import { UpdatedEntity } from "../../../../core/entity/model/entity-update"; +import { UpdatedEntity } from "../../entity/model/entity-update"; -describe("EducationalMaterialComponent", () => { - let component: EducationalMaterialComponent; - let fixture: ComponentFixture; +describe("RelatedEntitiesWithSummaryComponent", () => { + let component: RelatedEntitiesWithSummaryComponent; + let fixture: ComponentFixture; const updates = new Subject>(); const child = new Child("22"); const PENCIL: ConfigurableEnumValue = { @@ -25,17 +31,29 @@ describe("EducationalMaterialComponent", () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [EducationalMaterialComponent, MockedTestingModule.withState()], + imports: [ + RelatedEntitiesWithSummaryComponent, + MockedTestingModule.withState(), + ], }).compileComponents(); const entityMapper = TestBed.inject(EntityMapperService); spyOn(entityMapper, "receiveUpdates").and.returnValue(updates); })); beforeEach(() => { - fixture = TestBed.createComponent(EducationalMaterialComponent); + fixture = TestBed.createComponent(RelatedEntitiesWithSummaryComponent); component = fixture.componentInstance; component.entity = child; - component.summaries = {total: true, average: true}; + component.entityType = EducationalMaterial.ENTITY_TYPE; + component.property = "child"; + + component.summaries = { + countProperty: "materialAmount", + groupBy: "materialType", + total: true, + average: true, + }; + fixture.detectChanges(); }); @@ -44,32 +62,47 @@ describe("EducationalMaterialComponent", () => { }); it("produces an empty summary when there are no records", () => { - component.records = []; + component.data = []; component.updateSummary(); - expect(component.summary).toHaveSize(0); - expect(component.avgSummary).toHaveSize(0); + expect(component.summarySum).toHaveSize(0); + expect(component.summaryAvg).toHaveSize(0); }); function setRecordsAndGenerateSummary( ...records: Partial[] ) { - component.records = records.map(EducationalMaterial.create); + component.data = records.map(EducationalMaterial.create); component.updateSummary(); } it("produces a singleton summary when there is a single record", () => { setRecordsAndGenerateSummary({ materialType: PENCIL, materialAmount: 1 }); - expect(component.summary).toEqual(`${PENCIL.label}: 1`); - expect(component.avgSummary).toEqual(`${PENCIL.label}: 1`); + expect(component.summarySum).toEqual(`${PENCIL.label}: 1`); + expect(component.summaryAvg).toEqual(`${PENCIL.label}: 1`); }); it("produces a summary of all records when they are all different", () => { setRecordsAndGenerateSummary( { materialType: PENCIL, materialAmount: 2 }, { materialType: RULER, materialAmount: 1 }, + { materialAmount: 1 }, + ); + expect(component.summarySum).toEqual( + `${PENCIL.label}: 2, ${RULER.label}: 1, undefined: 1`, ); - expect(component.summary).toEqual(`${PENCIL.label}: 2, ${RULER.label}: 1`); - expect(component.avgSummary).toEqual(`${PENCIL.label}: 2, ${RULER.label}: 1`); + expect(component.summaryAvg).toEqual( + `${PENCIL.label}: 2, ${RULER.label}: 1, undefined: 1`, + ); + }); + + it("produces a singly summary without grouping, if `groupBy` is not given (or the group value undefined)", () => { + component.data = [{ amount: 1 }, { amount: 5 }] as any[]; + delete component.summaries.groupBy; + component.summaries.countProperty = "amount"; + component.updateSummary(); + + expect(component.summarySum).toEqual(`6`); + expect(component.summaryAvg).toEqual(`3`); }); it("produces a summary of all records when there are duplicates", () => { @@ -79,56 +112,70 @@ describe("EducationalMaterialComponent", () => { { materialType: PENCIL, materialAmount: 3 }, ); - expect(component.summary).toEqual(`${PENCIL.label}: 4, ${RULER.label}: 1`); - expect(component.avgSummary).toEqual(`${PENCIL.label}: 2, ${RULER.label}: 1`); + expect(component.summarySum).toEqual( + `${PENCIL.label}: 4, ${RULER.label}: 1`, + ); + expect(component.summaryAvg).toEqual( + `${PENCIL.label}: 2, ${RULER.label}: 1`, + ); }); it("produces summary of all records when average is false and total is true", () => { - component.summaries = { total: true, average: false } + component.summaries.total = true; + component.summaries.average = false; setRecordsAndGenerateSummary( { materialType: PENCIL, materialAmount: 1 }, { materialType: RULER, materialAmount: 1 }, { materialType: PENCIL, materialAmount: 3 }, ); - expect(component.summary).toEqual(`${PENCIL.label}: 4, ${RULER.label}: 1`); - expect(component.avgSummary).toEqual(``); + expect(component.summarySum).toEqual( + `${PENCIL.label}: 4, ${RULER.label}: 1`, + ); + expect(component.summaryAvg).toEqual(``); }); it("produces summary of all records when average is true and total is false", () => { - component.summaries = { total: false, average: true }; + component.summaries.total = false; + component.summaries.average = true; setRecordsAndGenerateSummary( { materialType: PENCIL, materialAmount: 1 }, { materialType: RULER, materialAmount: 1 }, { materialType: PENCIL, materialAmount: 3 }, ); - expect(component.summary).toEqual(``); - expect(component.avgSummary).toEqual(`${PENCIL.label}: 2, ${RULER.label}: 1`); + expect(component.summarySum).toEqual(``); + expect(component.summaryAvg).toEqual( + `${PENCIL.label}: 2, ${RULER.label}: 1`, + ); }); it("does not produces summary of all records when both average and total are false", () => { - component.summaries = { total: false, average: false }; + component.summaries.total = false; + component.summaries.average = false; setRecordsAndGenerateSummary( { materialType: PENCIL, materialAmount: 1 }, { materialType: RULER, materialAmount: 1 }, { materialType: PENCIL, materialAmount: 3 }, ); - - expect(component.summary).toEqual(``); - expect(component.avgSummary).toEqual(``); + + expect(component.summarySum).toEqual(``); + expect(component.summaryAvg).toEqual(``); }); it("produces summary of all records when both average and total are true", () => { - component.summaries = { total: true, average: true }; setRecordsAndGenerateSummary( { materialType: PENCIL, materialAmount: 1 }, { materialType: RULER, materialAmount: 1 }, { materialType: PENCIL, materialAmount: 3 }, ); - expect(component.summary).toEqual(`${PENCIL.label}: 4, ${RULER.label}: 1`); - expect(component.avgSummary).toEqual(`${PENCIL.label}: 2, ${RULER.label}: 1`); + expect(component.summarySum).toEqual( + `${PENCIL.label}: 4, ${RULER.label}: 1`, + ); + expect(component.summaryAvg).toEqual( + `${PENCIL.label}: 2, ${RULER.label}: 1`, + ); }); it("loads all education data associated with a child and updates the summary", async () => { @@ -141,38 +188,41 @@ describe("EducationalMaterialComponent", () => { ); component.entity = new Child("22"); await component.ngOnInit(); - expect(component.summary).toEqual(`${PENCIL.label}: 1, ${RULER.label}: 2`); - expect(component.records).toEqual(educationalData); + expect(component.summarySum).toEqual( + `${PENCIL.label}: 1, ${RULER.label}: 2`, + ); + expect(component.data).toEqual(educationalData); }); - it("associates a new record with the current child", () => { - const newRecord = component.newRecordFactory(); - expect(newRecord.child).toBe(child.getId()); - }); + it("should update the summary when entity updates are received", fakeAsync(() => { + component.ngOnInit(); + tick(); - it("should update the summary when entity updates are received", async () => { const update1 = EducationalMaterial.create({ child: child.getId(), materialType: PENCIL, materialAmount: 1, }); updates.next({ entity: update1, type: "new" }); + tick(); - expect(component.records).toEqual([update1]); - expect(component.summary).toBe(`${PENCIL.label}: 1`); + expect(component.data).toEqual([update1]); + expect(component.summarySum).toBe(`${PENCIL.label}: 1`); const update2 = update1.copy() as EducationalMaterial; update2.materialAmount = 2; updates.next({ entity: update2, type: "update" }); + tick(); - expect(component.records).toEqual([update2]); - expect(component.summary).toBe(`${PENCIL.label}: 2`); + expect(component.data).toEqual([update2]); + expect(component.summarySum).toBe(`${PENCIL.label}: 2`); const unrelatedUpdate = update1.copy() as EducationalMaterial; unrelatedUpdate.child = "differentChild"; updates.next({ entity: unrelatedUpdate, type: "new" }); + tick(); // No change - expect(component.records).toEqual([update2]); - expect(component.summary).toBe(`${PENCIL.label}: 2`); - }); + expect(component.data).toEqual([update2]); + expect(component.summarySum).toBe(`${PENCIL.label}: 2`); + })); }); diff --git a/src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.ts b/src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.ts new file mode 100644 index 0000000000..2055435762 --- /dev/null +++ b/src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.ts @@ -0,0 +1,113 @@ +import { Component, Input, OnInit } from "@angular/core"; +import { NgFor, NgIf } from "@angular/common"; +import { DynamicComponent } from "../../config/dynamic-components/dynamic-component.decorator"; +import { UntilDestroy, untilDestroyed } from "@ngneat/until-destroy"; +import { EntitySubrecordComponent } from "../../common-components/entity-subrecord/entity-subrecord/entity-subrecord.component"; +import { RelatedEntitiesComponent } from "../related-entities/related-entities.component"; +import { Entity } from "../../entity/model/entity"; +import { filter } from "rxjs/operators"; +import { applyUpdate } from "../../entity/model/entity-update"; + +/** + * Load and display a list of entity subrecords (entities related to the current entity details view) + * including a summary below the table. + */ +@DynamicComponent("RelatedEntitiesWithSummary") +@UntilDestroy() +@Component({ + selector: "app-related-entities-with-summary", + templateUrl: "./related-entities-with-summary.component.html", + imports: [EntitySubrecordComponent, NgIf, NgFor], + standalone: true, +}) +export class RelatedEntitiesWithSummaryComponent + extends RelatedEntitiesComponent + implements OnInit +{ + /** + * Configuration of what numbers should be summarized below the table. + */ + @Input() summaries?: { + countProperty: string; + groupBy?: string; + total?: boolean; + average?: boolean; + }; + + summarySum = ""; + summaryAvg = ""; + + async ngOnInit() { + await super.ngOnInit(); + this.updateSummary(); + + this.entityMapper + .receiveUpdates(this.entityCtr) + .pipe( + untilDestroyed(this), + filter( + ({ entity, type }) => + type === "remove" || entity[this.property] === this.entity.getId(), + ), + ) + .subscribe((update) => { + this.data = applyUpdate(this.data, update); + this.updateSummary(); + }); + } + + /** + * update the summary or generate a new one. + * The summary contains no duplicates and is in a + * human-readable format + */ + updateSummary() { + if (!this.summaries) { + this.summarySum = ""; + this.summaryAvg = ""; + return; + } + + const summary = new Map(); + const average = new Map(); + + this.data.forEach((m) => { + const amount = m[this.summaries.countProperty]; + let groupLabel; + if (this.summaries.groupBy) { + groupLabel = + m[this.summaries.groupBy]?.label ?? m[this.summaries.groupBy]; + } + + summary.set(groupLabel, summary.get(groupLabel) || { count: 0, sum: 0 }); + summary.get(groupLabel).count++; + summary.get(groupLabel).sum += amount; + }); + + if (this.summaries.total) { + const summarySumArray = Array.from( + summary.entries(), + ([label, { sum }]) => `${label}: ${sum}`, + ); + this.summarySum = summarySumArray.join(", "); + } + + if (this.summaries.average) { + const summaryAvgArray = Array.from( + summary.entries(), + ([label, { count, sum }]) => { + const avg = parseFloat((sum / count).toFixed(2)); + average.set(label, avg); + return `${label}: ${avg}`; + }, + ); + this.summaryAvg = summaryAvgArray.join(", "); + } + + if (summary.size === 1 && summary.has(undefined)) { + // display only single summary without group label (this also applies if no groupBy is given) + this.summarySum = this.summarySum.replace("undefined: ", ""); + this.summaryAvg = this.summaryAvg.replace("undefined: ", ""); + } + } +} diff --git a/src/app/core/entity-details/related-entities/related-entities.component.spec.ts b/src/app/core/entity-details/related-entities/related-entities.component.spec.ts index 44c9b0eebd..49a1a1f2f5 100644 --- a/src/app/core/entity-details/related-entities/related-entities.component.spec.ts +++ b/src/app/core/entity-details/related-entities/related-entities.component.spec.ts @@ -30,7 +30,7 @@ describe("RelatedEntitiesComponent", () => { expect(component).toBeTruthy(); }); - it("should load the entities which are linked with the passed one", async () => { + it("should load only the entities which are linked with the passed one", async () => { const c1 = new Child(); const c2 = new Child(); const r1 = new ChildSchoolRelation(); @@ -52,7 +52,7 @@ describe("RelatedEntitiesComponent", () => { await component.ngOnInit(); expect(component.columns).toBe(columns); - expect(component.data).toEqual([r1, r2, r3]); + expect(component.data).toEqual([r1, r2]); expect(component.filter).toEqual({ ...filter, childId: c1.getId() }); }); diff --git a/src/app/core/entity-details/related-entities/related-entities.component.ts b/src/app/core/entity-details/related-entities/related-entities.component.ts index a6c9b1507a..7e5a4eb93e 100644 --- a/src/app/core/entity-details/related-entities/related-entities.component.ts +++ b/src/app/core/entity-details/related-entities/related-entities.component.ts @@ -50,7 +50,7 @@ export class RelatedEntitiesComponent implements OnInit { protected entityCtr: EntityConstructor; constructor( - private entityMapper: EntityMapperService, + protected entityMapper: EntityMapperService, private entities: EntityRegistry, ) {} @@ -64,7 +64,12 @@ export class RelatedEntitiesComponent implements OnInit { this.entityCtr = this.entities.get(this.entityType) as EntityConstructor; this.isArray = isArrayProperty(this.entityCtr, this.property); - this.data = await this.entityMapper.loadType(this.entityType); + this.data = (await this.entityMapper.loadType(this.entityType)).filter( + (e) => + this.isArray + ? e[this.property].includes(this.entity.getId()) + : e[this.property] === this.entity.getId(), + ); this.filter = { ...this.filter, [this.property]: this.isArray diff --git a/src/app/core/entity-details/related-time-period-entities/related-time-period-entities.component.spec.ts b/src/app/core/entity-details/related-time-period-entities/related-time-period-entities.component.spec.ts index 85bcc2e268..e5ad40422f 100644 --- a/src/app/core/entity-details/related-time-period-entities/related-time-period-entities.component.spec.ts +++ b/src/app/core/entity-details/related-time-period-entities/related-time-period-entities.component.spec.ts @@ -124,13 +124,14 @@ describe("RelatedTimePeriodEntitiesComponent", () => { }); it("should create a new entity with the start date inferred from previous relations", async () => { + const child = new Child(); const existingRelation = new ChildSchoolRelation(); existingRelation.start = moment().subtract(1, "year").toDate(); existingRelation.end = moment().subtract(1, "week").toDate(); + existingRelation.childId = child.getId(false); const loadType = spyOn(entityMapper, "loadType"); loadType.and.resolveTo([existingRelation]); - const child = new Child(); component.entity = child; await component.ngOnInit(); diff --git a/src/app/core/export/download-service/download.service.spec.ts b/src/app/core/export/download-service/download.service.spec.ts index 916e430256..9ae04ea0ce 100644 --- a/src/app/core/export/download-service/download.service.spec.ts +++ b/src/app/core/export/download-service/download.service.spec.ts @@ -7,6 +7,7 @@ import { DatabaseEntity } from "../../entity/database-entity.decorator"; import { Entity } from "../../entity/model/entity"; import { ConfigurableEnumValue } from "../../basic-datatypes/configurable-enum/configurable-enum.interface"; import { DatabaseField } from "../../entity/database-field.decorator"; +import moment from "moment"; describe("DownloadService", () => { let service: DownloadService; @@ -96,7 +97,7 @@ describe("DownloadService", () => { const testEntity = new TestEntity(); testEntity.enumProperty = testEnumValue; - testEntity.dateProperty = new Date(testDate); + testEntity.dateProperty = moment(testDate).toDate(); testEntity.boolProperty = true; const csvExport = await service.createCsv([testEntity]); @@ -112,7 +113,7 @@ describe("DownloadService", () => { it("should export a date as YYYY-MM-dd only", async () => { const dateString = "2021-01-01"; - const dateObject = new Date(dateString); + const dateObject = moment(dateString).toDate(); dateObject.setHours(10, 11, 12); const exportData = [ diff --git a/src/app/core/filter/filter.service.spec.ts b/src/app/core/filter/filter.service.spec.ts index a06f68193a..3e00bf7cbd 100644 --- a/src/app/core/filter/filter.service.spec.ts +++ b/src/app/core/filter/filter.service.spec.ts @@ -6,6 +6,7 @@ import { DataFilter } from "../common-components/entity-subrecord/entity-subreco import { Note } from "../../child-dev-project/notes/model/note"; import { ConfigurableEnumService } from "../basic-datatypes/configurable-enum/configurable-enum.service"; import { createTestingConfigurableEnumService } from "../basic-datatypes/configurable-enum/configurable-enum-testing"; +import moment from "moment"; describe("FilterService", () => { let service: FilterService; @@ -67,11 +68,11 @@ describe("FilterService", () => { }); it("should support filtering dates with day granularity", () => { - const n1 = Note.create(new Date("2022-01-01")); - const n2 = Note.create(new Date("2022-01-02")); - const n3 = Note.create(new Date("2022-01-03")); - const n4 = Note.create(new Date("2022-01-04")); - const n5 = Note.create(new Date("2022-01-05")); + const n1 = Note.create(moment("2022-01-01").toDate()); + const n2 = Note.create(moment("2022-01-02").toDate()); + const n3 = Note.create(moment("2022-01-03").toDate()); + const n4 = Note.create(moment("2022-01-04").toDate()); + const n5 = Note.create(moment("2022-01-05").toDate()); const notes = [n1, n2, n3, n4, n5]; let predicate = service.getFilterPredicate({ diff --git a/src/app/core/filter/filter.service.ts b/src/app/core/filter/filter.service.ts index b4db1c5201..8f58997b93 100644 --- a/src/app/core/filter/filter.service.ts +++ b/src/app/core/filter/filter.service.ts @@ -3,11 +3,11 @@ import { EntitySchemaField } from "../entity/schema/entity-schema-field"; import { DataFilter } from "../common-components/entity-subrecord/entity-subrecord/entity-subrecord-config"; import { Entity } from "../entity/model/entity"; import { - createFactory, - allParsingInstructions, allInterpreters, - Filter, + allParsingInstructions, compare, + createFactory, + Filter, } from "@ucast/mongo2js"; import moment from "moment"; import { ConfigurableEnumService } from "../basic-datatypes/configurable-enum/configurable-enum.service"; @@ -72,7 +72,7 @@ export class FilterService { value = this.parseConfigurableEnumValue(property, value); } if (property.dataType.includes("date")) { - value = new Date(value); + value = moment(value).toDate(); } newEntity[key] = value; } diff --git a/src/app/core/filter/filters/filters.ts b/src/app/core/filter/filters/filters.ts index 5195388211..ab60a04953 100644 --- a/src/app/core/filter/filters/filters.ts +++ b/src/app/core/filter/filters/filters.ts @@ -61,8 +61,8 @@ export class DateFilter extends Filter { } const dates = this.selectedOption?.split("_"); if (dates?.length == 2) { - const firstDate = new Date(dates[0]); - const secondDate = new Date(dates[1]); + const firstDate = moment(dates[0]).toDate(); + const secondDate = moment(dates[1]).toDate(); return new DateRange( isValidDate(firstDate) ? firstDate : undefined, isValidDate(secondDate) ? secondDate : undefined, diff --git a/src/assets/locale/messages.de.xlf b/src/assets/locale/messages.de.xlf index 4f181dd144..50827d2e70 100644 --- a/src/assets/locale/messages.de.xlf +++ b/src/assets/locale/messages.de.xlf @@ -1126,15 +1126,15 @@ src/app/core/config/config-fix.ts - 28 + 22 src/app/core/config/config-fix.ts - 569 + 563 src/app/core/config/config-fix.ts - 950 + 960 @@ -1821,7 +1821,7 @@ Message for user src/app/features/file/edit-file/edit-file.component.ts - 130 + 132 @@ -2163,22 +2163,13 @@ 96 - - Aam Digital - DEMO (automatically generated data) - Aam Digital - DEMO (automatisch generierte Daten) - Page title - - src/app/core/config/config-fix.ts - 14 - - Dashboard Dashboard Menu item src/app/core/config/config-fix.ts - 23 + 17 @@ -2191,7 +2182,7 @@ src/app/core/config/config-fix.ts - 33 + 27 @@ -2200,11 +2191,11 @@ Menu item src/app/core/config/config-fix.ts - 38 + 32 src/app/core/config/config-fix.ts - 667 + 661 @@ -2213,7 +2204,7 @@ Menu item src/app/core/config/config-fix.ts - 48 + 42 src/app/features/todos/model/todo.ts @@ -2226,21 +2217,21 @@ Menu item src/app/core/config/config-fix.ts - 53 + 47 Site settings App-Einstellungen + Menu item src/app/core/config/config-fix.ts - 58 + 52 src/app/core/site-settings/site-settings.ts 14 - Menu item Import @@ -2248,7 +2239,7 @@ Menu item src/app/core/config/config-fix.ts - 63 + 57 @@ -2257,7 +2248,7 @@ Menu item src/app/core/config/config-fix.ts - 68 + 62 src/app/core/user/user.ts @@ -2270,7 +2261,7 @@ Menu item src/app/core/config/config-fix.ts - 73 + 67 @@ -2279,7 +2270,7 @@ Menu item src/app/core/config/config-fix.ts - 78 + 72 @@ -2288,7 +2279,7 @@ Menu item src/app/core/config/config-fix.ts - 83 + 77 @@ -2298,7 +2289,7 @@ Dashboard shortcut widget src/app/core/config/config-fix.ts - 98 + 92 @@ -2308,7 +2299,7 @@ Dashboard shortcut widget src/app/core/config/config-fix.ts - 103 + 97 @@ -2318,7 +2309,7 @@ Dashboard shortcut widget src/app/core/config/config-fix.ts - 108 + 102 @@ -2327,7 +2318,7 @@ Attendance week dashboard widget label src/app/core/config/config-fix.ts - 155 + 149 @@ -2336,7 +2327,7 @@ Attendance week dashboard widget label src/app/core/config/config-fix.ts - 162 + 156 @@ -2345,7 +2336,7 @@ Attendance week dashboard widget label src/app/core/config/config-fix.ts - 148 + 142 @@ -2354,7 +2345,7 @@ Title for notes overview src/app/core/config/config-fix.ts - 184 + 178 @@ -2363,11 +2354,11 @@ Translated name of default column group src/app/core/config/config-fix.ts - 194 + 188 src/app/core/config/config-fix.ts - 198 + 192 @@ -2376,19 +2367,19 @@ Translated name of mobile column group src/app/core/config/config-fix.ts - 195 + 189 src/app/core/config/config-fix.ts - 208 + 202 src/app/core/config/config-fix.ts - 501 + 495 src/app/core/config/config-fix.ts - 555 + 549 @@ -2396,7 +2387,7 @@ Anhang src/app/core/config/config-fix.ts - 275 + 269 @@ -2404,7 +2395,7 @@ App-Einstellungen src/app/core/config/config-fix.ts - 287 + 281 @@ -2413,7 +2404,7 @@ Panel title src/app/core/config/config-fix.ts - 334 + 328 @@ -2422,7 +2413,7 @@ Panel title src/app/core/config/config-fix.ts - 353 + 347 @@ -2431,7 +2422,7 @@ Filename of markdown help page (make sure the filename you enter as a translation actually exists on the server!) src/app/core/config/config-fix.ts - 367 + 361 @@ -2440,15 +2431,15 @@ Panel title src/app/core/config/config-fix.ts - 399 + 393 src/app/core/config/config-fix.ts - 591 + 585 src/app/core/config/config-fix.ts - 788 + 798 @@ -2457,7 +2448,7 @@ Panel title src/app/core/config/config-fix.ts - 427 + 421 @@ -2466,7 +2457,7 @@ Panel title src/app/core/config/config-fix.ts - 436 + 430 @@ -2475,7 +2466,7 @@ Column label for age of child src/app/core/config/config-fix.ts - 458 + 452 @@ -2484,7 +2475,7 @@ Column label for school attendance of child src/app/core/config/config-fix.ts - 476 + 470 @@ -2493,7 +2484,7 @@ Column label for coaching attendance of child src/app/core/config/config-fix.ts - 485 + 479 @@ -2502,11 +2493,11 @@ Translated name of default column group src/app/core/config/config-fix.ts - 500 + 494 src/app/core/config/config-fix.ts - 504 + 498 @@ -2515,7 +2506,7 @@ Column group name src/app/core/config/config-fix.ts - 517 + 511 @@ -2524,11 +2515,11 @@ Column group name src/app/core/config/config-fix.ts - 540 + 534 src/app/core/config/config-fix.ts - 689 + 683 @@ -2537,11 +2528,11 @@ Active children filter label - true case src/app/core/config/config-fix.ts - 570 + 564 src/app/core/config/config-fix.ts - 770 + 780 @@ -2550,11 +2541,11 @@ Active children filter label - false case src/app/core/config/config-fix.ts - 571 + 565 src/app/core/config/config-fix.ts - 771 + 781 src/app/core/entity/model/entity.ts @@ -2567,7 +2558,7 @@ Header for form section src/app/core/config/config-fix.ts - 619 + 613 @@ -2576,7 +2567,7 @@ Header for form section src/app/core/config/config-fix.ts - 620 + 614 @@ -2585,7 +2576,7 @@ Header for form section src/app/core/config/config-fix.ts - 621 + 615 @@ -2594,7 +2585,7 @@ Panel title src/app/core/config/config-fix.ts - 628 + 622 @@ -2603,7 +2594,7 @@ Title inside a panel src/app/core/config/config-fix.ts - 631 + 625 @@ -2612,7 +2603,7 @@ Title inside a panel src/app/core/config/config-fix.ts - 651 + 645 @@ -2621,7 +2612,7 @@ Child details section title src/app/core/config/config-fix.ts - 655 + 649 @@ -2630,7 +2621,7 @@ Panel title src/app/core/config/config-fix.ts - 676 + 670 @@ -2639,7 +2630,7 @@ description section src/app/core/config/config-fix.ts - 698 + 692 @@ -2648,7 +2639,7 @@ Title inside a panel src/app/core/config/config-fix.ts - 705 + 699 @@ -2657,7 +2648,7 @@ Panel title src/app/core/config/config-fix.ts - 711 + 705 @@ -2666,7 +2657,7 @@ Panel title src/app/core/config/config-fix.ts - 720 + 730 @@ -2684,7 +2675,7 @@ Panel title src/app/core/config/config-fix.ts - 818 + 828 @@ -2693,7 +2684,7 @@ Name of a report src/app/core/config/config-fix.ts - 833 + 843 @@ -2702,7 +2693,7 @@ Label of report query src/app/core/config/config-fix.ts - 837 + 847 @@ -2711,7 +2702,7 @@ Label for report query src/app/core/config/config-fix.ts - 842 + 852 @@ -2720,7 +2711,7 @@ Label for report query src/app/core/config/config-fix.ts - 845 + 855 @@ -2729,7 +2720,7 @@ Label for report query src/app/core/config/config-fix.ts - 849 + 859 @@ -2738,7 +2729,7 @@ Label for report query src/app/core/config/config-fix.ts - 854 + 864 @@ -2747,7 +2738,7 @@ Label for report query src/app/core/config/config-fix.ts - 858 + 868 @@ -2756,7 +2747,7 @@ Label for report query src/app/core/config/config-fix.ts - 863 + 873 @@ -2765,7 +2756,7 @@ Name of a report src/app/core/config/config-fix.ts - 871 + 881 @@ -2774,7 +2765,7 @@ Name of a report src/app/core/config/config-fix.ts - 888 + 898 @@ -2893,7 +2884,7 @@ src/app/core/config/config-fix.ts - 737 + 747 @@ -2906,7 +2897,7 @@ src/app/core/config/config-fix.ts - 1031 + 1041 @@ -3028,7 +3019,7 @@ src/app/core/config/config-fix.ts - 43 + 37 @@ -3149,15 +3140,15 @@ src/app/core/config/config-fix.ts - 453 + 447 src/app/core/config/config-fix.ts - 899 + 909 src/app/core/config/config-fix.ts - 1003 + 1013 @@ -3182,11 +3173,11 @@ src/app/core/config/config-fix.ts - 572 + 566 src/app/core/config/config-fix.ts - 772 + 782 src/app/core/filter/filters/filters.ts @@ -3289,7 +3280,7 @@ src/app/core/config/config-fix.ts - 1045 + 1055 @@ -3553,7 +3544,7 @@ src/app/core/config/config-fix.ts - 464 + 458 @@ -3658,17 +3649,6 @@ Label gender - - Total: - - Insgesamt: - Total amount of education material including a summary - Total amount - - src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.html - 11 - - Clubs visited Schulpartnerschaften geschlossen @@ -3714,11 +3694,11 @@ src/app/core/config/config-fix.ts - 469 + 463 src/app/core/config/config-fix.ts - 580 + 574 @@ -3842,11 +3822,11 @@ src/app/core/config/config-fix.ts - 803 + 813 src/app/core/config/config-fix.ts - 881 + 891 @@ -3948,15 +3928,15 @@ src/app/core/config/config-fix.ts - 220 + 214 src/app/core/config/config-fix.ts - 530 + 524 src/app/core/config/config-fix.ts - 769 + 779 @@ -4005,7 +3985,7 @@ src/app/core/config/config-fix.ts - 949 + 959 @@ -4018,7 +3998,7 @@ src/app/core/config/config-fix.ts - 494 + 488 @@ -4040,7 +4020,7 @@ src/app/core/config/config-fix.ts - 876 + 886 @@ -4253,11 +4233,11 @@ Label for the address of a child src/app/core/config/config-fix.ts - 956 + 966 src/app/core/config/config-fix.ts - 1024 + 1034 @@ -4266,7 +4246,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 963 + 973 @@ -4275,7 +4255,7 @@ Label for the religion of a child src/app/core/config/config-fix.ts - 970 + 980 @@ -4284,7 +4264,7 @@ Label for the mother tongue of a child src/app/core/config/config-fix.ts - 977 + 987 @@ -4293,7 +4273,7 @@ Tooltip description for the mother tongue of a child src/app/core/config/config-fix.ts - 978 + 988 @@ -4302,7 +4282,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 985 + 995 @@ -4311,7 +4291,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 992 + 1002 @@ -4319,11 +4299,11 @@ Privatschule src/app/core/config/config-fix.ts - 388 + 382 src/app/core/config/config-fix.ts - 1010 + 1020 @@ -4332,7 +4312,7 @@ Label for the language of a school src/app/core/config/config-fix.ts - 1017 + 1027 @@ -4341,7 +4321,7 @@ Label for the timing of a school src/app/core/config/config-fix.ts - 1038 + 1048 @@ -4350,7 +4330,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1057 + 1067 @@ -4359,7 +4339,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1058 + 1068 @@ -4368,7 +4348,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1066 + 1076 @@ -4377,7 +4357,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1067 + 1077 @@ -4386,7 +4366,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1075 + 1085 @@ -4395,7 +4375,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1076 + 1086 @@ -4404,7 +4384,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1084 + 1094 @@ -4413,7 +4393,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1085 + 1095 @@ -4422,7 +4402,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1093 + 1103 @@ -4431,7 +4411,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1094 + 1104 @@ -4440,7 +4420,7 @@ Label of user phone src/app/core/config/config-fix.ts - 1105 + 1115 @@ -4501,7 +4481,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 903 + 913 @@ -4510,7 +4490,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 907 + 917 @@ -4519,7 +4499,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 911 + 921 @@ -4528,7 +4508,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 915 + 925 @@ -4537,7 +4517,7 @@ Name of a report src/app/core/config/config-fix.ts - 925 + 935 @@ -4717,15 +4697,15 @@ Delete confirmation title src/app/core/entity/entity-remove.service.ts - 89 + 78 - - Are you sure you want to delete this ? - Wollen sie wirklich dieses/dieses löschen? + + Are you sure you want to delete this record? + Sind Sie sicher, dass Sie diesen -Datensatz löschen wollen? src/app/core/entity/entity-remove.service.ts - 92,90 + 81 Delete confirmation text @@ -4735,7 +4715,7 @@ Deleted Entity information src/app/core/entity/entity-remove.service.ts - 99 + 93 @@ -4744,7 +4724,7 @@ Undo deleting an entity src/app/core/entity/entity-remove.service.ts - 126 + 97 src/app/core/import/import-confirm-summary/import-confirm-summary.component.ts @@ -4933,24 +4913,6 @@ 8 - - Are you sure you want to delete this record? - Wirklich löschen? - Delete confirmation message - - src/app/core/common-components/entity-subrecord/entity-subrecord/entity-subrecord.component.ts - 399 - - - - Record deleted - Eintrag wurde gelöscht - Record deleted info - - src/app/core/common-components/entity-subrecord/entity-subrecord/entity-subrecord.component.ts - 398 - - Save Speichern @@ -5231,7 +5193,7 @@ Discard changes header src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts - 61 + 62 @@ -5240,7 +5202,7 @@ Discard changes message src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts - 62 + 63 @@ -5264,7 +5226,7 @@ Eine neuere Version der App ist verfügbar! src/app/core/ui/latest-changes/update-manager.service.ts - 107 + 111 @@ -5273,7 +5235,7 @@ Action that a user can update the app with src/app/core/ui/latest-changes/update-manager.service.ts - 108 + 112 @@ -5281,7 +5243,7 @@ Die Anwendung ist in einem nicht wiederherstellbaren Zustand, bitte neu laden. src/app/core/ui/latest-changes/update-manager.service.ts - 133 + 137 @@ -5290,7 +5252,7 @@ Action that a user can reload the app with src/app/core/ui/latest-changes/update-manager.service.ts - 134 + 138 @@ -5579,7 +5541,7 @@ Navigate to user profile page src/app/core/ui/ui/ui.component.html - 83 + 95 @@ -5588,7 +5550,7 @@ Sign out of the app src/app/core/ui/ui/ui.component.html - 88 + 105 @@ -5678,12 +5640,28 @@ 78 + + Total: + Gesamt: + + src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html + 11 + + + + Average: + Durchschnitt: + + src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html + 14 + + Load changes? Änderungen laden? src/app/core/common-components/entity-form/entity-form/entity-form.component.ts - 99 + 110 @@ -5691,7 +5669,7 @@ Lokale Änderungen überlappen mit aktualisierten Daten, die vom Server synchronisiert wurden. Wollen Sie die lokalen Änderungen mit den aktuellsten Daten überschreiben? src/app/core/common-components/entity-form/entity-form/entity-form.component.ts - 100 + 111 @@ -6719,7 +6697,7 @@ PWA Install Button Label src/app/core/pwa-install/pwa-install.component.html - 11 + 12 @@ -6728,7 +6706,7 @@ PWA iOS Install Instructions - Line 1 src/app/core/pwa-install/pwa-install.component.html - 15 + 16 @@ -6737,7 +6715,7 @@ PWA iOS Install Instructions - Line 2-1 src/app/core/pwa-install/pwa-install.component.html - 27 + 28 @@ -6746,7 +6724,7 @@ PWA iOS Install Instructions - Line 2-2 src/app/core/pwa-install/pwa-install.component.html - 31 + 32 @@ -6755,7 +6733,7 @@ PWA iOS Install Instructions - Line 3-1 src/app/core/pwa-install/pwa-install.component.html - 36 + 37 @@ -6764,7 +6742,7 @@ PWA iOS Install Instructions - Line 3-2 src/app/core/pwa-install/pwa-install.component.html - 40 + 41 diff --git a/src/assets/locale/messages.fr.xlf b/src/assets/locale/messages.fr.xlf index 75e9de47db..26cbd83145 100644 --- a/src/assets/locale/messages.fr.xlf +++ b/src/assets/locale/messages.fr.xlf @@ -85,7 +85,7 @@ src/app/core/config/config-fix.ts - 1045 + 1055 @@ -244,7 +244,7 @@ src/app/core/config/config-fix.ts - 876 + 886 @@ -746,11 +746,11 @@ src/app/core/config/config-fix.ts - 469 + 463 src/app/core/config/config-fix.ts - 580 + 574 @@ -874,11 +874,11 @@ src/app/core/config/config-fix.ts - 803 + 813 src/app/core/config/config-fix.ts - 881 + 891 @@ -961,11 +961,11 @@ src/app/core/config/config-fix.ts - 572 + 566 src/app/core/config/config-fix.ts - 772 + 782 src/app/core/filter/filters/filters.ts @@ -1072,7 +1072,7 @@ src/app/core/config/config-fix.ts - 737 + 747 @@ -1191,15 +1191,15 @@ src/app/core/config/config-fix.ts - 453 + 447 src/app/core/config/config-fix.ts - 899 + 909 src/app/core/config/config-fix.ts - 1003 + 1013 @@ -1279,15 +1279,15 @@ src/app/core/config/config-fix.ts - 220 + 214 src/app/core/config/config-fix.ts - 530 + 524 src/app/core/config/config-fix.ts - 769 + 779 @@ -1336,7 +1336,7 @@ src/app/core/config/config-fix.ts - 1031 + 1041 @@ -1349,7 +1349,7 @@ src/app/core/config/config-fix.ts - 949 + 959 @@ -1362,7 +1362,7 @@ src/app/core/config/config-fix.ts - 464 + 458 @@ -1467,18 +1467,6 @@ Label gender - - Total: - - Total: - - Total amount of education material including a summary - Total amount - - src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.html - 11 - - Material Materiél @@ -1664,7 +1652,7 @@ src/app/core/config/config-fix.ts - 494 + 488 @@ -2207,15 +2195,15 @@ src/app/core/config/config-fix.ts - 28 + 22 src/app/core/config/config-fix.ts - 569 + 563 src/app/core/config/config-fix.ts - 950 + 960 @@ -2245,7 +2233,7 @@ src/app/core/config/config-fix.ts - 43 + 37 @@ -3205,22 +3193,13 @@ 96 - - Aam Digital - DEMO (automatically generated data) - Aam Digital - DEMO (automatically generated data) - Page title - - src/app/core/config/config-fix.ts - 14 - - Dashboard Tableau de bord Menu item src/app/core/config/config-fix.ts - 23 + 17 @@ -3233,7 +3212,7 @@ src/app/core/config/config-fix.ts - 33 + 27 @@ -3251,21 +3230,21 @@ Menu item src/app/core/config/config-fix.ts - 53 + 47 Site settings Site settings + Menu item src/app/core/config/config-fix.ts - 58 + 52 src/app/core/site-settings/site-settings.ts 14 - Menu item Import @@ -3273,7 +3252,7 @@ Menu item src/app/core/config/config-fix.ts - 63 + 57 @@ -3282,7 +3261,7 @@ Menu item src/app/core/config/config-fix.ts - 68 + 62 src/app/core/user/user.ts @@ -3295,7 +3274,7 @@ Menu item src/app/core/config/config-fix.ts - 73 + 67 @@ -3304,7 +3283,7 @@ Menu item src/app/core/config/config-fix.ts - 78 + 72 @@ -3313,7 +3292,7 @@ Menu item src/app/core/config/config-fix.ts - 83 + 77 @@ -3323,7 +3302,7 @@ Dashboard shortcut widget src/app/core/config/config-fix.ts - 98 + 92 @@ -3333,7 +3312,7 @@ Dashboard shortcut widget src/app/core/config/config-fix.ts - 103 + 97 @@ -3343,7 +3322,7 @@ Dashboard shortcut widget src/app/core/config/config-fix.ts - 108 + 102 @@ -3352,7 +3331,7 @@ Attendance week dashboard widget label src/app/core/config/config-fix.ts - 155 + 149 @@ -3361,7 +3340,7 @@ Attendance week dashboard widget label src/app/core/config/config-fix.ts - 162 + 156 @@ -3370,7 +3349,7 @@ Attendance week dashboard widget label src/app/core/config/config-fix.ts - 148 + 142 @@ -3379,7 +3358,7 @@ Title for notes overview src/app/core/config/config-fix.ts - 184 + 178 @@ -3388,11 +3367,11 @@ Translated name of default column group src/app/core/config/config-fix.ts - 194 + 188 src/app/core/config/config-fix.ts - 198 + 192 @@ -3401,19 +3380,19 @@ Translated name of mobile column group src/app/core/config/config-fix.ts - 195 + 189 src/app/core/config/config-fix.ts - 208 + 202 src/app/core/config/config-fix.ts - 501 + 495 src/app/core/config/config-fix.ts - 555 + 549 @@ -3421,7 +3400,7 @@ Attachment src/app/core/config/config-fix.ts - 275 + 269 @@ -3429,7 +3408,7 @@ Site Settings src/app/core/config/config-fix.ts - 287 + 281 @@ -3438,7 +3417,7 @@ Panel title src/app/core/config/config-fix.ts - 334 + 328 @@ -3447,7 +3426,7 @@ Panel title src/app/core/config/config-fix.ts - 353 + 347 @@ -3456,7 +3435,7 @@ Filename of markdown help page (make sure the filename you enter as a translation actually exists on the server!) src/app/core/config/config-fix.ts - 367 + 361 @@ -3464,11 +3443,11 @@ École privée src/app/core/config/config-fix.ts - 388 + 382 src/app/core/config/config-fix.ts - 1010 + 1020 @@ -3477,15 +3456,15 @@ Panel title src/app/core/config/config-fix.ts - 399 + 393 src/app/core/config/config-fix.ts - 591 + 585 src/app/core/config/config-fix.ts - 788 + 798 @@ -3494,7 +3473,7 @@ Panel title src/app/core/config/config-fix.ts - 427 + 421 @@ -3503,7 +3482,7 @@ Panel title src/app/core/config/config-fix.ts - 436 + 430 @@ -3512,7 +3491,7 @@ Column label for age of child src/app/core/config/config-fix.ts - 458 + 452 @@ -3521,7 +3500,7 @@ Column label for school attendance of child src/app/core/config/config-fix.ts - 476 + 470 @@ -3530,7 +3509,7 @@ Column label for coaching attendance of child src/app/core/config/config-fix.ts - 485 + 479 @@ -3539,7 +3518,7 @@ Column group name src/app/core/config/config-fix.ts - 517 + 511 @@ -3548,11 +3527,11 @@ Translated name of default column group src/app/core/config/config-fix.ts - 500 + 494 src/app/core/config/config-fix.ts - 504 + 498 @@ -3561,11 +3540,11 @@ Column group name src/app/core/config/config-fix.ts - 540 + 534 src/app/core/config/config-fix.ts - 689 + 683 @@ -3574,11 +3553,11 @@ Active children filter label - true case src/app/core/config/config-fix.ts - 570 + 564 src/app/core/config/config-fix.ts - 770 + 780 @@ -3587,11 +3566,11 @@ Active children filter label - false case src/app/core/config/config-fix.ts - 571 + 565 src/app/core/config/config-fix.ts - 771 + 781 src/app/core/entity/model/entity.ts @@ -3604,7 +3583,7 @@ Header for form section src/app/core/config/config-fix.ts - 619 + 613 @@ -3613,7 +3592,7 @@ Header for form section src/app/core/config/config-fix.ts - 620 + 614 @@ -3622,7 +3601,7 @@ Header for form section src/app/core/config/config-fix.ts - 621 + 615 @@ -3631,7 +3610,7 @@ Panel title src/app/core/config/config-fix.ts - 628 + 622 @@ -3640,7 +3619,7 @@ Title inside a panel src/app/core/config/config-fix.ts - 631 + 625 @@ -3649,7 +3628,7 @@ Title inside a panel src/app/core/config/config-fix.ts - 651 + 645 @@ -3658,7 +3637,7 @@ Child details section title src/app/core/config/config-fix.ts - 655 + 649 @@ -3667,7 +3646,7 @@ Panel title src/app/core/config/config-fix.ts - 676 + 670 @@ -3676,7 +3655,7 @@ description section src/app/core/config/config-fix.ts - 698 + 692 @@ -3685,11 +3664,11 @@ Menu item src/app/core/config/config-fix.ts - 38 + 32 src/app/core/config/config-fix.ts - 667 + 661 @@ -3698,7 +3677,7 @@ Menu item src/app/core/config/config-fix.ts - 48 + 42 src/app/features/todos/model/todo.ts @@ -3711,7 +3690,7 @@ Title inside a panel src/app/core/config/config-fix.ts - 705 + 699 @@ -3720,7 +3699,7 @@ Panel title src/app/core/config/config-fix.ts - 711 + 705 @@ -3729,7 +3708,7 @@ Panel title src/app/core/config/config-fix.ts - 720 + 730 @@ -3738,7 +3717,7 @@ Panel title src/app/core/config/config-fix.ts - 818 + 828 @@ -3747,7 +3726,7 @@ Name of a report src/app/core/config/config-fix.ts - 833 + 843 @@ -3756,7 +3735,7 @@ Label of report query src/app/core/config/config-fix.ts - 837 + 847 @@ -3765,7 +3744,7 @@ Label for report query src/app/core/config/config-fix.ts - 842 + 852 @@ -3774,7 +3753,7 @@ Label for report query src/app/core/config/config-fix.ts - 845 + 855 @@ -3783,7 +3762,7 @@ Label for report query src/app/core/config/config-fix.ts - 849 + 859 @@ -3792,7 +3771,7 @@ Label for report query src/app/core/config/config-fix.ts - 854 + 864 @@ -3801,7 +3780,7 @@ Label for report query src/app/core/config/config-fix.ts - 858 + 868 @@ -3810,7 +3789,7 @@ Label for report query src/app/core/config/config-fix.ts - 863 + 873 @@ -3819,7 +3798,7 @@ Name of a report src/app/core/config/config-fix.ts - 871 + 881 @@ -3828,7 +3807,7 @@ Name of a report src/app/core/config/config-fix.ts - 888 + 898 @@ -3837,7 +3816,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 903 + 913 @@ -3846,7 +3825,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 907 + 917 @@ -3855,7 +3834,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 911 + 921 @@ -3864,7 +3843,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 915 + 925 @@ -3873,7 +3852,7 @@ Name of a report src/app/core/config/config-fix.ts - 925 + 935 @@ -3882,11 +3861,11 @@ Label for the address of a child src/app/core/config/config-fix.ts - 956 + 966 src/app/core/config/config-fix.ts - 1024 + 1034 @@ -3895,7 +3874,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 963 + 973 @@ -3904,7 +3883,7 @@ Label for the religion of a child src/app/core/config/config-fix.ts - 970 + 980 @@ -3913,7 +3892,7 @@ Label for the mother tongue of a child src/app/core/config/config-fix.ts - 977 + 987 @@ -3922,7 +3901,7 @@ Tooltip description for the mother tongue of a child src/app/core/config/config-fix.ts - 978 + 988 @@ -3931,7 +3910,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 985 + 995 @@ -3940,7 +3919,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 992 + 1002 @@ -3949,7 +3928,7 @@ Label for the language of a school src/app/core/config/config-fix.ts - 1017 + 1027 @@ -3958,7 +3937,7 @@ Label for the timing of a school src/app/core/config/config-fix.ts - 1038 + 1048 @@ -3967,7 +3946,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1057 + 1067 @@ -3976,7 +3955,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1058 + 1068 @@ -3985,7 +3964,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1066 + 1076 @@ -3994,7 +3973,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1067 + 1077 @@ -4003,7 +3982,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1075 + 1085 @@ -4012,7 +3991,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1076 + 1086 @@ -4021,7 +4000,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1084 + 1094 @@ -4030,7 +4009,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1085 + 1095 @@ -4039,7 +4018,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1093 + 1103 @@ -4048,7 +4027,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1094 + 1104 @@ -4057,7 +4036,7 @@ Label of user phone src/app/core/config/config-fix.ts - 1105 + 1115 @@ -4553,24 +4532,6 @@ 8 - - Record deleted - Élément supprimé - Record deleted info - - src/app/core/common-components/entity-subrecord/entity-subrecord/entity-subrecord.component.ts - 398 - - - - Are you sure you want to delete this record? - Êtes-vous sûr de vouloir supprimer cet élément ? - Delete confirmation message - - src/app/core/common-components/entity-subrecord/entity-subrecord/entity-subrecord.component.ts - 399 - - This field is read-only. Edit Date of Birth to change age. Select Jan 1st if you only know the year of birth. Ce champ est en lecture seule. Modifiez la date de naissance pour modifier l'âge. Sélectionnez 1er janvier si vous ne connaissez que l'année de naissance. @@ -4708,18 +4669,18 @@ Delete? Supprimer? + Delete confirmation title src/app/core/entity/entity-remove.service.ts - 89,88 + 78 - Delete confirmation title - - Are you sure you want to delete this ? - Êtes-vous sûr de vouloir supprimer cet(te) ? + + Are you sure you want to delete this record? + Are you sure you want to delete this record? src/app/core/entity/entity-remove.service.ts - 92,90 + 81 Delete confirmation text @@ -4729,7 +4690,7 @@ Deleted Entity information src/app/core/entity/entity-remove.service.ts - 99 + 93 @@ -4738,7 +4699,7 @@ Undo deleting an entity src/app/core/entity/entity-remove.service.ts - 126 + 97 src/app/core/import/import-confirm-summary/import-confirm-summary.component.ts @@ -4859,7 +4820,7 @@ Discard changes header src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts - 61 + 62 @@ -4868,7 +4829,7 @@ Discard changes message src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts - 62 + 63 @@ -4892,7 +4853,7 @@ Une nouvelle version de l'application est disponible! src/app/core/ui/latest-changes/update-manager.service.ts - 107 + 111 @@ -4901,7 +4862,7 @@ Action that a user can update the app with src/app/core/ui/latest-changes/update-manager.service.ts - 108 + 112 @@ -4909,7 +4870,7 @@ The app is in a unrecoverable state, please reload. src/app/core/ui/latest-changes/update-manager.service.ts - 133 + 137 @@ -4918,7 +4879,7 @@ Action that a user can reload the app with src/app/core/ui/latest-changes/update-manager.service.ts - 134 + 138 @@ -5255,7 +5216,7 @@ Navigate to user profile page src/app/core/ui/ui/ui.component.html - 83 + 95 @@ -5264,7 +5225,7 @@ Sign out of the app src/app/core/ui/ui/ui.component.html - 88 + 105 @@ -5354,12 +5315,28 @@ 78 + + Total: + Total: + + src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html + 11 + + + + Average: + Average: + + src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html + 14 + + Load changes? Load changes? src/app/core/common-components/entity-form/entity-form/entity-form.component.ts - 99 + 110 @@ -5367,7 +5344,7 @@ Local changes are in conflict with updated values synced from the server. Do you want the local changes to be overwritten with the latest values? src/app/core/common-components/entity-form/entity-form/entity-form.component.ts - 100 + 111 @@ -5946,7 +5923,7 @@ Message for user src/app/features/file/edit-file/edit-file.component.ts - 130 + 132 @@ -6782,7 +6759,7 @@ PWA Install Button Label src/app/core/pwa-install/pwa-install.component.html - 11 + 12 @@ -6791,7 +6768,7 @@ PWA iOS Install Instructions - Line 1 src/app/core/pwa-install/pwa-install.component.html - 15 + 16 @@ -6800,7 +6777,7 @@ PWA iOS Install Instructions - Line 2-1 src/app/core/pwa-install/pwa-install.component.html - 27 + 28 @@ -6809,7 +6786,7 @@ PWA iOS Install Instructions - Line 2-2 src/app/core/pwa-install/pwa-install.component.html - 31 + 32 @@ -6818,7 +6795,7 @@ PWA iOS Install Instructions - Line 3-1 src/app/core/pwa-install/pwa-install.component.html - 36 + 37 @@ -6827,7 +6804,7 @@ PWA iOS Install Instructions - Line 3-2 src/app/core/pwa-install/pwa-install.component.html - 40 + 41 diff --git a/src/assets/locale/messages.it.xlf b/src/assets/locale/messages.it.xlf index bcd7d07e92..b1b0559183 100644 --- a/src/assets/locale/messages.it.xlf +++ b/src/assets/locale/messages.it.xlf @@ -63,7 +63,7 @@ src/app/core/config/config-fix.ts - 876 + 886 @@ -667,11 +667,11 @@ src/app/core/config/config-fix.ts - 803 + 813 src/app/core/config/config-fix.ts - 881 + 891 @@ -788,7 +788,7 @@ src/app/core/config/config-fix.ts - 1045 + 1055 @@ -1029,7 +1029,7 @@ src/app/core/config/config-fix.ts - 737 + 747 @@ -1134,18 +1134,6 @@ religion - - Total: - - Totale: - - Total amount of education material including a summary - Total amount - - src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.html - 11 - - Material Material @@ -1331,7 +1319,7 @@ src/app/core/config/config-fix.ts - 494 + 488 @@ -1384,15 +1372,15 @@ src/app/core/config/config-fix.ts - 453 + 447 src/app/core/config/config-fix.ts - 899 + 909 src/app/core/config/config-fix.ts - 1003 + 1013 @@ -1472,15 +1460,15 @@ src/app/core/config/config-fix.ts - 220 + 214 src/app/core/config/config-fix.ts - 530 + 524 src/app/core/config/config-fix.ts - 769 + 779 @@ -1529,7 +1517,7 @@ src/app/core/config/config-fix.ts - 1031 + 1041 @@ -1542,7 +1530,7 @@ src/app/core/config/config-fix.ts - 949 + 959 @@ -1563,11 +1551,11 @@ src/app/core/config/config-fix.ts - 469 + 463 src/app/core/config/config-fix.ts - 580 + 574 @@ -1580,7 +1568,7 @@ src/app/core/config/config-fix.ts - 464 + 458 @@ -2192,15 +2180,15 @@ src/app/core/config/config-fix.ts - 28 + 22 src/app/core/config/config-fix.ts - 569 + 563 src/app/core/config/config-fix.ts - 950 + 960 @@ -2230,7 +2218,7 @@ src/app/core/config/config-fix.ts - 43 + 37 @@ -2347,11 +2335,11 @@ src/app/core/config/config-fix.ts - 572 + 566 src/app/core/config/config-fix.ts - 772 + 782 src/app/core/filter/filters/filters.ts @@ -2740,22 +2728,13 @@ 96 - - Aam Digital - DEMO (automatically generated data) - Aam Digital - DEMO (automatically generated data) - Page title - - src/app/core/config/config-fix.ts - 14 - - Dashboard Dashboard Menu item src/app/core/config/config-fix.ts - 23 + 17 @@ -2768,7 +2747,7 @@ src/app/core/config/config-fix.ts - 33 + 27 @@ -2777,11 +2756,11 @@ Menu item src/app/core/config/config-fix.ts - 38 + 32 src/app/core/config/config-fix.ts - 667 + 661 @@ -2790,7 +2769,7 @@ Menu item src/app/core/config/config-fix.ts - 48 + 42 src/app/features/todos/model/todo.ts @@ -2803,21 +2782,21 @@ Menu item src/app/core/config/config-fix.ts - 53 + 47 Site settings Site settings + Menu item src/app/core/config/config-fix.ts - 58 + 52 src/app/core/site-settings/site-settings.ts 14 - Menu item Import @@ -2825,7 +2804,7 @@ Menu item src/app/core/config/config-fix.ts - 63 + 57 @@ -2834,7 +2813,7 @@ Menu item src/app/core/config/config-fix.ts - 68 + 62 src/app/core/user/user.ts @@ -2848,7 +2827,7 @@ Menu item src/app/core/config/config-fix.ts - 73 + 67 @@ -2857,7 +2836,7 @@ Menu item src/app/core/config/config-fix.ts - 78 + 72 @@ -2866,7 +2845,7 @@ Menu item src/app/core/config/config-fix.ts - 83 + 77 @@ -2876,7 +2855,7 @@ Dashboard shortcut widget src/app/core/config/config-fix.ts - 98 + 92 @@ -2886,7 +2865,7 @@ Dashboard shortcut widget src/app/core/config/config-fix.ts - 103 + 97 @@ -2896,7 +2875,7 @@ Dashboard shortcut widget src/app/core/config/config-fix.ts - 108 + 102 @@ -2905,7 +2884,7 @@ Attendance week dashboard widget label src/app/core/config/config-fix.ts - 155 + 149 @@ -2914,7 +2893,7 @@ Attendance week dashboard widget label src/app/core/config/config-fix.ts - 162 + 156 @@ -2923,7 +2902,7 @@ Attendance week dashboard widget label src/app/core/config/config-fix.ts - 148 + 142 @@ -2932,7 +2911,7 @@ Title for notes overview src/app/core/config/config-fix.ts - 184 + 178 @@ -2941,11 +2920,11 @@ Translated name of default column group src/app/core/config/config-fix.ts - 194 + 188 src/app/core/config/config-fix.ts - 198 + 192 @@ -2954,19 +2933,19 @@ Translated name of mobile column group src/app/core/config/config-fix.ts - 195 + 189 src/app/core/config/config-fix.ts - 208 + 202 src/app/core/config/config-fix.ts - 501 + 495 src/app/core/config/config-fix.ts - 555 + 549 @@ -2974,7 +2953,7 @@ Attachment src/app/core/config/config-fix.ts - 275 + 269 @@ -2982,7 +2961,7 @@ Site Settings src/app/core/config/config-fix.ts - 287 + 281 @@ -2991,7 +2970,7 @@ Panel title src/app/core/config/config-fix.ts - 334 + 328 @@ -3000,7 +2979,7 @@ Panel title src/app/core/config/config-fix.ts - 353 + 347 @@ -3009,7 +2988,7 @@ Filename of markdown help page (make sure the filename you enter as a translation actually exists on the server!) src/app/core/config/config-fix.ts - 367 + 361 @@ -3018,15 +2997,15 @@ Panel title src/app/core/config/config-fix.ts - 399 + 393 src/app/core/config/config-fix.ts - 591 + 585 src/app/core/config/config-fix.ts - 788 + 798 @@ -3035,7 +3014,7 @@ Panel title src/app/core/config/config-fix.ts - 427 + 421 @@ -3044,7 +3023,7 @@ Panel title src/app/core/config/config-fix.ts - 436 + 430 @@ -3053,7 +3032,7 @@ Column label for age of child src/app/core/config/config-fix.ts - 458 + 452 @@ -3062,7 +3041,7 @@ Column label for school attendance of child src/app/core/config/config-fix.ts - 476 + 470 @@ -3071,7 +3050,7 @@ Column label for coaching attendance of child src/app/core/config/config-fix.ts - 485 + 479 @@ -3080,11 +3059,11 @@ Translated name of default column group src/app/core/config/config-fix.ts - 500 + 494 src/app/core/config/config-fix.ts - 504 + 498 @@ -3093,7 +3072,7 @@ Column group name src/app/core/config/config-fix.ts - 517 + 511 @@ -3102,11 +3081,11 @@ Column group name src/app/core/config/config-fix.ts - 540 + 534 src/app/core/config/config-fix.ts - 689 + 683 @@ -3115,11 +3094,11 @@ Active children filter label - true case src/app/core/config/config-fix.ts - 570 + 564 src/app/core/config/config-fix.ts - 770 + 780 @@ -3128,11 +3107,11 @@ Active children filter label - false case src/app/core/config/config-fix.ts - 571 + 565 src/app/core/config/config-fix.ts - 771 + 781 src/app/core/entity/model/entity.ts @@ -3145,7 +3124,7 @@ Header for form section src/app/core/config/config-fix.ts - 619 + 613 @@ -3154,7 +3133,7 @@ Header for form section src/app/core/config/config-fix.ts - 620 + 614 @@ -3163,7 +3142,7 @@ Header for form section src/app/core/config/config-fix.ts - 621 + 615 @@ -3172,7 +3151,7 @@ Panel title src/app/core/config/config-fix.ts - 628 + 622 @@ -3181,7 +3160,7 @@ Title inside a panel src/app/core/config/config-fix.ts - 631 + 625 @@ -3190,7 +3169,7 @@ Title inside a panel src/app/core/config/config-fix.ts - 651 + 645 @@ -3199,7 +3178,7 @@ Child details section title src/app/core/config/config-fix.ts - 655 + 649 @@ -3208,7 +3187,7 @@ Panel title src/app/core/config/config-fix.ts - 676 + 670 @@ -3217,7 +3196,7 @@ description section src/app/core/config/config-fix.ts - 698 + 692 @@ -3226,7 +3205,7 @@ Title inside a panel src/app/core/config/config-fix.ts - 705 + 699 @@ -3235,7 +3214,7 @@ Panel title src/app/core/config/config-fix.ts - 711 + 705 @@ -3244,7 +3223,7 @@ Panel title src/app/core/config/config-fix.ts - 720 + 730 @@ -3262,7 +3241,7 @@ Panel title src/app/core/config/config-fix.ts - 818 + 828 @@ -3271,7 +3250,7 @@ Name of a report src/app/core/config/config-fix.ts - 833 + 843 @@ -3280,7 +3259,7 @@ Label of report query src/app/core/config/config-fix.ts - 837 + 847 @@ -3289,7 +3268,7 @@ Label for report query src/app/core/config/config-fix.ts - 842 + 852 @@ -3298,7 +3277,7 @@ Label for report query src/app/core/config/config-fix.ts - 845 + 855 @@ -3307,7 +3286,7 @@ Label for report query src/app/core/config/config-fix.ts - 849 + 859 @@ -3316,7 +3295,7 @@ Label for report query src/app/core/config/config-fix.ts - 854 + 864 @@ -3325,7 +3304,7 @@ Label for report query src/app/core/config/config-fix.ts - 858 + 868 @@ -3334,7 +3313,7 @@ Label for report query src/app/core/config/config-fix.ts - 863 + 873 @@ -3343,7 +3322,7 @@ Name of a report src/app/core/config/config-fix.ts - 871 + 881 @@ -3352,7 +3331,7 @@ Name of a report src/app/core/config/config-fix.ts - 888 + 898 @@ -3413,7 +3392,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 903 + 913 @@ -3422,7 +3401,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 907 + 917 @@ -3431,7 +3410,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 911 + 921 @@ -3440,7 +3419,7 @@ Name of a column of a report src/app/core/config/config-fix.ts - 915 + 925 @@ -3449,7 +3428,7 @@ Name of a report src/app/core/config/config-fix.ts - 925 + 935 @@ -3467,11 +3446,11 @@ Label for the address of a child src/app/core/config/config-fix.ts - 956 + 966 src/app/core/config/config-fix.ts - 1024 + 1034 @@ -3480,7 +3459,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 963 + 973 @@ -3489,7 +3468,7 @@ Label for the religion of a child src/app/core/config/config-fix.ts - 970 + 980 @@ -3498,7 +3477,7 @@ Label for the mother tongue of a child src/app/core/config/config-fix.ts - 977 + 987 @@ -3507,7 +3486,7 @@ Tooltip description for the mother tongue of a child src/app/core/config/config-fix.ts - 978 + 988 @@ -3516,7 +3495,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 985 + 995 @@ -3525,7 +3504,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 992 + 1002 @@ -3533,11 +3512,11 @@ Private School src/app/core/config/config-fix.ts - 388 + 382 src/app/core/config/config-fix.ts - 1010 + 1020 @@ -3546,7 +3525,7 @@ Label for the language of a school src/app/core/config/config-fix.ts - 1017 + 1027 @@ -3555,7 +3534,7 @@ Label for the timing of a school src/app/core/config/config-fix.ts - 1038 + 1048 @@ -3564,7 +3543,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1057 + 1067 @@ -3573,7 +3552,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1058 + 1068 @@ -3582,7 +3561,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1066 + 1076 @@ -3591,7 +3570,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1067 + 1077 @@ -3600,7 +3579,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1075 + 1085 @@ -3609,7 +3588,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1076 + 1086 @@ -3618,7 +3597,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1084 + 1094 @@ -3627,7 +3606,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1085 + 1095 @@ -3636,7 +3615,7 @@ Label for a child attribute src/app/core/config/config-fix.ts - 1093 + 1103 @@ -3645,7 +3624,7 @@ Description for a child attribute src/app/core/config/config-fix.ts - 1094 + 1104 @@ -3654,7 +3633,7 @@ Label of user phone src/app/core/config/config-fix.ts - 1105 + 1115 @@ -4098,24 +4077,6 @@ 8 - - Record deleted - Record cancellato - Record deleted info - - src/app/core/common-components/entity-subrecord/entity-subrecord/entity-subrecord.component.ts - 398 - - - - Are you sure you want to delete this record? - Sei sicuro di voler eliminare questo record? - Delete confirmation message - - src/app/core/common-components/entity-subrecord/entity-subrecord/entity-subrecord.component.ts - 399 - - Save Salva @@ -4247,29 +4208,29 @@ Delete? Elimina? + Delete confirmation title src/app/core/entity/entity-remove.service.ts - 89,88 + 78 - Delete confirmation title - - Are you sure you want to delete this ? - Sei sicuro di voler cancellare questo ? + + Are you sure you want to delete this record? + Are you sure you want to delete this record? src/app/core/entity/entity-remove.service.ts - 92,90 + 81 Delete confirmation text Deleted Entity Entità eliminata + Deleted Entity information src/app/core/entity/entity-remove.service.ts - 99,97 + 93 - Deleted Entity information Undo @@ -4277,7 +4238,7 @@ Undo deleting an entity src/app/core/entity/entity-remove.service.ts - 126 + 97 src/app/core/import/import-confirm-summary/import-confirm-summary.component.ts @@ -4480,7 +4441,7 @@ Discard changes header src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts - 61 + 62 @@ -4489,7 +4450,7 @@ Discard changes message src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts - 62 + 63 @@ -4513,7 +4474,7 @@ È disponibile una nuova versione dell'app! src/app/core/ui/latest-changes/update-manager.service.ts - 107 + 111 @@ -4522,7 +4483,7 @@ Action that a user can update the app with src/app/core/ui/latest-changes/update-manager.service.ts - 108 + 112 @@ -4530,7 +4491,7 @@ The app is in a unrecoverable state, please reload. src/app/core/ui/latest-changes/update-manager.service.ts - 133 + 137 @@ -4539,7 +4500,7 @@ Action that a user can reload the app with src/app/core/ui/latest-changes/update-manager.service.ts - 134 + 138 @@ -4557,7 +4518,7 @@ PWA Install Button Label src/app/core/pwa-install/pwa-install.component.html - 11 + 12 @@ -4566,7 +4527,7 @@ PWA iOS Install Instructions - Line 1 src/app/core/pwa-install/pwa-install.component.html - 15 + 16 @@ -4575,7 +4536,7 @@ PWA iOS Install Instructions - Line 2-1 src/app/core/pwa-install/pwa-install.component.html - 27 + 28 @@ -4584,7 +4545,7 @@ PWA iOS Install Instructions - Line 2-2 src/app/core/pwa-install/pwa-install.component.html - 31 + 32 @@ -4593,7 +4554,7 @@ PWA iOS Install Instructions - Line 3-1 src/app/core/pwa-install/pwa-install.component.html - 36 + 37 @@ -4602,7 +4563,7 @@ PWA iOS Install Instructions - Line 3-2 src/app/core/pwa-install/pwa-install.component.html - 40 + 41 @@ -5056,7 +5017,7 @@ Please try again. If the problem persists contact Aam Digital support. Navigate to user profile page src/app/core/ui/ui/ui.component.html - 83 + 95 @@ -5065,7 +5026,7 @@ Please try again. If the problem persists contact Aam Digital support. Sign out of the app src/app/core/ui/ui/ui.component.html - 88 + 105 @@ -5155,12 +5116,28 @@ Please try again. If the problem persists contact Aam Digital support. 78 + + Total: + Total: + + src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html + 11 + + + + Average: + Average: + + src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html + 14 + + Load changes? Load changes? src/app/core/common-components/entity-form/entity-form/entity-form.component.ts - 99 + 110 @@ -5168,7 +5145,7 @@ Please try again. If the problem persists contact Aam Digital support. Local changes are in conflict with updated values synced from the server. Do you want the local changes to be overwritten with the latest values? src/app/core/common-components/entity-form/entity-form/entity-form.component.ts - 100 + 111 @@ -5708,7 +5685,7 @@ Please try again. If the problem persists contact Aam Digital support. Message for user src/app/features/file/edit-file/edit-file.component.ts - 130 + 132 diff --git a/src/assets/locale/messages.xlf b/src/assets/locale/messages.xlf index 7a600ce470..6af5b1aef6 100644 --- a/src/assets/locale/messages.xlf +++ b/src/assets/locale/messages.xlf @@ -56,7 +56,7 @@ src/app/core/config/config-fix.ts - 876 + 886 Events of an attendance @@ -623,11 +623,11 @@ src/app/core/config/config-fix.ts - 803 + 813 src/app/core/config/config-fix.ts - 881 + 891 Label for the participants of a recurring activity @@ -735,7 +735,7 @@ src/app/core/config/config-fix.ts - 1045 + 1055 Label for the remarks of a ASER result @@ -836,7 +836,7 @@ src/app/core/config/config-fix.ts - 737 + 747 Child status @@ -932,16 +932,6 @@ religion - - Total: - - - src/app/child-dev-project/children/educational-material/educational-material-component/educational-material.component.html - 11,13 - - Total amount of education material including a summary - Total amount - Material @@ -1159,7 +1149,7 @@ src/app/core/config/config-fix.ts - 494 + 488 Table header, Short for Body Mass Index @@ -1207,15 +1197,15 @@ src/app/core/config/config-fix.ts - 453 + 447 src/app/core/config/config-fix.ts - 899 + 909 src/app/core/config/config-fix.ts - 1003 + 1013 Label for the name of a child @@ -1287,15 +1277,15 @@ src/app/core/config/config-fix.ts - 220 + 214 src/app/core/config/config-fix.ts - 530 + 524 src/app/core/config/config-fix.ts - 769 + 779 Label for the status of a child @@ -1339,7 +1329,7 @@ src/app/core/config/config-fix.ts - 1031 + 1041 Label for the phone number of a child @@ -1351,7 +1341,7 @@ src/app/core/config/config-fix.ts - 949 + 959 Label for the child of a relation @@ -1371,11 +1361,11 @@ src/app/core/config/config-fix.ts - 469 + 463 src/app/core/config/config-fix.ts - 580 + 574 Label for the school of a relation @@ -1387,7 +1377,7 @@ src/app/core/config/config-fix.ts - 464 + 458 Label for the class of a relation @@ -1891,7 +1881,7 @@ src/app/core/config/config-fix.ts - 43 + 37 label (plural) for entity @@ -1903,15 +1893,15 @@ src/app/core/config/config-fix.ts - 28 + 22 src/app/core/config/config-fix.ts - 569 + 563 src/app/core/config/config-fix.ts - 950 + 960 Label for the children of a note @@ -2008,11 +1998,11 @@ src/app/core/config/config-fix.ts - 572 + 566 src/app/core/config/config-fix.ts - 772 + 782 src/app/core/filter/filters/filters.ts @@ -2105,7 +2095,7 @@ src/app/core/config/config-fix.ts - 33 + 27 label (plural) for entity @@ -2478,7 +2468,7 @@ Discard Changes? src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts - 61 + 62 Discard changes header @@ -2486,7 +2476,7 @@ You have unsaved changes. Do you really want to leave this page? All unsaved changes will be lost. src/app/core/common-components/confirmation-dialog/confirmation-dialog.service.ts - 62 + 63 Discard changes message @@ -2657,14 +2647,14 @@ Load changes? src/app/core/common-components/entity-form/entity-form/entity-form.component.ts - 99 + 110 Local changes are in conflict with updated values synced from the server. Do you want the local changes to be overwritten with the latest values? src/app/core/common-components/entity-form/entity-form/entity-form.component.ts - 100 + 111 @@ -2683,22 +2673,6 @@ A placeholder for the input element when select options are not loaded yet - - Record deleted - - src/app/core/common-components/entity-subrecord/entity-subrecord/entity-subrecord.component.ts - 398 - - Record deleted info - - - Are you sure you want to delete this record? - - src/app/core/common-components/entity-subrecord/entity-subrecord/entity-subrecord.component.ts - 399 - - Delete confirmation message - Select file @@ -2719,19 +2693,11 @@ placeholder for file-input - - Aam Digital - DEMO (automatically generated data) - - src/app/core/config/config-fix.ts - 14 - - Page title - Dashboard src/app/core/config/config-fix.ts - 23 + 17 Menu item @@ -2739,11 +2705,11 @@ Attendance src/app/core/config/config-fix.ts - 38 + 32 src/app/core/config/config-fix.ts - 667 + 661 Menu item @@ -2751,7 +2717,7 @@ Tasks src/app/core/config/config-fix.ts - 48 + 42 src/app/features/todos/model/todo.ts @@ -2763,7 +2729,7 @@ Admin src/app/core/config/config-fix.ts - 53 + 47 Menu item @@ -2771,7 +2737,7 @@ Site settings src/app/core/config/config-fix.ts - 58 + 52 src/app/core/site-settings/site-settings.ts @@ -2783,7 +2749,7 @@ Import src/app/core/config/config-fix.ts - 63 + 57 Menu item @@ -2791,7 +2757,7 @@ Users src/app/core/config/config-fix.ts - 68 + 62 src/app/core/user/user.ts @@ -2803,7 +2769,7 @@ Reports src/app/core/config/config-fix.ts - 73 + 67 Menu item @@ -2811,7 +2777,7 @@ Database Conflicts src/app/core/config/config-fix.ts - 78 + 72 Menu item @@ -2819,7 +2785,7 @@ Help src/app/core/config/config-fix.ts - 83 + 77 Menu item @@ -2827,7 +2793,7 @@ Record Attendance src/app/core/config/config-fix.ts - 98 + 92 record attendance shortcut Dashboard shortcut widget @@ -2836,7 +2802,7 @@ Add Child src/app/core/config/config-fix.ts - 103 + 97 record attendance shortcut Dashboard shortcut widget @@ -2845,7 +2811,7 @@ Public Registration Form src/app/core/config/config-fix.ts - 108 + 102 open public form Dashboard shortcut widget @@ -2854,7 +2820,7 @@ this week src/app/core/config/config-fix.ts - 148 + 142 Attendance week dashboard widget label @@ -2862,7 +2828,7 @@ last week src/app/core/config/config-fix.ts - 155 + 149 Attendance week dashboard widget label @@ -2870,7 +2836,7 @@ Late last week src/app/core/config/config-fix.ts - 162 + 156 Attendance week dashboard widget label @@ -2878,7 +2844,7 @@ Notes & Reports src/app/core/config/config-fix.ts - 184 + 178 Title for notes overview @@ -2886,11 +2852,11 @@ Standard src/app/core/config/config-fix.ts - 194 + 188 src/app/core/config/config-fix.ts - 198 + 192 Translated name of default column group @@ -2898,19 +2864,19 @@ Mobile src/app/core/config/config-fix.ts - 195 + 189 src/app/core/config/config-fix.ts - 208 + 202 src/app/core/config/config-fix.ts - 501 + 495 src/app/core/config/config-fix.ts - 555 + 549 Translated name of mobile column group @@ -2918,21 +2884,21 @@ Attachment src/app/core/config/config-fix.ts - 275 + 269 Site Settings src/app/core/config/config-fix.ts - 287 + 281 User Information src/app/core/config/config-fix.ts - 334 + 328 Panel title @@ -2940,7 +2906,7 @@ Security src/app/core/config/config-fix.ts - 353 + 347 Panel title @@ -2948,7 +2914,7 @@ assets/help/help.en.md src/app/core/config/config-fix.ts - 367 + 361 Filename of markdown help page (make sure the filename you enter as a translation actually exists on the server!) @@ -2956,26 +2922,26 @@ Private School src/app/core/config/config-fix.ts - 388 + 382 src/app/core/config/config-fix.ts - 1010 + 1020 Basic Information src/app/core/config/config-fix.ts - 399 + 393 src/app/core/config/config-fix.ts - 591 + 585 src/app/core/config/config-fix.ts - 788 + 798 Panel title @@ -2983,7 +2949,7 @@ Students src/app/core/config/config-fix.ts - 427 + 421 Panel title @@ -2991,7 +2957,7 @@ Activities src/app/core/config/config-fix.ts - 436 + 430 Panel title @@ -2999,7 +2965,7 @@ Age src/app/core/config/config-fix.ts - 458 + 452 Column label for age of child @@ -3007,7 +2973,7 @@ Attendance (School) src/app/core/config/config-fix.ts - 476 + 470 Column label for school attendance of child @@ -3015,7 +2981,7 @@ Attendance (Coaching) src/app/core/config/config-fix.ts - 485 + 479 Column label for coaching attendance of child @@ -3023,11 +2989,11 @@ Basic Info src/app/core/config/config-fix.ts - 500 + 494 src/app/core/config/config-fix.ts - 504 + 498 Translated name of default column group @@ -3035,7 +3001,7 @@ School Info src/app/core/config/config-fix.ts - 517 + 511 Column group name @@ -3043,11 +3009,11 @@ Health src/app/core/config/config-fix.ts - 540 + 534 src/app/core/config/config-fix.ts - 689 + 683 Column group name @@ -3055,11 +3021,11 @@ Active src/app/core/config/config-fix.ts - 570 + 564 src/app/core/config/config-fix.ts - 770 + 780 Active children filter label - true case @@ -3067,11 +3033,11 @@ Inactive src/app/core/config/config-fix.ts - 571 + 565 src/app/core/config/config-fix.ts - 771 + 781 src/app/core/entity/model/entity.ts @@ -3083,7 +3049,7 @@ Personal Information src/app/core/config/config-fix.ts - 619 + 613 Header for form section @@ -3091,7 +3057,7 @@ Additional src/app/core/config/config-fix.ts - 620 + 614 Header for form section @@ -3099,7 +3065,7 @@ Scholar activities src/app/core/config/config-fix.ts - 621 + 615 Header for form section @@ -3107,7 +3073,7 @@ Education src/app/core/config/config-fix.ts - 628 + 622 Panel title @@ -3115,7 +3081,7 @@ School History src/app/core/config/config-fix.ts - 631 + 625 Title inside a panel @@ -3123,7 +3089,7 @@ ASER Results src/app/core/config/config-fix.ts - 651 + 645 Title inside a panel @@ -3131,7 +3097,7 @@ Find a suitable new school src/app/core/config/config-fix.ts - 655 + 649 Child details section title @@ -3139,7 +3105,7 @@ Notes & Tasks src/app/core/config/config-fix.ts - 676 + 670 Panel title @@ -3147,7 +3113,7 @@ Health checkups are to be done regularly, at least every 6 months according to the program guidelines. src/app/core/config/config-fix.ts - 698 + 692 description section @@ -3155,7 +3121,7 @@ Height & Weight Tracking src/app/core/config/config-fix.ts - 705 + 699 Title inside a panel @@ -3163,7 +3129,7 @@ Educational Materials src/app/core/config/config-fix.ts - 711 + 705 Panel title @@ -3171,7 +3137,7 @@ Observations src/app/core/config/config-fix.ts - 720 + 730 Panel title @@ -3179,7 +3145,7 @@ Events & Attendance src/app/core/config/config-fix.ts - 818 + 828 Panel title @@ -3187,7 +3153,7 @@ Basic Report src/app/core/config/config-fix.ts - 833 + 843 Name of a report @@ -3195,7 +3161,7 @@ All children src/app/core/config/config-fix.ts - 837 + 847 Label of report query @@ -3203,7 +3169,7 @@ All schools src/app/core/config/config-fix.ts - 842 + 852 Label for report query @@ -3211,7 +3177,7 @@ Children attending a school src/app/core/config/config-fix.ts - 845 + 855 Label for report query @@ -3219,7 +3185,7 @@ Governmental schools src/app/core/config/config-fix.ts - 849 + 859 Label for report query @@ -3227,7 +3193,7 @@ Children attending a governmental school src/app/core/config/config-fix.ts - 854 + 864 Label for report query @@ -3235,7 +3201,7 @@ Private schools src/app/core/config/config-fix.ts - 858 + 868 Label for report query @@ -3243,7 +3209,7 @@ Children attending a private school src/app/core/config/config-fix.ts - 863 + 873 Label for report query @@ -3251,7 +3217,7 @@ Event Report src/app/core/config/config-fix.ts - 871 + 881 Name of a report @@ -3259,7 +3225,7 @@ Attendance Report src/app/core/config/config-fix.ts - 888 + 898 Name of a report @@ -3267,7 +3233,7 @@ Total src/app/core/config/config-fix.ts - 903 + 913 Name of a column of a report @@ -3275,7 +3241,7 @@ Present src/app/core/config/config-fix.ts - 907 + 917 Name of a column of a report @@ -3283,7 +3249,7 @@ Rate src/app/core/config/config-fix.ts - 911 + 921 Name of a column of a report @@ -3291,7 +3257,7 @@ Late src/app/core/config/config-fix.ts - 915 + 925 Name of a column of a report @@ -3299,7 +3265,7 @@ Materials Distributed src/app/core/config/config-fix.ts - 925 + 935 Name of a report @@ -3307,11 +3273,11 @@ Address src/app/core/config/config-fix.ts - 956 + 966 src/app/core/config/config-fix.ts - 1024 + 1034 Label for the address of a child @@ -3319,7 +3285,7 @@ Blood Group src/app/core/config/config-fix.ts - 963 + 973 Label for a child attribute @@ -3327,7 +3293,7 @@ Religion src/app/core/config/config-fix.ts - 970 + 980 Label for the religion of a child @@ -3335,7 +3301,7 @@ Mother Tongue src/app/core/config/config-fix.ts - 977 + 987 Label for the mother tongue of a child @@ -3343,7 +3309,7 @@ The primary language spoken at home src/app/core/config/config-fix.ts - 978 + 988 Tooltip description for the mother tongue of a child @@ -3351,7 +3317,7 @@ Last Dental Check-Up src/app/core/config/config-fix.ts - 985 + 995 Label for a child attribute @@ -3359,7 +3325,7 @@ Birth certificate src/app/core/config/config-fix.ts - 992 + 1002 Label for a child attribute @@ -3367,7 +3333,7 @@ Language src/app/core/config/config-fix.ts - 1017 + 1027 Label for the language of a school @@ -3375,7 +3341,7 @@ School Timing src/app/core/config/config-fix.ts - 1038 + 1048 Label for the timing of a school @@ -3383,7 +3349,7 @@ Motivated src/app/core/config/config-fix.ts - 1057 + 1067 Label for a child attribute @@ -3391,7 +3357,7 @@ The child is motivated during the class. src/app/core/config/config-fix.ts - 1058 + 1068 Description for a child attribute @@ -3399,7 +3365,7 @@ Participating src/app/core/config/config-fix.ts - 1066 + 1076 Label for a child attribute @@ -3407,7 +3373,7 @@ The child is actively participating in the class. src/app/core/config/config-fix.ts - 1067 + 1077 Description for a child attribute @@ -3415,7 +3381,7 @@ Interacting src/app/core/config/config-fix.ts - 1075 + 1085 Label for a child attribute @@ -3423,7 +3389,7 @@ The child interacts with other students during the class. src/app/core/config/config-fix.ts - 1076 + 1086 Description for a child attribute @@ -3431,7 +3397,7 @@ Homework src/app/core/config/config-fix.ts - 1084 + 1094 Label for a child attribute @@ -3439,7 +3405,7 @@ The child does its homework. src/app/core/config/config-fix.ts - 1085 + 1095 Description for a child attribute @@ -3447,7 +3413,7 @@ Asking Questions src/app/core/config/config-fix.ts - 1093 + 1103 Label for a child attribute @@ -3455,7 +3421,7 @@ The child is asking questions during the class. src/app/core/config/config-fix.ts - 1094 + 1104 Description for a child attribute @@ -3463,7 +3429,7 @@ Contact src/app/core/config/config-fix.ts - 1105 + 1115 Label of user phone @@ -3683,6 +3649,20 @@ Edit button for forms + + Total: + + src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html + 11 + + + + Average: + + src/app/core/entity-details/related-entities-with-summary/related-entities-with-summary.component.html + 14 + + Show entries where the end date is in the past @@ -3843,15 +3823,15 @@ Delete? src/app/core/entity/entity-remove.service.ts - 89 + 78 Delete confirmation title - - Are you sure you want to delete this ? + + Are you sure you want to delete this record? src/app/core/entity/entity-remove.service.ts - 92 + 81 Delete confirmation text @@ -3859,7 +3839,7 @@ Deleted Entity src/app/core/entity/entity-remove.service.ts - 99 + 93 Deleted Entity information @@ -3867,7 +3847,7 @@ Undo src/app/core/entity/entity-remove.service.ts - 126 + 97 src/app/core/import/import-confirm-summary/import-confirm-summary.component.ts @@ -4376,7 +4356,7 @@ Install App src/app/core/pwa-install/pwa-install.component.html - 11 + 12 PWA Install Button Label @@ -4384,7 +4364,7 @@ To install the app src/app/core/pwa-install/pwa-install.component.html - 15,17 + 16,18 PWA iOS Install Instructions - Line 1 @@ -4392,7 +4372,7 @@ tap on src/app/core/pwa-install/pwa-install.component.html - 27,29 + 28,30 PWA iOS Install Instructions - Line 2-1 @@ -4400,7 +4380,7 @@ at the bottom src/app/core/pwa-install/pwa-install.component.html - 31,33 + 32,34 PWA iOS Install Instructions - Line 2-2 @@ -4408,7 +4388,7 @@ and then tap on src/app/core/pwa-install/pwa-install.component.html - 36,38 + 37,39 PWA iOS Install Instructions - Line 3-1 @@ -4416,7 +4396,7 @@ (Add to Homescreen). src/app/core/pwa-install/pwa-install.component.html - 40,42 + 41,43 PWA iOS Install Instructions - Line 3-2 @@ -4776,14 +4756,14 @@ Please try again. If the problem persists contact Aam Digital support. A new version of the app is available! src/app/core/ui/latest-changes/update-manager.service.ts - 107 + 111 Update src/app/core/ui/latest-changes/update-manager.service.ts - 108 + 112 Action that a user can update the app with @@ -4791,14 +4771,14 @@ Please try again. If the problem persists contact Aam Digital support. The app is in a unrecoverable state, please reload. src/app/core/ui/latest-changes/update-manager.service.ts - 133 + 137 Reload src/app/core/ui/latest-changes/update-manager.service.ts - 134 + 138 Action that a user can reload the app with @@ -4875,7 +4855,7 @@ Please try again. If the problem persists contact Aam Digital support. Profile src/app/core/ui/ui/ui.component.html - 83,85 + 95,97 Navigate to user profile page @@ -4883,7 +4863,7 @@ Please try again. If the problem persists contact Aam Digital support. Sign out src/app/core/ui/ui/ui.component.html - 88,90 + 105,107 Sign out of the app @@ -5553,7 +5533,7 @@ Please try again. If the problem persists contact Aam Digital support. File "" deleted src/app/features/file/edit-file/edit-file.component.ts - 130 + 132 Message for user