Updated menus to work better with list item linking

Lots of changes made (almost a refactor <--- four letter word to me...
- Menu Items collection is now the "permanent" storage location for menu item for any day.  So, if i set Green Chile Chicken Enchiladas, Beans, and Rice as an item for a day, it will be stored as a Menu Item for later use.
- Linking menu items to items that can be added to a shopping list - This has been updated to be more reusable. So as you re-choose a menu item that's already got list items linked, it just shows up for you to use to build a shopping list as needed.
- Deleting menu items from a menu - changed to delete them only from the menu, and not from the database.
- Dashboard updated to pull today's menu item from the menu, and not the menu item list.
This commit is contained in:
Brian McGonagill 2024-08-14 11:38:13 -05:00
parent 3f6618d906
commit 88fa7c1d22
13 changed files with 216 additions and 149 deletions

View file

@ -41,9 +41,13 @@
<div class="card-content white-text">
<span class="card-title"><h4>{{todayDate}}</h4></span>
{{#each todayMenuItem}}
<div class="row">
<div class="col s12"><h4><i class="medium material-icons">local_dining</i> <span class="right">{{itemName}}</span></h4></div>
</div>
{{#each menuItems}}
{{#if $eq todayDate serveDate}}
<div class="row">
<div class="col s12"><h4><i class="medium material-icons">local_dining</i> <span class="right">{{menuItemName}}</span></h4></div>
</div>
{{/if}}
{{/each}}
{{else}}
<div class="row">
<div class="col s12"><h4><i class="medium material-icons">local_dining</i><span clas="right">No Menu Today</span></h4></div>
@ -71,4 +75,4 @@
</div>
{{/if}}
</div>
</template>
</template>

View file

@ -14,7 +14,7 @@ Template.dashboard.onCreated(function() {
this.subscribe("storeInfo");
this.subscribe("myProducts");
this.subscribe("myLocations");
this.subscribe("myMenus");
// this.subscribe("myMenus");
this.subscribe("todayMenuItems");
this.subscribe("myTasks");
});
@ -47,7 +47,9 @@ Template.dashboard.helpers({
return TaskItems.find({ isComplete: false, taskDate: today });
},
todayMenuItem: function() {
return MenuItems.find({});
let myMenus = Menus.find({}).fetch();
console.dir(myMenus);
return myMenus;
},
todayDate: function() {
let now = new Date();
@ -110,4 +112,4 @@ Template.dashboard.events({
break;
}
}
});
});

View file

@ -16,16 +16,18 @@
<h4>Products to Add</h4>
</li>
{{#each productToChoose}}
<li class="collection-item" id="{{prodId}}">
<div>
<p>
<label>
<input type="checkbox" class="productListing" id="{{prodId}}" />
<span class="my-text">{{prodName}}</span>
</label>
</p>
</div>
</li>
{{#each products}}
<li class="collection-item">
<div>
<p>
<label>
<input type="checkbox" class="productListing" id="{{prodId}}" />
<span class="my-text">{{prodName}}</span>
</label>
</p>
</div>
</li>
{{/each}}
{{/each}}
</ul>
</div>
@ -44,4 +46,4 @@
</div>
</div>
{{> snackbar}}
</template>
</template>

View file

@ -17,6 +17,9 @@ Template.menuItemsForm.onRendered(function() {
Session.set("menuItemErr", false);
Session.set("menuListItems", {});
var elemt = document.querySelectorAll('.tooltipped');
var instancet = M.Tooltip.init(elemt, {});
this.autorun(() => {
var elema = document.querySelectorAll('.autocomplete');
var instancea = M.Autocomplete.init(elema, {
@ -52,18 +55,50 @@ Template.menuItemsForm.events({
let dateSrv = $("#dateServed").val();
let menuId = Session.get("menuId");
if (menuItem == null || menuItem == "") {
Session.set("menuItemErr", true);
let menuItemExists = MenuItems.findOne({ itemName: menuItem });
if (typeof menuItemExists != 'undefined' && menuItemExists != null && menuItemExists != "") {
// use the existing item on the menu
let menuItemId = menuItemExists._id;
let isLinked = menuItemExists.isLinked;
if (menuItem == null || menuItem == "") {
Session.set("menuItemErr", true);
} else {
Meteor.call('addto.Menu', menuId, menuItem, menuItemId, dateSrv, isLinked, function(error, nresult) {
if (error) {
console.log(" ERROR adding menuitem to menu: " + error);
} else {
// console.log("Added item to menu - no problem.");
$("#menuItemInp").val("");
$("#dateServed").val("");
}
});
}
} else {
Meteor.call('add.menuItem', menuItem, dateSrv, menuId, function(err, result) {
if (err) {
console.log(" ERROR adding menu item: " + err);
} else {
console.log(" SUCCESS adding menu item.");
$("#menuItemInp").val("");
$("#dateServed").val("");
}
});
// add the item as new and add to the menu
if (menuItem == null || menuItem == "") {
Session.set("menuItemErr", true);
} else {
Meteor.call('add.menuItem', menuItem, function(err, result) {
if (err) {
console.log(" ERROR adding menu item: " + err);
} else {
// console.log(" SUCCESS adding menu item.");
$("#menuItemInp").val("");
$("#dateServed").val("");
// now add this item to the menu
Meteor.call('addto.Menu', menuId, menuItem, result, dateSrv, function(error, nresult) {
if (error) {
console.log(" ERROR adding menuitem to menu: " + error);
} else {
// console.log("Added item to menu - no problem.");
}
});
}
});
}
}
},
'click .shiftOneDay' (event) {
@ -77,7 +112,7 @@ Template.menuItemsForm.events({
// console.log(momentAddDay);
Meteor.call('shiftDate', menuItemId, momentAddDay, function(err,result) {
if (err) {
// console.log(" ERROR shifting meal days: " + err);
console.log(" ERROR shifting meal days: " + err);
} else {
// console.log(" SUCCESS shifting meal date.");
}
@ -99,4 +134,4 @@ getMenuItemList = function(menuItemInfo) {
let menuItemObjArray = [];
menuItemObjArray = menuItemInfo.map(info => ({ id: info._id, text: info.itemName }));
Session.set("menuListItems", menuItemObjArray);
}
}

View file

@ -11,27 +11,25 @@
</tr>
</thead>
{{#each thisMenuItems}}
<tr>
<td>
<span>
{{#if $eq itemMade true}}
<strike>{{itemName}}</strike>
{{else}}
{{itemName}}
{{/if}}
</span>
</td>
<td>
{{serveDate}}
</td>
<td>
{{#if $eq isLinked true}}<a class="waves-effect waves-light blue darken-3 white-text btn addProdsToList modal-trigger" href="#addProdToList">+ Shopping List</a>{{/if}}
</td>
<td>
<i class="material-icons tooltipped modal-trigger deleteMenuItem clickable" href="#modalDelete" data-position="top" data-tooltip-id="deleteMenuTip">delete</i>
<i class="material-icons tooltipped modal-trigger linkToProducts clickable" href="#modalLinkProducts" data-position="top" data-tooltip-id="linkMenuTip">link</i>
</td>
</tr>
{{#each menuItems}}
<tr>
<td>
<span>
{{menuItemName}}
</span>
</td>
<td>
{{serveDate}}
</td>
<td>
{{#if $eq isLinked true}}<a class="waves-effect waves-light blue darken-3 white-text btn addProdsToList modal-trigger" href="#addProdToList">+ Shopping List</a>{{/if}}
</td>
<td>
<i class="material-icons tooltipped modal-trigger deleteMenuItem clickable" href="#modalDelete" data-position="top" data-tooltip-id="deleteMenuTip">delete</i>
<i class="material-icons tooltipped modal-trigger linkToProducts clickable" href="#modalLinkProducts" data-position="top" data-tooltip-id="linkMenuTip">link</i>
</td>
</tr>
{{/each}}
{{/each}}
</table>
<div class="tooltip-content" style="display: none;" id="deleteMenuTip">Delete this menu item</div>
@ -41,4 +39,4 @@
{{> deleteConfirmationModal}}
{{> modalLinkProducts}}
{{> addProdToListModal}}
</template>
</template>

View file

@ -1,11 +1,13 @@
import { MenuItems } from '../../imports/api/menuItems.js';
import { M } from '../lib/assets/materialize.js';
import { UserLast } from '../../imports/api/userLast.js';
import { Menus } from '../../imports/api/menu.js';
Template.menuItemsTbl.onCreated(function() {
this.autorun( () => {
this.subscribe("myMenuItems", Session.get("menuId"));
});
this.subscribe("menuItems");
this.subscribe("userLastView");
});
@ -30,7 +32,7 @@ Template.menuItemsTbl.helpers({
} else {
menuId = UserLast.findOne({ view: "Menu" }).viewId;
}
let menuInfo = MenuItems.find({ menuId: menuId }, { sort: { serveDateActual: 1 }});
let menuInfo = Menus.find({ _id: menuId }, { sort: { serveDateActual: 1 }});
if (menuInfo) {
return menuInfo
}
@ -40,18 +42,22 @@ Template.menuItemsTbl.helpers({
Template.menuItemsTbl.events({
'click .deleteMenuItem' (event) {
event.preventDefault();
Session.set("deleteId", this._id);
Session.set("method", "delete.menuItem");
Session.set("item", this.itemName);
let theseIds = Session.get("menuId") + "_" + this.menuItemId;
console.log("These Ids: " + theseIds);
Session.set("deleteId", theseIds);
Session.set("method", "delete.itemFromMenu");
Session.set("item", this.menuItemName);
Session.set("view", "Menu Items");
},
'click .linkToProducts' (event) {
event.preventDefault();
Session.set("menuItemId", this._id);
Session.set("menuItemId", this.menuItemId);
Session.set("menuItemName", this.menuItemName);
console.log("menu item name = " + this.menuItemName);
},
'click .addProdsToList' (event) {
event.preventDefault();
// console.log("Menu Iteme Id sent is: " + this._id);
Session.set("menuItemId", this._id);
Session.set("menuItemId", this.menuItemId);
}
});
});

View file

@ -2,11 +2,8 @@
<h5>{{menuName}}</h5>
<form class="menuItemFrm row" style="gap: 1em;" id="menuItemFrm">
<div class="col s12 m6 l9 input-field outlined">
<input type="text" class="autocomplete" id="menuItemInp" autocomplete="off" />
<input type="text" class="autocomplete tooltipped" id="menuItemInp" autocomplete="off" data-position="top" data-tooltip="Start typing, and select previous menu items if desired." />
<label for="menuItemInp">Item</label>
<!-- <input type="text" class="menuItemInp" style="{{#if $eq menuItemErr true}}border: 2px solid red{{/if}}" id="menuItemInp" />
<label for="menuItemInp">Add Menu Item</label> -->
</div>
<div class="col s12 m6 l3 input-field outlined">
<input type="text" class="datepicker" id="dateServed" />
@ -23,4 +20,4 @@
</div>
</div>
</form>
</template>
</template>

View file

@ -6,7 +6,7 @@
<select name="" id="prodForMenu" class="prodForMenu" multiple>
<option value="" disabled>Choose...</option>
{{#each products}}
<option value="{{prodName}}">{{prodName}}</option>
<option value="{{_id}}|{{prodName}}">{{prodName}}</option>
{{/each}}
</select>
</div>
@ -26,4 +26,4 @@
</div>
</div>
{{> snackbar}}
</template>
</template>

View file

@ -36,22 +36,39 @@ Template.modalLinkProducts.events({
'click #saveLink' (event) {
event.preventDefault();
let menuItemId = Session.get("menuItemId");
let menuItemName = Session.get("menuItemName");
let linkSelect = document.getElementById('prodForMenu');
let linkObjArray = [];
let links = M.FormSelect.getInstance(linkSelect).getSelectedValues();
if (typeof links != undefined && links != [] && links != null) {
Meteor.call("add.menuProdLinks", menuItemId, links, function(err, result) {
// let's split these links into their parts, and make an array of objects
for (i=0; i<links.length; i++) {
let linkArray = links[i].split('|');
let key = linkArray[0];
let value = linkArray[1];
let linkObj = { prodId: key, prodName: value };
linkObjArray.push(linkObj);
}
Meteor.call("add.menuProdLinks", menuItemId, menuItemName, linkObjArray, function(err, result) {
if (err) {
console.log(" ERROR adding product links to this menu item: " + err);
} else {
Meteor.call('update.menuItemLinked', menuItemId, true, function(err, result) {
if (err) {
console.log(" ERROR adding link exists to menu item: " + err);
console.log(" ERROR adding link to menu item: " + err);
} else {
showSnackbar("Products added to Menu Item successfully!", "green");
Meteor.call('link.inMenu', menuItemId, true, function(error, nresult) {
if (error) {
console.log(" ERROR adding link to menu sub-item: " + error);
} else {
showSnackbar("Products added to Menu Item successfully!", "green");
}
});
}
});
}
});
}
}
});
});