feat(editor): Release the Focus Panel (#17734)

This commit is contained in:
Charlie Kolb
2025-07-28 12:10:29 +02:00
committed by GitHub
parent 08c38a76f3
commit a415dbfd96
5 changed files with 4 additions and 33 deletions

View File

@@ -1,17 +1,15 @@
<script setup lang="ts"> <script setup lang="ts">
/* eslint-disable vue/no-multiple-template-root */ /* eslint-disable vue/no-multiple-template-root */
import { computed, defineAsyncComponent } from 'vue'; import { defineAsyncComponent } from 'vue';
import { getMidCanvasPosition } from '@/utils/nodeViewUtils'; import { getMidCanvasPosition } from '@/utils/nodeViewUtils';
import { import {
DEFAULT_STICKY_HEIGHT, DEFAULT_STICKY_HEIGHT,
DEFAULT_STICKY_WIDTH, DEFAULT_STICKY_WIDTH,
FOCUS_PANEL_EXPERIMENT,
NODE_CREATOR_OPEN_SOURCES, NODE_CREATOR_OPEN_SOURCES,
STICKY_NODE_TYPE, STICKY_NODE_TYPE,
} from '@/constants'; } from '@/constants';
import { useUIStore } from '@/stores/ui.store'; import { useUIStore } from '@/stores/ui.store';
import { useFocusPanelStore } from '@/stores/focusPanel.store'; import { useFocusPanelStore } from '@/stores/focusPanel.store';
import { usePostHog } from '@/stores/posthog.store';
import type { import type {
AddedNodesAndConnections, AddedNodesAndConnections,
NodeTypeSelectedPayload, NodeTypeSelectedPayload,
@@ -45,17 +43,12 @@ const emit = defineEmits<{
const uiStore = useUIStore(); const uiStore = useUIStore();
const focusPanelStore = useFocusPanelStore(); const focusPanelStore = useFocusPanelStore();
const posthogStore = usePostHog();
const i18n = useI18n(); const i18n = useI18n();
const telemetry = useTelemetry(); const telemetry = useTelemetry();
const assistantStore = useAssistantStore(); const assistantStore = useAssistantStore();
const { getAddedNodesAndConnections } = useActions(); const { getAddedNodesAndConnections } = useActions();
const isOpenFocusPanelButtonVisible = computed(() => {
return posthogStore.getVariant(FOCUS_PANEL_EXPERIMENT.name) === FOCUS_PANEL_EXPERIMENT.variant;
});
function openNodeCreator() { function openNodeCreator() {
emit('toggleNodeCreator', { emit('toggleNodeCreator', {
source: NODE_CREATOR_OPEN_SOURCES.ADD_NODE_BUTTON, source: NODE_CREATOR_OPEN_SOURCES.ADD_NODE_BUTTON,
@@ -138,7 +131,6 @@ function onAskAssistantButtonClick() {
/> />
</KeyboardShortcutTooltip> </KeyboardShortcutTooltip>
<KeyboardShortcutTooltip <KeyboardShortcutTooltip
v-if="isOpenFocusPanelButtonVisible"
:label="i18n.baseText('nodeView.openFocusPanel')" :label="i18n.baseText('nodeView.openFocusPanel')"
:shortcut="{ keys: ['f'], shiftKey: true }" :shortcut="{ keys: ['f'], shiftKey: true }"
placement="left" placement="left"

View File

@@ -8,8 +8,7 @@ import {
import { isValueExpression } from '@/utils/nodeTypesUtils'; import { isValueExpression } from '@/utils/nodeTypesUtils';
import { computed } from 'vue'; import { computed } from 'vue';
import { useNDVStore } from '@/stores/ndv.store'; import { useNDVStore } from '@/stores/ndv.store';
import { usePostHog } from '@/stores/posthog.store'; import { AI_TRANSFORM_NODE_TYPE } from '@/constants';
import { AI_TRANSFORM_NODE_TYPE, FOCUS_PANEL_EXPERIMENT } from '@/constants';
import { getParameterTypeOption } from '@/utils/nodeSettingsUtils'; import { getParameterTypeOption } from '@/utils/nodeSettingsUtils';
interface Props { interface Props {
@@ -42,7 +41,6 @@ const emit = defineEmits<{
const i18n = useI18n(); const i18n = useI18n();
const ndvStore = useNDVStore(); const ndvStore = useNDVStore();
const posthogStore = usePostHog();
const activeNode = computed(() => ndvStore.activeNode); const activeNode = computed(() => ndvStore.activeNode);
const isDefault = computed(() => props.parameter.default === props.value); const isDefault = computed(() => props.parameter.default === props.value);
@@ -54,12 +52,8 @@ const shouldShowExpressionSelector = computed(
() => !props.parameter.noDataExpression && props.showExpressionSelector && !props.isReadOnly, () => !props.parameter.noDataExpression && props.showExpressionSelector && !props.isReadOnly,
); );
const isFocusPanelFeatureEnabled = computed(() => {
return posthogStore.getVariant(FOCUS_PANEL_EXPERIMENT.name) === FOCUS_PANEL_EXPERIMENT.variant;
});
const canBeOpenedInFocusPanel = computed( const canBeOpenedInFocusPanel = computed(
() => () =>
isFocusPanelFeatureEnabled.value &&
!props.parameter.isNodeSetting && !props.parameter.isNodeSetting &&
!props.isReadOnly && !props.isReadOnly &&
!props.isContentOverridden && !props.isContentOverridden &&

View File

@@ -759,12 +759,6 @@ export const EXTRA_TEMPLATE_LINKS_EXPERIMENT = {
variant: 'variant', variant: 'variant',
}; };
export const FOCUS_PANEL_EXPERIMENT = {
name: 'focus_panel',
control: 'control',
variant: 'variant',
};
export const TEMPLATE_ONBOARDING_EXPERIMENT = { export const TEMPLATE_ONBOARDING_EXPERIMENT = {
name: '035_template_onboarding', name: '035_template_onboarding',
control: 'control', control: 'control',

View File

@@ -16,7 +16,7 @@ import { watchOnce } from '@vueuse/core';
import { isFromAIOverrideValue } from '@/utils/fromAIOverrideUtils'; import { isFromAIOverrideValue } from '@/utils/fromAIOverrideUtils';
// matches NodeCreator to ensure they fully overlap by default when both are open // matches NodeCreator to ensure they fully overlap by default when both are open
const DEFAULT_PANEL_WIDTH = 385; const DEFAULT_PANEL_WIDTH = 500;
type FocusedNodeParameter = { type FocusedNodeParameter = {
nodeId: string; nodeId: string;

View File

@@ -54,7 +54,6 @@ import {
CHAT_TRIGGER_NODE_TYPE, CHAT_TRIGGER_NODE_TYPE,
DRAG_EVENT_DATA_KEY, DRAG_EVENT_DATA_KEY,
EnterpriseEditionFeature, EnterpriseEditionFeature,
FOCUS_PANEL_EXPERIMENT,
FROM_AI_PARAMETERS_MODAL_KEY, FROM_AI_PARAMETERS_MODAL_KEY,
MAIN_HEADER_TABS, MAIN_HEADER_TABS,
MANUAL_CHAT_TRIGGER_NODE_TYPE, MANUAL_CHAT_TRIGGER_NODE_TYPE,
@@ -253,10 +252,6 @@ const { extractWorkflow } = useWorkflowExtraction();
const { applyExecutionData } = useExecutionDebugging(); const { applyExecutionData } = useExecutionDebugging();
useClipboard({ onPaste: onClipboardPaste }); useClipboard({ onPaste: onClipboardPaste });
const isFocusPanelFeatureEnabled = computed(() => {
return usePostHog().getVariant(FOCUS_PANEL_EXPERIMENT.name) === FOCUS_PANEL_EXPERIMENT.variant;
});
const isLoading = ref(true); const isLoading = ref(true);
const isBlankRedirect = ref(false); const isBlankRedirect = ref(false);
const readOnlyNotification = ref<null | { visible: boolean }>(null); const readOnlyNotification = ref<null | { visible: boolean }>(null);
@@ -1228,10 +1223,6 @@ function onOpenNodeCreatorForTriggerNodes(source: NodeCreatorOpenSource) {
} }
function onToggleFocusPanel() { function onToggleFocusPanel() {
if (!isFocusPanelFeatureEnabled.value) {
return;
}
focusPanelStore.toggleFocusPanel(); focusPanelStore.toggleFocusPanel();
telemetry.track(`User ${focusPanelStore.focusPanelActive ? 'opened' : 'closed'} focus panel`, { telemetry.track(`User ${focusPanelStore.focusPanelActive ? 'opened' : 'closed'} focus panel`, {
source: 'canvasKeyboardShortcut', source: 'canvasKeyboardShortcut',
@@ -2172,7 +2163,7 @@ onBeforeUnmount(() => {
</Suspense> </Suspense>
</WorkflowCanvas> </WorkflowCanvas>
<FocusPanel <FocusPanel
v-if="isFocusPanelFeatureEnabled && !isLoading" v-if="!isLoading"
:is-canvas-read-only="isCanvasReadOnly" :is-canvas-read-only="isCanvasReadOnly"
@save-keyboard-shortcut="onSaveWorkflow" @save-keyboard-shortcut="onSaveWorkflow"
/> />