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/default-config/default-activity-status.ts

ACTIVITY_STATUS_ENUM
Type : string
Default value : "activity-status"
defaultActivityStatus
Type : ConfigurableEnumValue[]
Default value : enums.find( (e) => e._id === "ConfigurableEnum:" + ACTIVITY_STATUS_ENUM, ).values

src/app/child-dev-project/notes/add-default-note-views.ts

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

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

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: "English (en)" }, { id: "de", label: "Deutsch / German (de)" }, { id: "fr", label: "Français / French (fr)" }, { id: "it", label: "Italiano / Italian (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 : enums.find( (e) => e._id === "ConfigurableEnum:center", ).values
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"

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
Default value : enumJson.values as AttendanceStatusType[]

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
Default value : enums.find( (e) => e._id === "ConfigurableEnum:" + INTERACTION_TYPE_CONFIG_ID, ).values as InteractionType[]

src/app/core/default-values/standard-default-value-strategies.ts

defaultValueStrategyProviders
Type : []
Default value : [ { provide: DefaultValueStrategy, useClass: StaticDefaultValueService, multi: true, }, { provide: DefaultValueStrategy, useClass: DynamicPlaceholderValueService, multi: true, }, { provide: DefaultValueStrategy, useClass: InheritedValueService, multi: true, }, { provide: DefaultValueStrategy, useClass: UpdatedFromReferencingEntityDefaultValueService, multi: true, }, ]

Standard default-value strategies that are used in the application. Add further providers to your modules or the AppModule to extend.

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

demoDataGeneratorProviders
Type : []
Default value : [ ...DemoPublicFormGeneratorService.provider(), ...DemoUserGeneratorService.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/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), ], [ "EditPublicFormRelatedEntitiesComponent", () => import( "app/features/public-form/edit-public-form-related-entities/edit-public-form-related-entities.component" ).then((c) => c.EditPublicFormRelatedEntitiesComponent), ], ]
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", "linkedEntity"], }, ], }, }, ], }, ], } 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", // add via config.json overwrite. Default DSN value will be removed in future remoteLoggingDsn: "https://bd6aba79ca514d35bb06a4b4e0c2a21e@sentry.io/1242399", demo_mode: true, session_type: SessionType.mock, email: undefined, userAdminApi: undefined, realm: 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, email: undefined, /** Keycloak API for user management */ userAdminApi: undefined, // loaded from `assets/keycloak.json` during bootstrap /** Keycloak realm for user management */ realm: undefined, // loaded from `assets/keycloak.json` during bootstrap /** 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({ locale: [en_IN, en], seed: 1 })

(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 : enumJson.values

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 : enums.find( (e) => e._id === "ConfigurableEnum:materials", ).values

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

mathLevels
Type : ConfigurableEnumConfig<SkillLevel>
Default value : enums.find( (e) => e._id === "ConfigurableEnum:math-levels", ).values
readingLevels
Type : ConfigurableEnumConfig<SkillLevel>
Default value : enums.find( (e) => e._id === "ConfigurableEnum:reading-levels", ).values

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/core/config/config.service.ts

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; }
migrateDefaultValue
Type : ConfigMigration
Default value : (key, configPart) => { if (key !== "defaultValue") { return configPart; } if (configPart?.mode === "inherited") { configPart.mode = "inherited-from-referenced-entity"; } if (!configPart.config) { configPart.config = {}; if (configPart.value) { configPart.config.value = configPart.value; delete configPart.value; } if (configPart.localAttribute) { configPart.config.localAttribute = configPart.localAttribute; delete configPart.localAttribute; } if (configPart.field) { configPart.config.field = configPart.field; delete configPart.field; } } return configPart; }

The DefaultValueConfig mode "inherited" has been renamed to "inherited-from-referenced-entity" and structure moved into a "config" subproperty.

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; }
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

migrateUserEntityAndPanels
Type : ConfigMigration
Default value : (key, configPart) => { if (key === "entity:User") { configPart.enableUserAccounts = true; } if (key === "view:user/:id") { configPart.config.panels = (configPart.config.panels || []).filter( (panel) => !panel.components?.some( (c: PanelComponent) => c.component === "UserSecurity", ), ); } return configPart; }

Migration to enable user account features by setting the enableUserAccounts flag and remove the UserSecurity panel from view:user/:id.

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), ], [ "ImportantNotesDashboard", () => 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
Type : ConfigurableEnumValue[]
Default value : enumJson.values

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 : enumJson.values

results matching ""

    No results matching ""