@@ -1,11 +1,218 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Code for the forum family of pages. Requires fossil.X where X is
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (copybutton, pikchr, confirmer, attach, tabs).
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1 5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(function(F/*the fossil object*/){
2 6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"use strict";
3 7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* JS code for /forumpost and friends. Requires fossil.dom
4 8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
and can optionally use fossil.pikchr. */
5 9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const P = F.page, D = F.dom;
6 10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let idCounter = 0;
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ A WIP forum post editor widget for both new posts and responses.
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class ForumPostEditor {
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Options */
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #opt;
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Dom elements */
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #e;
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Attacher */
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #att;
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Is waiting on a pending remote response. */
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #isWaiting = false;
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* F.TabManager */
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #tabs;
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Elements to disable while an XHR is pending. */
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #toDisable = [];
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* DOM element of the current active tab. */
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #activeTab;
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ constructor(opt){
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ opt = this.#opt = F.nu({
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // todo: defaults once we determine the options
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // replyTo: hash
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // edit: hash
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }, opt);
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ opt.isNew = !opt.edit && !opt.replyTo;
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const e = this.#e = F.nu({
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype: F.nu(),
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ button: F.nu()
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const wrapper = e.widget = D.addClass(D.div(), 'ForumPostEditor');
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.clearElement(wrapper);
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !opt.inReplyTo ){
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.titleBar = D.addClass(D.div(),'titlebar');
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.title = D.addClass(D.input('text'), 'title');
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.titleBar.append(
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(D.span(), "Title:"),
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.title
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wrapper.append(e.titleBar);
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.mimetype.wrapper = D.addClass(D.div(), 'mimetype-wrapper');
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.mimetype.select = D.addClass(D.select(), 'mimetype-select');
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.mimetype.label = D.span();
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.mimetype.label.append(
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.a(F.repoUrl('markup_help'), 'Markup style'),
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ':'
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.mimetype.wrapper.append(e.mimetype.label, e.mimetype.select);
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let i = 0;
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(const [k,v] of Object.entries({
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'text/x-markdown': 'Markdown',
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'text/x-fossil-wiki': 'Fossil Wiki',
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'text/plain': 'Plain text'
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })) {
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const o = D.option(e.mimetype.select, k, v);
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !i++ ) o.setAttribute('selected', '');
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.button.preview = D.button("Preview", e=>this.#preview());
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.button.submit = D.button("Submit", e=>this.#submit());
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.button.submit.setAttribute('disabled', '');
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.buttons = D.addClass(D.div(), 'buttons');
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wrapper.append(e.buttons);
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.err = D.addClass(D.div(), 'error', 'hidden');
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wrapper.append(e.err);
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.err.addEventListener('dblclick',()=>this.reportError());
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const idPrefix = 'FormPostEditor'+(++idCounter)/* TabManager requires IDs */;
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { /* Tabs... */
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.tabs = D.attr(
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.addClass(D.div(), 'tab-container'),
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'id', idPrefix+'-tabs'
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#tabs = new F.TabManager(e.tabs);
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wrapper.append( e.tabs );
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.tabEdit = D.div();
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.tabEdit.classList.add('editor-wrapper');
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.editor = D.attr(
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.addClass(D.textarea(), 'editor'),
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'placeholder',
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'Your content...'
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.tabEdit.append(e.editor);
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.tabEdit.dataset.tabLabel = 'Edit';
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#tabs.addTab( e.tabEdit );
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.preview = D.addClass(D.div(), 'preview');
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.preview.dataset.tabLabel = 'Preview';
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#tabs.addTab( e.preview );
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#tabs.addEventListener('before-switch-to', (ev)=>{
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#activeTab = ev.detail;
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( e.preview === this.#activeTab ){
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#e.button.preview.click();
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( F.user.enableDebug ){
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.debug = D.addClass(D.div(), 'debug');
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.debug.dataset.tabLabel = 'Debug';
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.debug.setAttribute('id', idPrefix+'-debug');
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(const [k,v] of Object.entries({
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dryrun: 'Dry run',
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ domod: 'Require moderation approval',
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ showqp: 'Show query parameters',
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fpsilent: 'Do not send notification emails'
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })){
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const lbl = D.label(false, v);
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lbl.prepend(D.checkbox(k));
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.debug.append(lbl);
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#tabs.addTab(e.debug);
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.buttons.append(e.mimetype.wrapper);
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( F.user.mayAttachForum ){
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#att = new F.Attacher({
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ addButtonLabel: 'Attach'
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.buttons.append( e.button.addAttach = this.#att.takeAddButton() );
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#toDisable.push( e.button.addAttach );
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.buttons.append(e.button.preview, e.button.submit);
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#toDisable.push(e.button.preview);
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( this.#att ){
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wrapper.append(this.#att.widget);
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }/*constructor*/
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ get widget(){
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this.#e.widget;
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Reports an error by appending each argument to the error widget
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and unhiding it. If passed no arugments, it clears and hides
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the error widget.
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportError(...msg){
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const e = this.#e.err;
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.clearElement(e);
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( msg.length ){
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.classList.remove('hidden');
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.append(...msg);
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.classList.add('hidden');
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ async #fetchPreview(){
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* TODO: fetch preview */
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#isWaiting = false;
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.enable(this.#toDisable);
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ async #preview(){
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( this.#isWaiting ) return;
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const e = this.#e;
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( e.preview !== this.#activeTab ){
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#tabs.switchToTab(e.preview);
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Will recurse into here */
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#isWaiting = true;
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.disable(this.#toDisable, e.button.submit);
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.preview.textContent = "Fetching preview...";
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#fetchPreview()
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .then(()=>{
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.preview.textContent = "TODO: actually fetch the preview "+Date.now();
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.enable(this.#toDisable, e.button.submit);
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .catch(e=>{
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.reportError(e.message);
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.enable(this.#toDisable);
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #submit(){
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( this.#isWaiting ) return;
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.#isWaiting = true;
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const e = this.#e;
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.disable(e.button.submit);
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TODO: save it, set #isWaiting=false, then handle error or
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ redirect to the post (if this is a new post) or, if replying
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inline, replace this object with a static rendering from the
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ response.
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ async #fetchPost(){
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TODO: when editing an existing post, fetch the raw body of the
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ post and populate this.e.
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }/*ForumPostEditor*/;
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.ForumPostEditor = ForumPostEditor;
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
7 214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
8 215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
When the page is loaded, this handler does the following:
9 216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
10 217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Installs expand/collapse UI elements on "long" posts and collapses
11 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
them.
12 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!