136 lines
5.1 KiB
JavaScript
136 lines
5.1 KiB
JavaScript
import { RecipeEditor } from "/static/js/modules/recipes/recipe-editor.js";
|
|
import { SyncPanel } from "/static/js/modules/recipes/sync-panel.js";
|
|
import { DispenserSelector } from "/static/js/modules/recipes/dispenser-selector.js";
|
|
import { initRecipeMobileSheetGestures } from "/static/js/modules/recipes/recipe-mobile-sheet-gestures.js";
|
|
|
|
let initialized = false;
|
|
|
|
export function initRecipesPage(handlers) {
|
|
if (initialized) return;
|
|
initialized = true;
|
|
|
|
const recipeEditorModule = new RecipeEditor({
|
|
addIngredient: handlers.addIngredient,
|
|
toggleUnloadingLink: handlers.toggleUnloadingLink,
|
|
addUnloadingGroup: handlers.addUnloadingGroup,
|
|
showRecipeEdit: handlers.showRecipeEdit,
|
|
printAllRecipesInPeriod: handlers.printAllRecipesInPeriod,
|
|
printRecipe: handlers.printRecipe,
|
|
saveRecipe: handlers.saveRecipe,
|
|
moveGroupUp: handlers.moveGroupUp,
|
|
moveGroupDown: handlers.moveGroupDown,
|
|
removeUnloadingGroup: handlers.removeUnloadingGroup,
|
|
moveIngredientUp: handlers.moveIngredientUp,
|
|
moveIngredientDown: handlers.moveIngredientDown,
|
|
removeIngredient: handlers.removeIngredient,
|
|
openIngredientMobileSheet: handlers.openIngredientMobileSheet,
|
|
closeIngredientMobileSheet: handlers.closeIngredientMobileSheet,
|
|
removeIngredientFromSheet: handlers.removeIngredientFromSheet,
|
|
openUnloadingGroupMobileSheet: handlers.openUnloadingGroupMobileSheet,
|
|
closeUnloadingGroupMobileSheet: handlers.closeUnloadingGroupMobileSheet,
|
|
handleGroupTypeChange: handlers.handleGroupTypeChange,
|
|
validateGroupValue: handlers.validateGroupValue,
|
|
handleIngredientChange: handlers.handleIngredientChange,
|
|
handleDryMatterPercentChange: handlers.handleDryMatterPercentChange,
|
|
recalculateWeights: handlers.recalculateWeights,
|
|
recalculateFromTotalWeight: handlers.recalculateFromTotalWeight,
|
|
});
|
|
|
|
const syncPanelModule = new SyncPanel({
|
|
openSettings: handlers.openSettings,
|
|
closeSettings: handlers.closeSettings,
|
|
toggleCredentialsForm: handlers.toggleCredentialsForm,
|
|
toggleSyncForm: handlers.toggleSyncForm,
|
|
changeCredentials: handlers.changeCredentials,
|
|
editSyncClientSettings: handlers.editSyncClientSettings,
|
|
deleteSyncClientSettings: handlers.deleteSyncClientSettings,
|
|
saveSyncClientDisplayName: handlers.saveSyncClientDisplayName,
|
|
loadSyncClientsSettings: handlers.loadSyncClientsSettings,
|
|
});
|
|
|
|
const dispenserSelectorModule = new DispenserSelector({
|
|
selectDispenser: handlers.selectDispenser,
|
|
selectRecipe: handlers.selectRecipe,
|
|
selectPeriod: handlers.selectPeriod,
|
|
copyRecipe: handlers.copyRecipe,
|
|
deleteRecipe: handlers.deleteRecipe,
|
|
unskipRecipeToday: handlers.unskipRecipeToday,
|
|
unskipIngredientPartsToday: handlers.unskipIngredientPartsToday,
|
|
unskipGroupPartsToday: handlers.unskipGroupPartsToday,
|
|
pasteRecipe: handlers.pasteRecipe,
|
|
createNewRecipe: handlers.createNewRecipe,
|
|
moveRecipeUp: handlers.moveRecipeUp,
|
|
moveRecipeDown: handlers.moveRecipeDown,
|
|
});
|
|
|
|
initRecipeMobileSheetGestures({
|
|
closeIngredientMobileSheet: handlers.closeIngredientMobileSheet,
|
|
closeUnloadingGroupMobileSheet: handlers.closeUnloadingGroupMobileSheet,
|
|
closeRecipeHelpModal: handlers.closeRecipeHelpModal,
|
|
});
|
|
|
|
const createRecipeBtn = document.getElementById("createRecipeBtn");
|
|
if (createRecipeBtn) {
|
|
createRecipeBtn.addEventListener("click", (event) => {
|
|
event.stopPropagation();
|
|
const selectedDispenser = handlers.getSelectedDispenser();
|
|
if (selectedDispenser) {
|
|
handlers.createNewRecipeForMill(selectedDispenser);
|
|
}
|
|
});
|
|
}
|
|
|
|
document.addEventListener("click", async (event) => {
|
|
const actionEl = event.target.closest("[data-action]");
|
|
if (!actionEl) return;
|
|
|
|
const action = actionEl.dataset.action;
|
|
if (await syncPanelModule.handleAction(action, event, actionEl)) return;
|
|
if (await dispenserSelectorModule.handleAction(action, event, actionEl)) return;
|
|
if (await recipeEditorModule.handleAction(action, event, actionEl)) return;
|
|
|
|
if (action === "open-recipe-help") {
|
|
event.preventDefault();
|
|
handlers.openRecipeHelp?.(actionEl.id);
|
|
return;
|
|
}
|
|
|
|
if (action === "close-recipe-help") {
|
|
event.preventDefault();
|
|
handlers.closeRecipeHelpModal?.();
|
|
return;
|
|
}
|
|
|
|
if (action === "mobile-dashboard-back") {
|
|
event.preventDefault();
|
|
handlers.mobileDashboardBack?.();
|
|
return;
|
|
}
|
|
|
|
if (action === "logout") {
|
|
event.preventDefault();
|
|
handlers.logout();
|
|
}
|
|
});
|
|
|
|
document.addEventListener("change", (event) => {
|
|
const actionEl = event.target.closest("[data-action]");
|
|
if (!actionEl) return;
|
|
const action = actionEl.dataset.action;
|
|
recipeEditorModule.handleChange(action, actionEl);
|
|
});
|
|
|
|
document.addEventListener("keydown", (event) => {
|
|
if (event.key !== "Escape") return;
|
|
const ingSheet = document.getElementById("ingredientMobileSheet");
|
|
if (ingSheet && !ingSheet.hidden) {
|
|
handlers.closeIngredientMobileSheet?.();
|
|
return;
|
|
}
|
|
const grpSheet = document.getElementById("unloadingGroupMobileSheet");
|
|
if (grpSheet && !grpSheet.hidden) {
|
|
handlers.closeUnloadingGroupMobileSheet?.();
|
|
}
|
|
});
|
|
}
|