diff --git a/app/controllers/calculator_controller.rb b/app/controllers/calculator_controller.rb
index f2148af..a3a6ffd 100644
--- a/app/controllers/calculator_controller.rb
+++ b/app/controllers/calculator_controller.rb
@@ -16,20 +16,43 @@ class CalculatorController < ApplicationController
ingredient = Ingredient.find_by_ingredient_id(ingredient_id)
end
- data = {errors: [], output: ''}
+ data = {errors: Hash.new { |h, k| h[k] = [] }, output: ''}
- begin
- UnitConversion::with_custom_units(ingredient ? ingredient.custom_units : []) do
- unit = UnitConversion.parse(input)
+ UnitConversion::with_custom_units(ingredient ? ingredient.custom_units : []) do
+ density_unit = nil
+ begin
+ if density
+ density_unit = UnitConversion.parse(density)
+ unless density_unit.density?
+ data[:errors][:density] << 'not a density unit'
+ density_unit = nil
+ end
+ end
+ rescue UnitConversion::UnparseableUnitError => e
+ data[:errors][:density] << 'invalid string'
+ end
+
+ begin
+ input_unit = UnitConversion.parse(input)
+ rescue UnitConversion::UnparseableUnitError => e
+ data[:errors][:input] << 'invalid string'
+ end
+
+ if !input_unit.nil?
if output_unit.present?
- unit = unit.convert(output_unit, density)
- data[:output] = unit.to_s
+ begin
+ input_unit = input_unit.convert(output_unit, density_unit)
+ rescue UnitConversion::UnparseableUnitError => e
+ data[:errors][:output_unit] << e.message
+ end
else
- data[:output] = unit.auto_unit.to_s
+ input_unit = input_unit.auto_unit
end
end
- rescue UnitConversion::UnparseableUnitError => e
- data[:errors] << e.message
+
+ if data[:errors].empty?
+ data[:output] = input_unit.to_s
+ end
end
render json: data
diff --git a/app/javascript/components/App.vue b/app/javascript/components/App.vue
index f77e325..595f614 100644
--- a/app/javascript/components/App.vue
+++ b/app/javascript/components/App.vue
@@ -18,6 +18,7 @@
import { mapMutations, mapState } from "vuex";
import api from "../lib/Api";
+ import TWEEN from '@tweenjs/tween.js';
export default {
data() {
@@ -44,9 +45,15 @@
},
created() {
+ // Setup global animation loop
+ function animate () {
+ TWEEN.update();
+ requestAnimationFrame(animate);
+ }
+ animate();
+
if (this.user === null && this.authChecked === false) {
this.checkAuthentication();
-
}
},
diff --git a/app/javascript/components/AppExpandTransition.vue b/app/javascript/components/AppExpandTransition.vue
index 21d8cbd..d272200 100644
--- a/app/javascript/components/AppExpandTransition.vue
+++ b/app/javascript/components/AppExpandTransition.vue
@@ -1,55 +1,98 @@
+ @leave="leave"
+ @enter-cancel="cancel"
+ @leave-cancel="cancel">