mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 10:26:08 +01:00 
			
		
		
		
	render notes can be edited and can contain HTML markup
This commit is contained in:
		
							
								
								
									
										1
									
								
								db/migrations/0095__mime_type_for_render.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								db/migrations/0095__mime_type_for_render.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | UPDATE notes SET mime = 'text/html' WHERE type = 'render'; | ||||||
| @@ -40,7 +40,7 @@ class Note extends Entity { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     isHtml() { |     isHtml() { | ||||||
|         return (this.type === "code" || this.type === "file") && this.mime === "text/html"; |         return (this.type === "code" || this.type === "file" || this.type === "render") && this.mime === "text/html"; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     getScriptEnv() { |     getScriptEnv() { | ||||||
|   | |||||||
| @@ -64,24 +64,27 @@ function focus() { | |||||||
| } | } | ||||||
|  |  | ||||||
| async function executeCurrentNote() { | async function executeCurrentNote() { | ||||||
|     if (noteDetailService.getCurrentNoteType() === 'code') { |     // ctrl+enter is also used elsewhere so make sure we're running only when appropriate | ||||||
|         // make sure note is saved so we load latest changes |     if (noteDetailService.getCurrentNoteType() !== 'code') { | ||||||
|         await noteDetailService.saveNoteIfChanged(); |         return; | ||||||
|  |  | ||||||
|         const currentNote = noteDetailService.getCurrentNote(); |  | ||||||
|  |  | ||||||
|         if (currentNote.mime.endsWith("env=frontend")) { |  | ||||||
|             const bundle = await server.get('script/bundle/' + noteDetailService.getCurrentNoteId()); |  | ||||||
|  |  | ||||||
|             bundleService.executeBundle(bundle); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (currentNote.mime.endsWith("env=backend")) { |  | ||||||
|             await server.post('script/run/' + noteDetailService.getCurrentNoteId()); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         infoService.showMessage("Note executed"); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // make sure note is saved so we load latest changes | ||||||
|  |     await noteDetailService.saveNoteIfChanged(); | ||||||
|  |  | ||||||
|  |     const currentNote = noteDetailService.getCurrentNote(); | ||||||
|  |  | ||||||
|  |     if (currentNote.mime.endsWith("env=frontend")) { | ||||||
|  |         const bundle = await server.get('script/bundle/' + noteDetailService.getCurrentNoteId()); | ||||||
|  |  | ||||||
|  |         bundleService.executeBundle(bundle); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (currentNote.mime.endsWith("env=backend")) { | ||||||
|  |         await server.post('script/run/' + noteDetailService.getCurrentNoteId()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     infoService.showMessage("Note executed"); | ||||||
| } | } | ||||||
|  |  | ||||||
| $(document).bind('keydown', "ctrl+return", executeCurrentNote); | $(document).bind('keydown', "ctrl+return", executeCurrentNote); | ||||||
|   | |||||||
| @@ -1,12 +1,51 @@ | |||||||
| import bundleService from "./bundle.js"; | import bundleService from "./bundle.js"; | ||||||
| import server from "./server.js"; | import server from "./server.js"; | ||||||
| import noteDetailService from "./note_detail.js"; | import noteDetailService from "./note_detail.js"; | ||||||
|  | import noteDetailCodeService from "./note_detail_code.js"; | ||||||
|  |  | ||||||
|  | const $noteDetailCode = $('#note-detail-code'); | ||||||
| const $noteDetailRender = $('#note-detail-render'); | const $noteDetailRender = $('#note-detail-render'); | ||||||
|  | const $toggleEditButton = $('#toggle-edit-button'); | ||||||
|  | const $renderButton = $('#render-button'); | ||||||
|  |  | ||||||
|  | let codeEditorInitialized; | ||||||
|  |  | ||||||
| async function show() { | async function show() { | ||||||
|  |     codeEditorInitialized = false; | ||||||
|  |  | ||||||
|     $noteDetailRender.show(); |     $noteDetailRender.show(); | ||||||
|  |  | ||||||
|  |     await render(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | $toggleEditButton.click(() => { | ||||||
|  |     if ($noteDetailCode.is(":visible")) { | ||||||
|  |         $noteDetailCode.hide(); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         if (!codeEditorInitialized) { | ||||||
|  |             noteDetailCodeService.show(); | ||||||
|  |  | ||||||
|  |             codeEditorInitialized = true; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             $noteDetailCode.show(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | $renderButton.click(render); | ||||||
|  |  | ||||||
|  | async function render() { | ||||||
|  |     // ctrl+enter is also used elsewhere so make sure we're running only when appropriate | ||||||
|  |     if (noteDetailService.getCurrentNoteType() !== 'render') { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (codeEditorInitialized) { | ||||||
|  |         await noteDetailService.saveNoteIfChanged(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     const bundle = await server.get('script/bundle/' + noteDetailService.getCurrentNoteId()); |     const bundle = await server.get('script/bundle/' + noteDetailService.getCurrentNoteId()); | ||||||
|  |  | ||||||
|     $noteDetailRender.html(bundle.html); |     $noteDetailRender.html(bundle.html); | ||||||
| @@ -14,8 +53,10 @@ async function show() { | |||||||
|     await bundleService.executeBundle(bundle); |     await bundleService.executeBundle(bundle); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | $(document).bind('keydown', "ctrl+return", render); | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
|     show, |     show, | ||||||
|     getContent: () => null, |     getContent: noteDetailCodeService.getContent, | ||||||
|     focus: () => null |     focus: () => null | ||||||
| } | } | ||||||
| @@ -4,6 +4,9 @@ import server from './server.js'; | |||||||
| import infoService from "./info.js"; | import infoService from "./info.js"; | ||||||
|  |  | ||||||
| const $executeScriptButton = $("#execute-script-button"); | const $executeScriptButton = $("#execute-script-button"); | ||||||
|  | const $toggleEditButton = $('#toggle-edit-button'); | ||||||
|  | const $renderButton = $('#render-button'); | ||||||
|  |  | ||||||
| const noteTypeModel = new NoteTypeModel(); | const noteTypeModel = new NoteTypeModel(); | ||||||
|  |  | ||||||
| function NoteTypeModel() { | function NoteTypeModel() { | ||||||
| @@ -107,7 +110,7 @@ function NoteTypeModel() { | |||||||
|  |  | ||||||
|     this.selectRender = function() { |     this.selectRender = function() { | ||||||
|         self.type('render'); |         self.type('render'); | ||||||
|         self.mime(''); |         self.mime('text/html'); | ||||||
|  |  | ||||||
|         save(); |         save(); | ||||||
|     }; |     }; | ||||||
| @@ -128,6 +131,9 @@ function NoteTypeModel() { | |||||||
|  |  | ||||||
|     this.updateExecuteScriptButtonVisibility = function() { |     this.updateExecuteScriptButtonVisibility = function() { | ||||||
|         $executeScriptButton.toggle(self.mime().startsWith('application/javascript')); |         $executeScriptButton.toggle(self.mime().startsWith('application/javascript')); | ||||||
|  |  | ||||||
|  |         $toggleEditButton.toggle(self.type() === 'render'); | ||||||
|  |         $renderButton.toggle(self.type() === 'render'); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -279,6 +279,10 @@ div.ui-tooltip { | |||||||
|     min-height: 200px; |     min-height: 200px; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #note-detail-render { | ||||||
|  |     min-height: 200px; | ||||||
|  | } | ||||||
|  |  | ||||||
| .CodeMirror { | .CodeMirror { | ||||||
|     font-family: "Liberation Mono", "Lucida Console", monospace; |     font-family: "Liberation Mono", "Lucida Console", monospace; | ||||||
|     height: auto; |     height: auto; | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
| const build = require('./build'); | const build = require('./build'); | ||||||
| const packageJson = require('../../package'); | const packageJson = require('../../package'); | ||||||
|  |  | ||||||
| const APP_DB_VERSION = 94; | const APP_DB_VERSION = 95; | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|     appVersion: packageJson.version, |     appVersion: packageJson.version, | ||||||
|   | |||||||
| @@ -73,7 +73,7 @@ function getParams(params) { | |||||||
| } | } | ||||||
|  |  | ||||||
| async function getScriptBundle(note, root = true, scriptEnv = null, includedNoteIds = []) { | async function getScriptBundle(note, root = true, scriptEnv = null, includedNoteIds = []) { | ||||||
|     if (!note.isJavaScript() && !note.isHtml() && note.type !== 'render') { |     if (!note.isJavaScript() && !note.isHtml()) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -95,6 +95,14 @@ | |||||||
|  |  | ||||||
|           <span id="note-id-display" title="Note ID"></span> |           <span id="note-id-display" title="Note ID"></span> | ||||||
|  |  | ||||||
|  |           <button class="btn btn-sm" | ||||||
|  |                   style="display: none; margin-right: 10px" | ||||||
|  |                   id="toggle-edit-button">Toggle edit</button> | ||||||
|  |  | ||||||
|  |           <button class="btn btn-sm" | ||||||
|  |                   style="display: none; margin-right: 10px" | ||||||
|  |                   id="render-button">Render <kbd>Ctrl+Enter</kbd></button> | ||||||
|  |  | ||||||
|           <button class="btn btn-sm" |           <button class="btn btn-sm" | ||||||
|                   style="display: none; margin-right: 10px" |                   style="display: none; margin-right: 10px" | ||||||
|                   id="execute-script-button">Execute <kbd>Ctrl+Enter</kbd></button> |                   id="execute-script-button">Execute <kbd>Ctrl+Enter</kbd></button> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user