From 87b31074b4acd87a67d1ff4b8e3f84943710ff5b Mon Sep 17 00:00:00 2001 From: Matthew Welch Date: Sun, 3 Jan 2021 00:11:27 -0800 Subject: [PATCH] Added inline editing double clicking on a cell or header will place a text box for editing --- src/css/style.css | 14 ++++ src/js/editor.js | 175 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 159 insertions(+), 30 deletions(-) diff --git a/src/css/style.css b/src/css/style.css index 0541111..c04d40d 100644 --- a/src/css/style.css +++ b/src/css/style.css @@ -15,3 +15,17 @@ nav::-webkit-scrollbar { .selected { background-color: #24c278 !important; } + +.context-menu { + position: absolute; + background: white; +} + +.inline-edit { + padding: 0!important; +} + +td.inline-edit > textarea, th.inline-edit > textarea { + width: 100%; + height: 100%; +} diff --git a/src/js/editor.js b/src/js/editor.js index 8e438f0..0d6cbb0 100644 --- a/src/js/editor.js +++ b/src/js/editor.js @@ -95,6 +95,9 @@ function makeCell(cell_id, cell_text) { }) .on("contextmenu" , (event) => { cellContextMenu(event, cell_id); + }) + .on("dblclick", (event) => { + cellInlineEdit(event); }); } @@ -104,6 +107,12 @@ function makeHeader(header_id, col_title) { .text(col_title) .on("click", () => { selectCell(header_id); + }) + .on("contextmenu", (event) => { + headerContextMenu(event, header_id); + }) + .on("dblclick", (event) => { + headerInlineEdit(event); }); } @@ -325,39 +334,38 @@ function cellContextMenu(event, cell_id) { selectCell(cell_id); let menu = $("
") .attr("id", "context-menu-"+cell_id) - .addClass("border") - .css({"position": "absolute", "background": "white"}) + .addClass("border context-menu text-nowrap") .on("mouseleave", () => { menu.remove(); - }); - menu.append($("") - .addClass("btn d-block") - .on("click", () => { - let data = getSelectedCellData(); - insertRow(data["table_id"], data["row_index"]); }) - .text("Insert row above")) - menu.append($("") - .addClass("btn d-block") - .on("click", () => { - let data = getSelectedCellData(); - insertRow(data["table_id"], data["row_index"]+1); - }) - .text("Insert row below")) - menu.append($("") - .addClass("btn d-block") - .on("click", () => { - let data = getSelectedCellData(); - insertColumn(data["table_id"], data["col_index"]); - }) - .text("Insert column left")) - menu.append($("") - .addClass("btn d-block") - .on("click", () => { - let data = getSelectedCellData(); - insertColumn(data["table_id"], data["col_index"]+1); - }) - .text("Insert column right")) + .append($("") + .addClass("btn d-block") + .on("click", () => { + let data = getSelectedCellData(); + insertRow(data["table_id"], data["row_index"]); + }) + .text("Insert row above")) + .append($("") + .addClass("btn d-block") + .on("click", () => { + let data = getSelectedCellData(); + insertRow(data["table_id"], data["row_index"]+1); + }) + .text("Insert row below")) + .append($("") + .addClass("btn d-block") + .on("click", () => { + let data = getSelectedCellData(); + insertColumn(data["table_id"], data["col_index"]); + }) + .text("Insert column left")) + .append($("") + .addClass("btn d-block") + .on("click", () => { + let data = getSelectedCellData(); + insertColumn(data["table_id"], data["col_index"]+1); + }) + .text("Insert column right")) let max_height = $(document).height(); let max_width = $(document).width(); @@ -369,6 +377,113 @@ function cellContextMenu(event, cell_id) { menu.css({"top": y_pos, "left": x_pos}); } +function headerContextMenu(event, header_id) { + if (!selected_cells.includes(header_id)) { + selectCell(header_id); + } + let menu = $("
") + .attr("id", "context-menu-"+header_id) + .addClass("border context-menu text-nowrap") + .on("mouseleave", () => { + menu.remove(); + }) + .append($("") + .addClass("btn d-block") + .on("click", () => { + let data = getSelectedCellData(); + insertColumn(data["table_id"], data["col_index"]); + }) + .text("Insert column left")) + .append($("") + .addClass("btn d-block") + .on("click", () => { + let data = getSelectedCellData(); + insertColumn(data["table_id"], data["col_index"]+1); + }) + .text("Insert column right")) + + let max_height = $(document).height(); + let max_width = $(document).width(); + let x_pos = event.pageX-5; + let y_pos = event.pageY-5; + $("body").append(menu); + y_pos = Math.min(y_pos, max_height-menu.height()); + x_pos = Math.min(x_pos, max_width-menu.width()); + menu.css({"top": y_pos, "left": x_pos}); +} + +function cellInlineEdit(event) { + let data = getSelectedCellData() + let target = $(event.target); + let text_area = $("