├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .idea └── copyright │ └── Haulmont.xml ├── Dockerfile ├── LICENSE ├── README.md ├── build.gradle ├── docker-compose ├── .env ├── README.md ├── docker-compose-core.yaml └── docker-compose-full.yaml ├── etc └── spotbugs │ └── spotbugs-exclude-filter.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── img ├── engine-detail-view.png ├── engine-list-view.png ├── engine-state.png ├── incident-list-view.png ├── new-process-deployment-view.png ├── process-instance-detail-view.png ├── process-instance-list-view.png ├── process-list-view.png ├── role-assignments-view_1.png ├── role-assignments-view_2.png ├── start-process-dialog.png ├── user-detail-view.png ├── user-list-view.png └── user-task-list-view.png ├── settings.gradle └── src ├── main ├── frontend │ ├── index.html │ └── themes │ │ └── openbpm-control │ │ ├── img │ │ ├── background_vertical.svg │ │ ├── background_w1024_horizontal.svg │ │ ├── background_w1280_horizontal.svg │ │ ├── background_w1440_horizontal.svg │ │ └── background_w1920_horizontal.svg │ │ ├── openbpm-control.css │ │ ├── styles.css │ │ ├── theme.json │ │ ├── uicomponent │ │ ├── bordered-button.css │ │ ├── process-tooltip.css │ │ └── toggle-button-group.css │ │ └── view │ │ ├── about-product-view.css │ │ ├── all-tasks-view.css │ │ ├── dashboard-fragment.css │ │ ├── login-view.css │ │ ├── main-view-top-menu.css │ │ ├── main-view.css │ │ └── process-instance-detail-view.css ├── java │ └── io │ │ └── openbpm │ │ └── control │ │ ├── OpenBpmControlApplication.java │ │ ├── action │ │ ├── CopyComponentValueToClipboardAction.java │ │ ├── CopyEntityPropertyToClipboardAction.java │ │ └── TestEngineConnectionAction.java │ │ ├── configuration │ │ ├── CamundaFeignConfiguration.java │ │ ├── FeignFormatterRegister.java │ │ ├── SecurityConfiguration.java │ │ └── UiComponentRegistrationConfiguration.java │ │ ├── dto │ │ ├── ActivityIncidentData.java │ │ ├── BpmProcessDefinition.java │ │ └── DmnDecisionDefinition.java │ │ ├── entity │ │ ├── EngineConnectionCheckResult.java │ │ ├── ExternalTaskData.java │ │ ├── ProcessExecutionGraphEntry.java │ │ ├── User.java │ │ ├── UserTaskData.java │ │ ├── activity │ │ │ ├── ActivityInstanceTreeItem.java │ │ │ ├── ActivityShortData.java │ │ │ └── HistoricActivityInstanceData.java │ │ ├── dashboard │ │ │ ├── IncidentStatistics.java │ │ │ └── ProcessDefinitionStatistics.java │ │ ├── decisiondefinition │ │ │ └── DecisionDefinitionData.java │ │ ├── decisioninstance │ │ │ ├── HistoricDecisionInputInstanceShortData.java │ │ │ ├── HistoricDecisionInstanceShortData.java │ │ │ └── HistoricDecisionOutputInstanceShortData.java │ │ ├── deployment │ │ │ ├── DeploymentData.java │ │ │ ├── DeploymentProcessInstancesInfo.java │ │ │ ├── DeploymentResource.java │ │ │ ├── ResourceDeploymentReport.java │ │ │ ├── ResourceValidationError.java │ │ │ └── ValidationErrorType.java │ │ ├── engine │ │ │ ├── AuthType.java │ │ │ ├── BpmEngine.java │ │ │ └── EngineType.java │ │ ├── filter │ │ │ ├── ActivityFilter.java │ │ │ ├── DecisionDefinitionFilter.java │ │ │ ├── DecisionInstanceFilter.java │ │ │ ├── DeploymentFilter.java │ │ │ ├── ExternalTaskFilter.java │ │ │ ├── IncidentFilter.java │ │ │ ├── JobFilter.java │ │ │ ├── ProcessDefinitionFilter.java │ │ │ ├── ProcessInstanceFilter.java │ │ │ ├── UserTaskFilter.java │ │ │ └── VariableFilter.java │ │ ├── incident │ │ │ ├── HistoricIncidentData.java │ │ │ └── IncidentData.java │ │ ├── job │ │ │ ├── JobData.java │ │ │ └── JobDefinitionData.java │ │ ├── processdefinition │ │ │ ├── ProcessDefinitionData.java │ │ │ └── ProcessDefinitionState.java │ │ ├── processinstance │ │ │ ├── ProcessInstanceData.java │ │ │ └── ProcessInstanceState.java │ │ └── variable │ │ │ ├── CamundaVariableType.java │ │ │ ├── HistoricVariableInstanceData.java │ │ │ ├── ObjectTypeInfo.java │ │ │ ├── VariableInstanceData.java │ │ │ └── VariableValueInfo.java │ │ ├── event │ │ └── UserEngineSelectEvent.java │ │ ├── exception │ │ ├── EngineConnectionFailedException.java │ │ ├── EngineNotSelectedException.java │ │ ├── EngineResourceNotAvailableException.java │ │ ├── RemoteEngineParseException.java │ │ └── RemoteProcessEngineException.java │ │ ├── listener │ │ └── AuthenticationEventListener.java │ │ ├── mapper │ │ ├── ActivityMapper.java │ │ ├── DecisionDefinitionMapper.java │ │ ├── DecisionInstanceMapper.java │ │ ├── DeploymentMapper.java │ │ ├── DeploymentResourceMapper.java │ │ ├── ExternalTaskMapper.java │ │ ├── HistoryActivityMapper.java │ │ ├── IncidentMapper.java │ │ ├── JobMapper.java │ │ ├── ProcessDefinitionMapper.java │ │ ├── ProcessInstanceMapper.java │ │ ├── ProcessVariableMapper.java │ │ ├── TaskMapper.java │ │ └── VariableMapper.java │ │ ├── property │ │ ├── EngineConnectionCheckProperties.java │ │ ├── EngineProperties.java │ │ └── UiProperties.java │ │ ├── restsupport │ │ ├── DynamicEngineUrlRequestInterceptor.java │ │ ├── FeignClientCreationContext.java │ │ ├── FeignClientProvider.java │ │ ├── ObjectToStringConverter.java │ │ ├── OffsetDateTimeFormatter.java │ │ └── camunda │ │ │ ├── CamundaErrorResponse.java │ │ │ ├── CamundaFeignErrorDecoder.java │ │ │ ├── ParseExceptionResponse.java │ │ │ └── ResourceReport.java │ │ ├── security │ │ ├── DatabaseUserRepository.java │ │ ├── FullAccessRole.java │ │ └── UiMinimalRole.java │ │ ├── service │ │ ├── ItemListLoadContext.java │ │ ├── activity │ │ │ ├── ActivityLoadContext.java │ │ │ ├── ActivityService.java │ │ │ └── impl │ │ │ │ └── ActivityServiceImpl.java │ │ ├── dashboard │ │ │ ├── DashboardService.java │ │ │ └── impl │ │ │ │ └── DashboardServiceImpl.java │ │ ├── decisiondefinition │ │ │ ├── DecisionDefinitionLoadContext.java │ │ │ ├── DecisionDefinitionService.java │ │ │ └── impl │ │ │ │ ├── DecisionDefinitionQueryImpl.java │ │ │ │ └── DecisionDefinitionServiceImpl.java │ │ ├── decisioninstance │ │ │ ├── DecisionInstanceLoadContext.java │ │ │ ├── DecisionInstanceService.java │ │ │ └── impl │ │ │ │ ├── DecisionInstanceServiceImpl.java │ │ │ │ └── HistoricDecisionInstanceQueryImpl.java │ │ ├── deployment │ │ │ ├── DeploymentContext.java │ │ │ ├── DeploymentLoadContext.java │ │ │ ├── DeploymentService.java │ │ │ └── impl │ │ │ │ └── DeploymentServiceImpl.java │ │ ├── engine │ │ │ ├── EngineService.java │ │ │ ├── EngineUiService.java │ │ │ └── impl │ │ │ │ ├── EngineServiceImpl.java │ │ │ │ └── EngineUiServiceImpl.java │ │ ├── externaltask │ │ │ ├── ExternalTaskLoadContext.java │ │ │ ├── ExternalTaskService.java │ │ │ └── impl │ │ │ │ └── ExternalTaskServiceImpl.java │ │ ├── incident │ │ │ ├── IncidentLoadContext.java │ │ │ ├── IncidentService.java │ │ │ └── impl │ │ │ │ └── IncidentServiceImpl.java │ │ ├── job │ │ │ ├── JobLoadContext.java │ │ │ ├── JobService.java │ │ │ └── impl │ │ │ │ └── JobServiceImpl.java │ │ ├── processdefinition │ │ │ ├── ProcessDefinitionLoadContext.java │ │ │ ├── ProcessDefinitionService.java │ │ │ └── impl │ │ │ │ └── ProcessDefinitionServiceImpl.java │ │ ├── processinstance │ │ │ ├── MigrationService.java │ │ │ ├── ProcessInstanceLoadContext.java │ │ │ ├── ProcessInstanceService.java │ │ │ └── impl │ │ │ │ ├── MigrationServiceImpl.java │ │ │ │ └── ProcessInstanceServiceImpl.java │ │ ├── usertask │ │ │ ├── UserTaskLoadContext.java │ │ │ ├── UserTaskService.java │ │ │ └── impl │ │ │ │ └── UserTaskServiceImpl.java │ │ └── variable │ │ │ ├── VariableLoadContext.java │ │ │ ├── VariableService.java │ │ │ ├── VariableUtils.java │ │ │ └── impl │ │ │ └── VariableServiceImpl.java │ │ ├── uicomponent │ │ ├── ContainerDataGridHeaderFilter.java │ │ ├── spinner │ │ │ └── SpinnerLoader.java │ │ └── treedatagrid │ │ │ ├── NoClickTreeDataGridLoader.java │ │ │ └── NoClickTreeGrid.java │ │ ├── util │ │ ├── BpmParseUtil.java │ │ ├── EngineRestUtils.java │ │ └── QueryUtils.java │ │ └── view │ │ ├── AbstractResourceDeploymentView.java │ │ ├── about │ │ ├── AboutProductMetadata.java │ │ ├── AboutProductView.java │ │ ├── ExternalLinkFragment.java │ │ └── ProductInfoFragment.java │ │ ├── alltasks │ │ ├── AllTasksView.java │ │ ├── TaskKeyColumnFragment.java │ │ └── UserTaskStateFilterOption.java │ │ ├── bpmengine │ │ ├── BasicAuthFragment.java │ │ ├── BpmEngineDetailView.java │ │ ├── BpmEngineListActionsFragment.java │ │ ├── BpmEngineListView.java │ │ ├── BpmEngineNameColumnFragment.java │ │ └── HttpHeaderAuthFragment.java │ │ ├── bulktaskcomplete │ │ └── BulkTaskCompleteView.java │ │ ├── dashboard │ │ ├── DashboardCard.java │ │ ├── DashboardFragment.java │ │ ├── DeployedProcessesStatisticsCardFragment.java │ │ ├── ProcessInstanceStatisticsCardFragment.java │ │ ├── RecentActivityCardFragment.java │ │ ├── RunningInstancesAndIncidentsFragment.java │ │ └── UserTaskStatisticsCardFragment.java │ │ ├── decisiondefinition │ │ ├── DecisionDefinitionDetailView.java │ │ └── DecisionDefinitionListView.java │ │ ├── decisiondeployment │ │ ├── DecisionDeploymentConfirmContentFragment.java │ │ └── DecisionDeploymentView.java │ │ ├── decisioninstance │ │ ├── DecisionInstanceDetailView.java │ │ ├── DecisionInstancesFragment.java │ │ └── filter │ │ │ ├── ActivityIdHeaderFilter.java │ │ │ ├── EvaluationTimeHeaderFilter.java │ │ │ ├── ProcessDefinitionKeyHeaderFilter.java │ │ │ └── ProcessInstanceIdHeaderFilter.java │ │ ├── deploymentdata │ │ ├── BulkDeleteDeploymentView.java │ │ ├── DeleteDeploymentView.java │ │ ├── DeploymentDetailView.java │ │ ├── DeploymentListItemActionsFragment.java │ │ └── DeploymentListView.java │ │ ├── deploymenterror │ │ ├── DeploymentErrorDialogView.java │ │ ├── MainElementIdColumnFragment.java │ │ ├── ValidationErrorMessageColumnFragment.java │ │ ├── ValidationErrorTypeColumnFragment.java │ │ └── ValidationMessageTooltipFragment.java │ │ ├── engineconnectionsettings │ │ └── EngineConnectionSettingsView.java │ │ ├── event │ │ └── TitleUpdateEvent.java │ │ ├── externaltask │ │ ├── ExternalTaskDataDetailView.java │ │ └── ExternalTaskErrorDetailsView.java │ │ ├── historicactivityinstancedata │ │ └── HistoricActivityInstanceDataDetailView.java │ │ ├── historicincidentdata │ │ └── HistoricIncidentDataDetailView.java │ │ ├── historicvariableinstancedata │ │ └── HistoricVariableInstanceDataDetailView.java │ │ ├── incidentdata │ │ ├── IncidentDataDetailView.java │ │ ├── IncidentDataListView.java │ │ ├── IncidentHeaderFilter.java │ │ └── filter │ │ │ ├── ActivityHeaderFilter.java │ │ │ ├── IncidentTimestampHeaderFilter.java │ │ │ ├── IncidentTypeHeaderFilter.java │ │ │ ├── MessageHeaderFilter.java │ │ │ ├── ProcessHeaderFilter.java │ │ │ └── ProcessInstanceIdHeaderFilter.java │ │ ├── incidentsstatistics │ │ └── IncidentsStatisticsView.java │ │ ├── job │ │ ├── JobDataDetailView.java │ │ └── JobErrorDetailsView.java │ │ ├── login │ │ └── LoginView.java │ │ ├── main │ │ ├── EngineStatusBadgeFragment.java │ │ └── MainView.java │ │ ├── newprocessdeployment │ │ ├── DeploymentConfirmContentFragment.java │ │ └── NewProcessDeploymentView.java │ │ ├── processdefinition │ │ ├── ActivateProcessDefinitionView.java │ │ ├── BulkActivateProcessDefinitionView.java │ │ ├── BulkDeleteProcessDefinitionView.java │ │ ├── BulkSuspendProcessDefinitionView.java │ │ ├── DeleteProcessDefinitionView.java │ │ ├── ProcessDefinitionActionsFragment.java │ │ ├── ProcessDefinitionBulkOperationView.java │ │ ├── ProcessDefinitionDetailView.java │ │ ├── ProcessDefinitionDiagramView.java │ │ ├── ProcessDefinitionListItemActionsFragment.java │ │ ├── ProcessDefinitionListView.java │ │ ├── ProcessInstancesFragment.java │ │ └── SuspendProcessDefinitionView.java │ │ ├── processdefinitionsstatistics │ │ └── RunningProcessesStatisticsView.java │ │ ├── processinstance │ │ ├── BulkTerminateProcessInstanceView.java │ │ ├── LazyTabContent.java │ │ ├── ProcessInstanceDetailView.java │ │ ├── ProcessInstanceListItemActionsFragment.java │ │ ├── ProcessInstanceListParamBinder.java │ │ ├── ProcessInstanceListView.java │ │ ├── ProcessInstanceStateColumnFragment.java │ │ ├── ProcessInstanceViewMode.java │ │ ├── event │ │ │ ├── ExternalTaskCountUpdateEvent.java │ │ │ ├── ExternalTaskRetriesUpdateEvent.java │ │ │ ├── HistoryActivityCountUpdateEvent.java │ │ │ ├── HistoryIncidentCountUpdateEvent.java │ │ │ ├── HistoryUserTaskCountUpdateEvent.java │ │ │ ├── HistoryVariableCountUpdateEvent.java │ │ │ ├── IncidentCountUpdateEvent.java │ │ │ ├── IncidentUpdateEvent.java │ │ │ ├── JobCountUpdateEvent.java │ │ │ ├── JobRetriesUpdateEvent.java │ │ │ └── UserTaskCountUpdateEvent.java │ │ ├── filter │ │ │ ├── BusinessKeyHeaderFilter.java │ │ │ ├── EndTimeHeaderFilter.java │ │ │ ├── IdHeaderFilter.java │ │ │ ├── ProcessHeaderFilter.java │ │ │ ├── ProcessInstanceDataGridHeaderFilter.java │ │ │ ├── ProcessInstanceStateHeaderFilter.java │ │ │ └── StartTimeHeaderFilter.java │ │ ├── generalpanel │ │ │ └── GeneralPanelFragment.java │ │ ├── history │ │ │ ├── ActivitiesTabFragment.java │ │ │ ├── HasRefresh.java │ │ │ ├── HistoryIncidentsTabFragment.java │ │ │ ├── HistoryTabFragment.java │ │ │ ├── HistoryUserTasksTabFragment.java │ │ │ └── HistoryVariablesTabFragment.java │ │ └── runtime │ │ │ ├── ExternalTasksTabFragment.java │ │ │ ├── JobsTabFragment.java │ │ │ ├── RuntimeIncidentsTabFragment.java │ │ │ ├── RuntimeTabFragment.java │ │ │ └── RuntimeUserTasksTabFragment.java │ │ ├── processinstancemigration │ │ └── ProcessInstanceMigrationView.java │ │ ├── processvariable │ │ └── VariableInstanceDataDetail.java │ │ ├── startprocess │ │ └── StartProcessWithVariableView.java │ │ ├── taskreassign │ │ └── TaskReassignView.java │ │ ├── user │ │ ├── UserDetailView.java │ │ └── UserListView.java │ │ ├── usertaskdata │ │ └── UserTaskDataDetailView.java │ │ └── util │ │ ├── ComponentHelper.java │ │ └── JsUtils.java └── resources │ ├── META-INF │ └── resources │ │ ├── etc │ │ ├── about-product-metadata-de.json │ │ ├── about-product-metadata-es.json │ │ ├── about-product-metadata-ru.json │ │ └── about-product-metadata.json │ │ └── icons │ │ ├── logo.png │ │ ├── logo.svg │ │ └── preview.svg │ ├── application.properties │ └── io │ └── openbpm │ └── control │ ├── control-ui-components.xsd │ ├── liquibase │ ├── changelog.xml │ └── changelog │ │ ├── 2024 │ │ └── 11 │ │ │ └── 001-init-bpm-engine-table.xml │ │ └── 010-init-user.xml │ ├── menu.xml │ ├── messages_de.properties │ ├── messages_en.properties │ ├── messages_es.properties │ ├── messages_ru.properties │ └── view │ ├── about │ ├── about-product-view.xml │ ├── external-link-fragment.xml │ └── product-info-fragment.xml │ ├── alltasks │ ├── all-tasks-view.xml │ └── task-key-column-fragment.xml │ ├── bpmengine │ ├── basic-auth-fragment.xml │ ├── bpm-engine-detail-view.xml │ ├── bpm-engine-list-actions-fragment.xml │ ├── bpm-engine-list-view.xml │ ├── bpm-engine-name-column-fragment.xml │ └── http-header-auth-fragment.xml │ ├── bulktaskcomplete │ └── bulk-task-complete-view.xml │ ├── dashboard │ ├── dashboard-fragment.xml │ ├── deployed-processes-statistics-card-fragment.xml │ ├── process-instance-statistics-card-fragment.xml │ ├── recent-activity-card-fragment.xml │ ├── running-instances-and-incidents-fragment.xml │ └── user-task-statistics-card-fragment.xml │ ├── decisiondefinition │ ├── decision-definition-detail-view.xml │ └── decision-definition-list-view.xml │ ├── decisiondeployment │ ├── decision-deployment-confirm-content-fragment.xml │ └── decision-deployment-view.xml │ ├── decisioninstance │ ├── decision-instance-detail-view.xml │ └── decision-instances-fragment.xml │ ├── deploymentdata │ ├── bulk-delete-deployment-view.xml │ ├── delete-deployment-view.xml │ ├── deployment-detail-view.xml │ ├── deployment-list-item-actions-fragment.xml │ └── deployment-list-view.xml │ ├── deploymenterror │ ├── deployment-error-dialog-view.xml │ ├── main-element-id-column-fragment.xml │ ├── validation-error-message-column-fragment.xml │ ├── validation-error-type-column-fragment.xml │ └── validation-message-tooltip-fragment.xml │ ├── engineconnectionsettings │ └── engine-connection-settings-view.xml │ ├── externaltask │ ├── external-task-data-detail-view.xml │ └── external-task-error-details-view.xml │ ├── historicactivityinstancedata │ └── historic-activity-instance-data-detail-view.xml │ ├── historicincidentdata │ └── historic-incident-data-detail-view.xml │ ├── historicvariableinstancedata │ └── historic-variable-instance-data-detail-view.xml │ ├── incidentdata │ ├── incident-data-detail-view.xml │ └── incident-data-list-view.xml │ ├── incidentsstatistics │ └── incidents-statistics-view.xml │ ├── job │ ├── job-data-detail-view.xml │ └── job-error-details-view.xml │ ├── login │ └── login-view.xml │ ├── main │ ├── engine-status-badge-fragment.xml │ └── main-view.xml │ ├── newprocessdeployment │ ├── deployment-confirm-content-fragment.xml │ └── new-process-deployment-view.xml │ ├── processdefinition │ ├── activate-process-definition-view.xml │ ├── bulk-activate-process-definition-view.xml │ ├── bulk-delete-process-definition-view.xml │ ├── bulk-suspend-process-definition-view.xml │ ├── delete-process-definition-view.xml │ ├── process-definition-actions-fragment.xml │ ├── process-definition-detail-view.xml │ ├── process-definition-diagram-view.xml │ ├── process-definition-list-item-actions-fragment.xml │ ├── process-definition-list-view.xml │ ├── process-instances-fragment.xml │ └── suspend-process-definition-view.xml │ ├── processdefinitionsstatistics │ └── running-processes-statistics-view.xml │ ├── processinstance │ ├── bulk-terminate-process-instance-view.xml │ ├── generalpanel │ │ └── general-panel-fragment.xml │ ├── history │ │ ├── activities-tab-fragment.xml │ │ ├── history-incidents-tab-fragment.xml │ │ ├── history-tab-fragment.xml │ │ ├── history-user-tasks-tab-fragment.xml │ │ └── history-variables-tab-fragment.xml │ ├── process-instance-detail-view.xml │ ├── process-instance-list-item-actions-fragment.xml │ ├── process-instance-list-view.xml │ ├── process-instance-state-column-fragment.xml │ └── runtime │ │ ├── external-tasks-tab-fragment.xml │ │ ├── jobs-tab-fragment.xml │ │ ├── runtime-incident-tab-fragment.xml │ │ ├── runtime-tab-fragment.xml │ │ └── runtime-user-tasks-tab-fragment.xml │ ├── processinstancemigration │ └── process-instance-migration-view.xml │ ├── processvariable │ └── variable-instance-data-detail.xml │ ├── startprocess │ └── start-process-with-variable-view.xml │ ├── taskreassign │ └── task-reassign-view.xml │ ├── user │ ├── user-detail-view.xml │ └── user-list-view.xml │ └── usertaskdata │ └── user-task-data-detail-view.xml └── test ├── java └── io │ └── openbpm │ └── control │ ├── service │ ├── deployment │ │ └── Camunda7DeploymentServiceTest.java │ ├── engine │ │ ├── EngineUiServiceBasicAuthTest.java │ │ └── EngineUiServiceTest.java │ ├── externaltask │ │ ├── Camunda7ExternalTaskServiceFindAllTest.java │ │ └── Camunda7ExternalTaskServiceTest.java │ ├── incident │ │ ├── Camunda7IncidentServiceFindAllTest.java │ │ └── Camunda7IncidentServiceTest.java │ ├── job │ │ ├── Camunda7JobServiceFindAllTest.java │ │ └── Camunda7JobServiceTest.java │ ├── processdefinition │ │ ├── Camunda7ProcessDefinitionActivateTest.java │ │ ├── Camunda7ProcessDefinitionDeleteTest.java │ │ ├── Camunda7ProcessDefinitionFindAllTest.java │ │ ├── Camunda7ProcessDefinitionServiceTest.java │ │ └── Camunda7ProcessDefinitionSuspendTest.java │ ├── processinstance │ │ ├── Camunda7ProcessInstanceActivateTest.java │ │ ├── Camunda7ProcessInstanceFindAllTest.java │ │ ├── Camunda7ProcessInstanceServiceTest.java │ │ ├── Camunda7ProcessInstanceStartTest.java │ │ ├── Camunda7ProcessInstanceSuspendTest.java │ │ └── Camunda7ProcessInstanceTerminateTest.java │ ├── usertask │ │ ├── Camunda7UserTaskCompleteTest.java │ │ ├── Camunda7UserTaskFindAllTest.java │ │ ├── Camunda7UserTaskServiceTest.java │ │ └── Camunda7UserTaskSetAssigneeTest.java │ └── variable │ │ ├── Camunda7VariableServiceFindAllTest.java │ │ └── Camunda7VariableServiceTest.java │ ├── test_support │ ├── AbstractIntegrationTest.java │ ├── AuthenticatedAsAdmin.java │ ├── BasicAuthenticationCondition.java │ ├── Constants.java │ ├── ControlEngineTestingProperties.java │ ├── EnabledOnBasicAuthentication.java │ ├── EnabledOnEngine.java │ ├── EngineDataCleaner.java │ ├── EngineTestContainerRestHelper.java │ ├── EngineTypeCondition.java │ ├── OpenBpmControlTestConfiguration.java │ ├── RunningEngine.java │ ├── RunningEngineExtension.java │ ├── WithRunningEngine.java │ ├── camunda7 │ │ ├── AbstractCamunda7IntegrationTest.java │ │ ├── Camunda7Container.java │ │ ├── CamundaDataCleaner.java │ │ ├── CamundaRestTestHelper.java │ │ ├── CamundaRunContainer.java │ │ ├── CamundaSampleDataManager.java │ │ ├── OperatonContainer.java │ │ └── dto │ │ │ ├── IdDto.java │ │ │ ├── request │ │ │ ├── CompleteUserTaskDto.java │ │ │ ├── HandleFailureDto.java │ │ │ ├── SetJobRetriesDto.java │ │ │ ├── StartProcessDto.java │ │ │ ├── SuspendInstancesRequestDto.java │ │ │ ├── SuspendProcessRequestDto.java │ │ │ ├── SuspendRequestDto.java │ │ │ └── VariableValueDto.java │ │ │ └── response │ │ │ ├── BpmnXmlDto.java │ │ │ ├── CountResultDto.java │ │ │ ├── DeploymentDto.java │ │ │ ├── DeploymentResultDto.java │ │ │ ├── ExternalTaskDto.java │ │ │ ├── HistoricDetailDto.java │ │ │ ├── HistoricIncidentDto.java │ │ │ ├── HistoricProcessInstanceDto.java │ │ │ ├── HistoricUserTaskDto.java │ │ │ ├── JobDto.java │ │ │ ├── ProcessDefinitionDto.java │ │ │ ├── ProcessVariablesMapDto.java │ │ │ ├── RuntimeIncidentDto.java │ │ │ ├── RuntimeProcessInstanceDto.java │ │ │ ├── RuntimeUserTaskDto.java │ │ │ └── VariableInstanceDto.java │ └── testcontainers │ │ ├── ContainerWrapper.java │ │ └── EngineContainer.java │ └── user │ ├── UserTest.java │ └── UserUiTest.java └── resources ├── application-test.properties └── test_support ├── contractApproval.bpmn ├── supportRequest.bpmn ├── testCompletedInstance.bpmn ├── testDeployInvalidBpmnXml.bpmn ├── testExternalTaskRetriesUpdate.bpmn ├── testExternalTasksListLoad.bpmn ├── testFailedExternalTask.bpmn ├── testFailedJobIncident.bpmn ├── testJobRetriesUpdate.bpmn ├── testJobsListLoad.bpmn ├── testMultipleFailedJobIncidents.bpmn ├── testResolvedFailedJobIncident.bpmn ├── testTimerJob.bpmn ├── testUpdateVariable.bpmn ├── testUserTaskVariable.bpmn ├── testUserTaskWithAssignee.bpmn ├── testUserTaskWithoutAssignee.bpmn ├── testVisitPlanningV1.bpmn ├── testVisitPlanningV2.bpmn └── vacationApproval.bpmn /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ### Environment 11 | 12 | Version: 13 | 14 | ### Bug Description 15 | 16 | A description of what the bug is. 17 | 18 | ### Steps To Reproduce 19 | 20 | Steps to reproduce the behavior. 21 | 22 | ### Current Behavior 23 | 24 | A description of what actually happens. If there is an error message in the application log, please provide the full stacktrace. 25 | 26 | ### Expected Behavior 27 | 28 | A description of what you expected to happen. 29 | 30 | ### Additional context (Optional) 31 | Add any other context about the problem here. 32 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Feature Description 11 | 12 | Describe a new feature or enhancement you would like to see in OpenBPM Control. Explain how you envision the implementation of this feature and use cases where this feature would be beneficial. 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .jmix 2 | 3 | .gradle 4 | build/ 5 | !gradle/wrapper/gradle-wrapper.jar 6 | !**/src/main/** 7 | !**/src/test/** 8 | 9 | src/main/bundles/ 10 | 11 | ### IntelliJ IDEA ### 12 | .idea/* 13 | !.idea/encodings.xml 14 | *.iws 15 | *.iml 16 | *.ipr 17 | out/ 18 | /target/ 19 | 20 | ### VS Code ### 21 | .vscode/ 22 | 23 | # The following files are generated/updated by vaadin-gradle-plugin 24 | node_modules/ 25 | src/main/frontend/generated/ 26 | pnpmfile.js 27 | vite.generated.ts 28 | webpack.generated.js 29 | 30 | .DS_Store -------------------------------------------------------------------------------- /.idea/copyright/Haulmont.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) Haulmont 2024. All Rights Reserved. 3 | # Use is subject to license terms. 4 | # 5 | 6 | FROM amazoncorretto:21.0.3 AS layers 7 | 8 | COPY build/libs/*.jar app.jar 9 | 10 | ENTRYPOINT ["java","-Dcom.sun.net.ssl.checkRevocation=false","-jar","/app.jar"] -------------------------------------------------------------------------------- /docker-compose/.env: -------------------------------------------------------------------------------- 1 | ## OpenBPM Control configuration ## 2 | 3 | # Port where OpenBPM Control web application is running 4 | OPENBPM_CONTROL_SERVER_PORT=8081 5 | 6 | # Configuration of the database used by OpenBPM control web application 7 | # Note: if the values are changed, don't forget to remove the previous Docker volumes 8 | OPENBPM_CONTROL_DB_NAME=openbpm-control 9 | OPENBPM_CONTROL_DB_USERNAME=root 10 | OPENBPM_CONTROL_DB_PASSWORD=root 11 | 12 | # Credentials that are set by default on login form 13 | OPENBPM_CONTROL_UI_DEFAULT_USERNAME= 14 | OPENBPM_CONTROL_UI_DEFAULT_PASSWORD= 15 | 16 | ## Camunda 7 configuration ## 17 | 18 | # Docker image version 19 | CAMUNDA_RUN_VERSION=7.22.0 20 | 21 | # Port where Camunda is running 22 | CAMUNDA7_SERVER_PORT=8082 23 | 24 | # Configuration of the database used by Camunda 7 25 | # Note: if the values are changed, don't forget to remove the previous Docker volumes 26 | CAMUNDA7_DB_NAME=camunda7-run 27 | CAMUNDA7_DB_USERNAME=root 28 | CAMUNDA7_DB_PASSWORD=root 29 | 30 | # Admin credentials to log in to Camunda 7 31 | CAMUNDA7_UI_ADMIN_USERNAME=admin 32 | CAMUNDA7_UI_ADMIN_PASSWORD=admin 33 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) Haulmont 2024. All Rights Reserved. 3 | # Use is subject to license terms. 4 | # 5 | hilla.active=false 6 | bomVersion=1.0.0-SNAPSHOT -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /img/engine-detail-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/engine-detail-view.png -------------------------------------------------------------------------------- /img/engine-list-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/engine-list-view.png -------------------------------------------------------------------------------- /img/engine-state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/engine-state.png -------------------------------------------------------------------------------- /img/incident-list-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/incident-list-view.png -------------------------------------------------------------------------------- /img/new-process-deployment-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/new-process-deployment-view.png -------------------------------------------------------------------------------- /img/process-instance-detail-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/process-instance-detail-view.png -------------------------------------------------------------------------------- /img/process-instance-list-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/process-instance-list-view.png -------------------------------------------------------------------------------- /img/process-list-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/process-list-view.png -------------------------------------------------------------------------------- /img/role-assignments-view_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/role-assignments-view_1.png -------------------------------------------------------------------------------- /img/role-assignments-view_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/role-assignments-view_2.png -------------------------------------------------------------------------------- /img/start-process-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/start-process-dialog.png -------------------------------------------------------------------------------- /img/user-detail-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/user-detail-view.png -------------------------------------------------------------------------------- /img/user-list-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/user-list-view.png -------------------------------------------------------------------------------- /img/user-task-list-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/img/user-task-list-view.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | rootProject.name = 'openbpm-control' 7 | -------------------------------------------------------------------------------- /src/main/frontend/index.html: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 19 | 20 | 21 | 28 | 29 | 30 | 31 | 32 |
33 | 34 | 35 | -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/openbpm-control.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | :host { 7 | pointer-events: none; 8 | } 9 | 10 | html { 11 | --bpmn-history-activity-color: rgba(162, 224, 172, 0.45); 12 | --dashboard-background-color: hsla(214, 61%, 25%, 0.02); 13 | --toggle-button-border-color: rgba(61, 114, 214, 0.8); 14 | } 15 | 16 | [part="toggle"] { 17 | pointer-events: auto; 18 | } 19 | 20 | .suspended-state-small-icon { 21 | padding: calc(var(--lumo-space-xs) + 0.15rem); 22 | } 23 | 24 | .bordered-container { 25 | padding: 0; 26 | border: 1px var(--lumo-utility-border-style, solid) var(--lumo-utility-border-color, var(--lumo-contrast-20pct)); 27 | border-radius: var(--lumo-border-radius-l); 28 | } 29 | 30 | .sticky-buttons-bottom-panel { 31 | position: sticky; 32 | bottom: 0; 33 | background-color: var(--lumo-base-color); 34 | } 35 | 36 | .no-click-tree-grid vaadin-grid-cell-content { 37 | display: flex; 38 | align-items: center; 39 | } 40 | 41 | .no-click-tree-item-name { 42 | text-overflow: ellipsis; 43 | overflow: hidden; 44 | } 45 | 46 | vaadin-grid::part(multiline-text-cell) { 47 | white-space: pre-wrap; 48 | } 49 | 50 | [theme~='badge'][theme~='warning'] { 51 | color: var(--lumo-warning-text-color); 52 | background-color: var(--lumo-warning-color-10pct); 53 | } 54 | 55 | vaadin-grid::part(error-cell) { 56 | background-color: var(--lumo-error-color-10pct); 57 | } 58 | 59 | vaadin-button[theme~='badge'][theme~='has-icon'] { 60 | padding-block: 0.2em; 61 | } 62 | 63 | vaadin-button[theme~='badge'][theme~='has-icon'] vaadin-icon { 64 | margin-left: 0; 65 | margin-block: 0; 66 | } 67 | -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | @import url('./openbpm-control.css'); 7 | @import url('view/about-product-view.css'); 8 | @import url('view/main-view.css'); 9 | @import url('view/main-view-top-menu.css'); 10 | @import url('view/login-view.css'); 11 | @import url('view/dashboard-fragment.css'); 12 | @import url('view/all-tasks-view.css'); 13 | @import url('view/process-instance-detail-view.css'); 14 | @import url('uicomponent/toggle-button-group.css'); 15 | @import url('uicomponent/bordered-button.css'); 16 | @import url('uicomponent/process-tooltip.css'); -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/theme.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "openbpm", 3 | "lumoImports": [ 4 | "typography", 5 | "color", 6 | "spacing", 7 | "badge", 8 | "utility" 9 | ] 10 | } -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/uicomponent/bordered-button.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | .bordered-button { 7 | border: 1px var(--lumo-utility-border-style, solid) var(--lumo-utility-border-color, var(--lumo-contrast-10pct)); 8 | } 9 | 10 | .bordered-button:active { 11 | border: 1px var(--lumo-utility-border-style, solid) var(--lumo-utility-border-color, var(--lumo-contrast-30pct)); 12 | } 13 | 14 | .bordered-button:hover { 15 | border: 1px var(--lumo-utility-border-style, solid) var(--lumo-utility-border-color, var(--lumo-contrast-20pct)); 16 | } 17 | 18 | .bordered-button:focus { 19 | border: 1px var(--lumo-utility-border-style, solid) var(--lumo-utility-border-color, var(--lumo-contrast-20pct)); 20 | } -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/uicomponent/process-tooltip.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | .process-tooltip::part(content) { 7 | font-size: medium; 8 | white-space: pre; 9 | font-weight: 500; 10 | max-width: 30em; 11 | } 12 | 13 | .process-tooltip::part(overlay) { 14 | font-size: medium; 15 | min-width: min-content; 16 | } -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/uicomponent/toggle-button-group.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | .toggle-button-group > vaadin-button { 7 | min-width: 9em; 8 | border-color: var(--toggle-button-border-color); 9 | } 10 | 11 | .toggle-button-group > :nth-child(1) { 12 | border-radius: 1em 0 0 1em; 13 | } 14 | 15 | .toggle-button-group > vaadin-button:last-child { 16 | border-radius: 0 1em 1em 0; 17 | } -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/view/about-product-view.css: -------------------------------------------------------------------------------- 1 | @media (min-width: 640px) { 2 | .product-version-container { 3 | height: 100%; 4 | } 5 | .root-grid { 6 | column-gap: 0!important; 7 | } 8 | } 9 | 10 | @media (min-width: 768px) { 11 | .product-version-container { 12 | height: 100%; 13 | } 14 | .root-grid { 15 | column-gap: 0!important; 16 | } 17 | } 18 | 19 | @media (min-width: 1024px) { 20 | .product-version-container { 21 | height: min-content; 22 | } 23 | .root-grid { 24 | column-gap: var(--lumo-space-m)!important; 25 | } 26 | } 27 | 28 | .external-link-arrow-icon { 29 | transform: rotate(45deg); 30 | } -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/view/all-tasks-view.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | .user-tasks-filter-count-badge { 7 | position: relative; 8 | display: flex; 9 | border-radius: 50%; 10 | z-index: 1; 11 | left: -0.75em; 12 | background-color: var(--lumo-contrast); 13 | color: var(--lumo-primary-contrast-color); 14 | } 15 | 16 | .user-tasks-filter-container { 17 | width: min-content; 18 | border: 1px var(--lumo-utility-border-style, solid) var(--lumo-utility-border-color, var(--lumo-contrast-20pct)); 19 | border-radius: var(--lumo-border-radius-l); 20 | box-shadow: 0 0 6px 2px var(--lumo-shade-20pct); 21 | gap: var(--lumo-space-m); 22 | padding: var(--lumo-space-m); 23 | height: max-content; 24 | min-height: 95%; 25 | min-width: 20.5em; 26 | } 27 | 28 | .user-tasks-filter-button-container { 29 | display: inline-flex; 30 | align-items: self-start; 31 | justify-content: flex-start; 32 | min-height: inherit; 33 | text-shadow: inherit; 34 | position: relative; 35 | } -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/view/main-view-top-menu.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | vaadin-app-layout.jmix-main-view-top-menu-app-layout::part(navbar) { 7 | min-height: 0; 8 | border-bottom: 0; 9 | } 10 | 11 | .jmix-main-view-top-menu-navigation-bar-box { 12 | padding: 0; 13 | gap: 0; 14 | width: 100%; 15 | } 16 | 17 | .jmix-main-view-top-menu-navigation { 18 | display: flex; 19 | flex-grow: 1; 20 | overflow: auto; 21 | } 22 | 23 | .jmix-main-view-top-menu-header { 24 | display: flex; 25 | align-items: center; 26 | width: 100%; 27 | border-bottom: 1px solid var(--lumo-contrast-10pct) 28 | } 29 | 30 | .jmix-main-view-top-menu-logo-container { 31 | display: flex; 32 | margin: 0 var(--lumo-space-m); 33 | } 34 | 35 | .jmix-main-view-top-menu-logo { 36 | width: var(--lumo-size-m); 37 | height: var(--lumo-size-m); 38 | } 39 | 40 | .jmix-main-view-top-menu-user-box { 41 | align-self: flex-end; 42 | align-items: center; 43 | margin: 0 var(--lumo-space-m); 44 | max-width: 20em; 45 | } 46 | 47 | .jmix-main-view-top-menu-view-header-box { 48 | border-bottom: 1px solid var(--lumo-contrast-10pct); 49 | padding: 0; 50 | width: 100%; 51 | } 52 | 53 | .jmix-main-view-top-menu-view-title { 54 | font-size: var(--lumo-font-size-l); 55 | margin: var(--lumo-space-s) var(--lumo-space-m); 56 | } 57 | 58 | -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/view/main-view.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | .jmix-main-view-header { 7 | box-sizing: border-box; 8 | display: flex; 9 | height: var(--lumo-size-xl); 10 | align-items: center; 11 | width: 100%; 12 | } 13 | 14 | .jmix-main-view-drawer-toggle { 15 | color: var(--lumo-secondary-text-color); 16 | } 17 | 18 | .jmix-main-view-title { 19 | margin: 0; 20 | font-size: var(--lumo-font-size-l); 21 | } 22 | 23 | .jmix-main-view-section { 24 | display: flex; 25 | flex-direction: column; 26 | align-items: stretch; 27 | max-height: 100%; 28 | min-height: 100%; 29 | } 30 | 31 | .jmix-main-view-application-title { 32 | display: flex; 33 | align-items: center; 34 | height: var(--lumo-size-xl); 35 | margin: 0; 36 | padding-left: var(--lumo-space-m); 37 | padding-right: var(--lumo-space-m); 38 | font-size: var(--lumo-font-size-m); 39 | } 40 | 41 | .jmix-main-view-application-title-base-link { 42 | color: var(--lumo-header-text-color); 43 | } 44 | 45 | .jmix-main-view-application-title-base-link:hover { 46 | text-decoration: none; 47 | } 48 | 49 | .jmix-main-view-navigation { 50 | display: flex; 51 | flex-direction: column; 52 | border-bottom: 1px solid; 53 | border-color: var(--lumo-contrast-10pct); 54 | flex-grow: 1; 55 | overflow: auto; 56 | } 57 | 58 | .jmix-main-view-footer { 59 | display: flex; 60 | align-items: center; 61 | margin-bottom: var(--lumo-space-s); 62 | margin-top: var(--lumo-space-s); 63 | padding: var(--lumo-space-xs) var(--lumo-space-m); 64 | gap: var(--lumo-space-m); 65 | } 66 | 67 | .jmix-main-view-footer .jmix-user-indicator { 68 | flex-grow: 1; 69 | } 70 | 71 | 72 | .logo-icon { 73 | width: 1.85em; 74 | height: 1.85em; 75 | } -------------------------------------------------------------------------------- /src/main/frontend/themes/openbpm-control/view/process-instance-detail-view.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | .instance-details-actions-panel { 7 | border-radius: inherit; 8 | } 9 | 10 | .process-instance-slide-panel { 11 | padding: var(--lumo-space-xs); 12 | } 13 | 14 | .process-instance-properties-panel { 15 | box-shadow: -4px 4px 6px -2px var(--lumo-shade-40pct); 16 | } 17 | 18 | .process-instance-details-diagram-box { 19 | overflow: hidden; 20 | padding: var(--lumo-space-xs); 21 | } 22 | 23 | .activity-instances-tree thead#header { 24 | display: none; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/configuration/FeignFormatterRegister.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.configuration; 7 | 8 | import io.openbpm.control.restsupport.OffsetDateTimeFormatter; 9 | import org.springframework.cloud.openfeign.FeignFormatterRegistrar; 10 | import org.springframework.context.annotation.Configuration; 11 | import org.springframework.format.FormatterRegistry; 12 | 13 | @Configuration 14 | public class FeignFormatterRegister implements FeignFormatterRegistrar { 15 | 16 | @Override 17 | public void registerFormatters(FormatterRegistry registry) { 18 | registry.addFormatter(new OffsetDateTimeFormatter()); 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/configuration/SecurityConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.configuration; 2 | 3 | import io.jmix.core.JmixSecurityFilterChainOrder; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.core.annotation.Order; 7 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 8 | import org.springframework.security.web.SecurityFilterChain; 9 | 10 | @Configuration 11 | public class SecurityConfiguration { 12 | 13 | @Bean 14 | @Order(JmixSecurityFilterChainOrder.CUSTOM) 15 | public SecurityFilterChain actuatorFilterChain(HttpSecurity http) throws Exception { 16 | http.securityMatcher("/actuator/**") 17 | .authorizeHttpRequests((authorize) -> authorize.requestMatchers("/actuator/**").permitAll()); 18 | 19 | return http.build(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/configuration/UiComponentRegistrationConfiguration.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.configuration; 7 | 8 | import io.openbpm.control.uicomponent.spinner.SpinnerLoader; 9 | import io.openbpm.control.uicomponent.treedatagrid.NoClickTreeDataGridLoader; 10 | import io.openbpm.control.uicomponent.treedatagrid.NoClickTreeGrid; 11 | import io.jmix.flowui.sys.registration.ComponentRegistration; 12 | import io.jmix.flowui.sys.registration.ComponentRegistrationBuilder; 13 | import org.springframework.context.annotation.Bean; 14 | import org.springframework.context.annotation.Configuration; 15 | import org.vaadin.addons.componentfactory.spinner.Spinner; 16 | 17 | @Configuration 18 | public class UiComponentRegistrationConfiguration { 19 | 20 | @Bean 21 | public ComponentRegistration noClickTreeDataGrid() { 22 | return ComponentRegistrationBuilder.create(NoClickTreeGrid.class) 23 | .withComponentLoader("noClickTreeDataGrid", NoClickTreeDataGridLoader.class) 24 | .build(); 25 | } 26 | 27 | @Bean 28 | public ComponentRegistration spinner() { 29 | return ComponentRegistrationBuilder.create(Spinner.class) 30 | .withComponentLoader("spinner", SpinnerLoader.class) 31 | .build(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/dto/ActivityIncidentData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.dto; 7 | 8 | import io.openbpm.uikit.component.bpmnviewer.model.ElementIncidentData; 9 | import lombok.AllArgsConstructor; 10 | import lombok.Getter; 11 | import lombok.NoArgsConstructor; 12 | import lombok.Setter; 13 | 14 | @Getter 15 | @Setter 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | public class ActivityIncidentData implements ElementIncidentData { 19 | private String elementId; 20 | private Integer incidentCount; 21 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/dto/BpmProcessDefinition.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.dto; 7 | 8 | import lombok.Getter; 9 | import lombok.Setter; 10 | 11 | @Getter 12 | @Setter 13 | public class BpmProcessDefinition { 14 | private String key; 15 | private String name; 16 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/dto/DmnDecisionDefinition.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.dto; 7 | 8 | import lombok.Getter; 9 | import lombok.Setter; 10 | 11 | @Getter 12 | @Setter 13 | public class DmnDecisionDefinition { 14 | private String key; 15 | private String name; 16 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/EngineConnectionCheckResult.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.UUID; 13 | 14 | @JmixEntity 15 | public class EngineConnectionCheckResult { 16 | @JmixGeneratedValue 17 | @JmixId 18 | protected UUID id; 19 | 20 | protected Boolean success; 21 | 22 | protected String version; 23 | 24 | public String getVersion() { 25 | return version; 26 | } 27 | 28 | public void setVersion(String version) { 29 | this.version = version; 30 | } 31 | 32 | public Boolean getSuccess() { 33 | return success; 34 | } 35 | 36 | public void setSuccess(Boolean success) { 37 | this.success = success; 38 | } 39 | 40 | public UUID getId() { 41 | return id; 42 | } 43 | 44 | public void setId(UUID id) { 45 | this.id = id; 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/ProcessExecutionGraphEntry.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.time.LocalDate; 13 | import java.util.UUID; 14 | 15 | @JmixEntity 16 | public class ProcessExecutionGraphEntry { 17 | @JmixGeneratedValue 18 | @JmixId 19 | protected UUID id; 20 | 21 | protected Long completedInstancesCount = 0L; 22 | 23 | protected Long startedInstancesCount = 0L; 24 | 25 | protected LocalDate date; 26 | 27 | public LocalDate getDate() { 28 | return date; 29 | } 30 | 31 | public void setDate(LocalDate date) { 32 | this.date = date; 33 | } 34 | 35 | public Long getStartedInstancesCount() { 36 | return startedInstancesCount; 37 | } 38 | 39 | public void setStartedInstancesCount(Long startedInstancesCount) { 40 | this.startedInstancesCount = startedInstancesCount; 41 | } 42 | 43 | public Long getCompletedInstancesCount() { 44 | return completedInstancesCount; 45 | } 46 | 47 | public void setCompletedInstancesCount(Long completedInstancesCount) { 48 | this.completedInstancesCount = completedInstancesCount; 49 | } 50 | 51 | public UUID getId() { 52 | return id; 53 | } 54 | 55 | public void setId(UUID id) { 56 | this.id = id; 57 | } 58 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/activity/ActivityShortData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.activity; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.InstanceName; 11 | import io.jmix.core.metamodel.annotation.JmixEntity; 12 | import io.jmix.core.metamodel.annotation.JmixProperty; 13 | 14 | import java.util.UUID; 15 | 16 | 17 | @JmixEntity 18 | public class ActivityShortData { 19 | @JmixProperty(mandatory = true) 20 | @JmixGeneratedValue 21 | @JmixId 22 | protected UUID id; 23 | 24 | protected String internalId; 25 | 26 | protected String activityId; 27 | 28 | @InstanceName 29 | protected String activityName; 30 | 31 | protected String activityType; 32 | 33 | public UUID getId() { 34 | return id; 35 | } 36 | 37 | public void setId(UUID id) { 38 | this.id = id; 39 | } 40 | 41 | public String getInternalId() { 42 | return internalId; 43 | } 44 | 45 | public void setInternalId(String internalId) { 46 | this.internalId = internalId; 47 | } 48 | 49 | public String getActivityId() { 50 | return activityId; 51 | } 52 | 53 | public void setActivityId(String activityId) { 54 | this.activityId = activityId; 55 | } 56 | 57 | public String getActivityName() { 58 | return activityName; 59 | } 60 | 61 | public void setActivityName(String activityName) { 62 | this.activityName = activityName; 63 | } 64 | 65 | public String getActivityType() { 66 | return activityType; 67 | } 68 | 69 | public void setActivityType(String activityType) { 70 | this.activityType = activityType; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/dashboard/IncidentStatistics.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.dashboard; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.UUID; 13 | 14 | @JmixEntity 15 | public class IncidentStatistics { 16 | @JmixGeneratedValue 17 | @JmixId 18 | protected UUID id; 19 | 20 | protected String incidentType; 21 | 22 | protected Integer incidentCount; 23 | 24 | public Integer getIncidentCount() { 25 | return incidentCount; 26 | } 27 | 28 | public void setIncidentCount(Integer incidentCount) { 29 | this.incidentCount = incidentCount; 30 | } 31 | 32 | public String getIncidentType() { 33 | return incidentType; 34 | } 35 | 36 | public void setIncidentType(String incidentType) { 37 | this.incidentType = incidentType; 38 | } 39 | 40 | public UUID getId() { 41 | return id; 42 | } 43 | 44 | public void setId(UUID id) { 45 | this.id = id; 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/decisiondefinition/DecisionDefinitionData.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.entity.decisiondefinition; 2 | 3 | import io.jmix.core.entity.annotation.JmixId; 4 | import io.jmix.core.metamodel.annotation.JmixEntity; 5 | import io.jmix.core.metamodel.annotation.JmixProperty; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | 9 | @JmixEntity(name = "bpm_DecisionDefinitionData") 10 | @Getter 11 | @Setter 12 | public class DecisionDefinitionData { 13 | 14 | @JmixId 15 | @JmixProperty(mandatory = true) 16 | protected String id; 17 | 18 | protected String decisionDefinitionId; 19 | 20 | protected String name; 21 | 22 | protected String key; 23 | 24 | protected String category; 25 | 26 | protected String deploymentId; 27 | 28 | protected Integer historyTimeToLive; 29 | 30 | protected String resourceName; 31 | 32 | protected String tenantId; 33 | 34 | protected String version; 35 | 36 | protected String versionTag; 37 | 38 | protected String decisionRequirementsDefinitionId; 39 | 40 | protected String decisionRequirementsDefinitionKey; 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/deployment/DeploymentProcessInstancesInfo.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.entity.deployment; 2 | 3 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 4 | import io.jmix.core.entity.annotation.JmixId; 5 | import io.jmix.core.metamodel.annotation.InstanceName; 6 | import io.jmix.core.metamodel.annotation.JmixEntity; 7 | 8 | import java.util.UUID; 9 | 10 | @JmixEntity 11 | public class DeploymentProcessInstancesInfo { 12 | 13 | @JmixId 14 | @JmixGeneratedValue 15 | protected UUID id; 16 | 17 | protected String processDefinitionId; 18 | 19 | protected String processDefinitionName; 20 | 21 | @InstanceName 22 | protected String processDefinitionKey; 23 | 24 | protected Long processInstanceCount; 25 | 26 | public UUID getId() { 27 | return id; 28 | } 29 | 30 | public void setId(UUID id) { 31 | this.id = id; 32 | } 33 | 34 | public String getProcessDefinitionId() { 35 | return processDefinitionId; 36 | } 37 | 38 | public void setProcessDefinitionId(String processDefinitionId) { 39 | this.processDefinitionId = processDefinitionId; 40 | } 41 | 42 | public String getProcessDefinitionName() { 43 | return processDefinitionName; 44 | } 45 | 46 | public void setProcessDefinitionName(String processDefinitionName) { 47 | this.processDefinitionName = processDefinitionName; 48 | } 49 | 50 | public String getProcessDefinitionKey() { 51 | return processDefinitionKey; 52 | } 53 | 54 | public void setProcessDefinitionKey(String processDefinitionKey) { 55 | this.processDefinitionKey = processDefinitionKey; 56 | } 57 | 58 | public Long getProcessInstanceCount() { 59 | return processInstanceCount; 60 | } 61 | 62 | public void setProcessInstanceCount(Long processInstanceCount) { 63 | this.processInstanceCount = processInstanceCount; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/deployment/DeploymentResource.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.entity.deployment; 2 | 3 | import io.jmix.core.entity.annotation.JmixId; 4 | import io.jmix.core.metamodel.annotation.InstanceName; 5 | import io.jmix.core.metamodel.annotation.JmixEntity; 6 | import io.jmix.core.metamodel.annotation.JmixProperty; 7 | 8 | @JmixEntity 9 | public class DeploymentResource { 10 | 11 | @JmixId 12 | @JmixProperty(mandatory = true) 13 | protected String id; 14 | 15 | protected String resourceId; 16 | 17 | protected String deploymentId; 18 | 19 | @InstanceName 20 | protected String name; 21 | 22 | public String getId() { 23 | return id; 24 | } 25 | 26 | public void setId(String id) { 27 | this.id = id; 28 | } 29 | 30 | public String getResourceId() { 31 | return resourceId; 32 | } 33 | 34 | public void setResourceId(String resourceId) { 35 | this.resourceId = resourceId; 36 | } 37 | 38 | public String getDeploymentId() { 39 | return deploymentId; 40 | } 41 | 42 | public void setDeploymentId(String deploymentId) { 43 | this.deploymentId = deploymentId; 44 | } 45 | 46 | public String getName() { 47 | return name; 48 | } 49 | 50 | public void setName(String name) { 51 | this.name = name; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/deployment/ResourceDeploymentReport.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.deployment; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.List; 13 | import java.util.UUID; 14 | 15 | @JmixEntity 16 | public class ResourceDeploymentReport { 17 | @JmixGeneratedValue 18 | @JmixId 19 | private UUID id; 20 | 21 | private String filename; 22 | 23 | private List validationErrors; 24 | 25 | public List getValidationErrors() { 26 | return validationErrors; 27 | } 28 | 29 | public void setValidationErrors(List validationErrors) { 30 | this.validationErrors = validationErrors; 31 | } 32 | 33 | public String getFilename() { 34 | return filename; 35 | } 36 | 37 | public void setFilename(String filename) { 38 | this.filename = filename; 39 | } 40 | 41 | public UUID getId() { 42 | return id; 43 | } 44 | 45 | public void setId(UUID id) { 46 | this.id = id; 47 | } 48 | 49 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/deployment/ResourceValidationError.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.deployment; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.UUID; 13 | 14 | @JmixEntity 15 | public class ResourceValidationError { 16 | @JmixGeneratedValue 17 | @JmixId 18 | private UUID id; 19 | 20 | private String message; 21 | 22 | private Integer line; 23 | 24 | private Integer column; 25 | 26 | private String mainElementId; 27 | 28 | private String type; 29 | 30 | public ValidationErrorType getType() { 31 | return type == null ? null : ValidationErrorType.fromId(type); 32 | } 33 | 34 | public void setType(ValidationErrorType type) { 35 | this.type = type == null ? null : type.getId(); 36 | } 37 | 38 | public UUID getId() { 39 | return id; 40 | } 41 | 42 | public void setId(UUID id) { 43 | this.id = id; 44 | } 45 | 46 | public String getMainElementId() { 47 | return mainElementId; 48 | } 49 | 50 | public void setMainElementId(String mainElementId) { 51 | this.mainElementId = mainElementId; 52 | } 53 | 54 | public Integer getColumn() { 55 | return column; 56 | } 57 | 58 | public void setColumn(Integer column) { 59 | this.column = column; 60 | } 61 | 62 | public Integer getLine() { 63 | return line; 64 | } 65 | 66 | public void setLine(Integer line) { 67 | this.line = line; 68 | } 69 | 70 | public String getMessage() { 71 | return message; 72 | } 73 | 74 | public void setMessage(String message) { 75 | this.message = message; 76 | } 77 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/deployment/ValidationErrorType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.deployment; 7 | 8 | import io.jmix.core.metamodel.datatype.EnumClass; 9 | 10 | import org.springframework.lang.Nullable; 11 | 12 | 13 | public enum ValidationErrorType implements EnumClass { 14 | 15 | ERROR("Error"), 16 | WARNING("Warning"); 17 | 18 | private final String id; 19 | 20 | ValidationErrorType(String id) { 21 | this.id = id; 22 | } 23 | 24 | public String getId() { 25 | return id; 26 | } 27 | 28 | @Nullable 29 | public static ValidationErrorType fromId(String id) { 30 | for (ValidationErrorType at : ValidationErrorType.values()) { 31 | if (at.getId().equals(id)) { 32 | return at; 33 | } 34 | } 35 | return null; 36 | } 37 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/engine/AuthType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.engine; 7 | 8 | import io.jmix.core.metamodel.datatype.EnumClass; 9 | import org.springframework.lang.Nullable; 10 | 11 | 12 | public enum AuthType implements EnumClass { 13 | 14 | BASIC("Basic"), 15 | HTTP_HEADER("HTTP header"); 16 | 17 | private final String id; 18 | 19 | AuthType(String id) { 20 | this.id = id; 21 | } 22 | 23 | public String getId() { 24 | return id; 25 | } 26 | 27 | @Nullable 28 | public static AuthType fromId(String id) { 29 | for (AuthType at : AuthType.values()) { 30 | if (at.getId().equals(id)) { 31 | return at; 32 | } 33 | } 34 | return null; 35 | } 36 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/engine/EngineType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.engine; 7 | 8 | import io.jmix.core.metamodel.datatype.EnumClass; 9 | import org.springframework.lang.Nullable; 10 | 11 | 12 | public enum EngineType implements EnumClass { 13 | 14 | CAMUNDA_7("Camunda 7"), 15 | OPERATON("OPERATON"); 16 | 17 | private final String id; 18 | 19 | EngineType(String id) { 20 | this.id = id; 21 | } 22 | 23 | public String getId() { 24 | return id; 25 | } 26 | 27 | @Nullable 28 | public static EngineType fromId(String id) { 29 | for (EngineType at : EngineType.values()) { 30 | if (at.getId().equals(id)) { 31 | return at; 32 | } 33 | } 34 | return null; 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/filter/ActivityFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.filter; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.UUID; 13 | 14 | @JmixEntity 15 | public class ActivityFilter { 16 | @JmixGeneratedValue 17 | @JmixId 18 | protected UUID id; 19 | 20 | protected String processInstanceId; 21 | 22 | public String getProcessInstanceId() { 23 | return processInstanceId; 24 | } 25 | 26 | public void setProcessInstanceId(String processInstanceId) { 27 | this.processInstanceId = processInstanceId; 28 | } 29 | 30 | public UUID getId() { 31 | return id; 32 | } 33 | 34 | public void setId(UUID id) { 35 | this.id = id; 36 | } 37 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/filter/DecisionDefinitionFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.filter; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.InstanceName; 11 | import io.jmix.core.metamodel.annotation.JmixEntity; 12 | import io.openbpm.control.entity.processdefinition.ProcessDefinitionState; 13 | import lombok.Getter; 14 | import lombok.Setter; 15 | 16 | import java.util.List; 17 | import java.util.UUID; 18 | 19 | @JmixEntity 20 | @Getter 21 | @Setter 22 | public class DecisionDefinitionFilter { 23 | 24 | @JmixGeneratedValue 25 | @JmixId 26 | protected UUID id; 27 | 28 | protected String keyLike; 29 | 30 | protected String key; 31 | 32 | protected List idIn; 33 | 34 | @InstanceName 35 | protected String nameLike; 36 | 37 | protected Boolean latestVersionOnly = true; 38 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/filter/DecisionInstanceFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.filter; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | import lombok.Getter; 12 | import lombok.Setter; 13 | 14 | import java.time.OffsetDateTime; 15 | import java.util.UUID; 16 | 17 | @JmixEntity 18 | @Getter 19 | @Setter 20 | public class DecisionInstanceFilter { 21 | 22 | @JmixGeneratedValue 23 | @JmixId 24 | protected UUID id; 25 | 26 | protected String decisionDefinitionId; 27 | 28 | protected String processDefinitionId; 29 | 30 | protected String processDefinitionKey; 31 | 32 | protected String processInstanceId; 33 | 34 | protected String activityId; 35 | 36 | protected OffsetDateTime evaluatedAfter; 37 | 38 | protected OffsetDateTime evaluatedBefore; 39 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/filter/DeploymentFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.filter; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.InstanceName; 11 | import io.jmix.core.metamodel.annotation.JmixEntity; 12 | import lombok.Getter; 13 | import lombok.Setter; 14 | 15 | import java.time.OffsetDateTime; 16 | import java.util.List; 17 | import java.util.UUID; 18 | 19 | @JmixEntity 20 | @Getter 21 | @Setter 22 | public class DeploymentFilter { 23 | 24 | @JmixGeneratedValue 25 | @JmixId 26 | protected UUID id; 27 | 28 | protected String deploymentId; 29 | 30 | @InstanceName 31 | protected String nameLike; 32 | 33 | protected OffsetDateTime deploymentAfter; 34 | 35 | protected OffsetDateTime deploymentBefore; 36 | 37 | protected String source; 38 | 39 | protected List tenantIdIn; 40 | 41 | protected Boolean withoutTenantId; 42 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/filter/ExternalTaskFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.filter; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.UUID; 13 | 14 | @JmixEntity 15 | public class ExternalTaskFilter { 16 | @JmixGeneratedValue 17 | @JmixId 18 | protected UUID id; 19 | 20 | protected String processInstanceId; 21 | 22 | protected String activityId; 23 | 24 | public String getActivityId() { 25 | return activityId; 26 | } 27 | 28 | public void setActivityId(String activityId) { 29 | this.activityId = activityId; 30 | } 31 | 32 | public String getProcessInstanceId() { 33 | return processInstanceId; 34 | } 35 | 36 | public void setProcessInstanceId(String processInstanceId) { 37 | this.processInstanceId = processInstanceId; 38 | } 39 | 40 | public UUID getId() { 41 | return id; 42 | } 43 | 44 | public void setId(UUID id) { 45 | this.id = id; 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/filter/JobFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.filter; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.UUID; 13 | 14 | @JmixEntity 15 | public class JobFilter { 16 | @JmixGeneratedValue 17 | @JmixId 18 | protected UUID id; 19 | 20 | protected String processInstanceId; 21 | 22 | public String getProcessInstanceId() { 23 | return processInstanceId; 24 | } 25 | 26 | public void setProcessInstanceId(String processInstanceId) { 27 | this.processInstanceId = processInstanceId; 28 | } 29 | 30 | public UUID getId() { 31 | return id; 32 | } 33 | 34 | public void setId(UUID id) { 35 | this.id = id; 36 | } 37 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/filter/ProcessDefinitionFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.filter; 7 | 8 | import io.openbpm.control.entity.processdefinition.ProcessDefinitionState; 9 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 10 | import io.jmix.core.entity.annotation.JmixId; 11 | import io.jmix.core.metamodel.annotation.InstanceName; 12 | import io.jmix.core.metamodel.annotation.JmixEntity; 13 | import lombok.Getter; 14 | import lombok.Setter; 15 | 16 | import java.util.List; 17 | import java.util.UUID; 18 | 19 | @JmixEntity 20 | @Getter 21 | @Setter 22 | public class ProcessDefinitionFilter { 23 | @JmixGeneratedValue 24 | @JmixId 25 | protected UUID id; 26 | 27 | protected List keyIn; 28 | 29 | protected String state; 30 | 31 | protected String keyLike; 32 | 33 | protected String key; 34 | 35 | protected List idIn; 36 | 37 | protected String deploymentId; 38 | 39 | @InstanceName 40 | protected String nameLike; 41 | 42 | protected Boolean latestVersionOnly = true; 43 | 44 | public ProcessDefinitionState getState() { 45 | return state == null ? null : ProcessDefinitionState.fromId(state); 46 | } 47 | 48 | public void setState(ProcessDefinitionState state) { 49 | this.state = state == null ? null : state.getId(); 50 | } 51 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/filter/VariableFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.filter; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.UUID; 13 | 14 | @JmixEntity 15 | public class VariableFilter { 16 | @JmixGeneratedValue 17 | @JmixId 18 | protected UUID id; 19 | 20 | protected String processInstanceId; 21 | 22 | protected String activityInstanceId; 23 | 24 | public String getActivityInstanceId() { 25 | return activityInstanceId; 26 | } 27 | 28 | public void setActivityInstanceId(String activityInstanceId) { 29 | this.activityInstanceId = activityInstanceId; 30 | } 31 | 32 | public String getProcessInstanceId() { 33 | return processInstanceId; 34 | } 35 | 36 | public void setProcessInstanceId(String processInstanceId) { 37 | this.processInstanceId = processInstanceId; 38 | } 39 | 40 | public UUID getId() { 41 | return id; 42 | } 43 | 44 | public void setId(UUID id) { 45 | this.id = id; 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/job/JobDefinitionData.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.job; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.UUID; 13 | 14 | @JmixEntity 15 | public class JobDefinitionData { 16 | @JmixGeneratedValue 17 | @JmixId 18 | protected UUID id; 19 | 20 | protected String jobDefinitionId; 21 | 22 | protected String jobType; 23 | 24 | protected String activityId; 25 | 26 | public String getJobDefinitionId() { 27 | return jobDefinitionId; 28 | } 29 | 30 | public void setJobDefinitionId(String jobDefinitionId) { 31 | this.jobDefinitionId = jobDefinitionId; 32 | } 33 | 34 | public String getActivityId() { 35 | return activityId; 36 | } 37 | 38 | public void setActivityId(String activityId) { 39 | this.activityId = activityId; 40 | } 41 | 42 | public String getJobType() { 43 | return jobType; 44 | } 45 | 46 | public void setJobType(String jobType) { 47 | this.jobType = jobType; 48 | } 49 | 50 | public UUID getId() { 51 | return id; 52 | } 53 | 54 | public void setId(UUID id) { 55 | this.id = id; 56 | } 57 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/processdefinition/ProcessDefinitionState.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.processdefinition; 7 | 8 | import io.jmix.core.metamodel.datatype.EnumClass; 9 | 10 | import org.springframework.lang.Nullable; 11 | 12 | 13 | public enum ProcessDefinitionState implements EnumClass { 14 | 15 | ACTIVE("Active"), 16 | SUSPENDED("Suspended"); 17 | 18 | private final String id; 19 | 20 | ProcessDefinitionState(String id) { 21 | this.id = id; 22 | } 23 | 24 | public String getId() { 25 | return id; 26 | } 27 | 28 | @Nullable 29 | public static ProcessDefinitionState fromId(String id) { 30 | for (ProcessDefinitionState at : ProcessDefinitionState.values()) { 31 | if (at.getId().equals(id)) { 32 | return at; 33 | } 34 | } 35 | return null; 36 | } 37 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/processinstance/ProcessInstanceState.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.processinstance; 7 | 8 | import io.jmix.core.metamodel.datatype.EnumClass; 9 | import org.springframework.lang.Nullable; 10 | 11 | public enum ProcessInstanceState implements EnumClass { 12 | 13 | ACTIVE("active"), 14 | COMPLETED("completed"), 15 | SUSPENDED("suspended"); 16 | 17 | private final String id; 18 | 19 | ProcessInstanceState(String id) { 20 | this.id = id; 21 | } 22 | 23 | public String getId() { 24 | return id; 25 | } 26 | 27 | @Nullable 28 | public static ProcessInstanceState fromId(String id) { 29 | for (ProcessInstanceState at : ProcessInstanceState.values()) { 30 | if (at.getId().equals(id)) { 31 | return at; 32 | } 33 | } 34 | return null; 35 | } 36 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/variable/CamundaVariableType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.variable; 7 | 8 | import io.jmix.core.metamodel.datatype.EnumClass; 9 | import org.springframework.lang.Nullable; 10 | 11 | 12 | public enum CamundaVariableType implements EnumClass { 13 | 14 | STRING("String", true), 15 | NULL("Null", true), 16 | INTEGER("Integer", true), 17 | SHORT("Short", true), 18 | LONG("Long", true), 19 | DOUBLE("Double", true), 20 | BOOLEAN("Boolean", true), 21 | DATE("Date", true), 22 | OBJECT("Object", false), 23 | FILE("File", false),; 24 | 25 | private final String id; 26 | private final boolean primitive; 27 | 28 | CamundaVariableType(String id, boolean primitive) { 29 | this.id = id; 30 | this.primitive = primitive; 31 | } 32 | 33 | public String getId() { 34 | return id; 35 | } 36 | 37 | public boolean isPrimitive() { 38 | return primitive; 39 | } 40 | 41 | @Nullable 42 | public static CamundaVariableType fromId(String id) { 43 | for (CamundaVariableType at : CamundaVariableType.values()) { 44 | if (at.getId().equals(id)) { 45 | return at; 46 | } 47 | } 48 | return null; 49 | } 50 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/variable/ObjectTypeInfo.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.variable; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.UUID; 13 | 14 | @JmixEntity 15 | public class ObjectTypeInfo { 16 | @JmixGeneratedValue 17 | @JmixId 18 | protected UUID id; 19 | 20 | protected String objectTypeName; 21 | 22 | protected String serializationDataFormat; 23 | 24 | public String getSerializationDataFormat() { 25 | return serializationDataFormat; 26 | } 27 | 28 | public void setSerializationDataFormat(String serializationDataFormat) { 29 | this.serializationDataFormat = serializationDataFormat; 30 | } 31 | 32 | public String getObjectTypeName() { 33 | return objectTypeName; 34 | } 35 | 36 | public void setObjectTypeName(String objectTypeName) { 37 | this.objectTypeName = objectTypeName; 38 | } 39 | 40 | public UUID getId() { 41 | return id; 42 | } 43 | 44 | public void setId(UUID id) { 45 | this.id = id; 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/entity/variable/VariableValueInfo.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.entity.variable; 7 | 8 | import io.jmix.core.entity.annotation.JmixGeneratedValue; 9 | import io.jmix.core.entity.annotation.JmixId; 10 | import io.jmix.core.metamodel.annotation.JmixEntity; 11 | 12 | import java.util.UUID; 13 | 14 | @JmixEntity 15 | public class VariableValueInfo { 16 | @JmixGeneratedValue 17 | @JmixId 18 | protected UUID id; 19 | 20 | protected ObjectTypeInfo object; 21 | 22 | protected String filename; 23 | 24 | protected String mimeType; 25 | 26 | protected String encoding; 27 | 28 | protected Boolean isTransient; 29 | 30 | public Boolean getIsTransient() { 31 | return isTransient; 32 | } 33 | 34 | public void setIsTransient(Boolean isTransient) { 35 | this.isTransient = isTransient; 36 | } 37 | 38 | public String getEncoding() { 39 | return encoding; 40 | } 41 | 42 | public void setEncoding(String encoding) { 43 | this.encoding = encoding; 44 | } 45 | 46 | public String getMimeType() { 47 | return mimeType; 48 | } 49 | 50 | public void setMimeType(String mimeType) { 51 | this.mimeType = mimeType; 52 | } 53 | 54 | public String getFilename() { 55 | return filename; 56 | } 57 | 58 | public void setFilename(String filename) { 59 | this.filename = filename; 60 | } 61 | 62 | public ObjectTypeInfo getObject() { 63 | return object; 64 | } 65 | 66 | public void setObject(ObjectTypeInfo object) { 67 | this.object = object; 68 | } 69 | 70 | public UUID getId() { 71 | return id; 72 | } 73 | 74 | public void setId(UUID id) { 75 | this.id = id; 76 | } 77 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/event/UserEngineSelectEvent.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.event; 2 | 3 | import io.openbpm.control.entity.engine.BpmEngine; 4 | import lombok.Getter; 5 | import org.springframework.context.ApplicationEvent; 6 | 7 | /** 8 | * An event that fires if the engine is selected for user. 9 | */ 10 | @Getter 11 | public class UserEngineSelectEvent extends ApplicationEvent { 12 | private final BpmEngine engine; 13 | private final String username; 14 | 15 | public UserEngineSelectEvent(Object source, BpmEngine engine, String username) { 16 | super(source); 17 | this.engine = engine; 18 | this.username = username; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/exception/EngineConnectionFailedException.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.exception; 2 | 3 | public class EngineConnectionFailedException extends RuntimeException { 4 | private int statusCode; 5 | private String responseErrorMessage; 6 | 7 | public EngineConnectionFailedException(int statusCode, String responseErrorMessage) { 8 | this.statusCode = statusCode; 9 | this.responseErrorMessage = responseErrorMessage; 10 | } 11 | 12 | public EngineConnectionFailedException(String message, int statusCode, String responseErrorMessage) { 13 | super(message); 14 | this.statusCode = statusCode; 15 | this.responseErrorMessage = responseErrorMessage; 16 | } 17 | 18 | public EngineConnectionFailedException(String message, Throwable cause, int statusCode, String responseErrorMessage) { 19 | super(message, cause); 20 | this.statusCode = statusCode; 21 | this.responseErrorMessage = responseErrorMessage; 22 | } 23 | 24 | public int getStatusCode() { 25 | return statusCode; 26 | } 27 | 28 | public EngineConnectionFailedException setStatusCode(int statusCode) { 29 | this.statusCode = statusCode; 30 | return this; 31 | } 32 | 33 | public String getResponseErrorMessage() { 34 | return responseErrorMessage; 35 | } 36 | 37 | public EngineConnectionFailedException setResponseErrorMessage(String responseErrorMessage) { 38 | this.responseErrorMessage = responseErrorMessage; 39 | return this; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/exception/EngineNotSelectedException.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.exception; 2 | 3 | public class EngineNotSelectedException extends RuntimeException { 4 | public EngineNotSelectedException(String message) { 5 | super(message); 6 | } 7 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/exception/EngineResourceNotAvailableException.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.exception; 2 | 3 | public class EngineResourceNotAvailableException extends RuntimeException { 4 | 5 | public EngineResourceNotAvailableException(String resourceName) { 6 | super(String.format("Can't open resource with name %s", resourceName)); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/exception/RemoteEngineParseException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.exception; 7 | 8 | import io.openbpm.control.restsupport.camunda.ResourceReport; 9 | import lombok.Getter; 10 | import lombok.Setter; 11 | 12 | import java.util.HashMap; 13 | import java.util.Map; 14 | 15 | /** 16 | * Exception for the ParseException type returned in the {@link io.openbpm.control.restsupport.camunda.CamundaErrorResponse}. 17 | * @see io.openbpm.control.restsupport.camunda.ParseExceptionResponse 18 | */ 19 | @Getter 20 | @Setter 21 | public class RemoteEngineParseException extends RemoteProcessEngineException { 22 | protected Map details; 23 | 24 | public RemoteEngineParseException(String message) { 25 | super(message); 26 | details = new HashMap<>(); 27 | } 28 | 29 | public RemoteEngineParseException(String message, Map details) { 30 | super(message); 31 | this.details = details; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/listener/AuthenticationEventListener.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.listener; 2 | 3 | import io.openbpm.control.entity.engine.BpmEngine; 4 | import io.openbpm.control.service.engine.EngineService; 5 | import org.springframework.context.event.EventListener; 6 | import org.springframework.security.authentication.event.InteractiveAuthenticationSuccessEvent; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | public class AuthenticationEventListener { 11 | 12 | protected final EngineService engineService; 13 | 14 | public AuthenticationEventListener(EngineService engineService) { 15 | this.engineService = engineService; 16 | } 17 | 18 | @EventListener 19 | public void onInteractiveAuthenticationSuccess(final InteractiveAuthenticationSuccessEvent event) { 20 | BpmEngine engine = engineService.findDefaultEngine(); 21 | if (engine != null) { 22 | engineService.setSelectedEngine(engine); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/mapper/DecisionDefinitionMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.mapper; 7 | 8 | import io.jmix.core.Metadata; 9 | import io.openbpm.control.entity.decisiondefinition.DecisionDefinitionData; 10 | import org.camunda.bpm.engine.repository.DecisionDefinition; 11 | import org.camunda.community.rest.client.model.DecisionDefinitionDto; 12 | import org.mapstruct.Mapper; 13 | import org.mapstruct.Mapping; 14 | import org.springframework.beans.factory.annotation.Autowired; 15 | 16 | @Mapper(componentModel = "spring") 17 | public abstract class DecisionDefinitionMapper { 18 | 19 | @Autowired 20 | Metadata metadata; 21 | 22 | @Mapping(target = "decisionDefinitionId", source = "id") 23 | public abstract DecisionDefinitionData fromDecisionDefinitionModel(DecisionDefinition source); 24 | 25 | @Mapping(target = "resourceName", source = "resource") 26 | @Mapping(target = "id", ignore = true) 27 | @Mapping(target = "decisionDefinitionId", source = "id") 28 | public abstract DecisionDefinitionData fromDecisionDefinitionDto(DecisionDefinitionDto source); 29 | 30 | DecisionDefinitionData targetClassFactory() { 31 | return metadata.create(DecisionDefinitionData.class); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/mapper/DeploymentMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.mapper; 7 | 8 | import io.jmix.core.Metadata; 9 | import io.openbpm.control.entity.deployment.DeploymentData; 10 | import org.camunda.bpm.engine.repository.Deployment; 11 | import org.camunda.community.rest.client.model.DeploymentDto; 12 | import org.mapstruct.Mapper; 13 | import org.mapstruct.Mapping; 14 | import org.springframework.beans.factory.annotation.Autowired; 15 | 16 | import java.time.OffsetDateTime; 17 | import java.time.ZoneOffset; 18 | import java.util.Date; 19 | 20 | @Mapper(componentModel = "spring") 21 | public abstract class DeploymentMapper { 22 | @Autowired 23 | Metadata metadata; 24 | 25 | @Mapping(target = "deploymentId", source = "id") 26 | @Mapping(target = "id", ignore = true) 27 | public abstract DeploymentData fromDto(DeploymentDto source); 28 | 29 | @Mapping(target = "deploymentId", source = "id") 30 | public abstract DeploymentData fromProcessDefinitionModel(Deployment source); 31 | 32 | DeploymentData targetClassFactory() { 33 | return metadata.create(DeploymentData.class); 34 | } 35 | 36 | OffsetDateTime map(Date value) { 37 | if (value == null) { 38 | return null; 39 | } 40 | 41 | return value.toInstant().atOffset(ZoneOffset.UTC); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/mapper/DeploymentResourceMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.mapper; 7 | 8 | import io.jmix.core.Metadata; 9 | import io.openbpm.control.entity.deployment.DeploymentResource; 10 | import org.camunda.community.rest.client.model.DeploymentResourceDto; 11 | import org.mapstruct.Mapper; 12 | import org.mapstruct.Mapping; 13 | import org.springframework.beans.factory.annotation.Autowired; 14 | 15 | @Mapper(componentModel = "spring") 16 | public abstract class DeploymentResourceMapper { 17 | @Autowired 18 | Metadata metadata; 19 | 20 | @Mapping(target = "resourceId", source = "id") 21 | @Mapping(target = "id", ignore = true) 22 | public abstract DeploymentResource fromDto(DeploymentResourceDto source); 23 | 24 | DeploymentResource targetClassFactory() { 25 | return metadata.create(DeploymentResource.class); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/mapper/ExternalTaskMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.mapper; 7 | 8 | import io.jmix.core.Metadata; 9 | import io.openbpm.control.entity.ExternalTaskData; 10 | import org.camunda.bpm.engine.externaltask.ExternalTask; 11 | import org.mapstruct.Mapper; 12 | import org.mapstruct.Mapping; 13 | import org.springframework.beans.factory.annotation.Autowired; 14 | 15 | @Mapper(componentModel = "spring") 16 | public abstract class ExternalTaskMapper { 17 | @Autowired 18 | Metadata metadata; 19 | 20 | @Mapping(target = "externalTaskId", source = "id") 21 | @Mapping(target = "id", ignore = true) 22 | public abstract ExternalTaskData fromExternalTask(ExternalTask source); 23 | 24 | ExternalTaskData targetClassFactory() { 25 | return metadata.create(ExternalTaskData.class); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/mapper/HistoryActivityMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.mapper; 7 | 8 | import io.openbpm.control.entity.activity.HistoricActivityInstanceData; 9 | import io.jmix.core.Metadata; 10 | import org.camunda.community.rest.client.model.HistoricActivityInstanceDto; 11 | import org.mapstruct.Mapper; 12 | import org.mapstruct.Mapping; 13 | import org.springframework.beans.factory.annotation.Autowired; 14 | 15 | import java.time.Instant; 16 | import java.time.OffsetDateTime; 17 | import java.util.Date; 18 | @Mapper(componentModel = "spring") 19 | public abstract class HistoryActivityMapper { 20 | @Autowired 21 | Metadata metadata; 22 | 23 | @Mapping(target = "id", ignore = true) 24 | @Mapping(target = "activityInstanceId", source = "id") 25 | @Mapping(target = "cancelled", source = "canceled") 26 | public abstract HistoricActivityInstanceData fromHistoryActivityDto(HistoricActivityInstanceDto source); 27 | 28 | HistoricActivityInstanceData targetClassFactory() { 29 | return metadata.create(HistoricActivityInstanceData.class); 30 | } 31 | 32 | Date map(OffsetDateTime value) { 33 | if (value == null) { 34 | return null; 35 | } 36 | Instant instant = value.toInstant(); 37 | return Date.from(instant); 38 | } 39 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/mapper/IncidentMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.mapper; 7 | 8 | import io.jmix.core.Metadata; 9 | import io.openbpm.control.entity.incident.HistoricIncidentData; 10 | import io.openbpm.control.entity.incident.IncidentData; 11 | import org.camunda.community.rest.client.model.HistoricIncidentDto; 12 | import org.camunda.community.rest.client.model.IncidentDto; 13 | import org.mapstruct.Mapper; 14 | import org.mapstruct.Mapping; 15 | import org.springframework.beans.factory.annotation.Autowired; 16 | 17 | @Mapper(componentModel = "spring") 18 | public abstract class IncidentMapper { 19 | @Autowired 20 | Metadata metadata; 21 | 22 | @Mapping(target = "type", source = "incidentType") 23 | @Mapping(target = "message", source = "incidentMessage") 24 | @Mapping(target = "incidentId", source = "id") 25 | @Mapping(target = "timestamp", source = "incidentTimestamp") 26 | public abstract IncidentData fromIncidentModel(IncidentDto source); 27 | 28 | IncidentData targetClassFactory() { 29 | return metadata.create(IncidentData.class); 30 | } 31 | 32 | @Mapping(target = "type", source = "incidentType") 33 | @Mapping(target = "message", source = "incidentMessage") 34 | @Mapping(target = "incidentId", source = "id") 35 | public abstract HistoricIncidentData fromHistoricIncidentModel(HistoricIncidentDto historicIncidentDto); 36 | 37 | HistoricIncidentData historicIncidentTargetClassFactory() { 38 | return metadata.create(HistoricIncidentData.class); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/mapper/JobMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.mapper; 7 | 8 | import io.openbpm.control.entity.job.JobData; 9 | import io.openbpm.control.entity.job.JobDefinitionData; 10 | import io.jmix.core.Metadata; 11 | import org.camunda.community.rest.client.model.JobDefinitionDto; 12 | import org.camunda.community.rest.client.model.JobDto; 13 | import org.mapstruct.Mapper; 14 | import org.mapstruct.Mapping; 15 | import org.springframework.beans.factory.annotation.Autowired; 16 | 17 | import java.time.Instant; 18 | import java.time.OffsetDateTime; 19 | import java.util.Date; 20 | 21 | @Mapper(componentModel = "spring") 22 | public abstract class JobMapper { 23 | @Autowired 24 | Metadata metadata; 25 | 26 | @Mapping(target = "jobId", source = "id") 27 | @Mapping(target = "id", ignore = true) 28 | public abstract JobData fromJobDto(JobDto source); 29 | 30 | JobData targetClassFactory() { 31 | return metadata.create(JobData.class); 32 | } 33 | 34 | @Mapping(target = "jobDefinitionId", source = "id") 35 | @Mapping(target = "id", ignore = true) 36 | public abstract JobDefinitionData fromJobDefinitionDto(JobDefinitionDto source); 37 | 38 | JobDefinitionData jobDefinitionTargetClassFactory() { 39 | return metadata.create(JobDefinitionData.class); 40 | } 41 | 42 | Date map(OffsetDateTime value) { 43 | if (value == null) { 44 | return null; 45 | } 46 | Instant instant = value.toInstant(); 47 | return Date.from(instant); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/restsupport/DynamicEngineUrlRequestInterceptor.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.restsupport; 2 | 3 | import feign.RequestInterceptor; 4 | import feign.RequestTemplate; 5 | import io.openbpm.control.entity.engine.AuthType; 6 | import io.openbpm.control.entity.engine.BpmEngine; 7 | import io.openbpm.control.exception.EngineNotSelectedException; 8 | import io.openbpm.control.service.engine.EngineService; 9 | import org.apache.commons.lang3.BooleanUtils; 10 | import org.springframework.http.HttpHeaders; 11 | 12 | import java.nio.charset.StandardCharsets; 13 | import java.util.Base64; 14 | 15 | public class DynamicEngineUrlRequestInterceptor implements RequestInterceptor { 16 | protected final EngineService engineService; 17 | 18 | public DynamicEngineUrlRequestInterceptor(EngineService engineService) { 19 | this.engineService = engineService; 20 | } 21 | 22 | @Override 23 | public void apply(RequestTemplate template) { 24 | BpmEngine selectedEngine = engineService.getSelectedEngine(); 25 | if (selectedEngine == null) { 26 | throw new EngineNotSelectedException("BPM engine not selected"); 27 | } 28 | template.target(selectedEngine.getBaseUrl()); 29 | if (BooleanUtils.isTrue(selectedEngine.getAuthEnabled())) { 30 | if (selectedEngine.getAuthType() == AuthType.BASIC) { 31 | String username = selectedEngine.getBasicAuthUsername(); 32 | String password = selectedEngine.getBasicAuthPassword(); 33 | String encodedHeader = Base64.getEncoder().encodeToString((username + ":" + password).getBytes(StandardCharsets.UTF_8)); 34 | template.header(HttpHeaders.AUTHORIZATION, "Basic " + encodedHeader); 35 | } else if (selectedEngine.getAuthType() == AuthType.HTTP_HEADER) { 36 | template.header(selectedEngine.getHttpHeaderName(), selectedEngine.getHttpHeaderValue()); 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/restsupport/ObjectToStringConverter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.restsupport; 7 | 8 | import org.apache.commons.io.IOUtils; 9 | import org.springframework.http.HttpInputMessage; 10 | import org.springframework.http.HttpOutputMessage; 11 | import org.springframework.http.MediaType; 12 | import org.springframework.http.converter.HttpMessageNotReadableException; 13 | import org.springframework.http.converter.HttpMessageNotWritableException; 14 | 15 | import java.io.IOException; 16 | import java.nio.charset.StandardCharsets; 17 | import java.util.List; 18 | 19 | public class ObjectToStringConverter implements org.springframework.http.converter.HttpMessageConverter { 20 | @Override 21 | public boolean canRead(Class clazz, MediaType mediaType) { 22 | return clazz.getName().equals("java.lang.Object") && mediaType.isCompatibleWith(MediaType.TEXT_PLAIN); 23 | } 24 | 25 | @Override 26 | public boolean canWrite(Class clazz, MediaType mediaType) { 27 | return false; 28 | } 29 | 30 | @Override 31 | public List getSupportedMediaTypes() { 32 | return List.of(MediaType.TEXT_PLAIN); 33 | } 34 | 35 | @Override 36 | public Object read(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 37 | return IOUtils.toString(inputMessage.getBody(), StandardCharsets.UTF_8); 38 | } 39 | 40 | @Override 41 | public void write(Object o, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { 42 | 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/restsupport/OffsetDateTimeFormatter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.restsupport; 7 | 8 | import org.springframework.format.Formatter; 9 | 10 | import java.text.ParseException; 11 | import java.time.OffsetDateTime; 12 | import java.time.format.DateTimeFormatter; 13 | import java.util.Locale; 14 | 15 | public class OffsetDateTimeFormatter implements Formatter { 16 | private static final DateTimeFormatter CAMUNDA_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 17 | 18 | @Override 19 | public OffsetDateTime parse(String text, Locale locale) throws ParseException { 20 | return OffsetDateTime.parse(text, CAMUNDA_DATE_TIME_FORMATTER); 21 | } 22 | 23 | @Override 24 | public String print(OffsetDateTime object, Locale locale) { 25 | return CAMUNDA_DATE_TIME_FORMATTER.format(object); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/restsupport/camunda/CamundaErrorResponse.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.restsupport.camunda; 7 | 8 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 9 | import com.fasterxml.jackson.annotation.JsonProperty; 10 | import lombok.Getter; 11 | import lombok.Setter; 12 | 13 | /** 14 | * Generic DTO for the error response returned by Camunda 7 REST. 15 | */ 16 | @Getter 17 | @Setter 18 | @JsonIgnoreProperties(ignoreUnknown = true) 19 | public class CamundaErrorResponse { 20 | 21 | @JsonProperty("type") 22 | protected String type; 23 | 24 | @JsonProperty("message") 25 | protected String message; 26 | 27 | @JsonProperty("code") 28 | protected String code; 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/restsupport/camunda/ParseExceptionResponse.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.restsupport.camunda; 7 | 8 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 9 | import lombok.Getter; 10 | import lombok.Setter; 11 | 12 | import java.util.Map; 13 | 14 | /** 15 | * A DTO for the error response with the ParseException type. 16 | */ 17 | @Getter 18 | @Setter 19 | @JsonIgnoreProperties(ignoreUnknown = true) 20 | public class ParseExceptionResponse extends CamundaErrorResponse { 21 | 22 | private Map details; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/restsupport/camunda/ResourceReport.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.restsupport.camunda; 7 | 8 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 9 | import lombok.Getter; 10 | import lombok.Setter; 11 | 12 | import java.util.List; 13 | 14 | @Getter 15 | @Setter 16 | @JsonIgnoreProperties(ignoreUnknown = true) 17 | public class ResourceReport { 18 | private List errors; 19 | 20 | private List warnings; 21 | 22 | 23 | @Getter 24 | @Setter 25 | @JsonIgnoreProperties(ignoreUnknown = true) 26 | public static class ProblemDetails { 27 | private String message; 28 | 29 | private Integer line; 30 | 31 | private Integer column; 32 | 33 | private String mainElementId; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/security/DatabaseUserRepository.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.security; 7 | 8 | import io.openbpm.control.entity.User; 9 | import io.jmix.securitydata.user.AbstractDatabaseUserRepository; 10 | import org.springframework.context.annotation.Primary; 11 | import org.springframework.security.core.GrantedAuthority; 12 | import org.springframework.stereotype.Component; 13 | 14 | import java.util.Collection; 15 | 16 | @Primary 17 | @Component("UserRepository") 18 | public class DatabaseUserRepository extends AbstractDatabaseUserRepository { 19 | 20 | @Override 21 | protected Class getUserClass() { 22 | return User.class; 23 | } 24 | 25 | @Override 26 | protected void initSystemUser(final User systemUser) { 27 | final Collection authorities = getGrantedAuthoritiesBuilder() 28 | .addResourceRole(FullAccessRole.CODE) 29 | .build(); 30 | systemUser.setAuthorities(authorities); 31 | } 32 | 33 | @Override 34 | protected void initAnonymousUser(final User anonymousUser) { 35 | } 36 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/security/FullAccessRole.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.security; 7 | 8 | import io.jmix.security.model.EntityAttributePolicyAction; 9 | import io.jmix.security.model.EntityPolicyAction; 10 | import io.jmix.security.role.annotation.EntityAttributePolicy; 11 | import io.jmix.security.role.annotation.EntityPolicy; 12 | import io.jmix.security.role.annotation.ResourceRole; 13 | import io.jmix.security.role.annotation.SpecificPolicy; 14 | import io.jmix.securityflowui.role.annotation.MenuPolicy; 15 | import io.jmix.securityflowui.role.annotation.ViewPolicy; 16 | 17 | @ResourceRole(name = "Full Access", code = FullAccessRole.CODE) 18 | public interface FullAccessRole { 19 | 20 | String CODE = "system-full-access"; 21 | 22 | @EntityPolicy(entityName = "*", actions = {EntityPolicyAction.ALL}) 23 | @EntityAttributePolicy(entityName = "*", attributes = "*", action = EntityAttributePolicyAction.MODIFY) 24 | @ViewPolicy(viewIds = "*") 25 | @MenuPolicy(menuIds = "*") 26 | @SpecificPolicy(resources = "*") 27 | void fullAccess(); 28 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/security/UiMinimalRole.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.security; 7 | 8 | import io.jmix.core.entity.KeyValueEntity; 9 | import io.jmix.security.model.EntityAttributePolicyAction; 10 | import io.jmix.security.model.EntityPolicyAction; 11 | import io.jmix.security.model.SecurityScope; 12 | import io.jmix.security.role.annotation.EntityAttributePolicy; 13 | import io.jmix.security.role.annotation.EntityPolicy; 14 | import io.jmix.security.role.annotation.ResourceRole; 15 | import io.jmix.security.role.annotation.SpecificPolicy; 16 | import io.jmix.securityflowui.role.annotation.ViewPolicy; 17 | 18 | @ResourceRole(name = "UI: minimal access", code = UiMinimalRole.CODE, scope = SecurityScope.UI) 19 | public interface UiMinimalRole { 20 | 21 | String CODE = "ui-minimal"; 22 | 23 | @ViewPolicy(viewIds = "MainView") 24 | void main(); 25 | 26 | @ViewPolicy(viewIds = "LoginView") 27 | @SpecificPolicy(resources = "ui.loginToUi") 28 | void login(); 29 | 30 | @EntityPolicy(entityClass = KeyValueEntity.class, actions = EntityPolicyAction.READ) 31 | @EntityAttributePolicy(entityClass = KeyValueEntity.class, attributes = "*", action = EntityAttributePolicyAction.VIEW) 32 | void keyValueEntity(); 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/service/ItemListLoadContext.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.service; 7 | 8 | import io.jmix.core.Sort; 9 | import lombok.Getter; 10 | import lombok.Setter; 11 | import lombok.experimental.Accessors; 12 | 13 | /** 14 | * Base class of context used to load a list of items from the BPM engine. 15 | * Context contains includes the information such as pagination, sorting and filtering options. 16 | * 17 | * @param a class containing filtering options 18 | */ 19 | @Getter 20 | @Setter 21 | @Accessors(chain = true) 22 | public abstract class ItemListLoadContext { 23 | protected V filter; 24 | protected Integer firstResult; 25 | protected Integer maxResults; 26 | protected Sort sort; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/service/decisioninstance/DecisionInstanceLoadContext.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.service.decisioninstance; 2 | 3 | import io.jmix.core.Sort; 4 | import io.openbpm.control.entity.filter.DecisionInstanceFilter; 5 | import io.openbpm.control.service.ItemListLoadContext; 6 | 7 | /** 8 | * A context that contains the following options to load decision instances: 9 | * 10 | * @see DecisionInstanceFilter 11 | * @see io.jmix.core.Metadata 12 | * @see Sort 13 | */ 14 | public class DecisionInstanceLoadContext extends ItemListLoadContext { 15 | 16 | /** 17 | * Sets a decision instance filter. 18 | * 19 | * @param filter an instance of {@link DecisionInstanceFilter} 20 | * @return current context 21 | */ 22 | public DecisionInstanceLoadContext setFilter(DecisionInstanceFilter filter) { 23 | this.filter = filter; 24 | return this; 25 | } 26 | 27 | /** 28 | * Sets a first result number. 29 | * 30 | * @param firstResult first result 31 | * @return current context 32 | */ 33 | public DecisionInstanceLoadContext setFirstResult(Integer firstResult) { 34 | this.firstResult = firstResult; 35 | return this; 36 | } 37 | 38 | /** 39 | * Sets a max number of results. 40 | * 41 | * @param maxResults max results 42 | * @return current context 43 | */ 44 | public DecisionInstanceLoadContext setMaxResults(Integer maxResults) { 45 | this.maxResults = maxResults; 46 | return this; 47 | } 48 | 49 | /** 50 | * Sets sort options. 51 | * 52 | * @param sort sort options 53 | * @return current context 54 | */ 55 | public DecisionInstanceLoadContext setSort(Sort sort) { 56 | this.sort = sort; 57 | return this; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/service/deployment/DeploymentContext.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.service.deployment; 7 | 8 | import lombok.AllArgsConstructor; 9 | import lombok.Getter; 10 | import lombok.NoArgsConstructor; 11 | import lombok.Setter; 12 | 13 | import java.io.InputStream; 14 | 15 | /** 16 | * A context that contains the following options to deploy processes: 17 | *
    18 | *
  • Resource name: a filename containing a business process, e.g. approve-invoice-process.bpmn.
  • 19 | *
  • Resource content: an input stream containing a business process described in BPMN 2.0 XML format.
  • 20 | *
21 | */ 22 | @NoArgsConstructor 23 | @AllArgsConstructor 24 | @Getter 25 | @Setter 26 | public class DeploymentContext { 27 | private String resourceName; 28 | private InputStream resourceContent; 29 | 30 | /** 31 | * Sets name and content of the resource that should be deployed to the BPM engine. 32 | * @param resourceName a resource name, e.g. approve-invoice.bpmn 33 | * @param resourceContent an input stream containing resource content 34 | * @return current context 35 | */ 36 | public DeploymentContext withResource(String resourceName, InputStream resourceContent) { 37 | this.resourceName = resourceName; 38 | this.resourceContent = resourceContent; 39 | 40 | return this; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/service/engine/EngineUiService.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.service.engine; 2 | 3 | import io.openbpm.control.entity.EngineConnectionCheckResult; 4 | import io.openbpm.control.entity.engine.BpmEngine; 5 | 6 | public interface EngineUiService { 7 | /** 8 | * Checks connection to the specified BPM engine. 9 | * 10 | * @return a result of the check. If successfully connected to engine, then the engine version is also returned. 11 | */ 12 | EngineConnectionCheckResult checkConnection(BpmEngine bpmEngine); 13 | 14 | /** 15 | * Returns a version of the specified BPM engine. 16 | * 17 | * @return a response containing engine version 18 | */ 19 | String getVersion(BpmEngine engine); 20 | 21 | 22 | /** 23 | * Sets the specified BPM engine as selected in the user's HTTP session and sends an event to the UI. 24 | * 25 | * @param engine the BPM engine the application should be connected to 26 | */ 27 | void selectEngine(BpmEngine engine); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/uicomponent/spinner/SpinnerLoader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.uicomponent.spinner; 7 | 8 | import io.jmix.flowui.xml.layout.loader.AbstractComponentLoader; 9 | import org.vaadin.addons.componentfactory.spinner.Spinner; 10 | 11 | public class SpinnerLoader extends AbstractComponentLoader { 12 | @Override 13 | protected Spinner createComponent() { 14 | return factory.create(Spinner.class); 15 | } 16 | 17 | @Override 18 | public void loadComponent() { 19 | loadBoolean(element, "loading", resultComponent::setLoading); 20 | loadString(element, "size", resultComponent::setSize); 21 | loadString(element, "color", resultComponent::setColor); 22 | 23 | componentLoader().loadClassNames(resultComponent, element); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/uicomponent/treedatagrid/NoClickTreeDataGridLoader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.uicomponent.treedatagrid; 7 | 8 | import io.jmix.flowui.component.grid.TreeDataGrid; 9 | import io.jmix.flowui.xml.layout.loader.component.TreeDataGridLoader; 10 | 11 | public class NoClickTreeDataGridLoader extends TreeDataGridLoader { 12 | @Override 13 | protected TreeDataGrid createComponent() { 14 | return factory.create(NoClickTreeGrid.class); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/util/BpmParseUtil.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.util; 7 | 8 | import com.fasterxml.jackson.core.JsonProcessingException; 9 | import com.fasterxml.jackson.core.type.TypeReference; 10 | import com.fasterxml.jackson.databind.ObjectMapper; 11 | import io.openbpm.control.dto.DmnDecisionDefinition; 12 | import io.openbpm.control.dto.BpmProcessDefinition; 13 | import org.apache.commons.lang3.StringUtils; 14 | import org.slf4j.Logger; 15 | import org.slf4j.LoggerFactory; 16 | 17 | import java.util.List; 18 | 19 | public class BpmParseUtil { 20 | private static final ObjectMapper objectMapper = new ObjectMapper(); 21 | private static final Logger log = LoggerFactory.getLogger(BpmParseUtil.class); 22 | 23 | public static List parseProcessDefinitionsJson(String processDefinitionsJson) { 24 | try { 25 | if (StringUtils.isNotBlank(processDefinitionsJson)) { 26 | return objectMapper.readValue(processDefinitionsJson, new TypeReference<>() { 27 | }); 28 | } 29 | } catch (JsonProcessingException e) { 30 | log.error("Unable parse definitions JSON {}", processDefinitionsJson); 31 | } 32 | return List.of(); 33 | } 34 | 35 | public static List parseDecisionsDefinitionsJson(String decisionDefinitionsJson) { 36 | try { 37 | if (StringUtils.isNotBlank(decisionDefinitionsJson)) { 38 | return objectMapper.readValue(decisionDefinitionsJson, new TypeReference<>() { 39 | }); 40 | } 41 | } catch (JsonProcessingException e) { 42 | log.error("Unable parse definitions JSON {}", decisionDefinitionsJson); 43 | } 44 | return List.of(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/util/EngineRestUtils.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.util; 2 | 3 | import org.camunda.community.rest.client.model.CountResultDto; 4 | import org.springframework.lang.Nullable; 5 | 6 | public class EngineRestUtils { 7 | 8 | public static long getCountResult(@Nullable CountResultDto countResultDto) { 9 | if (countResultDto == null) { 10 | return 0; 11 | } 12 | Long count = countResultDto.getCount(); 13 | return count != null ? count : 0; 14 | } 15 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/about/AboutProductMetadata.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.view.about; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | @Getter 10 | @Setter 11 | public class AboutProductMetadata { 12 | private List externalLinks = new ArrayList<>(); 13 | private List products = new ArrayList<>(); 14 | 15 | @Getter 16 | @Setter 17 | public static class ExternalLink { 18 | private String url; 19 | private String label; 20 | } 21 | 22 | @Getter 23 | @Setter 24 | public static class Product { 25 | private String name; 26 | private String url; 27 | private String description; 28 | private Boolean released = Boolean.FALSE; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/about/ExternalLinkFragment.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.view.about; 2 | 3 | import com.vaadin.flow.component.html.Anchor; 4 | import com.vaadin.flow.component.orderedlayout.FlexLayout; 5 | import io.jmix.flowui.fragment.Fragment; 6 | import io.jmix.flowui.fragment.FragmentDescriptor; 7 | import io.jmix.flowui.view.ViewComponent; 8 | 9 | @FragmentDescriptor("external-link-fragment.xml") 10 | public class ExternalLinkFragment extends Fragment { 11 | 12 | @ViewComponent 13 | protected Anchor urlField; 14 | 15 | public void setLink(String text, String href) { 16 | urlField.setText(text); 17 | urlField.setHref(href); 18 | 19 | if (href == null) { 20 | getContent().setVisible(false); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/about/ProductInfoFragment.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.view.about; 2 | 3 | import com.vaadin.flow.component.html.Span; 4 | import com.vaadin.flow.component.orderedlayout.VerticalLayout; 5 | import com.vaadin.flow.theme.lumo.LumoUtility; 6 | import io.jmix.flowui.fragment.Fragment; 7 | import io.jmix.flowui.fragment.FragmentDescriptor; 8 | import io.jmix.flowui.view.MessageBundle; 9 | import io.jmix.flowui.view.ViewComponent; 10 | 11 | @FragmentDescriptor("product-info-fragment.xml") 12 | public class ProductInfoFragment extends Fragment { 13 | @ViewComponent 14 | private MessageBundle messageBundle; 15 | 16 | @ViewComponent 17 | protected Span nameLabel; 18 | @ViewComponent 19 | protected Span descriptionLabel; 20 | @ViewComponent 21 | protected ExternalLinkFragment learnMoreLink; 22 | 23 | public void setProduct(AboutProductMetadata.Product product) { 24 | nameLabel.setText(product.getName()); 25 | if (!product.getReleased()) { 26 | nameLabel.addClassNames(LumoUtility.TextColor.SECONDARY); 27 | } 28 | 29 | descriptionLabel.setText(product.getDescription()); 30 | 31 | learnMoreLink.setLink(messageBundle.getMessage("learnMore"), product.getUrl()); 32 | } 33 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/alltasks/TaskKeyColumnFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.alltasks; 7 | 8 | import com.vaadin.flow.component.html.Span; 9 | import com.vaadin.flow.component.orderedlayout.HorizontalLayout; 10 | import io.jmix.flowui.fragment.FragmentDescriptor; 11 | import io.jmix.flowui.fragmentrenderer.FragmentRenderer; 12 | import io.jmix.flowui.fragmentrenderer.RendererItemContainer; 13 | import io.jmix.flowui.view.ViewComponent; 14 | import io.openbpm.control.entity.UserTaskData; 15 | import org.apache.commons.lang3.BooleanUtils; 16 | 17 | @FragmentDescriptor("task-key-column-fragment.xml") 18 | @RendererItemContainer("userTaskDataDc") 19 | public class TaskKeyColumnFragment extends FragmentRenderer { 20 | 21 | @ViewComponent 22 | protected Span suspendedBadge; 23 | 24 | @Override 25 | public void setItem(UserTaskData item) { 26 | super.setItem(item); 27 | 28 | suspendedBadge.setVisible(BooleanUtils.isTrue(item.getSuspended())); 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/alltasks/UserTaskStateFilterOption.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.alltasks; 7 | 8 | import io.jmix.core.metamodel.datatype.EnumClass; 9 | import org.springframework.lang.Nullable; 10 | 11 | 12 | public enum UserTaskStateFilterOption implements EnumClass { 13 | 14 | ALL("All"), 15 | ACTIVE("Active"), 16 | SUSPENDED("Suspended"); 17 | 18 | private final String id; 19 | 20 | UserTaskStateFilterOption(String id) { 21 | this.id = id; 22 | 23 | } 24 | 25 | public String getId() { 26 | return id; 27 | } 28 | 29 | @Nullable 30 | public static UserTaskStateFilterOption fromId(String id) { 31 | for (UserTaskStateFilterOption at : UserTaskStateFilterOption.values()) { 32 | if (at.getId().equals(id)) { 33 | return at; 34 | } 35 | } 36 | return null; 37 | } 38 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/bpmengine/BasicAuthFragment.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.view.bpmengine; 2 | 3 | import com.vaadin.flow.component.orderedlayout.VerticalLayout; 4 | import io.jmix.flowui.fragment.Fragment; 5 | import io.jmix.flowui.fragment.FragmentDescriptor; 6 | 7 | @FragmentDescriptor("basic-auth-fragment.xml") 8 | public class BasicAuthFragment extends Fragment { 9 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/bpmengine/BpmEngineNameColumnFragment.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.view.bpmengine; 2 | 3 | import com.vaadin.flow.component.html.Span; 4 | import com.vaadin.flow.component.orderedlayout.HorizontalLayout; 5 | import io.jmix.flowui.fragment.FragmentDescriptor; 6 | import io.jmix.flowui.fragmentrenderer.FragmentRenderer; 7 | import io.jmix.flowui.fragmentrenderer.RendererItemContainer; 8 | import io.jmix.flowui.view.ViewComponent; 9 | import io.openbpm.control.entity.engine.BpmEngine; 10 | import org.apache.commons.lang3.BooleanUtils; 11 | 12 | @FragmentDescriptor("bpm-engine-name-column-fragment.xml") 13 | @RendererItemContainer("bpmEngineDc") 14 | public class BpmEngineNameColumnFragment extends FragmentRenderer { 15 | 16 | @ViewComponent 17 | protected Span defaultEngineBadge; 18 | 19 | @Override 20 | public void setItem(BpmEngine item) { 21 | super.setItem(item); 22 | 23 | if (BooleanUtils.isTrue(item.getIsDefault())) { 24 | defaultEngineBadge.setVisible(true); 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/bpmengine/HttpHeaderAuthFragment.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.view.bpmengine; 2 | 3 | import com.vaadin.flow.component.orderedlayout.VerticalLayout; 4 | import io.jmix.flowui.fragment.Fragment; 5 | import io.jmix.flowui.fragment.FragmentDescriptor; 6 | 7 | @FragmentDescriptor("http-header-auth-fragment.xml") 8 | public class HttpHeaderAuthFragment extends Fragment { 9 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/dashboard/DashboardCard.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.view.dashboard; 2 | 3 | import com.vaadin.flow.component.Component; 4 | import io.jmix.core.Messages; 5 | import io.jmix.core.security.CurrentAuthentication; 6 | import io.jmix.flowui.ViewNavigators; 7 | import io.jmix.flowui.fragment.Fragment; 8 | import io.jmix.flowui.model.InstanceContainer; 9 | import io.jmix.flowui.view.MessageBundle; 10 | import io.jmix.flowui.view.ViewComponent; 11 | import io.openbpm.control.entity.engine.BpmEngine; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | 14 | import java.text.DecimalFormat; 15 | import java.text.DecimalFormatSymbols; 16 | 17 | public abstract class DashboardCard extends Fragment { 18 | 19 | public static final String SKELETON_BACKGROUND = "skeleton-background"; 20 | @ViewComponent 21 | protected MessageBundle messageBundle; 22 | @Autowired 23 | protected CurrentAuthentication currentAuthentication; 24 | @Autowired 25 | protected Messages messages; 26 | 27 | @Autowired 28 | protected ViewNavigators viewNavigators; 29 | @ViewComponent 30 | protected InstanceContainer selectedEngineDc; 31 | 32 | public void setLoading() { 33 | updateComponents(true); 34 | } 35 | 36 | protected abstract void updateComponents(boolean loading); 37 | 38 | 39 | protected String formattedCount(long totalCount) { 40 | if (totalCount < 1000) { 41 | return String.valueOf(totalCount); 42 | } 43 | double thousands = totalCount / 1000.0; 44 | DecimalFormat decimalFormat = new DecimalFormat(messages.getMessage("thousandsFormat")); 45 | decimalFormat.setDecimalFormatSymbols(new DecimalFormatSymbols(currentAuthentication.getLocale())); 46 | return messageBundle.formatMessage("formattedTotalCount", decimalFormat.format(thousands)); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/dashboard/DeployedProcessesStatisticsCardFragment.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.view.dashboard; 2 | 3 | import com.vaadin.flow.component.ClickEvent; 4 | import com.vaadin.flow.component.html.Div; 5 | import com.vaadin.flow.component.html.H3; 6 | import io.jmix.flowui.fragment.FragmentDescriptor; 7 | import io.jmix.flowui.kit.component.button.JmixButton; 8 | import io.jmix.flowui.view.Subscribe; 9 | import io.jmix.flowui.view.ViewComponent; 10 | import io.openbpm.control.view.processdefinition.ProcessDefinitionListView; 11 | import org.slf4j.Logger; 12 | import org.slf4j.LoggerFactory; 13 | 14 | import static io.jmix.flowui.component.UiComponentUtils.getCurrentView; 15 | 16 | @FragmentDescriptor("deployed-processes-statistics-card-fragment.xml") 17 | public class DeployedProcessesStatisticsCardFragment extends DashboardCard
{ 18 | protected static final Logger log = LoggerFactory.getLogger(DeployedProcessesStatisticsCardFragment.class); 19 | 20 | @ViewComponent 21 | protected H3 deployProcessesCount; 22 | 23 | 24 | public void refresh(long deployedProcessCount) { 25 | updateComponents(false); 26 | deployProcessesCount.setText(formattedCount(deployedProcessCount)); 27 | } 28 | 29 | protected void updateComponents(boolean loading) { 30 | if (loading) { 31 | deployProcessesCount.addClassNames(SKELETON_BACKGROUND); 32 | } else { 33 | deployProcessesCount.removeClassName(SKELETON_BACKGROUND); 34 | } 35 | } 36 | 37 | @Subscribe(id = "viewDefinitionsBtn", subject = "clickListener") 38 | public void onViewDefinitionsBtnClick(final ClickEvent event) { 39 | viewNavigators.view(getCurrentView(), ProcessDefinitionListView.class).navigate(); 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/dashboard/UserTaskStatisticsCardFragment.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.view.dashboard; 2 | 3 | import com.vaadin.flow.component.ClickEvent; 4 | import com.vaadin.flow.component.html.Div; 5 | import com.vaadin.flow.component.html.H3; 6 | import io.jmix.flowui.fragment.FragmentDescriptor; 7 | import io.jmix.flowui.kit.component.button.JmixButton; 8 | import io.jmix.flowui.view.Subscribe; 9 | import io.jmix.flowui.view.ViewComponent; 10 | import io.openbpm.control.view.alltasks.AllTasksView; 11 | import org.slf4j.Logger; 12 | import org.slf4j.LoggerFactory; 13 | 14 | import static io.jmix.flowui.component.UiComponentUtils.getCurrentView; 15 | 16 | @FragmentDescriptor("user-task-statistics-card-fragment.xml") 17 | public class UserTaskStatisticsCardFragment extends DashboardCard
{ 18 | protected static final Logger log = LoggerFactory.getLogger(UserTaskStatisticsCardFragment.class); 19 | 20 | @ViewComponent 21 | protected H3 userTasksCount; 22 | 23 | @Override 24 | protected void updateComponents(boolean loading) { 25 | if (loading) { 26 | userTasksCount.addClassNames(SKELETON_BACKGROUND); 27 | } else { 28 | userTasksCount.removeClassName(SKELETON_BACKGROUND); 29 | } 30 | } 31 | 32 | public void refresh(long taskCount) { 33 | updateComponents(false); 34 | userTasksCount.setText(formattedCount(taskCount)); 35 | } 36 | 37 | @Subscribe(id = "viewUserTaskBtn", subject = "clickListener") 38 | public void onViewUserTaskBtnClick(final ClickEvent event) { 39 | viewNavigators.view(getCurrentView(), AllTasksView.class).navigate(); 40 | } 41 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/deploymenterror/MainElementIdColumnFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.deploymenterror; 7 | 8 | import com.vaadin.flow.component.orderedlayout.HorizontalLayout; 9 | import io.jmix.flowui.fragment.FragmentDescriptor; 10 | import io.jmix.flowui.fragmentrenderer.FragmentRenderer; 11 | import io.jmix.flowui.fragmentrenderer.RendererItemContainer; 12 | import io.jmix.flowui.kit.component.button.JmixButton; 13 | import io.jmix.flowui.view.ViewComponent; 14 | import io.openbpm.control.entity.deployment.ResourceValidationError; 15 | import org.apache.commons.lang3.StringUtils; 16 | 17 | @RendererItemContainer("validationErrorDc") 18 | @FragmentDescriptor("main-element-id-column-fragment.xml") 19 | public class MainElementIdColumnFragment extends FragmentRenderer { 20 | 21 | @ViewComponent 22 | protected JmixButton copyValueBtn; 23 | 24 | @Override 25 | public void setItem(ResourceValidationError item) { 26 | super.setItem(item); 27 | 28 | copyValueBtn.setVisible(StringUtils.isNotBlank(item.getMainElementId())); 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/deploymenterror/ValidationErrorMessageColumnFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.deploymenterror; 7 | 8 | import com.vaadin.flow.component.html.Span; 9 | import com.vaadin.flow.component.orderedlayout.HorizontalLayout; 10 | import com.vaadin.flow.component.popover.Popover; 11 | import com.vaadin.flow.component.popover.PopoverPosition; 12 | import io.jmix.flowui.Fragments; 13 | import io.jmix.flowui.fragment.FragmentDescriptor; 14 | import io.jmix.flowui.fragmentrenderer.FragmentRenderer; 15 | import io.jmix.flowui.fragmentrenderer.RendererItemContainer; 16 | import io.jmix.flowui.view.ViewComponent; 17 | import io.openbpm.control.entity.deployment.ResourceValidationError; 18 | import org.apache.commons.lang3.StringUtils; 19 | import org.springframework.beans.factory.annotation.Autowired; 20 | 21 | @RendererItemContainer("validationErrorDc") 22 | @FragmentDescriptor("validation-error-message-column-fragment.xml") 23 | public class ValidationErrorMessageColumnFragment extends FragmentRenderer { 24 | @Autowired 25 | protected Fragments fragments; 26 | 27 | @ViewComponent 28 | protected Span errorMessageText; 29 | 30 | @Override 31 | public void setItem(ResourceValidationError item) { 32 | super.setItem(item); 33 | 34 | String message = item.getMessage(); 35 | if (StringUtils.isNotEmpty(message)) { 36 | ValidationMessageTooltipFragment tooltipFragment = fragments.create(this, ValidationMessageTooltipFragment.class); 37 | tooltipFragment.setText(message); 38 | 39 | Popover popover = new Popover(tooltipFragment); 40 | popover.setPosition(PopoverPosition.BOTTOM_START); 41 | popover.setTarget(errorMessageText); 42 | } 43 | } 44 | 45 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/deploymenterror/ValidationErrorTypeColumnFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.deploymenterror; 7 | 8 | import com.vaadin.flow.component.html.Span; 9 | import com.vaadin.flow.component.orderedlayout.HorizontalLayout; 10 | import io.jmix.flowui.fragment.FragmentDescriptor; 11 | import io.jmix.flowui.fragmentrenderer.FragmentRenderer; 12 | import io.jmix.flowui.fragmentrenderer.RendererItemContainer; 13 | import io.jmix.flowui.view.ViewComponent; 14 | import io.openbpm.control.entity.deployment.ResourceValidationError; 15 | import io.openbpm.control.entity.deployment.ValidationErrorType; 16 | 17 | @RendererItemContainer("validationErrorDc") 18 | @FragmentDescriptor("validation-error-type-column-fragment.xml") 19 | public class ValidationErrorTypeColumnFragment extends FragmentRenderer { 20 | 21 | @ViewComponent 22 | protected Span errorType; 23 | 24 | @Override 25 | public void setItem(ResourceValidationError item) { 26 | super.setItem(item); 27 | 28 | ValidationErrorType type = item.getType(); 29 | switch (type) { 30 | case ERROR -> errorType.getElement().getThemeList().add("error"); 31 | case WARNING -> errorType.getElement().getThemeList().add("warning"); 32 | case null -> errorType.setVisible(false); 33 | default -> errorType.getElement().getThemeList().add("contrast"); 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/deploymenterror/ValidationMessageTooltipFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2025. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.deploymenterror; 7 | 8 | import com.vaadin.flow.component.ClickEvent; 9 | import com.vaadin.flow.component.Component; 10 | import com.vaadin.flow.component.html.Span; 11 | import com.vaadin.flow.component.orderedlayout.HorizontalLayout; 12 | import com.vaadin.flow.component.popover.Popover; 13 | import io.jmix.flowui.fragment.Fragment; 14 | import io.jmix.flowui.fragment.FragmentDescriptor; 15 | import io.jmix.flowui.kit.component.button.JmixButton; 16 | import io.jmix.flowui.view.Subscribe; 17 | import io.jmix.flowui.view.ViewComponent; 18 | 19 | import java.util.Optional; 20 | 21 | @FragmentDescriptor("validation-message-tooltip-fragment.xml") 22 | public class ValidationMessageTooltipFragment extends Fragment { 23 | 24 | @ViewComponent 25 | private Span errorMessage; 26 | 27 | public void setText(String text) { 28 | errorMessage.setText(text); 29 | } 30 | 31 | @Subscribe(id = "closeBtn", subject = "clickListener") 32 | protected void onCloseBtnClick(final ClickEvent event) { 33 | Popover popover = findPopover(this); 34 | if (popover != null) { 35 | popover.close(); 36 | } 37 | } 38 | 39 | protected Popover findPopover(Component component) { 40 | if (component instanceof Popover) { 41 | return (Popover) component; 42 | } else { 43 | Optional parent = component.getParent(); 44 | return parent.map(this::findPopover).orElse(null); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/event/TitleUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.event; 7 | 8 | import com.vaadin.flow.component.Component; 9 | import lombok.Getter; 10 | import org.springframework.context.ApplicationEvent; 11 | 12 | @Getter 13 | public class TitleUpdateEvent extends ApplicationEvent { 14 | private final String title; 15 | private Component suffixComponent; 16 | 17 | public TitleUpdateEvent(Object source, String title, Component suffixComponent) { 18 | super(source); 19 | this.title = title; 20 | this.suffixComponent = suffixComponent; 21 | } 22 | 23 | public TitleUpdateEvent(Object source, String title) { 24 | super(source); 25 | this.title = title; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/incidentdata/IncidentHeaderFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.incidentdata; 7 | 8 | import com.vaadin.flow.component.grid.Grid; 9 | import io.jmix.flowui.component.grid.DataGridColumn; 10 | import io.jmix.flowui.model.InstanceContainer; 11 | import io.openbpm.control.entity.filter.IncidentFilter; 12 | import io.openbpm.control.entity.incident.IncidentData; 13 | import io.openbpm.control.uicomponent.ContainerDataGridHeaderFilter; 14 | 15 | public abstract class IncidentHeaderFilter extends ContainerDataGridHeaderFilter { 16 | public IncidentHeaderFilter(Grid dataGrid, 17 | DataGridColumn column, 18 | InstanceContainer filterDc) { 19 | super(dataGrid, column, filterDc); 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/job/JobErrorDetailsView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.job; 7 | 8 | import com.vaadin.flow.router.Route; 9 | import io.jmix.flowui.component.codeeditor.CodeEditor; 10 | import io.jmix.flowui.view.*; 11 | import io.openbpm.control.action.CopyComponentValueToClipboardAction; 12 | import io.openbpm.control.service.job.JobService; 13 | import io.openbpm.control.view.main.MainView; 14 | import org.springframework.beans.factory.annotation.Autowired; 15 | 16 | @Route(value = "job-error-details", layout = MainView.class) 17 | @ViewController("JobErrorDetailsView") 18 | @ViewDescriptor("job-error-details-view.xml") 19 | public class JobErrorDetailsView extends StandardView { 20 | @Autowired 21 | protected JobService jobService; 22 | 23 | @ViewComponent 24 | protected CodeEditor errorDetailsCodeEditor; 25 | @ViewComponent 26 | protected CopyComponentValueToClipboardAction copy; 27 | 28 | protected String jobId; 29 | protected boolean fromHistory = false; 30 | 31 | public void setJobId(String jobId) { 32 | this.jobId = jobId; 33 | } 34 | 35 | public void fromHistory() { 36 | this.fromHistory = true; 37 | } 38 | 39 | @Subscribe 40 | public void onBeforeShow(final BeforeShowEvent event) { 41 | String errorDetails; 42 | if (fromHistory) { 43 | errorDetails = jobService.getHistoryErrorDetails(jobId); 44 | } else { 45 | errorDetails = jobService.getErrorDetails(jobId); 46 | } 47 | 48 | errorDetailsCodeEditor.setValue(errorDetails); 49 | copy.setTarget(errorDetailsCodeEditor); 50 | } 51 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processdefinition/ProcessDefinitionBulkOperationView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processdefinition; 7 | 8 | import com.vaadin.flow.component.icon.Icon; 9 | import com.vaadin.flow.theme.lumo.LumoUtility; 10 | import io.openbpm.control.entity.processdefinition.ProcessDefinitionData; 11 | import io.jmix.flowui.view.StandardView; 12 | import io.jmix.flowui.view.Subscribe; 13 | import io.jmix.flowui.view.ViewComponent; 14 | 15 | import java.util.Collection; 16 | import java.util.Set; 17 | import java.util.stream.Collectors; 18 | 19 | public abstract class ProcessDefinitionBulkOperationView extends StandardView { 20 | @ViewComponent 21 | protected Icon allVersionsContextHelp; 22 | @ViewComponent 23 | protected Icon allInstancesContextHelp; 24 | 25 | protected Collection processDefinitions; 26 | 27 | 28 | @Subscribe 29 | public void onInit(final InitEvent event) { 30 | onInit(); 31 | } 32 | 33 | protected void onInit() { 34 | addClassNames(LumoUtility.Padding.Top.NONE, LumoUtility.Padding.Left.LARGE); 35 | allVersionsContextHelp.addClassNames(LumoUtility.TextColor.SECONDARY); 36 | allInstancesContextHelp.addClassNames(LumoUtility.TextColor.SECONDARY); 37 | } 38 | 39 | @SuppressWarnings("LombokSetterMayBeUsed") 40 | public void setProcessDefinitions(Collection processDefinitions) { 41 | this.processDefinitions = processDefinitions; 42 | } 43 | 44 | public Set collectProcessDefinitionKeys() { 45 | return processDefinitions.stream() 46 | .map(ProcessDefinitionData::getKey) 47 | .collect(Collectors.toSet()); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/LazyTabContent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance; 7 | 8 | import com.vaadin.flow.component.Component; 9 | import com.vaadin.flow.component.html.Div; 10 | import com.vaadin.flow.function.SerializableSupplier; 11 | import com.vaadin.flow.theme.lumo.LumoUtility; 12 | 13 | public class LazyTabContent extends Div { 14 | protected SerializableSupplier supplier; 15 | 16 | public LazyTabContent(SerializableSupplier supplier) { 17 | addClassNames(LumoUtility.Width.FULL, LumoUtility.Height.FULL); 18 | initComponent(supplier); 19 | this.supplier = supplier; 20 | } 21 | 22 | protected void initComponent(SerializableSupplier supplier) { 23 | addAttachListener(event -> { 24 | if (getElement().getChildCount() == 0) { 25 | add(supplier.get()); 26 | } 27 | }); 28 | } 29 | 30 | public void init() { 31 | if (getElement().getChildCount() == 0) { 32 | add(this.supplier.get()); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/ProcessInstanceStateColumnFragment.java: -------------------------------------------------------------------------------- 1 | package io.openbpm.control.view.processinstance; 2 | 3 | import com.vaadin.flow.component.html.Span; 4 | import com.vaadin.flow.component.icon.Icon; 5 | import com.vaadin.flow.component.orderedlayout.HorizontalLayout; 6 | import io.jmix.flowui.fragment.FragmentDescriptor; 7 | import io.jmix.flowui.fragmentrenderer.FragmentRenderer; 8 | import io.jmix.flowui.fragmentrenderer.RendererItemContainer; 9 | import io.jmix.flowui.view.ViewComponent; 10 | import io.openbpm.control.entity.processinstance.ProcessInstanceData; 11 | import io.openbpm.control.view.util.ComponentHelper; 12 | import org.apache.commons.lang3.BooleanUtils; 13 | import org.springframework.beans.factory.annotation.Autowired; 14 | 15 | @FragmentDescriptor("process-instance-state-column-fragment.xml") 16 | @RendererItemContainer("processInstanceDataDc") 17 | public class ProcessInstanceStateColumnFragment extends FragmentRenderer { 18 | 19 | @Autowired 20 | protected ComponentHelper componentHelper; 21 | @ViewComponent 22 | protected Icon incidentIcon; 23 | 24 | @Override 25 | public void setItem(ProcessInstanceData item) { 26 | super.setItem(item); 27 | 28 | Span processInstanceStateBadge = componentHelper.createProcessInstanceStateBadge(item.getState()); 29 | getContent().addComponentAsFirst(processInstanceStateBadge); 30 | 31 | incidentIcon.setVisible(BooleanUtils.isTrue(item.getHasIncidents())); 32 | } 33 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/ProcessInstanceViewMode.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance; 7 | 8 | import io.jmix.core.metamodel.datatype.EnumClass; 9 | 10 | import org.springframework.lang.Nullable; 11 | 12 | 13 | public enum ProcessInstanceViewMode implements EnumClass { 14 | 15 | ALL("all"), 16 | ACTIVE("active"), 17 | COMPLETED("completed"); 18 | 19 | private final String id; 20 | 21 | ProcessInstanceViewMode(String id) { 22 | this.id = id; 23 | } 24 | 25 | public String getId() { 26 | return id; 27 | } 28 | 29 | @Nullable 30 | public static ProcessInstanceViewMode fromId(String id) { 31 | for (ProcessInstanceViewMode at : ProcessInstanceViewMode.values()) { 32 | if (at.getId().equals(id)) { 33 | return at; 34 | } 35 | } 36 | return null; 37 | } 38 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/ExternalTaskCountUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | public class ExternalTaskCountUpdateEvent extends ApplicationEvent { 11 | private final long count; 12 | 13 | public ExternalTaskCountUpdateEvent(Object source, long count) { 14 | super(source); 15 | this.count = count; 16 | } 17 | 18 | public long getCount() { 19 | return count; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/ExternalTaskRetriesUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | 11 | public class ExternalTaskRetriesUpdateEvent extends ApplicationEvent { 12 | 13 | public ExternalTaskRetriesUpdateEvent(Object source) { 14 | super(source); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/HistoryActivityCountUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | 11 | public class HistoryActivityCountUpdateEvent extends ApplicationEvent { 12 | private final long count; 13 | 14 | public HistoryActivityCountUpdateEvent(Object source, long count) { 15 | super(source); 16 | this.count = count; 17 | } 18 | 19 | public long getCount() { 20 | return count; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/HistoryIncidentCountUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | 11 | public class HistoryIncidentCountUpdateEvent extends ApplicationEvent { 12 | private final long count; 13 | 14 | public HistoryIncidentCountUpdateEvent(Object source, long count) { 15 | super(source); 16 | this.count = count; 17 | } 18 | 19 | public long getCount() { 20 | return count; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/HistoryUserTaskCountUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | 11 | public class HistoryUserTaskCountUpdateEvent extends ApplicationEvent { 12 | private long count; 13 | 14 | public HistoryUserTaskCountUpdateEvent(Object source) { 15 | super(source); 16 | } 17 | 18 | public HistoryUserTaskCountUpdateEvent(Object source, long count) { 19 | super(source); 20 | this.count = count; 21 | } 22 | 23 | public long getCount() { 24 | return count; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/HistoryVariableCountUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | 11 | public class HistoryVariableCountUpdateEvent extends ApplicationEvent { 12 | private final long count; 13 | 14 | public HistoryVariableCountUpdateEvent(Object source, long count) { 15 | super(source); 16 | this.count = count; 17 | } 18 | 19 | public long getCount() { 20 | return count; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/IncidentCountUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | 11 | public class IncidentCountUpdateEvent extends ApplicationEvent { 12 | private final long count; 13 | 14 | public IncidentCountUpdateEvent(Object source, long count) { 15 | super(source); 16 | this.count = count; 17 | } 18 | 19 | public long getCount() { 20 | return count; 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/IncidentUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | 11 | public class IncidentUpdateEvent extends ApplicationEvent { 12 | 13 | public IncidentUpdateEvent(Object source) { 14 | super(source); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/JobCountUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | public class JobCountUpdateEvent extends ApplicationEvent { 11 | private final long count; 12 | 13 | public JobCountUpdateEvent(Object source, long count) { 14 | super(source); 15 | this.count = count; 16 | } 17 | 18 | public long getCount() { 19 | return count; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/JobRetriesUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | 11 | public class JobRetriesUpdateEvent extends ApplicationEvent { 12 | 13 | public JobRetriesUpdateEvent(Object source) { 14 | super(source); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/event/UserTaskCountUpdateEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.event; 7 | 8 | import org.springframework.context.ApplicationEvent; 9 | 10 | 11 | public class UserTaskCountUpdateEvent extends ApplicationEvent { 12 | private final long count; 13 | 14 | public UserTaskCountUpdateEvent(Object source, long count) { 15 | super(source); 16 | this.count = count; 17 | } 18 | 19 | public long getCount() { 20 | return count; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/filter/ProcessInstanceDataGridHeaderFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.filter; 7 | 8 | import io.jmix.flowui.component.grid.DataGrid; 9 | import io.jmix.flowui.component.grid.DataGridColumn; 10 | import io.jmix.flowui.model.InstanceContainer; 11 | import io.openbpm.control.entity.filter.ProcessInstanceFilter; 12 | import io.openbpm.control.entity.processinstance.ProcessInstanceData; 13 | import io.openbpm.control.uicomponent.ContainerDataGridHeaderFilter; 14 | 15 | public abstract class ProcessInstanceDataGridHeaderFilter extends ContainerDataGridHeaderFilter { 16 | 17 | public ProcessInstanceDataGridHeaderFilter(DataGrid dataGrid, 18 | DataGridColumn column, 19 | InstanceContainer filterDc) { 20 | super(dataGrid, column, filterDc); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/processinstance/history/HasRefresh.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.processinstance.history; 7 | 8 | public interface HasRefresh { 9 | void refreshIfRequired(); 10 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/user/UserListView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.user; 7 | 8 | import io.openbpm.control.entity.User; 9 | import io.openbpm.control.view.main.MainView; 10 | import com.vaadin.flow.router.Route; 11 | import io.jmix.flowui.view.*; 12 | 13 | @Route(value = "users", layout = MainView.class) 14 | @ViewController("User.list") 15 | @ViewDescriptor("user-list-view.xml") 16 | @LookupComponent("usersDataGrid") 17 | @DialogMode(width = "64em") 18 | public class UserListView extends StandardListView { 19 | } -------------------------------------------------------------------------------- /src/main/java/io/openbpm/control/view/util/JsUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Haulmont 2024. All Rights Reserved. 3 | * Use is subject to license terms. 4 | */ 5 | 6 | package io.openbpm.control.view.util; 7 | 8 | public class JsUtils { 9 | public static final String COPY_SCRIPT_TEXT = """ 10 | const textarea = document.createElement("textarea"); 11 | textarea.value = $0; 12 | 13 | textarea.style.position = "absolute"; 14 | textarea.style.opacity = "0"; 15 | 16 | document.body.appendChild(textarea); 17 | textarea.select(); 18 | document.execCommand("copy"); 19 | document.body.removeChild(textarea); 20 | """; 21 | 22 | public static final String SET_DEFAULT_TIME_SCRIPT = """ 23 | this.__datePicker.addEventListener('change', function(){this.__timePicker.value='00:00';}.bind(this));"""; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/etc/about-product-metadata-de.json: -------------------------------------------------------------------------------- 1 | { 2 | "products": [ 3 | { 4 | "name": "OpenBPM Studio", 5 | "url": "https://plugins.jetbrains.com/plugin/25655-openbpm/", 6 | "description": "Plugin zur visuellen Modellierung von BPMN-Prozessen in IntelliJ IDEA", 7 | "released": true 8 | }, 9 | { 10 | "name": "OpenBPM Workspace (coming soon)", 11 | "url": "https://openbpm.io", 12 | "description": "Ein visuelles Werkzeug zur Erstellung eines fertigen Prototyps einer Geschäftsapplikation", 13 | "released": false 14 | }, 15 | { 16 | "name": "OpenBPM TaskList (coming soon)", 17 | "url": "https://openbpm.io", 18 | "description": "Open-Source-Webanwendung zur Anzeige von Benutzeraufgaben", 19 | "released": false 20 | } 21 | ], 22 | "externalLinks": [ 23 | { 24 | "label": "Webseite", 25 | "url": "https://openbpm.io/" 26 | }, 27 | { 28 | "label": "OpenBPM Control Dokumentation", 29 | "url": "https://github.com/openbpm-platform/openbpm-control?tab=readme-ov-file#table-of-contents" 30 | }, 31 | { 32 | "label": "Quellcode von OpenBPM Control", 33 | "url": "https://github.com/openbpm-platform/openbpm-control" 34 | }, 35 | { 36 | "label": "Support", 37 | "url": "https://join.slack.com/t/openbpm/shared_invite/zt-31ghauwhi-eaF8kkgtcM091pt4P4HXyA" 38 | } 39 | ] 40 | } -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/etc/about-product-metadata-es.json: -------------------------------------------------------------------------------- 1 | { 2 | "products": [ 3 | { 4 | "name": "OpenBPM Studio", 5 | "url": "https://plugins.jetbrains.com/plugin/25655-openbpm/", 6 | "description": "Complemento para el modelado visual de procesos BPMN en IntelliJ IDEA", 7 | "released": true 8 | }, 9 | { 10 | "name": "OpenBPM Workspace (próximamente)", 11 | "url": "https://openbpm.io", 12 | "description": "Una herramienta visual para crear un prototipo listo de una aplicación empresarial", 13 | "released": false 14 | }, 15 | { 16 | "name": "OpenBPM TaskList (próximamente)", 17 | "url": "https://openbpm.io", 18 | "description": "Aplicación web de código abierto para mostrar tareas de usuario final", 19 | "released": false 20 | } 21 | ], 22 | "externalLinks": [ 23 | { 24 | "label": "Sitio web", 25 | "url": "https://openbpm.io/" 26 | }, 27 | { 28 | "label": "Documentación de OpenBPM Control", 29 | "url": "https://github.com/openbpm-platform/openbpm-control?tab=readme-ov-file#table-of-contents" 30 | }, 31 | { 32 | "label": "Código fuente de OpenBPM Control", 33 | "url": "https://github.com/openbpm-platform/openbpm-control" 34 | }, 35 | { 36 | "label": "Soporte", 37 | "url": "https://join.slack.com/t/openbpm/shared_invite/zt-31ghauwhi-eaF8kkgtcM091pt4P4HXyA" 38 | } 39 | ] 40 | } -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/etc/about-product-metadata-ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "products": [ 3 | { 4 | "name": "OpenBPM Studio", 5 | "url": "https://openbpm.ru", 6 | "description": "Плагин для визуального моделирования BPMN-процессов в IntelliJ IDEA", 7 | "released": true 8 | }, 9 | { 10 | "name": "OpenBPM Workspace (скоро появится)", 11 | "url": "https://openbpm.ru", 12 | "description": "Инструмент для визуального создания прототипов систем с бизнес процессами", 13 | "released": false 14 | }, 15 | { 16 | "name": "OpenBPM TaskList (скоро появится)", 17 | "url": "https://openbpm.ru", 18 | "description": "Open-source веб-приложение для отображения и работы с задачами пользователей", 19 | "released": false 20 | }, 21 | { 22 | "name": "OpenBPM Engine (скоро появится)", 23 | "url": "https://openbpm.ru", 24 | "description": "BPM-движок, совместимый по API с Camunda 7", 25 | "released": false 26 | } 27 | ], 28 | "externalLinks": [ 29 | { 30 | "url": "https://openbpm.ru/", 31 | "label": "Вебсайт" 32 | }, 33 | { 34 | "url": "https://github.com/openbpm-platform/openbpm-control?tab=readme-ov-file#table-of-contents", 35 | "label": "Документация OpenBPM Control" 36 | }, 37 | { 38 | "url": "https://github.com/openbpm-platform/openbpm-control", 39 | "label": "Исходный код OpenBPM Control" 40 | }, 41 | { 42 | "url": "https://t.me/openbpm_chat", 43 | "label": "Поддержка" 44 | }, 45 | { 46 | "url": "https://t.me/openbpm", 47 | "label": "Телеграм канал" 48 | } 49 | ] 50 | } -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/etc/about-product-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "products": [ 3 | { 4 | "name": "OpenBPM Studio", 5 | "url": "https://plugins.jetbrains.com/plugin/25655-openbpm/", 6 | "description": "Plugin for visual modeling of BPMN processes in IntelliJ IDEA", 7 | "released": true 8 | }, 9 | { 10 | "name": "OpenBPM Workspace (coming soon)", 11 | "url": "https://openbpm.io", 12 | "description": "A visual tool to create a ready-made prototype of a business application", 13 | "released": false 14 | }, 15 | { 16 | "name": "OpenBPM TaskList (coming soon)", 17 | "url": "https://openbpm.io", 18 | "description": "Open-source web application for displaying end-user tasks", 19 | "released": false 20 | } 21 | ], 22 | "externalLinks": [ 23 | { 24 | "label": "Website", 25 | "url": "https://openbpm.io/" 26 | }, 27 | { 28 | "label": "OpenBPM Control Documentation", 29 | "url": "https://github.com/openbpm-platform/openbpm-control?tab=readme-ov-file#table-of-contents" 30 | }, 31 | { 32 | "label": "OpenBPM Control Source code", 33 | "url": "https://github.com/openbpm-platform/openbpm-control" 34 | }, 35 | { 36 | "label": "Support", 37 | "url": "https://join.slack.com/t/openbpm/shared_invite/zt-31ghauwhi-eaF8kkgtcM091pt4P4HXyA" 38 | } 39 | ] 40 | } -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/icons/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openbpm-platform/openbpm-control/97a185d5b5cef6d389cb90b9a351081feaa25ce9/src/main/resources/META-INF/resources/icons/logo.png -------------------------------------------------------------------------------- /src/main/resources/META-INF/resources/icons/preview.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/resources/io/openbpm/control/control-ui-components.xsd: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/main/resources/io/openbpm/control/liquibase/changelog.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/main/resources/io/openbpm/control/view/about/external-link-fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/resources/io/openbpm/control/view/about/product-info-fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/main/resources/io/openbpm/control/view/alltasks/task-key-column-fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/resources/io/openbpm/control/view/bpmengine/basic-auth-fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/main/resources/io/openbpm/control/view/bpmengine/bpm-engine-list-actions-fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
21 | 22 | -------------------------------------------------------------------------------- /src/main/resources/io/openbpm/control/view/dashboard/user-task-statistics-card-fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 |
9 | 11 | 12 | 13 | 14 | 15 |

16 | 17 | 18 |

22 |
23 |
-------------------------------------------------------------------------------- /src/main/resources/io/openbpm/control/view/decisiondeployment/decision-deployment-confirm-content-fragment.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/resources/io/openbpm/control/view/deploymentdata/deployment-list-item-actions-fragment.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |