PageSourceSearch

https://dealassist.replit.app/assets/feedback-CbHOdT_e.js

js dealassist.replit.app collected 2026-10-03 03:50:38 UTC 16,360 bytes, 1 lines download raw bytes

vendor: 4,319 bytes, line 1
1import{r as l,am as re,ax as R,j as e,ay as ie,ao as U,az as oe,W as le,u as ce,ae as de,i as B,k as V,q as P,h as W,C as b,d as v,e as E,a as g,I as ue,B as me,b as K}from"./index-ymGASxfw.js";import{B as N}from"./badge-3CC9CLqT.js";import{T as pe}from"./textarea-CrXdz7g7.js";import{S as H,a as Q,b as Y,c as G,d as k}from"./select-Uo3n-gk9.js";import{S as z}from"./skeleton-q6F7ptfe.js";import{T as fe,a as xe,b as $,c as L}from"./tabs-CCrfrtMr.js";import{M as Z}from"./map-UCY5LScx.js";import{L as A}from"./lightbulb-CIjK-Wko.js";import{B as J}from"./bug-DYq4Jy8Y.js";import{C as he,a as be}from"./chevron-up-Xz_mYCrv.js";import"./index-DEMw4C8u.js";import"./check-BQ84uMGu.js";import"./index-pfSpv1nM.js";function ge(t,s,{checkForDefaultPrevented:a=!0}={}){return function(n){if(t?.(n),a===!1||!n.defaultPrevented)return s?.(n)}}var je=re[" useInsertionEffect ".trim().toString()]||R;function Ne({prop:t,defaultProp:s,onChange:a=()=>{},caller:i}){const[n,r,o]=ve({defaultProp:s,onChange:a}),c=t!==void 0,u=c?t:n;{const m=l.useRef(t!==void 0);l.useEffect(()=>{const p=m.current;p!==c&&console.warn(`${i} is changing from ${p?"controlled":"uncontrolled"} to ${c?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),m.current=c},[c,i])}const d=l.useCallback(m=>{if(c){const p=ye(m)?m(t):m;p!==t&&o.current?.(p)}else r(m)},[c,t,r,o]);return[u,d]}function ve({defaultProp:t,onChange:s}){const[a,i]=l.useState(t),n=l.useRef(a),r=l.useRef(s);return je(()=>{r.current=s},[s]),l.useEffect(()=>{n.current!==a&&(r.current?.(a),n.current=a)},[a,n]),[a,i,r]}function ye(t){return typeof t=="function"}function Ce(t){const s=we(t),a=l.forwardRef((i,n)=>{const{children:r,...o}=i,c=l.Children.toArray(r),u=c.find(Re);if(u){const d=u.props.children,m=c.map(p=>p===u?l.Children.count(d)>1?l.Children.only(null):l.isValidElement(d)?d.props.children:null:p);return e.jsx(s,{...o,ref:n,children:l.isValidElement(d)?l.cloneElement(d,void 0,m):null})}return e.jsx(s,{...o,ref:n,children:r})});return a.displayName=`${t}.Slot`,a}function we(t){const s=l.forwardRef((a,i)=>{const{children:n,...r}=a;if(l.isValidElement(n)){const o=Ie(n),c=Pe(r,n.props);return n.type!==l.Fragment&&(c.ref=i?ie(i,o):o),l.cloneElement(n,c)}return l.Children.count(n)>1?l.Children.only(null):null});return s.displayName=`${t}.SlotClone`,s}var Se=Symbol("radix.slottable");function Re(t){return l.isValidElement(t)&&typeof t.type=="function"&&"__radixId"in t.type&&t.type.__radixId===Se}function Pe(t,s){const a={...s};for(const i in s){const n=t[i],r=s[i];/^on[A-Z]/.test(i)?n&&r?a[i]=(...c)=>{const u=r(...c);return n(...c),u}:n&&(a[i]=n):i==="style"?a[i]={...n,...r}:i==="className"&&(a[i]=[n,r].filter(Boolean).join(" "))}return{...t,...a}}function Ie(t){let s=Object.getOwnPropertyDescriptor(t.props,"ref")?.get,a=s&&"isReactWarning"in s&&s.isReactWarning;return a?t.ref:(s=Object.getOwnPropertyDescriptor(t,"ref")?.get,a=s&&"isReactWarning"in s&&s.isReactWarning,a?t.props.ref:t.props.ref||t.ref)}var Ee=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],O=Ee.reduce((t,s)=>{const a=Ce(`Primitive.${s}`),i=l.forwardRef((n,r)=>{const{asChild:o,...c}=n,u=o?a:s;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),e.jsx(u,{...c,ref:r})});return i.displayName=`Primitive.${s}`,{...t,[s]:i}},{});function ke(t,s){return l.useReducer((a,i)=>s[a][i]??a,t)}var X=t=>{const{present:s,children:a}=t,i=Te(s),n=typeof a=="function"?a({present:i.isPresent}):l.Children.only(a),r=U(i.ref,Ae(n));return typeof a=="function"||i.isPresent?l.cloneElement(n,{ref:r}):null};X.displayName="Presence";function Te(t){const[s,a]=l.useState(),i=l.useRef(null),n=l.useRef(t),r=l.useRef("none"),o=t?"mounted":"unmounted",[c,u]=ke(o,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return l.useEffect(()=>{const d=S(i.current);r.current=c==="mounted"?d:"none"},[c]),R(()=>{const d=i.current,m=n.current;if(m!==t){const h=r.current,f=S(d);t?u("MOUNT"):f==="none"||d?.display==="none"?u("UNMOUNT"):u(m&&h!==f?"ANIMATION_OUT":"UNMOUNT"),n.current=t}},[t,u]),R(()=>
1{if(s){let d;const m=s.ownerDocument.defaultView??window,p=f=>{const j=S(i.current).includes(CSS.escape(f.animationName));if(f.target===s&&j&&(u("ANIMATION_END"),!n.current)){const C=s.style.animationFillMode;s.style.animationFillMode="forwards",d=m.setTimeout(()=>{s.style.animationFillMode==="forwards"&&(s.style.animationFillMode=C)})}},h=f=>{f.target===s&&(r.current=S(i.current))};return s.addEventListener("animationstart",h),s.addEventListener("animationcancel",p),s.addEventListener("animationend",p),()=>{m.clearTimeout(d),s.removeEventListener("animationstart",h),s.removeEventListener("animationcancel",p),s.removeEventListener("animationend",p)}}else u("ANIMATION_END")},[s,u]),{isPresent:["mounted","unmountSuspended"].includes(c),ref:l.useCallback(d=>{i.current=d?getComputedStyle(d):null,a(d)},[])}}function S(t){return t?.animationName||"none"}function Ae(t){let s=Object.getOwnPropertyDescriptor(t.props,"ref")?.get,a=s&&"isReactWarning"in s&&s.isReactWarning;return a?t.ref:(s=Object.getOwnPropertyDescriptor(t,"ref")?.get,a=s&&"isReactWarning"in s&&s.isReactWarning,a?t.props.ref:t.props.ref||t.ref)}var I="Collapsible",[Oe]=le(I),[Me,M]=Oe(I),ee=l.forwardRef((t,s)=>{const{__scopeCollapsible:a,open:i,defaultOpen:n,disabled:r,onOpenChange:o,...c}=t,[u,d]=Ne({prop:i,defaultProp:n??!1,onChange:o,caller:I});return e.jsx(Me,{scope:a,disabled:r,contentId:oe(),open:u,onOpenToggle:l.useCallback(()=>d(m=>!m),[d]),children:e.jsx(O.div,{"data-state":_(u),"data-disabled":r?"":void 0,...c,ref:s})})});ee.displayName=I;var te="CollapsibleTrigger",se=l.forwardRef((t,s)=>{const{__scopeCollapsible:a,...i}=t,n=M(te,a);return e.jsx(O.button,{type:"button","aria-controls":n.contentId,"aria-expanded":n.open||!1,"data-state":_(n.open),"data-disabled":n.disabled?"":void 0,disabled:n.disabled,...i,ref:s,onClick:ge(t.onClick,n.onOpenToggle)})});se.displayName=te;var D="CollapsibleContent",ne=l.forwardRef((t,s)=>{const{forceMount:a,...i}=t,n=M(D,t.__scopeCollapsible);return e.jsx(X,{present:a||n.open,children:({present:r})=>e.jsx(De,{...i,ref:s,present:r})})});ne.displayName=D;var De=l.forwardRef((t,s)=>{const{__scopeCollapsible:a,present:i,children:n,...r}=t,o=M(D,a),[c,u]=l.useState(i),d=l.useRef(null),m=U(s,d),p=l.useRef(0),h=p.current,f=l.useRef(0),y=f.current,j=o.open||c,C=l.useRef(j),w=l.useRef(void 0);return l.useEffect(()=>{const x=requestAnimationFrame(()=>C.current=!1);return()=>cancelAnimationFrame(x)},[]),R(()=>{const x=d.current;if(x){w.current=w.current||{transitionDuration:x.style.transitionDuration,animationName:x.style.animationName},x.style.transitionDuration="0s",x.style.animationName="none";const F=x.getBoundingClientRect();p.current=F.height,f.current=F.width,C.current||(x.style.transitionDuration=w.current.transitionDuration,x.style.animationName=w.current.animationName),u(i)}},[o.open,i]),e.jsx(O.div,{"data-state":_(o.open),"data-disabled":o.disabled?"":void 0,id:o.contentId,hidden:!j,...r,ref:m,style:{"--radix-collapsible-content-height":h?`${h}px`:void 0,"--radix-collapsible-content-width":y?`${y}px`:void 0,...t.style},children:j&&n})});function _(t){return t?"open":"closed"}var _e=ee;const Fe=_e,$e=se,Le=ne,T={New:"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200","In Review":"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200",Planned:"bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200","In Progress":"bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200",Implemented:"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200",Resolved:"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200"},qe=["New","In Review","Planned","In Progress","Implemented","Resolved"];function ae(t){return new Date(t).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}function nt(){const{user:t}=ce(),s=t?.role==="admin";return e.jsxs("div",{className:"p-6 space-y-6 max-w-5xl mx-auto",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold tracking-tight","data-testid":"text-feedback-title",children:"Feedback"}),e.jsx("p",{className:"text-muted-foreground text-sm mt-1",children:"Submit feature requests or report bugs, and view the development roadmap."})]}),e.jsxs(fe,{defaultValue:"submissions",className:"w-full",children:[e.jsxs(xe,{"data-testid":"tabs-feedback",children:[e.jsxs($,{value:"submissions","data-testid":"tab-submissions",children:[e.jsx(de,{className:"h-4 w-4 mr-1.5"}),"My Submissions"]}),e.jsxs($,{value:"roadmap","data-testid":"tab-roadmap",children:[e.jsx(Z,{className:"h-4 w-4 mr-1.5"}),"Roadmap"]})]}),e.jsxs(L,{value:"submissions",className:"mt-4 space-y-6",children:[e.jsx(Ue,{}),e.jsx(Be,{isAdmin:s})]}),e.jsx(L,{value:"roadmap",className:"mt-4",children:e.jsx(Ve,{})})]})]})}function Ue(){const{toast:t}=B(),[s,a]=l.useState(""),[i,n]=l.useState(""),[r,o]=l.useState(""),c=V({mutationFn:async d=>(await W("POST","/api/feedback",d)).json(),onSuccess:()=>{t({title:"Submitted",description:"Your feedback has been submitted successfully."}),a(""),n(""),o(""),P.invalidateQueries({queryKey:["/api/feedback"]}),P.invalidateQueries({queryKey:["/api/feedback/roadmap"]})},onError:d=>{t({title:"Error",description:d.message,variant:"destructive"})}}),u=d=>{if(d.preventDefault(),!s||!i.trim()||!r.trim()){t({title:"Missing fields",description:"Please fill in all fields.",variant:"destructive"});return}c.mutate({type:s,subject:i.trim(),description:r.trim()})};return e.jsxs(b,{children:[e.jsx(v,{children:e.jsx(E,{className:"text-base",children:"Submit Feedback"})}),e.jsx(g,{children:e.jsxs("form",{onSubmit:u,className:"space-y-4",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-sm font-medium",children:"Type"}),e.jsxs(H,{value:s,onValueChange:a,children:[e.jsx(Q,{"data-testid":"select-feedback-type",children:e.jsx(Y,{placeholder:"Select type..."})}),e.jsxs(G,{children:[e.jsx(k,{value:"feature_request","data-testid":"option-feature-request",children:e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx(A,{className:"h-3.5 w-3.5"})," Feature Request"]})}),e.jsx(k,{value:"bug_report","data-testid":"option-bug-report",children:e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx(J,{className:"h-3.5 w-3.5"})," Bug Report"]})})]})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-sm font-medium",children:"Subject"}),e.jsx(ue,{value:i,onChange:d=>n(d.target.value),placeholder:"Brief summary...","data-testid":"input-feedback-subject"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-sm font-medium",children:"Description"}),e.jsx(pe,{value:r,onChange:d=>o(d.target.value),placeholder:"Describe in detail...",rows:4,"data-testid":"input-feedback-description"})]}),e.jsx(me,{type:"submit",disabled:c.isPending,"data-testid":"button-submit-feedback",children:c.isPending?"Submitting...":"Submit"})]})})]})}function Be({isAdmin:t}){const{toast:s}=B(),{data:a,isLoading:i}=K({queryKey:["/api/feedback"]}),n=V({mutationFn:async({id:r,status:o})=>(await W("PATCH",`/api/feedback/${r}/status`,{status:o})).json(),onSuccess:()=>{P.invalidateQueries({queryKey:["/api/feedback"]}),P.invalidateQueries({queryKey:["/api/feedback/roadmap"]}),s({title:"Updated",description:"Status updated successfully."})},onError:r=>{s({title:"Error",description:r.message,variant:"destructive"})}});return i?e.jsxs(b,{children:[e.jsx(v,{children:e.jsx(E,{className:"text-base",children:t?"All Submissions":"Your Submissions"})}),e.jsx(g,{className:"space-y-3",children:[1,2,3].map(r=>e.jsx(z,{className:"h-16 w-full"},r))})]}):e.jsxs(b,{children:[e.jsx(v,{children:e.jsx(E,{className:"text-base","data-testid":"text-submissions-title",children:t?"All Submissions":"Your Submissions"})}),e.jsx(g,{children:!a||a.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-8","data-testid":"text-no-submissions",children:"No submissions yet."}):e.jsx("div",{className:"space-y-3",children:a.map(r=>e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-2 py-3 px-3 border rounded-lg","data-testid":`row-feedback-${r.id}`,children:[e.jsxs("div",{className:"flex-1 min-w-0 space-y-1",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[r.type==="feature_request"?e.jsxs(N,{variant:"outline",className:"gap-1 text-xs",children:[e.jsx(A,{className:"h-3 w-3"}),"Feature"]}):e.jsxs(N,{variant:"outline",className:"gap-1 text-xs",children:[e.jsx(J,{className:"h-3 w-3"}),"Bug"]}),e.jsx("span",{className:"text-sm font-medium","data-testid":`text-feedback-subject-${r.id}`,children:r.subject})]}),e.jsx("p",{className:"text-xs text-muted-foreground line-clamp-2",children:r.description}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[t&&e.jsxs("span",{children:["By ",r.userName]}),e.jsx("span",{children:ae(r.createdAt)})]})]}),e.jsx("div",{className:"flex items-center gap-2 shrink-0",children:t?e.jsxs(H,{value:r.status,onValueChange:o=>n.mutate({id:r.id,status:o}),children:[e.jsx(Q,{className:"w-[140px] h-8 text-xs","data-testid":`select-status-${r.id}`,children:e.jsx(Y,{})}),e.jsx(G,{children:qe.map(o=>e.jsx(k,{value:o,children:o},o))})]}):e.jsx(N,{className:T[r.status]||"","data-testid":`badge-status-${r.id}`,children:r.status})})]},r.id))})})]})}function Ve(){const{data:t,isLoading:s}=K({queryKey:["/api/feedback/roadmap"]}),[a,i]=l.useState(!1);if(s)return e.jsx("div",{className:"space-y-4",children:[1,2,3].map(o=>e.jsx(z,{className:"h-24 w-full"},o))});const n={"In Review":(t||[]).filter(o=>o.status==="In Review"),Planned:(t||[]).filter(o=>o.status==="Planned"),"In Progress":(t||[]).filter(o=>o.status==="In Progress"),Implemented:(t||[]).filter(o=>o.status==="Implemented")};return Object.values(n).some(o=>o.length>0)?e.jsxs("div",{className:"space-y-6",children:[["In Review","Planned","In Progress"].map(o=>{const c=n[o];return c.length===0?null:e.jsxs(b,{children:[e.jsx(v,{className:"pb-3",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(N,{className:T[o],children:o}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:["(",c.length,")"]})]})}),e.jsx(g,{children:e.jsx("div",{className:"space-y-3",children:c.map(u=>e.jsx(q,{item:u},u.id))})})]},o)}),n.Implemented.length>0&&e.jsx(Fe,{open:a,onOpenChange:i,children:e.jsxs(b,{children:[e.jsx($e,{asChild:!0,children:e.jsx(v,{className:"cursor-pointer hover:bg-muted/50 transition-colors pb-3",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(N,{className:T.Implemented,children:"Implemented"}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:["(",n.Implemented.length,")"]})]}),a?e.jsx(he,{className:"h-4 w-4 text-muted-foreground"}):e.jsx(be,{className:"h-4 w-4 text-muted-foreground"})]})})}),e.jsx(Le,{children:e.jsx(g,{children:e.jsx("div",{className:"space-y-3",children:n.Implemented.map(o=>e.jsx(q,{item:o},o.id))})})})]})})]}):e.jsx(b,{children:e.jsxs(g,{className:"py-12 text-center",children:[e.jsx(Z,{className:"h-10 w-10 text-muted-foreground mx-auto mb-3"}),e.jsx("p",{className:"text-sm text-muted-foreground","data-testid":"text-roadmap-empty",children:"No roadmap items yet. Feature requests will appear here once reviewed."})]})})}function q({item:t}){return e.jsx("div",{className:"py-2 border-b last:border-0","data-testid":`roadmap-item-${t.id}`,children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(A,{className:"h-4 w-4 text-muted-foreground mt-0.5 shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-sm font-medium","data-testid":`text-roadmap-subject-${t.id}`,children:t.subject}),e.jsx("p",{className:"text-xs text-muted-foreground mt-0.5 line-clamp-2",children:t.description}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:ae(t.createdAt)})]})]})})}export{nt 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.