1/** 2 * Inline Editor 3 */ 4var InlineEditor = function ($table) { 5 6 7 $table.on('dblclick', 'td', function (e) { 8 e.preventDefault(); 9 e.stopPropagation(); 10 11 var $self = jQuery(this); 12 var pid = $self.parent().data('pid'); 13 var rid = $self.parent().data('rid'); 14 var rev = $self.parent().data('rev'); 15 var field = $self.parent().data('field') || 16 $self.parents('table').find('tr th').eq($self.index()).data('field'); 17 18 if ((!pid && !rid) || !field) return; 19 20 // prepare the edit overlay 21 var $div = jQuery('<div class="struct_inlineditor"><form></form><div class="err"></div></div>'); 22 var $form = $div.find('form'); 23 var $errors = $div.find('div.err').hide(); 24 var $save = jQuery('<button type="submit">Save</button>'); 25 var $cancel = jQuery('<button>Cancel</button>'); 26 $form.append(jQuery('<input type="hidden" name="pid">').val(pid)); 27 $form.append(jQuery('<input type="hidden" name="rid">').val(rid)); 28 $form.append(jQuery('<input type="hidden" name="rev">').val(rev)); 29 $form.append(jQuery('<input type="hidden" name="field">').val(field)); 30 $form.append('<input type="hidden" name="call" value="plugin_struct_inline_save">'); 31 $form.append(jQuery('<div class="ctl">').append($save).append($cancel)); 32 33 /** 34 * load the editor 35 */ 36 jQuery.post( 37 DOKU_BASE + 'lib/exe/ajax.php', 38 { 39 call: 'plugin_struct_inline_editor', 40 pid: pid, 41 rid: rid, 42 rev: rev, 43 field: field 44 }, 45 function (data) { 46 if (!data) return; // we're done 47 48 $form.prepend(data); 49 50 // show 51 $self.closest('.dokuwiki').append($div); 52 $div.position({ 53 my: 'left top', 54 at: 'left top', 55 of: $self 56 }); 57 58 // attach entry handlers to the inline form 59 EntryEditor($form); 60 61 // focus first input 62 $form.find('input, textarea').first().focus(); 63 } 64 ); 65 66 /** 67 * Save the data, then close the form 68 */ 69 $form.submit(function (e) { 70 e.preventDefault(); 71 jQuery.post( 72 DOKU_BASE + 'lib/exe/ajax.php', 73 $form.serialize() 74 ) 75 .done(function (data) { 76 // save succeeded, display new value, update revision data and close editor 77 const saved = JSON.parse(data); 78 $self.html(saved['value']); 79 $self.parent().data('rev', saved['rev']); 80 $div.remove(); 81 // sums are now out of date - remove them til page is reloaded 82 $self.parents('table').find('tr.summarize').remove(); 83 }) 84 .fail(function (data) { 85 // something went wrong, display error 86 $errors.text(data.responseText).show(); 87 }) 88 ; 89 90 91 }); 92 93 /** 94 * Close the editor without saving 95 */ 96 $cancel.click(function (e) { 97 // unlock page 98 jQuery.post( 99 DOKU_BASE + 'lib/exe/ajax.php', 100 { 101 call: 'plugin_struct_inline_cancel', 102 pid: pid 103 } 104 ); 105 106 e.preventDefault(); 107 $div.remove(); 108 }); 109 }); 110 111}; 112