Skip to content
This repository was archived by the owner on Dec 19, 2023. It is now read-only.

Commit 90ad411

Browse files
committed
fix(#529): upgrade altair and add support for settings
1 parent 15f68ac commit 90ad411

File tree

8 files changed

+116
-17
lines changed

8 files changed

+116
-17
lines changed

example/src/main/resources/application.yml

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ graphql:
2727
cdn:
2828
enabled: false
2929
version: 4.0.2
30+
options:
31+
initial-settings:
32+
theme: dracula
33+
34+
3035
graphiql:
3136
enabled: true
3237
cdn:

graphql-spring-boot-autoconfigure/src/main/java/graphql/kickstart/autoconfigure/editor/altair/AltairAutoConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
/** @author Moncef AOUDIA */
1212
@Configuration
1313
@ConditionalOnWebApplication
14-
@EnableConfigurationProperties(AltairProperties.class)
14+
@EnableConfigurationProperties({AltairProperties.class, AltairOptions.class})
1515
@ConditionalOnClass(DispatcherServlet.class)
1616
public class AltairAutoConfiguration {
1717

graphql-spring-boot-autoconfigure/src/main/java/graphql/kickstart/autoconfigure/editor/altair/AltairController.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static java.util.Objects.nonNull;
55
import static org.apache.commons.lang3.StringUtils.isNumeric;
66

7+
import com.fasterxml.jackson.annotation.JsonInclude.Include;
78
import com.fasterxml.jackson.core.JsonProcessingException;
89
import com.fasterxml.jackson.databind.ObjectMapper;
910
import graphql.kickstart.autoconfigure.editor.PropertyGroupReader;
@@ -17,6 +18,7 @@
1718
import javax.annotation.PostConstruct;
1819
import javax.servlet.http.HttpServletRequest;
1920
import javax.servlet.http.HttpServletResponse;
21+
import lombok.SneakyThrows;
2022
import lombok.extern.slf4j.Slf4j;
2123
import lombok.val;
2224
import org.apache.commons.lang3.StringUtils;
@@ -39,6 +41,8 @@ public class AltairController {
3941
private static final String ALTAIR = "altair-static";
4042

4143
@Autowired private AltairProperties altairProperties;
44+
@Autowired private AltairOptions altairOptions;
45+
private final ObjectMapper objectMapper = new ObjectMapper();
4246

4347
@Autowired private Environment environment;
4448

@@ -48,6 +52,7 @@ public class AltairController {
4852

4953
@PostConstruct
5054
public void onceConstructed() throws IOException {
55+
objectMapper.setSerializationInclusion(Include.NON_NULL);
5156
loadTemplate();
5257
loadProps();
5358
loadHeaders();
@@ -61,7 +66,7 @@ private void loadTemplate() throws IOException {
6166
}
6267

6368
private void loadProps() throws IOException {
64-
props = new PropsLoader(environment, "graphql.altair.props.resources.", "graphql.altair.props.values.").load();
69+
props = new PropsLoader(environment, "graphql.altair.props.resources.", "graphql.altair.props.variables.").load();
6570
}
6671

6772
private void loadHeaders() throws JsonProcessingException {
@@ -87,6 +92,7 @@ public void altair(
8792
response.getOutputStream().write(populatedTemplate.getBytes(Charset.defaultCharset()));
8893
}
8994

95+
@SneakyThrows
9096
private Map<String, String> getReplacements(
9197
String graphqlEndpoint, String subscriptionsEndpoint) {
9298
Map<String, String> replacements = new HashMap<>();
@@ -108,6 +114,7 @@ private Map<String, String> getReplacements(
108114
replacements.put("altairPolyfillsJsUrl", getResourceUrl("polyfills-es2018.js", "polyfills" + suffix));
109115
replacements.put("altairRuntimeJsUrl", getResourceUrl("runtime-es2018.js", "runtime" + suffix));
110116
replacements.put("props", props);
117+
replacements.put("options", objectMapper.writeValueAsString(altairOptions));
111118
replacements.put("headers", headers);
112119
return replacements;
113120
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package graphql.kickstart.autoconfigure.editor.altair;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import java.util.Map;
5+
import lombok.Data;
6+
import org.springframework.boot.context.properties.ConfigurationProperties;
7+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
8+
9+
@Data
10+
@ConfigurationProperties("graphql.altair.options")
11+
public class AltairOptions {
12+
13+
@JsonProperty("endpointURL")
14+
private String endpointUrl = "/graphql";
15+
private String subscriptionsEndpoint = "/subscriptions";
16+
private String initialQuery;
17+
private String initialVariables;
18+
private String initialPreRequestScript;
19+
private String initialPostRequestScript;
20+
private Map<String,String> initialHeaders;
21+
@NestedConfigurationProperty InitialEnvironments initialEnvironments;
22+
private String instanceStorageNamespace;
23+
@NestedConfigurationProperty InitialSettings initialSettings;
24+
private String initialSubscriptionsProvider;
25+
private Map<String,String> initialSubscriptionsPayload;
26+
private Boolean preserveState = true;
27+
private String initialHttpMethod;
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package graphql.kickstart.autoconfigure.editor.altair;
2+
3+
import java.util.Map;
4+
import lombok.Data;
5+
6+
@Data
7+
public class InitialEnvironmentState {
8+
9+
private String id;
10+
private String title;
11+
private Map<String,String> variables;
12+
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package graphql.kickstart.autoconfigure.editor.altair;
2+
3+
import java.util.List;
4+
import lombok.Data;
5+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
6+
7+
@Data
8+
public class InitialEnvironments {
9+
10+
@NestedConfigurationProperty InitialEnvironmentState base;
11+
@NestedConfigurationProperty List<InitialEnvironmentState> subEnvironments;
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package graphql.kickstart.autoconfigure.editor.altair;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import java.util.List;
5+
import lombok.Data;
6+
7+
@Data
8+
public class InitialSettings {
9+
10+
private String theme;
11+
private String language;
12+
private Integer addQueryDepthLimit;
13+
private Integer tabSize;
14+
private Boolean enableExperimental;
15+
@JsonProperty("theme.fontsize")
16+
private Integer themeFontSize;
17+
@JsonProperty("theme.editorFontFamily")
18+
private String themeEditorFontFamily;
19+
@JsonProperty("theme.editorFontSize")
20+
private Integer themeEditorFontSize;
21+
private Boolean disablePushNotification;
22+
@JsonProperty("plugin.list")
23+
private List<String> pluginList;
24+
@JsonProperty("request.withCredentials")
25+
private Boolean requestWithCredentials;
26+
@JsonProperty("schema.reloadOnStart")
27+
private Boolean schemaReloadOnStart;
28+
@JsonProperty("alert.disableWarnings")
29+
private Boolean alertDisableWarnings;
30+
@JsonProperty("history.depth")
31+
private Integer historyDepth;
32+
33+
@JsonProperty("response.hideExtensions")
34+
private Boolean responseHideExtensions;
35+
}

graphql-spring-boot-autoconfigure/src/main/resources/templates/altair.html

+14-15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!doctype html>
2-
<html>
2+
<html lang="en">
33

44
<head>
55
<meta charset="utf-8">
@@ -12,16 +12,6 @@
1212
</head>
1313

1414
<body>
15-
<script>
16-
var properties = JSON.parse(`${props}`)
17-
18-
window.__ALTAIR_ENDPOINT_URL__ = `${graphqlEndpoint}`
19-
window.__ALTAIR_SUBSCRIPTIONS_ENDPOINT__ = `${subscriptionsEndpoint}`
20-
window.__ALTAIR_INITIAL_QUERY__ = `${properties.defaultQuery}`
21-
window.__ALTAIR_INITIAL_VARIABLES__ = `${properties.variables}`
22-
window.__ALTAIR_INITIAL_HEADERS__ = JSON.parse(`${headers}`)
23-
24-
</script>
2515
<app-root>
2616
<style>
2717
.loading-screen {
@@ -43,13 +33,22 @@
4333
</div>
4434
</app-root>
4535
<script>
36+
let properties = JSON.parse(`${props}`)
37+
let options = JSON.parse(`${options}`)
38+
let altairConfig = Object.assign({
39+
endpointURL: `${graphqlEndpoint}`,
40+
subscriptionsEndpoint: `${subscriptionsEndpoint}`,
41+
initialQuery: properties.defaultQuery || '',
42+
initialVariables: properties.variables || '',
43+
initialHeaders: JSON.parse(`${headers}`)
44+
}, options || {})
4645
document.addEventListener('DOMContentLoaded', () => {
47-
AltairGraphQL.init()
46+
AltairGraphQL.init(altairConfig)
4847
})
4948
</script>
50-
<script as="script" rel="preload" src="${altairRuntimeJsUrl}" type="text/javascript"></script>
51-
<script as="script" rel="preload" src="${altairPolyfillsJsUrl}" type="text/javascript"></script>
52-
<script as="script" rel="preload" src="${altairMainJsUrl}" type="text/javascript"></script>
49+
<script src="${altairRuntimeJsUrl}" type="text/javascript"></script>
50+
<script src="${altairPolyfillsJsUrl}" type="text/javascript"></script>
51+
<script src="${altairMainJsUrl}" type="text/javascript"></script>
5352
</body>
5453

5554
</html>

0 commit comments

Comments
 (0)