Skip to content

Commit 848f56a

Browse files
author
BrainFooLong
committed
added filter for download/upload
1 parent 92cc20f commit 848f56a

File tree

10 files changed

+74
-29
lines changed

10 files changed

+74
-29
lines changed

public/scripts/src/lang.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ gl.lang.replaceInHtml = function (el) {
5454
elements.removeAttr('data-translate')
5555
elements = el.find('[data-translate-property]')
5656
elements.each(function () {
57-
const s = $(this).attr('data-translate-property').split(',')
58-
$(this).attr(s[0], get(s[1]))
57+
let s = $(this).attr('data-translate-property').split(',')
58+
while (s.length >= 2) {
59+
$(this).attr(s.shift(), get(s.shift()))
60+
}
5961
})
6062
elements.removeAttr('data-translate-property')
6163
}

public/scripts/src/lang/en.json

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"log.ftpserver.readdir": "Read directory list of {directory}",
1111
"log.ftpserver.ready": "Server connection successfull",
1212
"log.ftpserver.sftpready": "SSH connection successfull",
13-
"log.local.file.deleted" : "Local file deleted {file}",
14-
"log.server.file.deleted" : "Server file deleted {file}",
13+
"log.local.file.deleted": "Local file deleted {file}",
14+
"log.server.file.deleted": "Server file deleted {file}",
1515
"log.server.transfers.stopped": "All transfers stopped",
1616
"login": "Login",
1717
"login.failed": "Login failed",
@@ -42,7 +42,8 @@
4242
"socket.disconnect": "Socket closed. Retry in 5 seconds...",
4343
"transfer.error": "Error",
4444
"transfer.mode": "Action when destination file exists",
45-
"transfer.mode.rename": "Rename transfered file (Prepend a number to filename)",
45+
"transfer.mode.rename": "Rename transfered file (Prepend a random string to filename)",
46+
"transfer.mode.never": "Never replace",
4647
"transfer.mode.replace-always": "Replace always",
4748
"transfer.mode.replace-newer": "Replace when newer",
4849
"transfer.mode.replace-newer-or-sizediff": "Replace when newer or size is different",
@@ -57,5 +58,9 @@
5758
"modal.confirm.header": "Confirmation",
5859
"modal.confirm.accept": "Accept",
5960
"modal.confirm.cancel": "Cancel",
60-
"confirm.delete.files": "Are you sure? This cannot be undone. It will delete all files recursively, so, be careful"
61+
"confirm.delete.files": "Are you sure? This cannot be undone. It will delete all files recursively, so, be careful",
62+
"log.server.queue.stopped": "Transfers stopped",
63+
"log.transfer.file.exist": "Skip file because it already exist: {file}",
64+
"filtermask" : "Filter",
65+
"filtermask.tooltip" : "You can enter a filemask to download/upload only the given files. For example: *.zip -> will just filter only zip files, use spaces to use multiple filemasks"
6166
}

public/stylesheets/src/page.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,8 +333,8 @@ textarea:invalid + span:after {
333333
background: white;
334334
display: none;
335335
min-width: 250px;
336+
transition: 0.1s;
336337
> div {
337-
border-bottom: 1px solid #e5e5e5;
338338
padding: 3px;
339339
cursor: pointer;
340340
&:hover {
@@ -353,6 +353,7 @@ textarea:invalid + span:after {
353353

354354
.contextmenu.show {
355355
display: block;
356+
356357
}
357358

358359
.tabs {

public/tpl/serverbrowser.html

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,27 @@
4040
<div class="upload" data-mode="upload" data-forceTransfer="1">Upload</div>
4141
<div class="upload-queue" data-mode="upload">Add to upload queue</div>
4242
<div class="remove">Delete</div>
43+
<div class="filter">
44+
<div class="input-group form-inline">
45+
<div class="form-group input-group input-group-sm">
46+
<span class="input-group-addon"><input type="checkbox"></span>
47+
<input type="text" class="form-control" data-translate-property="data-tooltip,filtermask.tooltip,placeholder,filtermask">
48+
</div>
49+
</div>
50+
</div>
4351
</div>
4452

4553
<div class="contextmenu" data-id="server">
4654
<div class="download" data-mode="download" data-forceTransfer="1">Download</div>
4755
<div class="download-queue" data-mode="download">Add to download queue</div>
4856
<div class="remove">Delete</div>
57+
<div class="filter">
58+
<div class="input-group form-inline">
59+
<div class="form-group input-group input-group-sm">
60+
<span class="input-group-addon"><input type="checkbox" class="checkbox"></span>
61+
<input type="text" class="form-control filtermask" data-translate-property="placeholder,filtermask">
62+
<span class="input-group-addon" data-translate-property="data-tooltip,filtermask.tooltip">i</span>
63+
</div>
64+
</div>
65+
</div>
4966
</div>

public/tpl/src/serverbrowser.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,19 +149,26 @@
149149
})
150150

151151
$contextmenu.on('click', '.download, .download-queue, .upload, .upload-queue', function (ev) {
152-
const $selectedFiles = $tpl.find('.' + $(this).closest('.contextmenu').attr('data-id')).find('tr.active')
152+
const $currentCm = $(this).closest('.contextmenu')
153+
const $selectedFiles = $tpl.find('.' + $currentCm.attr('data-id')).find('tr.active')
153154
let files = []
154155
$selectedFiles.each(function () {
155156
files.push($(this).data('file'))
156157
})
158+
let filter = null
159+
if ($currentCm.find('.filter .checkbox').prop('checked')) {
160+
filter = $currentCm.find('.filter input.filtermask').val().trim()
161+
}
162+
157163
gl.socket.send('addToTransferQueue', {
158164
'localDirectory': $localDirectoryInput.val(),
159165
'serverDirectory': $serverDirectoryInput.val(),
160166
'files': files,
161167
'mode': $(this).attr('data-mode'),
162168
'server': tabParams.server,
163169
'recursive': true,
164-
'forceTransfer': $(this).attr('data-forceTransfer') === '1'
170+
'forceTransfer': $(this).attr('data-forceTransfer') === '1',
171+
'filter': filter
165172
})
166173
}).on('click', '.remove', function (ev) {
167174
ev.stopPropagation()
@@ -187,6 +194,8 @@
187194
})
188195
}
189196
})
197+
}).on('click', '.filter', function (ev) {
198+
ev.stopPropagation()
190199
})
191200

192201
loadServerDirectory(tabParams.serverDirectory || '/')

public/tpl/src/transfersettings.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
'type': 'select',
88
'label': 'transfer.mode',
99
'values': {
10+
'never': 'transfer.mode.never',
1011
'replace-always': 'transfer.mode.replace-always',
1112
'replace-newer': 'transfer.mode.replace-newer',
1213
'replace-sizediff': 'transfer.mode.replace-sizediff',

src/actions/addToTransferQueue.js

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ action.requireUser = true
2222
* @param {function} callback
2323
*/
2424
action.execute = function (user, message, callback) {
25+
let filterRegex = null
26+
if (message.filter) {
27+
filterRegex = new RegExp(message.filter.replace(/\*/g, '.*?').replace(/ /g, '|'), 'i')
28+
}
29+
2530
/**
2631
* Add files to queue
2732
* @param {FtpServer} ftpServer
@@ -80,17 +85,20 @@ action.execute = function (user, message, callback) {
8085
}, 150)
8186
}
8287
} else {
83-
entries.push(new queue.QueueEntry(
84-
db.getNextId(),
85-
message.mode,
86-
message.server,
87-
localPath,
88-
serverPath,
89-
file.isDirectory,
90-
'queue',
91-
file.size,
92-
0
93-
))
88+
// if filter and match path
89+
if (!filterRegex || file.path.match(filterRegex)) {
90+
entries.push(new queue.QueueEntry(
91+
db.getNextId(),
92+
message.mode,
93+
message.server,
94+
localPath,
95+
serverPath,
96+
file.isDirectory,
97+
'queue',
98+
file.size,
99+
0
100+
))
101+
}
94102
nextFile()
95103
}
96104
}

src/actions/stopTransfer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ action.requireUser = true
2020
action.execute = function (user, message, callback) {
2121
// stop queue for each server
2222
for (let i in FtpServer.instances) {
23-
FtpServer.instances[i].stopTransfers()
2423
FtpServer.instances[i].server.log('log.server.queue.stopped')
24+
FtpServer.instances[i].stopTransfers()
2525
}
2626
}
2727

src/fstools.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ fstools.deleteRecursive = function (directory, callbackFile) {
4141
if (fs.existsSync(directory)) {
4242
fs.readdirSync(directory).forEach(function (file) {
4343
const curPath = path.join(directory, file)
44-
if (fs.lstatSync(curPath).isDirectory()) {
44+
if (fs.statSync(curPath).isDirectory()) {
4545
fstools.deleteRecursive(curPath)
4646
} else {
4747
fs.unlinkSync(curPath)

src/ftpServer.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const path = require('path')
66
const fs = require('fs')
77
const mkdirRecursive = require('mkdir-recursive')
88
const db = require(path.join(__dirname, 'db'))
9+
const hash = require(path.join(__dirname, 'hash'))
910
const fstools = require(path.join(__dirname, 'fstools'))
1011
const queue = require(path.join(__dirname, 'queue'))
1112
const Server = require(path.join(__dirname, 'server'))
@@ -215,16 +216,17 @@ function FtpServer (id) {
215216
} else if ((mode === 'replace-sizediff' || mode === 'replace-newer-or-sizediff') && destStat.size !== srcStat.size) {
216217
skip = false
217218
} else if (mode === 'rename') {
218-
let renameCount = 0
219-
let newPath = queueEntry.localPath
220-
while (fs.existsSync(newPath)) {
221-
newPath = path.join(path.dirname(queueEntry.localPath), renameCount + '_' + path.basename(queueEntry.localPath))
222-
renameCount++
219+
if (queueEntry.mode === 'download') {
220+
useLocalPath = path.join(path.dirname(queueEntry.localPath), hash.random(6) + '_' + path.basename(queueEntry.localPath))
223221
}
224-
useLocalPath = newPath
222+
if (queueEntry.mode === 'upload') {
223+
useServerPath = path.join(path.dirname(queueEntry.serverPath), hash.random(6) + '_' + path.basename(queueEntry.serverPath))
224+
}
225+
skip = false
225226
}
226227
// skip if file not need to be transfered
227228
if (skip) {
229+
self.server.log('log.transfer.file.exist', {'file': useLocalPath})
228230
end()
229231
return
230232
}
@@ -520,7 +522,7 @@ function FtpServer (id) {
520522
self.server.log('log.ftpserver.disconnect')
521523
delete FtpServer.instances[self.id]
522524
if (this.ftpClient) {
523-
self.ftpClient.end()
525+
self.ftpClient.destroy()
524526
}
525527
if (this.sshClient) {
526528
self.sshClient.end()

0 commit comments

Comments
 (0)