Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feature](SQLManagement): Add scan name filter item and display format #357

Merged
merged 1 commit into from
Feb 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/api/SqlManage/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ export interface IExportSqlManageV1Params {

fuzzy_search_sql_fingerprint?: string;

fuzzy_search_audit_plan_name?: string;

filter_assignee?: string;

filter_instance_name?: string;
Expand Down Expand Up @@ -127,6 +129,8 @@ export interface IGetSqlManageListV2Params {

filter_source?: GetSqlManageListV2FilterSourceEnum;

fuzzy_search_audit_plan_name?: string;

filter_audit_level?: GetSqlManageListV2FilterAuditLevelEnum;

filter_last_audit_start_time_from?: string;
Expand Down
2 changes: 2 additions & 0 deletions src/api/common.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3211,6 +3211,8 @@ export interface IAuditTaskSQLResV2 {
number?: number;

rollback_sql?: string;

sql_source_file?: string;
}

export interface IBatchCancelWorkflowsReqV2 {
Expand Down
1 change: 1 addition & 0 deletions src/locale/zh-CN/sqlManagement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export default {
rule: '审核规则',
endpoint: '端点信息',
endpointSearchPlaceHolder: '请输入端点信息',
auditPlanName: '智能扫描名',
},

table: {
Expand Down
12 changes: 12 additions & 0 deletions src/page/SQLManagement/SQLPanel/FilterForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,206 +25,218 @@
import useRuleTips from './hooks/useRuleTips';
import { extractTextFromReactNode } from '../../../utils/Common';

const FilterForm: React.FC<SQLPanelFilterFormProps> = ({
form,
reset,
submit,
projectName,
}) => {
const { t } = useTranslation();
const {
generateInstanceSelectOption,
updateInstanceList,
loading: getInstanceListLoading,
} = useInstance();
const {
generateRuleTipsSelectOptions,
updateRuleTips,
loading: getRuleTipsLoading,
} = useRuleTips();
const {
generateSourceSelectOptions,
generateAuditLevelSelectOptions,
generateStatusSelectOptions,
} = useStaticStatus();
const computeDisabledDate = (current: moment.Moment) => {
return current && current > moment().endOf('day');
};

const ruleTipsFilterOptions: SelectProps['filterOption'] = (
inputValue,
option
) => {
const label = extractTextFromReactNode(option?.label);
return label.toLowerCase().includes(inputValue.toLowerCase());
};

useEffect(() => {
form.setFieldValue(
'filter_status',
GetSqlManageListV2FilterStatusEnum.unhandled
);
updateInstanceList({
project_name: projectName,
functional_module: getInstanceTipListV1FunctionalModuleEnum.sql_manage,
});
updateRuleTips(projectName);
}, [form, projectName, updateInstanceList, updateRuleTips]);
return (
<Form<SQLPanelFilterFormFields> form={form} onFinish={submit}>
<Row {...FilterFormRowLayout}>
<Col {...FilterFormColLayout}>
<Form.Item
label={t('sqlManagement.filterForm.source')}
name="filter_source"
>
<Select
placeholder={t('common.form.placeholder.searchSelect', {
name: t('sqlManagement.filterForm.source'),
})}
options={generateSourceSelectOptions}
/>
</Form.Item>
</Col>
<Col {...FilterFormColLayout}>
<Form.Item
label={t('sqlManagement.filterForm.SQLFingerprint')}
name="fuzzy_search_sql_fingerprint"
>
<Input
placeholder={t('common.form.placeholder.input', {
name: t('sqlManagement.filterForm.SQLFingerprint'),
})}
/>
</Form.Item>
</Col>
<Col {...FilterFormColLayout}>
<Form.Item
label={t('sqlManagement.filterForm.instanceName')}
name="filter_instance_name"
>
<Select
loading={getInstanceListLoading}
placeholder={t('common.form.placeholder.searchSelect', {
name: t('sqlManagement.filterForm.instanceName'),
})}
>
{generateInstanceSelectOption()}
</Select>
</Form.Item>
</Col>
<Col {...FilterFormColLayout}>
<Form.Item label="Schema" name="fuzzy_search_schema_name">
<Input
placeholder={t('common.form.placeholder.input', {
name: 'Schema',
})}
/>
</Form.Item>
</Col>
<Col {...FilterFormColLayout}>
<Form.Item
label={t('sqlManagement.filterForm.auditLevel')}
name="filter_audit_level"
>
<Select
placeholder={t('common.form.placeholder.searchSelect', {
name: t('sqlManagement.filterForm.auditLevel'),
})}
options={generateAuditLevelSelectOptions}
/>
</Form.Item>
</Col>
<Col {...FilterFormColLayout}>
<Form.Item
label={t('sqlManagement.filterForm.status')}
name="filter_status"
>
<Select
placeholder={t('common.form.placeholder.searchSelect', {
name: t('sqlManagement.filterForm.status'),
})}
options={generateStatusSelectOptions}
/>
</Form.Item>
</Col>
<Col {...FilterFormColLayout}>
<Form.Item
name="filter_last_audit_time"
label={t('sqlManagement.filterForm.time')}
>
<DatePicker.RangePicker
style={{ width: '100%' }}
disabledDate={computeDisabledDate}
showTime
/>
</Form.Item>
</Col>
<Col {...FilterFormColLayout}>
<Form.Item
name="filter_rule"
label={t('sqlManagement.filterForm.rule')}
>
<Select
filterOption={ruleTipsFilterOptions}
optionFilterProp="children"
loading={getRuleTipsLoading}
showSearch
>
{generateRuleTipsSelectOptions()}
</Select>
</Form.Item>
</Col>
<Col {...FilterFormColLayout}>
<Form.Item
label={t('sqlManagement.filterForm.endpoint')}
name="fuzzy_search_endpoint"
>
<Input
placeholder={t('common.form.placeholder.input', {
name: t('sqlManagement.filterForm.endpoint'),
})}
/>
</Form.Item>
</Col>
<Col {...FilterFormColLayout}>
<Form.Item
label={t('sqlManagement.filterForm.auditPlanName')}
name="fuzzy_search_audit_plan_name"
>
<Input
placeholder={t('common.form.placeholder.input', {
name: t('sqlManagement.filterForm.auditPlanName'),
})}
/>
</Form.Item>
</Col>

<Col
{...{
xs: 24,
sm: {
span: 12,
offset: 0,
},
xl: {
span: 24,
offset: 0,
},
xxl: {
span: 18,
offset: 0,
},
}}
className="flex-space-between"
>
<Form.Item
label={t('sqlManagement.filterForm.relatedToMe')}
name="filter_assignee"
valuePropName="checked"
>
<Switch />
</Form.Item>

<Form.Item className="clear-margin-right" label=" " colon={false}>
<Space>
<Button onClick={reset}>{t('common.reset')}</Button>
<Button type="primary" htmlType="submit">
{t('common.search')}
</Button>
</Space>
</Form.Item>
</Col>
</Row>
</Form>
);

Check warning on line 240 in src/page/SQLManagement/SQLPanel/FilterForm.tsx

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement
};

Check warning on line 241 in src/page/SQLManagement/SQLPanel/FilterForm.tsx

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement
export default FilterForm;
23 changes: 19 additions & 4 deletions src/page/SQLManagement/SQLPanel/column.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,44 +54,59 @@
| (ColumnGroupType<ISqlManage> | ColumnType<ISqlManage>) & {
dataIndex?: keyof ISqlManage | 'operator';
}
> = ({
projectName,
updateRemark,
signalActionsLoading,
signalAssignment,
actionPermission,
username,
updateSQLStatus,
handleClickAnalyze,
}) => {
const columns: Array<
| (ColumnGroupType<ISqlManage> | ColumnType<ISqlManage>) & {
dataIndex?: keyof ISqlManage | 'operator';
}
> = [
{
dataIndex: 'sql_fingerprint',
title: () => t('sqlManagement.table.SQLFingerprint'),
className: 'table-column-sql-fingerprint',
render: (sql: string) => <RenderExecuteSql sql={sql} rows={2} />,
},
{
dataIndex: 'sql',
title: () => 'SQL',
className: 'table-column-sql',
render: (sql: string) => <RenderExecuteSql sql={sql} rows={2} />,
},
{
dataIndex: 'source',
title: () => t('sqlManagement.table.source'),
className: 'table-column-source',
render: (source: ISource) => {
if (source.type && source.type === SourceTypeEnum.audit_plan) {
return (
<Link
to={`project/${projectName}/auditPlan/detail/${source.audit_plan_name}`}
<Typography.Paragraph
ellipsis={{
expandable: false,
tooltip: (
<div>
{t(sourceDictionary[source.type])}:
{source.audit_plan_name || '--'}

Check warning on line 97 in src/page/SQLManagement/SQLPanel/column.tsx

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch

Check warning on line 97 in src/page/SQLManagement/SQLPanel/column.tsx

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch
</div>
),
}}
className="margin-bottom-0"
>
{t(sourceDictionary[source.type])}
</Link>
<Link
to={`project/${projectName}/auditPlan/detail/${source.audit_plan_name}`}
>
{t(sourceDictionary[source.type])}:
{source.audit_plan_name || '--'}

Check warning on line 107 in src/page/SQLManagement/SQLPanel/column.tsx

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch

Check warning on line 107 in src/page/SQLManagement/SQLPanel/column.tsx

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch
</Link>
</Typography.Paragraph>
);

Check warning on line 110 in src/page/SQLManagement/SQLPanel/column.tsx

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement
} else if (
source.type &&
Expand Down
3 changes: 3 additions & 0 deletions src/page/SQLManagement/SQLPanel/index.less
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,7 @@
.table-column-sql {
max-width: 420px;
}
.table-column-source {
max-width: 200px;
}
}
2 changes: 2 additions & 0 deletions src/page/SQLManagement/SQLPanel/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,107 +37,108 @@
filter_status: GetSqlManageListFilterStatusEnum.unhandled,
};

const SQLPanel: React.FC = () => {
const { t } = useTranslation();
const {
pagination,
filterForm,
filterInfo,
submitFilter,
tableChange,
resetFilter,
sorterInfo,
} = useTable<SQLPanelFilterFormFields>({
defaultFilterInfo,
});

const { projectName } = useCurrentProjectName();
const { username, isAdmin, isProjectManager } = useCurrentUser();
const [SQLNum, setSQLNum] = useState<SQLStatisticsProps>({
SQLTotalNum: 0,
problemSQlNum: 0,
optimizedSQLNum: 0,
});
const [selectedRowKeys, setSelectedRowKeys] = useState<number[]>([]);
const actionPermission = useMemo(() => {
return isAdmin || isProjectManager(projectName);
}, [isAdmin, isProjectManager, projectName]);
const [
batchActionsLoading,
{ setFalse: finishBatchAction, setTrue: startBatchAction },
] = useBoolean();
const [
signalActionsLoading,
{ setFalse: finishSignalAction, setTrue: startSignalAction },
] = useBoolean();

const rowSelection: TableRowSelection<ISqlManage> = {
selectedRowKeys,
onChange: (selectedRowKeys) => {
setSelectedRowKeys(selectedRowKeys as number[]);
},
};

const { data, loading, refresh } = useRequest(
() => {
const getSortField = () => {
if (Array.isArray(sorterInfo)) {
return undefined;
}

return sorterInfo?.field as GetSqlManageListV2SortFieldEnum;
};
const getSortOrder = () => {
if (Array.isArray(sorterInfo)) {
return undefined;
}

if (sorterInfo?.order === 'ascend') {
return GetSqlManageListV2SortOrderEnum.asc;
}

if (sorterInfo?.order === 'descend') {
return GetSqlManageListV2SortOrderEnum.desc;
}
};
return SqlManage.GetSqlManageListV2({
project_name: projectName,
page_index: pagination.pageIndex,
page_size: pagination.pageSize,
filter_assignee: !!filterInfo.filter_assignee ? username : undefined,
filter_last_audit_start_time_from: translateTimeForRequest(
filterInfo.filter_last_audit_time?.[0]
),
filter_last_audit_start_time_to: translateTimeForRequest(
filterInfo.filter_last_audit_time?.[1]
),

fuzzy_search_sql_fingerprint: filterInfo.fuzzy_search_sql_fingerprint,
filter_instance_name: filterInfo.filter_instance_name,
fuzzy_search_schema_name: filterInfo.fuzzy_search_schema_name,
filter_status: filterInfo.filter_status,
filter_source: filterInfo.filter_source,
filter_audit_level: filterInfo.filter_audit_level,
filter_db_type: filterInfo.filter_rule?.split(
DB_TYPE_RULE_NAME_SEPARATOR
)?.[0],
filter_rule_name: filterInfo.filter_rule?.split(
DB_TYPE_RULE_NAME_SEPARATOR
)?.[1],
fuzzy_search_endpoint: filterInfo.fuzzy_search_endpoint,
fuzzy_search_audit_plan_name: filterInfo.fuzzy_search_audit_plan_name,
sort_field: getSortField(),
sort_order: getSortOrder(),
}).then((res) => {
setSQLNum({
SQLTotalNum: res.data?.sql_manage_total_num ?? 0,
problemSQlNum: res.data?.sql_manage_bad_num ?? 0,
optimizedSQLNum: res.data?.sql_manage_optimized_num ?? 0,
});
return {
list: res.data?.data ?? [],
total: res.data?.sql_manage_total_num ?? 0,
};
});

Check warning on line 141 in src/page/SQLManagement/SQLPanel/index.tsx

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement
},
{
refreshDeps: [pagination, filterInfo, sorterInfo],
Expand Down Expand Up @@ -315,43 +316,44 @@
{ setFalse: finishExport, setTrue: startExport },
] = useBoolean(false);

const exportAction = () => {
startExport();
const hideLoading = message.loading(
t('sqlManagement.table.actions.exporting')
);

const filterValues = filterForm.getFieldsValue();

const params: IExportSqlManageV1Params = {
project_name: projectName,
fuzzy_search_sql_fingerprint: filterValues.fuzzy_search_sql_fingerprint,
filter_assignee: !!filterValues.filter_assignee ? username : undefined,
filter_instance_name: filterValues.filter_instance_name,
fuzzy_search_schema_name: filterValues.fuzzy_search_schema_name,
filter_source: filterValues.filter_source as
| exportSqlManageV1FilterSourceEnum
| undefined,
filter_audit_level: filterValues.filter_audit_level as
| exportSqlManageV1FilterAuditLevelEnum
| undefined,
filter_last_audit_start_time_from: translateTimeForRequest(
filterValues.filter_last_audit_time?.[0]
),
filter_last_audit_start_time_to: translateTimeForRequest(
filterValues.filter_last_audit_time?.[1]
),
filter_status: filterValues.filter_status as
| exportSqlManageV1FilterStatusEnum
| undefined,
filter_db_type: filterValues.filter_rule?.split(
DB_TYPE_RULE_NAME_SEPARATOR
)?.[0],
filter_rule_name: filterValues.filter_rule?.split(
DB_TYPE_RULE_NAME_SEPARATOR
)?.[1],
fuzzy_search_endpoint: filterValues.fuzzy_search_endpoint,
fuzzy_search_audit_plan_name: filterValues.fuzzy_search_audit_plan_name
};

Check warning on line 356 in src/page/SQLManagement/SQLPanel/index.tsx

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement

SqlManage.exportSqlManageV1(params, { responseType: 'blob' })
.then((res) => {
Expand Down
2 changes: 2 additions & 0 deletions src/page/SQLManagement/SQLPanel/index.type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ export type SQLPanelFilterFormFields = {
fuzzy_search_endpoint?: string;

fuzzy_search_schema_name?: string;

fuzzy_search_audit_plan_name?: string;
};

export type SQLPanelFilterFormProps = {
Expand Down
Loading