feat: support get merged rule-set name

This commit is contained in:
MystiPanda 2024-07-03 22:13:24 +08:00
parent b5f0243a89
commit 94f0ff1ed1
2 changed files with 63 additions and 27 deletions

View File

@ -483,6 +483,8 @@ export const ProfileItem = (props: Props) => {
onClose={() => setFileOpen(false)} onClose={() => setFileOpen(false)}
/> />
<RulesEditorViewer <RulesEditorViewer
groupsUid={option?.groups ?? ""}
mergeUid={option?.merge ?? ""}
profileUid={uid} profileUid={uid}
property={option?.rules ?? ""} property={option?.rules ?? ""}
open={rulesOpen} open={rulesOpen}

View File

@ -40,6 +40,8 @@ import MonacoEditor from "react-monaco-editor";
import { useThemeMode } from "@/services/states"; import { useThemeMode } from "@/services/states";
interface Props { interface Props {
groupsUid: string;
mergeUid: string;
profileUid: string; profileUid: string;
title?: string | ReactNode; title?: string | ReactNode;
property: string; property: string;
@ -230,7 +232,16 @@ const rules: {
const builtinProxyPolicies = ["DIRECT", "REJECT", "REJECT-DROP", "PASS"]; const builtinProxyPolicies = ["DIRECT", "REJECT", "REJECT-DROP", "PASS"];
export const RulesEditorViewer = (props: Props) => { export const RulesEditorViewer = (props: Props) => {
const { title, profileUid, property, open, onClose, onSave } = props; const {
title,
groupsUid,
mergeUid,
profileUid,
property,
open,
onClose,
onSave,
} = props;
const { t } = useTranslation(); const { t } = useTranslation();
const themeMode = useThemeMode(); const themeMode = useThemeMode();
@ -291,11 +302,11 @@ export const RulesEditorViewer = (props: Props) => {
}; };
const fetchContent = async () => { const fetchContent = async () => {
let data = await readProfileFile(property); let data = await readProfileFile(property);
let obj = yaml.load(data) as { prepend: []; append: []; delete: [] }; let obj = yaml.load(data) as { prepend: []; append: []; delete: [] } | null;
setPrependSeq(obj.prepend || []); setPrependSeq(obj?.prepend || []);
setAppendSeq(obj.append || []); setAppendSeq(obj?.append || []);
setDeleteSeq(obj.delete || []); setDeleteSeq(obj?.delete || []);
setPrevData(data); setPrevData(data);
setCurrData(data); setCurrData(data);
@ -305,10 +316,14 @@ export const RulesEditorViewer = (props: Props) => {
if (currData === "") return; if (currData === "") return;
if (visible !== true) return; if (visible !== true) return;
let obj = yaml.load(currData) as { prepend: []; append: []; delete: [] }; let obj = yaml.load(currData) as {
setPrependSeq(obj.prepend || []); prepend: [];
setAppendSeq(obj.append || []); append: [];
setDeleteSeq(obj.delete || []); delete: [];
} | null;
setPrependSeq(obj?.prepend || []);
setAppendSeq(obj?.append || []);
setDeleteSeq(obj?.delete || []);
}, [visible]); }, [visible]);
useEffect(() => { useEffect(() => {
@ -320,26 +335,45 @@ export const RulesEditorViewer = (props: Props) => {
const fetchProfile = async () => { const fetchProfile = async () => {
let data = await readProfileFile(profileUid); let data = await readProfileFile(profileUid);
let groupsObj = yaml.load(data) as { "proxy-groups": [] }; let groupsData = await readProfileFile(groupsUid);
let rulesObj = yaml.load(data) as { rules: [] }; let mergeData = await readProfileFile(mergeUid);
let ruleSetObj = yaml.load(data) as { "rule-providers": [] }; let globalMergeData = await readProfileFile("Merge");
let subRuleObj = yaml.load(data) as { "sub-rules": [] };
let rulesObj = yaml.load(data) as { rules: [] } | null;
let originGroupsObj = yaml.load(data) as { "proxy-groups": [] } | null;
let originGroups = originGroupsObj?.["proxy-groups"] || [];
let moreGroupsObj = yaml.load(groupsData) as { "proxy-groups": [] } | null;
let moreGroups = moreGroupsObj?.["proxy-groups"] || [];
let groups = originGroups.concat(moreGroups);
let originRuleSetObj = yaml.load(data) as { "rule-providers": {} } | null;
let originRuleSet = originRuleSetObj?.["rule-providers"] || {};
let moreRuleSetObj = yaml.load(mergeData) as {
"rule-providers": {};
} | null;
let moreRuleSet = moreRuleSetObj?.["rule-providers"] || {};
let globalRuleSetObj = yaml.load(globalMergeData) as {
"rule-providers": {};
} | null;
let globalRuleSet = globalRuleSetObj?.["rule-providers"] || {};
let ruleSet = Object.assign({}, originRuleSet, moreRuleSet, globalRuleSet);
let originSubRuleObj = yaml.load(data) as { "sub-rules": {} } | null;
let originSubRule = originSubRuleObj?.["sub-rules"] || {};
let moreSubRuleObj = yaml.load(mergeData) as { "sub-rules": {} } | null;
let moreSubRule = moreSubRuleObj?.["sub-rules"] || {};
let globalSubRuleObj = yaml.load(globalMergeData) as {
"sub-rules": {};
} | null;
let globalSubRule = globalSubRuleObj?.["sub-rules"] || {};
let subRule = Object.assign({}, originSubRule, moreSubRule, globalSubRule);
setProxyPolicyList( setProxyPolicyList(
builtinProxyPolicies.concat( builtinProxyPolicies.concat(groups.map((group: any) => group.name))
groupsObj["proxy-groups"]
? groupsObj["proxy-groups"].map((item: any) => item.name)
: []
)
);
setRuleList(rulesObj.rules || []);
setRuleSetList(
ruleSetObj["rule-providers"]
? Object.keys(ruleSetObj["rule-providers"])
: []
);
setSubRuleList(
subRuleObj["sub-rules"] ? Object.keys(subRuleObj["sub-rules"]) : []
); );
setRuleSetList(Object.keys(ruleSet));
setSubRuleList(Object.keys(subRule));
setRuleList(rulesObj?.rules || []);
}; };
useEffect(() => { useEffect(() => {