diff --git a/navigator/navigator.css b/navigator/navigator.css
index ae4571a..52559ce 100644
--- a/navigator/navigator.css
+++ b/navigator/navigator.css
@@ -428,3 +428,14 @@ input:checked + .slider:before {
.slider.round:before {
border-radius: 50%;
}
+
+.nav-icon-decorated {
+ position: relative;
+}
+
+.nav-icon-decoration {
+ position: absolute;
+ font-size: 60%;
+ top: -10%;
+ left: -30%;
+}
diff --git a/navigator/navigator.html b/navigator/navigator.html
index 5c8cea2..fa8dcb1 100644
--- a/navigator/navigator.html
+++ b/navigator/navigator.html
@@ -54,9 +54,13 @@
-
-
-
+
diff --git a/navigator/navigator.js b/navigator/navigator.js
index 893936a..ed44516 100644
--- a/navigator/navigator.js
+++ b/navigator/navigator.js
@@ -934,6 +934,29 @@ class NavWindow {
this.refresh();
}
+ async ln() {
+ var link_target = window.prompt("Link Target: ");
+ if (link_target === null)
+ return;
+ var link_name = window.prompt("Link Name: ");
+ if (link_name === null)
+ return;
+ if (link_name.includes("/")) {
+ window.alert("Link name can't contain `/`.");
+ return;
+ }
+ var link_path = this.pwd().path_str() + "/" + link_name;
+ var proc = cockpit.spawn(
+ ["ln", "-sn", link_target, link_path],
+ {superuser: "try", err: "out"}
+ );
+ proc.fail((e, data) => {
+ window.alert(data);
+ });
+ await proc;
+ this.refresh();
+ }
+
/**
*
* @param {Event} e
@@ -1071,6 +1094,7 @@ function set_up_buttons() {
document.getElementById("nav-refresh-btn").addEventListener("click", nav_window.refresh.bind(nav_window));
document.getElementById("nav-mkdir-btn").addEventListener("click", nav_window.mkdir.bind(nav_window));
document.getElementById("nav-touch-btn").addEventListener("click", nav_window.touch.bind(nav_window));
+ document.getElementById("nav-ln-btn").addEventListener("click", nav_window.ln.bind(nav_window));
document.getElementById("nav-delete-btn").addEventListener("click", nav_window.delete_selected.bind(nav_window));
document.getElementById("nav-edit-properties-btn").addEventListener("click", nav_window.show_edit_selected.bind(nav_window));
document.getElementById("nav-cancel-edit-btn").addEventListener("click", nav_window.hide_edit_selected.bind(nav_window));