diff --git a/public/i18n/de.json b/public/i18n/de.json
index 9a6c668..9f25ecd 100644
--- a/public/i18n/de.json
+++ b/public/i18n/de.json
@@ -8,8 +8,8 @@
"depth-cm": "Tiefe (cm)",
"height-cm": "Höhe (cm)",
"full-floors": "Vollebenen",
- "number-of-rats": "Anzahl an Ratten",
"result": "Ergebnis",
+ "number-of-rats": "Anzahl an Ratten",
"change-language": "Sprache ändern",
"failed-base-area": "Die Mindestgrundfläche des Käfigs muss {{ MINIMUM_BASE_AREA }}m² (also z.B. 100x50cm) betragen.",
"failed-overall-area": "Die Gesamtfläche im Käfig ist zu klein.",
@@ -18,6 +18,12 @@
"failed-num-rats": "Es müssen mindestens 3 Ratten zusammenleben, Paarhaltung ist nicht artgerecht.",
"failed-minimum-length-long-side": "Die lange Seite des Käfig muss mindestens {{ minimum_length_long_side }}cm lang sein um Rennen zu ermöglichen.",
"failed-minimum-length-short-side": "Die kurze Seite des Käfig muss mindestens {{ minimum_length_short_side }}cm lang sein.",
+ "base-area": "Die Mindestgrundfläche des Käfigs muss {{ MINIMUM_BASE_AREA }}m² betragen.",
+ "fall-height": "Die mögliche Fallhöhe darf nicht mehr als {{ maximum_fall_height }}cm betragen.",
+ "floor-height": "Der Mindestabstand zwischen Ebenen muss {{ minimum_floor_height }}cm betragen.",
+ "minimum-length-long-side": "Die lange Seite des Käfig muss mindestens {{ minimum_length_long_side }}cm lang sein um Rennen zu ermöglichen.",
+ "minimum-length-short-side": "Die kurze Seite des Käfig muss mindestens {{ minimum_length_short_side }}cm lang sein.",
"cage-complies-with-all-criteria": "Der Käfig erfüllt alle Kriterien!",
- "cage-for-x-rats": "Käfig für {{ num_rats }} Ratten"
+ "cage-for-x-rats": "Käfig für {{ num_rats }} Ratten",
+ "overall-area": "Die Gesamtfläche für {{ numRats }} Ratten muss mindestens {{ minimumOverallArea }}m² betragen."
}
diff --git a/public/i18n/en.json b/public/i18n/en.json
index f493eec..1532f39 100644
--- a/public/i18n/en.json
+++ b/public/i18n/en.json
@@ -8,8 +8,8 @@
"depth-cm": "Depth (cm)",
"height-cm": "Height (cm)",
"full-floors": "Full floors",
- "number-of-rats": "Number of Rats",
"result": "Result",
+ "number-of-rats": "Number of Rats",
"change-language": "Change language",
"failed-base-area": "The base area of the cage must not be below {{ MINIMUM_BASE_AREA }}m².",
"failed-overall-area": "The overall area in the cage is to small.",
@@ -18,6 +18,12 @@
"failed-num-rats": "Rats must live in a group of at least three rats, pairs or lone rats are not species-appropriate.",
"failed-minimum-length-long-side": "The long side of the cage must be at least {{ minimum_length_long_side }}cm long to enable running.",
"failed-minimum-length-short-side": "The short side of the cage must be at least {{ minimum_length_short_side }}cm.",
+ "base-area": "The base area of the cage must not be below {{ MINIMUM_BASE_AREA }}m².",
+ "fall-height": "The possible fall height between floors must not be above {{ maximum_fall_height }}cm.",
+ "floor-height": "The height between floors must be above {{ minimum_floor_height }}cm.",
+ "minimum-length-long-side": "The long side of the cage must be at least {{ minimum_length_long_side }}cm long to enable running.",
+ "minimum-length-short-side": "The short side of the cage must be at least {{ minimum_length_short_side }}cm.",
"cage-complies-with-all-criteria": "This cage complies with all criteria!",
- "cage-for-x-rats": "Cage for {{ num_rats }} rats"
+ "cage-for-x-rats": "Cage for {{ num_rats }} rats",
+ "overall-area": "The overall area in the cage must be above {{ minimumOverallArea }}m² for {{ numRats }} rats."
}
diff --git a/public/index.html b/public/index.html
index 0099d52..7e638d4 100644
--- a/public/index.html
+++ b/public/index.html
@@ -119,7 +119,29 @@
-
Here is a list of cages you can get.
+
diff --git a/src/index.js b/src/index.js
index 1f5448c..c3dea5f 100644
--- a/src/index.js
+++ b/src/index.js
@@ -71,7 +71,6 @@ function bindLocaleSwitcher(initialValue) {
//////////
-
function initTabs(tabs, tabContent, activationClass) {
tabs.forEach((tab) => {
tab.addEventListener('click', (e) => {
@@ -122,13 +121,21 @@ const MINIMUM_LENGTH_LONG_SIDE = 0.8;
const MINIMUM_LENGTH_SHORT_SIDE = 0.5;
const MINIMUM_FLOOR_HEIGHT = 0.25;
-const FAILED_BASE_AREA = "base_area";
-const FAILED_OVERALL_AREA = "overall_area";
-const FAILED_FALL_HEIGHT = "fall_height";
-const FAILED_NUM_RATS = "num_rats";
-const FAILED_MINIMUM_LENGTH_LONG_SIDE = "length_long_side";
-const FAILED_MINIMUM_LENGTH_SHORT_SIDE = "length_short_side";
-const FAILED_FLOOR_HEIGHT = "floor_height"
+const FAILED_BASE_AREA = "failed_base_area";
+const FAILED_OVERALL_AREA = "failed_overall_area";
+const FAILED_FALL_HEIGHT = "failed_fall_height";
+const FAILED_NUM_RATS = "failed_num_rats";
+const FAILED_MINIMUM_LENGTH_LONG_SIDE = "failed_length_long_side";
+const FAILED_MINIMUM_LENGTH_SHORT_SIDE = "failed_length_short_side";
+const FAILED_FLOOR_HEIGHT = "failed_floor_height"
+
+
+const CRITERIA_BASE_AREA = "base_area";
+const CRITERIA_FALL_HEIGHT = "fall_height";
+const CRITERIA_MINIMUM_LENGTH_LONG_SIDE = "length_long_side";
+const CRITERIA_MINIMUM_LENGTH_SHORT_SIDE = "length_short_side";
+const CRITERIA_FLOOR_HEIGHT = "floor_height"
+const CRITERIA_OVERALL_AREA = "overall_area"
class Validator {
@@ -142,6 +149,13 @@ class Validator {
[FAILED_MINIMUM_LENGTH_LONG_SIDE]: i18next.t("failed-minimum-length-long-side", {"minimum_length_long_side": (MINIMUM_LENGTH_LONG_SIDE * 100).toFixed(0)}),
[FAILED_MINIMUM_LENGTH_SHORT_SIDE]: i18next.t("failed-minimum-length-short-side", {"minimum_length_short_side": (MINIMUM_LENGTH_SHORT_SIDE * 100).toFixed(0)}),
};
+ this.STATIC_CRITERIA = {
+ [CRITERIA_BASE_AREA]: i18next.t('base-area', {"MINIMUM_BASE_AREA": MINIMUM_BASE_AREA}),
+ [CRITERIA_FALL_HEIGHT]: i18next.t("fall-height", {"maximum_fall_height": (MAXIMUM_FALL_HEIGHT * 100).toFixed(0)}),
+ [CRITERIA_FLOOR_HEIGHT]: i18next.t("floor-height", {"minimum_floor_height": (MINIMUM_FLOOR_HEIGHT * 100).toFixed(0)}),
+ [CRITERIA_MINIMUM_LENGTH_LONG_SIDE]: i18next.t("minimum-length-long-side", {"minimum_length_long_side": (MINIMUM_LENGTH_LONG_SIDE * 100).toFixed(0)}),
+ [CRITERIA_MINIMUM_LENGTH_SHORT_SIDE]: i18next.t("minimum-length-short-side", {"minimum_length_short_side": (MINIMUM_LENGTH_SHORT_SIDE * 100).toFixed(0)}),
+ }
}
overallAreaNeeded(numOfRats) {
@@ -155,8 +169,8 @@ class Validator {
/*
Calculates the number of rats that are allowed for a certain overall area.
*/
- let result = 3.0 + (overallArea-MINIMUM_AREA_THREE_RATS) / AREA_PER_ADDITIONAL_RAT;
- console.log(`Area left: ${overallArea-MINIMUM_AREA_THREE_RATS}`);
+ let result = 3.0 + (overallArea - MINIMUM_AREA_THREE_RATS) / AREA_PER_ADDITIONAL_RAT;
+ console.log(`Area left: ${overallArea - MINIMUM_AREA_THREE_RATS}`);
console.log(`Result: ${result}`);
if (result < 3) {
throw new Error("Cages must be for three rats or more");
@@ -243,6 +257,10 @@ class Dimensions {
// DOCUMENT INTERACTION //
//////////////////////////
+///////
+// 1 //
+///////
+
const numRatsCalculatorInputWidth = document.getElementById("num-rats-width");
numRatsCalculatorInputWidth.onchange = updateNumRatsCalculator;
const numRatsCalculatorInputDepth = document.getElementById("num-rats-depth");
@@ -255,6 +273,23 @@ numRatsNumFullFloors.oninput = function () {
updateNumRatsCalculator();
}
+///////
+// 2 //
+///////
+
+
+let cageCalcLabelNumRats = document.getElementById("cageCalcLabelNumRats");
+
+let cageCalcRatSlider = document.getElementById("cageCalcNumRats");
+
+cageCalcRatSlider.oninput = function () {
+ updateCageCalc();
+}
+
+
+///////
+// 3 //
+///////
const inputWidth = document.getElementById("width");
inputWidth.onchange = updateCageCheck;
@@ -295,6 +330,18 @@ function getResultFromChecks(checks) {
}
+
+function formatCriteria(criteria) {
+ const ul = document.createElement('ul');
+ for (const key in criteria) {
+ const li = document.createElement('li');
+ li.textContent = `☑️ ` + criteria[key];
+ ul.appendChild(li);
+ }
+ return ul;
+
+}
+
function updateCageCheck() {
labelNumRats.innerHTML = i18next.t("cage-for-x-rats", {"num_rats": ratSlider.value});
@@ -312,6 +359,23 @@ function updateCageCheck() {
resultsDiv.appendChild(result);
}
+function updateCageCalc() {
+ let numRats = cageCalcRatSlider.value
+ cageCalcLabelNumRats.innerHTML = i18next.t("cage-for-x-rats", {"num_rats": numRats});
+ const validator = new Validator();
+ let criteria = validator.STATIC_CRITERIA;
+ let minimumOverallArea = validator.overallAreaNeeded(cageCalcRatSlider.value);
+ criteria[CRITERIA_OVERALL_AREA] = i18next.t('overall-area', {"numRats": numRats, "minimumOverallArea": minimumOverallArea});
+
+ let resultsDiv = document.getElementById("cageCalcResultsDiv");
+
+ const result = formatCriteria(criteria);
+
+ resultsDiv.innerHTML = "";
+ resultsDiv.appendChild(result);
+
+}
+
function updateNumRatsCalculator() {
const width = numRatsCalculatorInputWidth.value
diff --git a/src/main.scss b/src/main.scss
index 6be5d0a..125c624 100644
--- a/src/main.scss
+++ b/src/main.scss
@@ -28,6 +28,10 @@ body {
width: 100%;
}
+.inline-icon {
+ height: 1.5rem;
+}
+
// Import the Google Font
@import url("https://fonts.googleapis.com/css?family=Nunito:400,700");