Skip to content

Commit 1ea85e2

Browse files
author
Rankin Zheng
authored
Merge pull request #14 from devchat-ai/add_select_all
Add select all
2 parents d9e2a35 + 7280642 commit 1ea85e2

2 files changed

Lines changed: 32 additions & 4 deletions

File tree

src/views/components/ChatMark/index.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ const ChatMark = ({ children, value, messageDone, submit = 'Submit', cancel = 'C
123123
widget["value"] = event.currentTarget.value;
124124
widgetsHandlers.setItem(index, widget);
125125
};
126+
const allChecked = widgets.every((w) => w.type === "checkbox" ? w.value === "checked" : true);
127+
const indeterminate = widgets.some((w) => w.type === "checkbox" ? w.value === "checked" : false) && !allChecked;
126128

127129
useEffect(() => {
128130
const lines = children.split("\n");
@@ -219,6 +221,7 @@ const ChatMark = ({ children, value, messageDone, submit = 'Submit', cancel = 'C
219221
let radioGroupTemp: any = [];
220222
let radioValuesTemp: any = [];
221223
let wdigetsTemp: any = [];
224+
let isFirstCheckbox = true;
222225
widgets.map((widget, index) => {
223226
if (widget.type === "text") {
224227
wdigetsTemp.push(<Text key={index}>{widget.value}</Text>);
@@ -238,6 +241,23 @@ const ChatMark = ({ children, value, messageDone, submit = 'Submit', cancel = 'C
238241
</Button>
239242
);
240243
} else if (widget.type === "checkbox") {
244+
if(isFirstCheckbox) {
245+
wdigetsTemp.push(<Checkbox
246+
classNames={{ root: classes.checkbox, label: classes.label }}
247+
disabled={disabled}
248+
key={"widget-all-" + index}
249+
label={"Select all"}
250+
size="xs"
251+
checked={allChecked}
252+
indeterminate={indeterminate}
253+
onChange={() =>
254+
widgetsHandlers.setState((current) =>
255+
current.map((w) => ( w.type==="checkbox" ? { ...w, value: allChecked ? "unchecked" : "checked" } : w ))
256+
)
257+
}
258+
/>);
259+
isFirstCheckbox = false;
260+
}
241261
wdigetsTemp.push(
242262
<Checkbox
243263
classNames={{ root: classes.checkbox, label: classes.label }}

src/views/components/InputMessage/index.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import {
2323
IconTextPlus,
2424
IconRobot,
2525
} from "@tabler/icons-react";
26-
import React, { useState, useEffect } from "react";
26+
import React, { useState, useEffect, useRef } from "react";
2727
import {
2828
IconGitBranchChecked,
2929
IconShellCommand,
@@ -72,6 +72,7 @@ const InputMessage = observer((props: any) => {
7272
} = input;
7373
const { generating } = chat;
7474
const showTopic = process.env.platform === "idea";
75+
const viewport = useRef<HTMLDivElement>(null);
7576

7677
const [drawerOpened, { open: openDrawer, close: closeDrawer }] =
7778
useDisclosure(false);
@@ -130,18 +131,24 @@ const InputMessage = observer((props: any) => {
130131
}
131132
if (menuType === "commands") {
132133
if (event.key === "ArrowDown") {
134+
event.preventDefault();
133135
const newIndex = currentMenuIndex + 1;
134136
input.setCurrentMenuIndex(
135137
newIndex < commandMenusNode.length ? newIndex : 0
136138
);
137-
event.preventDefault();
139+
viewport.current
140+
?.querySelectorAll('[data-list-item]')
141+
?.[newIndex]?.scrollIntoView({ block: 'nearest' });
138142
}
139143
if (event.key === "ArrowUp") {
144+
event.preventDefault();
140145
const newIndex = currentMenuIndex - 1;
141146
input.setCurrentMenuIndex(
142147
newIndex < 0 ? commandMenusNode.length - 1 : newIndex
143148
);
144-
event.preventDefault();
149+
viewport.current
150+
?.querySelectorAll('[data-list-item]')
151+
?.[newIndex]?.scrollIntoView({ block: 'nearest' });
145152
}
146153
if ((event.key === "Enter" || event.key === "Tab") && !event.shiftKey) {
147154
const commandNode = commandMenusNode[currentMenuIndex];
@@ -270,6 +277,7 @@ const InputMessage = observer((props: any) => {
270277
return (
271278
<Flex
272279
key={`command-menus-${index}`}
280+
data-list-item
273281
mih={40}
274282
gap="md"
275283
justify="flex-start"
@@ -595,7 +603,7 @@ const InputMessage = observer((props: any) => {
595603
}}
596604
>
597605
<Text sx={{ padding: "5px 5px 5px 10px" }}>DevChat Workflows</Text>
598-
<ScrollArea.Autosize mah={240} type="always" placeholder="">
606+
<ScrollArea.Autosize mah={240} type="always" placeholder="" viewportRef={viewport}>
599607
{commandMenusNode}
600608
</ScrollArea.Autosize>
601609
</Popover.Dropdown>

0 commit comments

Comments
 (0)