mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-07-29 02:52:27 +08:00
feat: "friendly number handling" for note erasure timeouts
This commit is contained in:
parent
1e95135720
commit
2bb79c4209
@ -11,26 +11,62 @@ const TPL = `
|
|||||||
<p>${t("note_erasure_timeout.note_erasure_description")}</p>
|
<p>${t("note_erasure_timeout.note_erasure_description")}</p>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>${t("note_erasure_timeout.erase_notes_after_x_seconds")}</label>
|
<label for="erase-entities-after-time">${t("note_erasure_timeout.erase_notes_after_x_seconds")}</label>
|
||||||
<input class="erase-entities-after-time-in-seconds form-control options-number-input" type="number" min="0">
|
<div class="d-flex gap-2">
|
||||||
|
<input id="erase-entities-after-time" class="form-control options-number-input" type="number" min="0" steps="1" required>
|
||||||
|
<!-- TriliumNextTODO: i18n the strings -->
|
||||||
|
<select id="erase-entities-after-time-scale" class="form-select" required>
|
||||||
|
<option value="1">Seconds</option>
|
||||||
|
<option value="60">Minutes</option>
|
||||||
|
<option value="3600">Hours</option>
|
||||||
|
<option value="86400">Days</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>${t("note_erasure_timeout.manual_erasing_description")}</p>
|
<p>${t("note_erasure_timeout.manual_erasing_description")}</p>
|
||||||
|
|
||||||
<button class="erase-deleted-notes-now-button btn btn-secondary">${t("note_erasure_timeout.erase_deleted_notes_now")}</button>
|
<button id="erase-deleted-notes-now-button" class="btn btn-secondary">${t("note_erasure_timeout.erase_deleted_notes_now")}</button>
|
||||||
</div>`;
|
</div>`;
|
||||||
|
|
||||||
export default class NoteErasureTimeoutOptions extends OptionsWidget {
|
export default class NoteErasureTimeoutOptions extends OptionsWidget {
|
||||||
|
|
||||||
private $eraseEntitiesAfterTimeInSeconds!: JQuery<HTMLElement>;
|
private $eraseEntitiesAfterTime!: JQuery<HTMLInputElement>;
|
||||||
private $eraseDeletedNotesButton!: JQuery<HTMLElement>;
|
private $eraseEntitiesAfterTimeScale!: JQuery<HTMLSelectElement>;
|
||||||
|
private $eraseDeletedNotesButton!: JQuery<HTMLButtonElement>;
|
||||||
|
private eraseEntitiesAfterTimeInSeconds!: string | number;
|
||||||
|
|
||||||
doRender() {
|
doRender() {
|
||||||
this.$widget = $(TPL);
|
this.$widget = $(TPL);
|
||||||
this.$eraseEntitiesAfterTimeInSeconds = this.$widget.find(".erase-entities-after-time-in-seconds");
|
this.$eraseEntitiesAfterTime = this.$widget.find("#erase-entities-after-time");
|
||||||
this.$eraseEntitiesAfterTimeInSeconds.on("change", () => this.updateOption("eraseEntitiesAfterTimeInSeconds", this.$eraseEntitiesAfterTimeInSeconds.val()));
|
this.$eraseEntitiesAfterTimeScale = this.$widget.find("#erase-entities-after-time-scale");
|
||||||
|
|
||||||
this.$eraseDeletedNotesButton = this.$widget.find(".erase-deleted-notes-now-button");
|
this.$eraseEntitiesAfterTime.on("change", () => {
|
||||||
|
const time = this.$eraseEntitiesAfterTime.val();
|
||||||
|
const timeScale = this.$eraseEntitiesAfterTimeScale.val();
|
||||||
|
|
||||||
|
if (!this.handleTimeValidation() || typeof timeScale !== "string" || !time) return;
|
||||||
|
|
||||||
|
this.eraseEntitiesAfterTimeInSeconds = this.convertTime(time, timeScale).toOption();
|
||||||
|
this.updateOption("eraseEntitiesAfterTimeInSeconds", this.eraseEntitiesAfterTimeInSeconds);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$eraseEntitiesAfterTimeScale.on("change", () => {
|
||||||
|
|
||||||
|
const timeScale = this.$eraseEntitiesAfterTimeScale.val();
|
||||||
|
|
||||||
|
if (!this.handleTimeValidation() || typeof timeScale !== "string") return;
|
||||||
|
|
||||||
|
//calculate the new displayed value
|
||||||
|
const displayedTime = this.convertTime(this.eraseEntitiesAfterTimeInSeconds, timeScale).toDisplay();
|
||||||
|
|
||||||
|
this.updateOption("eraseEntitiesAfterTimeScale", timeScale);
|
||||||
|
this.$eraseEntitiesAfterTime.val(displayedTime).trigger("change");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$eraseDeletedNotesButton = this.$widget.find("#erase-deleted-notes-now-button");
|
||||||
this.$eraseDeletedNotesButton.on("click", () => {
|
this.$eraseDeletedNotesButton.on("click", () => {
|
||||||
server.post("notes/erase-deleted-notes-now").then(() => {
|
server.post("notes/erase-deleted-notes-now").then(() => {
|
||||||
toastService.showMessage(t("note_erasure_timeout.deleted_notes_erased"));
|
toastService.showMessage(t("note_erasure_timeout.deleted_notes_erased"));
|
||||||
@ -39,6 +75,40 @@ export default class NoteErasureTimeoutOptions extends OptionsWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async optionsLoaded(options: OptionMap) {
|
async optionsLoaded(options: OptionMap) {
|
||||||
this.$eraseEntitiesAfterTimeInSeconds.val(options.eraseEntitiesAfterTimeInSeconds);
|
this.eraseEntitiesAfterTimeInSeconds = options.eraseEntitiesAfterTimeInSeconds;
|
||||||
|
|
||||||
|
const displayedTime = this.convertTime(options.eraseEntitiesAfterTimeInSeconds, options.eraseEntitiesAfterTimeScale).toDisplay();
|
||||||
|
this.$eraseEntitiesAfterTime.val(displayedTime);
|
||||||
|
this.$eraseEntitiesAfterTimeScale.val(options.eraseEntitiesAfterTimeScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
convertTime(time: string | number, timeScale: string | number) {
|
||||||
|
|
||||||
|
const value = typeof time === "number" ? time : parseInt(time);
|
||||||
|
if (Number.isNaN(value)) {
|
||||||
|
throw new Error(`Time needs to be a valid integer, but received: ${time}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const operand = typeof timeScale === "number" ? timeScale : parseInt(timeScale);
|
||||||
|
if (Number.isNaN(operand) || operand < 1) {
|
||||||
|
throw new Error(`TimeScale needs to be a valid integer >= 1, but received: ${timeScale}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
toOption: () => Math.ceil(value * operand),
|
||||||
|
toDisplay: () => Math.ceil(value / operand),
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
handleTimeValidation() {
|
||||||
|
if (this.$eraseEntitiesAfterTime.is(":invalid")) {
|
||||||
|
// TriliumNextTODO: i18n
|
||||||
|
toastService.showMessage("The entered time value is not a valid number.");
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import type { OptionNames } from "../../services/options_interface.js";
|
|||||||
// options allowed to be updated directly in the Options dialog
|
// options allowed to be updated directly in the Options dialog
|
||||||
const ALLOWED_OPTIONS = new Set([
|
const ALLOWED_OPTIONS = new Set([
|
||||||
"eraseEntitiesAfterTimeInSeconds",
|
"eraseEntitiesAfterTimeInSeconds",
|
||||||
|
"eraseEntitiesAfterTimeScale",
|
||||||
"protectedSessionTimeout",
|
"protectedSessionTimeout",
|
||||||
"revisionSnapshotTimeInterval",
|
"revisionSnapshotTimeInterval",
|
||||||
"revisionSnapshotNumberLimit",
|
"revisionSnapshotNumberLimit",
|
||||||
|
@ -105,6 +105,7 @@ const defaultOptions: DefaultOption[] = [
|
|||||||
{ name: "rightPaneVisible", value: "true", isSynced: false },
|
{ name: "rightPaneVisible", value: "true", isSynced: false },
|
||||||
{ name: "nativeTitleBarVisible", value: "false", isSynced: false },
|
{ name: "nativeTitleBarVisible", value: "false", isSynced: false },
|
||||||
{ name: "eraseEntitiesAfterTimeInSeconds", value: "604800", isSynced: true }, // default is 7 days
|
{ name: "eraseEntitiesAfterTimeInSeconds", value: "604800", isSynced: true }, // default is 7 days
|
||||||
|
{ name: "eraseEntitiesAfterTimeScale", value: "86400", isSynced: true }, // default 86400 seconds = Day
|
||||||
{ name: "hideArchivedNotes_main", value: "false", isSynced: false },
|
{ name: "hideArchivedNotes_main", value: "false", isSynced: false },
|
||||||
{ name: "debugModeEnabled", value: "false", isSynced: false },
|
{ name: "debugModeEnabled", value: "false", isSynced: false },
|
||||||
{ name: "headingStyle", value: "underline", isSynced: true },
|
{ name: "headingStyle", value: "underline", isSynced: true },
|
||||||
|
@ -61,6 +61,7 @@ export interface OptionDefinitions extends KeyboardShortcutsOptions<KeyboardActi
|
|||||||
leftPaneWidth: number;
|
leftPaneWidth: number;
|
||||||
rightPaneWidth: number;
|
rightPaneWidth: number;
|
||||||
eraseEntitiesAfterTimeInSeconds: number;
|
eraseEntitiesAfterTimeInSeconds: number;
|
||||||
|
eraseEntitiesAfterTimeScale: number;
|
||||||
autoReadonlySizeText: number;
|
autoReadonlySizeText: number;
|
||||||
autoReadonlySizeCode: number;
|
autoReadonlySizeCode: number;
|
||||||
maxContentWidth: number;
|
maxContentWidth: number;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user