-
+
-
+
+
+
setNoDuplicate(!noDuplicate)}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/index.type.ts
index 4dc980dcd..2c39057af 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/index.type.ts
@@ -19,6 +19,7 @@ export type AuditExecResultPanelProps = {
refreshOverviewAction: () => void;
getOverviewLoading: boolean;
overviewTableErrorMessage: string;
+ isMobile?: boolean;
};
export type GetAuditTaskSQLsPrams = Pick<
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/style.ts
index 4fd3467cd..b2cb2edc1 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/style.ts
@@ -11,6 +11,10 @@ export const AuditExecResultPanelStyleWrapper = styled('section')`
padding: 0 40px;
}
+ .audit-result-segmented-row {
+ padding: 14px 40px;
+ }
+
.ant-space.audit-result-actions-wrap {
margin-right: 12px;
@@ -19,4 +23,25 @@ export const AuditExecResultPanelStyleWrapper = styled('section')`
height: 28px;
}
}
+
+ &.mobile-audit-result-panel {
+ margin-top: 2rem;
+
+ .audit-result-title {
+ padding: 0 1rem;
+ }
+
+ .audit-result-segmented-row {
+ padding: 0 1rem 0.8rem;
+
+ & > div {
+ margin-top: 0.8rem;
+ white-space: nowrap;
+ }
+ }
+
+ .ant-space.audit-result-actions-wrap {
+ margin-right: 0.2rem;
+ }
+ }
`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/index.tsx
index 3fd17a66d..86a66e544 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/index.tsx
@@ -16,13 +16,9 @@ import { useBoolean } from 'ahooks';
import { useCurrentProject } from '@actiontech/shared/lib/features';
import workflow from '@actiontech/shared/lib/api/sqle/service/workflow';
import { isSupportLanguage, ResponseCode } from '@actiontech/dms-kit';
-import { PageLayoutHasFixedHeaderStyleWrapper } from '@actiontech/dms-kit';
import { BasicButton, EmptyBox, PageHeader } from '@actiontech/dms-kit';
-import { usePrompt } from '@actiontech/shared/lib/hooks';
-import {
- FormAreaBlockStyleWrapper,
- FormAreaLineStyleWrapper
-} from '@actiontech/dms-kit/es/components/CustomForm/style';
+import { usePrompt, useMedia } from '@actiontech/shared/lib/hooks';
+import { FormAreaLineStyleWrapper } from '@actiontech/dms-kit/es/components/CustomForm/style';
import { FormItemBigTitle } from '@actiontech/dms-kit';
import useSharedStepDetail from '../../../Create/hooks/useSharedStepDetail';
import { SAME_SQL_MODE_DEFAULT_FIELD_KEY } from '../../../Common/SqlStatementFormController/SqlStatementFormItem/index.data';
@@ -37,6 +33,11 @@ import Icon from '@ant-design/icons';
import useInstance from '../../../../../hooks/useInstance';
import useCheckTaskAuditRuleExceptionStatus from '../../../Create/hooks/useCheckTaskAuditRuleExceptionStatus';
import instance from '@actiontech/shared/lib/api/sqle/service/instance';
+import classNames from 'classnames';
+import {
+ ModifySqlStatementPageStyleWrapper,
+ ModifySqlStatementFormAreaBlockStyleWrapper
+} from './style';
const ModifySqlStatement: React.FC = ({
currentTasks,
@@ -55,6 +56,7 @@ const ModifySqlStatement: React.FC = ({
backToDetailText
}) => {
const { t } = useTranslation();
+ const { isMobile } = useMedia();
const { projectName } = useCurrentProject();
const { updateInstanceList, instanceList } = useInstance();
const { hasExceptionAuditRule, updateTaskAuditRuleExceptionStatus } =
@@ -270,7 +272,11 @@ const ModifySqlStatement: React.FC = ({
spinning={getAllSqlStatementLoading || isAuditing.value || submitLoading}
>
{messageContextHolder}
-
+
= ({
labelAlign="left"
>
-
-
+
+
{t('execWorkflow.detail.operator.modifySql')}
@@ -323,7 +337,7 @@ const ModifySqlStatement: React.FC = ({
isAtRejectStep
dbSourceInfoCollection={dbSourceInfoCollection}
/>
-
+
@@ -336,7 +350,7 @@ const ModifySqlStatement: React.FC = ({
}
/>
-
+
) : null;
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/style.ts
index ea60e19ef..a8c8f0bf2 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/ModifySqlStatement/style.ts
@@ -1,5 +1,7 @@
import { FormStyleWrapper } from '@actiontech/dms-kit/es/components/CustomForm/style';
import { styled } from '@mui/material';
+import { PageLayoutHasFixedHeaderStyleWrapper } from '@actiontech/dms-kit';
+import { FormAreaBlockStyleWrapper } from '@actiontech/dms-kit/es/components/CustomForm/style';
export const ModifySqlStatementFormStyleWrapper = styled(FormStyleWrapper)`
.custom-icon-ellipse {
@@ -10,3 +12,48 @@ export const ModifySqlStatementFormStyleWrapper = styled(FormStyleWrapper)`
margin-bottom: 16px !important;
}
`;
+
+export const ModifySqlStatementPageStyleWrapper = styled(
+ PageLayoutHasFixedHeaderStyleWrapper
+)`
+ &.mobile-modify-sql-statement-page {
+ .actiontech-page-header-namespace {
+ width: 100vw !important;
+ padding: 0 1rem;
+ left: 0;
+ }
+ }
+`;
+
+export const ModifySqlStatementFormAreaBlockStyleWrapper = styled(
+ FormAreaBlockStyleWrapper
+)`
+ &.mobile-modify-sql-statement-form-area-block {
+ width: 100vw !important;
+ padding: 0 1rem !important;
+
+ .mobile-modify-sql-statement-form-item-big-title {
+ padding: 1.5rem 0;
+ }
+
+ .ant-form-item {
+ margin-bottom: 1rem !important;
+ }
+
+ .sql-statement-form-item-label {
+ .ant-form-item-label {
+ padding: 0 !important;
+ }
+
+ .ant-form-item-control-input {
+ min-height: 0 !important;
+ }
+ }
+
+ .actiontech-mode-switcher {
+ .actiontech-mode-switcher-item-text {
+ font-size: 12px !important;
+ }
+ }
+ }
+`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.tsx
index 2e583f441..4b863c47f 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/index.tsx
@@ -1,11 +1,15 @@
import { EmptyBox } from '@actiontech/dms-kit';
-import { Divider, Space } from 'antd';
+import { Divider, Space, Modal } from 'antd';
import { useTranslation } from 'react-i18next';
import { useBoolean } from 'ahooks';
import { WorkflowPageHeaderExtraStyleWrapper } from './style';
import { WorkflowDetailPageHeaderExtraProps } from './index.type';
import useWorkflowDetailAction from './hooks/useWorkflowDetailAction';
-import { useCurrentProject } from '@actiontech/shared/lib/features';
+import {
+ useCurrentProject,
+ usePermission,
+ PERMISSIONS
+} from '@actiontech/shared/lib/features';
import RejectWorkflowModal from './RejectWorkflowModal';
import {
ApproveWorkflowAction,
@@ -20,12 +24,21 @@ import {
RetryWorkflowAction
} from './action';
import { WorkflowRecordResV2StatusEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+import { Dropdown } from 'antd';
+import type { MenuProps } from 'antd';
+import { useMemo } from 'react';
+import { ActionButton } from '@actiontech/shared';
+import { useMedia } from '@actiontech/shared';
+import classNames from 'classnames';
const WorkflowDetailPageHeaderExtra: React.FC<
WorkflowDetailPageHeaderExtraProps
> = (props) => {
const { t } = useTranslation();
+ const [modal, contextHolder] = Modal.useModal();
const { projectName } = useCurrentProject();
+ const { checkActionPermission } = usePermission();
+ const { isMobile } = useMedia();
const [
rejectModalVisible,
{ setTrue: openRejectModal, setFalse: closeRejectModal }
@@ -45,74 +58,316 @@ const WorkflowDetailPageHeaderExtra: React.FC<
executable_reason
} = useWorkflowDetailAction({ projectName, ...props });
- return (
-
- {messageContextHolder}
+ // 移动端菜单项
+ const mobileMenuItems: MenuProps['items'] = useMemo(() => {
+ const items: MenuProps['items'] = [];
-
- {CloseWorkflowAction(closeWorkflowButtonMeta)}
-
-
-
- {RetryWorkflowAction(retryWorkflowButtonMeta)}
- {/* #if [ee] */}
- {RollbackWorkflowAction(rollbackWorkflowButtonMeta)}
- {/* #endif */}
- {CloneWorkflowAction(executeInOtherInstanceMeta)}
- {BatchRejectWorkflowAction(rejectWorkflowButtonMeta, openRejectModal)}
- {ApproveWorkflowAction(auditPassWorkflowButtonMeta)}
- {BatchExecWorkflowAction(
- batchExecutingWorkflowButtonMeta,
- executable,
- executable_reason
- )}
- {MarkManuallyExecWorkflowAction(
- manualExecuteWorkflowButtonMeta,
+ // 主要操作组
+ const mainActions: MenuProps['items'] = [];
+
+ // 审核通过
+ if (
+ !auditPassWorkflowButtonMeta.hidden &&
+ checkActionPermission(PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.APPROVE)
+ ) {
+ mainActions.push({
+ key: 'approve',
+ label: t('execWorkflow.detail.operator.sqlReview'),
+ disabled: auditPassWorkflowButtonMeta.loading,
+ onClick: () => auditPassWorkflowButtonMeta.action()
+ });
+ }
+
+ // 批量执行
+ if (
+ !batchExecutingWorkflowButtonMeta.hidden &&
+ checkActionPermission(
+ PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.BATCH_EXEC
+ )
+ ) {
+ mainActions.push({
+ key: 'batch-exec',
+ label: t('execWorkflow.detail.operator.batchSqlExecute'),
+ disabled: batchExecutingWorkflowButtonMeta.loading || !executable,
+ onClick: () => {
+ if (executable) {
+ modal.confirm({
+ title: t(
+ 'execWorkflow.detail.operator.batchSqlExecuteConfirmTips'
+ ),
+ onOk: () => batchExecutingWorkflowButtonMeta.action()
+ });
+ }
+ }
+ });
+ }
+
+ // 标记为人工上线
+ if (
+ !manualExecuteWorkflowButtonMeta.hidden &&
+ checkActionPermission(
+ PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.MANUALLY_EXEC
+ )
+ ) {
+ const manualExecExecutable =
props.workflowInfo?.record?.status ===
- WorkflowRecordResV2StatusEnum.exec_failed || executable,
- executable_reason
- )}
+ WorkflowRecordResV2StatusEnum.exec_failed || executable;
+ mainActions.push({
+ key: 'manual-exec',
+ label: t('execWorkflow.detail.operator.markManually'),
+ disabled:
+ manualExecuteWorkflowButtonMeta.loading || !manualExecExecutable,
+ onClick: () => {
+ if (manualExecExecutable) {
+ modal.confirm({
+ title: t('execWorkflow.detail.operator.markManuallyConfirmTips'),
+ onOk: () => manualExecuteWorkflowButtonMeta.action()
+ });
+ }
+ }
+ });
+ }
-
- {TerminateWorkflowAction(terminateWorkflowButtonMeta)}
+ if (mainActions.length > 0) {
+ items.push(...mainActions);
+ }
-
+ // 常规操作组
+ const regularActions: MenuProps['items'] = [];
- {RefreshWorkflowAction(props.refreshWorkflow)}
-
+ // 更新审核结果
+ if (
+ !retryWorkflowButtonMeta.hidden &&
+ checkActionPermission(PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.RETRY)
+ ) {
+ regularActions.push({
+ key: 'retry',
+ label: t('execWorkflow.create.auditResult.updateInfo'),
+ disabled: retryWorkflowButtonMeta.loading,
+ onClick: () => retryWorkflowButtonMeta.action()
+ });
+ }
- executeInOtherInstanceMeta.action()
+ });
+ }
+
+ // 回滚(企业版)
+ //#if [ee]
+ if (
+ !rollbackWorkflowButtonMeta.hidden &&
+ checkActionPermission(PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.ROLLBACK)
+ ) {
+ regularActions.push({
+ key: 'rollback',
+ label: t('execWorkflow.detail.operator.rollback'),
+ disabled: rollbackWorkflowButtonMeta.loading,
+ onClick: () => rollbackWorkflowButtonMeta.action()
+ });
+ }
+ //#endif */
+
+ if (regularActions.length > 0) {
+ if (items.length > 0) {
+ items.push({ type: 'divider' });
+ }
+ items.push(...regularActions);
+ }
+
+ // 危险操作组
+ const dangerActions: MenuProps['items'] = [];
+
+ // 驳回
+ if (
+ !rejectWorkflowButtonMeta.hidden &&
+ checkActionPermission(
+ PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.BATCH_REJECT
+ )
+ ) {
+ dangerActions.push({
+ key: 'reject',
+ label: t('execWorkflow.detail.operator.rejectFull'),
+ onClick: openRejectModal
+ });
+ }
+
+ // 终止
+ if (
+ !terminateWorkflowButtonMeta.hidden &&
+ checkActionPermission(
+ PERMISSIONS.ACTIONS.SQLE.SQL_EXEC_WORKFLOW.TERMINATE_EXEC
+ )
+ ) {
+ dangerActions.push({
+ key: 'terminate',
+ label: t('execWorkflow.detail.operator.terminate'),
+ danger: true,
+ disabled: terminateWorkflowButtonMeta.loading,
+ onClick: () => {
+ modal.confirm({
+ title: t('execWorkflow.detail.operator.terminateConfirmTips'),
+ onOk: () => terminateWorkflowButtonMeta.action()
+ });
}
- >
-
-
+ });
+ }
- {
+ modal.confirm({
+ title: t('execWorkflow.detail.operator.closeConfirm'),
+ onOk: () => closeWorkflowButtonMeta.action()
+ });
+ }
+ });
+ }
+
+ if (dangerActions.length > 0) {
+ if (items.length > 0) {
+ items.push({ type: 'divider' });
+ }
+ items.push(...dangerActions);
+ }
+
+ return items;
+ }, [
+ t,
+ auditPassWorkflowButtonMeta,
+ batchExecutingWorkflowButtonMeta,
+ manualExecuteWorkflowButtonMeta,
+ retryWorkflowButtonMeta,
+ executeInOtherInstanceMeta,
+ rollbackWorkflowButtonMeta,
+ rejectWorkflowButtonMeta,
+ terminateWorkflowButtonMeta,
+ closeWorkflowButtonMeta,
+ executable,
+ props.workflowInfo,
+ openRejectModal,
+ checkActionPermission,
+ modal
+ ]);
+
+ return (
+
+ {messageContextHolder}
+ {contextHolder}
+
+
+ {CloseWorkflowAction(closeWorkflowButtonMeta)}
+
+
+
+ {RetryWorkflowAction(retryWorkflowButtonMeta)}
+ {/* #if [ee] */}
+ {RollbackWorkflowAction(rollbackWorkflowButtonMeta)}
+ {/* #endif */}
+ {CloneWorkflowAction(executeInOtherInstanceMeta)}
+ {BatchRejectWorkflowAction(
+ rejectWorkflowButtonMeta,
+ openRejectModal
+ )}
+ {ApproveWorkflowAction(auditPassWorkflowButtonMeta)}
+ {BatchExecWorkflowAction(
+ batchExecutingWorkflowButtonMeta,
+ executable,
+ executable_reason
+ )}
+ {MarkManuallyExecWorkflowAction(
+ manualExecuteWorkflowButtonMeta,
+ props.workflowInfo?.record?.status ===
+ WorkflowRecordResV2StatusEnum.exec_failed || executable,
+ executable_reason
+ )}
+
+
+ {TerminateWorkflowAction(terminateWorkflowButtonMeta)}
+
+
+
+ {RefreshWorkflowAction(props.refreshWorkflow)}
+
+
+
+
+
+
+
+ {t('execWorkflow.detail.operator.buttonText')}
+
+ >
+ }
>
- {t('execWorkflow.detail.operator.buttonText')}
-
+ <>
+ {mobileMenuItems.length > 0 && (
+
+
+
+ )}
+
+ {t('execWorkflow.detail.operator.buttonText')}
+
+ >
+
rejectWorkflowButtonMeta.action(values.reason)}
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/style.ts
index b8802cd3a..8020f2f8f 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/PageHeaderExtra/style.ts
@@ -1,6 +1,8 @@
import { styled } from '@mui/material';
-export const WorkflowPageHeaderExtraStyleWrapper = styled('div')`
+export const WorkflowPageHeaderExtraStyleWrapper = styled('div')<{
+ isMobile?: boolean;
+}>`
display: flex;
.workflow-detail-page-header-divider {
@@ -29,4 +31,16 @@ export const WorkflowPageHeaderExtraStyleWrapper = styled('div')`
font-weight: 500;
line-height: 20px;
}
+
+ /* 移动端适配 */
+ &.mobile-workflow-detail-page-header-extra-wrapper {
+ justify-content: space-between;
+ width: 100%;
+ gap: 0.5rem;
+
+ .toggle-workflow-detail-wrapper {
+ flex: 1;
+ min-width: auto;
+ }
+ }
`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/RecordInfo.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/RecordInfo.tsx
new file mode 100644
index 000000000..64fc889af
--- /dev/null
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/RecordInfo.tsx
@@ -0,0 +1,75 @@
+import { useTranslation } from 'react-i18next';
+import { WorkflowStepsStyleWrapper } from './style';
+import WorkflowBasicInfo from './components/WorkflowBasicInfo';
+import { formatTime } from '@actiontech/dms-kit';
+import WorkflowSteps from './components/WorkflowSteps';
+import { EmptyBox } from '@actiontech/dms-kit';
+import WorkflowHistorySteps from './components/WorkflowHistorySteps';
+import { CloseOutlined } from '@actiontech/icons';
+import AssociatedWorkflows from './components/AssociatedWorkflows';
+import AssociatedRollbackWorkflows from './components/AssociatedRollbackWorkflows';
+import { WorkflowRecordInfoContentProps } from './index.type';
+import { useMedia } from '@actiontech/shared';
+import classNames from 'classnames';
+
+const WorkflowRecordInfo: React.FC = (
+ props
+) => {
+ const { isMobile } = useMedia();
+ const { workflowInfo, tasksStatusCount, onClose } = props;
+ const { t } = useTranslation();
+ return (
+
+
+
+
+ {t('execWorkflow.detail.operator.title')}
+
+
+
+
+
+
+
+
+
+ 1
+ }
+ >
+
+
+ {/* #if [ee] */}
+
+
+
+ {/* #endif */}
+
+
+
+
+ );
+};
+export default WorkflowRecordInfo;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.tsx
index fb6053389..b97a9e945 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.tsx
@@ -1,68 +1,32 @@
import { useTranslation } from 'react-i18next';
import { WorkflowRecordInfoProps } from './index.type';
-import { WorkflowStepsStyleWrapper } from './style';
-import WorkflowBasicInfo from './components/WorkflowBasicInfo';
-import { formatTime } from '@actiontech/dms-kit';
-import WorkflowSteps from './components/WorkflowSteps';
-import { EmptyBox, LazyLoadComponent } from '@actiontech/dms-kit';
-import WorkflowHistorySteps from './components/WorkflowHistorySteps';
-import { CloseOutlined } from '@actiontech/icons';
-import AssociatedWorkflows from './components/AssociatedWorkflows';
-import AssociatedRollbackWorkflows from './components/AssociatedRollbackWorkflows';
+import { LazyLoadComponent, BasicDrawer } from '@actiontech/dms-kit';
+import RecordInfo from './RecordInfo';
+import { useMedia } from '@actiontech/shared';
+
const WorkflowRecordInfo: React.FC = ({
visibility,
- workflowInfo,
- tasksStatusCount,
- onClose
+ ...restProps
}) => {
const { t } = useTranslation();
+ const { isMobile } = useMedia();
+ if (isMobile) {
+ return (
+
+
+
+ );
+ }
+
return (
-
-
-
- {t('execWorkflow.detail.operator.title')}
-
-
-
-
-
-
-
-
- 1
- }
- >
-
-
- {/* #if [ee] */}
-
-
-
- {/* #endif */}
-
-
-
-
+
);
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.type.ts
index 7fe74afc3..d43f5b25e 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.type.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/index.type.ts
@@ -17,6 +17,11 @@ export type WorkflowRecordInfoProps = {
tasksStatusCount?: TasksStatusCount;
};
+export type WorkflowRecordInfoContentProps = Pick<
+ WorkflowRecordInfoProps,
+ 'onClose' | 'workflowInfo' | 'tasksStatusCount'
+>;
+
export type WorkflowBasicInfoProps = {
createUserName: string;
createTime: string;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/style.ts
index 46d2f2f63..29ace617d 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RecordInfo/style.ts
@@ -10,6 +10,13 @@ export const WorkflowStepsStyleWrapper = styled('div')`
${({ theme }) => theme.sharedTheme.uiToken.colorBorderSecondary};
background: ${({ theme }) => theme.sharedTheme.uiToken.colorFillQuaternary};
+ &.mobile-workflow-record-info-style-wrapper {
+ width: 100%;
+ min-width: 100%;
+ border-left: none;
+ padding: 0;
+ }
+
.workflow-record-info-header {
display: flex;
height: 60px;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RejectReason/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RejectReason/index.tsx
index b4e040957..d56e550d5 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RejectReason/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/RejectReason/index.tsx
@@ -5,6 +5,8 @@ import { useTranslation } from 'react-i18next';
import { RejectReasonProps } from './index.type';
import { Col, Row } from 'antd';
import { RejectFileFilled } from '@actiontech/icons';
+import { useMedia } from '@actiontech/shared';
+
const RejectReason: React.FC = ({
stepInfo,
currentUsername,
@@ -12,8 +14,11 @@ const RejectReason: React.FC = ({
createWorkflowUserName
}) => {
const { t } = useTranslation();
+
+ const { isMobile } = useMedia();
+
return (
-
+
`
+ margin: ${({ isMobile }) => (isMobile ? '1rem' : '40px')};
+ padding: ${({ isMobile }) => (isMobile ? '1rem' : '24px')};
display: flex;
align-items: center;
border-radius: 8px;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
index f367e4a8a..e5374dbc2 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/TableTransfer.tsx
@@ -1,10 +1,12 @@
import { BasicTable } from '@actiontech/dms-kit';
-import { Transfer } from 'antd';
import {
TableTransferProps,
TableRowSelection,
ExpandedBackupSqlType
} from './index.type';
+import { useMedia } from '@actiontech/shared';
+import classNames from 'classnames';
+import { MobileTableTransferStyleWrapper } from './style';
const TableTransfer: React.FC = (props) => {
const {
leftColumns,
@@ -16,8 +18,14 @@ const TableTransfer: React.FC = (props) => {
onTableChange,
...restProps
} = props;
+ const { isMobile } = useMedia();
return (
-
+
{({
direction,
onItemSelect,
@@ -58,13 +66,13 @@ const TableTransfer: React.FC = (props) => {
onChange={isLeftTable ? onTableChange : undefined}
scroll={{
y: '700px',
- x: true
+ x: isMobile ? '100%' : true // todo 待验证移动端适配情况
}}
className={isLeftTable ? 'left-table' : 'right-table'}
/>
);
}}
-
+
);
};
export default TableTransfer;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx
index eaabe35cb..064d95f20 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/index.tsx
@@ -38,6 +38,10 @@ import {
} from '../../../../../store/sqlExecWorkflow';
import { ROUTE_PATHS } from '@actiontech/dms-kit';
import { Space, SelectProps } from 'antd';
+import { useMedia } from '@actiontech/shared';
+import { SqlRollbackPageStyleWrapper } from './style';
+import classNames from 'classnames';
+
const SqlRollback: React.FC = ({
isAtRollbackStep,
backToWorkflowDetail,
@@ -47,6 +51,7 @@ const SqlRollback: React.FC = ({
const { t } = useTranslation();
const dispatch = useDispatch();
const navigate = useTypedNavigate();
+ const { isMobile } = useMedia();
const [targetKeys, setTargetKeys] = useState([]);
const [selectedList, setSelectedList] = useState([]);
const { pagination, tableChange, updateTableFilterInfo, tableFilterInfo } =
@@ -279,54 +284,60 @@ const SqlRollback: React.FC = ({
}, []);
return (
- } onClick={onBack}>
- {t('execWorkflow.detail.operator.backToDetail')}
-
- }
- extra={
-
- {t('execWorkflow.list.createButtonText')}
-
- }
- />
-
-
-
- {t('execWorkflow.detail.rollback.allSql')}
-
- ,
- t('execWorkflow.detail.rollback.selectedRollbackSql')
- ]}
- loading={loading}
- leftDataSource={data?.list ?? []}
- rightDataSource={selectedList}
- leftPagination={{
- total: data?.total || 0,
- current: pagination.page_index
- }}
- onTableChange={tableChange}
+
+ } onClick={onBack}>
+ {t('execWorkflow.detail.operator.backToDetail')}
+
+ }
+ extra={
+
+ {t('execWorkflow.list.createButtonText')}
+
+ }
/>
-
+
+
+
+ {t('execWorkflow.detail.rollback.allSql')}
+
+ ,
+ t('execWorkflow.detail.rollback.selectedRollbackSql')
+ ]}
+ loading={loading}
+ leftDataSource={data?.list ?? []}
+ rightDataSource={selectedList}
+ leftPagination={{
+ total: data?.total || 0,
+ current: pagination.page_index
+ }}
+ onTableChange={tableChange}
+ />
+
+
);
};
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts
index 38fee39f4..e20ebbef6 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/SqlRollback/style.ts
@@ -1,4 +1,5 @@
import { styled } from '@mui/material';
+import { Transfer } from 'antd';
export const SqlRollbackTableStyleWrapper = styled('section')`
& .ant-transfer.ant-transfer-customize-list .ant-transfer-list {
@@ -49,3 +50,28 @@ export const SqlRollbackTableStyleWrapper = styled('section')`
}
}
`;
+
+export const MobileTableTransferStyleWrapper = styled(Transfer)`
+ &.mobile-table-transfer {
+ flex-direction: column;
+
+ .ant-transfer-list-header {
+ min-height: 2.5rem;
+ height: auto !important;
+ }
+
+ .ant-transfer-operation {
+ transform: rotate(90deg);
+ }
+
+ .ant-transfer-list-header-title {
+ padding: 0 !important;
+ }
+ }
+`;
+
+export const SqlRollbackPageStyleWrapper = styled('div')`
+ &.sql-rollback-page-style-wrapper .actiontech-page-header-namespace {
+ padding: 0 1rem;
+ }
+`;
diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/index.tsx
index 1832a14a3..7e086f71d 100644
--- a/packages/sqle/src/page/SqlExecWorkflow/Detail/index.tsx
+++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/index.tsx
@@ -21,8 +21,15 @@ import ModifySqlStatement from './components/ModifySqlStatement';
import useAuditExecResultPanelSetup from './hooks/useAuditExecResultPanelSetup';
import AuditExecResultPanel from './components/AuditExecResultPanel';
import SqlRollback from './components/SqlRollback';
+import { useViewport } from '@actiontech/shared/lib/hooks';
+import { useMedia } from '@actiontech/shared';
+import classNames from 'classnames';
const SqlWorkflowDetail: React.FC = () => {
+ const { isMobile } = useMedia();
+
+ useViewport(isMobile);
+
const { username } = useCurrentUser();
const [
workflowStepsVisibility,
@@ -78,6 +85,9 @@ const SqlWorkflowDetail: React.FC = () => {
{
className="clearPaddingTop"
gap={24}
sqlVersion={workflowInfo?.sql_version}
+ isMobile={isMobile}
/>
{
refreshOverviewAction={refreshOverviewAction}
getOverviewLoading={getOverviewLoading}
overviewTableErrorMessage={overviewTableErrorMessage}
+ isMobile={isMobile}
/>
void;
}> = ({ onCreated }) => {
const { t } = useTranslation();
+ const { isMobile } = useMedia();
const [messageApi, messageContextHolder] = message.useMessage();
const [form] = Form.useForm();
const visible = useSelector(
@@ -104,6 +106,7 @@ const AddWhitelist: React.FC<{
{messageContextHolder}