actions |
Default value : [
"read",
"create",
"update",
"delete",
"manage", // Matches any actions
] as const
|
The list of action strings that can be used for permissions |
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 |
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. |
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),
],
]
|
LOCALE_ENUM_ID |
Type : string
|
Default value : "locales"
|
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])
|
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),
],
]
|
componentRegistry |
Default value : new ComponentRegistry()
|
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)`,
},
],
}
|
CONFLICT_RESOLUTION_STRATEGY |
Default value : new InjectionToken<ConflictResolutionStrategy>("ConflictResolutionStrategy")
|
Use this token to provide (and thereby register) custom implementations of ConflictResolutionStrategy.
|
conflictResolutionComponents |
Type : ComponentTuple[]
|
Default value : [
[
"ConflictResolution",
() =>
import(
"./conflict-resolution-list/conflict-resolution-list.component"
).then((c) => c.ConflictResolutionListComponent),
],
]
|
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,
),
],
]
|
DATE_FORMATS |
Type : MatDateFormats
|
Default value : {
parse: { dateInput: "l" },
display: MAT_NATIVE_DATE_FORMATS.display,
}
|
Extend MAT_NATIVE_DATE_FORMATS to also support parsing. |
DEFAULT_LANGUAGE |
Type : string
|
Default value : "en-US"
|
LANGUAGE_LOCAL_STORAGE_KEY |
Type : string
|
Default value : "locale"
|
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,
},
]
|
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,
},
]
|
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
}
|
dynamicComponents |
Type : []
|
Default value : [
[
"BulkMergeRecordsComponent",
() =>
import("./bulk-merge-records/bulk-merge-records.component").then(
(c) => c.BulkMergeRecordsComponent,
),
],
]
|
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,
},
]
|
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,
},
]
|
EMPTY |
Type : ConfigurableEnumValue
|
Default value : {
id: "",
label: "",
}
|
entityFormStorybookDefaultParameters |
Type : object
|
Default value : {
controls: {
exclude: ["_columns", "_cols", "enumValueToString"],
},
}
|
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 |
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 The file contents for the current environment will overwrite these during build.
The build system defaults to the dev environment which uses |
faker |
Default value : new CustomFaker(originalFaker) as Faker
|
(Extended) faker module |
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,
),
],
]
|
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>,
}
|
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`,
},
]
|
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"
|
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: [] },
}),
]
|
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),
],
]
|
INTERACTION_TYPE_CONFIG_ID |
Type : string
|
Default value : "interaction-type"
|
ID of the Note category ConfigurableEnumValue in the config database. |
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`,
}
|
languages |
Type : []
|
Default value : [
// multiple entries for the same value increase its probability
"Hindi",
"Hindi",
"Hindi",
"Urdu",
"Bengali",
"Bengali",
"",
]
|
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"
|
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 |
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,
),
],
]
|
Logging |
Type : miscellaneous
|
Default value : new LoggingService()
|
MAP_CONFIG_KEY |
Type : string
|
Default value : "appConfig:map"
|
matchingEntitiesComponents |
Type : ComponentTuple[]
|
Default value : [
[
"MatchingEntities",
() =>
import("./matching-entities/matching-entities.component").then(
(c) => c.MatchingEntitiesComponent,
),
],
]
|
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",
},
]
|
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 })),
),
}
|
MY_FORMATS |
Type : object
|
Default value : {
parse: {
dateInput: "YYYY-MM",
},
display: {
dateInput: "YYYY-MM",
monthYearLabel: "YYYY MMM",
dateA11yLabel: "LL",
monthYearA11yLabel: "YYYY MMMM",
},
}
|
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,
),
],
]
|
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,
},
]
|
PREFIX_VIEW_CONFIG |
Type : string
|
Default value : "view:"
|
The prefix which is used to find the ViewConfig's in the config file |
ReportEntity |
Default value : ReportConfig as EntityConstructor<ReportEntity>
|
This allows the |
reportingComponents |
Type : ComponentTuple[]
|
Default value : [
[
"Reporting",
() =>
import("./reporting/reporting.component").then(
(c) => c.ReportingComponent,
),
],
]
|
TEST_USER |
Type : string
|
Default value : "demo"
|
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",
},
],
},
},
}
|
USAGE_ANALYTICS_CONFIG_ID |
Type : string
|
Default value : "appConfig:usage-analytics"
|
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`,
},
],
)
|