xref: /plugin/struct/script/InlineEditor.js (revision 24eec657c05b0d72bf071b3cc0551de15e9d5f32)
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