Hi @timo-thin-buffer,
The example is based on version 2025.06 (specifically Project Template version 202506.0.1). The idea is to replace the Add button in the default Person module from the PT with a Quick Access button that offers the option to open a new form or create a dummy document.
As a first step, I annotated the Add button that I wanted to replace in the Overview Model.
Next, I created a custom overview component, PersonOverview. How to do this is described in this section of the second task of the frontend tutorial.
To actually replace the Add button in this custom overview component, you need to customize its componentMap. One of the components there is the OverviewButton, which has the annotation from the Overview Model as its prop.
We can therefore check the annotation to identify which button we specifically want to customize.
For the other buttons, we simply return the OverviewButton from the default component map.
Otherwise, we return the QuickAccessButton widget. All the props (label, iconName, etc.) for the main action can be taken from the props of the OverviewButton we’re replacing.
This looks as follows:
import { ReactElement, ReactNode } from "react";
import { useSelector } from "react-redux";
import { CRUDViews } from "@com.mgmtp.a12.crud/crud-core";
import { View } from "@com.mgmtp.a12.client/client-core/lib/core/view";
import {
ComponentMap,
DefaultComponentMap
} from "@com.mgmtp.a12.overviewengine/overviewengine-core/lib/main/view/configuration/component-map";
import { QuickAccessButton } from "@com.mgmtp.a12.widgets/widgets-core";
import { Icon } from "@com.mgmtp.a12.widgets/widgets-core/lib/icon";
import type { ButtonProps } from "@com.mgmtp.a12.widgets/widgets-core/lib/button/index.js";
import { Button } from "@com.mgmtp.a12.widgets/widgets-core/lib/button/index.js";
import { LocaleSelectors } from "@com.mgmtp.a12.client/client-core/lib/core/locale";
import { RESOURCE_KEYS, useLocalizer } from "../../localization";
export default function PersonOverview(props: View): ReactElement {
const localizer = useLocalizer();
const locale = useSelector(LocaleSelectors.locale());
const componentMap: ComponentMap = {
...DefaultComponentMap,
OverviewButton(buttonProps) {
if (buttonProps.buttonModel.annotations?.some((annotation) => annotation.name === "add-overview-button")) {
const mainAction = ({ iconName, label, ...rest }: ButtonProps & { iconName?: string }): ReactNode => (
<Button
{...rest}
label={label}
icon={iconName && <Icon>{iconName}</Icon>}
title={!label && iconName ? iconName : undefined}
/>
);
const label = buttonProps.buttonModel.label?.find((label) => label.locale === locale.language)?.text;
const iconName = buttonProps.buttonModel.icon?.name;
const primary = buttonProps.buttonModel.primary;
return (
<QuickAccessButton
secondary
mainAction={mainAction({ label, iconName, primary })}
className="-u-margin-b-xs"
actionItems={[
{
text: localizer(RESOURCE_KEYS.application.person.overview.buttons.addNew),
graphic: <Icon>assignment_add</Icon>
},
{
text: localizer(RESOURCE_KEYS.application.person.overview.buttons.addDummy),
graphic: <Icon>group_add</Icon>
}
]}
/>
);
}
return <DefaultComponentMap.OverviewButton {...buttonProps} />;
}
};
return <CRUDViews.OverviewEngineView {...props} timeMode="24h" componentMap={componentMap} />;
}
Note: Here I’m using the CRUDViews.OverviewEngineView component, which is not actually intended for customization. I used it here to keep things simple for the scope of this training.
In a real project, however, OverviewEngineFactories.ViewComponent should be set up and used instead, as it is the component intended for customization. For more information, please refer to the CRUD documentation.
If you want to learn more about how to work with the componentMap (and widgetMap) to customize the Overview Engine, I recommend checking out the second task of the frontend tutorial, where this is explained in more detail.
But I hope this gives you a first impression. 
Let me know if you have any questions — and I’d be really interested to hear how this turns out for you and to see your solution if you come up with one!
Best regards,
Denise