fix: textarea scroll bar, deactive count message

This commit is contained in:
jialin
2025-10-21 13:24:21 +08:00
parent 32ad9525a6
commit ccb6e72057
10 changed files with 52 additions and 18 deletions
+16 -2
View File
@@ -13,6 +13,7 @@ import {
writeState
} from '@/utils/localstore/index';
import { RequestConfig, history } from '@umijs/max';
import { message } from 'antd';
const loginPath = '/login';
@@ -51,13 +52,26 @@ export async function getInitialState(): Promise<{
const fetchUserInfo = async (): Promise<Global.UserInfo> => {
try {
const data = await queryCurrentUserState({
skipErrorHandler: true
skipErrorHandler: false
});
if (data.is_admin) {
getUpdateCheck();
}
return data;
} catch (error) {
} catch (error: any) {
const data = error?.response?.data;
if (data?.code === 401) {
message.error({
content: (
<div>
<span>{data?.message || 'Please login again.'}</span>
<br />
<div>Please contact the administrator.</div>
</div>
),
duration: 5
});
}
history.push(loginPath);
}
return {} as Global.UserInfo;
+4 -2
View File
@@ -24,6 +24,7 @@ const LabelWrapper = styled.div.attrs({
interface InputTextareaProps extends TextAreaProps {
scaleSize?: boolean;
alwaysFocus?: boolean;
}
const SealTextArea: React.FC<InputTextareaProps & SealFormItemProps> = (
@@ -45,6 +46,7 @@ const SealTextArea: React.FC<InputTextareaProps & SealFormItemProps> = (
addAfter,
trim,
scaleSize,
alwaysFocus,
...rest
} = props;
const [isFocus, setIsFocus] = useState(false);
@@ -119,7 +121,7 @@ const SealTextArea: React.FC<InputTextareaProps & SealFormItemProps> = (
<Wrapper
status={status}
label={<LabelWrapper>{label}</LabelWrapper>}
isFocus={isFocus}
isFocus={alwaysFocus || isFocus}
required={required}
description={description}
className="seal-textarea-wrapper"
@@ -134,7 +136,7 @@ const SealTextArea: React.FC<InputTextareaProps & SealFormItemProps> = (
spellCheck={rest.spellCheck ?? false}
autoSize={autoSize}
ref={inputRef}
style={{ minHeight: '80px', ...style }}
style={{ ...style }}
className="seal-textarea"
onFocus={handleOnFocus}
onBlur={handleOnBlur}
@@ -163,6 +163,12 @@ const InputWrapper = styled.div`
.seal-textarea-wrapper {
height: auto;
padding-right: 10px;
.ant-input-outlined {
height: auto !important;
}
textarea {
overflow-y: auto !important;
}
}
.ant-input-textarea-allow-clear.ant-input-affix-wrapper {
padding: 0;
@@ -317,6 +317,7 @@ const VersionsForm: React.FC<AddModalProps> = ({
style={{ marginBottom: 0 }}
>
<SealInput.TextArea
allowClear
label={intl.formatMessage({ id: 'backend.runCommand' })}
></SealInput.TextArea>
</Form.Item>
@@ -1,4 +1,5 @@
import SealInput from '@/components/seal-form/seal-input';
import SealTextArea from '@/components/seal-form/seal-textarea';
import { PageActionType } from '@/config/types';
import { useIntl } from '@umijs/max';
import { Form } from 'antd';
@@ -85,9 +86,10 @@ const ClusterForm: React.FC<AddModalProps> = forwardRef(
></CloudProvider>
)}
<Form.Item<FormData> name="description" rules={[{ required: false }]}>
<SealInput.TextArea
<SealTextArea
autoSize={{ minRows: 4, maxRows: 6 }}
label={intl.formatMessage({ id: 'common.table.description' })}
></SealInput.TextArea>
></SealTextArea>
</Form.Item>
</Form>
);
@@ -265,7 +265,7 @@ const AddModal: FC<AddModalProps> = (props) => {
// evaluate the form data when select a model file
// TODO: reset backend related fields when select a GGUF file
if (item.fakeName) {
// onSelectFile(item, modelInfo, manual);
onSelectFile(item, modelInfo, manual);
}
};
+6 -4
View File
@@ -2,6 +2,7 @@ import IconFont from '@/components/icon-font';
import AutoComplete from '@/components/seal-form/auto-complete';
import SealInput from '@/components/seal-form/seal-input';
import SealSelect from '@/components/seal-form/seal-select';
import SealTextArea from '@/components/seal-form/seal-textarea';
import TooltipList from '@/components/tooltip-list';
import useAppUtils from '@/hooks/use-app-utils';
import { useIntl } from '@umijs/max';
@@ -127,7 +128,6 @@ const BackendFields: React.FC = () => {
<SealInput.Input
required
allowClear
scaleSize={true}
label={intl.formatMessage({ id: 'backend.imageName' })}
></SealInput.Input>
</Form.Item>
@@ -140,15 +140,17 @@ const BackendFields: React.FC = () => {
}
]}
>
<SealInput.TextArea
<SealTextArea
allowClear
required
scaleSize={true}
allowClear
alwaysFocus={true}
autoSize={{ minRows: 2, maxRows: 4 }}
label={intl.formatMessage({ id: 'backend.runCommand' })}
placeholder={intl.formatMessage({
id: 'models.form.runCommandPlaceholder'
})}
></SealInput.TextArea>
></SealTextArea>
</Form.Item>
</>
)}
-2
View File
@@ -1,6 +1,5 @@
import { PageActionType } from '@/config/types';
import CollapsePanel from '@/pages/_components/collapse-panel';
import { useWrapperContext } from '@/pages/_components/column-wrapper/use-wrapper-context';
import { useIntl } from '@umijs/max';
import { Form } from 'antd';
import _ from 'lodash';
@@ -54,7 +53,6 @@ const DataForm: React.FC<DataFormProps> = forwardRef((props, ref) => {
onValuesChange,
onOk
} = props;
const { scrollToTarget, scrollToBottom } = useWrapperContext();
const { backendOptions, getBackendOptions } = useQueryBackends();
const { getGPUOptionList, gpuOptions } = useGenerateGPUOptions();
const [form] = Form.useForm();
@@ -80,6 +80,8 @@ export const useGenerateGPUOptions = () => {
return gpuSelectorList;
};
const generateWorkerSelectorOptions = (workerList: WorkerListItem[]) => {};
const getGPUOptionList = async (params?: {
clusterId: number;
}): Promise<CascaderOption[]> => {
@@ -52,11 +52,18 @@ export default function useChatCompletion(
return;
}
reasonContentRef.current =
reasonContentRef.current +
_.get(chunk, 'choices.0.delta.reasoning_content', '');
contentRef.current =
contentRef.current + _.get(chunk, 'choices.0.delta.content', '');
const deltaReasoningContent =
_.get(chunk, 'choices.0.delta.reasoning_content', '') === null
? ''
: _.get(chunk, 'choices.0.delta.reasoning_content', '');
const deltaContent =
_.get(chunk, 'choices.0.delta.content', '') === null
? ''
: _.get(chunk, 'choices.0.delta.content', '');
reasonContentRef.current = reasonContentRef.current + deltaReasoningContent;
contentRef.current = contentRef.current + deltaContent;
const content = formatContent({
content: contentRef.current,