fix: textarea scroll bar, deactive count message
This commit is contained in:
+16
-2
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user