PluginProbe
TablePress – Tables in WordPress made easy / 2.1.7
TablePress – Tables in WordPress made easy v2.1.7
3.3.4 3.3.3 3.3.2 3.3.1 trunk 1.12 1.14 1.9.2 2.0.4 2.1.7 2.1.8 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.3 2.3.1 2.3.2 2.4 2.4.1 2.4.2 2.4.3 2.4.4 All 44 releases
tablepress / admin / js / import.js

import.js in TablePress – Tables in WordPress made easy 2.1.7, at admin/js/import.js

143 lines 6.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * JavaScript code for the "Import" screen.
3 *
4 * @package TablePress
5 * @subpackage Views JavaScript
6 * @author Tobias Bäthge
7 * @since 1.0.0
8 */
9
10 /* globals jSuites */
11
12 /**
13 * WordPress dependencies.
14 */
15 import { __, _n, sprintf } from '@wordpress/i18n';
16
17 /**
18 * Internal dependencies.
19 */
20 import { $ } from './_common-functions';
21
22 const data = {
23 source: '',
24 type: '',
25 };
26
27 const $import_form = $( '#tablepress_import-import-form' );
28 const $tables_import_file_upload_field = $( '#tables-import-file-upload' );
29 const $tables_import_file_upload_field_dropzone = $( '#tables-import-file-upload-dropzone' );
30 const $tables_import_server_field = $( '#tables-import-server' ); // The input field only exists for admins!
31 const $import_existing_table_dropdown = $( '#tables-import-existing-table' );
32
33 /**
34 * Progressively enhance the "Table to replace or append to" HTML select field with live-search and auto-complete.
35 *
36 * @since 2.0.0
37 */
38 jSuites.dropdown( $import_existing_table_dropdown, {
39 autocomplete: true,
40 placeholder: $import_existing_table_dropdown.options[0].textContent,
41 } );
42
43 /**
44 * Set state of visible form elements depending on selected options.
45 *
46 * @since 2.0.0
47 */
48 $import_form.addEventListener( 'change', () => {
49 data.source = document.querySelector( '#row-import-source input:checked' ).value;
50 data.type = document.querySelector( '#row-import-type input:checked' ).value;
51
52 // Don't show validation :invalid CSS pseudo-selector highlighting, but only when the user wants to submit the form.
53 $import_form.classList.add( 'no-validation-highlighting' );
54 // Reset validation messages after a change to a form field was made.
55 $tables_import_server_field?.setCustomValidity( '' ); // The input field only exists for admins!
56 $import_existing_table_dropdown.previousElementSibling.querySelector( '.jdropdown-header' ).setCustomValidity( '' ); // Use the jSuites dropdown input field, as the actual <select> is hidden.
57
58 // Show the correct input field section depending on the chosen import source. Set the contained form field to required.
59 [ 'file-upload', 'url', 'server', 'form-field' ].forEach( ( source ) => {
60 $( `#row-import-source-${ source }` ).style.display = ( source === data.source ) ? 'table-row' : 'none';
61 $( `#tables-import-${ source }` ).required = ( source === data.source );
62 } );
63 // Only make the URL field a URL field if URL is the selected import source, to prevent validation errors.
64 $( '#tables-import-url' ).type = ( 'url' === data.source ) ? 'url' : 'text';
65
66 // Disable the existing table dropdown when adding new tables, or when uploading more than one file, or when uploading a ZIP file.
67 const dropdown_disabled = ( 'add' === data.type ||
68 (
69 'file-upload' === data.source &&
70 (
71 1 < $tables_import_file_upload_field?.files?.length ||
72 ( 1 === $tables_import_file_upload_field?.files?.length && $tables_import_file_upload_field?.files?.[0].name.endsWith( '.zip' ) )
73 )
74 )
75 );
76 $import_existing_table_dropdown.disabled = dropdown_disabled;
77 $import_existing_table_dropdown.previousElementSibling.classList.toggle( 'disabled', dropdown_disabled ); // Disable the artificial dropdown via a class, as it can not use :disabled.
78 } );
79 document.querySelector( '#row-import-source input:checked' ).dispatchEvent( new Event( 'change', { bubbles: true } ) ); // Trigger the change handler on page load to initialize the form fields.
80
81 /**
82 * Add a list of selected files for the import from file upload.
83 *
84 * @since 2.0.0
85 */
86 $tables_import_file_upload_field.addEventListener( 'change', function( event) {
87 if ( event?.target?.files?.length > 0 ) {
88 $tables_import_file_upload_field_dropzone.innerHTML = `<span>${ sprintf( _n( 'You have selected %1$d file:', 'You have selected %1$d files:', event.target.files.length, 'tablepress' ), event.target.files.length ) }</span>`;
89 [ ...event.target.files ].forEach( ( file ) => {
90 const $file_span = document.createElement( 'span' );
91 $file_span.textContent = file.name;
92 $tables_import_file_upload_field_dropzone.appendChild( $file_span );
93 } );
94 } else {
95 $tables_import_file_upload_field_dropzone.innerHTML = `<span>${ __( 'Click to select a file, or drag it here.', 'tablepress' ) }</span>`;
96 }
97 } );
98
99 /**
100 * Visualize when files are dragged over the file upload drop zone.
101 *
102 * @since 2.0.0
103 */
104 $tables_import_file_upload_field.addEventListener( 'dragenter', function() {
105 $tables_import_file_upload_field_dropzone.classList.add( 'dragover' );
106 } );
107 $tables_import_file_upload_field.addEventListener( 'dragleave', function() {
108 $tables_import_file_upload_field_dropzone.classList.remove( 'dragover' );
109 } );
110
111 /**
112 * Check, whether special form elements are valid.
113 *
114 * The submit button's `click` event is used so that the validation warnings can be shown.
115 * This does not work when using the form's `submit` event.
116 *
117 * @since 2.0.0
118 */
119 $( '#import-submit-button' ).addEventListener( 'click', () => {
120 // Show validation :invalid CSS pseudo-selector highlighting.
121 $import_form.classList.remove( 'no-validation-highlighting' );
122
123 // When importing from the server, the value must have been changed from the default (normally ABSPATH). The input field only exists for admins!
124 if ( 'server' === data.source && $tables_import_server_field ) {
125 if ( $tables_import_server_field.defaultValue === $tables_import_server_field.value ) {
126 $tables_import_server_field.setCustomValidity( __( 'You must specify a path to a file on the server.', 'tablepress' ) );
127 }
128 }
129
130 // If replace or append is selected while a single non-ZIP file is to be uploaded, a table must be selected.
131 if ( ( 'replace' === data.type || 'append' === data.type ) &&
132 (
133 'file-upload' !== data.source ||
134 ( 1 === $tables_import_file_upload_field?.files?.length && ! $tables_import_file_upload_field?.files?.[0].name.endsWith( '.zip' ) )
135 )
136 ) {
137 // The "- Select or type -" entry has an empty string as its value.
138 if ( '' === $import_existing_table_dropdown.value ) {
139 $import_existing_table_dropdown.previousElementSibling.querySelector( '.jdropdown-header' ).setCustomValidity( __( 'You must select a table.', 'tablepress' ) ); // Use the jSuites dropdown input field, as the actual <select> is hidden.
140 }
141 }
142 } );
143