/** * Copyright (c) 2020-present, Goldman Sachs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { forwardRef, useEffect } from 'react'; import { observer } from 'mobx-react-lite'; import { LEGEND_STUDIO_TEST_ID } from '../../../__lib__/LegendStudioTesting.js'; import { useEditorStore } from '../EditorStoreProvider.js'; import { ContextMenu, PanelContent, PURE_ServiceIcon, clsx, PlayIcon, Dialog, Modal, TimesIcon, CheckCircleIcon, CircleNotchIcon, TimesCircleIcon, EmptyCircleIcon, MenuContentItem, MenuContent, ModalBody, ModalHeader, ModalFooter, ModalFooterButton, CheckSquareIcon, SquareIcon, } from '@finos/legend-art'; import { type GlobalBulkServiceRegistrationState, REGISTRATION_RESULT, getServiceRegistrationResult, type BulkServiceRegistrationState, } from '../../../stores/editor/sidebar-state/BulkServiceRegistrationState.js'; import { BulkServiceRegistrationEditor } from '../editor-group/service-editor/BulkServiceRegistrationEditor.js'; import { guaranteeNonNullable, noop } from '@finos/legend-shared'; import { ServiceRegistrationFail, type ServiceRegistrationResult, ServiceRegistrationSuccess, } from '@finos/legend-graph'; import { generateServiceManagementUrl } from '../../../stores/editor/editor-state/element-editor-state/service/ServiceRegistrationState.js'; import { useApplicationStore } from '@finos/legend-application'; import { CODE_EDITOR_LANGUAGE } from '@finos/legend-code-editor'; import { CodeEditor } from '@finos/legend-lego/code-editor'; export const getRegistrationStatusIcon = ( isSelected: boolean, registrationResult: REGISTRATION_RESULT, ): React.ReactNode => { if (registrationResult === REGISTRATION_RESULT.SUCCESS) { return (
); } else if ( registrationResult === REGISTRATION_RESULT.IN_PROGRESS && isSelected ) { return (
); } else if (registrationResult === REGISTRATION_RESULT.FAILED) { return (
); } else { return (
); } }; const ServiceContextMenu = observer( forwardRef< HTMLDivElement, { globalServiceRegistrationState: GlobalBulkServiceRegistrationState; serviceState: BulkServiceRegistrationState; } >(function ServiceContextMenu(props, ref) { const { serviceState, globalServiceRegistrationState } = props; const applicationStore = useApplicationStore(); return ( {serviceState.registrationResult instanceof ServiceRegistrationSuccess && ( { const config = guaranteeNonNullable( globalServiceRegistrationState.serviceConfigState.options.find( (info) => info.env === globalServiceRegistrationState.serviceConfigState .serviceEnv, ), ); applicationStore.navigationService.navigator.visitAddress( generateServiceManagementUrl( config.managementUrl, serviceState.service.pattern, ), ); }} > Launch Service )} {serviceState.registrationResult instanceof ServiceRegistrationFail && ( globalServiceRegistrationState.setFailingView( serviceState.registrationResult as ServiceRegistrationFail, ) } > View Error )} ); }), ); const ServiceFailViewer = observer( (props: { globalBulkServiceRegistrationState: GlobalBulkServiceRegistrationState; failure: ServiceRegistrationResult | undefined; }) => { const { globalBulkServiceRegistrationState, failure } = props; const applicationStore = globalBulkServiceRegistrationState.editorStore.applicationStore; const closeLogViewer = (): void => globalBulkServiceRegistrationState.setFailingView(undefined); return ( {failure instanceof ServiceRegistrationFail && ( )} ); }, ); export const RegisterService = observer( (props: { globalBulkServiceRegistrationState: GlobalBulkServiceRegistrationState; }) => { const editorStore = useEditorStore(); const applicationStore = editorStore.applicationStore; const services = editorStore.graphManagerState.graph.ownServices; const toggleSelectAllServices = (): void => { editorStore.globalBulkServiceRegistrationState.toggleSelectAllServices( !editorStore.globalBulkServiceRegistrationState.selectAllServices, ); editorStore.globalBulkServiceRegistrationState.setSelectAll( editorStore.globalBulkServiceRegistrationState.selectAllServices, ); }; const selectService = ( serviceState: BulkServiceRegistrationState, ): void => { serviceState.toggleIsSelected(); editorStore.globalBulkServiceRegistrationState.toggleSelectAllServices( editorStore.globalBulkServiceRegistrationState.bulkServiceRegistrationStates.filter( (bulkServiceState) => bulkServiceState.isSelected, ).length === editorStore.globalBulkServiceRegistrationState .bulkServiceRegistrationStates.length, ); }; useEffect(() => { editorStore.globalBulkServiceRegistrationState.init(); }, [editorStore.globalBulkServiceRegistrationState]); const serviceItems = (): React.ReactNode => ( <> {editorStore.globalBulkServiceRegistrationState.bulkServiceRegistrationStates.map( (serviceState) => ( } >
{getRegistrationStatusIcon( serviceState.isSelected, getServiceRegistrationResult( editorStore.globalBulkServiceRegistrationState .isServiceRegistering.isInProgress, serviceState.registrationResult, ), )}
{serviceState.service.name}
), )} ); return (
REGISTER SERVICES
Select All
SERVICES
{ editorStore.globalBulkServiceRegistrationState.bulkServiceRegistrationStates.filter( (serviceState) => serviceState.isSelected, ).length }{' '} / {services.length}
{serviceItems()} {editorStore.globalBulkServiceRegistrationState.failingView && ( )}
); }, );