templates/bundles/UVDeskSupportCenterBundle/Knowledgebase/ticket.html.twig line 1

Open in your IDE?
  1. {% extends "@UVDeskSupportCenter/Templates/layout.html.twig" %}
  2. {% block title %}{% trans %}Create Ticket{% endtrans %}{% endblock %}
  3. {% block ogtitle %}{% trans %}Create Ticket{% endtrans %}{% endblock %}
  4. {% block twtitle %}{% trans %}Create Ticket{% endtrans %}{% endblock %}
  5. {% block metaDescription %}{% trans %}create.ticket.metaDescription{% endtrans %}{% endblock %}
  6. {% block metaKeywords %}{% trans %}create.ticket.metaKeywords{% endtrans %}{% endblock %}
  7. {% set recaptchaDetail = recaptcha_service.getRecaptchaDetails() %}
  8. {% block body %}
  9.     <style>
  10.         .uv-field{
  11.             padding: 5px 10px;
  12.         }
  13.         .grammarly-fix-message-container {
  14.             overflow: visible !important;
  15.         }
  16.         .grammarly-fix-message {
  17.             max-width: 158%;
  18.         }
  19.         .uv-field-success-icon {
  20.             display: none !important;
  21.         }
  22.         .mce-path {
  23.               display: none !important;
  24.         }
  25.         
  26.         .uv-element-block label.uv-field-label.required::after {
  27.             content: "*";
  28.             color: #FC6868;
  29.             font-weight: 700;
  30.             display: inline-block;
  31.         }
  32.         .uv-paper-article.uv-paper-form {
  33.             width: fit-content;
  34.             margin: 0 auto;
  35.         }
  36.         .uv-paper-section{
  37.             width: 100% !important;
  38.             padding-right: 0px !important;
  39.         }
  40.     </style>
  41.     {% set isTicketViewPage = (app.user.id is defined ? true : false) %}
  42.     
  43.     <div class="uv-paper-article uv-paper-form">
  44.         <div class="uv-paper-section">
  45.             <section>
  46.                 <h1>{{ 'Create Ticket Request'|trans }}</h1>
  47.                 <div class="uv-form">
  48.                     <form action="{{ path('helpdesk_customer_create_ticket') }}" method="post" id="create-ticket-form" enctype="multipart/form-data">
  49.                         {% if not isTicketViewPage %}
  50.                             <!-- Field -->
  51.                             <div class="uv-element-block">
  52.                                 <label class="uv-field-label required">{{ 'Name'|trans }}</label>
  53.                                 <div class="uv-field-block">
  54.                                     <input name="name" class="uv-field create-ticket" type="text" value="{{ post.name is defined ? post.name : '' }}">
  55.                                 </div>
  56.                                 <span class="uv-field-info">{{ 'Enter your name'|trans }}</span>
  57.                             </div>
  58.                             <!-- //Field -->
  59.                             <!-- Field -->
  60.                             <div class="uv-element-block">
  61.                                 <label class="uv-field-label required">{{ 'Email'|trans }}</label>
  62.                                 <div class="uv-field-block">
  63.                                     <input name="from" class="uv-field create-ticket" type="text" value="{{ post.from is defined ? post.from : '' }}">
  64.                                 </div>
  65.                                 <span class="uv-field-info">{{ 'Enter your email'|trans }}</span>
  66.                             </div>
  67.                             <!-- //Field -->
  68.                         {% endif %}
  69.                         <!-- Field -->
  70.                         <div class="uv-element-block">
  71.                             <label class="uv-field-label required">{{ 'Type'|trans }}</label>
  72.                             <div class="uv-field-block">
  73.                                 <select name="type" class="uv-select create-ticket" id="type">
  74.                                     <option value="">{{ 'Select type'|trans }}</option>
  75.                                     {% for type in ticket_service.getTypes() %}
  76.                                         <option value="{{ type.id }}" {{ post.type is defined and post.type == type.id ? 'selected' : '' }}>{{ type.name }}</option>
  77.                                     {% endfor %}
  78.                                 </select>
  79.                             </div>
  80.                             <span class="uv-field-info">{{ 'Choose ticket type'|trans }}</span>
  81.                         </div>
  82.                         <!-- //Field -->
  83. <div class="uv-field-block">
  84.     <label>{{ 'Số điện thoại'|trans }}</label>
  85.     <input type="text" name="phone_number" class="uv-field-input" pattern="[0-9+ ]{8,15}">
  86. </div>
  87. <div class="uv-field-block">
  88.     <label>{{ 'Khu vực'|trans }}</label>
  89.     <select name="region" class="uv-field-input">
  90.         <option value="">-- Chọn khu vực --</option>
  91.         <option value="Mien Bac">Miền Bắc</option>
  92.         <option value="Mien Trung">Miền Trung</option>
  93.         <option value="Mien Nam">Miền Nam</option>
  94.     </select>
  95. </div>
  96.                         <!-- Field -->
  97.                         <div class="uv-element-block">
  98.                             <label class="uv-field-label required">{{ 'Subject'|trans }}</label>
  99.                             <div class="uv-field-block">
  100.                                 <input name="subject" class="uv-field create-ticket" type="text" value="{{ post.subject is defined ? post.subject : '' }}">
  101.                             </div>
  102.                             <span class="uv-field-info">{{ 'Ticket subject'|trans }}</span>
  103.                         </div>
  104.                         <!-- //Field -->
  105.                         <!-- Field -->
  106.                         <div class="uv-element-block">
  107.                             <label class="uv-field-label required">{{ 'Message'|trans }}</label>
  108.                             <div class="uv-field-block grammarly-fix-message-container">
  109.                                 <textarea name="reply" id="create-reply" class="uv-field create-ticket grammarly-fix-message" type="text">{{ post.reply is defined ? post.reply : '' }}</textarea>
  110.                             </div>
  111.                             <span class="uv-field-info">{{ 'Ticket query message'|trans }}</span>
  112.                         </div>
  113.                         <!-- //Field -->
  114.                         <!-- Field -->
  115.                         <div class="uv-element-block attachment-block uv-no-error-success-icon" id="uv-attachment-option">
  116.                             <label>
  117.                                 <span class="uv-file-label">{{ 'Add Attachment'|trans }}</span>
  118.                             </label>
  119.                         </div>
  120.                         <!-- //Field -->
  121.                         {% if recaptchaDetail and recaptchaDetail.isActive == true %}
  122.                             <div class="clearfix"></div>
  123.                             <div class="g-recaptcha" data-sitekey="{{ recaptchaDetail.siteKey }}"></div>
  124.                             <div class="clearfix"></div>
  125.                         {% else %}
  126.                             <!-- Recaptcha will not support -->
  127.                         {% endif %}
  128.                         {# CustomFields #}
  129.                         {% set CustomerCustomFields = ticket_service.getCustomerCreateTicketCustomFieldSnippet() %}
  130.                         {% set removeMe = [] %}
  131.                         {% if CustomerCustomFields %}
  132.                             <div class="custom-fields clearfix">
  133.                                 {% for key, customField in CustomerCustomFields %}
  134.                                     <div class="uv-element-block input-group {{ customField.customFieldsDependency|length ? 'dependent' : '' }} {% for customFieldCustomFieldsDependency in customField.customFieldsDependency %} dependency{{customFieldCustomFieldsDependency.id}}{% endfor %}" style="position: relative; {{ customField.customFieldsDependency|length ? 'display: none;' : '' }}">
  135.                                         <label class="uv-field-label" for="for{{customField.name~customField.id}}">{{ customField.name }}</label>
  136.                                         {% if customField.fieldType == 'text' %}
  137.                                             <div class="uv-field-block">
  138.                                                 <input type="{{ customField['validation']['fieldtype'] is defined ? customField['validation']['fieldtype'] :'text' }}" name="customFields[{{customField.id}}]" class="uv-field create-ticket" value="" {{ customField.required ? "required" : "" }} id="for{{customField.name~customField.id}}" placeholder="{{customField.placeholder}}">
  139.                                             </div>
  140.                                         {% elseif customField.fieldType in ['date', 'time', 'datetime'] %}
  141.                                             <div class="uv-field-block">
  142.                                                 <input class="uv-field form-control create-ticket uv-date-picker {% if customField.fieldType == 'time' %}time{% else %}calendar{% endif %} uv-header-{{ customField.fieldType }}" type="text" name="customFields[{{customField.id}}]" {{ customField.required ? "required" : "" }} id="for{{customField.name~customField.id}}" value="">
  143.                                             </div>
  144.                                         {% elseif customField.fieldType == 'textarea' %}
  145.                                             <div class="uv-field-block">
  146.                                                 <textarea name="customFields[{{customField.id}}]" class="uv-field create-ticket" {{ customField.required ? "required" : "" }} id="for{{customField.name~customField.id}}"></textarea>
  147.                                             </div>
  148.                                         {% elseif customField.fieldType in ['file'] %}
  149.                                             <div class="uv-field-block">
  150.                                                 <input type="file" name="customFields[{{customField.id}}]" class="uv-field create-ticket" {{ customField.required ? "required" : "" }} id="for{{customField.name~customField.id}}">
  151.                                             </div>
  152.                                         {% elseif customField.fieldType in ['select'] %}
  153.                                             {% if customField.customFieldValues is not empty %}
  154.                                                 <div class="uv-field-block">
  155.                                                     <select name="customFields[{{customField.id}}]" class="uv-select create-ticket" id="for{{customField.name~customField.id}}" {{ customField.required ? "required" : "" }}>
  156.                                                         <option value="">{{ 'Select option' }}</option>
  157.                                                         {% for customFieldValues in customField.customFieldValues %}
  158.                                                             <option value="{{customFieldValues.id}}">{{customFieldValues.name}}</option>
  159.                                                         {% endfor %}
  160.                                                     </select>
  161.                                                 </div>
  162.                                             {% else %}
  163.                                                 <!--Hide this beacause choices aren't available-->
  164.                                                 {% set removeMe = removeMe|merge(["for"~customField.name~customField.id]) %}
  165.                                             {% endif %}
  166.                                         {% elseif customField.fieldType in ['checkbox'] %}
  167.                                             {% if customField.customFieldValues is not empty %}
  168.                                                 {% for customFieldValues in customField.customFieldValues %}
  169.                                                     <div class="uv-split-field">
  170.                                                         <label>
  171.                                                             <div class="uv-checkbox">
  172.                                                                 <input type="checkbox" name="customFields[{{customField.id}}][]" value="{{customFieldValues.id}}" id="for{{customFieldValues.name~customFieldValues.id}}" class="create-ticket"/>
  173.                                                                 <span class="uv-checkbox-view"></span>
  174.                                                             </div>
  175.                                                             <span class="uv-radio-label" for="for{{customFieldValues.name~customFieldValues.id}}">{{ customFieldValues.name }}</span>
  176.                                                         </label>
  177.                                                     </div>
  178.                                                 {% endfor %}
  179.                                             {% else %}
  180.                                                 <!--Hide this beacause choices aren't available-->
  181.                                                 {% set removeMe = removeMe|merge(["for"~customField.name~customField.id]) %}
  182.                                             {% endif %}
  183.                                         {% elseif customField.fieldType in ['radio'] %}
  184.                                             {% if customField.customFieldValues is not empty %}
  185.                                                 {% for customFieldValues in customField.customFieldValues %}
  186.                                                     <div class="uv-split-field">
  187.                                                         <label>
  188.                                                             <div class="uv-radio">
  189.                                                                 <input type="radio" name="customFields[{{customField.id}}]" value="{{customFieldValues.id}}" id="for{{customFieldValues.name~customFieldValues.id}}" class="create-ticket"/>
  190.                                                                 <span class="uv-radio-view"></span>
  191.                                                             </div>
  192.                                                             <span class="uv-radio-label" for="for{{customFieldValues.name~customFieldValues.id}}">{{ customFieldValues.name }}</span>
  193.                                                         </label>
  194.                                                     </div>
  195.                                                 {% endfor %}
  196.                                             {% else %}
  197.                                                 <!--Hide this beacause choices aren't available-->
  198.                                                 {% set removeMe = removeMe|merge(["for"~customField.name~customField.id]) %}
  199.                                             {% endif %}
  200.                                         {% endif %}
  201.                                         {% if formErrors['customFields['~customField.id~']'] is defined %}
  202.                                             <div class="text-danger">{{formErrors['customFields['~customField.id~']']}}</div>
  203.                                         {% endif %}
  204.                                     </div>
  205.                                 {% endfor %}
  206.                             </div>
  207.                         {% endif %}
  208.                         <div class="uv-element-block">
  209.                             <button type="submit" id="create-ticket-btn" class="uv-btn">{{ 'Create Ticket'|trans }}</button>
  210.                         </div>
  211.                     </form>
  212.                 </div>
  213.             </section>
  214.         </div>
  215.     </div>
  216.     {% if user_service.isFileExists('apps/uvdesk/form-component') %}
  217.         {{ include('@_uvdesk_extension_uvdesk_form_component/CustomFields/customFieldValidation.html.twig') }} 
  218.     {% elseif user_service.isFileExists('apps/uvdesk/custom-fields') %}
  219.         {{ include('@_uvdesk_extension_uvdesk_custom_fields/CustomFields/customFieldValidation.html.twig') }} 
  220.     {% endif %}
  221. {% endblock %}
  222. {% block footer %}
  223.     {% set isTicketViewPage = (app.user.id is defined ? true : false) %}
  224.     
  225.     {{ parent() }}
  226.     {% if recaptchaDetail and recaptchaDetail.isActive == true %}
  227.         <script src='https://www.google.com/recaptcha/api.js'></script>
  228.     {% endif %}
  229.     {{ include("@UVDeskSupportCenter/Templates/tinyMCE.html.twig") }}
  230.     {{ include('@UVDeskCoreFramework/Templates/attachment.html.twig') }}
  231.     <script type="text/javascript">
  232.         {% if user_service.isFileExists('apps/uvdesk/form-component') == false %}
  233.             customFieldValidation = {};
  234.         {% endif %}
  235.         $(function () {
  236.             sfTinyMce.init({
  237.                 height: '155px',
  238.                 selector : '#create-reply',
  239.                 images_upload_url: "",
  240.                 setup: function(editor) {
  241.                 },
  242.                 plugins: [
  243.                 ],
  244.                 toolbar: '| undo redo | bold italic forecolor ',
  245.             });
  246.             {% if (removeMe is defined) %}
  247.                 $.each({{ removeMe | json_encode |raw }}, function(key, value){
  248.                     $('label[for="' + value + '"]').parent().hide();
  249.                 });
  250.             {% endif %}
  251.             $('.uv-header-date').datetimepicker({
  252.                 format: 'YYYY-MM-DD',
  253.             });
  254.             $('.uv-header-time').datetimepicker({
  255.                 format: 'LT',
  256.             });
  257.             $('.uv-header-datetime').datetimepicker({
  258.                 format: 'YYYY-MM-DD H:m:s'
  259.             });
  260.             var CreateTicketModel = Backbone.Model.extend({
  261.                 idAttribute : "id",
  262.                 defaults : {
  263.                     path : "",
  264.                 },
  265.                 validation: _.extend(customFieldValidation, {
  266.                     {% if not isTicketViewPage %}
  267.                         'name' : {
  268.                             required : true,
  269.                             msg : '{{ "This field is mandatory"|trans }}'
  270.                         },
  271.                         'from' :[{
  272.                             required : true,
  273.                             msg : '{{ "This field is mandatory"|trans }}'
  274.                         }, {
  275.                             pattern : 'email',
  276.                             msg : '{{ "Email address is invalid"|trans }}'
  277.                         }],
  278.                     {% endif %}
  279.                     'type' : {
  280.                         required : true,
  281.                         msg : '{{ "This field is mandatory"|trans }}'
  282.                     },
  283.                     'subject' : {
  284.                         required : true,
  285.                         msg : '{{ "This field is mandatory"|trans }}'
  286.                     },
  287.                     'reply' : {
  288.                         fn: function(value) {
  289.                             var content = tinyMCE.activeEditor.getContent();
  290.                             content = content.replace(/&nbsp;/g, '').replace(/<[^>]*>/g, '');
  291.                             if (content.trim() == '') {
  292.                                 return true;
  293.                             } else {
  294.                                 return false;
  295.                             }
  296.                             if (! tinyMCE.get("uv-edit-create-thread"))
  297.                                 return false;
  298.                                 
  299.                             var html = tinyMCE.get("uv-edit-create-thread").getContent();
  300.                             if (app.appView.stripHTML(html) != '') {
  301.                                 return false;
  302.                             }
  303.                             return true;
  304.                         },
  305.                         msg : '{{ "This field is mandatory"|trans }}'
  306.                     },
  307.                     {% if recaptchaDetail and recaptchaDetail.isActive == true %}
  308.                         'g-recaptcha-response' : {
  309.                             fn: function(value) {
  310.                                 if (grecaptcha.getResponse().length > 0)
  311.                                     return false;
  312.                                 else
  313.                                     return true;
  314.                             },
  315.                             msg : '{{ "Please select CAPTCHA"|trans }}'
  316.                         }
  317.                     {% endif %}
  318.                 }),
  319.                 urlRoot : "{{ path('helpdesk_customer_create_ticket') }}"
  320.             });
  321.             var CreateTicketForm = Backbone.View.extend({
  322.                 initialize : function() {
  323.                     Backbone.Validation.bind(this);
  324.                     var jsonContext = JSON.parse('{{ errors is defined ? errors|raw : "{}"  }}');
  325.                     for (var field in jsonContext) {
  326.                         Backbone.Validation.callbacks.invalid(this, field, jsonContext[field], 'input');
  327.                     }
  328.                 },
  329.                 events : {
  330.                     'click #create-ticket-btn' : "saveTicket",
  331.                     'change #type' : "updateCustomFields",
  332.                     'blur input:not(input[type=file]), textarea, select, checkbox': 'formChanged',
  333.                     'change input[type=file]': 'formChanged',
  334.                 },
  335.                 formChanged: function(e) {
  336.                     this.model.set(Backbone.$(e.currentTarget).attr('name'), Backbone.$(e.currentTarget).val())
  337.                     this.model.isValid([Backbone.$(e.currentTarget).attr('name')])
  338.                 },
  339.                 saveTicket : function (e) {
  340.                     e.preventDefault();
  341.                     var currentElement = Backbone.$(e.currentTarget);
  342.                     var data = currentElement.closest('form').serializeObject();
  343.                     this.model.set(data);
  344.                     if (this.model.isValid(true)) {
  345.                         $('#create-ticket-form').submit();
  346.                         $('form').find('#create-ticket-btn').attr('disabled', 'disabled');
  347.                     }
  348.                 },
  349.                 updateCustomFields : function (e) {
  350.                     var dependentFields = e.currentTarget.value;
  351.                     this.$('.dependent').hide();
  352.                     this.$('.dependency' + dependentFields).show();
  353.                 }
  354.             });
  355.             var createticketForm = new CreateTicketForm({
  356.                 el : $("#create-ticket-form"),
  357.                 model : new CreateTicketModel()
  358.             });
  359.         });
  360.     </script>
  361. {% endblock %}