1- import { App , PluginSettingTab , Setting } from "obsidian" ;
1+ import { App , PluginSettingTab , Setting , TFolder } from "obsidian" ;
22import NapkinNotesPlugin from "../../main" ;
33
44export class NapkinNotesSettingTab extends PluginSettingTab {
@@ -15,67 +15,57 @@ export class NapkinNotesSettingTab extends PluginSettingTab {
1515
1616 containerEl . createEl ( "h2" , { text : "Napkin Notes Settings" } ) ;
1717
18- // Upload folder setting
18+ // Upload folder setting with auto-suggest for valid folder paths
1919 new Setting ( containerEl )
2020 . setName ( "Upload folder" )
2121 . setDesc (
22- "Folder for physical note images . Leave empty to use the vault's default attachment folder."
22+ "Folder for image attachments . Leave empty to use the vault's default attachment folder (recommended) ."
2323 )
24- . addText ( ( text ) =>
24+ . addText ( ( text ) => {
25+ const folders = this . app . vault
26+ . getAllLoadedFiles ( )
27+ . filter ( ( file ) => file instanceof TFolder )
28+ . map ( ( folder ) => folder . path ) ;
29+
2530 text
2631 . setPlaceholder ( "folder/path" )
27- . setValue ( this . plugin . settings . uploadFolder )
32+ . setValue ( this . plugin . settings . uploadFolder || "" )
2833 . onChange ( async ( value ) => {
29- this . plugin . settings . uploadFolder = value ;
34+ this . plugin . settings . uploadFolder = value . trim ( ) ;
3035 await this . plugin . saveSettings ( ) ;
31- } )
32- ) ;
36+ } ) ;
3337
34- // Server port range
35- new Setting ( containerEl )
36- . setName ( "Server port range" )
37- . setDesc ( "Port range for the QR upload server (e.g., 8080-8090)" )
38- . addText ( ( text ) =>
39- text
40- . setPlaceholder ( "8080-8090" )
41- . setValue (
42- `${ this . plugin . settings . serverPortRange [ 0 ] } -${ this . plugin . settings . serverPortRange [ 1 ] } `
43- )
44- . onChange ( async ( value ) => {
45- const parts = value . split ( "-" ) ;
46- if ( parts . length === 2 ) {
47- const start = parseInt ( parts [ 0 ] . trim ( ) ) ;
48- const end = parseInt ( parts [ 1 ] . trim ( ) ) ;
49- if ( ! isNaN ( start ) && ! isNaN ( end ) && start < end ) {
50- this . plugin . settings . serverPortRange = [ start , end ] ;
51- await this . plugin . saveSettings ( ) ;
52- }
53- }
54- } )
55- ) ;
38+ text . inputEl . addEventListener ( "input" , ( e ) => {
39+ const inputValue = ( e . target as HTMLInputElement ) . value ;
40+ const suggestions = folders . filter ( ( folder ) =>
41+ folder . toLowerCase ( ) . includes ( inputValue . toLowerCase ( ) )
42+ ) ;
5643
57- // Enable carousel in reading view
58- new Setting ( containerEl )
59- . setName ( "Enable carousel in reading view" )
60- . setDesc (
61- "Display physical notes as an interactive carousel instead of static images in reading view"
62- )
63- . addToggle ( ( toggle ) =>
64- toggle
65- . setValue ( this . plugin . settings . enableCarousel )
66- . onChange ( async ( value ) => {
67- this . plugin . settings . enableCarousel = value ;
68- await this . plugin . saveSettings ( ) ;
69- // Trigger re-render of reading views
70- this . app . workspace . trigger ( "css-change" ) ;
71- } )
72- ) ;
44+ // Clear existing datalist
45+ let dataList = text . inputEl . nextElementSibling ;
46+ if ( dataList && dataList . tagName === "DATALIST" ) {
47+ dataList . remove ( ) ;
48+ }
49+
50+ // Create new datalist
51+ dataList = document . createElement ( "datalist" ) ;
52+ dataList . id = "folder-suggestions" ;
53+ suggestions . forEach ( ( folder ) => {
54+ const option = document . createElement ( "option" ) ;
55+ option . value = folder ;
56+ dataList . appendChild ( option ) ;
57+ } ) ;
58+
59+ text . inputEl . setAttribute ( "list" , "folder-suggestions" ) ;
60+ text . inputEl . parentElement ?. appendChild ( dataList ) ;
61+ } ) ;
62+ } ) ;
7363
7464 // Napkin Mode background
7565 new Setting ( containerEl )
76- . setName ( "Enable Napkin Mode" )
66+ . setName ( "Napkin Mode" )
7767 . setDesc (
78- "When enabled, the carousel background uses a napkin paper texture based on your theme (light/dark)."
68+ "When enabled, the viewer has a paper napkin texture based on your theme (light/dark). Must re-open note to see change "
7969 )
8070 . addToggle ( ( toggle ) =>
8171 toggle
0 commit comments