mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 10:26:08 +01:00 
			
		
		
		
	Compare commits
	
		
			17 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | a717ee00fb | ||
|  | f5e27278ab | ||
|  | 20c24e26cc | ||
|  | 3bafc396fc | ||
|  | 3fa3e912a4 | ||
|  | 44219e7ccc | ||
|  | 5b67854cbe | ||
|  | c6d912dcb7 | ||
|  | da53c1eaa8 | ||
|  | 73bf2dcb02 | ||
|  | 719f10981e | ||
|  | deb67d6275 | ||
|  | e4039ea5e1 | ||
|  | 78a50be663 | ||
|  | 3d3ad3b99b | ||
|  | 0d9cdcac85 | ||
|  | 350331e2ef | 
| @@ -57,7 +57,6 @@ | ||||
|     <index id="24" parent="6" name="sqlite_autoindex_api_tokens_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>apiTokenId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <key id="25" parent="6"> | ||||
| @@ -131,21 +130,17 @@ | ||||
|     <index id="38" parent="7" name="sqlite_autoindex_attributes_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>attributeId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="39" parent="7" name="IDX_attributes_noteId_index"> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="40" parent="7" name="IDX_attributes_name_value"> | ||||
|       <ColNames>name | ||||
| value</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="41" parent="7" name="IDX_attributes_value_index"> | ||||
|       <ColNames>value</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="42" parent="7"> | ||||
|       <ColNames>attributeId</ColNames> | ||||
| @@ -212,17 +207,14 @@ value</ColNames> | ||||
|     <index id="54" parent="8" name="sqlite_autoindex_branches_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>branchId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="55" parent="8" name="IDX_branches_noteId_parentNoteId"> | ||||
|       <ColNames>noteId | ||||
| parentNoteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="56" parent="8" name="IDX_branches_parentNoteId"> | ||||
|       <ColNames>parentNoteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="57" parent="8"> | ||||
|       <ColNames>branchId</ColNames> | ||||
| @@ -253,7 +245,6 @@ parentNoteId</ColNames> | ||||
|     <index id="62" parent="9" name="sqlite_autoindex_note_contents_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <key id="63" parent="9"> | ||||
| @@ -284,7 +275,6 @@ parentNoteId</ColNames> | ||||
|     <index id="68" parent="10" name="sqlite_autoindex_note_revision_contents_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>noteRevisionId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <key id="69" parent="10"> | ||||
| @@ -369,28 +359,22 @@ parentNoteId</ColNames> | ||||
|     <index id="84" parent="11" name="sqlite_autoindex_note_revisions_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>noteRevisionId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="85" parent="11" name="IDX_note_revisions_noteId"> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="86" parent="11" name="IDX_note_revisions_utcDateLastEdited"> | ||||
|       <ColNames>utcDateLastEdited</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="87" parent="11" name="IDX_note_revisions_utcDateCreated"> | ||||
|       <ColNames>utcDateCreated</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="88" parent="11" name="IDX_note_revisions_dateLastEdited"> | ||||
|       <ColNames>dateLastEdited</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="89" parent="11" name="IDX_note_revisions_dateCreated"> | ||||
|       <ColNames>dateCreated</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="90" parent="11"> | ||||
|       <ColNames>noteRevisionId</ColNames> | ||||
| @@ -477,36 +461,28 @@ parentNoteId</ColNames> | ||||
|     <index id="105" parent="12" name="sqlite_autoindex_notes_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="106" parent="12" name="IDX_notes_title"> | ||||
|       <ColNames>title</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="107" parent="12" name="IDX_notes_type"> | ||||
|       <ColNames>type</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="108" parent="12" name="IDX_notes_isDeleted"> | ||||
|       <ColNames>isDeleted</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="109" parent="12" name="IDX_notes_dateCreated"> | ||||
|       <ColNames>dateCreated</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="110" parent="12" name="IDX_notes_dateModified"> | ||||
|       <ColNames>dateModified</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="111" parent="12" name="IDX_notes_utcDateCreated"> | ||||
|       <ColNames>utcDateCreated</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="112" parent="12" name="IDX_notes_utcDateModified"> | ||||
|       <ColNames>utcDateModified</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="113" parent="12"> | ||||
|       <ColNames>noteId</ColNames> | ||||
| @@ -547,7 +523,6 @@ parentNoteId</ColNames> | ||||
|     <index id="120" parent="13" name="sqlite_autoindex_options_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>name</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <key id="121" parent="13"> | ||||
| @@ -583,7 +558,6 @@ parentNoteId</ColNames> | ||||
|     <index id="127" parent="14" name="sqlite_autoindex_recent_notes_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <key id="128" parent="14"> | ||||
| @@ -604,12 +578,10 @@ parentNoteId</ColNames> | ||||
|     <index id="131" parent="15" name="sqlite_autoindex_source_ids_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>sourceId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="132" parent="15" name="IDX_source_ids_utcDateCreated"> | ||||
|       <ColNames>utcDateCreated</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="133" parent="15"> | ||||
|       <ColNames>sourceId</ColNames> | ||||
| @@ -663,22 +635,26 @@ parentNoteId</ColNames> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="145" parent="18" name="utcSyncDate"> | ||||
|     <column id="145" parent="18" name="isSynced"> | ||||
|       <Position>5</Position> | ||||
|       <DataType>INTEGER|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>0</DefaultExpression> | ||||
|     </column> | ||||
|     <column id="146" parent="18" name="utcSyncDate"> | ||||
|       <Position>6</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <index id="146" parent="18" name="IDX_sync_entityName_entityId"> | ||||
|     <index id="147" parent="18" name="IDX_sync_entityName_entityId"> | ||||
|       <ColNames>entityName | ||||
| entityId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="147" parent="18" name="IDX_sync_utcSyncDate"> | ||||
|     <index id="148" parent="18" name="IDX_sync_utcSyncDate"> | ||||
|       <ColNames>utcSyncDate</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="148" parent="18"> | ||||
|     <key id="149" parent="18"> | ||||
|       <ColNames>id</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|     </key> | ||||
|   | ||||
							
								
								
									
										22
									
								
								db/migrations/0158__add_isSynced_to_sync.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								db/migrations/0158__add_isSynced_to_sync.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| CREATE TABLE IF NOT EXISTS "sync_mig" ( | ||||
|                                           `id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, | ||||
|                                           `entityName`	TEXT NOT NULL, | ||||
|                                           `entityId`	TEXT NOT NULL, | ||||
|                                           `sourceId` TEXT NOT NULL, | ||||
|                                           `isSynced` INTEGER default 0 not null, | ||||
|                                           `utcSyncDate`	TEXT NOT NULL); | ||||
|  | ||||
| INSERT INTO sync_mig (id, entityName, entityId, sourceId, isSynced, utcSyncDate) | ||||
| SELECT id, entityName, entityId, sourceId, 1, utcSyncDate FROM sync; | ||||
|  | ||||
| DROP TABLE sync; | ||||
|  | ||||
| ALTER TABLE sync_mig RENAME TO sync; | ||||
|  | ||||
| CREATE UNIQUE INDEX `IDX_sync_entityName_entityId` ON `sync` ( | ||||
|                                                               `entityName`, | ||||
|                                                               `entityId` | ||||
|     ); | ||||
| CREATE INDEX `IDX_sync_utcSyncDate` ON `sync` ( | ||||
|                                                `utcSyncDate` | ||||
|     ); | ||||
| @@ -1,16 +1,8 @@ | ||||
| CREATE TABLE IF NOT EXISTS "sync" ( | ||||
|                                     `id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, | ||||
|                                     `entityName`	TEXT NOT NULL, | ||||
|                                     `entityId`	TEXT NOT NULL, | ||||
|                                     `sourceId` TEXT NOT NULL, | ||||
|                                     `utcSyncDate`	TEXT NOT NULL); | ||||
| CREATE TABLE IF NOT EXISTS "source_ids" ( | ||||
|                                           `sourceId`	TEXT NOT NULL, | ||||
|                                           `utcDateCreated`	TEXT NOT NULL, | ||||
|                                           PRIMARY KEY(`sourceId`) | ||||
| ); | ||||
| CREATE INDEX IDX_source_ids_utcDateCreated | ||||
|     on source_ids (utcDateCreated); | ||||
| CREATE TABLE IF NOT EXISTS "api_tokens" | ||||
| ( | ||||
|   apiTokenId TEXT PRIMARY KEY NOT NULL, | ||||
| @@ -27,13 +19,6 @@ CREATE TABLE IF NOT EXISTS "options" | ||||
|   utcDateCreated TEXT not null, | ||||
|   utcDateModified TEXT NOT NULL | ||||
| ); | ||||
| CREATE UNIQUE INDEX `IDX_sync_entityName_entityId` ON `sync` ( | ||||
|                                                               `entityName`, | ||||
|                                                               `entityId` | ||||
|   ); | ||||
| CREATE INDEX `IDX_sync_utcSyncDate` ON `sync` ( | ||||
|                                             `utcSyncDate` | ||||
|   ); | ||||
| CREATE TABLE IF NOT EXISTS "note_contents" ( | ||||
|                                                    `noteId`	TEXT NOT NULL, | ||||
|                                                    `content`	TEXT NULL DEFAULT NULL, | ||||
| @@ -72,6 +57,8 @@ CREATE INDEX `IDX_note_revisions_utcDateCreated` ON `note_revisions` (`utcDateCr | ||||
| CREATE INDEX `IDX_note_revisions_utcDateLastEdited` ON `note_revisions` (`utcDateLastEdited`); | ||||
| CREATE INDEX `IDX_note_revisions_dateCreated` ON `note_revisions` (`dateCreated`); | ||||
| CREATE INDEX `IDX_note_revisions_dateLastEdited` ON `note_revisions` (`dateLastEdited`); | ||||
| CREATE INDEX IDX_source_ids_utcDateCreated | ||||
|     on source_ids (utcDateCreated); | ||||
| CREATE TABLE IF NOT EXISTS "notes" ( | ||||
|                                            `noteId`	TEXT NOT NULL, | ||||
|                                            `title`	TEXT NOT NULL DEFAULT "note", | ||||
| @@ -130,3 +117,17 @@ CREATE INDEX IDX_attributes_noteId_index | ||||
|     on attributes (noteId); | ||||
| CREATE INDEX IDX_attributes_value_index | ||||
|     on attributes (value); | ||||
| CREATE TABLE IF NOT EXISTS "sync" ( | ||||
|     `id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, | ||||
|     `entityName`	TEXT NOT NULL, | ||||
|     `entityId`	TEXT NOT NULL, | ||||
|     `sourceId` TEXT NOT NULL, | ||||
|     `isSynced` INTEGER default 0 not null, | ||||
|     `utcSyncDate`	TEXT NOT NULL); | ||||
| CREATE UNIQUE INDEX `IDX_sync_entityName_entityId` ON `sync` ( | ||||
|                                                               `entityName`, | ||||
|                                                               `entityId` | ||||
|     ); | ||||
| CREATE INDEX `IDX_sync_utcSyncDate` ON `sync` ( | ||||
|                                                `utcSyncDate` | ||||
|     ); | ||||
|   | ||||
							
								
								
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "trilium", | ||||
|   "version": "0.40.3", | ||||
|   "version": "0.40.4", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   "name": "trilium", | ||||
|   "productName": "Trilium Notes", | ||||
|   "description": "Trilium Notes", | ||||
|   "version": "0.40.4", | ||||
|   "version": "0.40.6", | ||||
|   "license": "AGPL-3.0-only", | ||||
|   "main": "electron.js", | ||||
|   "bin": { | ||||
|   | ||||
| @@ -11,7 +11,9 @@ const ENTITY_NAME_TO_ENTITY = { | ||||
|     "attributes": Attribute, | ||||
|     "branches": Branch, | ||||
|     "notes": Note, | ||||
|     "note_contents": Note, | ||||
|     "note_revisions": NoteRevision, | ||||
|     "note_revision_contents": NoteRevision, | ||||
|     "recent_notes": RecentNote, | ||||
|     "options": Option, | ||||
|     "api_tokens": ApiToken, | ||||
|   | ||||
| @@ -161,7 +161,13 @@ async function printActiveNote() { | ||||
|         importCSS: false, | ||||
|         loadCSS: [ | ||||
|             "libraries/codemirror/codemirror.css", | ||||
|             "libraries/ckeditor/ckeditor-content.css" | ||||
|             "libraries/ckeditor/ckeditor-content.css", | ||||
|             "libraries/ckeditor/ckeditor-content.css", | ||||
|             "libraries/bootstrap/css/bootstrap.min.css", | ||||
|             "stylesheets/print.css", | ||||
|             "stylesheets/relation_map.css", | ||||
|             "stylesheets/themes.css", | ||||
|             "stylesheets/detail.css" | ||||
|         ], | ||||
|         debug: true | ||||
|     }); | ||||
|   | ||||
| @@ -148,8 +148,8 @@ class NoteDetailBook { | ||||
|                 const label = `${childCount} child${childCount > 1 ? 'ren' : ''}`; | ||||
|  | ||||
|                 $card.append($('<div class="note-book-children">') | ||||
|                     .append($(`<a class="note-book-open-children-button" href="javascript:">+ Show ${label}</a>`)) | ||||
|                     .append($(`<a class="note-book-hide-children-button" href="javascript:">- Hide ${label}</a>`).hide()) | ||||
|                     .append($(`<a class="note-book-open-children-button no-print" href="javascript:">+ Show ${label}</a>`)) | ||||
|                     .append($(`<a class="note-book-hide-children-button no-print" href="javascript:">- Hide ${label}</a>`).hide()) | ||||
|                     .append($('<div class="note-book-children-content">')) | ||||
|                 ); | ||||
|             } | ||||
|   | ||||
| @@ -60,6 +60,7 @@ class NoteDetailCode { | ||||
|             // CodeMirror breaks pretty badly on null so even though it shouldn't happen (guarded by consistency check) | ||||
|             // we provide fallback | ||||
|             this.codeEditor.setValue(this.ctx.note.content || ""); | ||||
|             this.codeEditor.clearHistory(); | ||||
|  | ||||
|             const info = CodeMirror.findModeByMIME(this.ctx.note.mime); | ||||
|  | ||||
|   | ||||
| @@ -43,6 +43,7 @@ body { | ||||
|     min-height: 0; | ||||
|     padding-left: 10px; | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
| } | ||||
|  | ||||
| #search-box { | ||||
|   | ||||
							
								
								
									
										69
									
								
								src/public/stylesheets/detail.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								src/public/stylesheets/detail.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| .note-detail-book { | ||||
|     height: 100%; | ||||
| } | ||||
|  | ||||
| .note-detail-book-content { | ||||
|     display: flex; | ||||
|     flex-wrap: wrap; | ||||
|     overflow: auto; | ||||
|     height: 100%; | ||||
|     align-content: start; | ||||
| } | ||||
|  | ||||
| .note-book-card { | ||||
|     border-radius: 10px; | ||||
|     background-color: var(--accented-background-color); | ||||
|     padding: 15px; | ||||
|     padding-bottom: 5px; | ||||
|     margin: 5px; | ||||
|     margin-left: 0; | ||||
|     overflow: hidden; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     flex-shrink: 0; | ||||
| } | ||||
|  | ||||
| .note-book-card .note-book-card { | ||||
|     border: 1px solid var(--main-border-color); | ||||
| } | ||||
|  | ||||
| .note-book-content { | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .note-book-card.type-image .note-book-content, .note-book-card.type-file .note-book-content, .note-book-card.type-protected-session .note-book-content { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| .note-book-card.type-image .note-book-content img, .note-book-card.type-text .note-book-content img { | ||||
|     max-width: 100%; | ||||
|     max-height: 100%; | ||||
| } | ||||
|  | ||||
| .note-book-title { | ||||
|     flex-grow: 0; | ||||
| } | ||||
|  | ||||
| .note-book-content { | ||||
|     flex-grow: 1; | ||||
| } | ||||
|  | ||||
| .note-book-auto-message { | ||||
|     background-color: var(--accented-background-color); | ||||
|     text-align: center; | ||||
|     width: 100%; | ||||
|     border-radius: 10px; | ||||
|     padding: 5px; | ||||
|     margin-top: 5px; | ||||
| } | ||||
|  | ||||
| .note-detail-image { | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| .note-detail-image-view { | ||||
|     max-width: 100%; | ||||
| } | ||||
							
								
								
									
										11
									
								
								src/public/stylesheets/print.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/public/stylesheets/print.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| @media print | ||||
| { | ||||
|     .no-print, .no-print * | ||||
|     { | ||||
|         display: none !important; | ||||
|     } | ||||
|  | ||||
|     .relation-map-wrapper { | ||||
|         height: 100vh !important; | ||||
|     } | ||||
| } | ||||
| @@ -518,14 +518,6 @@ button.icon-button { | ||||
|     padding: 5px; | ||||
| } | ||||
|  | ||||
| .note-detail-image { | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| .note-detail-image-view { | ||||
|     max-width: 100%; | ||||
| } | ||||
|  | ||||
| pre:not(.CodeMirror-line) { | ||||
|     color: var(--main-text-color) !important; | ||||
|     white-space: pre-wrap; | ||||
| @@ -857,68 +849,6 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href | ||||
|     z-index: 100; | ||||
| } | ||||
|  | ||||
| .note-detail-book { | ||||
|     height: 100%; | ||||
| } | ||||
|  | ||||
| .note-detail-book-content { | ||||
|     display: flex; | ||||
|     flex-wrap: wrap; | ||||
|     overflow: auto; | ||||
|     height: 100%; | ||||
|     align-content: start; | ||||
| } | ||||
|  | ||||
| .note-book-card { | ||||
|     border-radius: 10px; | ||||
|     background-color: var(--accented-background-color); | ||||
|     padding: 15px; | ||||
|     padding-bottom: 5px; | ||||
|     margin: 5px; | ||||
|     margin-left: 0; | ||||
|     overflow: hidden; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     flex-shrink: 0; | ||||
| } | ||||
|  | ||||
| .note-book-card .note-book-card { | ||||
|     border: 1px solid var(--main-border-color); | ||||
| } | ||||
|  | ||||
| .note-book-content { | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .note-book-card.type-image .note-book-content, .note-book-card.type-file .note-book-content, .note-book-card.type-protected-session .note-book-content { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| .note-book-card.type-image .note-book-content img, .note-book-card.type-text .note-book-content img { | ||||
|     max-width: 100%; | ||||
|     max-height: 100%; | ||||
| } | ||||
|  | ||||
| .note-book-title { | ||||
|     flex-grow: 0; | ||||
| } | ||||
|  | ||||
| .note-book-content { | ||||
|     flex-grow: 1; | ||||
| } | ||||
|  | ||||
| .note-book-auto-message { | ||||
|     background-color: var(--accented-background-color); | ||||
|     text-align: center; | ||||
|     width: 100%; | ||||
|     border-radius: 10px; | ||||
|     padding: 5px; | ||||
|     margin-top: 5px; | ||||
| } | ||||
|  | ||||
| #toast-container { | ||||
|     position: absolute; | ||||
|     width: 100%; | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| "use strict"; | ||||
|  | ||||
| const app_info = require('../../services/app_info'); | ||||
| const appInfo = require('../../services/app_info'); | ||||
|  | ||||
| async function getAppInfo() { | ||||
|     return app_info; | ||||
|     return appInfo; | ||||
| } | ||||
|  | ||||
| module.exports = { | ||||
|   | ||||
| @@ -49,7 +49,7 @@ async function loginSync(req) { | ||||
|  | ||||
|     return { | ||||
|         sourceId: sourceIdService.getCurrentSourceId(), | ||||
|         maxSyncId: await sql.getValue("SELECT MAX(id) FROM sync") | ||||
|         maxSyncId: await sql.getValue("SELECT MAX(id) FROM sync WHERE isSynced = 1") | ||||
|     }; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -50,7 +50,7 @@ async function getStats() { | ||||
| async function checkSync() { | ||||
|     return { | ||||
|         entityHashes: await contentHashService.getEntityHashes(), | ||||
|         maxSyncId: await sql.getValue('SELECT MAX(id) FROM sync') | ||||
|         maxSyncId: await sql.getValue('SELECT MAX(id) FROM sync WHERE isSynced = 1') | ||||
|     }; | ||||
| } | ||||
|  | ||||
| @@ -116,11 +116,11 @@ async function forceNoteSync(req) { | ||||
| async function getChanged(req) { | ||||
|     const lastSyncId = parseInt(req.query.lastSyncId); | ||||
|  | ||||
|     const syncs = await sql.getRows("SELECT * FROM sync WHERE id > ? LIMIT 1000", [lastSyncId]); | ||||
|     const syncs = await sql.getRows("SELECT * FROM sync WHERE isSynced = 1 AND id > ? LIMIT 1000", [lastSyncId]); | ||||
|  | ||||
|     return { | ||||
|         syncs: await syncService.getSyncRecords(syncs), | ||||
|         maxSyncId: await sql.getValue('SELECT MAX(id) FROM sync') | ||||
|         maxSyncId: await sql.getValue('SELECT MAX(id) FROM sync WHERE isSynced = 1') | ||||
|     }; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ const build = require('./build'); | ||||
| const packageJson = require('../../package'); | ||||
| const {TRILIUM_DATA_DIR} = require('./data_dir'); | ||||
|  | ||||
| const APP_DB_VERSION = 157; | ||||
| const APP_DB_VERSION = 158; | ||||
| const SYNC_VERSION = 14; | ||||
| const CLIPPER_PROTOCOL_VERSION = "1.0"; | ||||
|  | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| module.exports = { buildDate:"2020-02-24T22:59:22+01:00", buildRevision: "fb55cdaea6b1367129e11118b8b6fd2eadebad5f" }; | ||||
| module.exports = { buildDate:"2020-03-15T11:21:43+01:00", buildRevision: "f5e27278ab2a38484019ee2510781099b60ec2b6" }; | ||||
|   | ||||
| @@ -51,7 +51,7 @@ class ConsistencyChecks { | ||||
|             childToParents[childNoteId].push(parentNoteId); | ||||
|         } | ||||
|  | ||||
|         function checkTreeCycle(noteId, path) { | ||||
|         const checkTreeCycle = (noteId, path) => { | ||||
|             if (noteId === 'root') { | ||||
|                 return; | ||||
|             } | ||||
| @@ -75,7 +75,7 @@ class ConsistencyChecks { | ||||
|                     checkTreeCycle(parentNoteId, newPath); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         }; | ||||
|  | ||||
|         const noteIds = Object.keys(childToParents); | ||||
|  | ||||
| @@ -546,7 +546,7 @@ class ConsistencyChecks { | ||||
|           ${entityName}  | ||||
|           LEFT JOIN sync ON sync.entityName = '${entityName}' AND entityId = ${key}  | ||||
|         WHERE  | ||||
|           sync.id IS NULL AND ` + (entityName === 'options' ? 'isSynced = 1' : '1'), | ||||
|           sync.id IS NULL AND ` + (entityName === 'options' ? 'options.isSynced = 1' : '1'), | ||||
|             async ({entityId}) => { | ||||
|                 if (this.autoFix) { | ||||
|                     await syncTableService.addEntitySync(entityName, entityId); | ||||
|   | ||||
| @@ -235,8 +235,6 @@ async function importEnex(taskContext, file, parentNote) { | ||||
|  | ||||
|         taskContext.increaseProgressCount(); | ||||
|  | ||||
|         let noteContent = await noteEntity.getContent(); | ||||
|  | ||||
|         for (const resource of resources) { | ||||
|             const hash = utils.md5(resource.content); | ||||
|  | ||||
| @@ -268,7 +266,7 @@ async function importEnex(taskContext, file, parentNote) { | ||||
|  | ||||
|                 const resourceLink = `<a href="#root/${resourceNote.noteId}">${utils.escapeHtml(resource.title)}</a>`; | ||||
|  | ||||
|                 noteContent = noteContent.replace(mediaRegex, resourceLink); | ||||
|                 content = content.replace(mediaRegex, resourceLink); | ||||
|             }; | ||||
|  | ||||
|             if (["image/jpeg", "image/png", "image/gif", "image/webp"].includes(resource.mime)) { | ||||
| @@ -281,12 +279,12 @@ async function importEnex(taskContext, file, parentNote) { | ||||
|  | ||||
|                     const imageLink = `<img src="${url}">`; | ||||
|  | ||||
|                     noteContent = noteContent.replace(mediaRegex, imageLink); | ||||
|                     content = content.replace(mediaRegex, imageLink); | ||||
|  | ||||
|                     if (!noteContent.includes(imageLink)) { | ||||
|                     if (!content.includes(imageLink)) { | ||||
|                         // if there wasn't any match for the reference, we'll add the image anyway | ||||
|                         // otherwise image would be removed since no note would include it | ||||
|                         noteContent += imageLink; | ||||
|                         content += imageLink; | ||||
|                     } | ||||
|                 } catch (e) { | ||||
|                     log.error("error when saving image from ENEX file: " + e); | ||||
| @@ -298,7 +296,7 @@ async function importEnex(taskContext, file, parentNote) { | ||||
|         } | ||||
|  | ||||
|         // save updated content with links to files/images | ||||
|         await noteEntity.setContent(noteContent); | ||||
|         await noteEntity.setContent(content); | ||||
|  | ||||
|         await noteService.scanForLinks(noteEntity.noteId); | ||||
|  | ||||
|   | ||||
| @@ -209,6 +209,8 @@ async function transactional(func) { | ||||
|  | ||||
|             transactionActive = false; | ||||
|             resolve(); | ||||
|  | ||||
|             setTimeout(() => require('./ws').sendPingToAllClients(), 50); | ||||
|         } | ||||
|         catch (e) { | ||||
|             if (transactionActive) { | ||||
|   | ||||
| @@ -176,7 +176,7 @@ async function pushSync(syncContext) { | ||||
|     let lastSyncedPush = await getLastSyncedPush(); | ||||
|  | ||||
|     while (true) { | ||||
|         const syncs = await sql.getRows('SELECT * FROM sync WHERE id > ? LIMIT 1000', [lastSyncedPush]); | ||||
|         const syncs = await sql.getRows('SELECT * FROM sync WHERE isSynced = 1 AND id > ? LIMIT 1000', [lastSyncedPush]); | ||||
|  | ||||
|         if (syncs.length === 0) { | ||||
|             log.info("Nothing to push"); | ||||
| @@ -236,7 +236,7 @@ async function checkContentHash(syncContext) { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     const notPushedSyncs = await sql.getValue("SELECT EXISTS(SELECT 1 FROM sync WHERE id > ?)", [await getLastSyncedPush()]); | ||||
|     const notPushedSyncs = await sql.getValue("SELECT EXISTS(SELECT 1 FROM sync WHERE isSynced = 1 AND id > ?)", [await getLastSyncedPush()]); | ||||
|  | ||||
|     if (notPushedSyncs) { | ||||
|         log.info(`There's ${notPushedSyncs} outstanding pushes, skipping content check.`); | ||||
| @@ -353,7 +353,7 @@ async function updatePushStats() { | ||||
|     if (await syncOptions.isSyncSetup()) { | ||||
|         const lastSyncedPush = await optionService.getOption('lastSyncedPush'); | ||||
|  | ||||
|         stats.outstandingPushes = await sql.getValue("SELECT COUNT(1) FROM sync WHERE id > ?", [lastSyncedPush]); | ||||
|         stats.outstandingPushes = await sql.getValue("SELECT COUNT(1) FROM sync WHERE isSynced = 1 AND id > ?", [lastSyncedPush]); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,8 @@ async function insertEntitySync(entityName, entityId, sourceId) { | ||||
|         entityName: entityName, | ||||
|         entityId: entityId, | ||||
|         utcSyncDate: dateUtils.utcNowDateTime(), | ||||
|         sourceId: sourceId || cls.getSourceId() || sourceIdService.getCurrentSourceId() | ||||
|         sourceId: sourceId || cls.getSourceId() || sourceIdService.getCurrentSourceId(), | ||||
|         isSynced: 1 | ||||
|     }; | ||||
|  | ||||
|     sync.id = await sql.replace("sync", sync); | ||||
| @@ -23,8 +24,6 @@ async function addEntitySync(entityName, entityId, sourceId) { | ||||
|     const sync = await insertEntitySync(entityName, entityId, sourceId); | ||||
|  | ||||
|     syncs.push(sync); | ||||
|  | ||||
|     setTimeout(() => require('./ws').sendPingToAllClients(), 50); | ||||
| } | ||||
|  | ||||
| async function addEntitySyncsForSector(entityName, entityPrimaryKey, sector) { | ||||
|   | ||||
| @@ -250,6 +250,7 @@ | ||||
|  | ||||
| <link href="stylesheets/themes.css" rel="stylesheet"> | ||||
| <link href="stylesheets/style.css" rel="stylesheet"> | ||||
| <link href="stylesheets/detail.css" rel="stylesheet"> | ||||
| <link href="stylesheets/desktop.css" rel="stylesheet"> | ||||
|  | ||||
| <script src="javascripts/desktop.js" crossorigin type="module"></script> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <div class="note-detail-image note-detail-component"> | ||||
|     <div style="display: flex; justify-content: space-evenly; margin: 10px;"> | ||||
|     <div class="no-print" style="display: flex; justify-content: space-evenly; margin: 10px;"> | ||||
|         <button class="image-download btn btn-sm btn-primary" type="button">Download</button> | ||||
|  | ||||
|         <button class="image-copy-to-clipboard btn btn-sm btn-primary" type="button">Copy to clipboard</button> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <div class="note-detail-relation-map note-detail-component"> | ||||
|     <button class="relation-map-create-child-note btn btn-sm floating-button" type="button" | ||||
|     <button class="relation-map-create-child-note btn btn-sm floating-button no-print" type="button" | ||||
|             title="Create new child note and add it into this relation map"> | ||||
|         <span class="bx bx-folder-plus"></span> | ||||
|  | ||||
| @@ -7,11 +7,11 @@ | ||||
|     </button> | ||||
|  | ||||
|     <button type="button" | ||||
|             class="relation-map-reset-pan-zoom btn icon-button floating-button bx bx-crop" | ||||
|             class="relation-map-reset-pan-zoom btn icon-button floating-button bx bx-crop no-print" | ||||
|             title="Reset pan & zoom to initial coordinates and magnification" | ||||
|             style="right: 70px;"></button> | ||||
|  | ||||
|     <div class="btn-group floating-button" style="right: 10px;"> | ||||
|     <div class="btn-group floating-button no-print" style="right: 10px;"> | ||||
|         <button type="button" | ||||
|                 class="relation-map-zoom-in btn icon-button bx bx-zoom-in" | ||||
|                 title="Zoom In"></button> | ||||
|   | ||||
| @@ -118,6 +118,7 @@ | ||||
|  | ||||
| <link href="stylesheets/themes.css" rel="stylesheet"> | ||||
| <link href="stylesheets/style.css" rel="stylesheet"> | ||||
| <link href="stylesheets/detail.css" rel="stylesheet"> | ||||
| <link href="stylesheets/mobile.css" rel="stylesheet"> | ||||
|  | ||||
| <link rel="stylesheet" type="text/css" href="libraries/boxicons/css/boxicons.min.css"> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user