Skip to content

Commit df7101f

Browse files
sarpong4texodus
authored andcommitted
<TAB> key press inserts '\t' character in code editor as indentation.
Signed-off-by: Onesimus Wiafe <onesimus.wiafe@turntabl.io>
1 parent 788e11c commit df7101f

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

rust/perspective-viewer/src/rust/components/form/code_editor.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,28 @@ fn on_keydown(event: KeyboardEvent, deps: &(UseStateSetter<u32>, Callback<()>))
7575
event.prevent_default();
7676
deps.1.emit(())
7777
}
78+
79+
// handle the tab key press
80+
if event.key() == "Tab" {
81+
event.prevent_default();
82+
83+
let caret_pos = elem.selection_start().unwrap().unwrap_or_default() as usize;
84+
85+
let mut initial_text = elem.value();
86+
87+
initial_text.insert(caret_pos, '\t');
88+
89+
elem.set_value(&initial_text);
90+
91+
let input_event = web_sys::InputEvent::new("input").unwrap();
92+
let _ = elem.dispatch_event(&input_event).unwrap();
93+
94+
// place caret after inserted tab
95+
let new_caret_pos = (caret_pos + 1) as u32;
96+
let _ = elem.set_selection_range(new_caret_pos, new_caret_pos);
97+
98+
elem.focus().unwrap();
99+
}
78100
}
79101

80102
/// Scrolling callback

rust/perspective-viewer/test/js/column_settings/attributes_tab.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,39 @@ test.describe("Attributes Tab", () => {
9595
view.columnSettingsSidebar.attributesTab.saveBtn
9696
).toBeDisabled();
9797
});
98+
test("Tab Button Click enters 4 spaces.", async ({ page }) => {
99+
let view = new PageView(page);
100+
await view.restore({
101+
expressions: { expr: "12345" },
102+
columns: ["expr", "Row ID"],
103+
settings: true,
104+
});
105+
let expr = await view.settingsPanel.activeColumns.getColumnByName(
106+
"expr"
107+
);
108+
await expr.editBtn.click();
109+
await view.columnSettingsSidebar.openTab("Attributes");
110+
111+
let sidebar = view.columnSettingsSidebar;
112+
let attributesTab = sidebar.attributesTab;
113+
114+
let textarea = attributesTab.expressionEditor.textarea;
115+
116+
await textarea.type("foo", { delay: 100 });
117+
expect(await textarea.evaluate((input) => input!.value)).toStrictEqual(
118+
"foo12345"
119+
);
120+
121+
await textarea.type("\t", { delay: 100 });
122+
const expected = await textarea.evaluate((input) => input!.value);
123+
124+
expect(expected).toContain("\t");
125+
126+
const caretPosition = await textarea.evaluate(
127+
(input) => input!.selectionStart
128+
);
129+
expect(caretPosition).toBe(4); // length of foo + length of '\t' = 4;
130+
});
98131
test("Reset button", async ({ page }) => {
99132
let view = new PageView(page);
100133
await view.restore({

0 commit comments

Comments
 (0)