Замена контрола добавления новой метки в карточке
Замена контрола добавления нового тега в карточке¶
Предположим, что нам требуется заменить в карточке определенного типа стандартную кнопку добавления тегов + на собственную кнопку Добавить тег.
Для этого создаем новую модель представления, реализующую интерфейс IAddTagControlViewModel:
import { InitializableViewModelBase } from '@tessa/ui';
import { ICardToolbarViewModel } from 'tessa/ui/cards';
import { IAddTagControlViewModel } from 'tessa/ui/tags/addTagButtonViewModel';
export class CustomAddTagButtonViewModel
extends InitializableViewModelBase
implements IAddTagControlViewModel
{
private _toolbar: ICardToolbarViewModel;
constructor(toolbar: ICardToolbarViewModel) {
super();
this._toolbar = toolbar;
}
get toolbar(): ICardToolbarViewModel {
return this._toolbar;
}
}```
Затем - новый react-компонент:
```ts
/* eslint-disable react/display-name */
import * as React from 'react';
import { observer } from 'mobx-react';
import { CustomAddTagButtonViewModel } from './abAddTagCustomButtonViewModel';
import { ButtonComponent } from 'ui/button/button';
import { DefaultEventHandlers } from 'ui/hooks/defaultEventHandlers';
import { useCallback } from 'react';
import { localize } from '@tessa/application';
type CustomAddTagButtonProps = {
viewModel: CustomAddTagButtonViewModel;
};
export const CustomAddTagButton = observer(
React.forwardRef<HTMLInputElement, CustomAddTagButtonProps>((props, _ref) => {
const { viewModel } = props;
const { toolbar } = viewModel;
const onClickHandler = useCallback(
async (e: React.MouseEvent) => {
DefaultEventHandlers.terminate(e);
await toolbar.executeClickAddTag();
},
[toolbar.clickAddTag]
);
if (!toolbar || !toolbar.isVisible) {
return null;
}
return (
<ButtonComponent
name="ab-add-tag-custom-button"
caption="Добавить тег"
tooltip={localize('$Tags_AddNew_Tooltip')}
onClick={onClickHandler}
/>
);
})
);
Добавляем регистрацию:
ComponentsRegistry.instance.register(CustomAddTagButtonViewModel, CustomAddTagButton);
Наконец, создаем расширение, которое подменит контрол для добавления тега в тулбаре карточки:
import { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';
import { extension } from '@tessa/application';
import { CustomAddTagButtonViewModel } from './abAddTagCustomButtonViewModel';
@extension({ name: 'AbAddTagCustomButtonExtension' })
export class AddTagCustomButtonDemoExtension extends CardUIExtension {
public initialized(context: ICardUIExtensionContext): void {
context.toolbar.rightTagControl = new CustomAddTagButtonViewModel(context.toolbar);
}
}
Теперь после регистрации нашего расширения для выбранного типа карточек мы увидим в правой части тулбара кастомную кнопку Добавить тег вместо стандартной.