From 3273c1abe523c645a58cd3a19fdcb28ff96e7143 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 28 May 2019 13:56:13 +0300 Subject: [PATCH] feature(user-menu) add Compare Directories (#220) --- static/user-menu.js | 51 ++++++++++++++++++++++++++++++++++++++++ static/user-menu.spec.js | 23 ++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/static/user-menu.js b/static/user-menu.js index 49e87c18..a26b2020 100644 --- a/static/user-menu.js +++ b/static/user-menu.js @@ -20,6 +20,37 @@ module.exports = { CloudCmd, }); }, + 'D - Compare directories': async ({DOM}) => { + const { + CurrentInfo, + getFilenames, + getCurrentByName, + selectFile, + } = DOM; + + const { + files, + filesPassive, + panel, + panelPassive, + } = CurrentInfo; + + const names = getFilenames(files); + const namesPassive = getFilenames(filesPassive); + + const selectedNames = compare(names, namesPassive); + const selectedNamesPassive = compare(namesPassive, names); + + selectNames(selectedNames, panel, { + selectFile, + getCurrentByName, + }); + + selectNames(selectedNamesPassive, panelPassive, { + selectFile, + getCurrentByName, + }); + }, }; async function createDefaultMenu({path, data, DOM, CloudCmd}) { @@ -40,3 +71,23 @@ async function readDefaultMenu({prefix}) { return data; } +function selectNames(names, panel, {selectFile, getCurrentByName}) { + for (const name of names) { + const file = getCurrentByName(name, panel); + selectFile(file); + } +} + +function compare(a, b) { + const result = []; + + for (const el of a) { + if (b.includes(el)) + continue; + + result.push(el); + } + + return result; +} + diff --git a/static/user-menu.spec.js b/static/user-menu.spec.js index accb3636..827ac76e 100644 --- a/static/user-menu.spec.js +++ b/static/user-menu.spec.js @@ -8,6 +8,8 @@ const wraptile = require('wraptile'); const defaultMenu = require('./user-menu'); +const {create} = autoGlobals; + const {_data} = defaultMenu; const reject = wraptile(async (a) => { throw Error(a); @@ -107,6 +109,21 @@ test('cloudcmd: static: user menu: no EditFile.show', async (t) => { t.end(); }); +test('cloudcmd: static: user menu: compare directories', async (t) => { + const name = 'D - Compare directories'; + const DOM = getDOM(); + const CloudCmd = getCloudCmd(); + + await defaultMenu[name]({ + DOM, + CloudCmd, + }); + + const {files} = DOM.CurrentInfo.files; + t.ok(DOM.getFilenames.calledWith(files), 'should call getFilenames'); + t.end(); +}); + function getDOM() { const IO = { write: stub(), @@ -114,12 +131,18 @@ function getDOM() { const CurrentInfo = { dirPath: '/', + files: [], + filesPasive: [], + panel: create(), + panelPassive: create(), }; return { IO, CurrentInfo, setCurrentByName: stub(), + getFilenames: stub().returns([]), + getCurrentByName: stub(), renameCurrent: stub(), }; }