diff --git a/components/StatisticActions.tsx b/components/StatisticActions.tsx index b84ed2b..d32e517 100644 --- a/components/StatisticActions.tsx +++ b/components/StatisticActions.tsx @@ -14,7 +14,8 @@ interface StatisticActionsProps { cardId?: string; actionSource: 'SEARCH_MODAL' | 'CARD' | 'DETAIL_MODAL' | 'QUEUE'; notes?: string; - + disabled?: { list?: boolean; listWithNote?: boolean; markAsDone?: boolean }; + initData?: { comment?: string }; onAddToQueue?: () => void; onMarkedAsDone?: () => void; } @@ -24,7 +25,9 @@ export default function StatisticActions({ cocktailId, cardId, actionSource, + disabled, notes, + initData, onMarkedAsDone, onAddToQueue, cocktailName, @@ -45,7 +48,7 @@ export default function StatisticActions({ setSubmitting: setSubmittingQueue, }) } - disabled={submittingQueue} + disabled={submittingQueue || disabled?.list} > Liste @@ -56,10 +59,16 @@ export default function StatisticActions({ className={'btn btn-outline flex-1'} onClick={() => modalContext.openModal( - , + , ) } - disabled={submittingQueue} + disabled={submittingQueue || disabled?.listWithNote} > mit Notiz @@ -90,7 +99,7 @@ export default function StatisticActions({ }, }) } - disabled={submittingStatistic} + disabled={submittingStatistic || disabled?.markAsDone} > Gemacht diff --git a/components/modals/AddCocktailToQueueModal.tsx b/components/modals/AddCocktailToQueueModal.tsx index 44a17e3..8878812 100644 --- a/components/modals/AddCocktailToQueueModal.tsx +++ b/components/modals/AddCocktailToQueueModal.tsx @@ -8,13 +8,14 @@ interface AddCocktailToQueueModalProps { workspaceId: string; cocktailId: string; cocktailName: string; + initComment?: string; actionSource: 'SEARCH_MODAL' | 'CARD' | 'DETAIL_MODAL' | 'QUEUE'; } -export default function AddCocktailToQueueModal({ workspaceId, cocktailId, actionSource, cocktailName }: AddCocktailToQueueModalProps) { +export default function AddCocktailToQueueModal({ workspaceId, cocktailId, actionSource, cocktailName, initComment }: AddCocktailToQueueModalProps) { const [submittingQueue, setSubmittingQueue] = useState(false); - const [notes, setNotes] = useState(''); + const [notes, setNotes] = useState(initComment ?? ''); const [amount, setAmount] = useState(1); const modalContext = useContext(ModalContext); diff --git a/components/modals/CocktailDetailModal.tsx b/components/modals/CocktailDetailModal.tsx index 6a48aca..abb850d 100644 --- a/components/modals/CocktailDetailModal.tsx +++ b/components/modals/CocktailDetailModal.tsx @@ -19,6 +19,8 @@ import StarsComponent from '../StarsComponent'; import { fetchCocktailRatings } from '../../lib/network/cocktailRatings'; import { fetchCocktail } from '../../lib/network/cocktails'; import StatisticActions from '../StatisticActions'; +import { toInteger } from 'lodash'; +import { FaArrowRotateLeft } from 'react-icons/fa6'; interface CocktailDetailModalProps { cocktailId: string; @@ -57,6 +59,8 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) { fetchCocktailRatings(workspaceId, props.cocktailId, setCocktailRatings, setRatingsLoading, setRatingsError); }, [props.cocktailId, workspaceId]); + const [amountAdjustment, setAmountAdjustment] = useState(100); + return loading || loadedCocktail == undefined ? ( ) : ( @@ -80,6 +84,22 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) { minimumFractionDigits: 0, maximumFractionDigits: 2, }) + ' €'} + {amountAdjustment != 100 + ? ` ${(loadedCocktail.price * (amountAdjustment / 100) - loadedCocktail.price) + .toLocaleString(undefined, { + signDisplay: 'exceptZero', + minimumFractionDigits: 0, + maximumFractionDigits: 2, + }) + .replace('-', '- ') + .replace('+', '+ ')} € = ${( + loadedCocktail.price + + (loadedCocktail.price * (amountAdjustment / 100) - loadedCocktail.price) + ).toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + })} €` + : ''} ) : ( @@ -159,7 +179,19 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) {
0 ? 'grid-cols-5' : 'grid-cols-3'} gap-2`}>
-
Zubereitung
+
+
Zubereitung
+ {amountAdjustment != 100 && ( +
+ {'Menge '} + {amountAdjustment.toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 0, + })}{' '} + % +
+ )} +
{loadedCocktail.steps .sort((a, b) => a.stepNumber - b.stepNumber) .map((step) => ( @@ -175,7 +207,7 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) { className={`flex flex-row gap-2 pl-3 ${stepIngredient.optional ? 'italic' : ''}`} >
- {stepIngredient.amount?.toLocaleString(undefined, { + {((stepIngredient.amount ?? 0) * (amountAdjustment / 100))?.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 2, })} @@ -233,6 +265,44 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) {
a.stepNumber - b.stepNumber) + .map((step) => { + return `${step.ingredients + .sort((a, b) => a.ingredientNumber - b.ingredientNumber) + .map((stepIngredient) => { + return `- ${((stepIngredient.amount ?? 0) * (amountAdjustment / 100))?.toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + })} ${userContext.getTranslation(stepIngredient.unit?.name ?? '', 'de')} ${stepIngredient.ingredient?.shortName ?? stepIngredient.ingredient?.name}${stepIngredient.optional ? '(optional)' : ''}`; + }) + .join('\n')}`; + }) + .join('\n')}\nBasispreis ± angepasste Menge = Verkaufspreis (${amountAdjustment}%):\n${ + loadedCocktail.price?.toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + }) + ' €' + } ${((loadedCocktail.price ?? 0) * (amountAdjustment / 100) - (loadedCocktail.price ?? 0)) + .toLocaleString(undefined, { + signDisplay: 'exceptZero', + minimumFractionDigits: 0, + maximumFractionDigits: 2, + }) + .replace('-', '- ') + .replace('+', '+ ')} € = ${( + (loadedCocktail.price ?? 0) + + ((loadedCocktail.price ?? 0) * (amountAdjustment / 100) - (loadedCocktail!.price ?? 0)) + ).toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + })} €` + : undefined, + }} cocktailId={loadedCocktail.id} cocktailName={loadedCocktail.name} actionSource={'DETAIL_MODAL'} @@ -250,6 +320,34 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) { } />
+
+
+ Menge anpassen +
+
+
+
+ +
+ setAmountAdjustment(toInteger(e.target.value))} + /> + % +
+
+ +
+ {amountAdjustment != 100 &&
Die geänderte Menge fließt nicht in die Statistik mit ein
} +
+
+
{/*Right side*/}
@@ -442,6 +540,25 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) { minimumFractionDigits: 0, maximumFractionDigits: 2, }) + ' €'} + {amountAdjustment != 100 + ? ` ${( + calcCocktailTotalPrice(loadedCocktail, ingredients) * (amountAdjustment / 100) - + calcCocktailTotalPrice(loadedCocktail, ingredients) + ) + .toLocaleString(undefined, { + signDisplay: 'exceptZero', + minimumFractionDigits: 0, + maximumFractionDigits: 2, + }) + .replace('-', '- ') + .replace('+', '+ ')} € = ${( + calcCocktailTotalPrice(loadedCocktail, ingredients) + + (calcCocktailTotalPrice(loadedCocktail, ingredients) * (amountAdjustment / 100) - calcCocktailTotalPrice(loadedCocktail, ingredients)) + ).toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + })} € (${amountAdjustment}%)` + : ''}
)} diff --git a/pages/workspaces/[workspaceId]/index.tsx b/pages/workspaces/[workspaceId]/index.tsx index ff1060e..e33b07b 100644 --- a/pages/workspaces/[workspaceId]/index.tsx +++ b/pages/workspaces/[workspaceId]/index.tsx @@ -369,7 +369,7 @@ export default function OverviewPage() { (seit {new Date(cocktailQueueItem.oldestTimestamp).toFormatTimeString()} Uhr)
- {cocktailQueueItem.notes && Notiz: {cocktailQueueItem.notes}} + {cocktailQueueItem.notes && Notiz: {cocktailQueueItem.notes}}