Add support for search in the drive

pull/1/head
yflory 8 years ago
parent 9a32fb1999
commit d19bbcb001

@ -197,6 +197,16 @@ define([
return hexArray.join("");
};
var deduplicate = common.deduplicateString = function (array) {
var a = array.slice();
for(var i=0; i<a.length; i++) {
for(var j=i+1; j<a.length; j++) {
if(a[i] === a[j]) { a.splice(j--, 1); }
}
}
return a;
};
var parseHash = common.parseHash = function (hash) {
var parsed = {};
@ -430,6 +440,7 @@ define([
var getRelativeHref = common.getRelativeHref = function (href) {
if (!href) { return; }
if (href.indexOf('#') === -1) { return; }
var parsed = common.parsePadUrl(href);
return '/' + parsed.type + '/#' + parsed.hash;
};

@ -322,6 +322,66 @@ define([
return rootpaths.concat(unsortedpaths, templatepaths, trashpaths);
};
var search = exp.search = function (value) {
if (typeof(value) !== "string") { return []; }
var res = [];
// Search in ROOT
var findIn = function (root) {
Object.keys(root).forEach(function (k) {
if (isFile(root[k])) {
if (k.toLowerCase().indexOf(value.toLowerCase()) !== -1) {
res.push(root[k]);
}
return;
}
findIn(root[k]);
});
};
findIn(files[ROOT]);
// Search in TRASH
var trash = files[TRASH];
Object.keys(trash).forEach(function (k) {
if (k.toLowerCase().indexOf(value.toLowerCase()) !== -1) {
trash[k].forEach(function (el) {
if (isFile(el.element)) {
res.push(el.element);
}
});
}
trash[k].forEach(function (el) {
if (isFolder(el.element)) {
findIn(el.element);
}
});
});
// Search title
var allFilesList = files[FILES_DATA].slice();
allFilesList.forEach(function (t) {
if (t.title && t.title.toLowerCase().indexOf(value.toLowerCase()) !== -1) {
res.push(t.href);
}
});
// Search Href
var href = Cryptpad.getRelativeHref(value);
if (href) {
res.push(href);
}
res = Cryptpad.deduplicateString(res);
var ret = [];
res.forEach(function (l) {
var paths = findFile(l);
ret.push({
paths: findFile(l),
data: getFileData(l)
});
});
return ret;
};
// Remove the selected 'href' from the tree located at 'path', and push its locations to the 'paths' array
var removeFileFromRoot = function (path, href) {
var paths = [];

@ -7,16 +7,6 @@ define([
var Nacl = window.nacl;
var deduplicate = function (array) {
var a = array.slice();
for(var i=0; i<a.length; i++) {
for(var j=i+1; j<a.length; j++) {
if(a[i] === a[j]) { a.splice(j--, 1); }
}
}
return a;
};
var create = function (network, ed) {
var exp = {};
var rpc = Rpc.create(network, ed);
@ -31,7 +21,7 @@ define([
if (!parsedHash || !parsedHash.channel) { return; }
channelIdList.push(Cryptpad.base64ToHex(parsedHash.channel));
});
var uniqueList = deduplicate(channelIdList).sort();
var uniqueList = Cryptpad.deduplicateString(channelIdList).sort();
/*
1. every time you want to pin or unpid a pad you send a message to the server

@ -38,6 +38,7 @@ define([
return JSONSortify(obj);
};
var SEARCH = "search";
var ROOT = "root";
var ROOT_NAME = Messages.fm_rootName;
var UNSORTED = "unsorted";
@ -1417,6 +1418,13 @@ define([
});
};
var displaySearch = function ($list, value) {
var filesList = filesOp.search(value);
filesList.forEach(function (r) {
$('<li>').text(JSON.stringify(r)).appendTo($list);
});
};
// Display the selected directory into the content part (rightside)
// NOTE: Elements in the trash are not using the same storage structure as the others
// _WORKGROUP_ : do not change the lastOpenedFolder value in localStorage
@ -1443,9 +1451,10 @@ define([
var isUnsorted = filesOp.comparePath(path, [UNSORTED]);
var isTemplate = filesOp.comparePath(path, [TEMPLATE]);
var isAllFiles = filesOp.comparePath(path, [FILES_DATA]);
var isSearch = path[0] === SEARCH;
var root = filesOp.findElement(files, path);
if (typeof(root) === "undefined") {
var root = isSearch ? undefined : filesOp.findElement(files, path);
if (!isSearch && typeof(root) === "undefined") {
log(Messages.fm_unknownFolderError);
debug("Unable to locate the selected directory: ", path);
var parentPath = path.slice();
@ -1518,6 +1527,8 @@ define([
displayAllFiles($list);
} else if (isTrashRoot) {
displayTrashRoot($list, $folderHeader, $fileHeader);
} else if (isSearch) {
displaySearch($list, path[1]);
} else {
$dirContent.contextmenu(openContentContextMenu);
if (filesOp.hasSubfolder(root)) { $list.append($folderHeader); }
@ -1682,8 +1693,22 @@ define([
$container.append($trashList);
};
var createSearch = function ($container) {
var $input = $('<input>', {
type: 'text',
placeholder: 'Search...'
}).keyup(function (e) {
if (e.which === 13) {
var val = $(this).val();
displayDirectory([SEARCH, val]);
}
});
$container.append($input);
};
var resetTree = module.resetTree = function () {
$tree.html('');
if (displayedCategories.indexOf(SEARCH) !== -1) { createSearch($tree); }
if (displayedCategories.indexOf(ROOT) !== -1) { createTree($tree, [ROOT]); }
if (displayedCategories.indexOf(UNSORTED) !== -1) { createUnsorted($tree, [UNSORTED]); }
if (displayedCategories.indexOf(TEMPLATE) !== -1) { createTemplate($tree, [TEMPLATE]); }

Loading…
Cancel
Save