11import  React ,  {  useEffect ,  useState  }  from  'react' ; 
22import  { 
3+   Alert , 
34  Button , 
45  Bullseye , 
56  EmptyState , 
@@ -15,7 +16,6 @@ import {
1516  DataListItemRow , 
1617  DataListToggle , 
1718  Pagination , 
18-   TextArea , 
1919  Title , 
2020  Toolbar , 
2121  ToolbarItem , 
@@ -26,10 +26,9 @@ import {
2626  StackItem , 
2727  Spinner 
2828}  from  '@patternfly/react-core' ; 
29+ import  {  CodeEditor  }  from  '@patternfly/react-code-editor' ; 
2930import  SyntaxHighlighter  from  'react-syntax-highlighter' ; 
3031import  {  githubGist  }  from  'react-syntax-highlighter/dist/esm/styles/hljs' ; 
31- import  {  TableEmptyState  }  from  '@app/Common/TableEmptyState' ; 
32- import  {  global_FontSize_sm  }  from  '@patternfly/react-tokens' ; 
3332import  {  useTranslation  }  from  'react-i18next' ; 
3433import  {  useFetchTask  }  from  '@app/services/tasksHook' ; 
3534import  {  ExecuteTasks  }  from  '@app/Tasks/ExecuteTasks' ; 
@@ -57,9 +56,10 @@ const TasksTableDisplay = (props: { setTasksCount: (number) => void; isVisible:
5756  const  [ editTaskName ,  setEditTaskName ]  =  useState < string > ( '' ) ; 
5857  const  [ editScript ,  setEditScript ]  =  useState < string > ( '' ) ; 
5958  const  [ scriptContent ,  setScriptContent ]  =  useState ( new  Map < string ,  string > ( ) ) ; 
59+   const  [ scriptError ,  setScriptError ]  =  useState < string > ( '' ) ; 
6060
6161  useEffect ( ( )  =>  { 
62-     if  ( tasks )  { 
62+     if  ( loading )  { 
6363      props . setTasksCount ( tasks . length ) ; 
6464      const  initSlice  =  ( tasksPagination . page  -  1 )  *  tasksPagination . perPage ; 
6565      setFilteredTasks ( tasks . slice ( initSlice ,  initSlice  +  tasksPagination . perPage ) ) ; 
@@ -95,7 +95,6 @@ const TasksTableDisplay = (props: { setTasksCount: (number) => void; isVisible:
9595          scriptContent . set ( taskName ,  eitherResponse . value ) ; 
9696        }  else  { 
9797          scriptContent . set ( taskName ,  t ( 'cache-managers.tasks.script-load-error' ) ) ; 
98-           addAlert ( eitherResponse . value ) ; 
9998        } 
10099      } ) ; 
101100  } ; 
@@ -105,16 +104,30 @@ const TasksTableDisplay = (props: { setTasksCount: (number) => void; isVisible:
105104      setEditTaskName ( taskName ) ; 
106105      setEditScript ( scriptContent . get ( taskName )  as  string ) ; 
107106    }  else  { 
108-       setEditTaskName ( '' ) ; 
107+       // save script 
108+ 
109109      if  ( ! scriptContent . has ( taskName )  ||  scriptContent . get ( taskName )  ==  '' )  { 
110110        return ; 
111111      } 
112-       scriptContent . set ( taskName ,  editScript ) ; 
112+ 
113+       // Do not update if script not changed 
114+       if  ( scriptContent . get ( taskName )  ==  editScript )  { 
115+         setEditTaskName ( '' ) ; 
116+         setEditScript ( '' ) ; 
117+         return ; 
118+       } 
119+ 
113120      ConsoleServices . tasks ( ) 
114121        . createOrUpdateTask ( taskName ,  editScript ,  false ) 
115-         . then ( ( eitherCreate )  =>  { 
116-           addAlert ( eitherCreate ) ; 
117-           loadScript ( taskName ) ; 
122+         . then ( ( actionResponse )  =>  { 
123+           if  ( actionResponse . success )  { 
124+             setScriptError ( '' ) ; 
125+             setEditTaskName ( '' ) ; 
126+             addAlert ( actionResponse ) ; 
127+             loadScript ( taskName ) ; 
128+           }  else  { 
129+             setScriptError ( actionResponse . message ) ; 
130+           } 
118131        } ) 
119132        . then ( ( )  =>  reload ( ) ) ; 
120133    } 
@@ -144,6 +157,10 @@ const TasksTableDisplay = (props: { setTasksCount: (number) => void; isVisible:
144157    setExpanded ( newExpanded ) ; 
145158  } ; 
146159
160+   const  errorInScript  =  ( taskName )  =>  { 
161+     return  scriptContent . get ( taskName )  ===  t ( 'cache-managers.tasks.script-load-error' ) ; 
162+   } ; 
163+ 
147164  const  buildTaskToolbar  =  ( taskName )  =>  { 
148165    if  ( ! ConsoleServices . security ( ) . hasConsoleACL ( ConsoleACL . CREATE ,  connectedUser ) )  { 
149166      return  '' ; 
@@ -154,7 +171,7 @@ const TasksTableDisplay = (props: { setTasksCount: (number) => void; isVisible:
154171        < ToolbarGroup > 
155172          < ToolbarItem > 
156173            < Button 
157-               isDisabled = { editTaskName  ==  taskName . name  &&  editScript . length  ==   0 } 
174+               isDisabled = { ( editTaskName  ===   taskName . name  &&  editScript . length  ===    0 )   ||   errorInScript ( taskName . name ) } 
158175              id = { 'edit-button-'  +  taskName . name } 
159176              name = { 'edit-button-'  +  taskName . name } 
160177              aria-label = { 'edit-button-'  +  taskName . name } 
@@ -168,6 +185,7 @@ const TasksTableDisplay = (props: { setTasksCount: (number) => void; isVisible:
168185          </ ToolbarItem > 
169186          < ToolbarItem > 
170187            < Button 
188+               isDisabled = { errorInScript ( taskName . name ) } 
171189              id = { 'execute-button-'  +  taskName . name } 
172190              name = { 'execute-button-'  +  taskName . name } 
173191              aria-label = { 'execute-button-'  +  taskName . name } 
@@ -203,15 +221,19 @@ const TasksTableDisplay = (props: { setTasksCount: (number) => void; isVisible:
203221      ) ; 
204222    } 
205223    return  ( 
206-       < TextArea 
207-         id = "task-edit-area" 
208-         data-cy = "taskEditArea" 
209-         onChange = { ( v )  =>  setEditScript ( v ) } 
210-         value = { editScript } 
211-         validated = { editScript . length  >  0  ? 'default'  : 'error' } 
212-         style = { {  fontSize : global_FontSize_sm . value  } } 
213-         rows = { 15 } 
214-       /> 
224+       < > 
225+         { scriptError . length  >  0  &&  ( 
226+           < Alert  variant = "danger"  isInline  title = { scriptError }  style = { {  marginBottom : '1rem'  } }  /> 
227+         ) } 
228+         < CodeEditor 
229+           id = "task-edit-area" 
230+           data-cy = "taskEditArea" 
231+           isLineNumbersVisible 
232+           code = { editScript } 
233+           onChange = { ( v )  =>  setEditScript ( v ) } 
234+           height = "200px" 
235+         /> 
236+       </ > 
215237    ) ; 
216238  } ; 
217239
0 commit comments