@finos/legend-studio
Version:
145 lines • 12.9 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
/**
* 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 { observer } from 'mobx-react-lite';
import { useParams } from 'react-router';
import { Link } from 'react-router-dom';
import { clsx, HammerIcon, SyncIcon, FireIcon, CodeBranchIcon, TerminalIcon, HackerIcon, BrushIcon, CloudUploadIcon, AssistantIcon, } from '@finos/legend-art';
import { LEGEND_STUDIO_TEST_ID } from '../LegendStudioTestID.js';
import { ACTIVITY_MODE } from '../../stores/EditorConfig.js';
import { generateSetupRoute, } from '../../stores/LegendStudioRouter.js';
import { flowResult } from 'mobx';
import { useEditorStore } from './EditorStoreProvider.js';
import { WorkspaceType } from '@finos/legend-server-sdlc';
import { useLegendStudioApplicationStore } from '../LegendStudioBaseStoreProvider.js';
export const StatusBar = observer((props) => {
const { actionsDisabled } = props;
const params = useParams();
const editorStore = useEditorStore();
const applicationStore = useLegendStudioApplicationStore();
const isInConflictResolutionMode = editorStore.isInConflictResolutionMode;
// SDLC
const projectId = params.projectId;
const workspaceType = params
.groupWorkspaceId
? WorkspaceType.GROUP
: WorkspaceType.USER;
const workspaceId = workspaceType === WorkspaceType.GROUP
? params.groupWorkspaceId
: params.workspaceId;
const currentProject = editorStore.sdlcState.currentProject;
const goToWorkspaceUpdater = () => editorStore.setActiveActivity(isInConflictResolutionMode
? ACTIVITY_MODE.CONFLICT_RESOLUTION
: ACTIVITY_MODE.WORKSPACE_UPDATER);
const goToLocalChanges = () => editorStore.setActiveActivity(ACTIVITY_MODE.LOCAL_CHANGES);
// Change Detection
const changes = editorStore.changeDetectionState.workspaceLocalLatestRevisionState.changes
.length;
const configurationState = editorStore.projectConfigurationEditorState;
const pushLocalChanges = applicationStore.guardUnhandledError(() => flowResult(editorStore.localChangesState.pushLocalChanges()));
// TODO: we probably should refactor this, these messages are not that helpful and
// meant for different purposes
const pushStatusText = editorStore.graphManagerState.graphBuildState.hasFailed ||
editorStore.changeDetectionState.initState.hasFailed
? 'change detection halted'
: !editorStore.changeDetectionState.initState.hasSucceeded
? editorStore.changeDetectionState.workspaceLocalLatestRevisionState
.isBuildingEntityHashesIndex
? 'building indexes...'
: 'starting change detection...'
: editorStore.localChangesState.pushChangesState.isInProgress
? 'pushing local changes...'
: configurationState.isUpdatingConfiguration
? 'updating configuration...'
: changes
? `${changes} unpushed changes`
: 'no changes detected';
const workspaceOutOfSync = !actionsDisabled && editorStore.sdlcState.isWorkspaceOutOfSync;
// Conflict resolution
const conflicts = editorStore.conflictResolutionState.conflicts.length;
const acceptConflictResolution = applicationStore.guardUnhandledError(() => flowResult(editorStore.conflictResolutionState.acceptConflictResolution()));
// TODO: we probably should refactor this, these messages are not that helpful and
// meant for different purposes
const conflictResolutionStatusText = editorStore.graphManagerState.graphBuildState.hasFailed ||
editorStore.changeDetectionState.initState.hasFailed
? 'change detection halted'
: !editorStore.changeDetectionState.initState.hasSucceeded
? editorStore.changeDetectionState.workspaceLocalLatestRevisionState
.isBuildingEntityHashesIndex
? 'building indexes...'
: 'starting change detection...'
: editorStore.conflictResolutionState.isAcceptingConflictResolution
? 'submitting conflict resolution...'
: conflicts
? `has unresolved merge conflicts`
: editorStore.conflictResolutionState.hasResolvedAllConflicts
? 'conflict resolution not accepted'
: 'all conflicts resolved';
// Other actions
const toggleAuxPanel = () => editorStore.auxPanelDisplayState.toggle();
const handleTextModeClick = applicationStore.guardUnhandledError(() => flowResult(editorStore.toggleTextMode()));
const compile = applicationStore.guardUnhandledError(() => editorStore.isInGrammarTextMode
? flowResult(editorStore.graphState.globalCompileInTextMode())
: flowResult(editorStore.graphState.globalCompileInFormMode()));
const generate = applicationStore.guardUnhandledError(() => flowResult(editorStore.graphState.graphGenerationState.globalGenerate()));
const emptyGenerationEntities = applicationStore.guardUnhandledError(() => flowResult(editorStore.graphState.graphGenerationState.clearGenerations()));
const toggleAssistant = () => applicationStore.assistantService.toggleAssistant();
return (_jsxs("div", { "data-testid": LEGEND_STUDIO_TEST_ID.STATUS_BAR, className: clsx('editor__status-bar', {
'editor__status-bar--conflict-resolution': isInConflictResolutionMode,
}), children: [_jsx("div", { className: "editor__status-bar__left", children: _jsxs("div", { className: "editor__status-bar__workspace", children: [_jsx("div", { className: "editor__status-bar__workspace__icon", children: _jsx(CodeBranchIcon, {}) }), _jsx("div", { className: "editor__status-bar__workspace__project", children: _jsx(Link, { to: generateSetupRoute(projectId), children: currentProject?.name ?? 'unknown' }) }), "/", _jsx("div", { className: "editor__status-bar__workspace__workspace", children: _jsx(Link, { to: generateSetupRoute(projectId, workspaceId, workspaceType), children: workspaceId }) }), workspaceOutOfSync && (_jsx("button", { className: "editor__status-bar__workspace__status", tabIndex: -1, onClick: goToLocalChanges, title: 'Local workspace is out-of-sync. Click to see incoming changes to your workspace.', children: "OUT-OF-SYNC" })), editorStore.sdlcState.isWorkspaceOutdated && !workspaceOutOfSync && (_jsx("button", { className: "editor__status-bar__workspace__status", tabIndex: -1, onClick: goToWorkspaceUpdater, title: 'Workspace is outdated. Click to see latest changes of the project', children: "OUTDATED" }))] }) }), _jsxs("div", { "data-testid": LEGEND_STUDIO_TEST_ID.EDITOR__STATUS_BAR__RIGHT, className: "editor__status-bar__right", children: [isInConflictResolutionMode && (_jsxs("div", { className: "editor__status-bar__workspace-sync", children: [_jsx("div", { className: "editor__status-bar__workspace-sync__status", children: conflictResolutionStatusText }), _jsx("button", { className: clsx('editor__status-bar__push-changes__btn', {
'editor__status-bar__push-changes__btn--loading': editorStore.conflictResolutionState
.isAcceptingConflictResolution,
}), onClick: acceptConflictResolution, disabled: Boolean(conflicts) ||
!editorStore.conflictResolutionState.hasResolvedAllConflicts ||
editorStore.localChangesState.pushChangesState.isInProgress ||
editorStore.workspaceUpdaterState.isUpdatingWorkspace ||
editorStore.conflictResolutionState
.isInitializingConflictResolution ||
editorStore.conflictResolutionState
.isAcceptingConflictResolution ||
editorStore.conflictResolutionState
.isDiscardingConflictResolutionChanges ||
editorStore.conflictResolutionState.isAbortingConflictResolution, tabIndex: -1, title: "Accept conflict resolution", children: _jsx(SyncIcon, {}) })] })), !isInConflictResolutionMode && (_jsxs("div", { className: "editor__status-bar__workspace-sync", children: [_jsx("div", { className: "editor__status-bar__workspace-sync__status", children: pushStatusText }), _jsx("button", { className: clsx('editor__status-bar__push-changes__btn', {
'editor__status-bar__push-changes__btn--loading': editorStore.localChangesState.pushChangesState.isInProgress ||
configurationState.isUpdatingConfiguration,
}), onClick: pushLocalChanges, disabled: !changes ||
configurationState.isUpdatingConfiguration ||
editorStore.localChangesState.pushChangesState.isInProgress ||
editorStore.changeDetectionState
.workspaceLocalLatestRevisionState
.isBuildingEntityHashesIndex ||
actionsDisabled, tabIndex: -1, title: "Push local changes (Ctrl + S)", children: _jsx(CloudUploadIcon, {}) })] })), _jsx("button", { className: clsx('editor__status-bar__action editor__status-bar__generate-btn', {
'editor__status-bar__generate-btn--wiggling': editorStore.graphState.graphGenerationState
.isRunningGlobalGenerate,
}), disabled: editorStore.graphState.isApplicationUpdateOperationIsRunning ||
actionsDisabled ||
!editorStore.graphManagerState.graph.ownGenerationSpecifications
.length, onClick: generate, tabIndex: -1, title: "Generate (F10)", children: _jsx(FireIcon, {}) }), _jsx("button", { className: clsx('editor__status-bar__action editor__status-bar__clear__generation-btn ', {
'editor__status-bar__action editor__status-bar__clear__generation-btn--wiggling': editorStore.graphState.graphGenerationState
.isClearingGenerationEntities,
}), disabled: editorStore.graphState.isApplicationUpdateOperationIsRunning ||
actionsDisabled, onClick: emptyGenerationEntities, tabIndex: -1, title: "Clear generation entities", children: _jsx(BrushIcon, {}) }), _jsx("button", { className: clsx('editor__status-bar__action editor__status-bar__compile-btn', {
'editor__status-bar__compile-btn--wiggling': editorStore.graphState.isRunningGlobalCompile,
}), disabled: editorStore.graphState.isApplicationUpdateOperationIsRunning ||
actionsDisabled, onClick: compile, tabIndex: -1, title: "Compile (F9)", children: _jsx(HammerIcon, {}) }), _jsx("button", { className: clsx('editor__status-bar__action editor__status-bar__action__toggler', {
'editor__status-bar__action__toggler--active': editorStore.auxPanelDisplayState.isOpen,
}), onClick: toggleAuxPanel, tabIndex: -1, title: "Toggle auxiliary panel (Ctrl + `)", children: _jsx(TerminalIcon, {}) }), _jsx("button", { className: clsx('editor__status-bar__action editor__status-bar__action__toggler', {
'editor__status-bar__action editor__status-bar__action__toggler--active': editorStore.isInGrammarTextMode,
}), disabled: actionsDisabled, onClick: handleTextModeClick, tabIndex: -1, title: "Toggle text mode (F8)", children: _jsx(HackerIcon, {}) }), _jsx("button", { className: clsx('editor__status-bar__action editor__status-bar__action__toggler', {
'editor__status-bar__action__toggler--active': !applicationStore.assistantService.isHidden,
}), onClick: toggleAssistant, tabIndex: -1, title: "Toggle assistant", children: _jsx(AssistantIcon, {}) })] })] }));
});
//# sourceMappingURL=StatusBar.js.map