mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-07 23:00:55 +03:00
web client: allow to preview images and pdf
pdf depends on browser support. It does not work on mobile devices.
This commit is contained in:
@@ -202,6 +202,7 @@
|
||||
|
||||
function SearchCursor(doc, query, pos, options) {
|
||||
this.atOccurrence = false
|
||||
this.afterEmptyMatch = false
|
||||
this.doc = doc
|
||||
pos = pos ? doc.clipPos(pos) : Pos(0, 0)
|
||||
this.pos = {from: pos, to: pos}
|
||||
@@ -237,21 +238,29 @@
|
||||
findPrevious: function() {return this.find(true)},
|
||||
|
||||
find: function(reverse) {
|
||||
var result = this.matches(reverse, this.doc.clipPos(reverse ? this.pos.from : this.pos.to))
|
||||
|
||||
// Implements weird auto-growing behavior on null-matches for
|
||||
// backwards-compatibility with the vim code (unfortunately)
|
||||
while (result && CodeMirror.cmpPos(result.from, result.to) == 0) {
|
||||
var head = this.doc.clipPos(reverse ? this.pos.from : this.pos.to);
|
||||
if (this.afterEmptyMatch && this.atOccurrence) {
|
||||
// do not return the same 0 width match twice
|
||||
head = Pos(head.line, head.ch)
|
||||
if (reverse) {
|
||||
if (result.from.ch) result.from = Pos(result.from.line, result.from.ch - 1)
|
||||
else if (result.from.line == this.doc.firstLine()) result = null
|
||||
else result = this.matches(reverse, this.doc.clipPos(Pos(result.from.line - 1)))
|
||||
head.ch--;
|
||||
if (head.ch < 0) {
|
||||
head.line--;
|
||||
head.ch = (this.doc.getLine(head.line) || "").length;
|
||||
}
|
||||
} else {
|
||||
if (result.to.ch < this.doc.getLine(result.to.line).length) result.to = Pos(result.to.line, result.to.ch + 1)
|
||||
else if (result.to.line == this.doc.lastLine()) result = null
|
||||
else result = this.matches(reverse, Pos(result.to.line + 1, 0))
|
||||
head.ch++;
|
||||
if (head.ch > (this.doc.getLine(head.line) || "").length) {
|
||||
head.ch = 0;
|
||||
head.line++;
|
||||
}
|
||||
}
|
||||
if (CodeMirror.cmpPos(head, this.doc.clipPos(head)) != 0) {
|
||||
return this.atOccurrence = false
|
||||
}
|
||||
}
|
||||
var result = this.matches(reverse, head)
|
||||
this.afterEmptyMatch = result && CodeMirror.cmpPos(result.from, result.to) == 0
|
||||
|
||||
if (result) {
|
||||
this.pos = result
|
||||
|
||||
20
static/vendor/codemirror/codemirror.css
vendored
20
static/vendor/codemirror/codemirror.css
vendored
@@ -60,19 +60,13 @@
|
||||
.cm-fat-cursor div.CodeMirror-cursors {
|
||||
z-index: 1;
|
||||
}
|
||||
.cm-fat-cursor-mark {
|
||||
background-color: rgba(20, 255, 20, 0.5);
|
||||
-webkit-animation: blink 1.06s steps(1) infinite;
|
||||
-moz-animation: blink 1.06s steps(1) infinite;
|
||||
animation: blink 1.06s steps(1) infinite;
|
||||
}
|
||||
.cm-animate-fat-cursor {
|
||||
width: auto;
|
||||
-webkit-animation: blink 1.06s steps(1) infinite;
|
||||
-moz-animation: blink 1.06s steps(1) infinite;
|
||||
animation: blink 1.06s steps(1) infinite;
|
||||
background-color: #7e7;
|
||||
}
|
||||
.cm-fat-cursor .CodeMirror-line::selection,
|
||||
.cm-fat-cursor .CodeMirror-line > span::selection,
|
||||
.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; }
|
||||
.cm-fat-cursor .CodeMirror-line::-moz-selection,
|
||||
.cm-fat-cursor .CodeMirror-line > span::-moz-selection,
|
||||
.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; }
|
||||
.cm-fat-cursor { caret-color: transparent; }
|
||||
@-moz-keyframes blink {
|
||||
0% {}
|
||||
50% { background-color: transparent; }
|
||||
|
||||
36
static/vendor/codemirror/codemirror.js
vendored
36
static/vendor/codemirror/codemirror.js
vendored
@@ -2351,12 +2351,14 @@
|
||||
function mapFromLineView(lineView, line, lineN) {
|
||||
if (lineView.line == line)
|
||||
{ return {map: lineView.measure.map, cache: lineView.measure.cache} }
|
||||
for (var i = 0; i < lineView.rest.length; i++)
|
||||
{ if (lineView.rest[i] == line)
|
||||
{ return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }
|
||||
for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)
|
||||
{ if (lineNo(lineView.rest[i$1]) > lineN)
|
||||
{ return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }
|
||||
if (lineView.rest) {
|
||||
for (var i = 0; i < lineView.rest.length; i++)
|
||||
{ if (lineView.rest[i] == line)
|
||||
{ return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }
|
||||
for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)
|
||||
{ if (lineNo(lineView.rest[i$1]) > lineN)
|
||||
{ return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }
|
||||
}
|
||||
}
|
||||
|
||||
// Render a line into the hidden node display.externalMeasured. Used
|
||||
@@ -3150,13 +3152,19 @@
|
||||
var curFragment = result.cursors = document.createDocumentFragment();
|
||||
var selFragment = result.selection = document.createDocumentFragment();
|
||||
|
||||
var customCursor = cm.options.$customCursor;
|
||||
if (customCursor) { primary = true; }
|
||||
for (var i = 0; i < doc.sel.ranges.length; i++) {
|
||||
if (!primary && i == doc.sel.primIndex) { continue }
|
||||
var range = doc.sel.ranges[i];
|
||||
if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue }
|
||||
var collapsed = range.empty();
|
||||
if (collapsed || cm.options.showCursorWhenSelecting)
|
||||
{ drawSelectionCursor(cm, range.head, curFragment); }
|
||||
if (customCursor) {
|
||||
var head = customCursor(cm, range);
|
||||
if (head) { drawSelectionCursor(cm, head, curFragment); }
|
||||
} else if (collapsed || cm.options.showCursorWhenSelecting) {
|
||||
drawSelectionCursor(cm, range.head, curFragment);
|
||||
}
|
||||
if (!collapsed)
|
||||
{ drawSelectionRange(cm, range, selFragment); }
|
||||
}
|
||||
@@ -3174,9 +3182,8 @@
|
||||
|
||||
if (/\bcm-fat-cursor\b/.test(cm.getWrapperElement().className)) {
|
||||
var charPos = charCoords(cm, head, "div", null, null);
|
||||
if (charPos.right - charPos.left > 0) {
|
||||
cursor.style.width = (charPos.right - charPos.left) + "px";
|
||||
}
|
||||
var width = charPos.right - charPos.left;
|
||||
cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + "px";
|
||||
}
|
||||
|
||||
if (pos.other) {
|
||||
@@ -3649,6 +3656,7 @@
|
||||
this.vert.firstChild.style.height =
|
||||
Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";
|
||||
} else {
|
||||
this.vert.scrollTop = 0;
|
||||
this.vert.style.display = "";
|
||||
this.vert.firstChild.style.height = "0";
|
||||
}
|
||||
@@ -4501,7 +4509,7 @@
|
||||
function onScrollWheel(cm, e) {
|
||||
var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;
|
||||
var pixelsPerUnit = wheelPixelsPerUnit;
|
||||
if (event.deltaMode === 0) {
|
||||
if (e.deltaMode === 0) {
|
||||
dx = e.deltaX;
|
||||
dy = e.deltaY;
|
||||
pixelsPerUnit = 1;
|
||||
@@ -8235,7 +8243,7 @@
|
||||
}
|
||||
|
||||
function hiddenTextarea() {
|
||||
var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none");
|
||||
var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none");
|
||||
var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
|
||||
// The textarea is kept positioned near the cursor to prevent the
|
||||
// fact that it'll be scrolled into view on input from scrolling
|
||||
@@ -9832,7 +9840,7 @@
|
||||
|
||||
addLegacyProps(CodeMirror);
|
||||
|
||||
CodeMirror.version = "5.63.1";
|
||||
CodeMirror.version = "5.64.0";
|
||||
|
||||
return CodeMirror;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user