diff --git a/client/src/pages/ldap-query-builder-page.tsx b/client/src/pages/ldap-query-builder-page.tsx index f08aa6e..b89c21c 100644 --- a/client/src/pages/ldap-query-builder-page.tsx +++ b/client/src/pages/ldap-query-builder-page.tsx @@ -75,6 +75,8 @@ const LdapQueryBuilderPage = () => { const [testResults, setTestResults] = useState([]); const [isActive, setIsActive] = useState(true); const [autoUpdateEnabled, setAutoUpdateEnabled] = useState(false); + const [ldapAttributes, setLdapAttributes] = useState([]); + const [isLoadingAttributes, setIsLoadingAttributes] = useState(false); const [filterBuilder, setFilterBuilder] = useState({ operator: "and", groups: [] @@ -327,6 +329,45 @@ const LdapQueryBuilderPage = () => { generateLdapFilter(); } }, [filterBuilder, autoUpdateEnabled]); + + // Load LDAP attributes from the selected connection + const loadLdapAttributes = async () => { + if (!selectedConnectionId) return; + + try { + setIsLoadingAttributes(true); + const res = await apiRequest("GET", `/api/connections/${selectedConnectionId}/schema-attributes?objectClass=${objectClass}`); + const data = await res.json(); + + // Set default attributes if none are returned + if (!data || !data.length) { + setLdapAttributes([ + 'cn', 'sAMAccountName', 'givenName', 'sn', 'mail', 'userPrincipalName', + 'displayName', 'memberOf', 'objectSid', 'objectGUID', 'distinguishedName', + 'whenCreated', 'whenChanged', 'accountExpires', 'userAccountControl' + ]); + } else { + setLdapAttributes(data); + } + } catch (error) { + console.error("Failed to load LDAP attributes:", error); + // Set default attributes on error + setLdapAttributes([ + 'cn', 'sAMAccountName', 'givenName', 'sn', 'mail', 'userPrincipalName', + 'displayName', 'memberOf', 'objectSid', 'objectGUID', 'distinguishedName', + 'whenCreated', 'whenChanged', 'accountExpires', 'userAccountControl' + ]); + } finally { + setIsLoadingAttributes(false); + } + }; + + // Load attributes when connection or object class changes + useEffect(() => { + if (selectedConnectionId) { + loadLdapAttributes(); + } + }, [selectedConnectionId, objectClass]); // Save filter const handleSaveFilter = () => { @@ -773,18 +814,57 @@ const LdapQueryBuilderPage = () => { {group.conditions.map((condition: any, condIndex: number) => (
- { - const updatedGroups = [...filterBuilder.groups]; - updatedGroups[groupIndex].conditions[condIndex].attribute = e.target.value; - setFilterBuilder({ - ...filterBuilder, - groups: updatedGroups - }); - }} - /> + {ldapAttributes.length > 0 ? ( + + ) : ( + { + const updatedGroups = [...filterBuilder.groups]; + updatedGroups[groupIndex].conditions[condIndex].attribute = e.target.value; + setFilterBuilder({ + ...filterBuilder, + groups: updatedGroups + }); + }} + /> + )} + {condition.attribute === "custom" && ( + { + const updatedGroups = [...filterBuilder.groups]; + updatedGroups[groupIndex].conditions[condIndex].attribute = e.target.value; + setFilterBuilder({ + ...filterBuilder, + groups: updatedGroups + }); + }} + /> + )}