mirror of
https://github.com/45Drives/cockpit-navigator.git
synced 2025-07-27 23:54:20 +02:00
implement more intuitive file renaming
This commit is contained in:
parent
58383c6426
commit
05d82eb12e
@ -53,7 +53,7 @@ export class NavContextMenu {
|
|||||||
var name_list = func[0].split("_");
|
var name_list = func[0].split("_");
|
||||||
name_list.forEach((word, index) => {name_list[index] = word.charAt(0).toUpperCase() + word.slice(1)});
|
name_list.forEach((word, index) => {name_list[index] = word.charAt(0).toUpperCase() + word.slice(1)});
|
||||||
elem.innerHTML = func[1] + name_list.join(" ");
|
elem.innerHTML = func[1] + name_list.join(" ");
|
||||||
elem.addEventListener("click", (e) => {this[func[0]].bind(this).apply()});
|
elem.addEventListener("click", (e) => {this[func[0]].bind(this, e).apply()});
|
||||||
elem.classList.add("nav-context-menu-item")
|
elem.classList.add("nav-context-menu-item")
|
||||||
elem.id = "nav-context-menu-" + func[0];
|
elem.id = "nav-context-menu-" + func[0];
|
||||||
this.dom_element.appendChild(elem);
|
this.dom_element.appendChild(elem);
|
||||||
@ -61,58 +61,37 @@ export class NavContextMenu {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new_dir() {
|
new_dir(e) {
|
||||||
this.nav_window_ref.mkdir();
|
this.nav_window_ref.mkdir();
|
||||||
}
|
}
|
||||||
|
|
||||||
new_file() {
|
new_file(e) {
|
||||||
this.nav_window_ref.touch();
|
this.nav_window_ref.touch();
|
||||||
}
|
}
|
||||||
|
|
||||||
new_link() {
|
new_link(e) {
|
||||||
var default_target = "";
|
var default_target = "";
|
||||||
if (this.nav_window_ref.selected_entries.size <= 1 && this.target !== this.nav_window_ref.pwd())
|
if (this.nav_window_ref.selected_entries.size <= 1 && this.target !== this.nav_window_ref.pwd())
|
||||||
default_target = this.target.filename();
|
default_target = this.target.filename();
|
||||||
this.nav_window_ref.ln(default_target);
|
this.nav_window_ref.ln(default_target);
|
||||||
}
|
}
|
||||||
|
|
||||||
cut() {
|
cut(e) {
|
||||||
this.nav_window_ref.cut();
|
this.nav_window_ref.cut();
|
||||||
}
|
}
|
||||||
|
|
||||||
copy() {
|
copy(e) {
|
||||||
this.nav_window_ref.copy();
|
this.nav_window_ref.copy();
|
||||||
}
|
}
|
||||||
|
|
||||||
paste() {
|
paste(e) {
|
||||||
this.nav_window_ref.paste();
|
this.nav_window_ref.paste();
|
||||||
}
|
}
|
||||||
|
|
||||||
async rename() {
|
async rename(e) {
|
||||||
this.hide();
|
this.hide();
|
||||||
let response = await this.nav_window_ref.modal_prompt.prompt("Renaming " + this.target.filename(),
|
this.target.show_edit(this.target.dom_element.nav_item_title);
|
||||||
{
|
e.stopPropagation();
|
||||||
new_name: {
|
|
||||||
label: "New Name: ",
|
|
||||||
type: "text",
|
|
||||||
default: this.target.filename()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
if (response === null)
|
|
||||||
return;
|
|
||||||
var new_name = response.new_name;
|
|
||||||
if (new_name.includes("/")) {
|
|
||||||
this.nav_window_ref.modal_prompt.alert("File name can't contain `/`.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
await this.target.mv(new_name);
|
|
||||||
} catch(e) {
|
|
||||||
this.nav_window_ref.modal_prompt.alert(e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.nav_window_ref.refresh();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
zip_for_download() {
|
zip_for_download() {
|
||||||
@ -134,7 +113,7 @@ export class NavContextMenu {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async download() {
|
async download(e) {
|
||||||
var download_target = "";
|
var download_target = "";
|
||||||
if (this.nav_window_ref.selected_entries.size === 1 && !(this.nav_window_ref.selected_entry() instanceof NavDir)) {
|
if (this.nav_window_ref.selected_entries.size === 1 && !(this.nav_window_ref.selected_entry() instanceof NavDir)) {
|
||||||
download_target = this.nav_window_ref.selected_entry();
|
download_target = this.nav_window_ref.selected_entry();
|
||||||
@ -155,11 +134,11 @@ export class NavContextMenu {
|
|||||||
download.download();
|
download.download();
|
||||||
}
|
}
|
||||||
|
|
||||||
delete() {
|
delete(e) {
|
||||||
this.nav_window_ref.delete_selected();
|
this.nav_window_ref.delete_selected();
|
||||||
}
|
}
|
||||||
|
|
||||||
properties() {
|
properties(e) {
|
||||||
this.nav_window_ref.show_edit_selected();
|
this.nav_window_ref.show_edit_selected();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,6 +42,19 @@ export class NavEntry {
|
|||||||
title.innerText = this.filename();
|
title.innerText = this.filename();
|
||||||
this.dom_element.appendChild(icon);
|
this.dom_element.appendChild(icon);
|
||||||
this.dom_element.appendChild(title);
|
this.dom_element.appendChild(title);
|
||||||
|
let title_edit = this.dom_element.nav_item_title.editor = document.createElement("input");
|
||||||
|
title_edit.type = "text";
|
||||||
|
title_edit.style.display = "none";
|
||||||
|
title_edit.style.padding = title_edit.style.margin = "0";
|
||||||
|
title_edit.style.flexBasis = "0";
|
||||||
|
title_edit.style.flexGrow = "2";
|
||||||
|
title_edit.classList.add("nav-item-title");
|
||||||
|
title_edit.oninput = (e) => {
|
||||||
|
let elem = e.target;
|
||||||
|
elem.style.width = elem.value.length + "ch";
|
||||||
|
}
|
||||||
|
title_edit.addEventListener("click", (e) => {e.stopPropagation();});
|
||||||
|
this.dom_element.appendChild(title_edit);
|
||||||
this.stat = stat;
|
this.stat = stat;
|
||||||
if (stat && stat["inaccessible"]) {
|
if (stat && stat["inaccessible"]) {
|
||||||
this.dom_element.style.cursor = "not-allowed";
|
this.dom_element.style.cursor = "not-allowed";
|
||||||
@ -80,9 +93,18 @@ export class NavEntry {
|
|||||||
handleEvent(e) {
|
handleEvent(e) {
|
||||||
switch (e.type) {
|
switch (e.type) {
|
||||||
case "click":
|
case "click":
|
||||||
|
if (this.nav_window_ref.selected_entries.size === 1 && this.nav_window_ref.selected_entries.has(this)) {
|
||||||
|
switch (e.target) {
|
||||||
|
case this.dom_element.nav_item_title:
|
||||||
|
this.show_edit(e.target);
|
||||||
|
e.stopPropagation();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
this.nav_window_ref.set_selected(this, e.shiftKey, e.ctrlKey);
|
this.nav_window_ref.set_selected(this, e.shiftKey, e.ctrlKey);
|
||||||
this.context_menu_ref.hide();
|
this.context_menu_ref.hide();
|
||||||
e.stopPropagation();
|
|
||||||
break;
|
break;
|
||||||
case "contextmenu":
|
case "contextmenu":
|
||||||
this.context_menu_ref.show(e, this);
|
this.context_menu_ref.show(e, this);
|
||||||
@ -227,6 +249,72 @@ export class NavEntry {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {string} new_path
|
||||||
|
*/
|
||||||
|
async rename(new_name) {
|
||||||
|
if (new_name === this.filename())
|
||||||
|
return;
|
||||||
|
if (new_name.includes("/")) {
|
||||||
|
this.nav_window_ref.modal_prompt.alert("File name can't contain `/`.");
|
||||||
|
return;
|
||||||
|
} else if (new_name === "..") {
|
||||||
|
this.nav_window_ref.modal_prompt.alert(
|
||||||
|
"File name can't be `..`.",
|
||||||
|
"If you want to move the file, right click > cut then right click > paste."
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await this.mv(new_name);
|
||||||
|
} catch(e) {
|
||||||
|
this.nav_window_ref.modal_prompt.alert(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.nav_window_ref.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {HTMLDivElement} element
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
show_edit(element) {
|
||||||
|
if (!element.editor)
|
||||||
|
return;
|
||||||
|
element.hide_func = () => {this.hide_edit(element)};
|
||||||
|
element.editor.onchange = element.hide_func;
|
||||||
|
window.addEventListener("click", element.hide_func);
|
||||||
|
switch (element) {
|
||||||
|
case this.dom_element.nav_item_title:
|
||||||
|
element.editor.value = this.filename();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
element.editor.value = element.innerText;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
element.editor.style.width = element.editor.value.length + "ch";
|
||||||
|
element.editor.style.display = "inline-block";
|
||||||
|
element.style.display = "none";
|
||||||
|
element.editor.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
hide_edit(element) {
|
||||||
|
if (!element.editor)
|
||||||
|
return;
|
||||||
|
switch (element) {
|
||||||
|
case this.dom_element.nav_item_title:
|
||||||
|
this.rename(element.editor.value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
element.editor.style.display = "none";
|
||||||
|
element.style.display = "inline-block";
|
||||||
|
window.removeEventListener("click", element.hide_func);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {string} extra_properties
|
* @param {string} extra_properties
|
||||||
|
@ -43,9 +43,10 @@ export class NavFile extends NavEntry {
|
|||||||
handleEvent(e) {
|
handleEvent(e) {
|
||||||
switch(e.type){
|
switch(e.type){
|
||||||
case "click":
|
case "click":
|
||||||
if (this.double_click)
|
if (this.double_click) {
|
||||||
this.open();
|
this.open();
|
||||||
else { // single click
|
return;
|
||||||
|
} else { // single click
|
||||||
this.double_click = true;
|
this.double_click = true;
|
||||||
if(this.timeout)
|
if(this.timeout)
|
||||||
clearTimeout(this.timeout)
|
clearTimeout(this.timeout)
|
||||||
|
@ -58,8 +58,10 @@ export class NavWindow {
|
|||||||
handleEvent(e) {
|
handleEvent(e) {
|
||||||
switch (e.type) {
|
switch (e.type) {
|
||||||
case "click":
|
case "click":
|
||||||
this.clear_selected();
|
if (e.target === this.window) {
|
||||||
this.show_selected_properties();
|
this.clear_selected();
|
||||||
|
this.show_selected_properties();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case "contextmenu":
|
case "contextmenu":
|
||||||
this.context_menu.show(e, this.pwd());
|
this.context_menu.show(e, this.pwd());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user