parsley/app/javascript/components/RecipeShow.vue

224 lines
5.7 KiB
Vue
Raw Normal View History

2018-03-30 14:31:09 -05:00
<template>
2018-04-01 21:43:23 -05:00
<div>
<div v-if="recipe === null">
Loading...
</div>
<div v-else>
<div class="level is-mobile">
2018-04-15 15:19:50 -05:00
<div class="level-item has-text-centered">
<div>
<p class="heading">Time</p>
<p class="title is-6">{{timeDisplay}}</p>
</div>
2018-04-01 21:43:23 -05:00
</div>
2018-03-30 14:31:09 -05:00
2018-04-15 14:15:42 -05:00
<div class="level-item has-text-centered">
2018-04-15 15:19:50 -05:00
<div>
<p class="heading">Yields</p>
<p class="title is-6">{{recipe.yields}}</p>
</div>
2018-04-01 21:43:23 -05:00
</div>
2018-04-15 15:19:50 -05:00
<div class="level-item has-text-centered">
<div>
<p class="heading">Source</p>
<p class="title is-6">{{recipe.source}}</p>
</div>
2018-04-01 21:43:23 -05:00
</div>
</div>
<div class="columns">
<div class="column">
<div class="message">
2018-04-15 15:19:50 -05:00
<div class="message-header">
Ingredients
<button class="button is-small" type="button" @click="showConvertDialog = true">Convert</button>
</div>
2018-04-01 21:43:23 -05:00
<div class="message-body content">
<ul v-if="recipe.ingredients.length > 0">
<li v-for="i in recipe.ingredients">
{{i.display_name}}
</li>
</ul>
</div>
</div>
</div>
<div class="column">
<div class="message">
<div class="message-header">Directions</div>
<div class="message-body content" v-html="recipe.rendered_steps">
</div>
</div>
</div>
</div>
<div class="message">
<div class="message-header" @click="showNutrition = !showNutrition">Nutrition Data</div>
<div class="message-body" v-show="showNutrition">
<table class="table">
<tr>
<th>Item</th>
<th>Value</th>
</tr>
<tr v-for="nutrient in recipe.nutrition_data.nutrients" :key="nutrient.name">
<td>{{nutrient.label}}</td>
<td>{{nutrient.value}}</td>
</tr>
</table>
<h3 class="title is-5">Nutrition Calculation Warnings</h3>
<ul>
<li v-for="warn in recipe.nutrition_data.errors" :key="warn">
{{warn}}
</li>
</ul>
</div>
</div>
</div>
2018-04-15 15:19:50 -05:00
<app-modal :open="showConvertDialog" @dismiss="showConvertDialog = false" title="Convert Recipe">
<div class="field">
<label class="label">Scale</label>
<div class="control">
<div class="select">
<select v-model="scaleValue">
<option v-for="s in scaleOptions" :key="s" :value="s">{{s}}</option>
</select>
</div>
</div>
</div>
<div class="field">
<label class="label">System</label>
<div class="control">
<label class="radio">
<input type="radio" value="" v-model="systemConvertValue" />
No System Conversion
</label>
<label class="radio">
<input type="radio" value="standard" v-model="systemConvertValue" />
Convert to Standard Units
</label>
<label class="radio">
<input type="radio" value="metric" v-model="systemConvertValue" />
Convert to Metric Units
</label>
</div>
</div>
<div class="field">
<label class="label">Unit</label>
<div class="control">
<label class="radio">
<input type="radio" value="" v-model="unitConvertValue" />
No Unit Conversion
</label>
<label class="radio">
<input type="radio" value="volume" v-model="unitConvertValue" />
Convert to Volume Units
</label>
<label class="radio">
<input type="radio" value="mass" v-model="unitConvertValue" />
Convert to Mass Units
</label>
</div>
</div>
2018-04-16 11:28:58 -05:00
<div class="buttons">
<button type="button is-primary" class="button" @click="convert">Convert</button>
2018-04-15 15:19:50 -05:00
<button type="button" class="button">Close</button>
2018-04-16 11:28:58 -05:00
</div>
2018-04-15 15:19:50 -05:00
</app-modal>
2018-04-01 21:43:23 -05:00
</div>
2018-03-30 14:31:09 -05:00
</template>
<script>
export default {
2018-04-01 21:43:23 -05:00
props: {
recipe: {
required: true,
type: Object
}
},
2018-03-30 14:31:09 -05:00
2018-04-01 21:43:23 -05:00
data() {
return {
2018-04-15 15:19:50 -05:00
showNutrition: false,
showConvertDialog: false,
scaleValue: '1',
systemConvertValue: "",
unitConvertValue: "",
scaleOptions: [
'1/4',
'1/3',
'1/2',
'2/3',
'3/4',
'1',
'1 1/2',
'2',
'3',
'4'
]
2018-04-01 21:43:23 -05:00
};
2018-04-15 15:19:50 -05:00
},
computed: {
timeDisplay() {
let a = this.formatMinutes(this.recipe.active_time);
const t = this.formatMinutes(this.recipe.total_time);
if (a) {
a = ` (${a} active)`;
}
return t + a;
}
},
methods: {
2018-04-16 11:28:58 -05:00
convert() {
this.$router.push({name: 'recipe', query: { scale: this.scaleValue, system: this.systemConvertValue, unit: this.unitConvertValue }});
},
2018-04-15 15:19:50 -05:00
formatMinutes(min) {
if (min) {
const partUnits = [
{unit: "d", minutes: 60 * 24},
{unit: "h", minutes: 60},
{unit: "m", minutes: 1}
];
const parts = [];
let remaining = min;
for (let unit of partUnits) {
let val = Math.floor(remaining / unit.minutes);
remaining = remaining % unit.minutes;
if (val > 0) {
parts.push(`${val} ${unit.unit}`);
}
}
return parts.join(" ");
} else {
return "";
}
}
2018-04-01 21:43:23 -05:00
}
2018-03-30 14:31:09 -05:00
}
</script>
<style lang="scss" scoped>
</style>