Can set the list of referenced filters in filters list
This commit is contained in:
		@@ -0,0 +1,54 @@
 | 
			
		||||
import React from "react";
 | 
			
		||||
import { NWFilter } from "../../api/NWFilterApi";
 | 
			
		||||
import { NWFilterSelectInput } from "./NWFilterSelectInput";
 | 
			
		||||
import { NWFilterItem } from "../nwfilter/NWFilterItem";
 | 
			
		||||
 | 
			
		||||
export function NWFSelectReferencedFilters(p: {
 | 
			
		||||
  editable: boolean;
 | 
			
		||||
  selected: string[];
 | 
			
		||||
  nwFiltersList: NWFilter[];
 | 
			
		||||
  onChange?: () => void;
 | 
			
		||||
  excludedFilters?: string[];
 | 
			
		||||
}): React.ReactElement {
 | 
			
		||||
  const nwfilters = React.useMemo(
 | 
			
		||||
    () =>
 | 
			
		||||
      p.excludedFilters
 | 
			
		||||
        ? p.nwFiltersList.filter((f) => !p.excludedFilters!.includes(f.name))
 | 
			
		||||
        : p.nwFiltersList,
 | 
			
		||||
    [p.excludedFilters]
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  const selectedFilters = React.useMemo(
 | 
			
		||||
    () => p.selected.map((f) => p.nwFiltersList.find((s) => s.name === f)),
 | 
			
		||||
    [p.selected.length]
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <>
 | 
			
		||||
      {selectedFilters.map((entry, n) => (
 | 
			
		||||
        <NWFilterItem
 | 
			
		||||
          key={n}
 | 
			
		||||
          value={entry}
 | 
			
		||||
          onDelete={() => {
 | 
			
		||||
            p.selected.splice(n, 1);
 | 
			
		||||
            p.onChange?.();
 | 
			
		||||
          }}
 | 
			
		||||
        />
 | 
			
		||||
      ))}
 | 
			
		||||
 | 
			
		||||
      {p.editable && (
 | 
			
		||||
        <NWFilterSelectInput
 | 
			
		||||
          editable={p.editable}
 | 
			
		||||
          label="Attach a new filter"
 | 
			
		||||
          canBeNull={false}
 | 
			
		||||
          nwfilters={nwfilters}
 | 
			
		||||
          value={""}
 | 
			
		||||
          onChange={(f) => {
 | 
			
		||||
            p.selected.push(f!);
 | 
			
		||||
            p.onChange?.();
 | 
			
		||||
          }}
 | 
			
		||||
        />
 | 
			
		||||
      )}
 | 
			
		||||
    </>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
import { Autocomplete, TextField } from "@mui/material";
 | 
			
		||||
import { NWFilter } from "../../api/NWFilterApi";
 | 
			
		||||
import { NWFilterItem } from "../nwfilter/NWFilterItem";
 | 
			
		||||
import React from "react";
 | 
			
		||||
 | 
			
		||||
export function NWFilterSelectInput(p: {
 | 
			
		||||
  editable: boolean;
 | 
			
		||||
@@ -10,6 +11,8 @@ export function NWFilterSelectInput(p: {
 | 
			
		||||
  onChange?: (name?: string) => void;
 | 
			
		||||
  canBeNull: boolean;
 | 
			
		||||
}): React.ReactElement {
 | 
			
		||||
  const [open, setOpen] = React.useState(false);
 | 
			
		||||
 | 
			
		||||
  const selectedValue = p.nwfilters.find((o) => o.name === p.value);
 | 
			
		||||
  if (!p.editable && !selectedValue) return <></>;
 | 
			
		||||
 | 
			
		||||
@@ -23,7 +26,14 @@ export function NWFilterSelectInput(p: {
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <Autocomplete
 | 
			
		||||
      disablePortal
 | 
			
		||||
      open={open}
 | 
			
		||||
      onOpen={() => {
 | 
			
		||||
        setOpen(true);
 | 
			
		||||
      }}
 | 
			
		||||
      onClose={() => {
 | 
			
		||||
        setOpen(false);
 | 
			
		||||
      }}
 | 
			
		||||
      readOnly={!p.editable}
 | 
			
		||||
      options={[...(p.canBeNull ? [undefined] : []), ...p.nwfilters]}
 | 
			
		||||
      getOptionLabel={(o) => o?.name ?? "Unspecified"}
 | 
			
		||||
      value={selectedValue}
 | 
			
		||||
@@ -32,7 +42,11 @@ export function NWFilterSelectInput(p: {
 | 
			
		||||
      )}
 | 
			
		||||
      renderOption={(_props, option, _state) => (
 | 
			
		||||
        <NWFilterItem
 | 
			
		||||
          onClick={() => p.onChange?.(option?.name)}
 | 
			
		||||
          dense
 | 
			
		||||
          onClick={() => {
 | 
			
		||||
            p.onChange?.(option?.name);
 | 
			
		||||
            setOpen(false);
 | 
			
		||||
          }}
 | 
			
		||||
          value={option}
 | 
			
		||||
        />
 | 
			
		||||
      )}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ import { EditSection } from "../forms/EditSection";
 | 
			
		||||
import { TextInput } from "../forms/TextInput";
 | 
			
		||||
import { ServerApi } from "../../api/ServerApi";
 | 
			
		||||
import { SelectInput } from "../forms/SelectInput";
 | 
			
		||||
import { NWFSelectReferencedFilters } from "../forms/NWFSelectReferencedFilters";
 | 
			
		||||
 | 
			
		||||
interface DetailsProps {
 | 
			
		||||
  nwfilter: NWFilter;
 | 
			
		||||
@@ -143,6 +144,17 @@ function NetworkFilterDetailsTabGeneral(
 | 
			
		||||
          size={ServerApi.Config.constraints.nwfilter_priority}
 | 
			
		||||
        />
 | 
			
		||||
      </EditSection>
 | 
			
		||||
 | 
			
		||||
      {/* Referenced filters */}
 | 
			
		||||
      {(p.editable || p.nwfilter.join_filters.length > 0) && (
 | 
			
		||||
        <EditSection title="Referenced filters">
 | 
			
		||||
          <NWFSelectReferencedFilters
 | 
			
		||||
            selected={p.nwfilter.join_filters}
 | 
			
		||||
            excludedFilters={[p.nwfilter.name]}
 | 
			
		||||
            {...p}
 | 
			
		||||
          />
 | 
			
		||||
        </EditSection>
 | 
			
		||||
      )}
 | 
			
		||||
    </Grid>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,6 @@ export function NWFilterItem(p: {
 | 
			
		||||
}): React.ReactElement {
 | 
			
		||||
  const inner = (
 | 
			
		||||
    <>
 | 
			
		||||
      {" "}
 | 
			
		||||
      <ListItemAvatar>
 | 
			
		||||
        <Avatar>
 | 
			
		||||
          <Icon path={mdiSecurityNetwork} />
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user