-
-
Notifications
You must be signed in to change notification settings - Fork 262
User Menu Cookbook
coderaiser edited this page Nov 22, 2020
·
31 revisions
User Menu is a power feature of Cloud Commander that was added in v12.2.0.
If you create file .cloudcmd.menu.js in the HOME or any top-level directory, it will be used when you press
F2.
Here you can find ready to use scripts for your user menu.
You can combine them in any way, and also add yours 😉.
The simplest way to show rename file dialog.
module.exports = {
'F2 - Rename file': async ({DOM}) => {
await DOM.renameCurrent();
},
};const {
clipboard = {writeText}
} = navigator;
export default {
'F6 - Copy URL to Current File': async ({DOM}) => {
const {path} = DOM.CurrentInfo;
const url = `${window.location.href}${path}`;
await clipboard.writeText(url);
}
}
async function writeText(value) {
const el = document.createElement('textarea');
el.value = value;
document.body.appendChild(el);
el.select();
const is = document.execCommand('copy');
document.body.removeChild(el);
if (is)
return;
return Promise.reject();
}Simple example of running bash scripts with help of TerminalRun.
const isMp3 = (a) => /\.mp3$/.test(a);
module.exports = {
'F - Convert flac to mp3': async ({DOM, CloudCmd}) => {
const convert = 'for f in *.flac; do ffmpeg -vsync 2 -i "$f" -b:a 320k "${f%flac}mp3"; done';
const command = `bash -c '${convert}'`;
const exitCode = await CloudCmd.TerminalRun.show({
command,
});
if (exitCode)
return;
await CloudCmd.refresh();
const {IO, CurrentInfo} = DOM;
// get mp3 file names
const {dirPath, files} = CurrentInfo;
const names = DOM.getFilenames(files);
const mp3Dir = `${dirPath}mp3`;
const mp3Names = names.filter(isMp3);
await IO.createDirectory(mp3Dir);
await IO.move(dirPath, mp3Dir, mp3Names);
await CloudCmd.refresh();
},
}This is how you can create .cloudcmd.menu.js file.
module.exports = {
'C - Create User Menu File': async ({DOM, CloudCmd}) => {
const {CurrentInfo} = DOM;
const {dirPath} = CurrentInfo;
const path = `${dirPath}.cloudcmd.menu.js`;
const {prefix} = CloudCmd;
const data = await readDefaultMenu({prefix});
await createDefaultMenu({
path,
data,
DOM,
CloudCmd,
});
},
};
async function createDefaultMenu({path, data, DOM, CloudCmd}) {
const {IO} = DOM;
await IO.write(path, data);
await CloudCmd.refresh();
DOM.setCurrentByName('.cloudcmd.menu.js');
await CloudCmd.EditFile.show();
}
async function readDefaultMenu({prefix}) {
const res = await fetch(`${prefix}/api/v1/user-menu/default`);
const data = await res.text();
return data;
}module.exports =
'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,
});
},
}
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;
}module.exports = {
'D - Build Dev': async ({CloudCmd}) => {
await CloudCmd.TerminalRun.show({
command: 'npm run build:client:dev',
autoClose: false,
// custom close message
closeMessage: 'Press any button to close Terminal',
});
await CloudCmd.refresh();
},
'P - Build Prod': async ({CloudCmd}) => {
await CloudCmd.TerminalRun.show({
command: 'npm run build:client',
// close window when done
autoClose: true,
});
await CloudCmd.refresh();
},
}