mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-27 16:26:31 +01:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			feat/impro
			...
			algolia_v1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | baed93e749 | 
							
								
								
									
										2
									
								
								libraries/autocomplete-theme-classic.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								libraries/autocomplete-theme-classic.css
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										7
									
								
								libraries/autocomplete.jquery.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								libraries/autocomplete.jquery.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										9
									
								
								libraries/autocomplete.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								libraries/autocomplete.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										182
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										182
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -616,9 +616,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "@types/eslint": { | ||||
|       "version": "8.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.0.tgz", | ||||
|       "integrity": "sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ==", | ||||
|       "version": "8.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.1.tgz", | ||||
|       "integrity": "sha512-UP9rzNn/XyGwb5RQ2fok+DzcIRIYwc16qTXse5+Smsy8MOIccCChT15KAwnsgQx4PzJkaMq4myFyZ4CL5TjhIQ==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/estree": "*", | ||||
| @@ -1468,20 +1468,20 @@ | ||||
|       "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" | ||||
|     }, | ||||
|     "body-parser": { | ||||
|       "version": "1.19.0", | ||||
|       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", | ||||
|       "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", | ||||
|       "version": "1.19.1", | ||||
|       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", | ||||
|       "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", | ||||
|       "requires": { | ||||
|         "bytes": "3.1.0", | ||||
|         "bytes": "3.1.1", | ||||
|         "content-type": "~1.0.4", | ||||
|         "debug": "2.6.9", | ||||
|         "depd": "~1.1.2", | ||||
|         "http-errors": "1.7.2", | ||||
|         "http-errors": "1.8.1", | ||||
|         "iconv-lite": "0.4.24", | ||||
|         "on-finished": "~2.3.0", | ||||
|         "qs": "6.7.0", | ||||
|         "raw-body": "2.4.0", | ||||
|         "type-is": "~1.6.17" | ||||
|         "qs": "6.9.6", | ||||
|         "raw-body": "2.4.2", | ||||
|         "type-is": "~1.6.18" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "debug": { | ||||
| @@ -1491,6 +1491,38 @@ | ||||
|           "requires": { | ||||
|             "ms": "2.0.0" | ||||
|           } | ||||
|         }, | ||||
|         "http-errors": { | ||||
|           "version": "1.8.1", | ||||
|           "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", | ||||
|           "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", | ||||
|           "requires": { | ||||
|             "depd": "~1.1.2", | ||||
|             "inherits": "2.0.4", | ||||
|             "setprototypeof": "1.2.0", | ||||
|             "statuses": ">= 1.5.0 < 2", | ||||
|             "toidentifier": "1.0.1" | ||||
|           } | ||||
|         }, | ||||
|         "inherits": { | ||||
|           "version": "2.0.4", | ||||
|           "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
|           "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | ||||
|         }, | ||||
|         "qs": { | ||||
|           "version": "6.9.6", | ||||
|           "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", | ||||
|           "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" | ||||
|         }, | ||||
|         "setprototypeof": { | ||||
|           "version": "1.2.0", | ||||
|           "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", | ||||
|           "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" | ||||
|         }, | ||||
|         "toidentifier": { | ||||
|           "version": "1.0.1", | ||||
|           "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", | ||||
|           "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
| @@ -1831,9 +1863,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "bytes": { | ||||
|       "version": "3.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", | ||||
|       "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" | ||||
|       "version": "3.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", | ||||
|       "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" | ||||
|     }, | ||||
|     "cacache": { | ||||
|       "version": "15.3.0", | ||||
| @@ -1920,9 +1952,9 @@ | ||||
|       "dev": true | ||||
|     }, | ||||
|     "caniuse-lite": { | ||||
|       "version": "1.0.30001283", | ||||
|       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", | ||||
|       "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==", | ||||
|       "version": "1.0.30001286", | ||||
|       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz", | ||||
|       "integrity": "sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "caseless": { | ||||
| @@ -3702,9 +3734,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "electron-to-chromium": { | ||||
|       "version": "1.4.8", | ||||
|       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.8.tgz", | ||||
|       "integrity": "sha512-Cu5+dbg55+1E3ohlsa8HT0s4b8D0gBewXEGG8s5wBl8ynWv60VuvYW25GpsOeTVXpulhyU/U8JYZH+yxASSJBQ==", | ||||
|       "version": "1.4.16", | ||||
|       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz", | ||||
|       "integrity": "sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "electron-window-state": { | ||||
| @@ -3995,6 +4027,28 @@ | ||||
|         "vary": "~1.1.2" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "body-parser": { | ||||
|           "version": "1.19.0", | ||||
|           "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", | ||||
|           "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", | ||||
|           "requires": { | ||||
|             "bytes": "3.1.0", | ||||
|             "content-type": "~1.0.4", | ||||
|             "debug": "2.6.9", | ||||
|             "depd": "~1.1.2", | ||||
|             "http-errors": "1.7.2", | ||||
|             "iconv-lite": "0.4.24", | ||||
|             "on-finished": "~2.3.0", | ||||
|             "qs": "6.7.0", | ||||
|             "raw-body": "2.4.0", | ||||
|             "type-is": "~1.6.17" | ||||
|           } | ||||
|         }, | ||||
|         "bytes": { | ||||
|           "version": "3.1.0", | ||||
|           "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", | ||||
|           "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" | ||||
|         }, | ||||
|         "debug": { | ||||
|           "version": "2.6.9", | ||||
|           "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", | ||||
| @@ -4002,6 +4056,17 @@ | ||||
|           "requires": { | ||||
|             "ms": "2.0.0" | ||||
|           } | ||||
|         }, | ||||
|         "raw-body": { | ||||
|           "version": "2.4.0", | ||||
|           "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", | ||||
|           "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", | ||||
|           "requires": { | ||||
|             "bytes": "3.1.0", | ||||
|             "http-errors": "1.7.2", | ||||
|             "iconv-lite": "0.4.24", | ||||
|             "unpipe": "1.0.0" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
| @@ -5100,9 +5165,9 @@ | ||||
|       "dev": true | ||||
|     }, | ||||
|     "jest-worker": { | ||||
|       "version": "27.4.2", | ||||
|       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz", | ||||
|       "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==", | ||||
|       "version": "27.4.4", | ||||
|       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz", | ||||
|       "integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/node": "*", | ||||
| @@ -5891,9 +5956,9 @@ | ||||
|       "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" | ||||
|     }, | ||||
|     "multer": { | ||||
|       "version": "1.4.3", | ||||
|       "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.3.tgz", | ||||
|       "integrity": "sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg==", | ||||
|       "version": "1.4.4", | ||||
|       "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", | ||||
|       "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", | ||||
|       "requires": { | ||||
|         "append-field": "^1.0.0", | ||||
|         "busboy": "^0.2.11", | ||||
| @@ -6513,9 +6578,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "postcss": { | ||||
|       "version": "8.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.0.tgz", | ||||
|       "integrity": "sha512-BRMNx3Wy7UI89jN8H4ZVS5lQMPM2OSMkOkvDCSjwXa7PWTs24k7Lm55NXLbMbs070LvraXaxN5l1npSOS6wMVw==", | ||||
|       "version": "8.4.4", | ||||
|       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", | ||||
|       "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", | ||||
|       "requires": { | ||||
|         "nanoid": "^3.1.30", | ||||
|         "picocolors": "^1.0.0", | ||||
| @@ -6669,14 +6734,43 @@ | ||||
|       "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" | ||||
|     }, | ||||
|     "raw-body": { | ||||
|       "version": "2.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", | ||||
|       "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", | ||||
|       "version": "2.4.2", | ||||
|       "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", | ||||
|       "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", | ||||
|       "requires": { | ||||
|         "bytes": "3.1.0", | ||||
|         "http-errors": "1.7.2", | ||||
|         "bytes": "3.1.1", | ||||
|         "http-errors": "1.8.1", | ||||
|         "iconv-lite": "0.4.24", | ||||
|         "unpipe": "1.0.0" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "http-errors": { | ||||
|           "version": "1.8.1", | ||||
|           "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", | ||||
|           "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", | ||||
|           "requires": { | ||||
|             "depd": "~1.1.2", | ||||
|             "inherits": "2.0.4", | ||||
|             "setprototypeof": "1.2.0", | ||||
|             "statuses": ">= 1.5.0 < 2", | ||||
|             "toidentifier": "1.0.1" | ||||
|           } | ||||
|         }, | ||||
|         "inherits": { | ||||
|           "version": "2.0.4", | ||||
|           "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
|           "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | ||||
|         }, | ||||
|         "setprototypeof": { | ||||
|           "version": "1.2.0", | ||||
|           "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", | ||||
|           "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" | ||||
|         }, | ||||
|         "toidentifier": { | ||||
|           "version": "1.0.1", | ||||
|           "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", | ||||
|           "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "rc": { | ||||
| @@ -6986,9 +7080,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "sanitize-html": { | ||||
|       "version": "2.6.0", | ||||
|       "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.6.0.tgz", | ||||
|       "integrity": "sha512-qc+NqTeaOi/QVAVs5gOY9tqIVk4r1pcUbx1Q2N1a609Os3TNlm85zll2d8g8m/RM6RWg9llir0SpAcePQVIC1w==", | ||||
|       "version": "2.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.6.1.tgz", | ||||
|       "integrity": "sha512-DzjSz3H5qDntD7s1TcWCSoRPmNR8UmA+y+xZQOvWgjATe2Br9ZW73+vD3Pj6Snrg0RuEuJdXgrKvnYuiuixRkA==", | ||||
|       "requires": { | ||||
|         "deepmerge": "^4.2.2", | ||||
|         "escape-string-regexp": "^4.0.0", | ||||
| @@ -8094,9 +8188,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "watchpack": { | ||||
|       "version": "2.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.0.tgz", | ||||
|       "integrity": "sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==", | ||||
|       "version": "2.3.1", | ||||
|       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", | ||||
|       "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "glob-to-regexp": "^0.4.1", | ||||
| @@ -8118,9 +8212,9 @@ | ||||
|       "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" | ||||
|     }, | ||||
|     "webpack": { | ||||
|       "version": "5.64.4", | ||||
|       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.4.tgz", | ||||
|       "integrity": "sha512-LWhqfKjCLoYJLKJY8wk2C3h77i8VyHowG3qYNZiIqD6D0ZS40439S/KVuc/PY48jp2yQmy0mhMknq8cys4jFMw==", | ||||
|       "version": "5.65.0", | ||||
|       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", | ||||
|       "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "@types/eslint-scope": "^3.7.0", | ||||
| @@ -8145,7 +8239,7 @@ | ||||
|         "schema-utils": "^3.1.0", | ||||
|         "tapable": "^2.1.1", | ||||
|         "terser-webpack-plugin": "^5.1.3", | ||||
|         "watchpack": "^2.3.0", | ||||
|         "watchpack": "^2.3.1", | ||||
|         "webpack-sources": "^3.2.2" | ||||
|       } | ||||
|     }, | ||||
|   | ||||
| @@ -28,7 +28,7 @@ | ||||
|     "async-mutex": "0.3.2", | ||||
|     "axios": "0.24.0", | ||||
|     "better-sqlite3": "7.4.5", | ||||
|     "body-parser": "1.19.0", | ||||
|     "body-parser": "1.19.1", | ||||
|     "chokidar": "3.5.2", | ||||
|     "cls-hooked": "4.2.2", | ||||
|     "commonmark": "0.30.0", | ||||
| @@ -67,7 +67,7 @@ | ||||
|     "request": "^2.88.2", | ||||
|     "rimraf": "3.0.2", | ||||
|     "sanitize-filename": "1.6.3", | ||||
|     "sanitize-html": "2.6.0", | ||||
|     "sanitize-html": "2.6.1", | ||||
|     "sax": "1.2.4", | ||||
|     "semver": "7.3.5", | ||||
|     "serve-favicon": "2.5.0", | ||||
|   | ||||
| @@ -30,8 +30,6 @@ bundleService.getWidgetBundlesByParent().then(widgetBundles => { | ||||
|  | ||||
| noteTooltipService.setupGlobalTooltip(); | ||||
|  | ||||
| noteAutocompleteService.init(); | ||||
|  | ||||
| if (utils.isElectron()) { | ||||
|     const electron = utils.dynamicRequire('electron'); | ||||
|  | ||||
|   | ||||
| @@ -41,7 +41,7 @@ export async function showDialog(widget, text = '') { | ||||
|         $linkTitle.val(noteTitle); | ||||
|     } | ||||
|  | ||||
|     noteAutocompleteService.initNoteAutocomplete($autoComplete, { | ||||
|     const ac = noteAutocompleteService.initNoteAutocomplete($autoComplete, { | ||||
|         allowExternalLinks: true, | ||||
|         allowCreatingNotes: true | ||||
|     }); | ||||
| @@ -84,7 +84,7 @@ export async function showDialog(widget, text = '') { | ||||
|     }); | ||||
|  | ||||
|     if (text && text.trim()) { | ||||
|         noteAutocompleteService.setText($autoComplete, text); | ||||
|         noteAutocompleteService.setText(ac, text); | ||||
|     } | ||||
|     else { | ||||
|         noteAutocompleteService.showRecentNotes($autoComplete); | ||||
|   | ||||
| @@ -12,7 +12,12 @@ const KEEP_LAST_SEARCH_FOR_X_SECONDS = 120; | ||||
| export async function showDialog() { | ||||
|     utils.openDialog($dialog); | ||||
|  | ||||
|     noteAutocompleteService.initNoteAutocomplete($autoComplete, { hideGoToSelectedNoteButton: true }) | ||||
|     const ac = noteAutocompleteService.initNoteAutocomplete($autoComplete, { | ||||
|         hideGoToSelectedNoteButton: true, | ||||
|         placeholder: "search for note by its name" | ||||
|     }); | ||||
|  | ||||
|     $autoComplete | ||||
|         // clear any event listener added in previous invocation of this function | ||||
|         .off('autocomplete:noteselected') | ||||
|         .on('autocomplete:noteselected', function(event, suggestion, dataset) { | ||||
| @@ -28,15 +33,12 @@ export async function showDialog() { | ||||
|     // so we'll keep the content. | ||||
|     // if it's outside of this time limit then we assume it's a completely new search and show recent notes instead. | ||||
|     if (Date.now() - lastOpenedTs > KEEP_LAST_SEARCH_FOR_X_SECONDS * 1000) { | ||||
|         noteAutocompleteService.showRecentNotes($autoComplete); | ||||
|         noteAutocompleteService.showRecentNotes(ac, $autoComplete); | ||||
|     } | ||||
|     else { | ||||
|         $autoComplete | ||||
|             // hack, the actual search value is stored in <pre> element next to the search input | ||||
|             // this is important because the search input value is replaced with the suggestion note's title | ||||
|             .autocomplete("val", $autoComplete.next().text()) | ||||
|             .trigger('focus') | ||||
|             .trigger('select'); | ||||
|         ac.setIsOpen(true); | ||||
|         ac.ext.focus(); | ||||
|         ac.ext.select(); | ||||
|     } | ||||
|  | ||||
|     lastOpenedTs = Date.now(); | ||||
|   | ||||
| @@ -8,7 +8,75 @@ import froca from "./froca.js"; | ||||
| // this key needs to have this value so it's hit by the tooltip | ||||
| const SELECTED_NOTE_PATH_KEY = "data-note-path"; | ||||
|  | ||||
| const SELECTED_EXTERNAL_LINK_KEY = "data-external-link"; | ||||
| const acMixin = { | ||||
|     selectedNotePath: "", | ||||
|     selectedExternalLink: "", | ||||
|     $el: "", | ||||
|  | ||||
|     focus() { | ||||
|         this.$el.find('.aa-Input').focus(); | ||||
|     }, | ||||
|  | ||||
|     select() { | ||||
|         this.$el.find('.aa-Input').select(); | ||||
|     }, | ||||
|  | ||||
|     getQuery() { | ||||
|         return this?.lastState.query; | ||||
|     }, | ||||
|  | ||||
|     getSelectedNotePath() { | ||||
|         if (!this.getQuery()) { | ||||
|             return ""; | ||||
|         } else { | ||||
|             return this.selectedNotePath; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     getSelectedNoteId() { | ||||
|         const notePath = this.getSelectedNotePath(); | ||||
|         const chunks = notePath.split('/'); | ||||
|  | ||||
|         return chunks.length >= 1 ? chunks[chunks.length - 1] : null; | ||||
|     }, | ||||
|  | ||||
|     setSelectedNotePath(notePath) { | ||||
|         notePath = notePath || ""; | ||||
|  | ||||
|         this.selectedNotePath = notePath; | ||||
|  | ||||
|         $(this) | ||||
|             .closest(".input-group") | ||||
|             .find(".go-to-selected-note-button") | ||||
|             .toggleClass("disabled", !notePath.trim()) | ||||
|             .attr(SELECTED_NOTE_PATH_KEY, notePath); // we also set attr here so tooltip can be displayed | ||||
|     }, | ||||
|  | ||||
|     getSelectedExternalLink() { | ||||
|         if (!$(this).val().trim()) { | ||||
|             return ""; | ||||
|         } else { | ||||
|             return this.selectedExternalLink; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     setSelectedExternalLink(externalLink) { | ||||
|         this.selectedExternalLink = externalLink; | ||||
|  | ||||
|         $(this) | ||||
|             .closest(".input-group") | ||||
|             .find(".go-to-selected-note-button") | ||||
|             .toggleClass("disabled", true); | ||||
|     }, | ||||
|  | ||||
|     async setNote(noteId) { | ||||
|         const note = noteId ? await froca.getNote(noteId, true) : null; | ||||
|  | ||||
|         $(this) | ||||
|             .val(note ? note.title : "") | ||||
|             .setSelectedNotePath(noteId); | ||||
|     } | ||||
| } | ||||
|  | ||||
| async function autocompleteSourceForCKEditor(queryText) { | ||||
|     return await new Promise((res, rej) => { | ||||
| @@ -30,7 +98,7 @@ async function autocompleteSourceForCKEditor(queryText) { | ||||
|     }); | ||||
| } | ||||
|  | ||||
| async function autocompleteSource(term, cb, options = {}) { | ||||
| async function autocompleteSource(term, options = {}) { | ||||
|     const activeNoteId = appContext.tabManager.getActiveContextNoteId(); | ||||
|  | ||||
|     let results = await server.get('autocomplete' | ||||
| @@ -58,206 +126,176 @@ async function autocompleteSource(term, cb, options = {}) { | ||||
|         ].concat(results); | ||||
|     } | ||||
|  | ||||
|     cb(results); | ||||
|     return results; | ||||
| } | ||||
|  | ||||
| function clearText($el) { | ||||
| function clearText(acObj) { | ||||
|     if (utils.isMobile()) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     $el.setSelectedNotePath(""); | ||||
|     $el.autocomplete("val", "").trigger('change'); | ||||
|     acObj.ext.setSelectedNotePath(""); | ||||
|     acObj.setQuery(""); | ||||
| } | ||||
|  | ||||
| function setText($el, text) { | ||||
| function setText(ac, text) { | ||||
|     if (utils.isMobile()) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     $el.setSelectedNotePath(""); | ||||
|     $el | ||||
|         .autocomplete("val", text.trim()) | ||||
|         .autocomplete("open"); | ||||
|     ac.ext.setSelectedNotePath(""); | ||||
|     ac.setQuery(text.trim()); | ||||
|     ac.setIsOpen(true); | ||||
| } | ||||
|  | ||||
| function showRecentNotes($el) { | ||||
| function showRecentNotes(ac) { | ||||
|     if (utils.isMobile()) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     $el.setSelectedNotePath(""); | ||||
|     $el.autocomplete("val", ""); | ||||
|     $el.trigger('focus'); | ||||
|     ac.ext.$el.find(".aa-Input").val("").change(); | ||||
|  | ||||
|     ac.setQuery(""); | ||||
|     ac.setIsOpen(true); | ||||
|     ac.update(); | ||||
|     ac.ext.setSelectedNotePath(""); | ||||
|     ac.ext.focus(); | ||||
|  | ||||
|  | ||||
|     console.log("BBB"); | ||||
| } | ||||
|  | ||||
| function initNoteAutocomplete($el, options) { | ||||
|     if ($el.hasClass("note-autocomplete-input") || utils.isMobile()) { | ||||
| function initNoteAutocomplete($container, options) { | ||||
|     if ($container.hasClass("note-autocomplete-container") || utils.isMobile()) { | ||||
|         // clear any event listener added in previous invocation of this function | ||||
|         $el.off('autocomplete:noteselected'); | ||||
|         $container.off('autocomplete:noteselected'); | ||||
|  | ||||
|         return $el; | ||||
|         return $container.prop("acObj"); | ||||
|     } | ||||
|  | ||||
|     options = options || {}; | ||||
|  | ||||
|     $el.addClass("note-autocomplete-input"); | ||||
|     const $el = $('<div class="note-autocomplete-input">'); | ||||
|     const $sideButtons = $('<div>'); | ||||
|  | ||||
|     const $clearTextButton = $("<a>") | ||||
|             .addClass("input-group-text input-clearer-button bx bx-x") | ||||
|             .prop("title", "Clear text field"); | ||||
|     $container.addClass("note-autocomplete-container") | ||||
|         .append($el) | ||||
|         .append($sideButtons); | ||||
|  | ||||
|     const $showRecentNotesButton = $("<a>") | ||||
|             .addClass("input-group-text show-recent-notes-button bx bx-time") | ||||
|             .addClass("show-recent-notes-button bx bx-time") | ||||
|             .prop("title", "Show recent notes"); | ||||
|  | ||||
|     const $goToSelectedNoteButton = $("<a>") | ||||
|         .addClass("input-group-text go-to-selected-note-button bx bx-arrow-to-right") | ||||
|         .addClass("go-to-selected-note-button bx bx-arrow-to-right") | ||||
|         .attr("data-action", "note"); | ||||
|  | ||||
|     const $sideButtons = $("<div>") | ||||
|         .addClass("input-group-append") | ||||
|         .append($clearTextButton) | ||||
|         .append($showRecentNotesButton); | ||||
|     $sideButtons.append($showRecentNotesButton); | ||||
|  | ||||
|     if (!options.hideGoToSelectedNoteButton) { | ||||
|         $sideButtons.append($goToSelectedNoteButton); | ||||
|     } | ||||
|  | ||||
|     $el.after($sideButtons); | ||||
|  | ||||
|     $clearTextButton.on('click', () => clearText($el)); | ||||
|  | ||||
|     $showRecentNotesButton.on('click', e => { | ||||
|         showRecentNotes($el); | ||||
|         showRecentNotes(acObj); | ||||
|  | ||||
|         // this will cause the click not give focus to the "show recent notes" button | ||||
|         // this is important because otherwise input will lose focus immediatelly and not show the results | ||||
|         return false; | ||||
|     }); | ||||
|  | ||||
|     $el.autocomplete({ | ||||
|         appendTo: document.querySelector('body'), | ||||
|         hint: false, | ||||
|         autoselect: true, | ||||
|     const { autocomplete } = window['@algolia/autocomplete-js']; | ||||
|  | ||||
|     let acObj = autocomplete({ | ||||
|         container: $el[0], | ||||
|         defaultActiveItemId: 0, | ||||
|         openOnFocus: true, | ||||
|         minLength: 0, | ||||
|         tabAutocomplete: false | ||||
|     }, [ | ||||
|         tabAutocomplete: false, | ||||
|         placeholder: options.placeholder, | ||||
|         onStateChange({ state }) { | ||||
|             acObj.lastState = state; | ||||
|         }, | ||||
|         async getSources({ query }) { | ||||
|             const items = await autocompleteSource(query, options); | ||||
|  | ||||
|             return [ | ||||
|                 { | ||||
|             source: (term, cb) => autocompleteSource(term, cb, options), | ||||
|                     getItems() { | ||||
|                         return items; | ||||
|                     }, | ||||
|                     onSelect({item}) { | ||||
|                         acObj.ext.$el.trigger("autocomplete:selected", [item]); | ||||
|                     }, | ||||
|                     displayKey: 'notePathTitle', | ||||
|                     templates: { | ||||
|                 suggestion: suggestion => suggestion.highlightedNotePathTitle | ||||
|                         item({ item, createElement }) { | ||||
|                             return createElement('div', { | ||||
|                                 dangerouslySetInnerHTML: { | ||||
|                                     __html: item.highlightedNotePathTitle, | ||||
|                                 }, | ||||
|                             }); | ||||
|                         } | ||||
|                     }, | ||||
|                     // we can't cache identical searches because notes can be created / renamed, new recent notes can be added | ||||
|                     cache: false | ||||
|                 } | ||||
|     ]); | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
|  | ||||
|     $el.on('autocomplete:selected', async (event, suggestion) => { | ||||
|         if (suggestion.action === 'external-link') { | ||||
|             $el.setSelectedNotePath(null); | ||||
|             $el.setSelectedExternalLink(suggestion.externalLink); | ||||
|     acObj.ext = {...acMixin, $el, $container }; | ||||
|  | ||||
|             $el.autocomplete("val", suggestion.externalLink); | ||||
|     $container.prop("acObj", acObj); | ||||
|  | ||||
|             $el.autocomplete("close"); | ||||
|     $container.on('autocomplete:selected', async (event, item) => { | ||||
|         if (item.action === 'external-link') { | ||||
|             acObj.ext.setSelectedNotePath(null); | ||||
|             acObj.ext.setSelectedExternalLink(item.externalLink); | ||||
|  | ||||
|             $el.trigger('autocomplete:externallinkselected', [suggestion]); | ||||
|             acObj.setQuery(item.externalLink); | ||||
|  | ||||
|             $container.autocomplete("close"); | ||||
|  | ||||
|             $container.trigger('autocomplete:externallinkselected', [item]); | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (suggestion.action === 'create-note') { | ||||
|             const {note} = await noteCreateService.createNote(suggestion.parentNoteId, { | ||||
|                 title: suggestion.noteTitle, | ||||
|         if (item.action === 'create-note') { | ||||
|             const {note} = await noteCreateService.createNote(item.parentNoteId, { | ||||
|                 title: item.noteTitle, | ||||
|                 activate: false | ||||
|             }); | ||||
|  | ||||
|             suggestion.notePath = treeService.getSomeNotePath(note); | ||||
|             item.notePath = treeService.getSomeNotePath(note); | ||||
|         } | ||||
|  | ||||
|         $el.setSelectedNotePath(suggestion.notePath); | ||||
|         $el.setSelectedExternalLink(null); | ||||
|         acObj.ext.setSelectedNotePath(item.notePath); | ||||
|         acObj.ext.setSelectedExternalLink(null); | ||||
|  | ||||
|         $el.autocomplete("val", suggestion.noteTitle); | ||||
|         acObj.setQuery(item.noteTitle); | ||||
|  | ||||
|         $el.autocomplete("close"); | ||||
|         acObj.setIsOpen(false); | ||||
|  | ||||
|         $el.trigger('autocomplete:noteselected', [suggestion]); | ||||
|         $container.trigger('autocomplete:noteselected', [item]); | ||||
|     }); | ||||
|  | ||||
|     $el.on('autocomplete:closed', () => { | ||||
|         if (!$el.val().trim()) { | ||||
|             clearText($el); | ||||
|     $container.on('autocomplete:closed', () => { | ||||
|         if (!$container.val().trim()) { | ||||
|             clearText($container); | ||||
|         } | ||||
|     }); | ||||
|  | ||||
|     $el.on('autocomplete:opened', () => { | ||||
|         if ($el.attr("readonly")) { | ||||
|             $el.autocomplete('close'); | ||||
|     $container.on('autocomplete:opened', () => { | ||||
|         if ($container.attr("readonly")) { | ||||
|             $container.autocomplete('close'); | ||||
|         } | ||||
|     }); | ||||
|  | ||||
|     // clear any event listener added in previous invocation of this function | ||||
|     $el.off('autocomplete:noteselected'); | ||||
|     $container.off('autocomplete:noteselected'); | ||||
|  | ||||
|     return $el; | ||||
| } | ||||
|  | ||||
| function init() { | ||||
|     $.fn.getSelectedNotePath = function () { | ||||
|         if (!$(this).val().trim()) { | ||||
|             return ""; | ||||
|         } else { | ||||
|             return $(this).attr(SELECTED_NOTE_PATH_KEY); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     $.fn.getSelectedNoteId = function () { | ||||
|         const notePath = $(this).getSelectedNotePath(); | ||||
|         const chunks = notePath.split('/'); | ||||
|  | ||||
|         return chunks.length >= 1 ? chunks[chunks.length - 1] : null; | ||||
|     } | ||||
|  | ||||
|     $.fn.setSelectedNotePath = function (notePath) { | ||||
|         notePath = notePath || ""; | ||||
|  | ||||
|         $(this).attr(SELECTED_NOTE_PATH_KEY, notePath); | ||||
|  | ||||
|         $(this) | ||||
|             .closest(".input-group") | ||||
|             .find(".go-to-selected-note-button") | ||||
|             .toggleClass("disabled", !notePath.trim()) | ||||
|             .attr(SELECTED_NOTE_PATH_KEY, notePath); // we also set attr here so tooltip can be displayed | ||||
|     }; | ||||
|  | ||||
|     $.fn.getSelectedExternalLink = function () { | ||||
|         if (!$(this).val().trim()) { | ||||
|             return ""; | ||||
|         } else { | ||||
|             return $(this).attr(SELECTED_EXTERNAL_LINK_KEY); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     $.fn.setSelectedExternalLink = function (externalLink) { | ||||
|         $(this).attr(SELECTED_EXTERNAL_LINK_KEY, externalLink); | ||||
|  | ||||
|         $(this) | ||||
|             .closest(".input-group") | ||||
|             .find(".go-to-selected-note-button") | ||||
|             .toggleClass("disabled", true); | ||||
|     } | ||||
|  | ||||
|     $.fn.setNote = async function (noteId) { | ||||
|         const note = noteId ? await froca.getNote(noteId, true) : null; | ||||
|  | ||||
|         $(this) | ||||
|             .val(note ? note.title : "") | ||||
|             .setSelectedNotePath(noteId); | ||||
|     } | ||||
|     return acObj; | ||||
| } | ||||
|  | ||||
| export default { | ||||
| @@ -265,6 +303,5 @@ export default { | ||||
|     autocompleteSourceForCKEditor, | ||||
|     initNoteAutocomplete, | ||||
|     showRecentNotes, | ||||
|     setText, | ||||
|     init | ||||
|     setText | ||||
| } | ||||
|   | ||||
| @@ -59,10 +59,10 @@ class NoteContext extends Component { | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         if (utils.isDesktop()) { | ||||
|             // close dangling autocompletes after closing the tab | ||||
|             $(".aa-input").autocomplete("close"); | ||||
|         } | ||||
|         // if (utils.isDesktop()) { | ||||
|         //     // close dangling autocompletes after closing the tab | ||||
|         //     $(".aa-input").autocomplete("close"); | ||||
|         // } | ||||
|     } | ||||
|  | ||||
|     getSubContexts() { | ||||
|   | ||||
| @@ -292,7 +292,9 @@ export default class AttributeDetailWidget extends NoteContextAwareWidget { | ||||
|         this.$rowTargetNote = this.$widget.find('.attr-row-target-note'); | ||||
|         this.$inputTargetNote = this.$widget.find('.attr-input-target-note'); | ||||
|  | ||||
|         noteAutocompleteService.initNoteAutocomplete(this.$inputTargetNote, {allowCreatingNotes: true}) | ||||
|         noteAutocompleteService.initNoteAutocomplete(this.$inputTargetNote, {allowCreatingNotes: true}); | ||||
|  | ||||
|         this.$inputTargetNote | ||||
|             .on('autocomplete:noteselected', (event, suggestion, dataset) => { | ||||
|                 if (!suggestion.notePath) { | ||||
|                     return false; | ||||
|   | ||||
| @@ -358,9 +358,12 @@ pre:not(.CodeMirror-line) { | ||||
|     color: var(--button-disabled-background-color) !important; | ||||
| } | ||||
|  | ||||
| .note-autocomplete-input { | ||||
|     /* this is for seamless integration of "input clearer" button */ | ||||
|     border-right: 0; | ||||
| .note-autocomplete-container { | ||||
|     display: flex; | ||||
| } | ||||
|  | ||||
| .note-autocomplete-container .note-autocomplete-input { | ||||
|     flex-grow: 1; | ||||
| } | ||||
|  | ||||
| table.promoted-attributes-in-tooltip { | ||||
| @@ -432,43 +435,6 @@ table.promoted-attributes-in-tooltip td, table.promoted-attributes-in-tooltip th | ||||
|     opacity: 1; | ||||
| } | ||||
|  | ||||
| .algolia-autocomplete { | ||||
|     width: calc(100% - 30px); | ||||
|     z-index: 2000 !important; | ||||
| } | ||||
|  | ||||
| .algolia-autocomplete .aa-input, .algolia-autocomplete .aa-hint { | ||||
|     width: 100%; | ||||
| } | ||||
|  | ||||
| .algolia-autocomplete .aa-dropdown-menu { | ||||
|     width: 100%; | ||||
|     background-color: var(--main-background-color); | ||||
|     border: 1px solid var(--main-border-color); | ||||
|     border-top: none; | ||||
|     z-index: 2000 !important; | ||||
|     max-height: 500px; | ||||
|     overflow: auto; | ||||
|     padding: 0; | ||||
|     margin: 0; | ||||
| } | ||||
|  | ||||
| .algolia-autocomplete .aa-dropdown-menu .aa-suggestion { | ||||
|     cursor: pointer; | ||||
|     padding: 5px; | ||||
|     margin: 0; | ||||
| } | ||||
|  | ||||
| .algolia-autocomplete .aa-dropdown-menu .aa-suggestion p { | ||||
|     padding: 0; | ||||
|     margin: 0; | ||||
| } | ||||
|  | ||||
| .algolia-autocomplete .aa-dropdown-menu .aa-suggestion.aa-cursor { | ||||
|     color: var(--hover-item-text-color); | ||||
|     background-color: var(--hover-item-background-color); | ||||
| } | ||||
|  | ||||
| .help-button { | ||||
|     float: right; | ||||
|     background: none; | ||||
| @@ -958,3 +924,7 @@ input { | ||||
| .note-split.full-content-width { | ||||
|     max-width: 999999px; | ||||
| } | ||||
|  | ||||
| .aa-Panel { | ||||
|     z-index: 10000; | ||||
| } | ||||
|   | ||||
| @@ -79,7 +79,8 @@ | ||||
|  | ||||
| <script src="libraries/jquery.hotkeys.js"></script> | ||||
|  | ||||
| <script src="libraries/autocomplete.jquery.min.js"></script> | ||||
| <link href="libraries/autocomplete-theme-classic.css" rel="stylesheet"> | ||||
| <script src="libraries/autocomplete.js"></script> | ||||
|  | ||||
| <script src="libraries/dayjs.min.js"></script> | ||||
|  | ||||
|   | ||||
| @@ -10,9 +10,8 @@ | ||||
|             <div class="modal-body"> | ||||
|                 <div class="form-group"> | ||||
|                     <label for="jump-to-note-autocomplete">Note</label> | ||||
|                     <div class="input-group"> | ||||
|                         <input id="jump-to-note-autocomplete" class="form-control" placeholder="search for note by its name"> | ||||
|                     </div> | ||||
|  | ||||
|                     <div id="jump-to-note-autocomplete"></div> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <div class="modal-footer"> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user