PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / custom-post-types / js / many-items.js
jetpack / modules / custom-post-types / js Last commit date
many-items.js 1 year ago menu-checkboxes.js 1 year ago nova-drag-drop.js 5 years ago
many-items.js
145 lines
1 ( function () {
2 let menuSelector, nonceInput;
3 const initializedTables = new Set();
4
5 const methods = {
6 init: function ( table ) {
7 let tbody = table.lastElementChild;
8 while ( tbody && tbody.tagName !== 'TBODY' ) {
9 tbody = tbody.previousElementSibling;
10 }
11 const row = tbody.querySelector( 'tr:first-child' ).cloneNode( true );
12
13 table.dataset.form = table.closest( 'form' );
14 table.dataset.tbody = tbody;
15 table.dataset.row = row;
16 table.dataset.currentRow = row;
17
18 menuSelector = document.getElementById( 'nova-menu-tax' );
19 nonceInput = document.getElementById( '_wpnonce' );
20
21 table.addEventListener( 'keypress', function ( event ) {
22 if ( event.which !== 13 ) return;
23
24 event.preventDefault();
25 if ( typeof FormData === 'function' ) {
26 methods.submitRow.call( table );
27 }
28 methods.addRow.call( table );
29 } );
30
31 table.addEventListener( 'focusin', function ( event ) {
32 if ( event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA' ) {
33 table.dataset.currentRow = event.target.closest( 'tr' );
34 }
35 } );
36
37 initializedTables.add( table );
38 return table;
39 },
40
41 destroy: function ( table ) {
42 if ( this.observer ) {
43 this.observer.disconnect();
44 }
45 table.removeEventListener( 'keypress', methods.keypressHandler );
46 table.removeEventListener( 'focusin', methods.focusinHandler );
47 initializedTables.delete( table );
48 return table;
49 },
50
51 submitRow: function ( table ) {
52 const submittedRow = table.dataset.currentRow;
53 const currentInputs = submittedRow.querySelectorAll( 'input, textarea, select' );
54 const form = document.querySelector( table.dataset.form );
55 const allInputs = Array.from( form.querySelectorAll( 'input, textarea, select' ) );
56
57 currentInputs.forEach( input => ( input.disabled = true ) );
58 allInputs
59 .filter( input => ! currentInputs.includes( input ) )
60 .forEach( input => ( input.disabled = true ) );
61
62 const partialFormData = new FormData( form );
63 partialFormData.append( 'ajax', '1' );
64 partialFormData.append( 'nova_menu_tax', menuSelector.value );
65 partialFormData.append( '_wpnonce', nonceInput.value );
66
67 fetch( '', {
68 method: 'POST',
69 body: partialFormData,
70 } )
71 .then( response => response.text() )
72 .then( responseText => {
73 submittedRow.innerHTML = responseText;
74 } );
75
76 allInputs.forEach( input => ( input.disabled = false ) );
77
78 return table;
79 },
80
81 addRow: function ( table ) {
82 const row = table.dataset.row.cloneNode( true );
83
84 const tbody = table.dataset.tbody;
85 tbody.appendChild( row );
86
87 const firstInput = row.querySelector( 'input, textarea, select' );
88 if ( firstInput ) firstInput.focus();
89
90 return table;
91 },
92
93 clickAddRow: function ( table ) {
94 let tbody = table.lastElementChild;
95
96 while ( tbody && tbody.tagName !== 'TBODY' ) {
97 tbody = tbody.previousElementSibling;
98 }
99 const row = tbody.querySelector( 'tr:first-child' ).cloneNode( true );
100
101 row.querySelectorAll( 'input, textarea' ).forEach( input => {
102 input.value = '';
103 } );
104
105 tbody.appendChild( row );
106 },
107 };
108
109 const observeTableRemoval = function ( list ) {
110 const observer = new MutationObserver( mutations => {
111 mutations.forEach( mutation => {
112 mutation.removedNodes.forEach( node => {
113 if ( node.matches && node.matches( '.many-items-table' ) ) {
114 methods.destroy( node );
115 }
116 } );
117 } );
118 } );
119
120 observer.observe( list, { childList: true, subtree: true } );
121 };
122
123 // Initialization for many-items-table
124 document.addEventListener( 'focusin', event => {
125 const table = event.target.closest( '.many-items-table' );
126 if ( table && ! initializedTables.has( table ) ) {
127 methods.init( table );
128 }
129 } );
130
131 document.addEventListener( 'click', event => {
132 if ( event.target.matches( 'a.nova-new-row' ) ) {
133 const table = event.target.closest( '.many-items-table' );
134 if ( table ) {
135 event.preventDefault();
136 methods.clickAddRow( table );
137 }
138 }
139 } );
140 const list = document.querySelector( '#the-list' ); // Scope to the specific table
141 if ( list ) {
142 observeTableRemoval( list );
143 }
144 } )();
145