From 9b30533d4b339aa209fc2603cf334b81a0536321 Mon Sep 17 00:00:00 2001
From: Zoltan Runyo <zoltan.runyo@ess.eu>
Date: Thu, 16 Dec 2021 11:07:53 +0100
Subject: [PATCH] ICSHWI-8454: Tool users from backend API

---
 src/api/SwaggerApi.js                | 11 +++++++++++
 src/components/IOC/IOCDetailAdmin.js | 25 +++++++++++++++++++------
 2 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/src/api/SwaggerApi.js b/src/api/SwaggerApi.js
index 244ea68e..800c7898 100644
--- a/src/api/SwaggerApi.js
+++ b/src/api/SwaggerApi.js
@@ -503,6 +503,17 @@ export function useNamingNames() {
   return useAsync({ fcn: method, call: false, init: [] });
 }
 
+export function unpackUserList(users) {
+  return users.toString().split(",");
+}
+
+export function useUserNames() {
+  const api = useContext(apiContext);
+  const method = callAndUnpack((query) => api.apis.Authentication.getToolUsers({query: query}), unpackUserList)
+
+  return useAsync({ fcn: method, call: false, init: [] });
+}
+
 export function unpackDeploymentStatistics(statistics) {
   return { ...statistics };
 }
diff --git a/src/components/IOC/IOCDetailAdmin.js b/src/components/IOC/IOCDetailAdmin.js
index a6896df8..365a4600 100644
--- a/src/components/IOC/IOCDetailAdmin.js
+++ b/src/components/IOC/IOCDetailAdmin.js
@@ -2,7 +2,7 @@ import React, { useState, useEffect, useRef } from 'react';
 import { SimpleAccordion } from "../common/Accordion/SimpleAccordion";
 import { Button, makeStyles, TextField, Typography } from "@material-ui/core";
 import { Autocomplete, Alert } from "@material-ui/lab";
-import { useAllowedGitProjects, useNamingNames, useUpdateIoc } from "../../api/SwaggerApi";
+import { useAllowedGitProjects, useNamingNames, useUpdateIoc, useUserNames } from "../../api/SwaggerApi";
 import { useTypingTimer } from "../common/SearchBoxFilter/TypingTimer";
 import { ConfirmationDialog } from "../dialog/ConfirmationDialog";
 import { SimpleModal } from "../../components/common/SimpleModal/SimpleModal";
@@ -23,6 +23,8 @@ export default function IOCDetailAdmin({ ioc, getIOC, resetTab, buttonDisabled }
     const [names, getNames] = useNamingNames();
     const [name, setName] = useState({ id: ioc.externalNameId, description: ioc.description, name: ioc.namingName });
     const [owner, setOwner] = useState(ioc.owner);
+    const [ownerQuery] = useState();
+    const [users, getUsers] = useUserNames();
 
     //for the dialog
     const [adHocDialogOpen, setAdHocDialogOpen] = useState(false);
@@ -43,6 +45,8 @@ export default function IOCDetailAdmin({ ioc, getIOC, resetTab, buttonDisabled }
 
     useEffect(() => getNames(nameQuery), [nameQuery, getNames]);
 
+    useEffect(() => getUsers(ownerQuery), [ownerQuery, getUsers]);
+
     //when user clicks Submit button a dialog should open
     const onSubmit = (event) => {
         event.preventDefault();
@@ -97,10 +101,19 @@ export default function IOCDetailAdmin({ ioc, getIOC, resetTab, buttonDisabled }
         );
     }
 
-    function ownerText(disabled) {
+    function ownerAutocomplete(disabled) {
         return(
-            <TextField id="owner" className={classes.textField} label="Owner" variant="outlined" fullWidth required value={owner} 
-                            onChange={(event) => {setOwner(event.target.value); setError(null);}} disabled={disabled}/>
+            <Autocomplete
+                className={classes.textField}
+                autoHighlight
+                id="owner"
+                options={users}
+                getOptionLabel={(option) => { return option }}
+                defaultValue={owner}
+                renderInput={(params) => <TextField {...params} label="Owner" variant="outlined" fullWidth required />}
+                onChange={(event, value, reason) => {setOwner(value); setError(null);}}
+                disabled={disabled}
+            />
         );
     }
 
@@ -130,8 +143,8 @@ export default function IOCDetailAdmin({ ioc, getIOC, resetTab, buttonDisabled }
 
                     <AccessControl 
                         allowedRoles={["DeploymentToolAdmin"]}
-                        renderNoAccess={() => ownerText(true)} >
-                        {ownerText(false)}
+                        renderNoAccess={() => ownerAutocomplete(true)} >
+                        {ownerAutocomplete(false)}
                     </AccessControl>
 
                     {error ?
-- 
GitLab