templates/registration/register.html.twig line 16

  1. {% extends 'base.html.twig' %}
  2. {% import "macros/form-input.html.twig" as inputMacro %}
  3. {% import 'macros/doc-upload.html.twig' as docUpload %}
  4. {% block title %}Register{% endblock %}
  5. {% block body %}
  6.     <div class="w-full max-w-screen-2xl py-16 mx-auto px-6">
  7.       <h1 class="md:text-4xl text-3xl font-bold text-gray-800 text-center">
  8.         Membership Application Form
  9.       </h1>
  10.       <p class="text-lg text-gray-800 text-center my-5">
  11.         Please fill up the form below to apply for membership.
  12.       </p>
  13.       <div class="w-full max-w-lg mx-auto my-5 py-5">
  14.         {{ form_start(registrationForm, { 'attr': {'autocomplete': 'off','id':'js-registration_form'}}) }}
  15.           <div class="w-full flex flex-col gap-4">
  16.             <h3 class="text-base text-gray-800 font-semibold mb-2">
  17.               Gender
  18.             </h3>
  19.             <div class="grid lg:grid-cols-3 gap-3">
  20.               <div class="lg:col-span-2">
  21.                 <div class="w-full flex md:flex-row flex-col md:items-center mb-4 gap-3">
  22.                   <div class="inline-flex items-center gap-x-2">
  23.                     <input
  24.                       id="male"
  25.                       name="{{ field_name(registrationForm.gender) }}"
  26.                       value="M"
  27.                       type="radio"
  28.                       class="
  29.                         inline-block
  30.                         w-4
  31.                         h-4
  32.                         rounded
  33.                         accent-brand
  34.                         border-brand
  35.                         focus:ring-0
  36.                         active:ring-0
  37.                       "
  38.                       required
  39.                     >
  40.                     <label
  41.                       for="male"
  42.                       class="grow ml-2 font-normal text-gray-700 cursor-pointer text-base"
  43.                     >
  44.                       Male
  45.                     </label>
  46.                   </div>
  47.                   <div class="inline-flex items-center gap-x-2">
  48.                     <input
  49.                       id="female"
  50.                       name="{{ field_name(registrationForm.gender) }}"
  51.                       value="F"
  52.                       type="radio"
  53.                       class="
  54.                         inline-block
  55.                         w-4
  56.                         h-4
  57.                         rounded
  58.                         accent-brand
  59.                         border-brand
  60.                         focus:ring-0
  61.                         active:ring-0
  62.                       "
  63.                       required
  64.                     >
  65.                     <label
  66.                       for="female"
  67.                       class="grow ml-2 font-normal text-gray-700 cursor-pointer text-base"
  68.                     >
  69.                       Female
  70.                     </label>
  71.                   </div>
  72.                   <div class="inline-flex items-center gap-x-2">
  73.                     <input
  74.                       id="other"
  75.                       name="{{ field_name(registrationForm.gender) }}"
  76.                       value="O"
  77.                       type="radio"
  78.                       class="
  79.                         inline-block
  80.                         w-4
  81.                         h-4
  82.                         rounded
  83.                         accent-brand
  84.                         border-brand
  85.                         focus:ring-0
  86.                         active:ring-0
  87.                       "
  88.                       required
  89.                     >
  90.                     <label
  91.                       for="other"
  92.                       class="grow ml-2 font-normal text-gray-700 cursor-pointer text-base"
  93.                     >
  94.                       Other
  95.                     </label>
  96.                   </div>
  97.                 </div>
  98.                 {{ inputMacro.input
  99.                     (
  100.                       field_name(registrationForm.email),
  101.                       field_value(registrationForm.email),
  102.                       field_label(registrationForm.email),
  103.                       'email',
  104.                       true,
  105.                       true,
  106.                       false,
  107.                       'email'
  108.                     )
  109.                 }}
  110.                 {{ inputMacro.input
  111.                   (
  112.                     field_name(registrationForm.phoneNo),
  113.                     field_value(registrationForm.phoneNo),
  114.                     'Phone No.',
  115.                     'tel',
  116.                     true,
  117.                     false,
  118.                     false,
  119.                     'phone'
  120.                   )
  121.                 }}
  122.               </div>
  123.               <div class="lg:col-span-1 flex lg:justify-end">
  124.                 {{ form_start(uploadForm,
  125.                   {'attr': {
  126.                     'id': 'profile-image'
  127.                     }
  128.                   })
  129.                 }}
  130.                   <div class="w-36 h-36 rounded-lg bg-gray-100 relative overflow-hidden">
  131.                     <div class="profile-img-result absolute w-full h-full bg-gray-100 inline-flex items-center justify-center">
  132.                       <svg xmlns="http://www.w3.org/2000/svg" class="w-8 h-8 fill-gray-400" viewBox="0 0 24 24">
  133.                         <path d="M19,4h-.508L16.308,1.168A3.023,3.023,0,0,0,13.932,0H10.068A3.023,3.023,0,0,0,7.692,1.168L5.508,4H5A5.006,5.006,0,0,0,0,9V19a5.006,5.006,0,0,0,5,5H19a5.006,5.006,0,0,0,5-5V9A5.006,5.006,0,0,0,19,4ZM9.276,2.39A1.006,1.006,0,0,1,10.068,2h3.864a1.008,1.008,0,0,1,.792.39L15.966,4H8.034ZM22,19a3,3,0,0,1-3,3H5a3,3,0,0,1-3-3V9A3,3,0,0,1,5,6H19a3,3,0,0,1,3,3Z"/>
  134.                         <path d="M12,8a6,6,0,1,0,6,6A6.006,6.006,0,0,0,12,8Zm0,10a4,4,0,1,1,4-4A4,4,0,0,1,12,18Z"/>
  135.                       </svg>
  136.                     </div>
  137.                     <div class="relative opacity-0 w-full h-full">
  138.                       <input type="file" id="profile-image-input" name="{{ field_name(uploadForm.media) }}" accept=".png,.jpg,.jpeg" class="block opacity-0 w-full h-full cursor-pointer py-2" />
  139.                     </div>
  140.                     <div class="absolute w-full py-1.5 text-xs text-center bottom-0 bg-black text-white">
  141.                       Upload
  142.                     </div>
  143.                   </div>
  144.                 {{ form_end(uploadForm) }}
  145.               </div>
  146.             </div>
  147.             <div class="grid lg:grid-cols-2 gap-3">
  148.               <div class="lg:col-span-1">
  149.                 {{ inputMacro.input
  150.                     (
  151.                       field_name(registrationForm.firstName),
  152.                       field_value(registrationForm.firstName),
  153.                       field_label(registrationForm.firstName),
  154.                       'text',
  155.                       true,
  156.                       false,
  157.                       false,
  158.                       'fname'
  159.                     )
  160.                 }}
  161.               </div>
  162.               <div class="lg:col-span-1">
  163.                 {{ inputMacro.input
  164.                     (
  165.                       field_name(registrationForm.lastName),
  166.                       field_value(registrationForm.lastName),
  167.                       field_label(registrationForm.lastName),
  168.                       'text',
  169.                       true,
  170.                       false,
  171.                       false,
  172.                       'lname'
  173.                     )
  174.                 }}
  175.               </div>
  176.             </div>
  177.             <div class="grid lg:grid-cols-3 gap-3">
  178.               <div class="lg:col-span-1">
  179.             {{ inputMacro.input
  180.               (
  181.                 field_name(registrationForm.houseNumber),
  182.                 field_value(registrationForm.houseNumber),
  183.                 'House Number',
  184.                 'text',
  185.                 true,
  186.                 false,
  187.                 false,
  188.                 'houseNumber'
  189.               )
  190.             }}
  191.             </div>
  192.             <div class="lg:col-span-1">
  193.             {{ inputMacro.input
  194.               (
  195.                 field_name(registrationForm.street),
  196.                 field_value(registrationForm.street),
  197.                 'Street',
  198.                 'text',
  199.                 true,
  200.                 false,
  201.                 false,
  202.                 'street'
  203.               )
  204.             }}
  205.             </div>
  206.             <div class="lg:col-span-1">
  207.             {{ inputMacro.input
  208.               (
  209.                 field_name(registrationForm.postCode),
  210.                 field_value(registrationForm.postCode),
  211.                 'postCode',
  212.                 'text',
  213.                 true,
  214.                 false,
  215.                 false,
  216.                 'postCode'
  217.               )
  218.             }}
  219.             </div>
  220.             </div>
  221.             {{ inputMacro.input
  222.                 (
  223.                   field_name(registrationForm.plainPassword),
  224.                   field_value(registrationForm.plainPassword),
  225.                   'Password',
  226.                   'password',
  227.                   true,
  228.                   false,
  229.                   false,
  230.                   'password'
  231.                 )
  232.             }}
  233.             <div class="w-full flex items-center mt-4 mb-8">
  234.               <input
  235.                       id="agree"
  236.                       name="{{ field_name(registrationForm.agreeTerms) }}"
  237.                       value="{{ field_value(registrationForm.agreeTerms) }}"
  238.                       type="checkbox"
  239.                       class="
  240.                 inline-block
  241.                 w-4
  242.                 h-4
  243.                 rounded
  244.                 accent-brand
  245.                 border-brand
  246.                 focus:ring-0
  247.                 active:ring-0
  248.               "
  249.                       required
  250.               >
  251.               <label
  252.                       for="agree"
  253.                       class="grow ml-2 font-normal text-gray-700 cursor-pointer text-base"
  254.               >
  255.                 Agree
  256.               </label>
  257.             </div>
  258.             <input type="hidden" name="imageType" value="LG">
  259.             <input type="hidden" name="imageMetadata" class="metadata-profile">
  260.             <div class="w-full text-center mt-4">
  261.               <button
  262.                 type="submit"
  263.                 class="
  264.                   next
  265.                   rounded-full
  266.                   bg-transparent
  267.                   border
  268.                   border-brand
  269.                   px-12
  270.                   py-3
  271.                   inline-flex
  272.                   items-center
  273.                   justify-center
  274.                   text-base
  275.                   group
  276.                   font-semibold
  277.                   transition-all
  278.                   duration-500
  279.                   relative
  280.                   overflow-hidden
  281.                   after:content=['']
  282.                   after:w-0
  283.                   after:h-full
  284.                   after:absolute
  285.                   after:block
  286.                   after:inset-0
  287.                   hover:after:w-full
  288.                   after:transition-all
  289.                   after:duration-500
  290.                   after:bg-brand
  291.                   after:text-white
  292.                 "
  293.               >
  294.                 <span class="z-10 group-hover:text-white text-brand transition-all duration-700">
  295.                   Submit
  296.                 </span>
  297.               </button>
  298.             </div>
  299.           </div>
  300.         {{ form_end(registrationForm) }}
  301.       </div>
  302.     </div>
  303.     <script>
  304.       function registerUser(){
  305.         const registrationForm =  document.querySelector('#js-registration_form');
  306.         const registrationFormData = new FormData(registrationForm);
  307.         $.ajax({
  308.           url: '{{ path('app_register') }}',
  309.           method: 'POST',
  310.           data: registrationFormData,
  311.           processData: false,
  312.           contentType: false,
  313.           success: function(r) {
  314.             const response = JSON.parse(r)
  315.             if (response.status =='success'){
  316.               console.log(response)
  317.             } else {
  318.               return displayToast(response.message, 'error', 3000)
  319.             }
  320.           },
  321.           error: function (e) {
  322.             const error = JSON.parse(e)
  323.             return displayToast(error.message, 'error', 3000)
  324.           }
  325.         });
  326.       }
  327.       document.getElementById("profile-image-input").onchange = function(){
  328.         const uploadedImage = URL.createObjectURL(this.files[0])
  329.         
  330.         const formData = new FormData()
  331.         formData.append('mediaType', 'LG')
  332.         formData.append('upload_form[media]', this.files[0], this.files[0].name)
  333.         formData.append('upload_form[_token]', $('#upload_form__token').val())
  334.         $('.profile-img-result').html(`
  335.           <img src="${uploadedImage}" class="w-full h-full object-cover object-center">
  336.         `)
  337.         $.ajax({
  338.             url: '{{ path('image_upload_post') }}',
  339.             method: 'POST',
  340.             data: formData,
  341.             processData: false,
  342.             contentType: false,
  343.             success: function(r) {
  344.               const response = JSON.parse(r)
  345.               $('.metadata-profile').val(response.imageMetadataUid)
  346.             },
  347.             error: function (e) {
  348.               const error = JSON.parse(e)
  349.               return displayToast(error.message, 'error', 3000)
  350.             }
  351.           })
  352.       }
  353.     </script>
  354. {% endblock %}