Skip to content

Commit c6de2d8

Browse files
Merge pull request #127 from wttech/abort-confirm-dialog
Abort confirm dialog
2 parents e8db473 + 1237512 commit c6de2d8

File tree

15 files changed

+100
-66
lines changed

15 files changed

+100
-66
lines changed

core/src/main/java/dev/vml/es/acm/core/code/Output.java renamed to core/src/main/java/dev/vml/es/acm/core/code/CodeOutput.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import java.io.OutputStream;
55
import java.util.Optional;
66

7-
public interface Output {
7+
public interface CodeOutput {
88

99
Optional<String> readString();
1010

core/src/main/java/dev/vml/es/acm/core/code/OutputFile.java renamed to core/src/main/java/dev/vml/es/acm/core/code/CodeOutputFile.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@
1212
import org.apache.commons.io.IOUtils;
1313
import org.apache.commons.lang3.StringUtils;
1414

15-
public class OutputFile implements Output {
15+
public class CodeOutputFile implements CodeOutput {
1616

1717
public static final String TMP_DIR = "acm/output";
1818

1919
private final String executionId;
2020

2121
private final List<Closeable> closebles = new LinkedList<>();
2222

23-
public OutputFile(String executionId) {
23+
public CodeOutputFile(String executionId) {
2424
this.executionId = executionId;
2525
}
2626

core/src/main/java/dev/vml/es/acm/core/code/OutputString.java renamed to core/src/main/java/dev/vml/es/acm/core/code/CodeOutputString.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import java.nio.charset.StandardCharsets;
55
import java.util.Optional;
66

7-
public class OutputString implements Output {
7+
public class CodeOutputString implements CodeOutput {
88

99
private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
1010

core/src/main/java/dev/vml/es/acm/core/code/CodePrintStream.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import ch.qos.logback.classic.PatternLayout;
66
import ch.qos.logback.classic.spi.ILoggingEvent;
77
import ch.qos.logback.core.OutputStreamAppender;
8+
9+
import java.io.OutputStream;
810
import java.io.PrintStream;
911
import java.util.LinkedList;
1012
import java.util.List;
@@ -13,18 +15,18 @@
1315

1416
public class CodePrintStream extends PrintStream {
1517

16-
private final ExecutionContext executionContext;
18+
private final String id;
1719

1820
private final List<Logger> loggers;
1921

20-
public CodePrintStream(ExecutionContext executionContext) {
21-
super(executionContext.getOutput().write());
22-
this.executionContext = executionContext;
22+
public CodePrintStream(String id, OutputStream output) {
23+
super(output);
24+
this.id = id;
2325
this.loggers = new LinkedList<>();
2426
}
2527

2628
public String getAppenderName() {
27-
return executionContext.getId();
29+
return id;
2830
}
2931

3032
public void registerLogger(Logger logger) {

core/src/main/java/dev/vml/es/acm/core/code/ExecutionContext.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@ public class ExecutionContext implements AutoCloseable {
99

1010
private final ExecutionMode mode;
1111

12-
private final Output output;
13-
1412
private final Executor executor;
1513

1614
private final Executable executable;
1715

1816
private final CodeContext codeContext;
1917

18+
private final CodeOutput codeOutput;
19+
20+
private final CodePrintStream codePrintStream;
21+
2022
private boolean history = true;
2123

2224
private boolean debug = false;
@@ -27,10 +29,11 @@ public ExecutionContext(
2729
String id, ExecutionMode mode, Executor executor, Executable executable, CodeContext codeContext) {
2830
this.id = id;
2931
this.mode = mode;
30-
this.output = mode == ExecutionMode.RUN ? new OutputFile(id) : new OutputString();
3132
this.executor = executor;
3233
this.executable = executable;
3334
this.codeContext = codeContext;
35+
this.codeOutput = mode == ExecutionMode.RUN ? new CodeOutputFile(id) : new CodeOutputString();
36+
this.codePrintStream = new CodePrintStream(id, codeOutput.write());
3437

3538
customizeBinding();
3639
}
@@ -39,8 +42,8 @@ public String getId() {
3942
return id;
4043
}
4144

42-
public Output getOutput() {
43-
return output;
45+
public CodeOutput getOutput() {
46+
return codeOutput;
4447
}
4548

4649
public Executor getExecutor() {
@@ -87,12 +90,13 @@ private void customizeBinding() {
8790
binding.setVariable(
8891
"log",
8992
LoggerFactory.getLogger(String.format("%s(%s)", getClass().getName(), executable.getId())));
90-
binding.setVariable("out", new CodePrintStream(this));
93+
binding.setVariable("out", codePrintStream);
9194
}
9295

9396
@Override
9497
public void close() {
95-
output.close();
98+
codePrintStream.close();
99+
codeOutput.close();
96100
}
97101

98102
public void variable(String name, Object value) {

core/src/main/java/dev/vml/es/acm/core/code/ImmediateExecution.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,11 @@ public String getError() {
8080

8181
@Override
8282
public String getOutput() {
83-
return new OutputFile(getId()).readString().orElse(null);
83+
return new CodeOutputFile(getId()).readString().orElse(null);
8484
}
8585

8686
public InputStream readOutput() throws AcmException {
87-
return new OutputFile(getId()).read();
87+
return new CodeOutputFile(getId()).read();
8888
}
8989

9090
@Override

core/src/main/java/dev/vml/es/acm/core/code/QueuedExecution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public long getDuration() {
5757

5858
@Override
5959
public String getOutput() {
60-
return new OutputFile(job.getId()).readString().orElse(null);
60+
return new CodeOutputFile(job.getId()).readString().orElse(null);
6161
}
6262

6363
@Override

ui.content/src/main/content/jcr_root/conf/acm/settings/snippet/available/core/general/output_from_logs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ content: |
55
documentation: |
66
Configures loggers to start printing entries to the console.<br>
77
Log entries are emitted when performing operations on `acl` and `repo` code variables.<br>
8-
For more details, see the [implementation](https://github.com/wttech/acm/blob/main/core/src/main/java/com/wttech/aem/acm/core/code/CodePrintStream.java).
8+
For more details, see the [implementation](https://github.com/wttech/acm/blob/main/core/src/main/java/dev/vml/es/acm/core/code/CodePrintStream.java).

ui.frontend/src/components/CodeExecuteButton.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Button, ButtonGroup, Content, Dialog, DialogContainer, Divider, Form, H
22
import Alert from '@spectrum-icons/workflow/Alert';
33
import Checkmark from '@spectrum-icons/workflow/Checkmark';
44
import Close from '@spectrum-icons/workflow/Close';
5-
import Gears from '@spectrum-icons/workflow/Gears';
5+
import PlayCircle from '@spectrum-icons/workflow/PlayCircle';
66
import React, { useState } from 'react';
77
import { FormProvider, useForm } from 'react-hook-form';
88
import { toastRequest } from '../utils/api';
@@ -96,7 +96,7 @@ const CodeExecuteButton: React.FC<CodeExecuteButtonProps> = ({ code, onDescribeF
9696
return (
9797
<>
9898
<Button aria-label="Execute" variant="accent" onPress={handleExecute} isPending={isPending || described} isDisabled={isDisabled}>
99-
<Gears />
99+
<PlayCircle />
100100
<Text>Execute</Text>
101101
</Button>
102102
<DialogContainer onDismiss={handleCloseDialog}>

ui.frontend/src/components/ExecutionAbortButton.tsx

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import { Button, Text } from '@adobe/react-spectrum';
1+
import { Button, ButtonGroup, Content, Dialog, DialogTrigger, Divider, Heading, Text } from '@adobe/react-spectrum';
22
import { ToastQueue } from '@react-spectrum/toast';
33
import Cancel from '@spectrum-icons/workflow/Cancel';
4+
import StopCircle from '@spectrum-icons/workflow/StopCircle';
45
import React, { useState } from 'react';
6+
import { useDeepCompareEffect } from 'react-use';
57
import { appState } from '../hooks/app.ts';
68
import { pollExecutionPending } from '../hooks/execution';
79
import { apiRequest } from '../utils/api';
@@ -14,8 +16,16 @@ interface ExecutionAbortButtonProps {
1416
}
1517

1618
const ExecutionAbortButton: React.FC<ExecutionAbortButtonProps> = ({ execution, onComplete }) => {
19+
const [showDialog, setShowDialog] = useState(false);
1720
const [isAborting, setIsAborting] = useState(false);
1821

22+
// Auto-close dialog if execution is no longer pending
23+
useDeepCompareEffect(() => {
24+
if (showDialog && (!execution || !isExecutionPending(execution.status))) {
25+
setShowDialog(false);
26+
}
27+
}, [execution, showDialog]);
28+
1929
const onAbort = async () => {
2030
if (!execution?.id) {
2131
console.warn('Code execution cannot be aborted as it is not running!');
@@ -49,14 +59,37 @@ const ExecutionAbortButton: React.FC<ExecutionAbortButtonProps> = ({ execution,
4959
});
5060
} finally {
5161
setIsAborting(false);
62+
setShowDialog(false);
5263
}
5364
};
5465

5566
return (
56-
<Button variant="negative" isDisabled={!execution || !isExecutionPending(execution.status) || isAborting} onPress={onAbort}>
57-
<Cancel />
58-
<Text>Abort</Text>
59-
</Button>
67+
<DialogTrigger isOpen={showDialog} onOpenChange={setShowDialog}>
68+
<Button variant="negative" isDisabled={!execution || !isExecutionPending(execution.status) || isAborting} onPress={() => setShowDialog(true)}>
69+
<StopCircle />
70+
<Text>Abort</Text>
71+
</Button>
72+
<Dialog>
73+
<Heading>
74+
<Text>Confirmation</Text>
75+
</Heading>
76+
<Divider />
77+
<Content>
78+
<p>This action will abort current code execution.</p>
79+
<p>Be aware that aborting execution may leave data in an inconsistent state.</p>
80+
</Content>
81+
<ButtonGroup>
82+
<Button variant="secondary" onPress={() => setShowDialog(false)} isDisabled={isAborting}>
83+
<Cancel />
84+
<Text>Cancel</Text>
85+
</Button>
86+
<Button variant="negative" style="fill" onPress={onAbort} isPending={isAborting}>
87+
<StopCircle />
88+
<Text>Abort</Text>
89+
</Button>
90+
</ButtonGroup>
91+
</Dialog>
92+
</DialogTrigger>
6093
);
6194
};
6295

ui.frontend/src/components/ScriptSynchronizeButton.tsx

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,40 +31,36 @@ const ScriptSynchronizeButton: React.FC<ScriptSynchronizeButtonProps> = ({ selec
3131
}
3232
};
3333

34-
const renderSyncDialog = () => (
35-
<>
36-
<Heading>
37-
<Text>Confirmation</Text>
38-
</Heading>
39-
<Divider />
40-
<Content>
41-
<p>
42-
This action will synchronize <strong>all scripts</strong> between the author and publish instances. This ensures consistency across the whole environment.
43-
</p>
44-
<p>
45-
Notice that <strong>both enabled and disabled</strong> scripts will be synchronized.
46-
</p>
47-
</Content>
48-
<ButtonGroup>
49-
<Button variant="secondary" onPress={() => setSyncDialogOpen(false)} isDisabled={isLoading}>
50-
<Cancel />
51-
<Text>Cancel</Text>
52-
</Button>
53-
<Button variant="negative" style="fill" onPress={handleSyncConfirm} isPending={isLoading}>
54-
<Checkmark />
55-
<Text>Confirm</Text>
56-
</Button>
57-
</ButtonGroup>
58-
</>
59-
);
60-
6134
return (
6235
<DialogTrigger isOpen={syncDialogOpen} onOpenChange={setSyncDialogOpen}>
6336
<Button variant="primary" onPress={() => setSyncDialogOpen(true)} isDisabled={selectedKeys.length > 0}>
6437
<UploadToCloud />
6538
<Text>Synchronize</Text>
6639
</Button>
67-
<Dialog>{renderSyncDialog()}</Dialog>
40+
<Dialog>
41+
<Heading>
42+
<Text>Confirmation</Text>
43+
</Heading>
44+
<Divider />
45+
<Content>
46+
<p>
47+
This action will synchronize <strong>all scripts</strong> between the author and publish instances. This ensures consistency across the whole environment.
48+
</p>
49+
<p>
50+
Notice that <strong>both enabled and disabled</strong> scripts will be synchronized.
51+
</p>
52+
</Content>
53+
<ButtonGroup>
54+
<Button variant="secondary" onPress={() => setSyncDialogOpen(false)} isDisabled={isLoading}>
55+
<Cancel />
56+
<Text>Cancel</Text>
57+
</Button>
58+
<Button variant="negative" style="fill" onPress={handleSyncConfirm} isPending={isLoading}>
59+
<Checkmark />
60+
<Text>Confirm</Text>
61+
</Button>
62+
</ButtonGroup>
63+
</Dialog>
6864
</DialogTrigger>
6965
);
7066
};

ui.frontend/src/pages/ConsolePage.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,14 @@ const ConsolePage = () => {
109109
<ExecutionAbortButton execution={execution} onComplete={setExecution} />
110110
<ExecutionCopyOutputButton output={executionOutput} />
111111
</ButtonGroup>
112-
<Switch isSelected={autoscroll} isDisabled={!isExecutionPending(execution?.status)} marginStart={20} onChange={() => setAutoscroll((prev) => !prev)}>
113-
<Text>Autoscroll</Text>
114-
</Switch>
115112
</Flex>
116113
<Flex flex="1" justifyContent="center" alignItems="center">
117114
<ExecutionProgressBar execution={execution} active={executing} />
118115
</Flex>
119116
<Flex flex="1" justifyContent="end" alignItems="center">
117+
<Switch isSelected={autoscroll} isDisabled={!isExecutionPending(execution?.status)} marginStart={20} onChange={() => setAutoscroll((prev) => !prev)}>
118+
<Text>Autoscroll</Text>
119+
</Switch>
120120
<ConsoleHelpButton />
121121
</Flex>
122122
</Flex>

ui.frontend/src/pages/ExecutionView.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,19 +154,18 @@ const ExecutionView = () => {
154154
{isExecutableScript(execution.executable.id) && (
155155
<Button variant="secondary" style="fill" onPress={() => navigate(`/scripts/view/${encodeURIComponent(execution?.executable.id)}`)}>
156156
<FileCode />
157-
<Text>Show in scripts</Text>
157+
<Text>View in scripts</Text>
158158
</Button>
159159
)}
160160
</ButtonGroup>
161-
<Switch isSelected={autoscrollOutput} isDisabled={!isExecutionPending(execution.status)} marginStart={20} onChange={() => setAutoscrollOutput((prev) => !prev)}>
162-
<Text>Autoscroll</Text>
163-
</Switch>
164161
</Flex>
165162
<Flex flex="1" justifyContent="center" alignItems="center">
166163
<ExecutionProgressBar execution={execution} />
167164
</Flex>
168165
<Flex flex="1" justifyContent="end" alignItems="center">
169-
&nbsp;
166+
<Switch isSelected={autoscrollOutput} isDisabled={!isExecutionPending(execution.status)} marginStart={20} onChange={() => setAutoscrollOutput((prev) => !prev)}>
167+
<Text>Autoscroll</Text>
168+
</Switch>
170169
</Flex>
171170
</Flex>
172171
<CodeEditor id="execution-output" value={executionOutput} readOnly scrollToBottomOnUpdate={autoscrollOutput} />

ui.frontend/src/pages/HistoryPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ const HistoryPage = () => {
5454
setLoading(true);
5555
try {
5656
const params = new URLSearchParams();
57-
params.append(ExecutionQueryParams.FORMAT, ExecutionFormat.SUMMARY);
57+
params.append(ExecutionQueryParams.FORMAT, ExecutionFormat.SUMMARY.toLowerCase());
5858
if (executableId) params.append(ExecutionQueryParams.EXECUTABLE_ID, executableId);
5959
if (userId) params.append(ExecutionQueryParams.USER_ID, userId);
6060
if (startDate) params.append(ExecutionQueryParams.START_DATE, startDate.toString());
6161
if (endDate) params.append(ExecutionQueryParams.END_DATE, endDate.toString());
62-
if (status && status !== 'all') params.append(ExecutionQueryParams.STATUS, status);
62+
if (status && status !== 'all') params.append(ExecutionQueryParams.STATUS, status?.toLowerCase());
6363
if (durationMin || durationMax) params.append(ExecutionQueryParams.DURATION, `${durationMin || ''},${durationMax || ''}`);
6464

6565
setSearchState(params.toString(), { replace: true });

ui.frontend/src/pages/ScriptView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ const ScriptView = () => {
147147
}
148148
>
149149
<History />
150-
<Text>Show in history</Text>
150+
<Text>View in history</Text>
151151
</Button>
152152
)}
153153
</ButtonGroup>

0 commit comments

Comments
 (0)