bbovenzi commented on code in PR #54484:
URL: https://github.com/apache/airflow/pull/54484#discussion_r2283253874
##########
airflow-core/src/airflow/ui/src/pages/Dag/Tasks/Tasks.tsx:
##########
@@ -47,16 +55,102 @@ export const Tasks = () => {
dagId,
});
+ const onClearFilters = () => {
+ setSelectedOperators(undefined);
+ setSelectedTriggerRules(undefined);
+ setSelectedRetryValues(undefined);
+ setSelectedMapped(undefined);
+ };
+
+ const allOperatorNames: Array<string> = [
+ ...new Set(data?.tasks.map((task) => task.operator_name).filter((item) =>
item !== null) ?? []),
+ ];
+ const allTriggerRules: Array<string> = [
+ ...new Set(data?.tasks.map((task) => task.trigger_rule).filter((item) =>
item !== null) ?? []),
+ ];
+ const allRetryValues: Array<string> = [
+ ...new Set(
+ data?.tasks.map((task) => task.retries?.toString()).filter((item) =>
item !== undefined) ?? [],
+ ),
+ ];
+ const allMappedValues = [
+ { key: "true", label: "Mapped" },
+ { key: "false", label: "Not mapped" },
+ ];
+
+ const filterTasks = ({
+ mapped,
+ operatorNames,
+ retryValues,
+ tasks,
+ triggerRuleNames,
+ }: {
+ mapped: string | undefined;
+ operatorNames: Array<string>;
+ retryValues: Array<string>;
+ tasks: Array<TaskResponse>;
+ triggerRuleNames: Array<string>;
+ }) =>
+ tasks.filter(
+ (task) =>
+ (operatorNames.length === 0 ||
operatorNames.includes(task.operator_name as string)) &&
+ (triggerRuleNames.length === 0 ||
triggerRuleNames.includes(task.trigger_rule as string)) &&
+ (retryValues.length === 0 ||
retryValues.includes(task.retries?.toString() as string)) &&
+ (mapped === undefined || task.is_mapped?.toString() === mapped),
+ );
+
+ const filteredTasks = filterTasks({
+ mapped: selectedMapped,
+ operatorNames: selectedOperators ?? [],
+ retryValues: selectedRetryValues ?? [],
+ tasks: data ? data.tasks : [],
+ triggerRuleNames: selectedTriggerRules ?? [],
+ });
+
return (
<Box>
<ErrorAlert error={tasksError} />
<Heading my={1} size="md">
{translate("task", { count: data?.total_entries ?? 0 })}
</Heading>
+
+ <HStack>
+ <AttrSelectFilterMulti
+ displayPrefix={undefined}
+ handleSelect={setSelectedOperators}
+ placeholderText={translate("selectOperator")}
+ selectedValues={selectedOperators}
+ values={allOperatorNames}
+ />
+ <AttrSelectFilterMulti
+ displayPrefix={undefined}
+ handleSelect={setSelectedTriggerRules}
+ placeholderText={translate("selectTriggerRules")}
+ selectedValues={selectedTriggerRules}
+ values={allTriggerRules}
+ />
+ <AttrSelectFilterMulti
+ displayPrefix="Retries"
+ handleSelect={setSelectedRetryValues}
+ placeholderText={translate("selectRetryValues")}
+ selectedValues={selectedRetryValues}
+ values={allRetryValues}
+ />
+ <AttrSelectFilter
+ handleSelect={setSelectedMapped}
+ placeholderText="Select mapped"
Review Comment:
displayPrefix and placeholder text should be translated
##########
airflow-core/src/airflow/ui/src/pages/Dag/Tasks/Tasks.tsx:
##########
@@ -47,16 +55,102 @@ export const Tasks = () => {
dagId,
});
+ const onClearFilters = () => {
+ setSelectedOperators(undefined);
+ setSelectedTriggerRules(undefined);
+ setSelectedRetryValues(undefined);
+ setSelectedMapped(undefined);
+ };
+
+ const allOperatorNames: Array<string> = [
+ ...new Set(data?.tasks.map((task) => task.operator_name).filter((item) =>
item !== null) ?? []),
+ ];
+ const allTriggerRules: Array<string> = [
+ ...new Set(data?.tasks.map((task) => task.trigger_rule).filter((item) =>
item !== null) ?? []),
+ ];
+ const allRetryValues: Array<string> = [
+ ...new Set(
+ data?.tasks.map((task) => task.retries?.toString()).filter((item) =>
item !== undefined) ?? [],
+ ),
+ ];
+ const allMappedValues = [
+ { key: "true", label: "Mapped" },
+ { key: "false", label: "Not mapped" },
Review Comment:
Labels need to be translated
##########
airflow-core/src/airflow/ui/src/pages/Dag/Tasks/Tasks.tsx:
##########
@@ -38,6 +42,10 @@ const cardDef = (dagId: string): CardDef<TaskResponse> => ({
export const Tasks = () => {
const { t: translate } = useTranslation();
const { dagId = "" } = useParams();
+ const [selectedOperators, setSelectedOperators] = useState<Array<string> |
undefined>(undefined);
+ const [selectedTriggerRules, setSelectedTriggerRules] =
useState<Array<string> | undefined>(undefined);
+ const [selectedRetryValues, setSelectedRetryValues] = useState<Array<string>
| undefined>(undefined);
+ const [selectedMapped, setSelectedMapped] = useState<string |
undefined>(undefined);
Review Comment:
I think we've been doing this filters via search params so that they persist
through a url link
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]