fix: align case-file rule filters with business types
This commit is contained in:
@@ -71,6 +71,10 @@ function resolveDocumentScope(pack: Pick<RuleYamlPack, 'documentType' | 'mainTyp
|
||||
return pack.documentType || pack.mainType || pack.moduleType || '未分类';
|
||||
}
|
||||
|
||||
function resolveBusinessType(pack: Pick<RuleYamlPack, 'businessType' | 'mainType'>): string {
|
||||
return pack.businessType || pack.mainType || '';
|
||||
}
|
||||
|
||||
function riskColor(risk: string): TagColor {
|
||||
if (risk === 'high') return 'red';
|
||||
if (risk === 'medium') return 'orange';
|
||||
@@ -103,7 +107,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||
const documentTypes = unique(packScopes.map(item => item.scope));
|
||||
const requestedDocumentType = requestedFilters.documentType;
|
||||
const inferredDocumentType = requestedMainType
|
||||
? packScopes.find(item => item.pack.mainType === requestedMainType)?.scope || ''
|
||||
? packScopes.find(item => resolveBusinessType(item.pack) === requestedMainType)?.scope || ''
|
||||
: '';
|
||||
const currentDocumentType = documentTypes.includes(requestedDocumentType)
|
||||
? requestedDocumentType
|
||||
@@ -114,18 +118,18 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||
const scopedFilters = {
|
||||
...requestedFilters,
|
||||
documentType: currentDocumentType,
|
||||
mainType: scopedDocumentPacks.some(pack => pack.mainType === requestedFilters.mainType)
|
||||
mainType: scopedDocumentPacks.some(pack => resolveBusinessType(pack) === requestedFilters.mainType)
|
||||
? requestedFilters.mainType
|
||||
: '',
|
||||
subtype: scopedDocumentPacks.some(pack =>
|
||||
(!requestedFilters.mainType || pack.mainType === requestedFilters.mainType) &&
|
||||
(!requestedFilters.mainType || resolveBusinessType(pack) === requestedFilters.mainType) &&
|
||||
pack.subtype === requestedFilters.subtype
|
||||
)
|
||||
? requestedFilters.subtype
|
||||
: ''
|
||||
};
|
||||
const scopedByMainTypePacks = scopedDocumentPacks.filter(pack =>
|
||||
!scopedFilters.mainType || pack.mainType === scopedFilters.mainType
|
||||
!scopedFilters.mainType || resolveBusinessType(pack) === scopedFilters.mainType
|
||||
);
|
||||
const subtypeOptions = unique(scopedByMainTypePacks.map(pack => pack.subtype));
|
||||
const ruleGroupSourcePacks = scopedFilters.subtype
|
||||
@@ -141,7 +145,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||
ruleGroup: ruleGroupOptions.includes(requestedFilters.ruleGroup) ? requestedFilters.ruleGroup : ''
|
||||
};
|
||||
const visiblePacks = scopedDocumentPacks.filter(pack =>
|
||||
(!filters.mainType || pack.mainType === filters.mainType) &&
|
||||
(!filters.mainType || resolveBusinessType(pack) === filters.mainType) &&
|
||||
(!filters.subtype || pack.subtype === filters.subtype)
|
||||
);
|
||||
|
||||
@@ -152,7 +156,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||
packId: pack.id,
|
||||
documentType: pack.documentType,
|
||||
moduleType: pack.moduleType,
|
||||
mainType: pack.mainType,
|
||||
mainType: resolveBusinessType(pack),
|
||||
subtype: pack.subtype,
|
||||
yamlName: pack.metadata.name || '待配置 YAML',
|
||||
yamlStatus: pack.sourceStatus,
|
||||
@@ -182,7 +186,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||
packId: pack.id,
|
||||
documentType: pack.documentType,
|
||||
moduleType: pack.moduleType,
|
||||
mainType: pack.mainType,
|
||||
mainType: resolveBusinessType(pack),
|
||||
subtype: pack.subtype,
|
||||
yamlName: pack.metadata.name,
|
||||
yamlStatus: pack.sourceStatus
|
||||
@@ -213,7 +217,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
||||
pageSize: filters.pageSize,
|
||||
options: {
|
||||
documentTypes,
|
||||
mainTypes: unique(scopedDocumentPacks.map(pack => pack.mainType)),
|
||||
mainTypes: unique(scopedDocumentPacks.map(pack => resolveBusinessType(pack))),
|
||||
subtypes: subtypeOptions,
|
||||
ruleGroups: ruleGroupOptions
|
||||
}
|
||||
@@ -244,6 +248,16 @@ export default function RulesTestList() {
|
||||
|
||||
const handleFilterChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
|
||||
const { name, value } = event.target;
|
||||
if (name === 'mainType') {
|
||||
updateParams({
|
||||
mainType: value,
|
||||
ruleTypeName: undefined,
|
||||
subtype: undefined,
|
||||
documentAttributeType: undefined,
|
||||
ruleGroup: undefined,
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (name === 'subtype') {
|
||||
updateParams({ subtype: value, documentAttributeType: undefined, ruleGroup: undefined });
|
||||
return;
|
||||
@@ -257,7 +271,7 @@ export default function RulesTestList() {
|
||||
|
||||
const handleReset = () => {
|
||||
const nextParams = new URLSearchParams(searchParams);
|
||||
['ruleGroup', 'subtype', 'documentAttributeType', 'keyword', 'page'].forEach(key => nextParams.delete(key));
|
||||
['mainType', 'ruleTypeName', 'ruleGroup', 'subtype', 'documentAttributeType', 'keyword', 'page'].forEach(key => nextParams.delete(key));
|
||||
nextParams.set('page', '1');
|
||||
setSearchParams(nextParams);
|
||||
};
|
||||
@@ -362,6 +376,16 @@ export default function RulesTestList() {
|
||||
</Button>
|
||||
}
|
||||
>
|
||||
<FilterSelect
|
||||
label="业务类型"
|
||||
name="mainType"
|
||||
value={filters.mainType}
|
||||
options={options.mainTypes.map(mainType => ({ value: mainType, label: mainType }))}
|
||||
onChange={handleFilterChange}
|
||||
className="mr-3 w-[18%]"
|
||||
placeholder="全部"
|
||||
/>
|
||||
|
||||
<FilterSelect
|
||||
label="子类型"
|
||||
name="subtype"
|
||||
@@ -369,6 +393,7 @@ export default function RulesTestList() {
|
||||
options={options.subtypes.map(subtype => ({ value: subtype, label: subtype }))}
|
||||
onChange={handleFilterChange}
|
||||
className="mr-3 w-[18%]"
|
||||
placeholder={filters.mainType || options.mainTypes.length <= 1 ? '全部' : '请先选择业务类型'}
|
||||
/>
|
||||
|
||||
<FilterSelect
|
||||
|
||||
Reference in New Issue
Block a user