Бизнес-процессы

Добавление кнопки в заголовке карточки процесса

Точка расширения ProcessWorkflowCardAction используется для дополнительного контрола в заголовке модального окна карточки процесса.

Описание ProcessWorkflowCardAction:

type IProps = {
    processStore: ProcessCardStore;
    searchStore: ProcessSearchStore;
}

type Resolver = (processStore: ProcessCardStore) => boolean;

type Meta = {
    order: number;
};

export type UEProcessWorkflowCardAction = UeModuleBase<Resolver, Meta> & {
    component: ComponentType<IProps>;
};

Пример: кнопка удаления процесса:

type IProps  = {
    processStore: ProcessCardStore;
    searchStore: ProcessSearchStore;
}

@observer
export class RemoveButton extends React.Component<IProps, {}> {

    onDeleteProcess = () => {};

    override render () {
        return (
            <ButtonWithConfirmation
                leftIcon={'trash2'}
                title={'Удалить процесс?'}
                isMinimal={true}
                tooltipPlacement={PLACEMENT.LEFT}
                intent={INTENT.DANGER}
                onConfirm={this.onDeleteProcess}
                confirmationMessage={'Вы уверены?'}/>
        );
    }

}

export const removeProcessActionUe: UniverseUE.IUeMeta['ProcessWorkflowCardAction'] = {
    moduleId: 'ProcessWorkflowCardAction',
    active: true,
    system: false,
    meta: {
        order: 1
    },
    resolver: (store: ProcessCardStore) => {
        return true;
    },
    component: RemoveButton
};

ueModuleManager.addModule('ProcessWorkflowCardAction', removeProcessActionUe);

Добавление кнопки в таблице процессов

Точка расширения ProcessWorkflowRowAction используется для дополнительного контрола в таблице процессов (отображается при наведении на строку).

Описание ProcessWorkflowRowAction:

type IProps = {
    rowActionProps: RowActionsProps<SearchHit>;
    processStore: ProcessSearchStore;
}

type Resolver = (props: RowActionsProps<SearchHit>) => boolean;

type Meta = {
    order: number;
};

export type UEProcessWorkflowRowAction = UeModuleBase<Resolver, Meta> & {
    component: ComponentType<IProps>;
};

Пример: кнопка удаления процесса:

type IProps  = {
    rowActionProps: RowActionsProps<SearchHit>;
    processStore: ProcessSearchStore;
}

@observer
export class RemoveButton extends React.Component<IProps, {}> {

    onDeleteProcess = () => {};

    override render () {
        return (
            <ButtonWithConfirmation
                leftIcon={'trash2'}
                title={'Удалить процесс?'}
                isMinimal={true}
                tooltipPlacement={PLACEMENT.LEFT}
                intent={INTENT.DANGER}
                onConfirm={this.onDeleteProcess}
                confirmationMessage={'Вы уверены?'}/>
        );
    }

}

export const removeProcessActionUe: UniverseUE.IUeMeta['ProcessWorkflowRowAction'] = {
    moduleId: 'ProcessWorkflowRowAction',
    active: true,
    system: false,
    meta: {
        order: 1
    },
    resolver: (hit: RowActionsProps<SearchHit>) => {
        return true;
    },
    component: RemoveButton
};

ueModuleManager.addModule('ProcessWorkflowRowAction', removeProcessActionUe);

Добавление пунктов меню в "Создать задачу"

Точка расширения UETaskMenuItem предназначена для добавления пунктов меню у кнопки Создать задачу на странице задач.

Описание UETaskMenuItem:

type TaskMenuItemProps = {
    taskStore: TaskSearchStore<ITreeNodeModel<any>>;
}

type Resolver = (taskStore: TaskSearchStore<ITreeNodeModel<any>>) => boolean;

type Meta = {
    order: number;
};

export type UETaskMenuItem = UeModuleBase<Resolver, Meta> & {
    component: ComponentType<TaskMenuItemProps>;
};

Пример: пункт меню с названием SomeDropDownItemName, при нажатии на который появляется модальное окно.

@observer
class SomeComponent extends React.Component<IProps> {
    @observable
    isModalOpen = false;

    @action
    toggleModal = () => {
        this.isModalOpen = !this.isModalOpen;
    };

    override render () {
        const taskStore = this.props.taskStore;

        return (
            <>
                <DropDown.Item
                    onClick={this.toggleModal}
                >
                    {'SomeDropDownItemName'}
                </DropDown.Item>
                <Modal
                    isOpen={this.isModalOpen}
                    onClose={this.toggleModal}
                >
                    <>
                        {'someModalContent'}
                    </>
                </Modal>
            </>
        );
    }
}

export const someNewTaskMenuItemUE: UniverseUE.IUeMeta['TaskMenuItem'] =
    {
        moduleId: 'exampleUeModule1',
        active: true,
        system: false,
        meta: {
        order: 2
        },
        component: SomeComponent,
        resolver: (taskStore: TaskSearchStore<ITreeNodeModel<any>>) => {
            return true;
        }
    };

ueModuleManager.addModule('TaskMenuItem', someNewTaskMenuItemUE);

Фильтрация бизнес-процессов при публикации актива

Точка расширения AssignedProcessesFilter позволяет добавить дополнительную фильтрацию назначенных бизнес-процессов при публикации актива.

Описание AssignedProcessesFilter:

type Resolver = (cardStore: AbstractCardStore<IRecordEntity>) => boolean;

type Meta = {}

export type UEAssignedProcessesFilter = UeModuleBase<Resolver, Meta> & {
    fn: (processDefinition: ProcessDefinitionEE, cardStore: AssetCardEEStore, processSettingsStore: ProcessSettingsStore) => boolean;
};
  • fn - содержит функцию фильтрации бизнес-процессов.

  • processDefinition - текущий бизнес-процесс

  • cardStore - стор карточки записи

  • processSettingsStore - стор бизнес-процессов

Примечание

В случае если в результате фильтрации с помощью фильтра будет получен пустой результат, фильтрация не будет применена.

Пример: добавление кастомной функции фильтрации.

const assignedProcessFilterUE: UniverseUE.IUeMeta['AssignedProcessFilter'] = {
    moduleId: 'bpselection',
    active: true,
    system: false,
    meta: {},
    resolver: () => {
        return true;
    },
    fn: (item, cardStore) => true
};


ueModuleManager.addModule('AssignedProcessFilter', assignedProcessFilterUE);

Добавление виджетов в секцию "Описание" в карточке задачи

Точка расширения UETaskCardDescriptionWidget предназначена для добавления дополнительных виджетов в карточку задачи в секции Описание.

Описание UETaskCardDescriptionWidget:

export type ITaskCardDescriptionWidgetProps = {
    taskId: TaskId;
    taskCardStore: TaskCardStore;
    // Используется для запуска принудительной перезагруки виджета из карточки задачи
    // Если в вашем компоненте нужна такая перезагрука, вызовите props.registerWidgetReloader при монтировании
    // компонента, передав ему метод перезгруки вишего виджета, и сохраните результат.
    // Вызовите созраненный результат при размонитрованиии компонента
    registerWidgetReloader: (reloadWidget: () => Promise<unknown>) => () => void;
}

type Resolver = (taskId: TaskId, taskCardStore: TaskCardStore) => boolean;

type Meta = {
    order: number;
    column: 0 | 1;
};

export type UETaskCardDescriptionWidget = UeModuleBase<Resolver, Meta> & {
    component: ComponentType<ITaskCardDescriptionWidgetProps>;
};

Пример реализации UETaskCardDescriptionWidget:

class MyTasksWidget extends React.Component<ITaskCardDescriptionWidgetProps> {
    reloadDisposer;

    componentDidMount () {
        this.reloadDisposer = this.props.registerWidgetReloader(() => this.reloadWidgetData());
    }

    override componentWillUnmount () {
        this.reloadDisposer();
    }

    async reloadWidgetData () {
        ...
    }

    render () {
        ...
    }
}

ueModuleManager.addModule('TaskCardDescriptionWidget', {
    moduleId: 'myTaskCardDescriptionWidget',
    active: true,
    system: false,
    component: MyTasksWidget,
    meta: {
        column: 0,
        order: 10
    },
    resolver: () => {
        return true;
    }
});