1
1
import type JsEnginePlugin from 'jsEngine/main' ;
2
2
import { StartupScriptsModal } from 'jsEngine/settings/StartupScriptModal' ;
3
3
import type { App } from 'obsidian' ;
4
- import { normalizePath , PluginSettingTab , Setting } from 'obsidian' ;
4
+ import { normalizePath , PluginSettingTab , Setting , TFolder , TFile } from 'obsidian' ;
5
5
6
6
export interface JsEnginePluginSettings {
7
7
startupScriptsDirectory : string | undefined ;
@@ -41,6 +41,11 @@ export class JsEnginePluginSettingTab extends PluginSettingTab {
41
41
new Setting ( containerEl )
42
42
. setName ( 'JS snippets (loaded on startup)' )
43
43
. setHeading ( )
44
+ . addExtraButton ( el => {
45
+ el . setTooltip ( 'Reload snippets' )
46
+ . setIcon ( 'refresh-cw' )
47
+ . onClick ( ( ) => this . display ( ) ) ;
48
+ } )
44
49
. addExtraButton ( el => {
45
50
el . setTooltip ( 'Open snippets folder' )
46
51
. setIcon ( 'folder-open' )
@@ -53,27 +58,67 @@ export class JsEnginePluginSettingTab extends PluginSettingTab {
53
58
. addText ( el => {
54
59
el . setPlaceholder ( this . getDefaultStartupScriptsDirectory ( ) )
55
60
. 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 ) ) ;
64
62
} ) ;
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
+ }
65
81
}
66
82
67
83
getDefaultStartupScriptsDirectory ( ) : string {
68
84
return normalizePath ( '' . concat ( this . app . vault . configDir , '/scripts' ) ) ;
69
85
}
70
86
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
+
71
101
async openStartupScriptsDirectory ( ) : Promise < void > {
72
102
const vault = this . app . vault ;
73
- const directory = this . plugin . settings . startupScriptsDirectory ?? this . getDefaultStartupScriptsDirectory ( ) ;
103
+ const directory = this . getStartupScriptsDirectory ( ) ;
74
104
if ( ( await vault . adapter . exists ( directory ) ) == false ) {
75
105
await vault . createFolder ( directory ) ;
76
106
}
77
107
this . app . openWithDefaultApp ( directory ) ;
78
108
}
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
+ }
79
124
}
0 commit comments