Skip to content

Commit f79675a

Browse files
author
Jay Ng
committed
feature(statement preview): added switching between EN/FR
1 parent fceb866 commit f79675a

File tree

4 files changed

+140
-28
lines changed

4 files changed

+140
-28
lines changed

runner/src/main/java/com/codingame/gameengine/runner/Renderer.java

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -700,14 +700,37 @@ public void handleRequest(HttpServerExchange exchange) throws Exception {
700700
exchange.setStatusCode(StatusCodes.NOT_FOUND);
701701
}
702702
} else if (exchange.getRelativePath().equals("/statement")) {
703-
File statementFile = sourceFolderPath.resolve("config/statement_en.html").toFile();
704-
if (exchange.getRequestMethod().equalToString("GET")) {
705-
String statement = FileUtils.readFileToString(statementFile, StandardCharsets.UTF_8);
706-
exchange.getResponseSender().send(statement);
703+
File statementFileEN = sourceFolderPath.resolve("config/statement_en.html").toFile();
704+
File statementFileFR = sourceFolderPath.resolve("config/statement_fr.html").toFile();
705+
if (exchange.getRequestMethod().equalToString("POST")) {
706+
String statementEN = FileUtils.readFileToString(statementFileEN, StandardCharsets.UTF_8);
707+
String statementFR;
708+
if (!statementFileFR.exists()) {
709+
statementFR = "";
710+
} else {
711+
statementFR = FileUtils.readFileToString(statementFileFR, StandardCharsets.UTF_8);
712+
}
713+
714+
exchange.getRequestReceiver().receiveFullString((e, data) -> {
715+
if (data.equals("FR")) {
716+
exchange.getResponseSender().send(statementFR);
717+
} else {
718+
exchange.getResponseSender().send(statementEN);
719+
}
720+
}, StandardCharsets.UTF_8);
707721
} else if (exchange.getRequestMethod().equalToString("PUT")) {
722+
JsonParser parser = new JsonParser();
708723
exchange.getRequestReceiver().receiveFullString((e, data) -> {
709724
try {
710-
FileUtils.write(statementFile, data, StandardCharsets.UTF_8);
725+
JsonObject result = parser.parse(data).getAsJsonObject();
726+
String language = result.get("language").getAsString();
727+
String statement = result.get("statement").getAsString();
728+
if (language.equals("FR")) {
729+
createFileIfNotExists(statementFileFR, e);
730+
FileUtils.write(statementFileFR, statement, StandardCharsets.UTF_8);
731+
} else if (language.equals("EN")) {
732+
FileUtils.write(statementFileEN, statement, StandardCharsets.UTF_8);
733+
}
711734
exchange.setStatusCode(StatusCodes.CREATED);
712735
} catch (IOException ex) {
713736
sendException(e, ex, StatusCodes.BAD_REQUEST);
@@ -726,6 +749,16 @@ public void handleRequest(HttpServerExchange exchange) throws Exception {
726749
}
727750
}
728751

752+
private void createFileIfNotExists(File statementFileFR, HttpServerExchange e) {
753+
if (!statementFileFR.exists()){
754+
try{
755+
statementFileFR.createNewFile();
756+
} catch (IOException ex) {
757+
sendException(e, ex, StatusCodes.INTERNAL_SERVER_ERROR);
758+
}
759+
}
760+
}
761+
729762
private JsonObject extractDemoFromGameJson(File gameFile) {
730763
JsonObject result = new JsonObject();
731764
JsonParser parser = new JsonParser();

runner/src/main/resources/view/statement.css

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ body {
44
}
55

66
body {
7-
display: flex;
8-
padding: 10px;
7+
display: block;
98
color: white;
109
font-family: 'Open Sans', Lato, sans-serif;
1110
font-weight: 400;
1211
background-color: #363e48;
13-
line-height: 1.6
12+
line-height: 1.6;
1413
}
1514

1615
textarea {
@@ -38,13 +37,41 @@ button {
3837
padding: 0;
3938
}
4039

40+
.tab-buttons {
41+
padding: 10px 10px 0px 10px;
42+
height: 50px;
43+
}
44+
45+
.tab-buttons button {
46+
height: 40px;
47+
background-color: #ffffff;
48+
float: left;
49+
padding: 0px 16px;
50+
transition: 0.3s;
51+
opacity: 0.8;
52+
transition: opacity 0.2s, background-color: 0.2s;
53+
54+
}
55+
56+
.tab-buttons button.hover {
57+
background-color: #000000
58+
}
59+
60+
.tab-buttons button.active {
61+
background-color: #f2bb13;
62+
opacity: 1;
63+
}
64+
4165
#statementInput {
4266
width: 600px;
43-
height: 600px;
67+
height: 100%;
68+
display: flex;
69+
flex: 1;
4470
padding: 3px;
4571
}
4672

4773
#save {
74+
flex: none;
4875
display: block;
4976
width: 300px;
5077
background-color: #f2bb13;
@@ -66,11 +93,32 @@ button {
6693
cursor: default;
6794
}
6895

96+
.wrapper {
97+
display: flex;
98+
flex-direction: column;
99+
max-height: 100vh;
100+
padding: 10px;
101+
}
102+
103+
.tab-content {
104+
display: flex;
105+
flex: 1;
106+
min-height: 0;
107+
}
108+
109+
.preview {
110+
overflow: auto;
111+
padding-top: 20px;
112+
}
113+
69114
.edit {
70-
flex: none;
71115
background: #252e38;
72116
margin: 10px;
73117
padding: 20px;
118+
flex: none;
119+
display: flex;
120+
flex-direction: column;
121+
min-height: 90vh;
74122
}
75123

76124
.edit-title,
@@ -80,6 +128,8 @@ button {
80128
color: #f2bb13;
81129
text-transform: uppercase;
82130
margin-bottom: 9px;
131+
flex: none;
132+
display: flex;
83133
}
84134

85135
#error,
@@ -121,12 +171,12 @@ button {
121171
font-weight: 400;
122172
font-size: 14px;
123173
line-height: 19px;
124-
overflow: scroll;
125174
width: 100%;
126175
padding: 20px;
127176
}
128177

129-
.statement-body ol, ul {
178+
.statement-body ol,
179+
.statement-body ul {
130180
padding-left: 20px;
131181
margin-top: 10px;
132182
margin-bottom: 10px;
@@ -211,10 +261,13 @@ button {
211261
background: #f9f9f9;
212262
width: 100%;
213263
}
214-
.statement-body table, th, td {
264+
.statement-body table,
265+
.statement-body th,
266+
.statement-body td {
215267
border: 1px solid #dadada;
216268
}
217-
.statement-body th, td {
269+
.statement-body th,
270+
.statement-body td {
218271
padding: 5px;
219272
}
220273
.statement-body pre {

runner/src/main/resources/view/statement.html

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,30 @@
88
</head>
99

1010
<body onload="load()">
11-
<div class="edit">
12-
<div class="edit-title">HTML Source</div>
13-
<textarea id="statementInput" onkeyup="handleChangeStatementInput()" spellcheck="false"></textarea>
14-
<button id="save" onclick="save()" disabled>Saved</button>
15-
</div>
16-
17-
<div class="preview">
18-
<div class="preview-title">Preview</div>
19-
<div id="error"></div>
20-
<code id="result"></code>
21-
</div>
11+
<meta charset="UTF-8">
12+
<div class="wrapper">
2213

14+
<div id="tab-buttons" class="tab-buttons">
15+
<button class="active" onclick="changeLanguage(event, 'EN')">English</button>
16+
<button onclick="changeLanguage(event, 'FR')">Français</button>
17+
</div>
18+
19+
<div class="tab-content">
20+
<div class="edit">
21+
<div class="edit-title">HTML Source</div>
22+
<textarea id="statementInput" onkeyup="handleChangeStatementInput()" spellcheck="false"></textarea>
23+
<button id="save" onclick="save()" disabled>Saved</button>
24+
</div>
25+
26+
<div class="preview">
27+
<div class="preview-title">Preview</div>
28+
<div id="error"></div>
29+
<code id="result"></code>
30+
</div>
31+
</div>
32+
33+
</div>
34+
</meta>
2335
</body>
2436

2537
</html>

runner/src/main/resources/view/statement.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
var language = 'EN'
2+
13
function getStatementInput () {
24
return document.getElementById('statementInput').value
35
}
@@ -19,19 +21,22 @@ function refreshStatement () {
1921

2022
async function load () {
2123
const response = await fetch('/services/statement', {
22-
method: 'GET'
24+
method: 'POST',
25+
body: language
2326
})
2427
const statement = await response.text()
2528
document.getElementById('statementInput').value = statement
26-
2729
refreshStatement()
2830
}
2931

3032
async function save () {
3133
document.getElementById('save').disabled = true
3234
await fetch('/services/statement', {
3335
method: 'PUT',
34-
body: getStatementInput()
36+
body: JSON.stringify({
37+
language: language,
38+
statement: getStatementInput()
39+
})
3540
})
3641
document.getElementById('save').innerText = 'Saved'
3742
}
@@ -41,3 +46,12 @@ function handleChangeStatementInput () {
4146
document.getElementById('save').innerText = 'Save'
4247
refreshStatement()
4348
}
49+
50+
function changeLanguage (event, tabLanguage) {
51+
for (const child of document.getElementById('tab-buttons').childNodes) {
52+
child.className = ''
53+
}
54+
event.currentTarget.className += ' active'
55+
language = tabLanguage
56+
load()
57+
}

0 commit comments

Comments
 (0)