Index

src/app/child-dev-project/notes/demo-data/remarks.ts

absenceRemarks
Type : []
Default value : [ $localize`:Absence remark:got excused by it's mother`, $localize`:Absence remark:absent without excuse`, $localize`:Absence remark:absent because ill`, "", "", "", ]

src/app/core/permissions/permission-types.ts

actions
Default value : [ "read", "create", "update", "delete", "manage", // Matches any actions ] as const

The list of action strings that can be used for permissions

src/app/core/config/config.service.ts

addDefaultNoteDetailsConfig
Type : ConfigMigration
Default value : (key, configPart) => { if ( // add at top-level of config configPart?.["_id"] === "Config:CONFIG_ENTITY" && configPart?.["data"] && !configPart?.["data"]["view:note/:id"] ) { configPart["data"]["view:note/:id"] = { component: "NoteDetails", config: {}, }; } return configPart; }

Add default view:note/:id NoteDetails config to avoid breaking note details with a default config from AdminModule

migrateChildrenListConfig
Type : ConfigMigration
Default value : (key, configPart) => { if ( typeof configPart !== "object" || configPart?.["component"] !== "ChildrenList" ) { return configPart; } configPart["component"] = "EntityList"; configPart["config"] = configPart["config"] ?? {}; configPart["config"]["entityType"] = "Child"; configPart["config"]["loaderMethod"] = "ChildrenService"; return configPart; }
migrateEntityArrayDatatype
Type : ConfigMigration
Default value : (key, configPart) => { if (configPart === "DisplayEntityArray") { return "DisplayEntity"; } if (!configPart?.hasOwnProperty("dataType")) { return configPart; } const config: EntitySchemaField = configPart; if (config.dataType === "entity-array") { config.dataType = EntityDatatype.dataType; config.isArray = true; } if (config.dataType === "array") { config.dataType = config["innerDataType"]; delete config["innerDataType"]; config.isArray = true; } if (config.dataType === "configurable-enum" && config["innerDataType"]) { config.additional = config["innerDataType"]; delete config["innerDataType"]; } return configPart; }

Replace custom "entity-array" dataType with dataType="array", innerDatatype="entity"

migrateEntityBlock
Type : ConfigMigration
Default value : (key, configPart) => { if (configPart?.["blockComponent"] === "ChildBlock") { delete configPart["blockComponent"]; configPart["toBlockDetailsAttributes"] = { title: "name", photo: "photo", fields: ["phone", "schoolId", "schoolClass"], }; return configPart; } if (key === "viewComponent" && configPart === "ChildBlock") { return "EntityBlock"; } return configPart; }

ChildBlockComponent was removed and entity types can instead define a configurable tooltip setting.

migrateEntityDetailsInputEntityType
Type : ConfigMigration
Default value : ( key, configPart, ) => { if (key !== "config") { return configPart; } if (configPart["entity"]) { configPart["entityType"] = configPart["entity"]; delete configPart["entity"]; } return configPart; }

Config properties specifying an entityType should be named "entityType" rather than "entity" to avoid confusion with a specific instance of an entity being passed in components.

migrateEntitySchemaDefaultValue
Type : ConfigMigration
Default value : ( key: string, configPart: any, ): any => { if (key !== "defaultValue") { return configPart; } if (typeof configPart == "object") { return configPart; } let placeholderValue: string | undefined = Object.values(PLACEHOLDERS).find( (value) => value === configPart, ); if (placeholderValue) { return { mode: "dynamic", value: placeholderValue, } as DefaultValueConfig; } return { mode: "static", value: configPart, } as DefaultValueConfig; }
migrateFormFieldConfigView2ViewComponent
Type : ConfigMigration
Default value : ( key, configPart, ) => { if ( !(key === "columns" || key === "fields" || key === "cols") && key !== null ) { return configPart; } if (Array.isArray(configPart)) { return configPart.map((c) => migrateFormFieldConfigView2ViewComponent(null, c), ); } if (configPart?.view) { configPart.viewComponent = configPart.view; delete configPart.view; } if (configPart?.edit) { configPart.editComponent = configPart.edit; delete configPart.edit; } return configPart; }
migrateGroupByConfig
Type : ConfigMigration
Default value : (key, configPart) => { // Check if we are working with the EntityCountDashboard component and within the 'config' object if ( configPart?.component === "EntityCountDashboard" && typeof configPart?.config?.groupBy === "string" ) { configPart.config.groupBy = [configPart.config.groupBy]; // Wrap groupBy as an array return configPart; } // Return the unchanged part if no modification is needed return configPart; }
migrateHistoricalDataComponent
Type : ConfigMigration
Default value : (key, configPart) => { if ( typeof configPart !== "object" || configPart?.["component"] !== "HistoricalDataComponent" ) { return configPart; } configPart["component"] = "RelatedEntities"; configPart["config"] = configPart["config"] ?? {}; if (Array.isArray(configPart["config"])) { configPart["config"] = { columns: configPart["config"] }; } configPart["config"]["entityType"] = "HistoricalEntityData"; configPart["config"]["loaderMethod"] = LoaderMethod.HistoricalDataService; return configPart; }
migrateMenuItemConfig
Type : ConfigMigration
Default value : (key, configPart) => { if (key !== "navigationMenu") { return configPart; } const oldItems: ( | { name: string; icon: string; link: string; } | MenuItem )[] = configPart.items; configPart.items = oldItems.map((item) => { if (item.hasOwnProperty("name")) { return { label: item["name"], icon: item.icon, link: item.link, }; } else { return item; } }); return configPart; }
migratePercentageDatatype
Type : ConfigMigration
Default value : (key, configPart) => { if ( configPart?.dataType === "number" && configPart?.viewComponent === "DisplayPercentage" ) { configPart.dataType = "percentage"; delete configPart.viewComponent; delete configPart.editComponent; } return configPart; }

Migrate the number datatype to use the new "percentage" datatype

migratePhotoDatatype
Type : ConfigMigration
Default value : (key, configPart) => { if ( configPart?.dataType === "file" && configPart?.editComponent === "EditPhoto" ) { configPart.dataType = "photo"; delete configPart.editComponent; } return configPart; }

Migrate the "file" datatype to use the new "photo" datatype and remove editComponent if no longer needed

src/app/core/demo-data/demo-data.app-initializer.ts

APP_INITIALIZER_DEMO_DATA
Default value : provideAppInitializer(() => { const initializerFn = ((injector: Injector) => async () => { if (environment.demo_mode) { const m = await import("./demo-data.module"); await createInjector(m.DemoDataModule, injector) .get(m.DemoDataModule) .publishDemoData(); } })(inject(Injector)); return initializerFn(); })

Provide this in the app module to run the demo data generation with lazy-loading (no download of module code if not in demo mode).

src/app/core/config/config.app-initializer.ts

APP_INITIALIZER_PROPAGATE_CONFIG_UPDATES
Default value : provideAppInitializer( () => { const initializerFn = ( ( configService: ConfigService, routerService: RouterService, entityConfigService: EntityConfigService, router: Router, ) => async () => { // Re-trigger services that depend on the config when something changes configService.configUpdates.subscribe(() => { routerService.initRouting(); entityConfigService.setupEntitiesFromConfig(); const url = location.href.replace(location.origin, ""); router.navigateByUrl(url, { skipLocationChange: true }); }); } )( inject(ConfigService), inject(RouterService), inject(EntityConfigService), inject(Router), ); return initializerFn(); }, )

src/app/child-dev-project/attendance/model/attendance-status.ts

ATTENDANCE_STATUS_CONFIG_ID
Type : string
Default value : "attendance-status"

the id through which the available attendance status types can be loaded from the ConfigService.

NullAttendanceStatusType
Type : AttendanceStatusType
Default value : { id: "", label: "", shortName: "", countAs: AttendanceLogicalStatus.IGNORE, }

Null object representing an unknown attendance status.

This allows easier handling of attendance status logic because exceptional checks for undefined are not necessary.

src/app/child-dev-project/attendance/attendance-components.ts

attendanceComponents
Type : ComponentTuple[]
Default value : [ [ "AttendanceManager", () => import("./attendance-manager/attendance-manager.component").then( (c) => c.AttendanceManagerComponent, ), ], [ "AddDayAttendance", () => import("./add-day-attendance/add-day-attendance.component").then( (c) => c.AddDayAttendanceComponent, ), ], [ "ActivityAttendanceSection", () => import( "./activity-attendance-section/activity-attendance-section.component" ).then((c) => c.ActivityAttendanceSectionComponent), ], [ "AttendanceWeekDashboard", () => import( "./dashboard-widgets/attendance-week-dashboard/attendance-week-dashboard.component" ).then((c) => c.AttendanceWeekDashboardComponent), ], [ "EditAttendance", () => import("./edit-attendance/edit-attendance.component").then( (c) => c.EditAttendanceComponent, ), ], [ "ActivitiesOverview", () => import( "../attendance/activities-overview/activities-overview.component" ).then((c) => c.ActivitiesOverviewComponent), ], ]

src/app/core/session/auth.guard.ts

AuthGuard
Type : CanActivateFn
Default value : ( route: ActivatedRouteSnapshot, state: RouterStateSnapshot, ) => { if (inject(LoginStateSubject).value === LoginState.LOGGED_IN) { return true; } else { return inject(Router).createUrlTree(["/login"], { queryParams: { redirect_uri: state.url, }, }); } }

src/app/core/language/languages.ts

availableLocales
Default value : new ConfigurableEnum(LOCALE_ENUM_ID, [ { id: "en-US", label: "en" }, { id: "de", label: "de" }, { id: "fr", label: "fr" }, { id: "it", label: "it" }, ])

A readonly array of all locales available

LOCALE_ENUM_ID
Type : string
Default value : "locales"

src/app/core/common-components/basic-autocomplete/basic-autocomplete.component.ts

BASIC_AUTOCOMPLETE_COMPONENT_IMPORTS
Type : []
Default value : [ ReactiveFormsModule, MatInputModule, MatAutocompleteModule, NgForOf, MatCheckboxModule, NgIf, NgTemplateOutlet, MatChipInput, MatChipGrid, MatChipRow, FaIconComponent, MatTooltip, MatChipRemove, DragDropModule, CdkVirtualScrollViewport, CdkVirtualForOf, CdkFixedSizeVirtualScroll, ]

src/app/child-dev-project/children/demo-data-generators/fixtures/centers.ts

centersUnique
Type : ConfigurableEnumValue[]
Default value : [ { id: "alipore", label: $localize`:center:Alipore` }, { id: "tollygunge", label: $localize`:center:Tollygunge` }, { id: "barabazar", label: $localize`:center:Barabazar` }, ]
centersWithProbability
Default value : [0, 0, 1, 2].map((i) => centersUnique[i])

src/app/child-dev-project/children/children-components.ts

childrenComponents
Type : ComponentTuple[]
Default value : [ [ "GroupedChildAttendance", () => import( "./child-details/grouped-child-attendance/grouped-child-attendance.component" ).then((c) => c.GroupedChildAttendanceComponent), ], [ "RecentAttendanceBlocks", () => import( "../attendance/recent-attendance-blocks/recent-attendance-blocks.component" ).then((c) => c.RecentAttendanceBlocksComponent), ], [ "PreviousSchools", () => import("./child-school-overview/child-school-overview.component").then( (c) => c.ChildSchoolOverviewComponent, ), ], [ "ChildrenOverview", () => import("./child-school-overview/child-school-overview.component").then( (c) => c.ChildSchoolOverviewComponent, ), ], [ "ChildSchoolOverview", () => import("./child-school-overview/child-school-overview.component").then( (c) => c.ChildSchoolOverviewComponent, ), ], [ "DisplayParticipantsCount", () => import( "./display-participants-count/display-participants-count.component" ).then((c) => c.DisplayParticipantsCountComponent), ], ]

src/app/dynamic-components.ts

componentRegistry
Default value : new ComponentRegistry()

src/app/core/admin/setup-wizard/setup-wizard-config.ts

CONFIG_SETUP_WIZARD_ID
Type : string
Default value : "Config:SetupWizard"
defaultSetupWizardConfig
Type : SetupWizardConfig
Default value : { openOnStart: false, steps: [ { title: $localize`:Setup Wizard Step Title:Welcome`, text: $localize`:Setup Wizard Step Text: # Welcome to Aam Digital! We are here to help you manage your participants' or beneficiaries' details and your team's interactions with them. The Aam Digital platform is very flexible and you can customize the structures and views to exactly fit your project needs. The following steps guide you through the most important configuration options for this. And you can start working with your data within a few minutes already. We also have some short video guides for you: [Aam Digital Video Guides (YouTube)](https://www.youtube.com/channel/UCZSFOX_MBa8zz5Mtfv_qlnA/videos) Feel free to leave this setup wizard in between to explore the existing system first. You can always come back to this view through the "Setup Wizard" button at the bottom of the main menu on the left. To dismiss and hide this wizard, go to the last step of the wizard and "finish" the setup process.`, }, { title: $localize`:Setup Wizard Step Title:Profiles & Fields`, text: $localize`:Setup Wizard Step Text: The system already holds some basic structures for your case management. You can adapt the fields and how the details are displayed. If you have further requirements, don't hesitate to reach out to us at [support@aam-digital.com](mailto:support@aam-digital.com). _Please note that the setup wizard and form builder is still under active development ("beta" version). Some advanced configuration options are not available here yet for you to configure yourself and may need assistance from the tech support team. We are currently extending and optimizing the user interfaces for these steps._ `, actions: [ { label: $localize`:Setup Wizard Step Action:Customize Child profile`, link: "/admin/entity/Child", }, { label: $localize`:Setup Wizard Step Action:Customize School profile`, link: "/admin/entity/School", }, ], }, { title: $localize`:Setup Wizard Step Title:User Accounts`, text: $localize`:Setup Wizard Step Text: You can collaborate on Aam Digital as a team. Data is synced and all users have access to the latest information.`, actions: [ { label: $localize`:Setup Wizard Step Action:Manage User Accounts`, link: "/user", }, ], }, { title: $localize`:Setup Wizard Step Title:Import Data`, text: $localize`:Setup Wizard Step Text: If you have exising data from a previous system, you can easily import it. Save the data in ".csv" format (e.g. from MS Excel). You do not need any specific column names in your file to be imported. The Import Module helps your map your spreadsheet data to the relevant fields in your Aam Digital profiles.`, actions: [ { label: $localize`:Setup Wizard Step Action:Import Data`, link: "/import", }, ], }, { title: $localize`:Setup Wizard Step Title:Done!`, text: $localize`:Setup Wizard Step Text: That's it. You are ready to explore your system and start work! You can always adapt your setup further, after you started using it. We recommend to keep things simple in the beginning, start using it for some of your tasks and then add further fields and adjust your setup. Feel free to reach out to us with your questions or feedback: [support@aam-digital.com](mailto:support@aam-digital.com)`, }, ], }

src/app/features/conflict-resolution/auto-resolution/conflict-resolution-strategy.ts

CONFLICT_RESOLUTION_STRATEGY
Default value : new InjectionToken<ConflictResolutionStrategy>("ConflictResolutionStrategy")

Use this token to provide (and thereby register) custom implementations of ConflictResolutionStrategy.

{ provide: CONFLICT_RESOLUTION_STRATEGY, useClass: MyConflictResolutionStrategy, multi: true }

see ConflictResolutionModule

src/app/features/conflict-resolution/conflict-resolution-components.ts

conflictResolutionComponents
Type : ComponentTuple[]
Default value : [ [ "ConflictResolution", () => import( "./conflict-resolution-list/conflict-resolution-list.component" ).then((c) => c.ConflictResolutionListComponent), ], ]

src/app/core/core-components.ts

coreComponents
Type : ComponentTuple[]
Default value : [ [ "DisplayConfigurableEnum", () => import( "./basic-datatypes/configurable-enum/display-configurable-enum/display-configurable-enum.component" ).then((c) => c.DisplayConfigurableEnumComponent), ], [ "EditConfigurableEnum", () => import( "./basic-datatypes/configurable-enum/edit-configurable-enum/edit-configurable-enum.component" ).then((c) => c.EditConfigurableEnumComponent), ], [ "Form", () => import("./entity-details/form/form.component").then( (c) => c.FormComponent, ), ], [ "EditEntity", () => import("./basic-datatypes/entity/edit-entity/edit-entity.component").then( (c) => c.EditEntityComponent, ), ], [ "DisplayEntity", () => import( "./basic-datatypes/entity/display-entity/display-entity.component" ).then((c) => c.DisplayEntityComponent), ], [ "EntityBlock", () => import( "./basic-datatypes/entity/entity-block/entity-block.component" ).then((c) => c.EntityBlockComponent), ], [ "EditTextWithAutocomplete", () => import( "./common-components/edit-text-with-autocomplete/edit-text-with-autocomplete.component" ).then((c) => c.EditTextWithAutocompleteComponent), ], [ "EditAge", () => import( "./basic-datatypes/date-with-age/edit-age/edit-age.component" ).then((c) => c.EditAgeComponent), ], [ "EditText", () => import("./basic-datatypes/string/edit-text/edit-text.component").then( (c) => c.EditTextComponent, ), ], [ "EditBoolean", () => import( "./basic-datatypes/boolean/edit-boolean/edit-boolean.component" ).then((c) => c.EditBooleanComponent), ], [ "EditDate", () => import("./basic-datatypes/date/edit-date/edit-date.component").then( (c) => c.EditDateComponent, ), ], [ "EditMonth", () => import("./basic-datatypes/month/edit-month/edit-month.component").then( (c) => c.EditMonthComponent, ), ], [ "EditLongText", () => import( "./basic-datatypes/string/edit-long-text/edit-long-text.component" ).then((c) => c.EditLongTextComponent), ], [ "EditPhoto", () => import("../features/file/edit-photo/edit-photo.component").then( (c) => c.EditPhotoComponent, ), ], [ "EditNumber", () => import("./basic-datatypes/number/edit-number/edit-number.component").then( (c) => c.EditNumberComponent, ), ], [ "EditDescriptionOnly", () => import( "./common-components/description-only/edit-description-only/edit-description-only.component" ).then((c) => c.EditDescriptionOnlyComponent), ], [ "DisplayCheckmark", () => import( "./basic-datatypes/boolean/display-checkmark/display-checkmark.component" ).then((c) => c.DisplayCheckmarkComponent), ], [ "DisplayText", () => import( "./basic-datatypes/string/display-text/display-text.component" ).then((c) => c.DisplayTextComponent), ], [ "DisplayLongText", () => import( "./basic-datatypes/string/display-long-text/display-long-text.component" ).then((c) => c.DisplayLongTextComponent), ], [ "DisplayDate", () => import("./basic-datatypes/date/display-date/display-date.component").then( (c) => c.DisplayDateComponent, ), ], [ "DisplayEntityType", () => import("./entity/display-entity-type/display-entity-type.component").then( (c) => c.DisplayEntityTypeComponent, ), ], [ "DisplayMonth", () => import( "./basic-datatypes/month/display-month/display-month.component" ).then((c) => c.DisplayMonthComponent), ], [ "ReadonlyFunction", () => import( "./common-components/display-readonly-function/readonly-function.component" ).then((c) => c.ReadonlyFunctionComponent), ], [ "DisplayPercentage", () => import( "./basic-datatypes/number/display-percentage/display-percentage.component" ).then((c) => c.DisplayPercentageComponent), ], [ "DisplayDynamicPercentage", () => import( "./basic-datatypes/number/display-dynamic-percentage/display-calculated-value.component" ).then((c) => c.DisplayCalculatedValueComponent), ], [ "DisplayCalculatedValue", () => import( "./basic-datatypes/number/display-dynamic-percentage/display-calculated-value.component" ).then((c) => c.DisplayCalculatedValueComponent), ], [ "DisplayUnit", () => import( "./basic-datatypes/number/display-unit/display-unit.component" ).then((c) => c.DisplayUnitComponent), ], [ "DisplayAge", () => import( "./basic-datatypes/date-with-age/display-age/display-age.component" ).then((c) => c.DisplayAgeComponent), ], [ "UserSecurity", () => import("./user/user-security/user-security.component").then( (c) => c.UserSecurityComponent, ), ], [ "Dashboard", () => import("./dashboard/dashboard/dashboard.component").then( (c) => c.DashboardComponent, ), ], [ "EntityList", () => import("./entity-list/entity-list/entity-list.component").then( (c) => c.EntityListComponent, ), ], [ "EntityDetails", () => import("./entity-details/entity-details/entity-details.component").then( (c) => c.EntityDetailsComponent, ), ], [ "RelatedEntities", () => import( "./entity-details/related-entities/related-entities.component" ).then((c) => c.RelatedEntitiesComponent), ], [ "RelatedTimePeriodEntities", () => import( "./entity-details/related-time-period-entities/related-time-period-entities.component" ).then((c) => c.RelatedTimePeriodEntitiesComponent), ], [ "RelatedEntitiesWithSummary", () => import( "./entity-details/related-entities-with-summary/related-entities-with-summary.component" ).then((c) => c.RelatedEntitiesWithSummaryComponent), ], [ "EditEntityType", () => import("./entity/edit-entity-type/edit-entity-type.component").then( (c) => c.EditEntityTypeComponent, ), ], [ "EditUrl", () => import("./basic-datatypes/string/edit-url/edit-url.component").then( (c) => c.EditUrlComponent, ), ], [ "DisplayUrl", () => import("./basic-datatypes/string/display-url/display-url.component").then( (c) => c.DisplayUrlComponent, ), ], ]

src/app/utils/custom-number-validators.ts

CustomNumberValidators
Type : literal type
Default value : { /** * Angular Validator to verify value is a valid number. */ isNumber: (control: AbstractControl) => { if (control.value && Number.isNaN(Number(control.value))) { return { isNumber: "invalid" }; } else { return null; } }, }

Container for custom Angular Validator functions.

src/app/core/language/date-adapter-with-formatting.ts

DATE_FORMATS
Type : MatDateFormats
Default value : { parse: { dateInput: "l" }, display: MAT_NATIVE_DATE_FORMATS.display, }

Extend MAT_NATIVE_DATE_FORMATS to also support parsing.

src/app/core/language/language-statics.ts

DEFAULT_LANGUAGE
Type : string
Default value : "en-US"
LANGUAGE_LOCAL_STORAGE_KEY
Type : string
Default value : "locale"

src/app/core/config/default-config/default-attendance-status-types.ts

defaultAttendanceStatusTypes
Type : AttendanceStatusType[]
Default value : [ { id: "PRESENT", shortName: "P", label: $localize`:Child was present|Option in roll call:Present`, style: "attendance-P", countAs: "PRESENT" as AttendanceLogicalStatus, }, { id: "ABSENT", shortName: "A", label: $localize`:Child was absent|Option in roll call:Absent`, style: "attendance-A", countAs: "ABSENT" as AttendanceLogicalStatus, }, { id: "LATE", shortName: "L", label: $localize`:Child was late|Option in roll call:Late`, style: "attendance-L", countAs: "PRESENT" as AttendanceLogicalStatus, }, { id: "EXCUSED", shortName: "E", label: $localize`:Child was excused|Option in roll call:Excused`, style: "attendance-E", countAs: "IGNORE" as AttendanceLogicalStatus, }, ]

src/app/core/basic-datatypes/date/date-range-filter/date-range-filter-panel/date-range-filter-panel.component.ts

defaultDateFilters
Type : DateRangeFilterConfigOption[]
Default value : [ { label: $localize`:Filter label:Today`, }, { startOffsets: [{ amount: 0, unit: "weeks" }], endOffsets: [{ amount: 0, unit: "weeks" }], label: $localize`:Filter label:This week`, }, { startOffsets: [{ amount: -1, unit: "weeks" }], label: $localize`:Filter label:Since last week`, }, { startOffsets: [{ amount: 0, unit: "months" }], endOffsets: [{ amount: 0, unit: "months" }], label: $localize`:Filter label:This month`, }, { startOffsets: [{ amount: -1, unit: "months" }], endOffsets: [{ amount: -1, unit: "months" }], label: $localize`:Filter label:Last month`, }, ]

src/app/core/config/default-config/default-interaction-types.ts

defaultInteractionTypes
Type : InteractionType[]
Default value : [ { id: "VISIT", label: $localize`:Interaction type/Category of a Note:Home Visit`, }, { id: "GUARDIAN_TALK", label: $localize`:Interaction type/Category of a Note:Talk with Guardians`, }, { id: "INCIDENT", label: $localize`:Interaction type/Category of a Note:Incident`, }, { id: "NOTE", label: $localize`:Interaction type/Category of a Note:General Note`, }, { id: "GUARDIAN_MEETING", label: $localize`:Interaction type/Category of a Note:Guardians' Meeting`, color: "#E1F5FE", isMeeting: true, }, { id: "COACHING_CLASS", label: $localize`:Interaction type/Category of a Note:Coaching Class`, color: "#EEEEEE", isMeeting: true, }, { id: "SCHOOL_CLASS", label: $localize`:Interaction type/Category of a Note:School Class`, color: "#EEEEEE", isMeeting: true, }, ]

src/app/core/config/config-fix.ts

defaultJsonConfig
Type : object
Default value : { "appConfig:usage-analytics": { url: "https://matomo.aam-digital.org", site_id: "8" }, navigationMenu: { items: [ { label: $localize`:Menu item:Dashboard`, icon: "home", link: "/" }, { entityType: "Child" }, { entityType: "School" }, { label: $localize`:Menu item:Attendance`, icon: "calendar-check", link: "/attendance" }, { entityType: "Note" }, { entityType: "Todo" }, { label: $localize`:Menu item:Import`, icon: "file-import", link: "/import" }, { label: $localize`:Menu item:Reports`, icon: "line-chart", link: "/report" }, { label: $localize`:Menu item:Help`, icon: "question", link: "/help" }, { label: $localize`:Menu item:Admin`, icon: "wrench", subMenu: [ { label: $localize`:Menu item:Admin Overview`, icon: "wrench", link: "/admin" }, { label: $localize`:Menu item:Users`, icon: "users", link: "/user" } ] } ] }, "view:": { component: "Dashboard", config: { widgets: [ { component: "ShortcutDashboard", config: { shortcuts: [ { label: $localize`:Dashboard shortcut widget|record attendance shortcut:Record Attendance`, icon: "calendar-check", link: "/attendance/add-day" }, { label: $localize`:Dashboard shortcut widget|record attendance shortcut:Add Child`, icon: "plus", link: "/child/new" }, { label: $localize`:Dashboard shortcut widget|open public form:Public Registration Form`, icon: "file-circle-check", link: "/public-form/form/test" } ] } }, { component: "EntityCountDashboard" }, { component: "ImportantNotesDashboard", config: { warningLevels: ["WARNING", "URGENT"] } }, { component: "TodosDashboard" }, { component: "NotesDashboard", config: { sinceDays: 28, fromBeginningOfWeek: false, mode: "with-recent-notes" } }, { component: "NotesDashboard", config: { sinceDays: 28, fromBeginningOfWeek: false, mode: "without-recent-notes" } }, { component: "AttendanceWeekDashboard", config: { daysOffset: 7, periodLabel: $localize`:Attendance week dashboard widget label:this week` } }, { component: "AttendanceWeekDashboard", config: { daysOffset: 0, periodLabel: $localize`:Attendance week dashboard widget label:last week` } }, { component: "AttendanceWeekDashboard", config: { daysOffset: 0, label: $localize`:Attendance week dashboard widget label:Late last week`, attendanceStatusType: "LATE" } }, { component: "ProgressDashboard", config: { dashboardConfigId: "1" } }, { component: "BirthdayDashboard" } ] } }, "entity:Note": { toStringAttributes: ["subject"], label: $localize`:label for entity:Note`, labelPlural: $localize`:label (plural) for entity:Notes`, hasPII: true, attributes: { children: { label: $localize`:Label for the children of a note:Children`, dataType: "entity", isArray: true, additional: "Child", entityReferenceRole: "composite", editComponent: "EditAttendance", anonymize: "retain" }, childrenAttendance: { dataType: EventAttendanceMap.DATA_TYPE, anonymize: "retain" }, date: { label: $localize`:Label for the date of a note:Date`, dataType: "date-only", defaultValue: { mode: "dynamic", value: PLACEHOLDERS.NOW }, anonymize: "retain" }, subject: { dataType: "string", label: $localize`:Label for the subject of a note:Subject` }, text: { dataType: LongTextDatatype.dataType, label: $localize`:Label for the actual notes of a note:Notes` }, authors: { label: $localize`:Label for the social worker(s) who created the note:Team involved`, dataType: "entity", isArray: true, additional: "User", defaultValue: { mode: "dynamic", value: PLACEHOLDERS.CURRENT_USER }, anonymize: "retain" }, category: { label: $localize`:Label for the category of a note:Category`, dataType: "configurable-enum", additional: INTERACTION_TYPE_CONFIG_ID, anonymize: "retain" }, attachment: { label: $localize`Attachment`, dataType: "file" }, relatesTo: { dataType: "entity", additional: RecurringActivity.ENTITY_TYPE, anonymize: "retain" }, relatedEntities: { label: $localize`:label for the related Entities:Related Records`, dataType: "entity", isArray: true, // by default no additional relatedEntities can be linked apart from children and schools, overwrite this in config to display (e.g. additional: "ChildSchoolRelation") additional: undefined, anonymize: "retain" }, schools: { label: $localize`:label for the linked schools:Groups`, dataType: "entity", isArray: true, additional: "School", entityReferenceRole: "composite", anonymize: "retain" }, warningLevel: { label: $localize`:Status of a note:Status`, dataType: "configurable-enum", additional: "warning-levels", anonymize: "retain" } } }, "view:note": { component: "NotesManager", config: { title: $localize`:Title for notes overview:Notes & Reports`, includeEventNotes: false, showEventNotesToggle: true, columnGroups: { default: $localize`:Translated name of default column group:Standard`, mobile: $localize`:Translated name of mobile column group:Mobile`, groups: [ { name: $localize`:Column group name:Standard`, columns: ["date", "subject", "category", "authors", "children"] }, { name: $localize`:Column group name:Mobile`, columns: ["date", "subject", "children"] } ] }, filters: [ { id: "warningLevel" }, { id: "date", default: 1, options: defaultDateFilters }, { id: "category" }, { id: "authors" } ], exportConfig: [ { label: "event_id", query: "_id" }, { label: "date", query: "date" }, { label: "event title", query: "subject" }, { label: "event type", query: "category" }, { label: "event description", query: "text" }, { query: ":getAttendanceArray(true)", subQueries: [ { query: ".participant:toEntities(Child)", subQueries: [ { label: "participant_id", query: "_id" }, { label: "participant", query: "name" }, { label: "gender", query: "gender" }, { label: "religion", query: "religion" } ] }, { label: "status", query: ".status._status.id" }, { query: ".school:toEntities(School)", subQueries: [ { label: "school_name", query: "name" }, { label: "school_id", query: "entityId" } ] } ] } ] } }, "view:note/:id": { component: "NoteDetails", config: { topForm: ["date", "warningLevel", "category", "authors", "attachment"] } }, "view:import": { component: "Import" }, "view:user": { component: "EntityList", config: { entityType: "User", columns: ["name", "phone"] }, permittedUserRoles: ["admin_app"] }, "view:user/:id": { component: "EntityDetails", config: { entityType: "User", panels: [ { title: $localize`:Panel title:User Information`, components: [ { title: "", component: "Form", config: { fieldGroups: [{ fields: ["name"] }, { fields: ["phone"] }] } } ] }, { title: $localize`:Panel title:Security`, components: [ { component: "UserSecurity" } ] } ] } }, "view:help": { component: "MarkdownPage", config: { markdownEntityId: "help" } }, "view:attendance": { component: "AttendanceManager" }, "view:attendance/add-day": { component: "AddDayAttendance" }, "view:school": { component: "EntityList", config: { entityType: "School", columns: [ "name", { id: "DisplayParticipantsCount", viewComponent: "DisplayParticipantsCount", label: $localize`Children` }, "privateSchool", "language", "website" ], filters: [{ id: "privateSchool" }] } }, "view:school/:id": { component: "EntityDetails", config: { entityType: "School", panels: [ { title: $localize`:Panel title:Basic Information`, components: [ { title: "", component: "Form", config: { fieldGroups: [ { fields: ["name", "privateSchool", "parentSchool"] }, { fields: ["address", "phone", "website"] }, { fields: ["language", "timing"] }, { fields: ["remarks"] } ] } } ] }, { title: $localize`:Panel title:Students`, components: [ { title: "", component: "ChildSchoolOverview" } ] }, { title: $localize`:Panel title:Activities`, components: [ { title: "", component: "ActivitiesOverview" } ] } ] } }, "view:child": { component: "ChildrenList", config: { entityType: "Child", columns: [ { viewComponent: "ChildBlock", label: $localize`:Column title for ChildBlockComponents:Name`, id: "name" }, { viewComponent: "DisplayAge", label: $localize`:Column label for age of child:Age`, id: "age", additional: "dateOfBirth" }, { viewComponent: "DisplayText", label: $localize`:Column label for class which child attends:Class`, id: "schoolClass" }, { viewComponent: "DisplayEntity", label: $localize`:Column label for school which child attends:School`, id: "schoolId", additional: "School", noSorting: true }, { viewComponent: "RecentAttendanceBlocks", label: $localize`:Column label for school attendance of child:Attendance (School)`, id: "schoolAttendance", additional: { filterByActivityType: "SCHOOL_CLASS" }, noSorting: true }, { viewComponent: "RecentAttendanceBlocks", label: $localize`:Column label for coaching attendance of child:Attendance (Coaching)`, id: "coachingAttendance", additional: { filterByActivityType: "COACHING_CLASS" }, noSorting: true } ], columnGroups: { default: $localize`:Translated name of default column group:Basic Info`, mobile: $localize`:Translated name of mobile column group:Mobile`, groups: [ { name: $localize`:Column group name:Basic Info`, columns: [ "projectNumber", "name", "age", "gender", "schoolClass", "schoolId", "center", "status" ] }, { name: $localize`:Column group name:School Info`, columns: [ "projectNumber", "name", "age", "schoolClass", "schoolId", "schoolAttendance", "coachingAttendance", "motherTongue" ] }, { name: $localize`:Column group name:Status`, columns: [ "projectNumber", "name", "center", "status", "admissionDate" ] }, { name: $localize`:Column group name:Health`, columns: [ "projectNumber", "name", "center", "health_bloodGroup", "health_lastDentalCheckup", "gender", "age", "dateOfBirth", "birth_certificate" ] }, { name: $localize`:Column group name:Mobile`, columns: ["projectNumber", "name", "age"] } ] }, filters: [ { id: "center" }, { id: "schoolId", type: "School", label: $localize`:Label of schools filter:School` } ], exportConfig: [ { label: "Name", query: "name" }, { label: "Gender", query: "gender" }, { label: "Date of Birth", query: "dateOfBirth" }, { label: "School", query: ".schoolId:toEntities(School).name" }, { label: "more fields can be configured - or all data exported", query: "projectNumber" } ] } }, "view:child/:id": { component: "EntityDetails", config: { entityType: "Child", panels: [ { title: $localize`:Panel title:Basic Information`, components: [ { title: "", component: "Form", config: { fieldGroups: [ { fields: ["photo"] }, { fields: ["name", "projectNumber", "admissionDate"], header: $localize`:Header for form section:Personal Information` }, { fields: [ "dateOfBirth", "birth_certificate", "gender", "motherTongue" ], header: $localize`:Header for form section:Additional` }, { fields: ["center", "status", "address", "phone"], header: $localize`:Header for form section:Scholar activities` } ] } } ] }, { title: $localize`:Panel title:Education`, components: [ { title: $localize`:Title inside a panel:School History`, component: "ChildSchoolOverview", config: { single: true, columns: [ { id: "start", visibleFrom: "sm" }, { id: "end", visibleFrom: "sm" }, "schoolId", "schoolClass", "result" ] } }, { title: $localize`:Title inside a panel:ASER Results`, component: "RelatedEntities", config: { entityType: "Aser", property: "child", columns: [ { id: "date", visibleFrom: "xs" }, { id: "math", visibleFrom: "xs" }, { id: "english", visibleFrom: "xs" }, { id: "hindi", visibleFrom: "md" }, { id: "bengali", visibleFrom: "md" }, { id: "remarks", visibleFrom: "md" } ] } }, { title: $localize`:Child details section title:Find a suitable new school`, component: "MatchingEntities", config: { rightSide: { entityType: "School", availableFilters: [{ id: "language" }] } } } ] }, { title: $localize`:Panel title:Attendance`, components: [ { title: "", component: "GroupedChildAttendance" } ] }, { title: $localize`:Panel title:Notes & Tasks`, components: [ { title: "", component: "NotesRelatedToEntity" }, { title: "Tasks", component: "TodosRelatedToEntity" } ] }, { title: $localize`:Panel title:Health`, components: [ { title: "", component: "Form", config: { fieldGroups: [ { fields: ["health_bloodGroup"] }, { fields: [ { id: "_description_health", editComponent: "EditDescriptionOnly", label: $localize`:description section:Health checkups are to be done regularly, at least every 6 months according to the program guidelines. Make sure to visit the [Health Guidelines](https://example.com/guidelines) for detailed recommendations and procedures.` }, "health_lastDentalCheckup" ] } ] } }, { title: $localize`:Title inside a panel:Height & Weight Tracking`, component: "RelatedEntities", config: { entityType: "HealthCheck", property: "child", columns: [ { id: "date" }, { id: "height" }, { id: "weight" }, { id: "bmi", label: $localize`:Table header, Short for Body Mass Index:BMI`, description: $localize`:Tooltip for BMI info:This is calculated using the height and the weight measure`, viewComponent: "DisplayCalculatedValue", additional: { calculation: "bmi", valueFields: ["weight", "height"], decimalPlaces: 1 } } ] } } ] }, { title: $localize`:Panel title:Educational Materials`, components: [ { title: "", component: "RelatedEntitiesWithSummary", config: { entityType: "EducationalMaterial", 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 } } } ] }, { title: $localize`:Panel title:Observations`, components: [ { title: "", component: "HistoricalDataComponent", config: { columns: [ "date", { id: "isMotivatedDuringClass", visibleFrom: "lg" }, { id: "isParticipatingInClass", visibleFrom: "lg" }, { id: "isInteractingWithOthers", visibleFrom: "lg" }, { id: "doesHomework", visibleFrom: "lg" }, { id: "asksQuestions", visibleFrom: "lg" } ] } } ] }, { title: $localize`:Panel title:Dropout`, components: [ { title: "", component: "Form", config: { fieldGroups: [ { fields: ["dropoutDate"] }, { fields: ["dropoutType"] }, { fields: ["dropoutRemarks"] } ] } } ] } ] } }, "entity:EducationalMaterial": { attributes: { child: { dataType: EntityDatatype.dataType, additional: "Child", entityReferenceRole: "composite" }, date: { dataType: "date", label: $localize`:Date on which the material has been borrowed:Date`, defaultValue: { mode: "dynamic", value: PLACEHOLDERS.NOW } }, materialType: { label: $localize`:The material which has been borrowed:Material`, dataType: "configurable-enum", additional: "materials", validators: { required: true } }, materialAmount: { dataType: "number", label: $localize`:The amount of the material which has been borrowed:Amount`, defaultValue: { mode: "static", value: 1 }, validators: { required: true } }, description: { dataType: "string", label: $localize`:An additional description for the borrowed material:Description` } } }, "entity:RecurringActivity": { toStringAttributes: ["title"], label: $localize`:label for entity:Recurring Activity`, labelPlural: $localize`:label (plural) for entity:Recurring Activities`, color: "#00838F", route: "attendance/recurring-activity", attributes: { title: { dataType: "string", label: $localize`:Label for the title of a recurring activity:Title`, validators: { required: true } }, type: { label: $localize`:Label for the interaction type of a recurring activity:Type`, dataType: "configurable-enum", additional: INTERACTION_TYPE_CONFIG_ID }, participants: { label: $localize`:Label for the participants of a recurring activity:Participants`, dataType: "entity", isArray: true, additional: "Child" }, linkedGroups: { label: $localize`:Label for the linked schools of a recurring activity:Groups`, dataType: "entity", isArray: true, additional: "School" }, excludedParticipants: { label: $localize`:Label for excluded participants of a recurring activity:Excluded Participants`, dataType: "entity", isArray: true, additional: "Child" }, assignedTo: { label: $localize`:Label for the assigned user(s) of a recurring activity:Assigned user(s)`, dataType: "entity", isArray: true, additional: "User" } } }, "view:attendance/recurring-activity": { component: "EntityList", config: { entityType: "RecurringActivity", columns: ["title", "type", "assignedTo"], exportConfig: [ { label: "Title", query: "title" }, { label: "Type", query: "type" }, { label: "Assigned users", query: "assignedTo" } ] } }, "view:attendance/recurring-activity/:id": { component: "EntityDetails", config: { entityType: "RecurringActivity", panels: [ { title: $localize`:Panel title:Basic Information`, components: [ { component: "Form", config: { fieldGroups: [ { fields: ["title"] }, { fields: ["type"] }, { fields: ["assignedTo"] } ] } } ] }, { title: $localize`:Panel title:Participants`, components: [ { component: "Form", config: { fieldGroups: [ { fields: [ "linkedGroups", "participants", "excludedParticipants" ] } ] } } ] }, { title: $localize`:Panel title:Events & Attendance`, components: [ { component: "ActivityAttendanceSection" } ] } ] } }, "view:report": { component: "Reporting" }, "entity:Child": { label: $localize`:Label for child:Child`, labelPlural: $localize`:Plural label for child:Children`, toStringAttributes: ["name"], toBlockDetailsAttributes: { title: "name", image: "photo", fields: ["phone", "schoolId", "schoolClass"] }, icon: "child", color: "#1565C0", hasPII: true, attributes: { name: { dataType: "string", label: $localize`:Label for the name of a child:Name`, validators: { required: true } }, projectNumber: { dataType: "string", label: $localize`:Label for the project number of a child:Project Number`, labelShort: $localize`:Short label for the project number:PN`, searchable: true, anonymize: "retain" }, dateOfBirth: { dataType: "date-with-age", label: $localize`:Label for the date of birth of a child:Date of birth`, labelShort: $localize`:Short label for the date of birth:DoB`, anonymize: "retain-anonymized" }, center: { dataType: "configurable-enum", additional: "center", label: $localize`:Label for the center of a child:Center`, anonymize: "retain" }, gender: { dataType: "configurable-enum", label: $localize`:Label for the gender of a child:Gender`, additional: "genders", anonymize: "retain" }, admissionDate: { dataType: "date-only", label: $localize`:Label for the admission date of a child:Admission`, anonymize: "retain-anonymized" }, status: { dataType: "string", label: $localize`:Label for the status of a child:Status` }, dropoutDate: { dataType: "date-only", label: $localize`:Label for the dropout date of a child:Dropout Date`, anonymize: "retain-anonymized" }, dropoutType: { dataType: "string", label: $localize`:Label for the type of dropout of a child:Dropout Type`, anonymize: "retain" }, dropoutRemarks: { dataType: "string", label: $localize`:Label for the remarks about a dropout of a child:Dropout remarks` }, photo: { dataType: "photo", label: $localize`:Label for the file field of a photo of a child:Photo` }, phone: { dataType: "string", label: $localize`:Label for the phone number of a child:Phone Number` }, address: { dataType: "location", label: $localize`:Label for the address of a child:Address` }, health_bloodGroup: { dataType: "string", label: $localize`:Label for a child attribute:Blood Group` }, religion: { dataType: "string", label: $localize`:Label for the religion of a child:Religion` }, motherTongue: { dataType: "string", label: $localize`:Label for the mother tongue of a child:Mother Tongue`, description: $localize`:Tooltip description for the mother tongue of a child:The primary language spoken at home` }, health_lastDentalCheckup: { dataType: "date", label: $localize`:Label for a child attribute:Last Dental Check-Up` }, birth_certificate: { dataType: "file", label: $localize`:Label for a child attribute:Birth certificate`, additional: { acceptedFileTypes: ".pdf" } } } } as EntityConfig, "entity:School": { toStringAttributes: ["name"], icon: "university", label: $localize`:label for entity:School`, labelPlural: $localize`:label (plural) for entity:Schools`, color: "#9E9D24", attributes: { name: { dataType: "string", label: $localize`:Label for the name of a school:Name`, validators: { required: true } }, privateSchool: { dataType: "boolean", label: $localize`:Label for if a school is a private school:Private School` }, language: { dataType: "string", label: $localize`:Label for the language of a school:Language` }, address: { dataType: "location", label: $localize`:Label for the address of a school:Address` }, phone: { dataType: "string", label: $localize`:Label for the phone number of a school:Phone Number` }, timing: { dataType: "string", label: $localize`:Label for the timing of a school:School Timing` }, remarks: { dataType: "string", label: $localize`:Label for the remarks for a school:Remarks` }, website: { dataType: "url", label: $localize`:Label for the website of a school:Website` } } }, "entity:HistoricalEntityData": { hasPII: true, attributes: { date: { dataType: "date", label: $localize`:Label for date of historical data:Date`, defaultValue: { mode: "dynamic", value: PLACEHOLDERS.NOW }, anonymize: "retain-anonymized" }, relatedEntity: { dataType: "entity", additional: "Child", entityReferenceRole: "composite", anonymize: "retain" }, isMotivatedDuringClass: { dataType: "configurable-enum", additional: "rating-answer", label: $localize`:Label for a child attribute:Motivated`, description: $localize`:Description for a child attribute:The child is motivated during the class.` }, isParticipatingInClass: { dataType: "configurable-enum", additional: "rating-answer", label: $localize`:Label for a child attribute:Participating`, description: $localize`:Description for a child attribute:The child is actively participating in the class.` }, isInteractingWithOthers: { dataType: "configurable-enum", additional: "rating-answer", label: $localize`:Label for a child attribute:Interacting`, description: $localize`:Description for a child attribute:The child interacts with other students during the class.` }, doesHomework: { dataType: "configurable-enum", additional: "rating-answer", label: $localize`:Label for a child attribute:Homework`, description: $localize`:Description for a child attribute:The child does its homework.` }, asksQuestions: { dataType: "configurable-enum", additional: "rating-answer", label: $localize`:Label for a child attribute:Asking Questions`, description: $localize`:Description for a child attribute:The child is asking questions during the class.` } } }, "entity:User": { toStringAttributes: ["name"], icon: "user", label: $localize`:label for entity:User`, labelPlural: $localize`:label (plural) for entity:Users`, hasPII: true, attributes: { name: { dataType: "string", label: $localize`:Label of user field:Name` }, phone: { dataType: "string", label: $localize`:Label of user field:Contact` } } }, "view:matching": { component: "MatchingEntities", config: { rightSide: { entityType: "School", prefilter: { privateSchool: true }, availableFilters: [{ id: "language" }] }, leftSide: { entityType: "Child" } } }, "appConfig:matching-entities": { columns: [ ["name", "name"], ["motherTongue", "language"], ["address", "address"], ["distance", "privateSchool"] ], onMatch: { newEntityType: ChildSchoolRelation.ENTITY_TYPE, newEntityMatchPropertyLeft: "childId", newEntityMatchPropertyRight: "schoolId", columnsToReview: ["start", "end", "result", "childId", "schoolId"] } }, "entity:Aser": { hasPII: true, attributes: { child: { dataType: "entity", additional: "Child", entityReferenceRole: "composite" }, date: { dataType: "date", label: $localize`:Label for date of the ASER results:Date`, defaultValue: { mode: "dynamic", value: PLACEHOLDERS.NOW }, anonymize: "retain-anonymized" }, hindi: { label: $localize`:Label of the Hindi ASER result:Hindi`, dataType: "configurable-enum", additional: "reading-levels" }, bengali: { label: $localize`:Label of the Bengali ASER result:Bengali`, dataType: "configurable-enum", additional: "reading-levels" }, english: { label: $localize`:Label of the English ASER result:English`, dataType: "configurable-enum", additional: "reading-levels" }, math: { label: $localize`:Label of the Math ASER result:Math`, dataType: "configurable-enum", additional: "math-levels" }, remarks: { dataType: "string", label: $localize`:Label for the remarks of a ASER result:Remarks` } } }, "entity:HealthCheck": { hasPII: true, attributes: { child: { dataType: "entity", additional: "Child", entityReferenceRole: "composite", anonymize: "retain" }, date: { dataType: "date", label: $localize`:Label for date of a health check:Date`, anonymize: "retain-anonymized", defaultValue: { mode: "dynamic", value: PLACEHOLDERS.NOW } }, height: { dataType: "number", label: $localize`:Label for height in cm of a health check:Height [cm]`, viewComponent: "DisplayUnit", additional: "cm" }, weight: { dataType: "number", label: $localize`:Label for weight in kg of a health check:Weight [kg]`, viewComponent: "DisplayUnit", additional: "kg" } } }, "entity:ChildSchoolRelation": { hasPII: true, attributes: { childId: { dataType: "entity", additional: "Child", entityReferenceRole: "composite", validators: { required: true }, anonymize: "retain", label: $localize`:Label for the child of a relation:Child` }, schoolId: { dataType: "entity", additional: "School", entityReferenceRole: "aggregate", validators: { required: true }, anonymize: "retain", label: $localize`:Label for the school of a relation:School` }, schoolClass: { dataType: "string", label: $localize`:Label for the class of a relation:Class`, anonymize: "retain" }, start: { dataType: "date-only", label: $localize`:Label for the start date of a relation:Start date`, description: $localize`:Description of the start date of a relation:The date a child joins a school`, anonymize: "retain" }, end: { dataType: "date-only", label: $localize`:Label for the end date of a relation:End date`, description: $localize`:Description of the end date of a relation:The date of a child leaving the school`, anonymize: "retain" }, result: { dataType: "percentage", label: $localize`:Label for the percentage result of a relation:Result`, validators: { min: 0, max: 100 } } } }, ...todoDefaultConfigs }

src/app/core/demo-data/demo-data.module.ts

demoDataGeneratorProviders
Type : []
Default value : [ ...DemoPermissionGeneratorService.provider(), ...DemoConfigGeneratorService.provider(), ...DemoSiteSettingsGeneratorService.provider(), ...DemoPublicFormGeneratorService.provider(), ...DemoUserGeneratorService.provider(), ...DemoConfigurableEnumGeneratorService.provider(), ...DemoChildGenerator.provider({ count: 120 }), ...DemoSchoolGenerator.provider({ count: 8 }), ...DemoChildSchoolRelationGenerator.provider(), ...DemoActivityGeneratorService.provider(), ...DemoActivityEventsGeneratorService.provider({ forNLastYears: 1 }), ...DemoNoteGeneratorService.provider({ minNotesPerChild: 2, maxNotesPerChild: 6, groupNotes: 3, }), ...DemoAserGeneratorService.provider(), ...DemoEducationalMaterialGeneratorService.provider({ minCount: 3, maxCount: 8, }), ...DemoHealthCheckGeneratorService.provider(), ...DemoProgressDashboardWidgetGeneratorService.provider(), ...DemoHistoricalDataGenerator.provider({ minCountAttributes: 2, maxCountAttributes: 5, }), ...DemoTodoGeneratorService.provider(), ...DemoReportConfigGeneratorService.provider(), ]

src/app/core/basic-datatypes/configurable-enum/configurable-enum-testing.ts

demoEnums
Default value : Object.entries({ genders: genders, materials: materials, "math-levels": mathLevels, "reading-levels": readingLevels, "warning-levels": warningLevels, "rating-answer": ratingAnswers, center: centersUnique, "attendance-status": defaultAttendanceStatusTypes, "interaction-type": defaultInteractionTypes, }).map(([key, value]) => { const e = new ConfigurableEnum(key); e.values = value; return e; })

src/app/features/reporting/demo-report-config-generator.service.ts

demoReports
Type : Partial[]
Default value : [ { title: $localize`:Name of a report:Basic Report`, aggregationDefinitions: [ { query: `Child:toArray[*isActive=true]`, label: $localize`:Label of report query:All children`, groupBy: ["gender"], }, { query: `School:toArray`, label: $localize`:Label for report query:All schools`, aggregations: [ { label: $localize`:Label for report query:Children attending a school`, query: `:getRelated(${ChildSchoolRelation.ENTITY_TYPE}, schoolId)[*isActive=true].childId:unique`, }, { label: $localize`:Label for report query:Governmental schools`, query: `[*privateSchool!=true]`, }, { query: `[*privateSchool!=true]:getRelated(${ChildSchoolRelation.ENTITY_TYPE}, schoolId)[*isActive=true].childId::unique:toEntities(Child)`, label: $localize`:Label for report query:Children attending a governmental school`, groupBy: ["gender"], }, { label: $localize`:Label for report query:Private schools`, query: `[*privateSchool=true]`, }, { query: `[*privateSchool=true]:getRelated(${ChildSchoolRelation.ENTITY_TYPE}, schoolId)[*isActive=true].childId::unique:toEntities(Child)`, label: $localize`:Label for report query:Children attending a private school`, groupBy: ["gender"], }, ], }, ], }, { title: $localize`:Name of a report:Event Report`, aggregationDefinitions: [ { query: `${EventNote.ENTITY_TYPE}:toArray[*date >= ? & date <= ?]`, groupBy: ["category"], label: $localize`:Label for a report query:Events`, aggregations: [ { query: `:getParticipantsWithAttendance(PRESENT):unique:toEntities(Child)`, groupBy: ["gender"], label: $localize`:Label for a report query:Participants`, }, ], }, ], }, { title: $localize`:Name of a report:Attendance Report`, mode: "exporting", aggregationDefinitions: [ { query: `${EventNote.ENTITY_TYPE}:toArray[* date >= ? & date <= ?]`, groupBy: { label: "Type", property: "category" }, subQueries: [ { query: ":getAttendanceArray:getAttendanceReport", subQueries: [ { label: $localize`:Name of a column of a report:Name`, query: `.participant:toEntities(Child).name`, }, { query: ".participant:toEntities(Child):getRelated(ChildSchoolRelation, childId)[*isActive=true]", subQueries: [ { label: "Class", query: ".schoolClass", }, { label: "School", query: ".schoolId:toEntities(School).name", }, ], }, { label: $localize`:Name of a column of a report:Total`, query: `total`, }, { label: $localize`:Name of a column of a report:Present`, query: `present`, }, { label: $localize`:Name of a column of a report:Rate`, query: `percentage`, }, { label: $localize`:Name of a column of a report:Late`, query: `detailedStatus.LATE`, }, ], }, ], }, ], }, { title: $localize`:Name of a report:Materials Distributed`, mode: "exporting", aggregationDefinitions: [ { query: `EducationalMaterial:toArray[*date >= ? & date <= ?]`, groupBy: { label: "Type", property: "materialType" }, subQueries: [ { label: "Number of events of handing out", query: `.materialAmount:count`, }, { label: "Total Items", query: `.materialAmount:sum`, }, ], }, ], }, ]

src/app/child-dev-project/children/demo-data-generators/fixtures/dropout-types.ts

dropoutTypes
Type : []
Default value : [ // multiple entries for the same value increase its probability $localize`:Dropout type:Finished School or Training`, $localize`:Dropout type:Dropout`, $localize`:Dropout type:Continues Education without project`, $localize`:Dropout type:Moved away`, ]

src/app/core/config/dynamic-components/dynamic-component.decorator.ts

DynamicComponent
Default value : (_name: string) => (_: ComponentType<any>) => undefined

Decorator to annotate a class that serves as dynamic component A dynamic component can be referenced from the config with the name defined on the decorator.

IMPORTANT: The component also needs to be added to the ...Components list of the respective module.

src/app/features/de-duplication/de-duplication-module.ts

dynamicComponents
Type : []
Default value : [ [ "BulkMergeRecordsComponent", () => import("./bulk-merge-records/bulk-merge-records.component").then( (c) => c.BulkMergeRecordsComponent, ), ], ]

src/app/features/public-form/public-form.module.ts

dynamicComponents
Type : []
Default value : [ [ "EditPublicFormColumns", () => import( "app/features/public-form/edit-public-form-columns/edit-public-form-columns.component" ).then((c) => c.EditPublicFormColumnsComponent), ], [ "EditPrefilledValuesComponent", () => import( "app/features/public-form/edit-prefilled-values/edit-prefilled-values.component" ).then((c) => c.EditPrefilledValuesComponent), ], [ "EditPublicformRoute", () => import( "app/features/public-form/edit-publicform-route/edit-publicform-route.component" ).then((c) => c.EditPublicformRouteComponent), ], ]
viewConfigs
Type : ViewConfig[]
Default value : [ // List View { _id: "view:" + PublicFormConfig.route, component: "EntityList", config: { entityType: PublicFormConfig.ENTITY_TYPE, columns: ["title", "description", "entity"], filters: [{ id: "entity" }], } as EntityListConfig, }, // Details View { _id: "view:" + PublicFormConfig.route + "/:id", component: "EntityDetails", config: { entityType: PublicFormConfig.ENTITY_TYPE, panels: [ { title: $localize`:PublicFormConfig admin form panel:General Setting`, components: [ { component: "Form", config: { fieldGroups: [ { fields: ["route", "title", "description"], }, { fields: [ { id: "permissions_remark", editComponent: "EditDescriptionOnly", label: $localize`:PublicFormConfig admin form:If you want external people filling this form without logging in, the _Permission System_ also has to allow **"public"** users to create new records of this type.<br> If you are seeing problems submitting the form, please contact your **technical support team**.`, }, "entity", "logo", ], }, ], }, }, ], }, { title: $localize`:PublicFormConfig admin form panel:Configure Fields`, components: [ { component: "Form", config: { fieldGroups: [ { fields: ["columns"], }, ], }, }, ], }, { title: $localize`:PublicFormConfig admin form panel:Configure Pre-filled Values`, components: [ { component: "Form", config: { fieldGroups: [ { fields: ["prefilledFields"], }, ], }, }, ], }, ], } as EntityDetailsConfig, }, ]

src/app/features/skill/skill.module.ts

dynamicComponents
Type : []
Default value : [ [ "EditExternalProfileLink", () => import( "./link-external-profile/edit-external-profile-link.component" ).then((c) => c.EditExternalProfileLinkComponent), ], [ "BulkLinkExternalProfiles", () => import( "./bulk-link-external-profiles/bulk-link-external-profiles.component" ).then((c) => c.BulkLinkExternalProfilesComponent), ], ]

src/app/features/template-export/template-export.module.ts

dynamicComponents
Type : []
Default value : [ [ "EditTemplateExportFile", () => import( "./template-export-file-datatype/edit-template-export-file.component" ).then((c) => c.EditTemplateExportFileComponent), ], ]
viewConfigs
Type : ViewConfig[]
Default value : [ // List View { _id: "view:" + TemplateExport.route, component: "EntityList", config: { entityType: TemplateExport.ENTITY_TYPE, columns: ["title", "description", "applicableForEntityTypes"], filters: [{ id: "applicableForEntityTypes" }], } as EntityListConfig, }, // Details View { _id: "view:" + TemplateExport.route + "/:id", component: "EntityDetails", config: { entityType: TemplateExport.ENTITY_TYPE, panels: [ { components: [ { component: "Form", config: { fieldGroups: [ { fields: [ "title", "description", "applicableForEntityTypes", ], }, { fields: [ { id: "template_explanation", editComponent: "EditDescriptionOnly", label: $localize`:TemplateExport:Upload a specially prepared template file here. The file can contain placeholders that will be replaced with actual data when a file is generated for a selected record. For example {d.name} will be replaced with the value in the "name" field of the given entity. See the documentation of the [carbone system](https://carbone.io/documentation.html#substitutions) for more information. The placeholder keys must match the field "Field ID" of the record data structure in Aam Digital. You can find this in the Admin UI form builder (Edit Data Structure -> Details View) and edit a specific field to view its details. Template files can be in most office document formats (odt, docx, ods, xlsx, odp, pptx) or PDF.`, }, "templateFile", "targetFileName", ], }, ], }, }, ], }, ], } as EntityDetailsConfig, }, ]

src/app/features/todos/todos.module.ts

dynamicComponents
Type : []
Default value : [ [ "TodoList", () => import("./todo-list/todo-list.component").then( (c) => c.TodoListComponent, ), ], [ "TodosRelatedToEntity", () => import( "./todos-related-to-entity/todos-related-to-entity.component" ).then((c) => c.TodosRelatedToEntityComponent), ], [ "TodosDashboard", () => import("./todos-dashboard/todos-dashboard.component").then( (c) => c.TodosDashboardComponent, ), ], [ "EditRecurringInterval", () => import( "./recurring-interval/edit-recurring-interval/edit-recurring-interval.component" ).then((c) => c.EditRecurringIntervalComponent), ], [ "DisplayRecurringInterval", () => import( "./recurring-interval/display-recurring-interval/display-recurring-interval.component" ).then((c) => c.DisplayRecurringIntervalComponent), ], [ "DisplayTodoCompletion", () => import( "./todo-completion/display-todo-completion/display-todo-completion.component" ).then((c) => c.DisplayTodoCompletionComponent), ], ]

src/app/features/file/edit-file/edit-file.component.ts

EditFileComponent_IMPORTS
Type : []
Default value : [ MatFormFieldModule, NgClass, MatInputModule, ReactiveFormsModule, MatTooltipModule, NgIf, MatButtonModule, FontAwesomeModule, ErrorHintComponent, ]

src/app/core/basic-datatypes/configurable-enum/configurable-enum.types.ts

EMPTY
Type : ConfigurableEnumValue
Default value : { id: "", label: "", }

src/app/core/permissions/ability/testing-entity-ability-factory.ts

entityAbilityFactory
Default value : ( entitySchemaService: EntitySchemaService, ) => { let ability = new EntityAbility(entitySchemaService); ability.update([{ subject: "all", action: "manage" }]); return ability; }

src/app/utils/storybook-base.module.ts

entityFormStorybookDefaultParameters
Type : object
Default value : { controls: { exclude: ["_columns", "_cols", "enumValueToString"], }, }

src/app/core/entity/database-entity.decorator.ts

entityRegistry
Default value : new EntityRegistry((key, constructor) => { if (!(new constructor() instanceof Entity)) { throw Error( `Tried to register an entity-type that is not a subclass of Entity\n` + `type: ${key}; constructor: ${constructor}`, ); } })

src/environments/environment.prod.ts

environment
Type : object
Default value : { production: true, appVersion: "0.0.0", // replaced automatically during docker build repositoryId: "Aam-Digital/ndb-core", remoteLoggingDsn: "https://bd6aba79ca514d35bb06a4b4e0c2a21e@sentry.io/1242399", demo_mode: true, session_type: SessionType.mock, account_url: "https://keycloak.aam-digital.net", email: undefined, DB_PROXY_PREFIX: "/db", API_PROXY_PREFIX: "/api", notificationsConfig: undefined, }

see environment.ts for explanations

src/environments/environment.ts

environment
Type : object
Default value : { production: false, appVersion: "0.0.0", // replaced automatically during docker build repositoryId: "Aam-Digital/ndb-core", remoteLoggingDsn: undefined, // only set for production mode in environment.prod.ts demo_mode: true, session_type: SessionType.mock, account_url: "https://aam.localhost/accounts-backend", email: undefined, /** Path for the reverse proxy that forwards to the database - configured in `default.conf` */ DB_PROXY_PREFIX: "/db", /** Path for the reverse proxy that forwards to backend services APIs - configured in `default.conf` */ API_PROXY_PREFIX: "/api", /** see FirebaseConfiguration and assets/firebase-config.json */ notificationsConfig: undefined, }

Central environment that allows to configure differences between a "dev" and a "prod" build. For deployments, the assets/config.json can be used to override these settings as well.

The file contents for the current environment will overwrite these during build. The build system defaults to the dev environment which uses environment.ts, but if you do ng build --env=prod then environment.prod.ts will be used instead. The list of which env maps to which file can be found in .angular-cli.json.

src/app/core/demo-data/faker.ts

faker
Default value : new CustomFaker(originalFaker) as Faker

(Extended) faker module

src/app/features/file/file-components.ts

fileComponents
Type : ComponentTuple[]
Default value : [ [ "EditFile", () => import("./edit-file/edit-file.component").then( (c) => c.EditFileComponent, ), ], [ "ViewFile", () => import("./view-file/view-file.component").then( (c) => c.ViewFileComponent, ), ], ]

src/app/features/todos/todo-list/todo-list.component.ts

filterCurrentlyActive
Type : FilterSelectionOption<Todo>
Default value : { key: "current", label: $localize`:Filter-option for todos:Currently Active`, filter: { $and: [ { completed: undefined }, { $or: [ { startDate: { $exists: false, }, }, { startDate: { $lte: moment().format("YYYY-MM-DD"), $gt: "", }, }, { deadline: { $lte: moment().format("YYYY-MM-DD"), $gt: "", }, }, ], }, ], } as DataFilter<Todo>, }

src/app/child-dev-project/children/model/genders.ts

genders
Type : ConfigurableEnumValue[]
Default value : [ { id: "", label: "", }, { id: "M", label: $localize`:Label gender:male`, }, { id: "F", label: $localize`:Label gender:female`, }, { id: "X", label: $localize`:Label gender:Non-binary/third gender`, }, ]

src/app/child-dev-project/children/demo-data-generators/health-check/height-weight.ts

heightRangeForAge
Default value : new Map<number, any>([ [2, { min: 78, max: 91 }], [2.5, { min: 83, max: 97 }], [3, { min: 86, max: 101 }], [3.5, { min: 89, max: 105 }], [4, { min: 93, max: 109 }], [4.5, { min: 96, max: 113 }], [5, { min: 99, max: 117 }], [5.5, { min: 102, max: 121 }], [6, { min: 105, max: 125 }], [6.5, { min: 108, max: 129 }], [7, { min: 111, max: 132 }], [7.5, { min: 114, max: 136 }], [8, { min: 116, max: 138 }], [8.5, { min: 119, max: 142 }], [9, { min: 121, max: 145 }], [9.5, { min: 123, max: 148 }], [10, { min: 125, max: 150 }], [10.5, { min: 127, max: 154 }], [11, { min: 130, max: 157 }], [11.5, { min: 133, max: 161 }], [12, { min: 136, max: 164 }], [12.5, { min: 140, max: 167 }], [13, { min: 144, max: 170 }], [13.5, { min: 146, max: 171 }], [14, { min: 148, max: 172 }], [14.5, { min: 148, max: 173 }], [15, { min: 150, max: 174 }], [15.5, { min: 152, max: 174 }], [16, { min: 154, max: 175 }], [16.5, { min: 156, max: 176 }], [17, { min: 158, max: 177 }], [17.5, { min: 158, max: 177 }], [18, { min: 158, max: 177 }], [18.5, { min: 158, max: 177 }], ])
weightRangeForAge
Default value : new Map<number, any>([ [2, { min: 10, max: 15 }], [2.5, { min: 10, max: 16 }], [3, { min: 11, max: 17 }], [3.5, { min: 11, max: 19 }], [4, { min: 12, max: 20 }], [4.5, { min: 13, max: 22 }], [5, { min: 14, max: 24 }], [5.5, { min: 15, max: 26 }], [6, { min: 15, max: 28 }], [6.5, { min: 16, max: 30 }], [7, { min: 17, max: 32 }], [7.5, { min: 18, max: 35 }], [8, { min: 19, max: 38 }], [8.5, { min: 20, max: 40 }], [9, { min: 21, max: 44 }], [9.5, { min: 22, max: 47 }], [10, { min: 23, max: 50 }], [10.5, { min: 25, max: 54 }], [11, { min: 26, max: 58 }], [11.5, { min: 28, max: 61 }], [12, { min: 29, max: 65 }], [12.5, { min: 31, max: 68 }], [13, { min: 33, max: 71 }], [13.5, { min: 34, max: 74 }], [14, { min: 36, max: 77 }], [14.5, { min: 38, max: 79 }], [15, { min: 40, max: 80 }], [15.5, { min: 42, max: 85 }], [16, { min: 44, max: 90 }], [16.5, { min: 46, max: 95 }], [17, { min: 48, max: 100 }], [17.5, { min: 48, max: 100 }], [18, { min: 48, max: 100 }], [18.5, { min: 48, max: 100 }], ])

src/app/core/common-components/fa-dynamic-icon/fa-dynamic-icon.component.ts

iconAliases
Type : miscellaneous
Default value : new Map<string, IconDefinition>([ ["calendar-check-o", faCalendarCheck], ["file-text", faFileAlt], ["question", faQuestionCircle], ["line-chart", faChartLine], ["calendar", faCalendarAlt], ["users", faUsers], ])

A map to prevent old configs to be broken

src/app/features/location/map-utils.ts

iconDefault
Default value : L.icon({ iconRetinaUrl, iconUrl, shadowUrl, iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], tooltipAnchor: [16, -28], shadowSize: [41, 41], })
iconRetinaUrl
Type : string
Default value : "assets/marker-icon-2x.png"
iconUrl
Type : string
Default value : "assets/marker-icon.png"
shadowUrl
Type : string
Default value : "assets/marker-shadow.png"

src/app/core/import/import/import-sample-raw-data.ts

IMPORT_SAMPLE_ADDITIONAL_ACTIONS
Type : AdditionalImportAction[]
Default value : [ /*{ type: "School", id: IMPORT_SAMPLE_LINKABLE_DATA.find((e) => e.getType() === "School").getId( true, ), }, { type: "RecurringActivity", id: IMPORT_SAMPLE_LINKABLE_DATA.find( (e) => e.getType() === "RecurringActivity", ).getId(), },*/ ]
IMPORT_SAMPLE_COLUMN_MAPPING
Type : ColumnMapping[]
Default value : Object.keys( IMPORT_SAMPLE_RAW_DATA[0], ).map((k) => ({ column: k, }))
IMPORT_SAMPLE_LINKABLE_DATA
Type : Entity[]
Default value : [ Object.assign(createEntityOfType("School"), { name: "Sample School" }), Object.assign(createEntityOfType("School"), { name: "ABCD School" }), RecurringActivity.create("Activity X"), RecurringActivity.create("Activity Y"), ]
IMPORT_SAMPLE_PREVIOUS_IMPORTS
Type : ImportMetadata[]
Default value : [ ImportMetadata.create({ created: { by: TEST_USER, at: new Date("2022-12-27") }, createdEntities: ["1", "2", "3"], config: { entityType: "Child", columnMapping: IMPORT_SAMPLE_COLUMN_MAPPING, }, }), ImportMetadata.create({ created: { by: TEST_USER, at: new Date("2023-01-04") }, createdEntities: ["1", "3"], config: { entityType: "School", columnMapping: [] }, }), ]
IMPORT_SAMPLE_RAW_DATA
Type : any[]
Default value : [ { name: "John Doe", birthDate: "2001-01-31", gender: "M", remarks: "foo bar", }, { name: "Jane Doe", birthDate: "2001-01-31", gender: "F", remarks: "abcde", }, ]

Sample raw data that can be used in Storybook and tests.

src/app/core/import/import.module.ts

importComponents
Type : ComponentTuple[]
Default value : [ [ "Import", () => import("./import/import.component").then((c) => c.ImportComponent), ], [ "DiscreteImportConfig", () => import( "../basic-datatypes/discrete/discrete-import-config/discrete-import-config.component" ).then((c) => c.DiscreteImportConfigComponent), ], [ "DateImportConfig", () => import( "../basic-datatypes/date/date-import-config/date-import-config.component" ).then((c) => c.DateImportConfigComponent), ], [ "EntityImportConfig", () => import( "../basic-datatypes/entity/entity-import-config/entity-import-config.component" ).then((c) => c.EntityImportConfigComponent), ], ]

src/app/child-dev-project/notes/model/interaction-type.interface.ts

INTERACTION_TYPE_CONFIG_ID
Type : string
Default value : "interaction-type"

ID of the Note category ConfigurableEnumValue in the config database.

src/app/core/entity-details/related-time-period-entities/related-time-period-entities.component.ts

isActiveIndicator
Type : FormFieldConfig
Default value : { id: "isActive", label: $localize`:Label for the currently active status|e.g. Currently active:Currently`, viewComponent: "ReadonlyFunction", hideFromTable: true, description: $localize`:Tooltip for the status of currently active or not:Only added to linked record if active. Change the start or end date to modify this status.`, additional: (csr: ChildSchoolRelation) => csr.isActive ? $localize`:Indication for the currently active status of an entry:active` : $localize`:Indication for the currently inactive status of an entry:not active`, }

src/app/child-dev-project/children/demo-data-generators/fixtures/languages.ts

languages
Type : []
Default value : [ // multiple entries for the same value increase its probability "Hindi", "Hindi", "Hindi", "Urdu", "Bengali", "Bengali", "", ]

src/app/utils/media/screen-size-observer.service.ts

LG
Type : string
Default value : "992px"
MD
Type : string
Default value : "768px"
MOBILE_THRESHOLD
Type : ScreenSize
Default value : ScreenSize.sm

The screen size where anything smaller and this size itself is considered mobile while anything strictly larger is considered desktop.

SM
Type : string
Default value : "576px"
XL
Type : string
Default value : "1200px"
XXL
Type : string
Default value : "1400px"

src/app/utils/di-tokens.ts

LOCATION_TOKEN
Default value : new InjectionToken<Location>( "Window location object", )
NAVIGATOR_TOKEN
Default value : new InjectionToken<Navigator>( "Window navigator object", )
WINDOW_TOKEN
Default value : new InjectionToken<Window>("Window object")

Use this instead of directly referencing the window object for better testability

src/app/features/location/location-components.ts

locationComponents
Type : ComponentTuple[]
Default value : [ [ "EditLocation", () => import("./edit-location/edit-location.component").then( (c) => c.EditLocationComponent, ), ], [ "ViewLocation", () => import("./view-location/view-location.component").then( (c) => c.ViewLocationComponent, ), ], [ "DisplayDistance", () => import("./view-distance/view-distance.component").then( (c) => c.ViewDistanceComponent, ), ], ]

src/app/core/logging/logging.service.ts

Logging
Type : miscellaneous
Default value : new LoggingService()

src/app/features/location/map-config.ts

MAP_CONFIG_KEY
Type : string
Default value : "appConfig:map"

src/app/features/matching-entities/matching-entities-components.ts

matchingEntitiesComponents
Type : ComponentTuple[]
Default value : [ [ "MatchingEntities", () => import("./matching-entities/matching-entities.component").then( (c) => c.MatchingEntitiesComponent, ), ], ]

src/app/child-dev-project/children/demo-data-generators/educational-material/materials.ts

materials
Type : ConfigurableEnumValue[]
Default value : [ { id: "OTHER", label: "", }, { id: "pencil", label: $localize`:Label school material:pencil`, }, { id: "eraser", label: $localize`:Label school material:eraser`, }, { id: "sharpener", label: $localize`:Label school material:sharpener`, }, { id: "pen (black)", label: $localize`:Label school material:pen (black)`, }, { id: "crayons", label: $localize`:Label school material:crayons`, }, { id: "copy (single line, big)", label: $localize`:Label school material:copy (single line, big)`, }, { id: "copy (four line)", label: $localize`:Label school material:copy (four line)`, }, { id: "copy (plain)", label: $localize`:Label school material:copy (plain)`, }, { id: "scrap book", label: $localize`:Label school material:scrap book`, }, { id: "exam board", label: $localize`:Label school material:exam board`, }, { id: "Bag", label: $localize`:Label school material:Bag`, color: "#B3E5FC", }, { id: "School Uniform", label: $localize`:Label school material:School Uniform`, color: "#B3E5FC", }, { id: "School Shoes", label: $localize`:Label school material:School Shoes`, color: "#B3E5FC", }, { id: "Sports Dress", label: $localize`:Label school material:Sports Dress`, color: "#B3E5FC", }, { id: "Sports Shoes", label: $localize`:Label school material:Sports Shoes`, color: "#B3E5FC", }, { id: "Raincoat", label: $localize`:Label school material:Raincoat`, color: "#B3E5FC", }, ]

src/app/child-dev-project/children/demo-data-generators/aser/skill-levels.ts

mathLevels
Type : ConfigurableEnumConfig<SkillLevel>
Default value : Ordering.imposeTotalOrdering([ EMPTY, { id: "Nothing", label: $localize`:Label math level:Nothing`, color: "#fd7272", }, { id: "Numbers 1-9", label: $localize`:Label math level:Numbers 1-9`, color: "#ff8153", }, { id: "Numbers 10-99", label: $localize`:Label math level:Numbers 10-99`, color: "#ff982a", }, { id: "Subtraction", label: $localize`:Label math level:Subtraction`, color: "#d2c92e", }, { id: "Division", label: $localize`:Label math level:Division`, passed: true, color: "#c8e6c9", }, ])
readingLevels
Type : ConfigurableEnumConfig<SkillLevel>
Default value : Ordering.imposeTotalOrdering([ EMPTY, { id: "Nothing", label: $localize`:Label reading level:Nothing`, color: "#fd7272", }, { id: "Read Letters", label: $localize`:Label reading level:Read Letters`, color: "#ff8153", }, { id: "Read Words", label: $localize`:Label reading level:Read Words`, color: "#ff982a", }, { id: "Read Sentence", label: $localize`:Label reading level:Read Sentence`, color: "#d2c92e", }, { id: "Read Paragraph", label: $localize`:Label reading level:Read Paragraph`, passed: true, color: "#90ee90", }, ])

src/app/core/language/TranslatableMatPaginator.ts

matRangeLabelIntl
Default value : (page: number, pageSize: number, length: number) => { if (length === 0 || pageSize === 0) { return $localize`:@@paginator.zeroRange:0 in ${length}`; } length = Math.max(length, 0); const startIndex = page * pageSize; // If the start index exceeds the list length, do not try and fix the end index to the end. const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize; return $localize`:@@paginator.rangeOfLabel:${ startIndex + 1 } - ${endIndex} of ${length}`; }

src/app/features/skill/skill-api/skill-api-mock.ts

mockSkillApi
Type : object
Default value : { getExternalProfiles: (): Observable<ExternalProfileResponseDto> => of({ pagination: { currentPage: 1, pageSize: 5, totalPages: 2, totalElements: 6, }, results: faker.helpers.multiple( () => createSkillApiDummyData(faker.string.numeric()), { count: { min: 0, max: 5 } }, ), }).pipe(delay(faker.number.int({ min: 500, max: 1500 }))), generateDefaultSearchParams: () => ({ fullName: "John Doe", }), getExternalProfileById: (id: string) => of(createSkillApiDummyData(id)).pipe( delay(faker.number.int({ min: 500, max: 1500 })), ), }

src/app/core/basic-datatypes/month/edit-month/edit-month.component.ts

MY_FORMATS
Type : object
Default value : { parse: { dateInput: "YYYY-MM", }, display: { dateInput: "YYYY-MM", monthYearLabel: "YYYY MMM", dateA11yLabel: "LL", monthYearA11yLabel: "YYYY MMMM", }, }

src/app/child-dev-project/notes/demo-data/notes_group-stories.ts

noteGroupStories
Type : []
Default value : [ { category: defaultInteractionTypes.find((t) => t.id === "GUARDIAN_MEETING"), warningLevel: warningLevels.find((level) => level.id === "OK"), subject: $localize`:Note demo subject:Guardians Meeting`, text: $localize`:Note demo text: Our regular monthly meeting. Find the agenda and minutes in our meeting folder. `, }, { category: defaultInteractionTypes.find((t) => t.id === "GUARDIAN_MEETING"), warningLevel: warningLevels.find((level) => level.id === "OK"), subject: $localize`:Note demo subject:Guardians Meeting`, text: $localize`:Note demo text: Our regular monthly meeting. Find the agenda and minutes in our meeting folder. `, }, { category: defaultInteractionTypes.find((t) => t.id === "COACHING_CLASS"), warningLevel: warningLevels.find((level) => level.id === "OK"), subject: $localize`:Note demo subject:Children Meeting`, text: $localize`:Note demo text: Our regular monthly meeting. Find the agenda and minutes in our meeting folder. `, }, { category: defaultInteractionTypes.find((t) => t.id === "COACHING_CLASS"), warningLevel: warningLevels.find((level) => level.id === "OK"), subject: $localize`:Note demo subject:Children Meeting`, text: $localize`:Note demo text: Our regular monthly meeting. Find the agenda and minutes in our meeting folder. `, }, { category: defaultInteractionTypes.find((t) => t.id === "COACHING_CLASS"), warningLevel: warningLevels.find((level) => level.id === "OK"), subject: $localize`:Note demo subject:Drug Prevention Workshop`, text: $localize`:Note demo text: Expert conducted a two day workshop on drug prevention. `, }, ]

src/app/child-dev-project/notes/demo-data/notes_individual-stories.ts

noteIndividualStories
Type : []
Default value : [ { category: defaultInteractionTypes.find((t) => t.id === "VISIT"), warningLevel: warningLevels.find((level) => level.id === "WARNING"), subject: $localize`:Note demo subject:Mother sick`, text: $localize`:Note demo text: Visited family after we heard that mother is seriously ill. She cannot get up. Children are taking care of housework. Told her to see doctor. We should follow up next week. `, }, { category: defaultInteractionTypes.find((t) => t.id === "GUARDIAN_TALK"), warningLevel: warningLevels.find((level) => level.id === "WARNING"), subject: $localize`:Note demo subject:Discussed school change`, text: $localize`:Note demo text: Discussed future of the child with the parents. They agree that changing school can be a good option. Will discuss further together with the child. `, }, { category: defaultInteractionTypes.find((t) => t.id === "GUARDIAN_TALK"), warningLevel: warningLevels.find((level) => level.id === "OK"), subject: $localize`:Note demo subject:Follow up for school absence`, text: $localize`:Note demo text: Called to ask for reason about absence. Mother made excuses but promised to send the child tomorrow. `, }, { category: defaultInteractionTypes.find((t) => t.id === "GUARDIAN_TALK"), warningLevel: warningLevels.find((level) => level.id === "OK"), subject: $localize`:Note demo subject:Absent because ill`, text: $localize`:Note demo text: Mother has called in the morning. Child cannot come to class because of fever. `, }, { category: defaultInteractionTypes.find((t) => t.id === "GUARDIAN_TALK"), warningLevel: warningLevels.find((level) => level.id === "URGENT"), subject: $localize`:Note demo subject:Absence without information`, text: $localize`:Note demo text: Child was not in school whole last week again. When calling the mother she didn't know about it. Need to follow up urgently to discuss with the child and the guardians. `, }, { category: defaultInteractionTypes.find((t) => t.id === "VISIT"), warningLevel: warningLevels.find((level) => level.id === "OK"), subject: $localize`:Note demo subject:School is happy about progress`, text: $localize`:Note demo text: Visited the school and talked to the class teacher and principal. They are happy about the progress and behaviour. `, }, { category: defaultInteractionTypes.find((t) => t.id === "VISIT"), warningLevel: warningLevels.find((level) => level.id === "WARNING"), subject: $localize`:Note demo subject:Needs to work more for school`, text: $localize`:Note demo text: Discussed the child's progress with coaching teacher. He is still a weak student and needs more support. We should consider arranging an extra class for him. Discuss next social worker meeting. `, }, { category: defaultInteractionTypes.find((t) => t.id === "INCIDENT"), warningLevel: warningLevels.find((level) => level.id === "URGENT"), subject: $localize`:Note demo subject:Fight at school`, text: $localize`:Note demo text: Principal called us today. Our student got into a fight and was suspended for a week. Need to follow up with the child and discuss the matter. `, }, { category: defaultInteractionTypes.find((t) => t.id === "INCIDENT"), warningLevel: warningLevels.find((level) => level.id === "OK"), subject: $localize`:Note demo subject:Special help for family`, text: $localize`:Note demo text: Since the father has lost his job the family is struggling to survive. After home visits and discussion in our team we decided to refer them to a special support programme. `, }, { category: defaultInteractionTypes.find((t) => t.id === "INCIDENT"), warningLevel: warningLevels.find((level) => level.id === "OK"), subject: $localize`:Note demo subject:Chance to repeat class`, text: $localize`:Note demo text: Child has failed this school year as she did not go to school regularly. After a long discussion with the child and her parents we agreed to support her to repeat the class and she promised to attend school regularly. `, }, { category: defaultInteractionTypes.find((t) => t.id === "NOTE"), warningLevel: warningLevels.find((level) => level.id === "WARNING"), subject: $localize`:Note demo subject:Distracted in class`, text: $localize`:Note demo text: Teacher has let us know that he is very unfocused during class these days. Discussed with him - there are a lot of problems in the family currently. `, }, { category: defaultInteractionTypes.find((t) => t.id === "NOTE"), warningLevel: warningLevels.find((level) => level.id === "WARNING"), subject: $localize`:Note demo subject:Disturbing class`, text: $localize`:Note demo text: She refused to listen to the teacher was disturbing the class. Did counselling session with her. `, }, ]

src/app/child-dev-project/notes/notes-components.ts

notesComponents
Type : ComponentTuple[]
Default value : [ [ "NotesManager", () => import("./notes-manager/notes-manager.component").then( (c) => c.NotesManagerComponent, ), ], [ "NoteAttendanceCountBlock", () => import( "./note-attendance-block/note-attendance-count-block.component" ).then((c) => c.NoteAttendanceCountBlockComponent), ], [ "NotesDashboard", () => import( "./dashboard-widgets/notes-dashboard/notes-dashboard.component" ).then((c) => c.NotesDashboardComponent), ], [ "NotesRelatedToEntity", () => import( "./notes-related-to-entity/notes-related-to-entity.component" ).then((c) => c.NotesRelatedToEntityComponent), ], [ "NotesOfChild", () => import( "./notes-related-to-entity/notes-related-to-entity.component" ).then((c) => c.NotesRelatedToEntityComponent), ], [ "ImportantNotesDashboard", () => import( "./dashboard-widgets/important-notes-dashboard/important-notes-dashboard.component" ).then((c) => c.ImportantNotesDashboardComponent), ], [ "ImportantNotesComponent", () => import( "./dashboard-widgets/important-notes-dashboard/important-notes-dashboard.component" ).then((c) => c.ImportantNotesDashboardComponent), ], [ "NoteDetails", () => import("./note-details/note-details.component").then( (c) => c.NoteDetailsComponent, ), ], ]

src/app/core/common-components/confirmation-dialog/confirmation-dialog/confirmation-dialog.component.ts

OkButton
Type : ConfirmationDialogButton[]
Default value : [ { text: $localize`:Confirmation dialog OK:OK`, click() { // Intentionally blank // To react to emissions from this button, use the `MatDialogRef.beforeClosed()` hook }, dialogResult: true, }, ]
YesNoButtons
Type : ConfirmationDialogButton[]
Default value : [ { text: $localize`:Confirmation dialog Yes:Yes`, click() { // Intentionally blank // To react to emissions from this button, use the `MatDialogRef.beforeClosed()` hook }, dialogResult: true, }, { text: $localize`:Confirmation dialog No:No`, click() { // Intentionally blank // To react to emissions from this button, use the `MatDialogRef.beforeClosed()` hook }, dialogResult: false, }, ]
YesNoCancelButtons
Type : ConfirmationDialogButton[]
Default value : [ { text: $localize`:Confirmation dialog Yes:Yes`, click() { // Intentionally blank // To react to emissions from this button, use the `MatDialogRef.beforeClosed()` hook }, dialogResult: true, }, { text: $localize`:Confirmation dialog No:No`, click() { // Intentionally blank // To react to emissions from this button, use the `MatDialogRef.beforeClosed()` hook }, dialogResult: false, }, { text: $localize`:Confirmation dialog Cancel:Cancel`, click() { // Intentionally blank // To react to emissions from this button, use the `MatDialogRef.beforeClosed()` hook }, dialogResult: undefined, }, ]

src/app/core/config/dynamic-routing/view-config.interface.ts

PREFIX_VIEW_CONFIG
Type : string
Default value : "view:"

The prefix which is used to find the ViewConfig's in the config file

src/app/child-dev-project/children/demo-data-generators/observations/rating-answers.ts

ratingAnswers
Default value : Ordering.imposeTotalOrdering([ { id: "notTrueAtAll", label: $localize`:Rating answer:not at all`, color: "rgba(253, 114, 114, 0.5)", }, { id: "rarelyTrue", label: $localize`:Rating answer:rarely`, color: "rgba(255, 165, 0, 0.5)", }, { id: "usuallyTrue", label: $localize`:Rating answer:usually`, color: "rgba(255, 242, 0, 0.5)", }, { id: "absolutelyTrue", label: $localize`:Rating answer:absolutely`, color: "rgba(144, 238, 144, 0.5)", }, { id: "noAnswerPossible", label: $localize`:Rating answer:N/A`, color: "#b0b0b0", }, ])

src/app/child-dev-project/children/demo-data-generators/fixtures/religions.ts

religions
Type : []
Default value : [ // multiple entries for the same value increase its probability $localize`:religion:Hindu`, $localize`:religion:Hindu`, $localize`:religion:Hindu`, $localize`:religion:Muslim`, $localize`:religion:Muslim`, $localize`:religion:Christian`, $localize`:religion:Sikh`, "", "", ]

src/app/features/reporting/report-config.ts

ReportEntity
Default value : ReportConfig as EntityConstructor<ReportEntity>

This allows the ReportEntity to also be used as a constructor or in the EntityMapper

src/app/features/reporting/reporting-components.ts

reportingComponents
Type : ComponentTuple[]
Default value : [ [ "Reporting", () => import("./reporting/reporting.component").then( (c) => c.ReportingComponent, ), ], ]

src/app/route-target.ts

RouteTarget
Default value : (_name: string) => (_) => undefined

Marks a class to be the target when routing. Use this by adding the annotation @RouteTarget("...") to a component. The name provided to the annotation can then be used in the configuration.

IMPORTANT: The component also needs to be added to the ...Components list of the respective module.

src/app/core/user/user.routing.ts

routing
Type : ModuleWithProviders<RouterModule>
Default value : RouterModule.forChild(routes)

RoutingModule for UserModule related routes. Separating these routes from the main AppModule routing allows lazy-loading of modules.

src/app/features/todos/model/demo-todo-generator.service.ts

stories
Type : Partial[]
Default value : [ { subject: $localize`:demo todo record:get signed agreement`, description: $localize`:demo todo record:We have fixed all the details but still have to put it in writing.`, }, { subject: $localize`:demo todo record:follow up`, description: $localize`:demo todo record:Call to follow up on the recent developments.`, }, { subject: $localize`:demo todo record:call family`, description: $localize`:demo todo record:Check about the latest incident.`, }, { subject: $localize`:demo todo record:plan career counselling`, description: $localize`:demo todo record:Personalized plan for the next discussion has to be prepared.`, }, ]

src/app/core/user/demo-user-generator.service.ts

TEST_USER
Type : string
Default value : "demo"

src/app/features/todos/recurring-interval/time-interval.ts

timeunitLabelMap
Type : Map<unitOfTime.Base, string>
Default value : new Map([ ...timeUnitsPrimary.map( (e) => [e.unit, e.label] as [unitOfTime.Base, string], ), // alternative spellings ["year", $localize`:time unit:years`], ["y", $localize`:time unit:years`], ["month", $localize`:time unit:months`], ["m", $localize`:time unit:months`], ["week", $localize`:time unit:weeks`], ["w", $localize`:time unit:weeks`], ["day", $localize`:time unit:days`], ["d", $localize`:time unit:days`], ])
timeUnitsPrimary
Type : literal type[]
Default value : [ { unit: "days", label: $localize`:time unit:days` }, { unit: "weeks", label: $localize`:time unit:weeks` }, { unit: "months", label: $localize`:time unit:months` }, { unit: "years", label: $localize`:time unit:years` }, ]

src/app/features/todos/model/todo-default-configs.ts

todoDefaultConfigs
Type : object
Default value : { // for "entity:Todo" see todo.ts DatabaseField annotations "view:todo": { component: "TodoList", config: { entityType: "Todo", columns: [ "deadline", "subject", "assignedTo", "startDate", "relatedEntities", ], filters: [ { id: "assignedTo" }, { id: "due-status", type: "prebuilt", }, ], }, }, }

src/app/core/analytics/usage-analytics-config.ts

USAGE_ANALYTICS_CONFIG_ID
Type : string
Default value : "appConfig:usage-analytics"

src/app/child-dev-project/warning-level.ts

warningLevels
Type : Ordering.EnumValue[]
Default value : Ordering.imposeTotalOrdering( [ { id: "", label: "", }, { id: "OK", label: $localize`:Label warning level:Solved`, }, { id: "WARNING", label: $localize`:Label warning level:Needs Follow-Up`, }, { id: "URGENT", label: $localize`:Label warning level:Urgent Follow-Up`, }, ], )

results matching ""

    No results matching ""