You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1 line
10 KiB

import{$t as e,D as t,Et as n,O as r,P as i,S as a,T as o,W as s,Y as c,_ as l,_t as u,ct as d,d as ee,f as te,h as f,ht as ne,in as p,k as re,l as m,m as h,q as g,w as _,x as v}from"./vue.runtime.esm-bundler-CACvpnko.js";import{a as y,i as ie}from"./portalLocale-vgPGVHT0.js";import{O as ae,_ as oe}from"./api-Dpfxb1ca.js";import{f as se,i as ce,n as le,p as ue,r as de}from"./index-D5exsJys.js";import{r as fe}from"./site-BxiJvB6v.js";import{a as pe,i as me,n as he,t as ge}from"./AudienceTicketModal-gufU_b3a.js";import{t as b}from"./signupOptionCodes-CvTkOKn_.js";import{n as _e,t as x}from"./localizedSchema-Bdc94RQm.js";var S=[{key:`name`,type:`text`,label:`个人姓名`,label_i18n:{en:`Full Name`},required:!0,list:!0,placeholder:`请输入姓名`,placeholder_i18n:{en:`Enter your full name`}},{key:`phone`,type:`tel`,label:`联系电话`,label_i18n:{en:`Phone Number`},required:!0,list:!0,placeholder:`请输入11位手机号`,placeholder_i18n:{en:`Enter an 11-digit mobile number`}},{key:`company`,type:`text`,label:`所属单位`,label_i18n:{en:`Organization`},required:!0,list:!0,placeholder:`请输入单位名称`,placeholder_i18n:{en:`Enter your organization`}},{key:`job`,type:`text`,label:`个人职务`,label_i18n:{en:`Job Title`},required:!1,list:!0,placeholder:`请输入职务`,placeholder_i18n:{en:`Enter your job title`}},{key:`purpose`,type:`select`,label:`观赛目的`,label_i18n:{en:`Purpose of Attendance`},required:!0,list:!0,filter:!0,placeholder:`请选择观赛目的`,placeholder_i18n:{en:`Please select a purpose`},options:b.map(e=>({...e}))}];function C(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=String(e.en??``).trim();return t?{en:t}:void 0}function w(e){return Array.isArray(e)?e.map(e=>{if(typeof e==`string`)return{label:e,value:e};if(typeof e!=`object`||!e)return null;let t=e,n=String(t.label??t.value??``).trim(),r=String(t.value??t.label??``).trim();if(!n&&!r)return null;let i=C(t.label_i18n);return{label:n||r,value:r||n,...i?{label_i18n:i}:{}}}).filter(e=>e!=null):[]}function T(e){if(!Array.isArray(e)||e.length===0)return S.map(e=>({...e,options:e.options?[...e.options]:void 0}));let t=[];for(let n of e){if(typeof n!=`object`||!n)continue;let e=n,r=String(e.key??``).trim(),i=String(e.type??`text`);if(!r||i===`file`||i===`commitment`)continue;let a=i===`select`?w(e.options):void 0;t.push({key:r,type:i,label:String(e.label??r),required:!!e.required,placeholder:e.placeholder==null?void 0:String(e.placeholder),help:e.help==null?void 0:String(e.help),options:i===`select`&&r===`purpose`&&(!a||a.length===0)?b.map(e=>({...e})):a,label_i18n:C(e.label_i18n),placeholder_i18n:C(e.placeholder_i18n),help_i18n:C(e.help_i18n),list:e.list===!0,filter:e.filter===!0})}return t.length?t:S.map(e=>({...e,options:e.options?[...e.options]:void 0}))}var ve={class:`container-fluid audience-page-shell`},ye={class:`mb-3 form-page-header`},be={class:`mb-0 form-page-title`},xe=[`aria-label`],Se={key:0,class:`text-muted small py-3`},Ce={key:1,class:`row g-3`},we=[`aria-checked`,`aria-disabled`,`onClick`,`onKeydown`],E={class:`audience-session-card-head`},D={class:`audience-session-name-wrap`},O={class:`audience-quota`},k={class:`audience-session-meta`},Te={class:`audience-session-selected`},Ee={class:`audience-form-panel`},De={class:`audience-form-body`},Oe=[`for`],ke={key:0,class:`text-danger`},Ae=[`id`,`onUpdate:modelValue`,`disabled`,`required`],je={value:``},Me=[`value`],Ne=[`id`,`onUpdate:modelValue`,`placeholder`,`disabled`,`required`],Pe=[`id`,`onUpdate:modelValue`,`type`,`inputmode`,`placeholder`,`disabled`,`readonly`,`required`,`title`],Fe={class:`invalid-feedback`},Ie={class:`col-12 audience-form-actions`},Le=[`disabled`],Re={key:0,class:`alert alert-danger audience-success`,role:`alert`},ze={key:1,class:`alert alert-success audience-success`,role:`status`},A=re({__name:`AudienceFormView`,setup(re){let{t:b}=ce(),S=se(),C=ue(),w=v(()=>String(S.params.slug??``).trim()),A=v(()=>ie(S.query)),j=u([]),M=u(T([])),N=u(!1),P=u(!1),F=u(null),I=u(``),L=u(null),R=u(!1),z=u(``),B=u(!1),V=ne({}),Be=i(`audienceEventBadge`,v(()=>fe)),H=v(()=>j.value.find(e=>e.id===F.value)??null),U=v(()=>H.value?.is_available===!0);function W(e){for(let t of e)V[t.key]??(V[t.key]=``)}function G(e){return x(e,A.value,`label`)||e.label}function K(e){return U.value?x(e,A.value,`placeholder`)||b(`audience.pleaseFill`,{label:G(e)}):b(`audience.selectSessionFirst`)}function q(e){return A.value===`en`&&e.name_en?.trim()?e.name_en.trim():e.name}function Ve(e){return A.value===`en`&&e.event_date_text_en?.trim()?e.event_date_text_en.trim():e.event_date_text}function He(e){return A.value===`en`&&e.address_en?.trim()?e.address_en.trim():e.address}function Ue(e){return e.is_registered?b(`audience.statusRegistered`):e.status===`open`?b(`audience.statusOpen`):e.status===`full`?b(`audience.statusFull`):e.status===`not_started`?b(`audience.statusNotStarted`):e.status===`expired`?b(`audience.statusExpired`):e.status_label}function We(e){return e.is_registered?`is-registered`:e.status===`open`?`is-open`:e.status===`full`?`is-full`:``}async function Ge(){if(w.value)try{let e=await fetch(`${oe()}/api/v1/public/competitions/by-slug/${encodeURIComponent(w.value)}`,{headers:{Accept:`application/json`}});if(!e.ok)return;let t=await e.json();M.value=T((t.data!=null&&typeof t.data==`object`&&!Array.isArray(t.data)?t.data:t).audience_form_schema),W(M.value)}catch{M.value=T([]),W(M.value)}}async function J(){if(w.value){N.value=!0;try{j.value=await me(w.value),F.value!=null&&(j.value.find(e=>e.id===F.value)?.is_available||(F.value=null))}catch{j.value=[]}finally{N.value=!1}}}function Y(e){e.is_registered||!e.is_available||(F.value=e.id,I.value=``,L.value=null,R.value=!1,z.value=``,B.value=!1)}function X(e){return e.key===`phone`||e.type===`tel`}function Z(e){if(!B.value)return!1;let t=String(V[e.key]??``).trim();return X(e)?!/^1[3-9]\d{9}$/.test(t):e.type===`email`&&t&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)?!0:e.required?!t:!1}function Ke(e){return X(e)?b(`audience.phoneRequired`):e.type===`email`?b(`apply.invalidEmail`):b(`audience.pleaseFill`,{label:G(e)})}async function qe(){if(B.value=!0,z.value=``,I.value=``,L.value=null,R.value=!1,!(!H.value||!U.value)&&!M.value.some(e=>Z(e))){P.value=!0;try{let e={audience_session_id:H.value.id,name:String(V.name??``).trim(),phone:$.value,purpose:String(V.purpose??``).trim()};for(let t of M.value){if(t.key===`phone`||t.key===`audience_session_id`)continue;let n=String(V[t.key]??``).trim();e[t.key]=n}e.phone=$.value;let t=await pe(w.value,e);L.value=t,de(w.value,`audience`,A.value),I.value=b(`audience.success`,{name:A.value===`en`?t.session_name_en||q(H.value)||t.session_name:t.session_name||q(H.value)}),R.value=!0,F.value=null,B.value=!1,await J()}catch(e){z.value=(e instanceof Error?e.message.trim():``)||b(`audience.failed`),await J()}finally{P.value=!1}}}function Q(e){let t=e.trim();t&&(V.phone=t)}function Je(){try{let e=localStorage.getItem(`cxxfds_audience_user`),t=e?JSON.parse(e):null;return String(t?.mobile??``).trim()}catch{return``}}let $=v(()=>String(V.phone??``).trim());return s(()=>{let{token:e,competitionSlug:t}=ae();if(!e||t!==w.value){C.replace({name:`audience-login`,params:{slug:w.value},query:y(A.value)});return}Q(Je()),W(M.value),(async()=>{try{let e=await he(w.value);Q(e.mobile??``);let t=le(w.value,`audience`,e.signup_locale,e.signup_locale_locked);t&&t!==A.value&&await C.replace({name:`audience-form`,params:{slug:w.value},query:y(t)})}catch{}})(),Ge(),J()}),(i,s)=>(g(),o(`div`,ve,[a(`div`,ye,[a(`h5`,be,p(n(b)(`audience.title`)),1)]),a(`section`,{class:`audience-session-section`,"aria-label":n(b)(`audience.sessionsAria`)},[N.value?(g(),o(`div`,Se,p(n(b)(`audience.loading`)),1)):(g(),o(`div`,Ce,[(g(!0),o(l,null,c(j.value,t=>(g(),o(`div`,{key:t.id,class:`col-12 col-md-6 col-xl-3`},[a(`article`,{class:e([`audience-session-card`,{"is-final":t.is_final,"is-registered":t.is_registered}]),role:`radio`,tabindex:`0`,"aria-checked":F.value===t.id,"aria-disabled":t.is_registered||!t.is_available,onClick:e=>Y(t),onKeydown:[h(f(e=>Y(t),[`prevent`]),[`enter`]),h(f(e=>Y(t),[`prevent`]),[`space`])]},[a(`div`,E,[a(`div`,D,[a(`h6`,null,p(q(t)),1)]),a(`span`,{class:e([`audience-status-badge`,We(t)])},p(Ue(t)),3)]),a(`div`,O,[a(`strong`,null,p(t.remaining),1),a(`span`,null,p(n(b)(`audience.remainingUnit`)),1),a(`small`,null,p(n(b)(`audience.remaining`)),1)]),a(`div`,k,[a(`span`,null,p(Ve(t)),1),a(`span`,null,p(He(t)),1)]),a(`div`,Te,`✓ `+p(n(b)(`audience.selected`)),1)],42,we)]))),128))]))],8,xe),a(`div`,Ee,[a(`div`,De,[a(`form`,{class:e([`row g-3`,{"was-validated":B.value}]),novalidate:``,onSubmit:f(qe,[`prevent`])},[(g(!0),o(l,null,c(M.value,r=>(g(),o(`div`,{key:r.key,class:`col-12 col-md-6 audience-form-fifth`},[a(`label`,{class:`form-label`,for:`audience-`+r.key},[t(p(G(r))+` `,1),r.required?(g(),o(`span`,ke,`*`)):_(``,!0)],8,Oe),r.type===`select`?d((g(),o(`select`,{key:0,id:`audience-`+r.key,"onUpdate:modelValue":e=>V[r.key]=e,class:e([`form-select audience-entry-field`,{"is-invalid":Z(r)}]),disabled:!U.value,required:r.required},[a(`option`,je,p(K(r)),1),(g(!0),o(l,null,c(r.options??[],e=>(g(),o(`option`,{key:e.value,value:e.value},p(n(_e)(e,A.value)),9,Me))),128))],10,Ae)),[[ee,V[r.key]]]):r.type===`textarea`?d((g(),o(`textarea`,{key:1,id:`audience-`+r.key,"onUpdate:modelValue":e=>V[r.key]=e,class:e([`form-control audience-entry-field`,{"is-invalid":Z(r)}]),placeholder:K(r),disabled:!U.value,required:r.required,rows:`3`},null,10,Ne)),[[te,V[r.key]]]):d((g(),o(`input`,{key:2,id:`audience-`+r.key,"onUpdate:modelValue":e=>V[r.key]=e,class:e([`form-control audience-entry-field`,{"is-invalid":Z(r)}]),type:X(r)?`tel`:r.type===`email`?`email`:`text`,inputmode:X(r)?`numeric`:void 0,placeholder:K(r),disabled:!U.value||X(r),readonly:X(r),required:r.required,title:X(r)?n(b)(`audience.phoneReadonly`):void 0},null,10,Pe)),[[m,V[r.key]]]),a(`div`,Fe,p(Ke(r)),1)]))),128)),a(`div`,Ie,[a(`button`,{class:`btn btn-primary audience-submit-btn`,type:`submit`,disabled:!U.value||P.value},p(U.value?P.value?n(b)(`audience.submitting`):n(b)(`audience.submit`):n(b)(`audience.selectSessionFirst`)),9,Le)])],34),z.value?(g(),o(`div`,Re,p(z.value),1)):_(``,!0),I.value?(g(),o(`div`,ze,p(I.value),1)):_(``,!0)])]),r(ge,{open:R.value,mode:`success`,slug:w.value,"event-badge":n(Be),registration:L.value,onClose:s[0]||=e=>R.value=!1},null,8,[`open`,`slug`,`event-badge`,`registration`])]))}});export{A as default};