Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Added cocktail amount adjustment in detail modal #519

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions components/StatisticActions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -24,7 +25,9 @@ export default function StatisticActions({
cocktailId,
cardId,
actionSource,
disabled,
notes,
initData,
onMarkedAsDone,
onAddToQueue,
cocktailName,
Expand All @@ -45,7 +48,7 @@ export default function StatisticActions({
setSubmitting: setSubmittingQueue,
})
}
disabled={submittingQueue}
disabled={submittingQueue || disabled?.list}
>
<MdPlaylistAdd />
Liste
Expand All @@ -56,10 +59,16 @@ export default function StatisticActions({
className={'btn btn-outline flex-1'}
onClick={() =>
modalContext.openModal(
<AddCocktailToQueueModal workspaceId={workspaceId} cocktailId={cocktailId} actionSource={actionSource} cocktailName={cocktailName} />,
<AddCocktailToQueueModal
workspaceId={workspaceId}
cocktailId={cocktailId}
actionSource={actionSource}
cocktailName={cocktailName}
initComment={initData?.comment}
/>,
)
}
disabled={submittingQueue}
disabled={submittingQueue || disabled?.listWithNote}
>
<MdPlaylistAdd />
mit Notiz
Expand Down Expand Up @@ -90,7 +99,7 @@ export default function StatisticActions({
},
})
}
disabled={submittingStatistic}
disabled={submittingStatistic || disabled?.markAsDone}
>
<FaCheck />
Gemacht
Expand Down
5 changes: 3 additions & 2 deletions components/modals/AddCocktailToQueueModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
121 changes: 119 additions & 2 deletions components/modals/CocktailDetailModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -57,6 +59,8 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) {
fetchCocktailRatings(workspaceId, props.cocktailId, setCocktailRatings, setRatingsLoading, setRatingsError);
}, [props.cocktailId, workspaceId]);

const [amountAdjustment, setAmountAdjustment] = useState<number>(100);

return loading || loadedCocktail == undefined ? (
<Loading />
) : (
Expand All @@ -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,
})} €`
: ''}
</span>
</>
) : (
Expand Down Expand Up @@ -159,7 +179,19 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) {

<div className={`grid ${loadedCocktail._count.CocktailRecipeImage > 0 ? 'grid-cols-5' : 'grid-cols-3'} gap-2`}>
<div className={'col-span-3 flex flex-col gap-2'}>
<div className={'font-bold'}>Zubereitung</div>
<div className={'flex flex-row items-baseline justify-between gap-2'}>
<div className={'font-bold'}>Zubereitung</div>
{amountAdjustment != 100 && (
<div className={'badge badge-secondary badge-outline'}>
{'Menge '}
{amountAdjustment.toLocaleString(undefined, {
minimumFractionDigits: 0,
maximumFractionDigits: 0,
})}{' '}
%
</div>
)}
</div>
{loadedCocktail.steps
.sort((a, b) => a.stepNumber - b.stepNumber)
.map((step) => (
Expand All @@ -175,7 +207,7 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) {
className={`flex flex-row gap-2 pl-3 ${stepIngredient.optional ? 'italic' : ''}`}
>
<div className={'font-bold'}>
{stepIngredient.amount?.toLocaleString(undefined, {
{((stepIngredient.amount ?? 0) * (amountAdjustment / 100))?.toLocaleString(undefined, {
minimumFractionDigits: 0,
maximumFractionDigits: 2,
})}
Expand Down Expand Up @@ -233,6 +265,44 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) {
<div className={'print:hidden'}>
<StatisticActions
workspaceId={router.query.workspaceId as string}
disabled={{ list: amountAdjustment != 100 }}
initData={{
comment:
amountAdjustment != 100 && loadedCocktail
? `Angepasste Menge (${amountAdjustment}%):\n${loadedCocktail.steps
.sort((a, b) => 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'}
Expand All @@ -250,6 +320,34 @@ export function CocktailDetailModal(props: CocktailDetailModalProps) {
}
/>
</div>
<div className={'divider-sm'}></div>
<details className="collapse collapse-arrow border">
<summary className="collapse-title font-bold">Menge anpassen</summary>
<div className="collapse-content">
<div className={'flex flex-col gap-2 pb-2 pl-4 pr-3'}>
<div className={'flex items-end gap-2'}>
<div className={'form-control w-full'}>
<label className={'label'}>Menge</label>
<div className={'join w-full'}>
<input
inputMode={'numeric'}
className={'input join-item input-bordered w-full'}
step={1}
min={1}
value={amountAdjustment}
onChange={(e) => setAmountAdjustment(toInteger(e.target.value))}
/>
<span className={'base-content join-item flex w-12 items-center justify-center bg-primary text-primary-content'}>%</span>
</div>
</div>
<button type={'button'} className={'btn btn-square btn-secondary'} onClick={() => setAmountAdjustment(100)}>
<FaArrowRotateLeft />
</button>
</div>
{amountAdjustment != 100 && <div className={'font-thin'}>Die geänderte Menge fließt nicht in die Statistik mit ein</div>}
</div>
</div>
</details>
</div>
{/*Right side*/}
<div className={'flex flex-col gap-2'}>
Expand Down Expand Up @@ -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}%)`
: ''}
</div>
</>
)}
Expand Down
2 changes: 1 addition & 1 deletion pages/workspaces/[workspaceId]/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ export default function OverviewPage() {
(seit {new Date(cocktailQueueItem.oldestTimestamp).toFormatTimeString()} Uhr)
</span>
</div>
{cocktailQueueItem.notes && <span className={'italic lg:pb-1'}>Notiz: {cocktailQueueItem.notes}</span>}
{cocktailQueueItem.notes && <span className={'long-text-format italic lg:pb-1'}>Notiz: {cocktailQueueItem.notes}</span>}
<div className={'flex w-full flex-row gap-2'}>
<div
className={'btn btn-square btn-outline btn-sm'}
Expand Down
Loading