= ({ id, data, onEvent, onResize }):
[AttrNames.FocusedId]: id,
[AttrNames.SelectableElement]: true,
[AttrNames.SelectedId]: selectedId,
- [AttrNames.SelectionIndex]: getNodeIndex(selectedId),
+ [AttrNames.SelectionIndex]: getNodeIndex(id),
+ [AttrNames.Tab]: tab,
};
};
return (
= ({
useEffect((): void => {
resetSelectionData();
- setSelectedElements(querySelectedElements());
- }, [data]);
+ setSelectableElements(querySelectableElements());
+ }, [data, focusedEvent]);
const selection = new Selection({
onSelectionChanged: (): void => {
@@ -201,11 +201,10 @@ export const ObiEditor: FC = ({
},
});
- const querySelectedElements = () => {
- const items: NodeListOf = document.querySelectorAll(`[${AttrNames.SelectableElement}]`);
- return items;
+ const querySelectableElements = (): NodeListOf => {
+ return document.querySelectorAll(`[${AttrNames.SelectableElement}]`);
};
- const [selectedElements, setSelectedElements] = useState>(querySelectedElements());
+ const [selectableElements, setSelectableElements] = useState>(querySelectableElements());
const getClipboardTargetsFromContext = (): string[] => {
const selectedActionIds = normalizeSelection(selectionContext.selectedIds);
@@ -251,12 +250,12 @@ export const ObiEditor: FC = ({
break;
case KeyboardPrimaryTypes.Cursor: {
const currentSelectedId = selectionContext.selectedIds[0] || focusedId;
- const { selected, focused } = moveCursor(selectedElements, currentSelectedId, command);
+ const { selected, focused, tab } = moveCursor(selectableElements, currentSelectedId, command);
setSelectionContext({
getNodeIndex: selectionContext.getNodeIndex,
selectedIds: [selected as string],
});
- focused && onFocusSteps([focused]);
+ focused && onFocusSteps([focused], tab);
break;
}
case KeyboardPrimaryTypes.Operation: {
diff --git a/Composer/packages/extensions/visual-designer/src/index.tsx b/Composer/packages/extensions/visual-designer/src/index.tsx
index 7bd0a29ddf..a78154826f 100644
--- a/Composer/packages/extensions/visual-designer/src/index.tsx
+++ b/Composer/packages/extensions/visual-designer/src/index.tsx
@@ -15,6 +15,7 @@ const VisualDesigner: React.FC = ({
dialogId,
focusedEvent,
focusedSteps,
+ focusedTab,
data: inputData,
shellApi,
}): JSX.Element => {
@@ -48,6 +49,7 @@ const VisualDesigner: React.FC = ({
const [context, setContext] = useState({
focusedId,
focusedEvent,
+ focusedTab,
getLgTemplates: getLgTemplates,
removeLgTemplate: removeLgTemplate,
});
@@ -57,8 +59,9 @@ const VisualDesigner: React.FC = ({
...context,
focusedId,
focusedEvent,
+ focusedTab,
});
- }, [focusedEvent, focusedSteps]);
+ }, [focusedEvent, focusedSteps, focusedTab]);
return (
@@ -87,6 +90,7 @@ interface VisualDesignerProps {
dialogId: string;
focusedEvent: string;
focusedSteps: string[];
+ focusedTab: string;
shellApi: any;
currentDialog: { id: string; displayName: string; isRoot: boolean };
}
diff --git a/Composer/packages/extensions/visual-designer/src/store/NodeRendererContext.ts b/Composer/packages/extensions/visual-designer/src/store/NodeRendererContext.ts
index 7a05e99252..eed3c88213 100644
--- a/Composer/packages/extensions/visual-designer/src/store/NodeRendererContext.ts
+++ b/Composer/packages/extensions/visual-designer/src/store/NodeRendererContext.ts
@@ -8,6 +8,7 @@ interface LgTemplate {
export const NodeRendererContext = React.createContext({
focusedId: '',
focusedEvent: '',
+ focusedTab: '',
getLgTemplates: (_id: string, _templateName: string) => Promise.resolve([] as LgTemplate[]),
removeLgTemplate: (_id: string, _templateName: string) => Promise.resolve(),
});
diff --git a/Composer/packages/extensions/visual-designer/src/utils/cursorTracker.ts b/Composer/packages/extensions/visual-designer/src/utils/cursorTracker.ts
index 11013e5128..77056c0fdb 100644
--- a/Composer/packages/extensions/visual-designer/src/utils/cursorTracker.ts
+++ b/Composer/packages/extensions/visual-designer/src/utils/cursorTracker.ts
@@ -60,7 +60,7 @@ function localeNearestElement(
assistDistance = Math.abs(
currentElementBounds.top + currentElementBounds.height / 2 - (bounds.top + bounds.height / 2)
);
- if (distance > 0 && distance <= minDistance && assistMinDistance > assistDistance) {
+ if (distance > 0 && distance <= minDistance && assistMinDistance >= assistDistance) {
neareastElement = element;
minDistance = distance;
assistMinDistance = assistDistance;
@@ -184,7 +184,8 @@ export function moveCursor(
element.scrollIntoView(true);
return {
- selected: element.dataset.selectedId || id,
- focused: element.dataset.focusedId,
+ selected: element.getAttribute(AttrNames.SelectedId) || id,
+ focused: element.getAttribute(AttrNames.FocusedId) || undefined,
+ tab: element.getAttribute(AttrNames.Tab) || '',
};
}