1/* 2 * Copyright (c) 2025 SAP SE or an SAP affiliate company. All rights reserved. 3 */ 4ACC.customerticketingaddon = { 5 6 _autoload: [ 7 "toggleSubmitButton", 8 "onStatusChange", 9 "bindMessageArea", 10 "toggleAllMessages", 11 "postNewMessage", 12 "onFileChosen", 13 "bindTicketAddActions", 14 "bindTicketUpdateActions" 15 ], 16 17 18 disableMessage: function(_this){ 19 var currentTicketStatus = $('input[id="currentTicketStatus"]').val(); 20 var selectedStatus = $(_this).val(); 21 22 if((currentTicketStatus === 'COMPLETED' && selectedStatus === 'COMPLETED') || (currentTicketStatus === 'CLOSED' && selectedStatus === 'CLOSED')) { 23 $('textarea[id="message"]').attr('disabled','disabled'); 24 $('button[id="updateTicket"]').attr('disabled','disabled'); 25 } else { 26 $('textarea[id="message"]').removeAttr('disabled'); 27 } 28 }, 29 30 onStatusChange: function () { 31 $(document).on('change', '.js-add-message-status', function () { 32 ACC.customerticketingaddon.disableMessage(this); 33 }); 34 }, 35 36 onFileChosen: function () { 37 $(document).on('change', '#supportTicketForm input[name=files]', function () { 38 ACC.customerticketingaddon.clearAlerts(); 39 var selectedFile = document.getElementById('attachmentFiles'); 40 if (!ACC.customerticketingaddon.isSelectedFilesValid(selectedFile)) 41 { 42 var message = "<span style='color:red'>" + $('#file-too-large-message').text() + "</span>"; 43 $("#supportTicketForm").find(".js-file-upload__file-name").html(ACC.sanitizer.sanitize(message)); 44 } 45 ACC.customerticketingaddon.toggleSubmitButton(); 46 }); 47 }, 48 49 toggleSubmitButton: function() { 50 var selectedFile = document.getElementById('attachmentFiles'); 51 if ($('#updateTicket').length === 0) { 52 return; 53 } 54 if (!ACC.customerticketingaddon.isSelectedFilesValid(selectedFile) || $('textarea[id="message"]').val().length === 0) 55 { 56 $('#updateTicket').attr('disabled','disabled') 57 } 58 else 59 { 60 $('#updateTicket').prop('disabled',false) 61 } 62 }, 63 64 bindMessageArea: function () { 65 $(document).on('keyup', '.js-add-message', function () { 66 if($(this).val().length > 0) { 67 $('#NotEmpty-supportTicketForm-message').hide(); 68 } 69 ACC.customerticketingaddon.toggleSubmitButton(); 70 }); 71 }, 72 73 toggleAllMessages: function() { 74 $('#ct-toggle-all-messages').on('click touchstart', function() { 75 $('.cts-msg-history-item:not(.ct-msg-visible)').show(); 76 $(this).hide(); 77 }); 78 }, 79 80 postNewMessage: function () { 81 var title = $('#ct-overlay-title').html(); 82 $('.ct-add-new-msg-btn').on('click touchstart', function(e) { 83 e.preventDefault(); 84 $.colorbox({ 85 href: "#ct-add-new-msg", 86 maxWidth:"100%", 87 width: 525, 88 opacity:0.7, 89 title: title, 90 inline: true, 91 close: '<span class="glyphicon glyphicon-remove"></span>', 92 onOpen: function () { 93 $('#ct-add-new-msg').fadeIn(); 94 }, 95 onComplete: function () { 96 ACC.customerticketingaddon.disableMessage($('.js-add-message-status')); 97 98 if (!$("#message").val().trim()) { 99 $('button[id="updateTicket"]').attr('disabled', 'disabled'); 100 } 101 102 ACC.csvimport.changeFileUploadAppearance(); 103 }, 104 onCleanup: function () { 105 $('#ct-add-new-msg').hide(); 106 } 107 }); 108 }); 109 }, 110 111 isSelectedFilesValid: function (selectedFiles) { 112 if (window.File && window.Blob) { 113 var fileMaxSize = $('.js-file-upload__input').data('max-upload-size'); 114 var totalSize = 0; 115 116 for (var i = 0; i < selectedFiles.files.length; ++i){ 117 totalSize += selectedFiles.files[i].size; 118 } 119 120 if (!isNaN(fileMaxSize) && !isNaN(parseFloat(fileMaxSize)) && totalSize > parseFloat(fileMaxSize)) { 121 return false;
122 } 123 } 124 125 return true; 126 }, 127 128 displayCustomerTicketingAlert: function (options) { 129 var alertTemplateSelector; 130 131 switch (options.type) { 132 case 'error': 133 alertTemplateSelector = '#global-alert-danger-template'; 134 break; 135 case 'warning': 136 alertTemplateSelector = '#global-alert-warning-template'; 137 break; 138 default: 139 alertTemplateSelector = '#global-alert-info-template'; 140 } 141 142 if (typeof options.message !== 'undefined') { 143 $('#customer-ticketing-alerts').append($(alertTemplateSelector).tmpl({message: options.message})); 144 } 145 146 if (typeof options.messageId !== 'undefined') { 147 $('#customer-ticketing-alerts').append($(alertTemplateSelector).tmpl({message: $('#' + options.messageId).text()})); 148 } 149 }, 150 151 displayGlobalAlert: function (options) { 152 var alertTemplateSelector; 153 154 switch (options.type) { 155 case 'error': 156 alertTemplateSelector = '#global-alert-danger-template'; 157 break; 158 case 'warning': 159 alertTemplateSelector = '#global-alert-warning-template'; 160 break; 161 default: 162 alertTemplateSelector = '#global-alert-info-template'; 163 } 164 165 if (typeof options.message !== 'undefined') { 166 $('#global-alerts').append($(alertTemplateSelector).tmpl({message: options.message})); 167 } 168 169 if (typeof options.messageId !== 'undefined') { 170 $('#global-alerts').append($(alertTemplateSelector).tmpl({message: $('#' + options.messageId).text()})); 171 } 172 }, 173 174 bindTicketAddActions: function () { 175 $(document).on('click', '#addTicket', 176 function (event) { 177 event.preventDefault(); 178 $('#addTicket').prop('disabled',true); 179 ACC.customerticketingaddon.formPostAction("support-tickets?ticketAdded=true"); 180 }); 181 }, 182 183 bindTicketUpdateActions: function () { 184 $(document).on('click', '#updateTicket', 185 function (event) { 186 event.preventDefault(); 187 $('#updateTicket').prop('disabled',true); 188 ACC.customerticketingaddon.formPostAction('?ticketUpdated=true'); 189 }); 190 }, 191 192 formPostAction: function (successRedirectUrl) { 193 194 ACC.customerticketingaddon.clearAlerts(); 195 196 var form = document.getElementById("supportTicketForm"); 197 var formData = new window.FormData(form); 198 var associatedTo = formData.get('associatedTo'); 199 200 if (associatedTo !== null && !(associatedTo.includes('Cart') || associatedTo.includes('Order'))) { 201 formData.delete('associatedTo'); 202 } 203 204 var selectedFile = document.getElementById('attachmentFiles'); 205 if (!ACC.customerticketingaddon.isSelectedFilesValid(selectedFile)) { 206 ACC.customerticketingaddon.displayCustomerTicketingAlert({ 207 type: 'error', 208 messageId: 'attachment-file-max-size-exceeded-error-message' 209 }); 210 $(form).find(':submit').prop('disabled',false); 211 return; 212 } 213 214 $.ajax({ 215 url: form.action, 216 type: 'POST', 217 data: formData, 218 contentType: false, 219 processData: false, 220 success: function () { 221 window.location.replace(successRedirectUrl); 222 }, 223 error: function (jqXHR) { 224 $(form).find(':submit').prop('disabled',false); 225 ACC.customerticketingaddon.processErrorResponse(jqXHR); 226 } 227 }); 228 }, 229 230 processErrorResponse: function (jqXHR) { 231 ACC.customerticketingaddon.clearAlerts(); 232 if (jqXHR.status === 400 && jqXHR.responseJSON) { 233 234 $.each(jqXHR.responseJSON, function() { 235 $.each(this, function(k, v) { 236 var target = '#' + k; 237 $(target).show(); 238 $(target).text(v); 239 if (k === 'NotEmpty-supportTicketForm-subject' 240 || k === 'Size-supportTicketForm-subject' 241 || k === 'NotEmpty-supportTicketForm-message' 242 || k === 'Size-supportTicketForm-message') { 243 ACC.customerticketingaddon.addHasErrorClass(); 244 } 245 else { 246 ACC.customerticketingaddon.displayGlobalAlert({type: 'error', message: v}); 247 } 248 }); 249 }); 250 251 return; 252 } 253 254 ACC.customerticketingaddon.displayCustomerTicketingAlert({type: 'error', messageId: 'supporttickets-tryLater'}); 255 }, 256 257 addHasErrorClass: function () { 258 $('#createTicket-message').parent().addClass('has-error'); 259 }, 260 261 clearAlerts: function () { 262 $('#customer-ticketing-alerts').empty(); 263 $('#global-alerts').empty(); 264 $('#NotEmpty-supportTicketForm-subject').hide(); 265 $('#Size-supportTicketForm-message').hide(); 266 $('#Size-supportTicketForm-subject').hide(); 267 $('#createTicket-subject').parent().removeClass('has-error'); 268 $('#NotEmpty-supportTicketForm-message').hide(); 269 $('#createTicket-message').parent().removeClass('has-error'); 270 } 271};
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.