11import type JsEnginePlugin from 'jsEngine/main' ;
22import { StartupScriptsModal } from 'jsEngine/settings/StartupScriptModal' ;
33import type { App } from 'obsidian' ;
4- import { normalizePath , PluginSettingTab , Setting } from 'obsidian' ;
4+ import { normalizePath , PluginSettingTab , Setting , TFolder , TFile } from 'obsidian' ;
55
66export interface JsEnginePluginSettings {
77 startupScriptsDirectory : string | undefined ;
@@ -41,6 +41,11 @@ export class JsEnginePluginSettingTab extends PluginSettingTab {
4141 new Setting ( containerEl )
4242 . setName ( 'JS snippets (loaded on startup)' )
4343 . setHeading ( )
44+ . addExtraButton ( el => {
45+ el . setTooltip ( 'Reload snippets' )
46+ . setIcon ( 'refresh-cw' )
47+ . onClick ( ( ) => this . display ( ) ) ;
48+ } )
4449 . addExtraButton ( el => {
4550 el . setTooltip ( 'Open snippets folder' )
4651 . setIcon ( 'folder-open' )
@@ -53,27 +58,67 @@ export class JsEnginePluginSettingTab extends PluginSettingTab {
5358 . addText ( el => {
5459 el . setPlaceholder ( this . getDefaultStartupScriptsDirectory ( ) )
5560 . setValue ( settings . startupScriptsDirectory ?? '' )
56- . onChange ( async ( val : string ) => {
57- if ( val ) {
58- settings . startupScriptsDirectory = normalizePath ( val ) ;
59- } else {
60- settings . startupScriptsDirectory = undefined ;
61- }
62- await this . plugin . saveSettings ( ) ;
63- } ) ;
61+ . onChange ( async val => await this . setStartupScriptsDirectory ( val ) ) ;
6462 } ) ;
63+
64+ const startupScriptsDirectory = this . app . vault . getFolderByPath ( this . getStartupScriptsDirectory ( ) ) ;
65+ let startupScripts : TFile [ ] = [ ] ;
66+ if ( startupScriptsDirectory != null ) {
67+ startupScripts = this . listJSfilesInDirectory ( startupScriptsDirectory ) ;
68+ }
69+ if ( startupScriptsDirectory == null || startupScripts . length == 0 ) {
70+ new Setting ( containerEl ) . setName ( 'No JS snippets found' ) . setDesc ( `JS snippets are stored in "vault/${ this . getStartupScriptsDirectory ( ) } "` ) ;
71+ } else {
72+ for ( const file of startupScripts ) {
73+ new Setting ( containerEl )
74+ . setName ( file . basename )
75+ . setDesc ( `Apply JS snippet from "vault/${ file . path } "` )
76+ . addToggle ( el => {
77+ el . setValue ( settings . startupScripts . contains ( file . path ) ) . onChange ( val => this . toggleStartupScript ( file , val ) ) ;
78+ } ) ;
79+ }
80+ }
6581 }
6682
6783 getDefaultStartupScriptsDirectory ( ) : string {
6884 return normalizePath ( '' . concat ( this . app . vault . configDir , '/scripts' ) ) ;
6985 }
7086
87+ getStartupScriptsDirectory ( ) : string {
88+ return this . plugin . settings . startupScriptsDirectory ?? this . getDefaultStartupScriptsDirectory ( ) ;
89+ }
90+
91+ async setStartupScriptsDirectory ( directory : string ) : Promise < void > {
92+ const settings = this . plugin . settings ;
93+ if ( directory ) {
94+ settings . startupScriptsDirectory = normalizePath ( directory ) ;
95+ } else {
96+ settings . startupScriptsDirectory = undefined ;
97+ }
98+ await this . plugin . saveSettings ( ) ;
99+ }
100+
71101 async openStartupScriptsDirectory ( ) : Promise < void > {
72102 const vault = this . app . vault ;
73- const directory = this . plugin . settings . startupScriptsDirectory ?? this . getDefaultStartupScriptsDirectory ( ) ;
103+ const directory = this . getStartupScriptsDirectory ( ) ;
74104 if ( ( await vault . adapter . exists ( directory ) ) == false ) {
75105 await vault . createFolder ( directory ) ;
76106 }
77107 this . app . openWithDefaultApp ( directory ) ;
78108 }
109+
110+ listJSfilesInDirectory ( directory : TFolder ) : TFile [ ] {
111+ const files = directory . children . filter ( el => el instanceof TFile ) ;
112+ const folders = directory . children . filter ( el => el instanceof TFolder ) ;
113+ return files . concat ( folders . flatMap ( dir => this . listJSfilesInDirectory ( dir ) ) )
114+ }
115+
116+ toggleStartupScript ( file : TFile , enable : boolean ) : void {
117+ const settings = this . plugin . settings ;
118+ if ( enable ) {
119+ settings . startupScripts . push ( file . path ) ;
120+ } else {
121+ settings . startupScripts . remove ( file . path ) ;
122+ }
123+ }
79124}
0 commit comments