mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	Compare commits
	
		
			8 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 29fd78aee5 | ||
|  | f90c2317fc | ||
|  | bca5087426 | ||
|  | 583123ab0a | ||
|  | 12f70b28c8 | ||
|  | 31a4a201a8 | ||
|  | 5ec866aa50 | ||
|  | cdede3240c | 
							
								
								
									
										16
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| # Trilium | # Trilium | ||||||
| Hierarchical note taking application. | Hierarchical note taking application. Picture tells a thousand words: | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ## Features | ## Features | ||||||
|  |  | ||||||
| * Notes can be arranged into arbitrarily deep hierarchy | * Notes can be arranged into arbitrarily deep hierarchy | ||||||
|    * Notes can have more than 1 parents - see [cloning](https://github.com/zadam/trilium/wiki/Cloning) |    * Notes can have more than 1 parents - see [cloning](https://github.com/zadam/trilium/wiki/Cloning-notes) | ||||||
| * WYSIWYG (What You See Is What You Get) editing | * WYSIWYG (What You See Is What You Get) editing | ||||||
| * Fast and easy [navigation between notes](https://github.com/zadam/trilium/wiki/Note-navigation) | * Fast and easy [navigation between notes](https://github.com/zadam/trilium/wiki/Note-navigation) inspired by IDEs | ||||||
| * Seamless note versioning | * Seamless note versioning | ||||||
| * Can be deployed as web application and / or desktop application with offline access (electron based) | * Can be deployed as web application and / or desktop application with offline access (electron based) | ||||||
| * [Synchronization with](https://github.com/zadam/trilium/wiki/Synchronization) self-hosted sync server | * [Synchronization with](https://github.com/zadam/trilium/wiki/Synchronization) self-hosted sync server | ||||||
| @@ -16,16 +16,16 @@ Hierarchical note taking application. | |||||||
|  |  | ||||||
| ## Builds | ## Builds | ||||||
|  |  | ||||||
| * If you want to install Trilium on server, follow [this page](https://github.com/zadam/trilium/wiki/Installation-on-server) | * If you want to install Trilium on server, follow [this page](https://github.com/zadam/trilium/wiki/Installation-as-webapp) | ||||||
| * If you want to use Trilium on the desktop, download binary release from [releases], unzip the package and run ```trilium``` executable. | * If you want to use Trilium on the desktop, download binary release for your platfor from [latest release](https://github.com/zadam/trilium/releases/latest), unzip the package and run ```trilium``` executable. | ||||||
|  |  | ||||||
| ## Supported platforms | ## Supported platforms | ||||||
|  |  | ||||||
| Desktop (electron) builds are available for Linux and Windows. | Desktop (electron) builds are available for Linux and Windows, both for 64 bits. | ||||||
|  |  | ||||||
| Requirements for web based installation are outlined in (https://github.com/zadam/trilium/wiki/Installation-on-server). | Requirements for web based installation are [outlined here](https://github.com/zadam/trilium/wiki/Installation-as-webapp). | ||||||
|  |  | ||||||
| Currently only recent Chrome and Firefox are supported (tested) browsers. Other modern browsers should work as well. | Currently only recent Chrome and Firefox are supported (tested) browsers. Other modern browsers (not IE) might work as well. | ||||||
|  |  | ||||||
| ## Documentation | ## Documentation | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| #!/bin/bash | #!/usr/bin/env bash | ||||||
| 
 | 
 | ||||||
| ./set-build.sh | echo 'module.exports = { build_date:"'`date --iso-8601=seconds`'", build_revision: "'`git log -1 --format="%H"`'" };' > services/build.js | ||||||
| 
 | 
 | ||||||
| echo "Deleting dist" | echo "Deleting dist" | ||||||
| 
 | 
 | ||||||
| @@ -16,9 +16,3 @@ cp -r ../trilium-node-binaries/scrypt/* node_modules/scrypt/bin/ | |||||||
| 
 | 
 | ||||||
| # can't copy this before the packaging because the same file name is used for both linux and windows build | # can't copy this before the packaging because the same file name is used for both linux and windows build | ||||||
| cp ../trilium-node-binaries/scrypt.node ./dist/trilium-win32-x64/resources/app/node_modules/scrypt/build/Release/ | cp ../trilium-node-binaries/scrypt.node ./dist/trilium-win32-x64/resources/app/node_modules/scrypt/build/Release/ | ||||||
| 
 |  | ||||||
| echo "Packaging windows distribution..." |  | ||||||
| 
 |  | ||||||
| # possibly use zip: zip -r myfiles.zip mydir |  | ||||||
| 
 |  | ||||||
| tar cfJ dist/win.tar.xz dist/trilium-win32-x64 |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| #!/bin/bash | #!/usr/bin/env bash | ||||||
| # Script generates certificate by default into the ~/trilium-data/cert where it is expected by Trilium | # Script generates certificate by default into the ~/trilium-data/cert where it is expected by Trilium | ||||||
| # If directory is given in argument, certificate will be created there. | # If directory is given in argument, certificate will be created there. | ||||||
| 
 | 
 | ||||||
							
								
								
									
										11
									
								
								bin/package.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								bin/package.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  |  | ||||||
|  | VERSION=`jq -r ".version" package.json` | ||||||
|  |  | ||||||
|  | cd dist | ||||||
|  |  | ||||||
|  | echo "Packaging windows electron distribution..." | ||||||
|  | 7z a trilium-windows-${VERSION}.7z trilium-win32-x64 | ||||||
|  |  | ||||||
|  | echo "Packaging linux electron distribution..." | ||||||
|  | 7z a trilium-linux-${VERSION}.7z trilium-linux-x64 | ||||||
							
								
								
									
										52
									
								
								bin/release.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										52
									
								
								bin/release.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  |  | ||||||
|  | if [[ $# -eq 0 ]] ; then | ||||||
|  |     echo "Missing argument of new version" | ||||||
|  |     exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | VERSION=$1 | ||||||
|  |  | ||||||
|  | if ! [[ ${VERSION} =~ ^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}(-.+)?$ ]] ; | ||||||
|  | then | ||||||
|  |     echo "Version ${VERSION} isn't in format X.Y.Z" | ||||||
|  |     exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if ! git diff-index --quiet HEAD --; then | ||||||
|  |     echo "There are uncommitted changes" | ||||||
|  |     exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | jq '.version = "'$VERSION'"' package.json|sponge package.json | ||||||
|  |  | ||||||
|  | TAG=v$VERSION | ||||||
|  |  | ||||||
|  | git commit -m "$VERSION" | ||||||
|  | git push | ||||||
|  |  | ||||||
|  | git tag $TAG | ||||||
|  | git push origin $TAG | ||||||
|  |  | ||||||
|  | echo "Releasing Trilium $VERSION" | ||||||
|  |  | ||||||
|  | build | ||||||
|  |  | ||||||
|  | package | ||||||
|  |  | ||||||
|  | LINUX_BUILD=trilium-linux-$VERSION.7z | ||||||
|  | WINDOWS_BUILD=trilium-windows-$VERSION.7z | ||||||
|  |  | ||||||
|  | github-release release \ | ||||||
|  |     --tag $TAG \ | ||||||
|  |     --name "$TAG release" | ||||||
|  |  | ||||||
|  | github-release upload \ | ||||||
|  |     --tag $TAG \ | ||||||
|  |     --name "$LINUX_BUILD" \ | ||||||
|  |     --file "dist/$LINUX_BUILD" | ||||||
|  |  | ||||||
|  | github-release upload \ | ||||||
|  |     --tag $TAG \ | ||||||
|  |     --name "$WINDOWS_BUILD" \ | ||||||
|  |     --file "dist/$WINDOWS_BUILD" | ||||||
| @@ -6,6 +6,8 @@ const noteEditor = (function() { | |||||||
|     const protectButton = $("#protect-button"); |     const protectButton = $("#protect-button"); | ||||||
|     const unprotectButton = $("#unprotect-button"); |     const unprotectButton = $("#unprotect-button"); | ||||||
|     const noteDetailWrapperEl = $("#note-detail-wrapper"); |     const noteDetailWrapperEl = $("#note-detail-wrapper"); | ||||||
|  |     const noteIdDisplayEl = $("#note-id-display"); | ||||||
|  |  | ||||||
|     let editor = null; |     let editor = null; | ||||||
|  |  | ||||||
|     let currentNote = null; |     let currentNote = null; | ||||||
| @@ -79,18 +81,11 @@ const noteEditor = (function() { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     function setNoteBackgroundIfProtected(note) { |     function setNoteBackgroundIfProtected(note) { | ||||||
|         if (note.detail.is_protected) { |         const isProtected = !!note.detail.is_protected; | ||||||
|             $("#note-detail-wrapper").addClass("protected"); |  | ||||||
|             protectButton.hide(); |  | ||||||
|             unprotectButton.show(); |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             $("#note-detail-wrapper").removeClass("protected"); |  | ||||||
|             protectButton.show(); |  | ||||||
|             unprotectButton.hide(); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         noteTree.setCurrentNoteTreeBasedOnProtectedStatus(); |         noteDetailWrapperEl.toggleClass("protected", isProtected); | ||||||
|  |         protectButton.toggle(!isProtected); | ||||||
|  |         unprotectButton.toggle(isProtected); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     let isNewNoteCreated = false; |     let isNewNoteCreated = false; | ||||||
| @@ -108,6 +103,8 @@ const noteEditor = (function() { | |||||||
|             noteTitleEl.focus().select(); |             noteTitleEl.focus().select(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         noteIdDisplayEl.html(noteId); | ||||||
|  |  | ||||||
|         await protected_session.ensureProtectedSession(currentNote.detail.is_protected, false); |         await protected_session.ensureProtectedSession(currentNote.detail.is_protected, false); | ||||||
|  |  | ||||||
|         if (currentNote.detail.is_protected) { |         if (currentNote.detail.is_protected) { | ||||||
| @@ -129,6 +126,7 @@ const noteEditor = (function() { | |||||||
|         noteChangeDisabled = false; |         noteChangeDisabled = false; | ||||||
|  |  | ||||||
|         setNoteBackgroundIfProtected(currentNote); |         setNoteBackgroundIfProtected(currentNote); | ||||||
|  |         noteTree.setNoteTreeBackgroundBasedOnProtectedStatus(noteId); | ||||||
|  |  | ||||||
|         showAppIfHidden(); |         showAppIfHidden(); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -157,21 +157,17 @@ const noteTree = (function() { | |||||||
|     function getExtraClasses(note) { |     function getExtraClasses(note) { | ||||||
|         assertArguments(note); |         assertArguments(note); | ||||||
|  |  | ||||||
|         let extraClasses = ''; |         const extraClasses = []; | ||||||
|  |  | ||||||
|         if (note.is_protected) { |         if (note.is_protected) { | ||||||
|             extraClasses += ",protected"; |             extraClasses.push("protected"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (childToParents[note.note_id].length > 1) { |         if (childToParents[note.note_id].length > 1) { | ||||||
|             extraClasses += ",multiple-parents"; |             extraClasses.push("multiple-parents"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (extraClasses.startsWith(",")) { |         return extraClasses.join(" "); | ||||||
|             extraClasses = extraClasses.substr(1); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         return extraClasses; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function prepareNoteTreeInner(parentNoteId) { |     function prepareNoteTreeInner(parentNoteId) { | ||||||
| @@ -617,8 +613,14 @@ const noteTree = (function() { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function setCurrentNoteTreeBasedOnProtectedStatus() { |     function setNoteTreeBackgroundBasedOnProtectedStatus(noteId) { | ||||||
|         getCurrentClones().map(node => node.toggleClass("protected", !!node.data.is_protected)); |         getNodesByNoteId(noteId).map(node => node.toggleClass("protected", !!node.data.is_protected)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function setProtected(noteId, isProtected) { | ||||||
|  |         getNodesByNoteId(noteId).map(node => node.data.is_protected = isProtected); | ||||||
|  |  | ||||||
|  |         setNoteTreeBackgroundBasedOnProtectedStatus(noteId); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function getAutocompleteItems(parentNoteId, notePath, titlePath) { |     function getAutocompleteItems(parentNoteId, notePath, titlePath) { | ||||||
| @@ -776,7 +778,8 @@ const noteTree = (function() { | |||||||
|         reload, |         reload, | ||||||
|         collapseTree, |         collapseTree, | ||||||
|         scrollToCurrentNote, |         scrollToCurrentNote, | ||||||
|         setCurrentNoteTreeBasedOnProtectedStatus, |         setNoteTreeBackgroundBasedOnProtectedStatus, | ||||||
|  |         setProtected, | ||||||
|         getCurrentNode, |         getCurrentNode, | ||||||
|         activateNode, |         activateNode, | ||||||
|         getCurrentNotePath, |         getCurrentNotePath, | ||||||
|   | |||||||
| @@ -115,6 +115,8 @@ const protected_session = (function() { | |||||||
|  |  | ||||||
|         await noteEditor.saveNoteToServer(note); |         await noteEditor.saveNoteToServer(note); | ||||||
|  |  | ||||||
|  |         noteTree.setProtected(note.detail.note_id, note.detail.is_protected); | ||||||
|  |  | ||||||
|         noteEditor.setNoteBackgroundIfProtected(note); |         noteEditor.setNoteBackgroundIfProtected(note); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -129,6 +131,8 @@ const protected_session = (function() { | |||||||
|  |  | ||||||
|         await noteEditor.saveNoteToServer(note); |         await noteEditor.saveNoteToServer(note); | ||||||
|  |  | ||||||
|  |         noteTree.setProtected(note.detail.note_id, note.detail.is_protected); | ||||||
|  |  | ||||||
|         noteEditor.setNoteBackgroundIfProtected(note); |         noteEditor.setNoteBackgroundIfProtected(note); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -177,6 +177,10 @@ div.ui-tooltip { | |||||||
|     box-shadow: none; |     box-shadow: none; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #note-id-display { | ||||||
|  |     color: lightgrey; | ||||||
|  | } | ||||||
|  |  | ||||||
| #loader-wrapper{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000;background-color:#fff;opacity:1;transition:opacity 2s ease} | #loader-wrapper{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000;background-color:#fff;opacity:1;transition:opacity 2s ease} | ||||||
| #loader{display:block;position:relative;left:50%;top:50%;width:150px;height:150px;margin:-75px 0 0 -75px;border-radius:50%;border:3px solid transparent;border-top-color:#777;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite} | #loader{display:block;position:relative;left:50%;top:50%;width:150px;height:150px;margin:-75px 0 0 -75px;border-radius:50%;border:3px solid transparent;border-top-color:#777;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite} | ||||||
| #loader:before{content:"";position:absolute;top:5px;left:5px;right:5px;bottom:5px;border-radius:50%;border:3px solid transparent;border-top-color:#aaa;-webkit-animation:spin 3s linear infinite;animation:spin 3s linear infinite} | #loader:before{content:"";position:absolute;top:5px;left:5px;right:5px;bottom:5px;border-radius:50%;border:3px solid transparent;border-top-color:#aaa;-webkit-animation:spin 3s linear infinite;animation:spin 3s linear infinite} | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| module.exports = { build_date:"2017-12-23T14:02:07-05:00", build_revision: "51215cba1bd2da8a539e86dbd31004cf9adb3f93" }; | module.exports = { build_date:"2017-12-25T10:07:19-05:00", build_revision: "583123ab0a5df7dca5b19f2c67ab8ef853e72673" }; | ||||||
|   | |||||||
| @@ -104,8 +104,6 @@ async function protectNote(note, dataKey, protect, sourceId) { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (changed) { |     if (changed) { | ||||||
|         console.log("Updating..."); |  | ||||||
|  |  | ||||||
|         await sql.execute("UPDATE notes SET note_title = ?, note_text = ?, is_protected = ? WHERE note_id = ?", |         await sql.execute("UPDATE notes SET note_title = ?, note_text = ?, is_protected = ? WHERE note_id = ?", | ||||||
|             [note.note_title, note.note_text, note.is_protected, note.note_id]); |             [note.note_title, note.note_text, note.is_protected, note.note_id]); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +0,0 @@ | |||||||
| #!/usr/bin/env bash |  | ||||||
|  |  | ||||||
| echo 'module.exports = { build_date:"'`date --iso-8601=seconds`'", build_revision: "'`git log -1 --format="%H"`'" };' > services/build.js |  | ||||||
| @@ -95,6 +95,8 @@ | |||||||
|  |  | ||||||
|           <input autocomplete="off" value="" id="note-title" style="font-size: x-large; border: 0; flex-grow: 100;" tabindex="1"> |           <input autocomplete="off" value="" id="note-title" style="font-size: x-large; border: 0; flex-grow: 100;" tabindex="1"> | ||||||
|  |  | ||||||
|  |           <span id="note-id-display" title="Note ID"></span> | ||||||
|  |  | ||||||
|           <button class="btn btn-xs" style="margin: 10px;" onclick="noteHistory.showCurrentNoteHistory();">Note history</button> |           <button class="btn btn-xs" style="margin: 10px;" onclick="noteHistory.showCurrentNoteHistory();">Note history</button> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
| @@ -171,9 +173,10 @@ | |||||||
|       <form id="protected-session-password-form"> |       <form id="protected-session-password-form"> | ||||||
|         <div class="form-group"> |         <div class="form-group"> | ||||||
|           <label for="protected-session-password">To proceed with requested action you need to enter protected session by entering password:</label> |           <label for="protected-session-password">To proceed with requested action you need to enter protected session by entering password:</label> | ||||||
|           <input id="protected-session-password" style="width: 250px;" type="password"> |           <input id="protected-session-password" class="form-control" type="password"> | ||||||
|           <button class="btn btn-sm">Show</button> |  | ||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|  |         <button class="btn btn-sm">Enter protected session</button> | ||||||
|       </form> |       </form> | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user