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