From 1ad5600315e43a09d1ed9e8e6cf45e44421006db Mon Sep 17 00:00:00 2001 From: alphaeusmote <41258468-alphaeusmote@users.noreply.replit.com> Date: Wed, 9 Apr 2025 03:07:53 +0000 Subject: [PATCH] Add auto-update feature to LDAP query builder. This allows users to automatically generate and update LDAP filters based on changes made in the builder. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 705f2157-ef97-4fbd-89e4-8c7f2ecaea90 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/7ed01c5f-a82d-405a-b728-b2e3d127c60c/780f41b5-94d1-4167-880d-b8a8a3fce389.jpg --- client/src/pages/ldap-query-builder-page.tsx | 552 ++++++++----------- 1 file changed, 241 insertions(+), 311 deletions(-) diff --git a/client/src/pages/ldap-query-builder-page.tsx b/client/src/pages/ldap-query-builder-page.tsx index f736c17..f08aa6e 100644 --- a/client/src/pages/ldap-query-builder-page.tsx +++ b/client/src/pages/ldap-query-builder-page.tsx @@ -4,6 +4,7 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/com import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; +import { Switch } from "@/components/ui/switch"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { useQuery, useMutation } from "@tanstack/react-query"; @@ -73,9 +74,9 @@ const LdapQueryBuilderPage = () => { const [showTestResultsDialog, setShowTestResultsDialog] = useState(false); const [testResults, setTestResults] = useState([]); const [isActive, setIsActive] = useState(true); + const [autoUpdateEnabled, setAutoUpdateEnabled] = useState(false); const [filterBuilder, setFilterBuilder] = useState({ operator: "and", - conditions: [{ attribute: "", operator: "equals", value: "" }], groups: [] }); @@ -240,7 +241,6 @@ const LdapQueryBuilderPage = () => { // Reset filter builder to default state setFilterBuilder({ operator: "and", - conditions: [{ attribute: "", operator: "equals", value: "" }], groups: [] }); }; @@ -272,6 +272,62 @@ const LdapQueryBuilderPage = () => { } }; + // Generate LDAP filter from the builder + const generateLdapFilter = () => { + const mainOperatorSymbol = filterBuilder.operator === 'and' ? '&' : '|'; + + // Generate group conditions + const groupsLdap = filterBuilder.groups + .map((group: any) => { + const groupOperatorSymbol = group.operator === 'and' ? '&' : '|'; + + const groupConditions = group.conditions + .filter((c: any) => c.attribute.trim() !== '') + .map((c: any) => { + switch (c.operator) { + case 'equals': + return `(${c.attribute}=${c.value})`; + case 'contains': + return `(${c.attribute}=*${c.value}*)`; + case 'startsWith': + return `(${c.attribute}=${c.value}*)`; + case 'endsWith': + return `(${c.attribute}=*${c.value})`; + case 'present': + return `(${c.attribute}=*)`; + case 'notEquals': + return `(!(${c.attribute}=${c.value}))`; + default: + return `(${c.attribute}=${c.value})`; + } + }); + + if (groupConditions.length === 0) { + return ''; + } else if (groupConditions.length === 1) { + return groupConditions[0]; + } else { + return `(${groupOperatorSymbol}${groupConditions.join('')})`; + } + }) + .filter((ldap: string) => ldap !== ''); + + if (groupsLdap.length === 0) { + setFilterQuery(''); + } else if (groupsLdap.length === 1) { + setFilterQuery(groupsLdap[0]); + } else { + setFilterQuery(`(${mainOperatorSymbol}${groupsLdap.join('')})`); + } + }; + + // Auto-update the LDAP filter when changes are made (if enabled) + useEffect(() => { + if (autoUpdateEnabled) { + generateLdapFilter(); + } + }, [filterBuilder, autoUpdateEnabled]); + // Save filter const handleSaveFilter = () => { if (!filterName || !filterQuery) { @@ -644,102 +700,6 @@ const LdapQueryBuilderPage = () => { - {/* Main conditions section */} -
- {filterBuilder.conditions.map((condition: any, index: number) => ( -
-
- { - const updatedConditions = [...filterBuilder.conditions]; - updatedConditions[index].attribute = e.target.value; - setFilterBuilder({ - ...filterBuilder, - conditions: updatedConditions - }); - }} - /> -
-
- -
-
- { - const updatedConditions = [...filterBuilder.conditions]; - updatedConditions[index].value = e.target.value; - setFilterBuilder({ - ...filterBuilder, - conditions: updatedConditions - }); - }} - /> -
-
- -
-
- ))} - - -
- {/* Condition groups section */}
@@ -767,231 +727,201 @@ const LdapQueryBuilderPage = () => {
- {filterBuilder.groups && filterBuilder.groups.map((group: any, groupIndex: number) => ( -
-
-
- - { + const updatedGroups = [...filterBuilder.groups]; + updatedGroups[groupIndex].operator = value; + setFilterBuilder({ + ...filterBuilder, + groups: updatedGroups + }); + }} + > + + + + + AND + OR + + +
+ +
+ +
+ {group.conditions.map((condition: any, condIndex: number) => ( +
+
+ { + const updatedGroups = [...filterBuilder.groups]; + updatedGroups[groupIndex].conditions[condIndex].attribute = e.target.value; + setFilterBuilder({ + ...filterBuilder, + groups: updatedGroups + }); + }} + /> +
+
+ +
+
+ { + const updatedGroups = [...filterBuilder.groups]; + updatedGroups[groupIndex].conditions[condIndex].value = e.target.value; + setFilterBuilder({ + ...filterBuilder, + groups: updatedGroups + }); + }} + /> +
+
+ +
+
+ ))} + +
-
- -
- {group.conditions.map((condition: any, condIndex: number) => ( -
-
- { - const updatedGroups = [...filterBuilder.groups]; - updatedGroups[groupIndex].conditions[condIndex].attribute = e.target.value; - setFilterBuilder({ - ...filterBuilder, - groups: updatedGroups - }); - }} - /> -
-
- -
-
- { - const updatedGroups = [...filterBuilder.groups]; - updatedGroups[groupIndex].conditions[condIndex].value = e.target.value; - setFilterBuilder({ - ...filterBuilder, - groups: updatedGroups - }); - }} - /> -
-
- -
-
- ))} - - -
-
- ))} - - -
- + ] + }); + }} + > + + Add First Group + +
+ )} + + {/* Additional feature 1: Auto-generate filter on changes */} +
+ + +
+ + {/* Generate button (if not auto-update) */} + {!autoUpdateEnabled && ( +
+ +
+ )} + {/* Display LDAP Filter */} {filterQuery && (