Document some javascript functionality

This commit is contained in:
Christopher C. Wells 2021-03-21 14:37:57 -07:00
parent 24669f0314
commit 30bce3dd9b
2 changed files with 29 additions and 1 deletions

View File

@ -62,9 +62,14 @@
searching: false, searching: false,
results: [], results: [],
search: { search: {
/**
* Executes a search from the input.
*
* @param {object} $event Input event triggering the search.
*/
['@input.debounce.400ms']($event) { ['@input.debounce.400ms']($event) {
if ($event.target.value !== '') { if ($event.target.value !== '') {
fetch('{{ route('ingredient-picker.search') }}?term=' + $event.target.value) fetch(`{{ route('ingredient-picker.search') }}?term=${$event.target.value}`)
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
this.results = data; this.results = data;
@ -75,22 +80,39 @@
this.searching = false; this.searching = false;
} }
}, },
/**
* Cancels a search on focus out.
*/
['@focusout.debounce.200ms']() { ['@focusout.debounce.200ms']() {
this.searching = false; this.searching = false;
} }
}, },
ingredient: { ingredient: {
/**
* Handles a "picked" ingredient.
*
* @param {object} $event Click event for the pick.
*/
['@click']($event) { ['@click']($event) {
let selected = $event.target; let selected = $event.target;
if (selected.dataset.id) { if (selected.dataset.id) {
const ingredient = this.results.find(result => result.id === Number(selected.dataset.id)); const ingredient = this.results.find(result => result.id === Number(selected.dataset.id));
// Dispatch an event indicating which ingredient
// the was picked.
this.$el.dispatchEvent(new CustomEvent('ingredient-picked', { this.$el.dispatchEvent(new CustomEvent('ingredient-picked', {
detail: { ingredient: ingredient }, detail: { ingredient: ingredient },
bubbles: true bubbles: true
})); }));
// Set the relevant field values for the picked
// ingredient.
this.$refs.ingredients.value = ingredient.id; this.$refs.ingredients.value = ingredient.id;
this.$refs.ingredients_type.value = ingredient.type; this.$refs.ingredients_type.value = ingredient.type;
this.$refs.ingredients_name.value = ingredient.name + (ingredient.detail ? `, ${ingredient.detail}` : ''); this.$refs.ingredients_name.value = ingredient.name + (ingredient.detail ? `, ${ingredient.detail}` : '');
// Clear search results.
this.searching = false; this.searching = false;
this.results = []; this.results = [];
} }

View File

@ -77,11 +77,17 @@
const entryItem = e.target.closest('.entry-item'); const entryItem = e.target.closest('.entry-item');
const ingredient = e.detail.ingredient; const ingredient = e.detail.ingredient;
let servingSize, servingUnit; let servingSize, servingUnit;
// Always set recipes to a default of 1 serving.
if (ingredient.type === 'App\\Models\\Recipe') { if (ingredient.type === 'App\\Models\\Recipe') {
servingSize = 1; servingSize = 1;
servingUnit = 'serving'; servingUnit = 'serving';
} else if (ingredient.type === 'App\\Models\\Food') { } else if (ingredient.type === 'App\\Models\\Food') {
servingUnit = ingredient.serving_unit ?? 'serving' servingUnit = ingredient.serving_unit ?? 'serving'
// Any food with a unit of "serving" (or no unit) defaults
// to 1 serving. This accounts for food with configurations
// like "2 scoops" using a custom serving unit.
if (servingUnit === 'serving') { if (servingUnit === 'serving') {
servingSize = 1; servingSize = 1;
} else { } else {