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