import { em, Group, Stack, Table, Text } from "@mantine/core";
import { useSuspenseAPIQuery } from "../../api/api";
import { RelabelStepsResult } from "../../api/responseTypes/relabel_steps";
import { Labels } from "../../api/responseTypes/targets";
import React from "react";
import {
IconArrowDown,
IconCircleMinus,
IconCirclePlus,
IconReplace,
IconTags,
} from "@tabler/icons-react";
const iconStyle = { width: em(18), height: em(18), verticalAlign: "middle" };
const ruleTable = (rule: { [key: string]: unknown }, idx: number) => {
return (
Rule {idx + 1}
{Object.entries(rule)
.sort(([a], [b]) => {
// Sort by a predefined order for known fields, otherwise alphabetically.
const sortedRuleFieldNames: string[] = [
"action",
"source_labels",
"regex",
"modulus",
"replacement",
"target_label",
];
const ai = sortedRuleFieldNames.indexOf(a);
const bi = sortedRuleFieldNames.indexOf(b);
if (ai === -1 && bi === -1) {
return a.localeCompare(b);
}
if (ai === -1) {
return 1;
}
if (bi === -1) {
return -1;
}
return ai - bi;
})
.map(([k, v]) => (
{k}
{typeof v === "object" ? JSON.stringify(v) : String(v)}
))}
);
};
const labelsTable = (labels: Labels, prevLabels: Labels | null) => {
if (labels === null) {
return dropped;
}
return (
Labels
{Object.entries(labels)
.concat(
prevLabels
? Object.entries(prevLabels).filter(
([k]) => labels[k] === undefined
)
: []
)
.sort(([a], [b]) => a.localeCompare(b))
.map(([k, v]) => {
const added = prevLabels !== null && prevLabels[k] === undefined;
const changed =
prevLabels !== null && !added && prevLabels[k] !== v;
const removed =
prevLabels !== null &&
!changed &&
prevLabels[k] !== undefined &&
labels[k] === undefined;
return (
{added ? (
) : changed ? (
) : removed ? (
) : null}
{k}
{v}
);
})}
);
};
const RelabelSteps: React.FC<{
labels: Labels;
pool: string;
}> = ({ labels, pool }) => {
const { data } = useSuspenseAPIQuery({
path: `/targets/relabel_steps`,
params: {
labels: JSON.stringify(labels),
scrapePool: pool,
},
});
return (
{labelsTable(labels, null)}
{data.data.steps.map((step, idx) => (
{ruleTable(step.rule, idx)}
{step.keep ? (
labelsTable(
step.output,
idx === 0 ? labels : data.data.steps[idx - 1].output
)
) : (
dropped
)}
))}
);
};
export default RelabelSteps;