Skip to content

Commit

Permalink
Improve UI by modularize solver as component #4
Browse files Browse the repository at this point in the history
  • Loading branch information
PERES-Richard committed Jun 4, 2023
1 parent 2ae64ef commit 26d04f3
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 68 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,5 @@ For a complete roadmap please refer to the [Project Tab](https://github.com/user
- [ ] Implement a distributed Message Queue system to connect generator and solvers (Kafka, Red Panda, SQS?)
- [ ] Create a second new MVP by implement an aggregator (if required) of chosen Queue/PubSub response/events to aggregate and display all results from all algorithms
- [ ] Create few more services using different algorithms, and languages, to compare solution and time to completion
- [ ] Create a cache (cold and hot) system for already solved sacs and enable re-utilisation of already solved problems
- TBD
79 changes: 11 additions & 68 deletions frontend/src/App.vue
Original file line number Diff line number Diff line change
@@ -1,34 +1,27 @@
<script setup lang="ts">
import VueJsonPretty from 'vue-json-pretty';
import 'vue-json-pretty/lib/styles.css';
import {ref} from "vue";
import VueJsonPretty from 'vue-json-pretty';
import NaiveSolver from "@/components/NaiveSolver.vue";
let bagSize: number = 100
let nbOfItems: number = 5
let generatedKnapSac = ref(undefined)
let displayGeneratedComp = ref(false)
let solution = ref(undefined)
let displaySolution = ref(false)
let loading = ref(false)
let generatorURL: string = "localhost/generator"
let naiveSolverURL: string = "localhost/naive-solver"
function getGeneratorURL() {
return "http://" + generatorURL + "/generate?bagSize=" + bagSize + "&numberOfItems=" + nbOfItems
}
function getNaiveSolverURL() {
return "http://" + naiveSolverURL + "/solve"
}
async function generate() {
const response = await fetch(getGeneratorURL(), {
method: 'POST',
mode: "cors",
keepalive: true,
headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
});
Expand All @@ -38,26 +31,6 @@ async function generate() {
generatedKnapSac.value = await response.json()
displayGeneratedComp.value = true
displaySolution.value = false
}
async function solve() {
loading.value = true
const response = await fetch(getNaiveSolverURL(), {
method: 'POST',
mode: "cors",
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(generatedKnapSac.value)
});
if (!response.ok) {
alert("error while solving")
}
solution.value = await response.json()
loading.value = false
displaySolution.value = true
}
</script>

Expand All @@ -68,13 +41,10 @@ async function solve() {
<p>Generator URL :</p>
<input v-model.number="generatorURL"/>
</div>
<br>
<div>
<p>Naive solver URL :</p>
<input v-model.number="naiveSolverURL"/>
</div>

<br><hr><br>
<br>
<hr>
<br>

<div>
<p>Bag Size :</p>
Expand All @@ -88,9 +58,6 @@ async function solve() {

<br><br>
<button @click="generate">Generate Knap Sac</button>

<br><br>
<button @click="solve">Solve Knap Sac</button>
</div>

<div class="sac" :class="{ 'display-none': !displayGeneratedComp }">
Expand All @@ -99,22 +66,8 @@ async function solve() {
<vue-json-pretty :data=generatedKnapSac />
</div>

<div class="solution" :class="{ 'display-none': !loading }">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin: auto; display: block; shape-rendering: auto;" width="200px" height="200px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
<circle cx="50" cy="50" r="32" stroke-width="8" stroke="#93dbe9" stroke-dasharray="50.26548245743669 50.26548245743669" fill="none" stroke-linecap="round">
<animateTransform attributeName="transform" type="rotate" dur="1s" repeatCount="indefinite" keyTimes="0;1" values="0 50 50;360 50 50"></animateTransform>
</circle>
<circle cx="50" cy="50" r="23" stroke-width="8" stroke="#689cc5" stroke-dasharray="36.12831551628262 36.12831551628262" stroke-dashoffset="36.12831551628262" fill="none" stroke-linecap="round">
<animateTransform attributeName="transform" type="rotate" dur="1s" repeatCount="indefinite" keyTimes="0;1" values="0 50 50;-360 50 50"></animateTransform>
</circle>
</svg>
</div>
<NaiveSolver :generatedKnapSac=generatedKnapSac solver-name="Naive" />

<div class="solution" :class="{ 'display-none': !displaySolution }">
<h2>Solution :</h2>
<br>
<vue-json-pretty :data=solution />
</div>
</div>

</template>
Expand All @@ -131,11 +84,14 @@ async function solve() {
.form {
display: inline-block;
/* Right blue bar */
margin-right: 50px;
padding-right: 50px;
border-right: 2px solid #2c3e50;
}
.sac {
display: inline-block;
max-height: 55em;
Expand All @@ -145,19 +101,6 @@ async function solve() {
vertical-align: top;
}
.solution {
display: inline-block;
max-height: 55em;
overflow-y: auto;
margin-right: 50px;
padding-right: 25px;
vertical-align: top;
}
.display-none {
display: none;
}
::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */
color: darkgrey;
opacity: 1; /* Firefox */
Expand Down
110 changes: 110 additions & 0 deletions frontend/src/components/NaiveSolver.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<script setup lang="ts">
import VueJsonPretty from 'vue-json-pretty';
import {ref} from "vue";
let solution = ref(undefined)
let loading = ref(false)
let displaySolution = ref(false)
const props = defineProps({
generatedKnapSac: Object,
solverName: String
})
let solverURL: string = "localhost/" + props.solverName?.toLocaleLowerCase() + "-solver/solve"
async function solve() {
loading.value = true
const response = await fetch("http://" + solverURL, {
method: 'POST',
mode: "cors",
keepalive: true,
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(props.generatedKnapSac)
});
if (!response.ok) {
alert("error while solving")
}
console.log(response)
solution.value = await response.json()
loading.value = false
displaySolution.value = true
}
</script>

<script lang="ts">
export default {
name: "Solver",
props: ['generatedKnapSac', 'solverName', 'solverURL']
}
</script>

<template>
<div class="solution">
<h2>{{ solverName }} Solver :</h2>
<br>

<p>{{ solverName }} solver URL :</p>
<input v-model.number="solverURL"/>
<br>
<br>

<button @click="solve">Solve Knap Sac</button>

<br>
<br>
<hr>
<br>


<div :class="{ 'display-none': !loading }">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
style="margin: auto; display: block; shape-rendering: auto;" width="200px" height="200px"
viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
<circle cx="50" cy="50" r="32" stroke-width="8" stroke="#93dbe9"
stroke-dasharray="50.26548245743669 50.26548245743669" fill="none" stroke-linecap="round">
<animateTransform attributeName="transform" type="rotate" dur="1s" repeatCount="indefinite" keyTimes="0;1"
values="0 50 50;360 50 50"></animateTransform>
</circle>
<circle cx="50" cy="50" r="23" stroke-width="8" stroke="#689cc5"
stroke-dasharray="36.12831551628262 36.12831551628262" stroke-dashoffset="36.12831551628262" fill="none"
stroke-linecap="round">
<animateTransform attributeName="transform" type="rotate" dur="1s" repeatCount="indefinite" keyTimes="0;1"
values="0 50 50;-360 50 50"></animateTransform>
</circle>
</svg>
</div>

<div :class="{ 'display-none': !displaySolution && loading }">
<br>
<vue-json-pretty :data=solution />
</div>

</div>
</template>

<style scoped>
.display-none {
display: none;
}
.solution {
display: inline-block;
max-height: 55em;
overflow-y: auto;
margin-right: 50px;
padding-right: 25px;
vertical-align: top;
/* Left blue bar */
border-left: 2px solid #2c3e50;
margin-left: 50px;
padding-left: 50px;
}
</style>

0 comments on commit 26d04f3

Please sign in to comment.