m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMagdalena GrodziƄska <m.grodzinska@gmx.com>2019-11-19 20:08:21 +0100
committerGitHub <noreply@github.com>2019-11-19 20:08:21 +0100
commit562b0d451d9a58188a279844efe0efc548ac8f1f (patch)
tree79f3e66982a57100a3e5d7f279912a3d91f25dec /src
parenteef8436d8e58623b431810471f92f12b20c87434 (diff)
parent5f8ccad41f03b75acb9e3c1d5b46f86c344a721a (diff)
Merge pull request #21 from m-chrzan/basic_frontend
Basic frontend
Diffstat (limited to 'src')
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java54
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/client/Controller.java25
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/client/Query.java22
-rw-r--r--src/main/resources/application.properties6
-rw-r--r--src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/attribChart.html46
-rw-r--r--src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/contactsForm.html29
-rw-r--r--src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/error.html10
-rw-r--r--src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/fragments/navbar.html43
-rw-r--r--src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/home.html24
-rw-r--r--src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/queryForm.html35
10 files changed, 269 insertions, 25 deletions
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java b/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java
new file mode 100644
index 0000000..62f77ee
--- /dev/null
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java
@@ -0,0 +1,54 @@
+package pl.edu.mimuw.cloudatlas.client;
+
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.stereotype.Controller;
+
+/*
+should enable reading attribute values stored by the agent
+installing and
+uninstalling queries, and
+setting fallback contacts.
+
+Apart from providing forms for queries and fallback contacts,
+and presenting the information fetched from the agent in a textual form (with automatic refreshment),
+plotting the attributes with numeric values as real-time graphs.
+*/
+
+@Controller
+public class ClientController {
+
+ @GetMapping("/")
+ public String homePage(Model model) {
+ model.addAttribute("homeMessage", "Welcome to CloudaAtlas client interface");
+ return "home";
+ }
+
+ @GetMapping("/query")
+ public String queryPage(Model model) {
+ model.addAttribute("queryObject", new Query());
+ return "queryForm";
+ }
+
+ @PostMapping("/query")
+ public String submitQuery(@ModelAttribute Query queryObject, Model model) {
+ model.addAttribute("homeMessage", "Query submitted successfully");
+ return "home";
+ }
+
+ @GetMapping("/contacts")
+ public String contactPage(Model model) {
+ return "contactsForm";
+ }
+
+ @PostMapping("/contacts")
+ public String contactPage(@ModelAttribute String contactsObject, Model model) {
+ model.addAttribute("homeMessage", "Contact list submitted successfully");
+ return "home";
+ }
+
+ @GetMapping("/attribs")
+ public String attribPage(Model model) {
+ return "attribChart";
+ }
+}
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/client/Controller.java b/src/main/java/pl/edu/mimuw/cloudatlas/client/Controller.java
deleted file mode 100644
index 3b0ec63..0000000
--- a/src/main/java/pl/edu/mimuw/cloudatlas/client/Controller.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package pl.edu.mimuw.cloudatlas.client;
-
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/*
-should enable reading attribute values stored by the agent
-installing and
-uninstalling queries, and
-setting fallback contacts.
-
-Apart from providing forms for queries and fallback contacts,
-and presenting the information fetched from the agent in a textual form (with automatic refreshment),
-plotting the attributes with numeric values as real-time graphs.
-*/
-
-@RestController
-public class Controller {
-
- @GetMapping("/")
- public String homePage(Model model) {
- return "home";
- }
-}
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/client/Query.java b/src/main/java/pl/edu/mimuw/cloudatlas/client/Query.java
new file mode 100644
index 0000000..ff9b7f4
--- /dev/null
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/client/Query.java
@@ -0,0 +1,22 @@
+package pl.edu.mimuw.cloudatlas.client;
+
+class Query {
+ private String name;
+ private String value;
+
+ public String getName() {
+ return this.name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return this.value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..9cbc2e8
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1,6 @@
+spring.application.name=CloudAtlas Client
+
+spring.thymeleaf.cache=false
+spring.thymeleaf.enabled=true
+spring.thymeleaf.prefix=classpath:/pl/edu/mimuw/cloudatlas/client/templates/
+spring.thymeleaf.suffix=.html
diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/attribChart.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/attribChart.html
new file mode 100644
index 0000000..7e0b37f
--- /dev/null
+++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/attribChart.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+
+<head>
+ <meta charset="UTF-8">
+ <title>Attributes chart</title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
+ <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
+ <script type="text/javascript">
+ google.charts.load('current', {'packages':['corechart']});
+ google.charts.setOnLoadCallback(drawChart);
+
+ function drawChart() {
+ var data = google.visualization.arrayToDataTable([
+ ['Year', 'Sales', 'Expenses'],
+ ['2013', 1000, 400],
+ ['2014', 1170, 460],
+ ['2015', 660, 1120],
+ ['2016', 1030, 540]
+ ]);
+
+ var options = {
+ title: 'Company Performance',
+ hAxis: {title: 'Year', titleTextStyle: {color: '#333'}},
+ vAxis: {minValue: 0}
+ };
+
+ var chart = new google.visualization.AreaChart(document.getElementById('chart_div'));
+ chart.draw(data, options);
+ }
+ </script>
+</head>
+
+<body>
+
+<div th:replace="fragments/navbar :: navbar"></div>
+<div id="chart_div" style="width: 100%; height: 500px;"></div>
+
+<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
+<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
+
+</body>
+
+</html>
+
diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/contactsForm.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/contactsForm.html
new file mode 100644
index 0000000..027f831
--- /dev/null
+++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/contactsForm.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+
+<head>
+ <meta charset="UTF-8">
+ <title>Query form</title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
+</head>
+
+<body>
+
+<div th:replace="fragments/navbar :: navbar"></div>
+<div id="queryForm">
+ <form action="#" th:action="@{/contacts}" th:object="${contactsObject}" method="post">
+ <div class="form-group">
+ <label for="Textarea1">Enter contacts as a Json list</label>
+ <textarea class="form-control" id="Textarea1" rows="3"></textarea>
+ </div>
+ <button type="submit" class="btn btn-primary">Submit</button>
+ </form>
+</div>
+
+<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
+<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
+
+</body>
+
+</html>
diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/error.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/error.html
new file mode 100644
index 0000000..b449bda
--- /dev/null
+++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/error.html
@@ -0,0 +1,10 @@
+<html lang="en">
+<head><title>Error</title></head>
+<body>
+<h1>Error</h1>
+<b>[<span th:text="${status}">status</span>]
+ <span th:text="${error}">error</span>
+</b>
+<p th:text="${message}">message</p>
+</body>
+</html>
diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/fragments/navbar.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/fragments/navbar.html
new file mode 100644
index 0000000..c651f74
--- /dev/null
+++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/fragments/navbar.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+
+<head>
+ <title>CloudAtlas Client</title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
+</head>
+
+<body>
+
+<div th:fragment="navbar">
+ <nav class="navbar navbar-expand-lg navbar-light bg-light">
+ <a class="navbar-brand" href="/">CloudAtlas</a>
+ <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
+ <span class="navbar-toggler-icon"></span>
+ </button>
+ <div class="collapse navbar-collapse" id="navbarNav">
+ <ul class="navbar-nav">
+ <li class="nav-item active">
+ <a class="nav-link" href="/">Home</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/query">Queries</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/contacts">Contacts</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/attribs">Attribute values</a>
+ </li>
+ </ul>
+ </div>
+ </nav>
+</div>
+
+<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
+<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
+
+</body>
+
+</html>
diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/home.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/home.html
new file mode 100644
index 0000000..47b19af
--- /dev/null
+++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/home.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+
+<head>
+ <meta charset="UTF-8">
+ <title>CloudAtlas Client - home</title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
+</head>
+
+<body>
+
+<div th:replace="fragments/navbar :: navbar"></div>
+<div class="jumbotron">
+ <h1 class="display-4" th:text="${homeMessage}"></h1>
+</div>
+
+<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
+<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
+
+</body>
+
+</html>
diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/queryForm.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/queryForm.html
new file mode 100644
index 0000000..ac00645
--- /dev/null
+++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/queryForm.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+
+<head>
+ <meta charset="UTF-8">
+ <title>Query form</title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
+</head>
+
+<body>
+
+<div th:replace="fragments/navbar :: navbar"></div>
+<div id="queryForm">
+ <form action="#" th:action="@{/query}" th:object="${queryObject}" method="post">
+ <div class="form-group">
+ <label for="QueryName1">Enter query name</label>
+ <input type="text" class="form-control" id="QueryName1" rows="3" th:field="*{name}"/>
+ </div>
+ <div class="form-group">
+ <label for="Textarea1">Enter query</label>
+ <textarea class="form-control" id="Textarea1" rows="3" th:field="*{value}"></textarea>
+ </div>
+ <button type="submit" class="btn btn-primary">Submit</button>
+ </form>
+
+ <div id="response"><p th:text="${responseText}"/></div>
+</div>
+
+<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
+<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
+
+</body>
+
+</html>