PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 2.0.24
Advanced Ads – Ad Manager & AdSense v2.0.24
2.0.24 2.0.23 2.0.22 2.0.21 1.38.0 1.39.0 1.39.1 1.39.2 1.39.3 1.39.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.40.0 1.40.1 1.40.2 1.41.0 1.42.0 1.42.1 1.42.2 1.43.0 1.44.0 1.44.1 1.45.0 1.45.1 1.46.0 1.47.0 1.47.1 1.47.2 1.47.3 1.47.4 1.47.5 1.48.0 1.48.1 1.49.0 1.5.0 1.5.0.1 1.5.1 1.5.2 1.5.2.1 1.5.4 1.5.4.1 1.5.5 1.50.0 1.51.0 1.51.1 1.51.2 1.51.3 1.52.0 1.52.1 1.52.2 1.52.3 1.52.4 1.53.0 1.53.1 1.53.2 1.54.0 1.54.1 1.55.0 1.56.0 1.56.1 1.56.2 1.56.3 1.56.4 1.6 1.6.1 1.6.10 1.6.10.1 1.6.10.2 1.6.11 1.6.11.1 1.6.12 1.6.13 1.6.14 1.6.15 1.6.16 1.6.17 1.6.17.1 1.6.17.2 1.6.2 1.6.2.1 1.6.3 1.6.4 1.6.4.1 1.6.5 1.6.6 1.6.6.1 1.6.7 1.6.7.1 1.6.8 1.6.8.1 1.6.8.2 1.6.8.3 1.6.9 1.6.9.1 1.6.9.2 1.6.9.3 1.6.9.4 1.7 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.1.1 1.7.1.2 1.7.1.3 1.7.1.4 1.7.1.5 1.7.10 trunk 1.7.11 1.0.1 1.7.12 1.0.2 1.7.13 1.0.3 1.7.14 1.1.0 1.7.15 1.1.1 1.7.16 1.1.2 1.7.17 1.1.3 1.7.18 1.10 1.7.19 1.10.1 1.7.2 1.10.10 1.7.2.1 1.10.11 1.7.20 1.10.12 1.7.21 1.10.2 1.7.22 1.10.3 1.7.23 1.10.4 1.7.24 1.10.5 1.7.25 1.10.6 1.7.3 1.10.7 1.7.4 1.10.8 1.7.4.1 1.10.9 1.7.4.2 1.11 1.7.4.3 1.11.1 1.7.4.4 1.11.2 1.7.4.5 1.12 1.7.5 1.13 1.7.5.1 1.13.1 1.7.6 1.13.2 1.7.7 1.13.3 1.7.8 1.13.4 1.7.9 1.13.5 1.7.9.1 1.13.6 1.7.9.2 1.13.7 1.7.9.3 1.13.8 1.8 1.14 1.8.1 1.14.1 1.8.10 1.14.10 1.8.11 1.14.11 1.8.12 1.14.2 1.8.13 1.14.3 1.8.14 1.14.4 1.8.15 1.14.5 1.8.16 1.14.6 1.8.17 1.14.7 1.8.18 1.14.8 1.8.19 1.14.9 1.8.2 1.15 1.8.20 1.16 1.8.21 1.16.1 1.8.22 1.17 1.8.23 1.17.1 1.8.24 1.17.10 1.8.25 1.17.10-rc.1 1.8.26 1.17.11 1.8.27 1.17.12 1.8.28 1.17.12-rc.1 1.8.29 1.17.2 1.8.3 1.17.3 1.8.30 1.17.4 1.8.4 1.17.5 1.8.5 1.17.6 1.8.6 1.17.7 1.8.7 1.17.8 1.8.8 1.17.9 1.8.9 1.17.9-beta.1 1.9 1.18.0 2.0.0 1.19.0 2.0.1 1.19.1 2.0.10 1.2 2.0.11 1.2.1 2.0.12 1.2.2 2.0.13 1.2.3 2.0.14 1.2.4 2.0.15 1.2.5 2.0.16 1.2.6 2.0.17 1.2.7 2.0.18 1.20.0 2.0.19 1.20.0-rc.1 2.0.2 1.20.0-rc.2 2.0.20 1.20.1 2.0.3 1.20.2 2.0.4 1.20.3 2.0.5 1.21.0 2.0.6 1.21.1 2.0.7 1.22.0 2.0.8 1.22.1 2.0.9 1.22.2 1.23.0 1.23.1 1.23.2 1.24.0 1.24.1 1.24.2 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.29.0 1.29.1 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1.3.16 1.3.17 1.3.18 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.30.0 1.30.1 1.30.2 1.30.2-rc.1 1.30.3 1.30.4 1.30.4-rc.1 1.30.5 1.31.0 1.31.1 1.32.0 1.32.0-rc.1 1.33.0 1.33.1 1.33.2 1.34.0 1.35.0 1.35.1 1.36.0 1.36.1 1.36.2 1.36.3 1.37.0 1.37.1 1.37.2
advanced-ads / src / admin / screen-support / submit-ticket.js
advanced-ads / src / admin / screen-support Last commit date
autocomplete.js 3 months ago submit-ticket.js 3 months ago support.css 3 months ago support.js 3 months ago
submit-ticket.js
124 lines
1 import { createToast } from '@advancedAds/utils';
2 import { FileUploader } from '../partials/file-uploader';
3
4 /**
5 * Helper to convert Base64 string from the library into a File Blob
6 *
7 * @param {string} dataUrl attachment url.
8 */
9 function base64ToBlob( dataUrl ) {
10 const [ header, base64 ] = dataUrl.split( ',' );
11 const mime = header.match( /:(.*?);/ )[ 1 ];
12 const binary = atob( base64 );
13 const array = [];
14 for ( let i = 0; i < binary.length; i++ ) {
15 array.push( binary.charCodeAt( i ) );
16 }
17 return new Blob( [ new Uint8Array( array ) ], { type: mime } );
18 }
19
20 function submitFormToAPI( form, uploader ) {
21 const formData = new FormData( form );
22 const data = Object.fromEntries( formData );
23
24 const selectedFiles = uploader.selectedFiles || [];
25 const hasFiles = selectedFiles.length > 0;
26
27 let submitBody;
28 const headers = {};
29
30 // Cosmetics
31 const button = form.querySelector( 'button[type="submit"]' );
32 button.classList.add( 'submitting' );
33
34 // Use multipart/form-data for file upload
35 if ( hasFiles ) {
36 const submitFormData = new FormData();
37 for ( const [ key, value ] of Object.entries( data ) ) {
38 submitFormData.append( key, value );
39 }
40
41 // Append all files
42 selectedFiles.forEach( ( fileObj ) => {
43 const blob = base64ToBlob( fileObj.fileimage );
44 submitFormData.append( 'attachments[]', blob, fileObj.filename );
45 } );
46 submitBody = submitFormData;
47 // Do NOT set content-type, browser will set it with multipart boundary
48 } else {
49 // No files, send as JSON
50 submitBody = JSON.stringify( data );
51 headers[ 'Content-Type' ] = 'application/json';
52 }
53
54 fetch( 'https://wpadvancedads.com/wp-json/advanced-ads/v1/create-ticket', {
55 method: 'POST',
56 body: submitBody,
57 headers,
58 } )
59 .then( ( response ) => {
60 if ( response.ok ) {
61 uploader.reset();
62 form.querySelector( '.advads-dialog-button-close' ).click();
63 createToast( {
64 type: 'muted',
65 iconType: 'success',
66 title: 'Ticket submitted',
67 message: 'Your ticket has been submitted successfully',
68 } );
69 } else {
70 throw new Error( 'Failed to submit form' );
71 }
72 } )
73 .catch( ( error ) => {
74 // Ideally replace this with user feedback instead of console.error in production
75 // eslint-disable-next-line no-console
76 createToast( {
77 type: 'error',
78 title: 'Failed to submit form',
79 message: error.message,
80 inDialog: true,
81 } );
82 } )
83 .finally( () => {
84 button.classList.remove( 'submitting' );
85 } );
86 }
87
88 export function ticketForm() {
89 const form = document.querySelector( '.advads-dialog-create-ticket form' );
90 const uploader = new FileUploader(
91 document.getElementById( 'attachments-container' ),
92 document.getElementById( 'attachments' )
93 );
94
95 form.addEventListener( 'submit', function ( e ) {
96 e.preventDefault();
97
98 const fields = this.querySelectorAll( '.advads-field' );
99 let isValid = true;
100
101 fields.forEach( ( field ) => {
102 const input = field.querySelector( 'input, select, textarea' );
103 if ( input && ! input.checkValidity() ) {
104 field.classList.add( 'invalid' );
105 isValid = false;
106 } else {
107 field.classList.remove( 'invalid' );
108 }
109 } );
110
111 if ( ! isValid ) {
112 return;
113 }
114
115 submitFormToAPI( form, uploader );
116 } );
117
118 form.querySelectorAll( 'input, select, textarea' ).forEach( ( field ) => {
119 field.addEventListener( 'input', function () {
120 field.closest( '.advads-field' ).classList.remove( 'invalid' );
121 } );
122 } );
123 }
124