Skip to content

Commit 26c18e8

Browse files
authored
fix: Sender skill focus at start (#1504)
* fix: submit disabled * fix: submit disabled * feat: update * feat: update * test: css * fix: onchange * fix: onchange * fix: sender onchange * fix: sender onchange * feat: sender * feat: sender * fix: sender onchange * fix: sender * test: sender * test: snap * test: snap * test: snap * test: actions * feat: sender * test: snap * test: snap * test: snap * test: snap * fix: ts * fix: ts * fix: skill focus * fix: skill focus * fix: skill focus * fix: skill focus * docs: update * docs: update * feat: focus
1 parent 7dadbfc commit 26c18e8

File tree

4 files changed

+22
-14
lines changed

4 files changed

+22
-14
lines changed

packages/x/components/sender/SlotTextArea.tsx

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,26 +113,27 @@ const SlotTextArea = React.forwardRef<SlotTextAreaRef>((_, ref) => {
113113
const newValue = getEditorValue();
114114
if (skillDomRef.current) {
115115
if (!newValue?.value && newValue.slotConfig.length === 0) {
116+
skillDomRef.current.setAttribute('contenteditable', 'true');
116117
skillDomRef.current.classList.add(`${prefixCls}-skill-empty`);
117118
} else {
119+
skillDomRef.current.setAttribute('contenteditable', 'false');
118120
skillDomRef.current.classList.remove(`${prefixCls}-skill-empty`);
119121
}
120122
}
121-
122123
onChange?.(newValue.value, e, newValue.slotConfig, newValue.skill);
123124
};
125+
124126
const buildSlotSpan = (key: string) => {
125127
const span = document.createElement('span');
126128
span.setAttribute('contenteditable', 'false');
127129
span.dataset.slotKey = key;
128130
span.className = `${prefixCls}-slot`;
129-
130131
return span;
131132
};
132133

133134
const buildSkillSpan = (key: string) => {
134135
const span = document.createElement('span');
135-
span.setAttribute('contenteditable', 'true');
136+
span.setAttribute('contenteditable', 'false');
136137
span.dataset.skillKey = key;
137138
span.dataset.placeholder = placeholder;
138139
span.className = `${prefixCls}-skill`;
@@ -494,6 +495,7 @@ const SlotTextArea = React.forwardRef<SlotTextAreaRef>((_, ref) => {
494495
// 触发onChange回调
495496
triggerValueChange(e);
496497
};
498+
497499
const insertSkill = () => {
498500
if (skill && skillRef.current !== skill) {
499501
removeSkill(false);
@@ -549,13 +551,10 @@ const SlotTextArea = React.forwardRef<SlotTextAreaRef>((_, ref) => {
549551
const slotKey = (node as Element)?.getAttribute?.('data-slot-key') || '';
550552
const nodeType = (node as Element)?.getAttribute?.('data-node-type') || '';
551553
const nodeConfig = slotConfigMap.get(slotKey);
552-
553554
if (node.nodeType !== Node.ELEMENT_NODE) continue;
554-
555555
if (nodeConfig?.type === 'input') {
556556
return (node as Element).querySelector<HTMLInputElement>('input');
557557
}
558-
559558
if (nodeConfig?.type === 'content' && nodeType !== 'nbsp') {
560559
return node;
561560
}
@@ -602,9 +601,10 @@ const SlotTextArea = React.forwardRef<SlotTextAreaRef>((_, ref) => {
602601
onKeyDown?.(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>);
603602
return;
604603
}
604+
const selection = window.getSelection();
605+
605606
// 处理退格键删除slot
606607
if (key === 'Backspace' && target === editableRef.current) {
607-
const selection = window.getSelection();
608608
if (selection?.focusOffset === 1) {
609609
const slotKey = (selection.anchorNode?.parentNode as Element)?.getAttribute?.(
610610
'data-slot-key',
@@ -650,6 +650,16 @@ const SlotTextArea = React.forwardRef<SlotTextAreaRef>((_, ref) => {
650650
return;
651651
}
652652
}
653+
654+
if (
655+
skillDomRef.current &&
656+
selection?.anchorNode &&
657+
skillDomRef.current.contains(selection.anchorNode)
658+
) {
659+
skillDomRef.current.setAttribute('contenteditable', 'false');
660+
skillDomRef.current.classList.remove(`${prefixCls}-skill-empty`);
661+
focus({ cursor: 'end' });
662+
}
653663
};
654664

655665
// ============================ Input Event ============================
@@ -840,6 +850,7 @@ const SlotTextArea = React.forwardRef<SlotTextAreaRef>((_, ref) => {
840850
if (!selection) return;
841851
const range = document.createRange();
842852
range.selectNodeContents(editor);
853+
843854
switch (options.cursor) {
844855
case 'start':
845856
range.collapse(true);
@@ -868,6 +879,7 @@ const SlotTextArea = React.forwardRef<SlotTextAreaRef>((_, ref) => {
868879
slotDomMap?.current?.clear();
869880
onInternalInput(null as unknown as React.FormEvent<HTMLDivElement>);
870881
};
882+
871883
// ============================ Effects =============================
872884

873885
useEffect(() => {

packages/x/components/sender/__tests__/__snapshots__/demo-extend.test.ts.snap

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ exports[`renders components/sender/demo/agent.tsx extend context correctly 1`] =
2222
>
2323
<span
2424
class="ant-sender-skill"
25-
contenteditable="true"
25+
contenteditable="false"
2626
data-placeholder="Press Enter to send message"
2727
data-skill-key="writing"
2828
>
@@ -727,7 +727,7 @@ exports[`renders components/sender/demo/agent.tsx extend context correctly 1`] =
727727
>
728728
<span
729729
class="ant-sender-skill"
730-
contenteditable="true"
730+
contenteditable="false"
731731
data-placeholder=""
732732
data-skill-key="writing"
733733
>
@@ -3249,7 +3249,7 @@ exports[`renders components/sender/demo/slot-filling.tsx extend context correctl
32493249
>
32503250
<span
32513251
class="ant-sender-skill"
3252-
contenteditable="true"
3252+
contenteditable="false"
32533253
data-placeholder="Enter to send message"
32543254
data-skill-key="travelId"
32553255
>

packages/x/components/suggestion/__tests__/__snapshots__/demo-extend.test.ts.snap

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,10 +345,8 @@ Array [
345345
>
346346
<input
347347
aria-autocomplete="list"
348-
aria-controls="test-id_list"
349348
aria-expanded="false"
350349
aria-haspopup="listbox"
351-
aria-owns="test-id_list"
352350
autocomplete="off"
353351
class="ant-select-input"
354352
id="test-id"

packages/x/components/suggestion/__tests__/__snapshots__/demo.test.ts.snap

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,8 @@ exports[`renders components/suggestion/demo/trigger.tsx correctly 1`] = `
140140
>
141141
<input
142142
aria-autocomplete="list"
143-
aria-controls="test-id_list"
144143
aria-expanded="false"
145144
aria-haspopup="listbox"
146-
aria-owns="test-id_list"
147145
autocomplete="off"
148146
class="ant-select-input"
149147
id="test-id"

0 commit comments

Comments
 (0)