PageSourceSearch

https://bizvanguard.ai/assets/MenuItemsAllergens-FhaaTxI9.js

js bizvanguard.ai collected 2026-10-05 13:47:57 UTC 9,991 bytes, 1 lines download raw bytes

1import{u as H,r as c,t as f,j as e}from"./vendor-react-zwv87yMD.js";import{u as U,a as J,b as k}from"./vendor-query-DYq8g7OI.js";import{B as $}from"./button-DlBDuKbo.js";import{B as L}from"./badge-QivbhJml.js";import{A as V,a as W,b as X,c as Y,d as Z,e as ee,f as se,g as re}from"./alert-dialog-P2RRIvov.js";import{m as v}from"./menu-items-B9YVhy5i.js";import{u as ne}from"./authStore-Bv6p2Ne2.js";import{u as te}from"./useOrgTimezone-C1UagyKl.js";import{e as ae}from"./timezoneFormatters-Lg56xFv0.js";import{B as S,d as le,n as N,i as b}from"./allergenReview-DscGWxK5.js";import{A as ie,v as E}from"./vendor-icons-bLSWzydc.js";import{L as de}from"./vendor-router-DimZLiZb.js";import"./vendor-charts-CtrTLS4K.js";import"./vendor-i18n-BdYkS11p.js";import"./vendor-ui-CfDMlrKu.js";import"./vendor-pdf-DQuePnfN.js";import"./vendor-state-ByI9XJey.js";import"./vendor-editor-C_dhmuey.js";import"./utils-BXSzAfFa.js";import"./api-client-wl3SCNAO.js";import"./i18n-CwjSIy0a.js";import"./employeeAuthStore-lYSKMuhw.js";const oe=["contains","free","unknown"];function I(r){r.invalidateQueries({queryKey:["menuItems"]}),r.invalidateQueries({queryKey:["menuItemSearch"]}),r.invalidateQueries({queryKey:["catering-menu-items"]})}function Le(){const{t:r}=H("menu"),i=U(),d=te(),{permissions:m,currentOrganizationId:u}=ne(),a=m.includes("MANAGE_MENU_ITEMS"),[p,j]=c.useState("allergen"),[o,w]=c.useState("gluten"),[B,z]=c.useState(null),[y,P]=c.useState(""),[q,A]=c.useState(!1),[R,D]=c.useState(null),{data:g=[],isLoading:Q}=J({queryKey:["menuItems",u,{includeInactive:!0}],queryFn:()=>v.getAll({includeInactive:!0}),enabled:!!u}),x=c.useMemo(()=>{const s=y.trim().toLowerCase();return g.filter(n=>s?n.englishName.toLowerCase().includes(s)||(n.chineseName||"").toLowerCase().includes(s)||(n.category||"").toLowerCase().includes(s):!0)},[g,y]),l=x.find(s=>s.id===B)||x[0]||null,_=g.length*S.length,K=g.reduce((s,n)=>s+le(N(n.allergenStatus)),0),O=g.filter(s=>b(s.allergensReviewedAt)).length,G=k({mutationFn:({id:s,allergen:n,state:t})=>v.patchAllergenCell(s,n,t),onSuccess:()=>I(i),onError:s=>{var n,t;f.error(((t=(n=s==null?void 0:s.response)==null?void 0:n.data)==null?void 0:t.message)||r("items.alert.unknownError"))},onSettled:()=>D(null)}),h=k({mutationFn:s=>v.reviewAllergens(s),onSuccess:()=>{I(i),f.success(r("allergens.reviewedToast"))},onError:s=>{var n,t;f.error(((t=(n=s==null?void 0:s.response)==null?void 0:n.data)==null?void 0:t.message)||r("items.alert.unknownError"))}}),C=k({mutationFn:()=>v.markAllergenFree(o,x.map(s=>s.id)),onSuccess:s=>{I(i),f.success(r("allergens.markedFree",{count:s.count})),A(!1)},onError:s=>{var n,t;f.error(((t=(n=s==null?void 0:s.response)==null?void 0:n.data)==null?void 0:t.message)||r("items.alert.unknownError"))}}),F=(s,n,t)=>{!a||N(s.allergenStatus)[n]===t||(D(`${s.id}:${n}`),G.mutate({id:s.id,allergen:n,state:t}))};return a?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3",children:[e.jsxs("div",{children:[e.jsxs(de,{to:"/dashboard/menu-items",className:"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground mb-2",children:[e.jsx(ie,{className:"h-4 w-4"}),r("items.title")]}),e.jsx("h2",{className:"text-2xl font-bold",children:r("allergens.title")}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1 max-w-3xl",children:r("allergens.helper")})]}),e.jsx("div",{className:"text-sm text-muted-foreground",children:r("allergens.progress",{decided:K,totalCells:_,reviewed:O,total:g.length})})]}),e.jsx("div",{className:"rounded-lg border border-amber-300 bg-amber-50 px-4 py-3 text-sm text-amber-950",children:r("allergens.banner")}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("input",{type:"search",value:y,onChange:s=>P(s.target.value),placeholder:r("items.searchPlaceholder"),className:"px-3 py-2 border rounded-md w-full max-w-xs"}),e.jsxs("div",{className:"inline-flex rounded-md border overflow-hidden",children:[e.jsx("button",{type:"button",onClick:()=>j("allergen"),className:`px-3 py-1.5 text-sm ${p==="allergen"?"bg-primary text-primary-foreground":"bg-background"}`,children:r("allergens.modeAllergen")}),e.jsx("button",{type:"button",onClick:()=>j("dish"),className:`px-3 py-1.5 text-sm border-l ${p==="dish"?"bg-primary text-primary-foreground":"bg-background"}
1`,children:r("allergens.modeDish")})]})]}),Q?e.jsxs("div",{className:"flex items-center gap-2 text-muted-foreground py-12 justify-center",children:[e.jsx(E,{className:"h-4 w-4 animate-spin"}),r("items.list.loading")]}):p==="allergen"?e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"flex gap-1.5 overflow-x-auto flex-nowrap",children:S.map(s=>e.jsx("button",{type:"button",onClick:()=>w(s),className:`px-3 py-1.5 rounded-full text-sm border whitespace-nowrap shrink-0 ${o===s?"bg-primary text-primary-foreground border-primary":"bg-background"}`,children:r(`allergens.keys.${s}`)},s))}),e.jsx("div",{className:"flex justify-end",children:e.jsx($,{variant:"outline",onClick:()=>A(!0),disabled:x.length===0,children:r("allergens.markRemainingFree",{allergen:r(`allergens.keys.${o}`)})})}),e.jsx("div",{className:"border rounded-lg bg-card overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"border-b",children:e.jsxs("tr",{className:"text-left",children:[e.jsx("th",{className:"px-3 py-2 font-medium",children:r("allergens.col.item")}),e.jsx("th",{className:"px-3 py-2 font-medium hidden sm:table-cell",children:r("allergens.col.category")}),e.jsx("th",{className:"px-3 py-2 font-medium",children:r("allergens.col.status")}),e.jsx("th",{className:"px-3 py-2 font-medium",children:r("allergens.col.review")})]})}),e.jsx("tbody",{children:x.map(s=>e.jsx(ce,{item:s,allergen:o,pending:R===`${s.id}:${o}`,reviewing:h.isPending&&h.variables===s.id,orgTimezone:d,t:r,onState:n=>F(s,o,n),onReview:()=>h.mutate(s.id)},s.id))})]})})]}):e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-[16rem_1fr] gap-4",children:[e.jsx("div",{className:"border rounded-lg bg-card max-h-[70vh] overflow-y-auto",children:x.map(s=>{const n=(l==null?void 0:l.id)===s.id,t=b(s.allergensReviewedAt);return e.jsxs("button",{type:"button",onClick:()=>z(s.id),className:`w-full text-left px-3 py-2 border-b text-sm ${n?"bg-accent":"hover:bg-accent/50"}`,children:[e.jsx("div",{className:"font-medium truncate",children:s.englishName}),e.jsxs("div",{className:"text-xs text-muted-foreground truncate",children:[s.category||r("bulk.uncategorized")," ·"," ",r(t?"allergens.reviewed":"allergens.needsReview")]})]},s.id)})}),l?e.jsxs("div",{className:"border rounded-lg bg-card p-4 space-y-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold",children:l.englishName}),l.chineseName&&e.jsx("p",{className:"text-sm text-muted-foreground",children:l.chineseName})]}),e.jsx(T,{item:l,orgTimezone:d,t:r})]}),e.jsx("div",{className:"space-y-2",children:S.map(s=>e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 border rounded-md px-3 py-2",children:[e.jsx("div",{className:"font-medium text-sm",children:r(`allergens.keys.${s}`)}),e.jsx(M,{value:N(l.allergenStatus)[s],pending:R===`${l.id}:${s}`,t:r,onChange:n=>F(l,s,n)})]},s))}),e.jsxs($,{onClick:()=>h.mutate(l.id),disabled:b(l.allergensReviewedAt)||h.isPending,children:[h.isPending&&e.jsx(E,{className:"h-4 w-4 mr-2 animate-spin"}),r("allergens.reviewDish")]})]}):e.jsx("p",{className:"text-muted-foreground",children:r("items.list.empty")})]}),e.jsx(V,{open:q,onOpenChange:A,children:e.jsxs(W,{children:[e.jsxs(X,{children:[e.jsx(Y,{children:r("allergens.markFreeTitle",{allergen:r(`allergens.keys.${o}`)})}),e.jsx(Z,{children:r("allergens.markFreeBody")})]}),e.jsxs(ee,{children:[e.jsx(se,{children:r("items.form.cancel")}),e.jsx(re,{onClick:s=>{s.preventDefault(),C.mutate()},disabled:C.isPending,children:C.isPending?r("allergens.marking"):r("allergens.markFreeConfirm")})]})]})})]}):e.jsx("div",{className:"p-6",children:e.jsx("p",{className:"text-muted-foreground",children:r("allergens.noPermission")})})}function ce({item:r,allergen:i,pending:d,reviewing:m,orgTimezone:u,t:a,onState:p,onReview:j}){const o=N(r.allergenStatus),w=b(r.allergensReviewedAt);return e.jsxs("tr",{className:"border-b",children:[e.jsxs("td",{className:"px-3 py-2",children:[e.jsx("div",{className:"font-medium",children:r.englishName}),r.chineseName&&e.jsx("div",{className:"text-xs text-muted-foreground",children:r.chineseName})]}),e.jsx("td",{className:"px-3 py-2 hidden sm:table-cell text-muted-foreground",children:r.category||a("bulk.uncategorized")}),e.jsx("td",{className:"px-3 py-2",children:e.jsx(M,{value:o[i],pending:d,t:
1a,onChange:p})}),e.jsx("td",{className:"px-3 py-2",children:e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(T,{item:r,orgTimezone:u,t:a}),e.jsxs($,{size:"sm",variant:"outline",onClick:j,disabled:w||m,children:[m&&e.jsx(E,{className:"h-3 w-3 mr-1 animate-spin"}),a("allergens.review")]})]})})]})}function M({value:r,pending:i,t:d,onChange:m}){const u={contains:"bg-red-600 text-white border-red-600",free:"bg-green-600 text-white border-green-600",unknown:"bg-slate-700 text-white border-slate-700"};return e.jsx("div",{className:"inline-flex rounded-md border overflow-hidden",children:oe.map(a=>e.jsx("button",{type:"button",disabled:i,"aria-pressed":r===a,onClick:()=>m(a),className:`px-2 py-1 text-xs ${r===a?u[a]:"bg-background hover:bg-accent"}`,children:d(`allergens.states.${a}`)},a))})}function T({item:r,orgTimezone:i,t:d}){return b(r.allergensReviewedAt)?e.jsx(L,{className:"bg-green-100 text-green-800 hover:bg-green-100",children:d("allergens.reviewedOn",{date:ae(r.allergensReviewedAt,i)})}):e.jsx(L,{variant:"secondary",className:"bg-amber-100 text-amber-900",children:d("allergens.needsReview")})}export{Le as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.