L2
Lead
2
Apply
University Applications CRM
Starting Lead2Apply...
Loading scripts...
'; navigator.clipboard.writeText(code).then(()=>{setCopied(formId);setTimeout(()=>setCopied(null),2000);}); } const blank = {id:'',name:'New Lead Form',title:'Interested in Studying Abroad?',subtitle:'Fill in your details and we will get back to you.',fields:['name','email','phone','nationality','course'],submitLabel:'Submit Enquiry',successMsg:'Thank you! We will contact you shortly.',branch:currentUser.branch||''}; return ( React.createElement('div', { style: {maxWidth:760}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2649}} , React.createElement('div', { style: {display:'flex',justifyContent:'space-between',alignItems:'center',marginBottom:16}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2650}} , React.createElement('div', {__self: this, __source: {fileName: _jsxFileName, lineNumber: 2651}} , React.createElement('div', { style: {fontSize:16,fontWeight:700,color:T.text}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2652}}, "Lead Capture Forms" ) , React.createElement('div', { style: {fontSize:12,color:T.soft,marginTop:2}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2653}}, "Embeddable forms that create leads directly in the CRM" ) ) , React.createElement(Btn, { size: "sm", onClick: ()=>setEditing({...blank}), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2655}}, "+ New Form" ) ) , forms.map(form => ( React.createElement(Card, { key: form.id, style: {marginBottom:12,padding:'16px 20px'}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2659}} , React.createElement('div', { style: {display:'flex',justifyContent:'space-between',alignItems:'flex-start'}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2660}} , React.createElement('div', {__self: this, __source: {fileName: _jsxFileName, lineNumber: 2661}} , React.createElement('div', { style: {fontWeight:700,fontSize:14,color:T.text}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2662}}, form.name) , React.createElement('div', { style: {fontSize:12,color:T.soft,marginTop:2}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2663}}, _optionalChain([form, 'access', _31 => _31.fields, 'optionalAccess', _32 => _32.length])||0, " fields \u00B7 " , form.submissions||0, " submissions \u00B7 Created " , form.created||'\u2014') ) , React.createElement('div', { style: {display:'flex',gap:6}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2665}} , React.createElement(Btn, { size: "sm", variant: "secondary", onClick: ()=>setPreview(form), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2666}}, "Preview") , React.createElement(Btn, { size: "sm", variant: "secondary", onClick: ()=>copyEmbed(form.id), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2667}}, copied===form.id?'Copied!':'Copy Embed') , React.createElement(Btn, { size: "sm", variant: "secondary", onClick: ()=>setEditing({...form}), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2668}}, "Edit") , React.createElement(Btn, { size: "sm", variant: "danger", onClick: ()=>{DB.deleteCaptureform(form.id);setForms(DB.getCaptureforms());}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2669}}, "Delete") ) ) , React.createElement('div', { style: {marginTop:10,padding:'8px 12px',background:T.bg,borderRadius:6,fontSize:11,fontFamily:'monospace',color:T.soft}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2672}}, "Embed: " ) ) )) , forms.length===0&&React.createElement(EmptyState, { icon: "\uD83D\uDCDD", title: "No capture forms" , desc: "Create forms to embed on your website and capture leads automatically" , __self: this, __source: {fileName: _jsxFileName, lineNumber: 2677}}) /* Edit form */ , editing && ( React.createElement(Modal, { onClose: ()=>setEditing(null), maxWidth: 560, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2681}} , React.createElement(ModalHead, { title: editing.id?'Edit Form':'New Capture Form', onClose: ()=>setEditing(null), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2682}}) , React.createElement('div', { style: {padding:24,display:'flex',flexDirection:'column',gap:14,maxHeight:'75vh',overflowY:'auto'}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2683}} , React.createElement(Inp, { label: "Form Name (internal)" , value: editing.name, onChange: e=>setEditing(p=>({...p,name:e.target.value})), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2684}}) , React.createElement(Inp, { label: "Form Title" , value: editing.title||'', onChange: e=>setEditing(p=>({...p,title:e.target.value})), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2685}}) , React.createElement(Inp, { label: "Subtitle / Description" , value: editing.subtitle||'', onChange: e=>setEditing(p=>({...p,subtitle:e.target.value})), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2686}}) , React.createElement(Sel, { label: "Assign to Branch" , value: editing.branch||'', onChange: e=>setEditing(p=>({...p,branch:e.target.value})), options: [{value:'',label:'Any branch'},...DB.getBranches().map(b=>b.name)], __self: this, __source: {fileName: _jsxFileName, lineNumber: 2687}}) , React.createElement('div', {__self: this, __source: {fileName: _jsxFileName, lineNumber: 2688}} , React.createElement('div', { style: {fontSize:12,fontWeight:700,color:T.mid,marginBottom:8}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2689}}, "Fields to show" ) , React.createElement('div', { style: {display:'flex',flexDirection:'column',gap:4}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2690}} , LEAD_FIELDS.map(f=>( React.createElement('label', { key: f.name, style: {display:'flex',gap:8,alignItems:'center',padding:'6px 8px',borderRadius:6,cursor:'pointer',background:(editing.fields||[]).includes(f.name)?T.accent+'18':T.bg}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2692}} , React.createElement('input', { type: "checkbox", checked: (editing.fields||[]).includes(f.name), style: {accentColor:T.accent}, onChange: e=>setEditing(p=>({...p,fields:e.target.checked?[...(p.fields||[]),f.name]:(p.fields||[]).filter(x=>x!==f.name)})), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2693}}) , React.createElement('span', { style: {fontSize:13,color:T.text}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2695}}, f.label) , f.required&&React.createElement(Badge, { text: "Required", color: T.danger, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2696}}) ) )) ) ) , React.createElement(Inp, { label: "Submit Button Label" , value: editing.submitLabel||'Submit', onChange: e=>setEditing(p=>({...p,submitLabel:e.target.value})), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2701}}) , React.createElement(Inp, { label: "Success Message" , value: editing.successMsg||'', onChange: e=>setEditing(p=>({...p,successMsg:e.target.value})), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2702}}) , React.createElement('div', { style: {display:'flex',gap:8,borderTop:'1px solid '+T.border,paddingTop:12}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2703}} , React.createElement(Btn, { onClick: ()=>save(editing), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2704}}, "Save Form" ) , React.createElement(Btn, { variant: "secondary", onClick: ()=>setEditing(null), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2705}}, "Cancel") ) ) ) ) /* Preview modal */ , preview && ( React.createElement(Modal, { onClose: ()=>setPreview(null), maxWidth: 480, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2713}} , React.createElement(ModalHead, { title: 'Preview: '+preview.name, onClose: ()=>setPreview(null), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2714}}) , React.createElement(CaptureFormPreview, { form: preview, onClose: ()=>setPreview(null), __self: this, __source: {fileName: _jsxFileName, lineNumber: 2715}}) ) ) ) ); } function CaptureFormPreview({ form, onClose }) { const schema = DB.getSchema().leads; const fields = (form.fields||[]).map(name=>schema.fields.find(f=>f.name===name)).filter(Boolean); const [data, setData] = useState({}); const [submitted, setSubmitted] = useState(false); function submit() { const required = fields.filter(f=>f.required); if (required.some(f=>!data[f.name])) return; DB.submitCaptureform(form.id, {...data, branch:form.branch||''}); setSubmitted(true); } if (submitted) return ( React.createElement('div', { style: {padding:40,textAlign:'center'}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2736}} , React.createElement('div', { style: {fontSize:40,marginBottom:16}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2737}}, "\u2705") , React.createElement('div', { style: {fontSize:18,fontWeight:700,color:T.text,marginBottom:8}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2738}}, form.successMsg||'Thank you!') , React.createElement(Btn, { onClick: onClose, style: {marginTop:16}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2739}}, "Close") ) ); return ( React.createElement('div', { style: {padding:24}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2744}} , React.createElement('div', { style: {textAlign:'center',marginBottom:24}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2745}} , React.createElement('div', { style: {fontSize:18,fontWeight:800,color:T.text}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2746}}, form.title) , form.subtitle&&React.createElement('div', { style: {fontSize:13,color:T.soft,marginTop:6}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2747}}, form.subtitle) ) , React.createElement('div', { style: {display:'flex',flexDirection:'column',gap:14}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2749}} , fields.map(field=>( React.createElement('div', { key: field.name, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2751}} , React.createElement('label', { style: {fontSize:12,color:T.mid,fontWeight:600,display:'block',marginBottom:5}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2752}}, field.label, field.required&&React.createElement('span', { style: {color:T.danger}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2752}}, " *" )) , React.createElement(FieldRenderer, { field: field, value: data[field.name]||'', onChange: v=>setData(p=>({...p,[field.name]:v})), mode: "edit", __self: this, __source: {fileName: _jsxFileName, lineNumber: 2753}}) ) )) , React.createElement(Btn, { onClick: submit, style: {width:'100%',justifyContent:'center',marginTop:8}, __self: this, __source: {fileName: _jsxFileName, lineNumber: 2756}}, form.submitLabel||'Submit') ) ) ); }