From 7f6a200c51a2f726878c2014dd2edc7171efdfb0 Mon Sep 17 00:00:00 2001 From: "Michael J. Pedersen" Date: Tue, 17 Jan 2023 19:55:07 -0500 Subject: [PATCH] Actual GUI in place that will run the fill vault, allowing the user to specify number of notes and some characteristics of the vault. --- main.ts | 146 ++----------------------------------------------------- vault.ts | 60 ++++++++++++++++++++++- 2 files changed, 62 insertions(+), 144 deletions(-) diff --git a/main.ts b/main.ts index f11c8e1..8bbd015 100644 --- a/main.ts +++ b/main.ts @@ -1,28 +1,15 @@ -import {App, Modal, Notice, Plugin, PluginSettingTab, Setting, SliderComponent} from 'obsidian'; +import {Plugin} from 'obsidian'; import {newLoremNote} from "./loremnotes"; -import {fillVault} from "./vault"; +import {TestingVaultModal} from "./vault"; /* - Defaults for the plugin: - * Number of notes to make: 1000 - * From comment on Discord: You might also want to consider adding other rando text generations, other than lorem ipsum, such as https://www.npmjs.com/package/txtgen That way, you can have some actual English text to benchmark, which might be interesting for linguistic-related plugins */ -interface TestingVaultPluginSettings { - mySetting: string; -} - -const DEFAULT_SETTINGS: TestingVaultPluginSettings = { - mySetting: 'default' -} - export default class TestingVaultPlugin extends Plugin { - settings: TestingVaultPluginSettings; - async deleteVaultContents() { this.app.vault.getFiles().map(async (fname) => { await this.app.vault.delete(fname, true) @@ -30,31 +17,6 @@ export default class TestingVaultPlugin extends Plugin { } async onload() { - await this.loadSettings(); - - // This adds a status bar item to the bottom of the app. Does not work on mobile apps. - // const statusBarItemEl = this.addStatusBarItem(); - /* - // This creates an icon in the left ribbon. - const ribbonIconEl = this.addRibbonIcon('dice', 'Sample Plugin', (evt: MouseEvent) => { - // Called when the user clicks the icon. - new Notice('This is a notice!'); - }); - // Perform additional things with the ribbon - ribbonIconEl.addClass('my-plugin-ribbon-class'); - */ - - - /* - // This adds a simple command that can be triggered anywhere - this.addCommand({ - id: 'open-sample-modal-simple', - name: 'Open sample modal (simple)', - callback: () => { - new TestingVaultModal(this.app).open(); - } - }); - */ // Create a single randomized note of lorem ipsum. this.addCommand({ id: 'testing-vault-single-note', @@ -69,9 +31,8 @@ export default class TestingVaultPlugin extends Plugin { id: 'testing-vault-fill-vault', name: 'Make a group of randomized notes in your vault', callback: () => { - const maxnotes = 100; - let task_status = new Notice('Generating new testing vault', 0); - fillVault(maxnotes, task_status, this.app.vault, {}); + const maxnotes = 1000; + new TestingVaultModal(this.app).open(); } }); this.addCommand({ @@ -81,109 +42,10 @@ export default class TestingVaultPlugin extends Plugin { this.deleteVaultContents(); } }) - /* - // This adds an editor command that can perform some operation on the current editor instance - this.addCommand({ - id: 'sample-editor-command', - name: 'Sample editor command', - editorCallback: (editor: Editor, view: MarkdownView) => { - console.log(editor.getSelection()); - editor.replaceSelection('Sample Editor Command'); - } - }); - */ - /* - // This adds a complex command that can check whether the current state of the app allows execution of the command - this.addCommand({ - id: 'open-sample-modal-complex', - name: 'Open sample modal (complex)', - checkCallback: (checking: boolean) => { - // Conditions to check - const markdownView = this.app.workspace.getActiveViewOfType(MarkdownView); - if (markdownView) { - // If checking is true, we're simply "checking" if the command can be run. - // If checking is false, then we want to actually perform the operation. - if (!checking) { - new SampleModal(this.app).open(); - } - - // This command will only show up in Command Palette when the check function returns true - return true; - } - } - }); - */ - - // This adds a settings tab so the user can configure various aspects of the plugin - this.addSettingTab(new SampleSettingTab(this.app, this)); - - /* - // If the plugin hooks up any global DOM events (on parts of the app that doesn't belong to this plugin) - // Using this function will automatically remove the event listener when this plugin is disabled. - this.registerDomEvent(document, 'click', (evt: MouseEvent) => { - console.log('click', evt); - }); - - // When registering intervals, this function will automatically clear the interval when the plugin is disabled. - this.registerInterval(window.setInterval(() => console.log('setInterval'), 5 * 60 * 1000)); - */ } onunload() { } - - async loadSettings() { - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); - } - - async saveSettings() { - await this.saveData(this.settings); - } } -class TestingVaultModal extends Modal { - constructor(app: App) { - super(app); - } - - onOpen() { - const {contentEl} = this; - const slider = new SliderComponent(contentEl); - slider.setLimits(1, 100, 1); - } - - onClose() { - const {contentEl} = this; - contentEl.empty(); - } -} - -class SampleSettingTab extends PluginSettingTab { - plugin: TestingVaultPlugin; - - constructor(app: App, plugin: TestingVaultPlugin) { - super(app, plugin); - this.plugin = plugin; - } - - display(): void { - const {containerEl} = this; - - containerEl.empty(); - - containerEl.createEl('h2', {text: 'Settings for my awesome plugin.'}); - - new Setting(containerEl) - .setName('Setting #1') - .setDesc('It\'s a secret') - .addText(text => text - .setPlaceholder('Enter your secret') - .setValue(this.plugin.settings.mySetting) - .onChange(async (value) => { - console.log('Secret: ' + value); - this.plugin.settings.mySetting = value; - await this.plugin.saveSettings(); - })); - } -} diff --git a/vault.ts b/vault.ts index 3bc7f31..07bf34d 100644 --- a/vault.ts +++ b/vault.ts @@ -1,8 +1,8 @@ -import {Notice, Vault} from "obsidian"; +import {App, ButtonComponent, Modal, Notice, SliderComponent, TextComponent, Vault} from "obsidian"; import {INoteGenerator, newLoremNote, newTitle} from "./loremnotes"; import {randomInt} from "./random"; -export async function fillVault(maxNotes: number = 100, notice: Notice, vault: Vault, { +export async function fillVault(maxNotes: number = 1000, notice: Notice, vault: Vault, { emptyFilesPercent = 3, orphanedNotesPercent = 5, leafNotesPercent = 25, @@ -92,3 +92,59 @@ export async function fillVault(maxNotes: number = 100, notice: Notice, vault: V await notice.setMessage(`Vault generated ${maxNotes} notes`); setTimeout(() => notice.hide(), 4000); } + +export class TestingVaultModal extends Modal { + constructor(app: App) { + super(app); + } + + createSlider(title: string, min: number, max: number, step: number, defaultVal: number, parentEl: HTMLElement): SliderComponent { + const div = parentEl.createDiv(); + const sliderSpan = div.createSpan({text: title}) + const slider = new SliderComponent(sliderSpan); + const percent = new TextComponent(sliderSpan); + slider.setLimits(min, max, step); + slider.setValue(defaultVal); + percent.setValue(defaultVal.toString()); + slider.onChange((value: number) => { + percent.setValue(value.toString()) + }); + percent.onChange((value: string) => { + const svalue = parseInt(value); + if (!isNaN(svalue)) { + slider.setValue(parseInt(value)); + } else { + slider.setValue(defaultVal); + } + }) + return slider; + } + + onOpen() { + const {contentEl} = this; + contentEl.empty(); + const notesDiv = contentEl.createDiv(); + const notes = this.createSlider('Number of Notes', 50, 50000, 50, 1000, notesDiv); + const distributions = contentEl.createDiv(); + distributions.createEl('h1', {text: 'File Distributions'}) + const empty = this.createSlider('Empty (%)', 0, 100, 1, 3, distributions); + const orphaned = this.createSlider('Orphaned (%)', 0, 100, 1, 5, distributions); + const leaf = this.createSlider('Leaf Nodes (%)', 0, 100, 1, 25, distributions); + const okbutton = new ButtonComponent(contentEl); + okbutton.setButtonText('Okay'); + okbutton.onClick((evt: MouseEvent) => { + let task_status = new Notice('Generating new testing vault', 0); + fillVault(notes.getValue(), task_status, this.app.vault, { + emptyFilesPercent: empty.getValue(), + orphanedNotesPercent: orphaned.getValue(), + leafNotesPercent: leaf.getValue() + }); + this.close(); + }) + } + + onClose() { + const {contentEl} = this; + contentEl.empty(); + } +}