mirror of
https://github.com/Ellpeck/ObsidianSimpleTimeTracker.git
synced 2024-11-16 15:33:12 +01:00
Add minimal implementation for shortcuts in the tracker fields
This commit is contained in:
parent
7033f28555
commit
c478ce6123
1 changed files with 72 additions and 24 deletions
|
@ -382,31 +382,65 @@ function addEditableTableRow(tracker: Tracker, entry: Entry, table: HTMLTableEle
|
||||||
.setTooltip("Edit")
|
.setTooltip("Edit")
|
||||||
.setIcon("lucide-pencil")
|
.setIcon("lucide-pencil")
|
||||||
.onClick(async () => {
|
.onClick(async () => {
|
||||||
if (nameField.editing()) {
|
await handleEdit();
|
||||||
entry.name = nameField.endEdit();
|
|
||||||
expandButton.buttonEl.style.display = null;
|
|
||||||
startField.endEdit();
|
|
||||||
entry.startTime = startField.getTimestamp();
|
|
||||||
if (!entryRunning) {
|
|
||||||
endField.endEdit();
|
|
||||||
entry.endTime = endField.getTimestamp();
|
|
||||||
}
|
|
||||||
await saveTracker(tracker, getFile(), getSectionInfo());
|
|
||||||
editButton.setIcon("lucide-pencil");
|
|
||||||
|
|
||||||
renderNameAsMarkdown(nameField.label, getFile, component);
|
|
||||||
} else {
|
|
||||||
nameField.beginEdit(entry.name);
|
|
||||||
expandButton.buttonEl.style.display = "none";
|
|
||||||
// only allow editing start and end times if we don't have sub entries
|
|
||||||
if (!entry.subEntries) {
|
|
||||||
startField.beginEdit(entry.startTime);
|
|
||||||
if (!entryRunning)
|
|
||||||
endField.beginEdit(entry.endTime);
|
|
||||||
}
|
|
||||||
editButton.setIcon("lucide-check");
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Add double-click to edit functionality
|
||||||
|
nameField.label.addEventListener('dblclick', async () => {
|
||||||
|
if (!nameField.editing()) {
|
||||||
|
await handleEdit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
async function handleEdit() {
|
||||||
|
if (nameField.editing()) {
|
||||||
|
await saveChanges();
|
||||||
|
} else {
|
||||||
|
startEditing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function saveChanges() {
|
||||||
|
entry.name = nameField.endEdit();
|
||||||
|
expandButton.buttonEl.style.display = null;
|
||||||
|
startField.endEdit();
|
||||||
|
entry.startTime = startField.getTimestamp();
|
||||||
|
if (!entryRunning) {
|
||||||
|
endField.endEdit();
|
||||||
|
entry.endTime = endField.getTimestamp();
|
||||||
|
}
|
||||||
|
await saveTracker(tracker, getFile(), getSectionInfo());
|
||||||
|
editButton.setIcon("lucide-pencil");
|
||||||
|
renderNameAsMarkdown(nameField.label, getFile, component);
|
||||||
|
}
|
||||||
|
|
||||||
|
function startEditing() {
|
||||||
|
nameField.beginEdit(entry.name);
|
||||||
|
expandButton.buttonEl.style.display = "none";
|
||||||
|
// only allow editing start and end times if we don't have sub entries
|
||||||
|
if (!entry.subEntries) {
|
||||||
|
startField.beginEdit(entry.startTime);
|
||||||
|
if (!entryRunning)
|
||||||
|
endField.beginEdit(entry.endTime);
|
||||||
|
}
|
||||||
|
editButton.setIcon("lucide-check");
|
||||||
|
|
||||||
|
// Set up save/cancel handlers for keyboard shortcuts
|
||||||
|
nameField.onSave = startField.onSave = endField.onSave = async () => {
|
||||||
|
await saveChanges();
|
||||||
|
};
|
||||||
|
|
||||||
|
nameField.onCancel = startField.onCancel = endField.onCancel = () => {
|
||||||
|
nameField.endEdit();
|
||||||
|
startField.endEdit();
|
||||||
|
if (!entryRunning) {
|
||||||
|
endField.endEdit();
|
||||||
|
}
|
||||||
|
expandButton.buttonEl.style.display = null;
|
||||||
|
editButton.setIcon("lucide-pencil");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
new ButtonComponent(entryButtons)
|
new ButtonComponent(entryButtons)
|
||||||
.setClass("clickable-icon")
|
.setClass("clickable-icon")
|
||||||
.setTooltip("Remove")
|
.setTooltip("Remove")
|
||||||
|
@ -449,6 +483,8 @@ class EditableField {
|
||||||
cell: HTMLTableCellElement;
|
cell: HTMLTableCellElement;
|
||||||
label: HTMLSpanElement;
|
label: HTMLSpanElement;
|
||||||
box: TextComponent;
|
box: TextComponent;
|
||||||
|
onSave?: () => void;
|
||||||
|
onCancel?: () => void;
|
||||||
|
|
||||||
constructor(row: HTMLTableRowElement, indent: number, value: string) {
|
constructor(row: HTMLTableRowElement, indent: number, value: string) {
|
||||||
this.cell = row.createEl("td");
|
this.cell = row.createEl("td");
|
||||||
|
@ -457,6 +493,18 @@ class EditableField {
|
||||||
this.box = new TextComponent(this.cell).setValue(value);
|
this.box = new TextComponent(this.cell).setValue(value);
|
||||||
this.box.inputEl.addClass("simple-time-tracker-input");
|
this.box.inputEl.addClass("simple-time-tracker-input");
|
||||||
this.box.inputEl.hide();
|
this.box.inputEl.hide();
|
||||||
|
this.box.inputEl.addEventListener('keydown', (e: KeyboardEvent) => {
|
||||||
|
// Save with Ctrl/Cmd + Enter
|
||||||
|
if (e.key === 'Enter') {
|
||||||
|
e.preventDefault();
|
||||||
|
this.onSave?.();
|
||||||
|
}
|
||||||
|
// Cancel with Escape
|
||||||
|
if (e.key === 'Escape') {
|
||||||
|
e.preventDefault();
|
||||||
|
this.onCancel?.();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
editing(): boolean {
|
editing(): boolean {
|
||||||
|
|
Loading…
Reference in a new issue