@@ -14,11 +14,11 @@
14 14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
checkin: UUID string,
15 15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isExe: bool,
16 16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mimetype: mimetype stringas determined by the fossil server.
17 17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
18 18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The fossil.page.value() method gets or sets the current file
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The fossil.page.fileContent() method gets or sets the current file
20 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
content for the page. Hypothetically, this can be overridden by
21 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
skin-level JS in order to use a custom 3rd-party editing widget
22 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
in place of the built-in textarea, but that is as yet untested.
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
In order to do so the client would need to replace DOM element
24 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#fileedit-content-editor with their custom widget.
@@ -206,10 +206,11 @@
206 206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
207 207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
delete this.init;
208 208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
209 209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}/*P.fileSelector*/;
210 210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
211 212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
212 213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Internal workaround to select the current preview mode
213 214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
and fire a change event if the value actually changes
214 215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
or if forceEvent is truthy.
215 216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -312,17 +313,24 @@
312 313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
P.e.btnCommit.addEventListener(
313 314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"click",(e)=>P.commit(), false
314 315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
315 316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.confirmer(P.e.btnReload, {
316 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
confirmText: "Really reload, losing edits?",
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- onconfirm: (e)=>P.loadFile(),
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ onconfirm: (e)=>P.unstashContent().loadFile(),
318 319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ticks: 3
319 320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
320 321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
E('#comment-toggle').addEventListener(
321 322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"click",(e)=>P.toggleCommentMode(), false
322 323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
323 324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ P.e.taEditor.addEventListener(
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'change', ()=>P.stashContentChange(), false
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ P.e.cbIsExe.addEventListener(
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'change', ()=>P.stashContentChange(true), false
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
324 332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
325 333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Cosmetic: jump through some hoops to enable/disable
326 334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
certain preview options depending on the current
327 335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
preview mode...
328 336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -367,10 +375,29 @@
367 375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
'fileedit-file-loaded',
368 376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(e)=>console.debug('fileedit-file-loaded ==>',e)
369 377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
370 378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
371 379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Tell the user about which storage is being used... */
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const storageMsgTarget = P.e.tabs.content;
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let storageMsg = D.addClass(D.div(),'flex-container','flex-row',
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'fileedit-hint');
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(F.storage.isTransient()){
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.addClass(storageMsg,'warning'),
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Warning: persistent storage is not avaible, "+
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "so unsaved edits "+
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "will not survive a page reload."
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ storageMsg,
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Current storage mechanism for local edits: "+
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.storage.storageImplName()
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ storageMsgTarget.insertBefore(storageMsg, storageMsgTarget.lastElementChild);
372 399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}, false)/*onload event handler*/;
373 400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
374 401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
375 402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Getter (if called with no args) or setter (if passed an arg) for
376 403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
the current file content. We use a function, rather than direct
@@ -379,15 +406,15 @@
379 406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
3rd-party editor widget.
380 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
381 408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
The setter form returns this object, and re-implementations must
382 409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
do the same.
383 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- P.value = function(){
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ P.fileContent = function(){
385 412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(0===arguments.length){
386 413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this.e.taEditor.value;
387 414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- this.e.taEditor.value = arguments[0];
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.e.taEditor.value = arguments[0] || '';
389 416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this;
390 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
391 418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
392 419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
393 420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
@@ -457,19 +484,23 @@
457 484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
458 485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
s.value = c;
459 486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e.taComment = s;
460 487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.addClass(h, 'hidden');
461 488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.removeClass(s, 'hidden');
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- console.debug(s,h);
463 489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
464 490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
465 491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
466 492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Returns true if fossil.page.finfo is set, indicating that a file
467 493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
has been loaded, else it reports an error and returns false.
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If passed a truthy value any error message about not having
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a file loaded is suppressed.
468 497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const affirmHasFile = function(){
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(!P.finfo) F.error("No file is loaded.");
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const affirmHasFile = function(quiet){
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!P.finfo){
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!quiet) F.error("No file is loaded.");
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
471 502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return !!P.finfo;
472 503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
473 504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
474 505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
475 506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
updateVersion() updates the filename and version in various UI
@@ -563,32 +594,52 @@
563 594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(0===arguments.length){
564 595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!affirmHasFile()) return this;
565 596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file = this.finfo.filename;
566 597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rev = this.finfo.checkin;
567 598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- delete this.finfo;
569 599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const self = this;
570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- F.message("Loading content...");
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- F.fetch('fileedit',{
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const onload = (r,headers)=>{
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ delete self.finfo;
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.updateVersion({
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ filename: file,
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ checkin: rev,
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isExe: ('x'===headers['x-fileedit-file-perm']),
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype: headers['content-type'].split(';').shift()
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.tabs.switchToTab(self.e.tabs.content);
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.e.cbIsExe.checked = self.finfo.isExe;
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.fileContent(r);
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.dispatchEvent('fileedit-file-loaded', self.finfo);
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const semiFinfo = {filename: file, checkin: rev};
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const stashFinfo = this.getStashedFinfo(semiFinfo);
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(stashFinfo){ // fake a response from the stash...
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.finfo = stashFinfo;
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.e.cbIsExe.checked = !!stashFinfo.isExe;
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ onload(this.contentFromStash()||'',{
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'x-fileedit-file-perm': stashFinfo.isExe ? 'x' : undefined,
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'content-type': stashFinfo.mimetype
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.message("Fetched from the local-edit stash:",
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.hashDigits(stashFinfo.checkin),
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stashFinfo.filename);
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this;
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.message(
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Loading content..."
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ).fetch('fileedit',{
572 630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
urlParams: {
573 631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ajax: 'content',
574 632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
filename:file,
575 633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
checkin:rev
576 634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
577 635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseHeaders: ['x-fileedit-file-perm', 'content-type'],
578 636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload:(r,headers)=>{
579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- F.message('Loaded content.');
580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- self.updateVersion({
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- filename: file,
582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- checkin: rev,
583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- isExe: ('x'===headers['x-fileedit-file-perm']),
584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mimetype: headers['content-type'].split(';').shift()
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- });
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- self.tabs.switchToTab(self.e.tabs.content);
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- self.e.cbIsExe.checked = self.finfo.isExe;
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- self.value(r);
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- self.dispatchEvent('fileedit-file-loaded', self.finfo);
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ onload(r,headers);
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.message('Loaded content for',
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.hashDigits(self.finfo.checkin),
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.finfo.filename);
590 641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
591 642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
592 643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this;
593 644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
594 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -606,11 +657,11 @@
606 657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const updateView = function(c){
607 658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.clearElement(target);
608 659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if('string'===typeof c) target.innerHTML = c;
609 660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(switchToTab) self.tabs.switchToTab(self.e.tabs.preview);
610 661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return this._postPreview(this.value(), updateView);
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this._postPreview(this.fileContent(), updateView);
612 663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
613 664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
614 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
615 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Callback for use with F.connectPagePreviewers()
616 667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -658,11 +709,11 @@
658 709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
659 710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Returns this object, noting that the operation is async.
660 711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
661 712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
P.diff = function f(sbs){
662 713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!affirmHasFile()) return this;
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const content = this.value(),
714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const content = this.fileContent(),
664 715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self = this;
665 716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!f.target){
666 717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.target = this.e.tabs.diff.querySelector(
667 718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
'#fileedit-tab-diff-wrapper'
668 719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
@@ -700,47 +751,47 @@
700 751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Returns this object.
701 752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
702 753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
P.commit = function f(){
703 754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!affirmHasFile()) return this;
704 755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const self = this;
705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const content = this.value(),
756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const content = this.fileContent(),
706 757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
target = document.querySelector('#fileedit-manifest'),
707 758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cbDryRun = E('[name=dry_run]'),
708 759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isDryRun = cbDryRun.checked,
709 760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
filename = this.finfo.filename;
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(!f.updateView){
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- f.updateView = function(c){
761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!f.onload){
762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.onload = function(c){
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const oldFinfo = JSON.parse(JSON.stringify(self.finfo))
712 764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
target.innerHTML = [
713 765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"<h3>Manifest",
714 766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(c.dryRun?" (dry run)":""),
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ": ", F.hashDigits(c.uuid),"</h3>",
767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ": ", F.hashDigits(c.checkin),"</h3>",
716 768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"<code class='fileedit-manifest'>",
717 769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
c.manifest,
718 770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"</code></pre>"
719 771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
].join('');
720 772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const msg = [
721 773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
'Committed',
722 774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
c.dryRun ? '(dry run)' : '',
723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- '[', F.hashDigits(c.uuid) ,'].'
775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ '[', F.hashDigits(c.checkin) ,'].'
724 776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
];
725 777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!c.dryRun){
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- msg.push('Re-activating dry-run mode.');
778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(0){
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ msg.push('Re-activating dry-run mode.');
780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cbDryRun.checked = true;
781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.unstashContent(oldFinfo);
783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ delete c.manifest;
784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.finfo = c;
727 785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.e.taComment.value = '';
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cbDryRun.checked = true;
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- self.finfo.filename = filename;
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- self.finfo.checkin = c.uuid;
731 786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.updateVersion();
732 787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.fileSelector.loadLeaves();
733 788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
734 789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.message.apply(F, msg);
735 790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.tabs.switchToTab(self.e.tabs.commit);
736 791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
737 792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(!content){
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- f.updateView('');
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return this;
741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
742 793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const fd = new FormData();
743 794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fd.append('filename',filename);
744 795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fd.append('checkin', this.finfo.checkin);
745 796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fd.append('content',content);
746 797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fd.append('dry_run',isDryRun ? 1 : 0);
@@ -762,11 +813,11 @@
762 813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
'allow_merge_conflict',
763 814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
'prefer_delta'
764 815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
].forEach(function(name){
765 816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var e = E('[name='+name+']');
766 817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(e){
767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(e.checked) fd.append(name, 1);
818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fd.append(name, e.checked ? 1 : 0);
768 819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
769 820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
console.error("Missing checkbox? name =",name);
770 821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
771 822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
772 823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.message(
@@ -773,11 +824,240 @@
773 824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"Checking in..."
774 825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
).fetch('fileedit',{
775 826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
urlParams: {ajax: 'commit'},
776 827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
payload: fd,
777 828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseType: 'json',
778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- onload: f.updateView
829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ onload: f.onload
779 830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
780 831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this;
781 832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $stash is an internal-use-only object for managing "stashed"
836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ local edits, to help avoid that users accidentally lose content
837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ by switching tabs or following links or some such. The basic
838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ theory of operation is...
839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ All "stashed" state is stored using fossil.storage.
841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - When the current file content is modified by the user, the
843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ current stathe of the current P.finfo and its the content
844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is stashed. For the built-in editor widget, "changes" is
845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ notified via a 'change' event. For a client-side custom
846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ widget, the client needs to call P.stashContentChange() when
847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ their widget triggers the equivalent of a 'change' event.
848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - For certain non-content updates (as of this writing, only the
850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is-executable checkbox), only the P.finfo stash entry is
851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ updated, not the content (unless the content has not yet been
852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stashed, in which case it is also stashed so that the stash
853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ always has matching pairs of finfo/content).
854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - When saving, the stashed entry for the previous version is removed
856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from the stash.
857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - When "loading", we use any stashed state for the given
859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ checkin/file combination. When forcing a re-load of content,
860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ any stashed entry for that combination is removed from the
861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stash.
862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - Every time P.stashContentChange() updates the stash, it is
864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pruned to $stash.prune.defaultMaxCount most-recently-updated
865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entries.
866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - This API often refers to "finfo objects." Those are objects
868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with a minimum of {checkin,filename} properties (which must be
869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ valid), and a combination of those two properties is used as
870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ basis for the stash keys for any given checkin/filename
871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ combination.
872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The structure of the stash is a bit convoluted for efficiency's
874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sake: we store a map of file info (finfo) objects separately from
875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ those files' contents because otherwise we would be required to
876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ JSONize/de-JSONize the file content when stashing/restoring it,
877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and that would be horribly inefficient (meaning "battery-consuming"
878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ on mobile devices).
879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const $stash = {
881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ keys: {
882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ index: F.page.name+':index'
883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ index: {
886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "CHECKIN_HASH:FILENAME": {file info w/o content}
887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ...
888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ In F.storage we...
891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - Store this.index under the key this.keys.index.
893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ - Store each file's content under the key
895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (P.name+'/CHECKIN_HASH:FILENAME'). These are stored separately
896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from the index entries to avoid having to JSONize/de-JSONize
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the content. The assumption/hope is that the browser can store
898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ those records "directly," without any intermediary
899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ encoding/decoding going on.
900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ indexKey: function(finfo){return finfo.checkin+':'+finfo.filename},
902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Returns the key for storing content for the given key suffix,
903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ by prepending P.name to suffix. */
904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contentKey: function(suffix){return P.name+'/'+suffix},
905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Returns the index object, fetching it from the stash or creating
906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ it anew on the first call. */
907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ getIndex: function(){
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!this.index) this.index = F.storage.getJSON(this.keys.index,{});
909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this.index;
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Returns the stashed version, if any, for the given finfo object.
913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ getFinfo: function(finfo){
915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const ndx = this.getIndex();
916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return ndx[this.indexKey(finfo)];
917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Serializes this object's index to F.storage. Returns this. */
919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ storeIndex: function(){
920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(this.index) F.storage.setJSON(this.keys.index,this.index);
921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this;
922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Updates the stash record for the given finfo
924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and (optionally) content. If passed 1 arg, only
925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the finfo stash is updated, else both the finfo
926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and its contents are (re-)stashed. Returns this.
927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ updateFile: function(finfo,content){
929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const ndx = this.getIndex(),
930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ key = this.indexKey(finfo);
931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const record = ndx[key] || (ndx[key]={
932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ checkin: finfo.checkin,
933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ filename: finfo.filename,
934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mimetype: finfo.mimetype
935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ record.isExe = !!finfo.isExe;
937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ record.stashTime = new Date().getTime();
938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.storeIndex();
939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(arguments.length>1){
940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.storage.set(this.contentKey(key), content);
941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this;
943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Returns the stashed content, if any, for the given finfo
946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ object.
947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stashedContent: function(finfo){
949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return F.storage.get(this.contentKey(this.indexKey(finfo)));
950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Returns true if we have stashed content for the given finfo
952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ record. */
953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ hasStashedContent: function(finfo){
954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return F.storage.contains(this.contentKey(this.indexKey(finfo)));
955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Unstashes the given finfo record and its content.
957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Returns this. */
958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unstash: function(finfo){
959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const ndx = this.getIndex(),
960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ key = this.indexKey(finfo);
961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ delete finfo.stashTime;
962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ delete ndx[key];
963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.storage.remove(this.contentKey(key));
964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this.storeIndex();
965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Clears all $stash entries from F.storage. Returns this.
968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ clear: function(){
970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const ndx = this.getIndex(),
971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self = this;
972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Object.keys(ndx).forEach(function(k){
973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const e = ndx[k];
974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ delete ndx[k];
975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.storage.remove(self.contentKey(k));
976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.storage.remove(this.keys.index);
978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ delete this.index;
979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this;
980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Removes all but the maxCount most-recently-updated stash
983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ entries, where maxCount defaults to this.prune.defaultMaxCount.
984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prune: function f(maxCount){
986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const ndx = this.getIndex();
987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const li = [];
988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!maxCount || maxCount<0) maxCount = f.defaultMaxCount;
989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Object.keys(ndx).forEach((k)=>li.push(ndx[k]));
990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ li.sort((l,r)=>l.stashTime - r.stashTime);
991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while(li.length>maxCount){
992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const e = li.shift();
993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.unstash(e);
994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.warn("Pruned oldest stash entry:",e);
995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $stash.prune.defaultMaxCount = 7;
999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
1001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Updates P.finfo for certain state and stashes P.finfo, with the
1002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ current content fetched via P.fileContent().
1003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If passed truthy AND the stash already has stashed content for
1005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the current file, only the stashed finfo record is updated, else
1006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ both the finfo and content are updated.
1007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ P.stashContentChange = function(onlyFinfo){
1009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(affirmHasFile(true)){
1010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const fi = this.finfo;
1011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fi.isExe = this.e.cbIsExe.checked;
1012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(onlyFinfo && $stash.hasStashedContent(fi)){
1013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $stash.updateFile(fi);
1014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $stash.updateFile(fi, P.fileContent());
1016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.message("Stashed change to",F.hashDigits(fi.checkin),fi.filename);
1018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $stash.prune();
1019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this;
1021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
1022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
1024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Removes any stashed state for the current P.finfo (if set) from
1025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.storage. Returns this.
1026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ P.unstashContent = function(){
1028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const finfo = arguments[0] || this.finfo;
1029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(finfo){
1030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $stash.unstash(finfo);
1031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //console.debug("Unstashed",finfo);
1032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.message("Unstashed",F.hashDigits(finfo.checkin),finfo.filename);
1033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this;
1035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
1036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
1038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Clears all stashed file state from F.storage. Returns this.
1039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ P.clearStash = function(){
1041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $stash.clear();
1042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this;
1043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
1044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
1046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If stashed content for P.finfo exists, it is returned, else
1047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ undefined is returned.
1048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ P.contentFromStash = function(){
1050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return affirmHasFile(true) ? $stash.stashedContent(this.finfo) : undefined;
1051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
1052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
1054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If a stashed version of the given finfo object exists (same
1055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ filename/checkin values), return it, else return undefined.
1056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ P.getStashedFinfo = function(finfo){
1058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return $stash.getFinfo(finfo);
1059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
1060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ P.$stash = $stash /*only for testing/debugging */;
1062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
783 1063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})(window.fossil);
784 1064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
785 1065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A DDED src/fossil.storage.js