mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	added dialog and read only view of attributes
This commit is contained in:
		
							
								
								
									
										2
									
								
								app.js
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								app.js
									
									
									
									
									
								
							| @@ -73,6 +73,8 @@ require('./services/backup'); | |||||||
| // trigger consistency checks timer | // trigger consistency checks timer | ||||||
| require('./services/consistency_checks'); | require('./services/consistency_checks'); | ||||||
|  |  | ||||||
|  | require('./plugins/reddit'); | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|     app, |     app, | ||||||
|     sessionParser |     sessionParser | ||||||
|   | |||||||
| @@ -108,3 +108,16 @@ CREATE TABLE notes_image | |||||||
| CREATE INDEX notes_image_note_id_index ON notes_image (note_id); | CREATE INDEX notes_image_note_id_index ON notes_image (note_id); | ||||||
| CREATE INDEX notes_image_image_id_index ON notes_image (image_id); | CREATE INDEX notes_image_image_id_index ON notes_image (image_id); | ||||||
| CREATE INDEX notes_image_note_id_image_id_index ON notes_image (note_id, image_id); | CREATE INDEX notes_image_note_id_image_id_index ON notes_image (note_id, image_id); | ||||||
|  |  | ||||||
|  | CREATE TABLE attributes | ||||||
|  | ( | ||||||
|  |   attribute_id TEXT PRIMARY KEY NOT NULL, | ||||||
|  |   note_id TEXT NOT NULL, | ||||||
|  |   name TEXT NOT NULL, | ||||||
|  |   value TEXT, | ||||||
|  |   date_created TEXT NOT NULL, | ||||||
|  |   date_modified TEXT NOT NULL | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | CREATE INDEX attributes_note_id_index ON attributes (note_id); | ||||||
|  | CREATE UNIQUE INDEX attributes_note_id_name_index ON attributes (note_id, name); | ||||||
| @@ -9,4 +9,4 @@ CREATE TABLE attributes | |||||||
| ); | ); | ||||||
|  |  | ||||||
| CREATE INDEX attributes_note_id_index ON attributes (note_id); | CREATE INDEX attributes_note_id_index ON attributes (note_id); | ||||||
| CREATE INDEX attributes_note_id_name_index ON attributes (note_id, name); | CREATE UNIQUE INDEX attributes_note_id_name_index ON attributes (note_id, name); | ||||||
							
								
								
									
										35
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										35
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "trilium", |   "name": "trilium", | ||||||
|   "version": "0.2.2", |   "version": "0.3.2", | ||||||
|   "lockfileVersion": 1, |   "lockfileVersion": 1, | ||||||
|   "requires": true, |   "requires": true, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
| @@ -419,6 +419,15 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", |       "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", | ||||||
|       "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" |       "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" | ||||||
|     }, |     }, | ||||||
|  |     "axios": { | ||||||
|  |       "version": "0.17.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz", | ||||||
|  |       "integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=", | ||||||
|  |       "requires": { | ||||||
|  |         "follow-redirects": "1.3.0", | ||||||
|  |         "is-buffer": "1.1.6" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "babel-code-frame": { |     "babel-code-frame": { | ||||||
|       "version": "6.26.0", |       "version": "6.26.0", | ||||||
|       "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", |       "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", | ||||||
| @@ -4576,6 +4585,14 @@ | |||||||
|       "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", |       "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "follow-redirects": { | ||||||
|  |       "version": "1.3.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.3.0.tgz", | ||||||
|  |       "integrity": "sha1-9oSHH8EW0uMp/aVe9naH9Pq8kFw=", | ||||||
|  |       "requires": { | ||||||
|  |         "debug": "3.1.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "for-each": { |     "for-each": { | ||||||
|       "version": "0.3.2", |       "version": "0.3.2", | ||||||
|       "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", |       "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", | ||||||
| @@ -7135,9 +7152,9 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "moment": { |     "moment": { | ||||||
|       "version": "2.19.1", |       "version": "2.20.1", | ||||||
|       "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.1.tgz", |       "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", | ||||||
|       "integrity": "sha1-VtoaLRy/AdOLfhr8McELz6GSkWc=" |       "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" | ||||||
|     }, |     }, | ||||||
|     "mozjpeg": { |     "mozjpeg": { | ||||||
|       "version": "5.0.0", |       "version": "5.0.0", | ||||||
| @@ -9073,7 +9090,7 @@ | |||||||
|       "integrity": "sha512-bJ8tGZX/48oSzv4VWVQwue4JvjZhLNCZv8+LZG1h4UQKEh0oFmbYiOVmHsEyTArfNk03Cx+DJPP0Azc/F9N62w==", |       "integrity": "sha512-bJ8tGZX/48oSzv4VWVQwue4JvjZhLNCZv8+LZG1h4UQKEh0oFmbYiOVmHsEyTArfNk03Cx+DJPP0Azc/F9N62w==", | ||||||
|       "requires": { |       "requires": { | ||||||
|         "lodash": "4.17.4", |         "lodash": "4.17.4", | ||||||
|         "moment": "2.19.1" |         "moment": "2.20.1" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "single-line-log": { |     "single-line-log": { | ||||||
| @@ -10835,6 +10852,14 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", |       "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", | ||||||
|       "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" |       "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" | ||||||
|     }, |     }, | ||||||
|  |     "unescape": { | ||||||
|  |       "version": "1.0.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz", | ||||||
|  |       "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "extend-shallow": "2.0.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "uniq": { |     "uniq": { | ||||||
|       "version": "1.0.1", |       "version": "1.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", |       "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", | ||||||
|   | |||||||
| @@ -20,6 +20,7 @@ | |||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "async-mutex": "^0.1.3", |     "async-mutex": "^0.1.3", | ||||||
|  |     "axios": "^0.17.1", | ||||||
|     "body-parser": "~1.18.2", |     "body-parser": "~1.18.2", | ||||||
|     "cookie-parser": "~1.4.3", |     "cookie-parser": "~1.4.3", | ||||||
|     "debug": "~3.1.0", |     "debug": "~3.1.0", | ||||||
| @@ -41,6 +42,7 @@ | |||||||
|     "imagemin-pngquant": "^5.0.1", |     "imagemin-pngquant": "^5.0.1", | ||||||
|     "ini": "^1.3.4", |     "ini": "^1.3.4", | ||||||
|     "jimp": "^0.2.28", |     "jimp": "^0.2.28", | ||||||
|  |     "moment": "^2.20.1", | ||||||
|     "multer": "^1.3.0", |     "multer": "^1.3.0", | ||||||
|     "rand-token": "^0.4.0", |     "rand-token": "^0.4.0", | ||||||
|     "request": "^2.83.0", |     "request": "^2.83.0", | ||||||
| @@ -52,6 +54,7 @@ | |||||||
|     "session-file-store": "^1.1.2", |     "session-file-store": "^1.1.2", | ||||||
|     "simple-node-logger": "^0.93.30", |     "simple-node-logger": "^0.93.30", | ||||||
|     "sqlite": "^2.9.0", |     "sqlite": "^2.9.0", | ||||||
|  |     "unescape": "^1.0.1", | ||||||
|     "ws": "^3.3.2" |     "ws": "^3.3.2" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								public/javascripts/dialogs/attributes.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								public/javascripts/dialogs/attributes.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | "use strict"; | ||||||
|  |  | ||||||
|  | const attributesDialog = (function() { | ||||||
|  |     const dialogEl = $("#attributes-dialog"); | ||||||
|  |  | ||||||
|  |     function AttributesModel(attributes) { | ||||||
|  |         const model = this; | ||||||
|  |  | ||||||
|  |         this.attributes = ko.observableArray(attributes); | ||||||
|  |  | ||||||
|  |         this.addNewRow = function() { | ||||||
|  |             model.attributes.push({ | ||||||
|  |                 attribute_id: '', | ||||||
|  |                 name: '', | ||||||
|  |                 value: '' | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async function showDialog() { | ||||||
|  |         glob.activeDialog = dialogEl; | ||||||
|  |  | ||||||
|  |         dialogEl.dialog({ | ||||||
|  |             modal: true, | ||||||
|  |             width: 800, | ||||||
|  |             height: 700 | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         const noteId = noteEditor.getCurrentNoteId(); | ||||||
|  |  | ||||||
|  |         const attributes = await server.get('notes/' + noteId + '/attributes'); | ||||||
|  |  | ||||||
|  |         ko.applyBindings(new AttributesModel(attributes)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $(document).bind('keydown', 'alt+a', e => { | ||||||
|  |         showDialog(); | ||||||
|  |  | ||||||
|  |         e.preventDefault(); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     return { | ||||||
|  |         showDialog | ||||||
|  |     }; | ||||||
|  | })(); | ||||||
							
								
								
									
										15
									
								
								routes/api/attributes.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								routes/api/attributes.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | "use strict"; | ||||||
|  |  | ||||||
|  | const express = require('express'); | ||||||
|  | const router = express.Router(); | ||||||
|  | const sql = require('../../services/sql'); | ||||||
|  | const auth = require('../../services/auth'); | ||||||
|  | const wrap = require('express-promise-wrap').wrap; | ||||||
|  |  | ||||||
|  | router.get('/:noteId/attributes', auth.checkApiAuth, wrap(async (req, res, next) => { | ||||||
|  |     const noteId = req.params.noteId; | ||||||
|  |  | ||||||
|  |     res.send(await sql.getAll("SELECT * FROM attributes WHERE note_id = ? ORDER BY date_created", [noteId])); | ||||||
|  | })); | ||||||
|  |  | ||||||
|  | module.exports = router; | ||||||
| @@ -25,6 +25,7 @@ const sqlRoute = require('./api/sql'); | |||||||
| const anonymizationRoute = require('./api/anonymization'); | const anonymizationRoute = require('./api/anonymization'); | ||||||
| const cleanupRoute = require('./api/cleanup'); | const cleanupRoute = require('./api/cleanup'); | ||||||
| const imageRoute = require('./api/image'); | const imageRoute = require('./api/image'); | ||||||
|  | const attributesRoute = require('./api/attributes'); | ||||||
|  |  | ||||||
| function register(app) { | function register(app) { | ||||||
|     app.use('/', indexRoute); |     app.use('/', indexRoute); | ||||||
| @@ -36,6 +37,7 @@ function register(app) { | |||||||
|     app.use('/api/tree', treeApiRoute); |     app.use('/api/tree', treeApiRoute); | ||||||
|     app.use('/api/notes', notesApiRoute); |     app.use('/api/notes', notesApiRoute); | ||||||
|     app.use('/api/notes', notesMoveApiRoute); |     app.use('/api/notes', notesMoveApiRoute); | ||||||
|  |     app.use('/api/notes', attributesRoute); | ||||||
|     app.use('/api/notes-history', noteHistoryApiRoute); |     app.use('/api/notes-history', noteHistoryApiRoute); | ||||||
|     app.use('/api/recent-changes', recentChangesApiRoute); |     app.use('/api/recent-changes', recentChangesApiRoute); | ||||||
|     app.use('/api/settings', settingsApiRoute); |     app.use('/api/settings', settingsApiRoute); | ||||||
|   | |||||||
| @@ -23,6 +23,10 @@ function newNoteImageId() { | |||||||
|     return randomString(12); |     return randomString(12); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function newAttributeId() { | ||||||
|  |     return randomString(12); | ||||||
|  | } | ||||||
|  |  | ||||||
| function randomString(length) { | function randomString(length) { | ||||||
|     return randtoken.generate(length); |     return randtoken.generate(length); | ||||||
| } | } | ||||||
| @@ -106,6 +110,7 @@ module.exports = { | |||||||
|     newNoteHistoryId, |     newNoteHistoryId, | ||||||
|     newImageId, |     newImageId, | ||||||
|     newNoteImageId, |     newNoteImageId, | ||||||
|  |     newAttributeId, | ||||||
|     toBase64, |     toBase64, | ||||||
|     fromBase64, |     fromBase64, | ||||||
|     hmac, |     hmac, | ||||||
|   | |||||||
| @@ -340,6 +340,31 @@ | |||||||
|       <textarea id="note-source" readonly="readonly"></textarea> |       <textarea id="note-source" readonly="readonly"></textarea> | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|  |     <div id="attributes-dialog" title="Note attributes" style="display: none; padding: 20px;"> | ||||||
|  |       <button class="btn-small" data-bind="click: addNewRow">Add new attribute</button> | ||||||
|  |  | ||||||
|  |       <table id="attributes-table" class="table"> | ||||||
|  |         <thead> | ||||||
|  |           <tr> | ||||||
|  |             <th>ID</th> | ||||||
|  |             <th>Name</th> | ||||||
|  |             <th>Value</th> | ||||||
|  |           </tr> | ||||||
|  |         </thead> | ||||||
|  |         <tbody data-bind="foreach: attributes"> | ||||||
|  |           <tr> | ||||||
|  |             <td data-bind="text: attribute_id"></td> | ||||||
|  |             <td> | ||||||
|  |               <input type="text" data-bind="value: name"/> | ||||||
|  |             </td> | ||||||
|  |             <td> | ||||||
|  |               <input type="text" data-bind="value: value"/> | ||||||
|  |             </td> | ||||||
|  |           </tr> | ||||||
|  |         </tbody> | ||||||
|  |       </table> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|     <div id="tooltip" style="display: none;"></div> |     <div id="tooltip" style="display: none;"></div> | ||||||
|  |  | ||||||
|     <script type="text/javascript"> |     <script type="text/javascript"> | ||||||
| @@ -376,6 +401,8 @@ | |||||||
|  |  | ||||||
|     <script src="libraries/jquery.ui-contextmenu.min.js"></script> |     <script src="libraries/jquery.ui-contextmenu.min.js"></script> | ||||||
|  |  | ||||||
|  |     <script src="libraries/knockout.min.js"></script> | ||||||
|  |  | ||||||
|     <link href="stylesheets/style.css" rel="stylesheet"> |     <link href="stylesheets/style.css" rel="stylesheet"> | ||||||
|  |  | ||||||
|     <script src="javascripts/utils.js"></script> |     <script src="javascripts/utils.js"></script> | ||||||
| @@ -405,6 +432,7 @@ | |||||||
|     <script src="javascripts/dialogs/edit_tree_prefix.js"></script> |     <script src="javascripts/dialogs/edit_tree_prefix.js"></script> | ||||||
|     <script src="javascripts/dialogs/sql_console.js"></script> |     <script src="javascripts/dialogs/sql_console.js"></script> | ||||||
|     <script src="javascripts/dialogs/note_source.js"></script> |     <script src="javascripts/dialogs/note_source.js"></script> | ||||||
|  |     <script src="javascripts/dialogs/attributes.js"></script> | ||||||
|  |  | ||||||
|     <script src="javascripts/link.js"></script> |     <script src="javascripts/link.js"></script> | ||||||
|     <script src="javascripts/sync.js"></script> |     <script src="javascripts/sync.js"></script> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user