mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 10:26:08 +01:00 
			
		
		
		
	WIP refactoring of data structures in note tree
This commit is contained in:
		
							
								
								
									
										14
									
								
								.idea/dataSources.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								.idea/dataSources.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="DataSourceManagerImpl" format="xml" multifile-model="true"> | ||||
|     <data-source source="LOCAL" name="document.db" uuid="a2c75661-f9e2-478f-a69f-6a9409e69997"> | ||||
|       <driver-ref>sqlite.xerial</driver-ref> | ||||
|       <synchronize>true</synchronize> | ||||
|       <jdbc-driver>org.sqlite.JDBC</jdbc-driver> | ||||
|       <jdbc-url>jdbc:sqlite:$USER_HOME$/trilium-data/document.db</jdbc-url> | ||||
|       <driver-properties> | ||||
|         <property name="enable_load_extension" value="true" /> | ||||
|       </driver-properties> | ||||
|     </data-source> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										588
									
								
								.idea/dataSources/a2c75661-f9e2-478f-a69f-6a9409e69997.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										588
									
								
								.idea/dataSources/a2c75661-f9e2-478f-a69f-6a9409e69997.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,588 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <dataSource name="document.db"> | ||||
|   <database-model serializer="dbm" rdbms="SQLITE" format-version="4.7"> | ||||
|     <root id="1"/> | ||||
|     <schema id="2" parent="1" name="main"> | ||||
|       <Current>1</Current> | ||||
|       <Visible>1</Visible> | ||||
|     </schema> | ||||
|     <collation id="3" parent="1" name="BINARY"/> | ||||
|     <collation id="4" parent="1" name="NOCASE"/> | ||||
|     <collation id="5" parent="1" name="RTRIM"/> | ||||
|     <table id="6" parent="2" name="api_tokens"/> | ||||
|     <table id="7" parent="2" name="attributes"/> | ||||
|     <table id="8" parent="2" name="event_log"/> | ||||
|     <table id="9" parent="2" name="images"/> | ||||
|     <table id="10" parent="2" name="note_images"/> | ||||
|     <table id="11" parent="2" name="note_revisions"/> | ||||
|     <table id="12" parent="2" name="note_tree"/> | ||||
|     <table id="13" parent="2" name="notes"/> | ||||
|     <table id="14" parent="2" name="options"/> | ||||
|     <table id="15" parent="2" name="recent_notes"/> | ||||
|     <table id="16" parent="2" name="source_ids"/> | ||||
|     <table id="17" parent="2" name="sqlite_master"> | ||||
|       <System>1</System> | ||||
|     </table> | ||||
|     <table id="18" parent="2" name="sqlite_sequence"> | ||||
|       <System>1</System> | ||||
|     </table> | ||||
|     <table id="19" parent="2" name="sync"/> | ||||
|     <column id="20" parent="6" name="apiTokenId"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="21" parent="6" name="token"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="22" parent="6" name="dateCreated"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="23" parent="6" name="isDeleted"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>INT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>0</DefaultExpression> | ||||
|     </column> | ||||
|     <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"> | ||||
|       <ColNames>apiTokenId</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|       <UnderlyingIndexName>sqlite_autoindex_api_tokens_1</UnderlyingIndexName> | ||||
|     </key> | ||||
|     <column id="26" parent="7" name="attributeId"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="27" parent="7" name="noteId"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="28" parent="7" name="name"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="29" parent="7" name="value"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>''</DefaultExpression> | ||||
|     </column> | ||||
|     <column id="30" parent="7" name="position"> | ||||
|       <Position>5</Position> | ||||
|       <DataType>INT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>0</DefaultExpression> | ||||
|     </column> | ||||
|     <column id="31" parent="7" name="dateCreated"> | ||||
|       <Position>6</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="32" parent="7" name="dateModified"> | ||||
|       <Position>7</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="33" parent="7" name="isDeleted"> | ||||
|       <Position>8</Position> | ||||
|       <DataType>INT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <index id="34" parent="7" name="sqlite_autoindex_attributes_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>attributeId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="35" parent="7" name="IDX_attributes_noteId"> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="36" parent="7" name="IDX_attributes_name_value"> | ||||
|       <ColNames>name | ||||
| value</ColNames> | ||||
|       <ColumnCollations> | ||||
| </ColumnCollations> | ||||
|     </index> | ||||
|     <key id="37" parent="7"> | ||||
|       <ColNames>attributeId</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|       <UnderlyingIndexName>sqlite_autoindex_attributes_1</UnderlyingIndexName> | ||||
|     </key> | ||||
|     <column id="38" parent="8" name="id"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>INTEGER|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <SequenceIdentity>1</SequenceIdentity> | ||||
|     </column> | ||||
|     <column id="39" parent="8" name="noteId"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|     </column> | ||||
|     <column id="40" parent="8" name="comment"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|     </column> | ||||
|     <column id="41" parent="8" name="dateAdded"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <key id="42" parent="8"> | ||||
|       <ColNames>id</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|     </key> | ||||
|     <foreign-key id="43" parent="8"> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <RefTableName>notes</RefTableName> | ||||
|       <RefColNames>noteId</RefColNames> | ||||
|     </foreign-key> | ||||
|     <column id="44" parent="9" name="imageId"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="45" parent="9" name="format"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="46" parent="9" name="checksum"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="47" parent="9" name="name"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="48" parent="9" name="data"> | ||||
|       <Position>5</Position> | ||||
|       <DataType>BLOB|0s</DataType> | ||||
|     </column> | ||||
|     <column id="49" parent="9" name="isDeleted"> | ||||
|       <Position>6</Position> | ||||
|       <DataType>INT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>0</DefaultExpression> | ||||
|     </column> | ||||
|     <column id="50" parent="9" name="dateModified"> | ||||
|       <Position>7</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="51" parent="9" name="dateCreated"> | ||||
|       <Position>8</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <index id="52" parent="9" name="sqlite_autoindex_images_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>imageId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <key id="53" parent="9"> | ||||
|       <ColNames>imageId</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|       <UnderlyingIndexName>sqlite_autoindex_images_1</UnderlyingIndexName> | ||||
|     </key> | ||||
|     <column id="54" parent="10" name="noteImageId"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="55" parent="10" name="noteId"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="56" parent="10" name="imageId"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="57" parent="10" name="isDeleted"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>INT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>0</DefaultExpression> | ||||
|     </column> | ||||
|     <column id="58" parent="10" name="dateModified"> | ||||
|       <Position>5</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="59" parent="10" name="dateCreated"> | ||||
|       <Position>6</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <index id="60" parent="10" name="sqlite_autoindex_note_images_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>noteImageId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="61" parent="10" name="IDX_note_images_noteId_imageId"> | ||||
|       <ColNames>noteId | ||||
| imageId</ColNames> | ||||
|       <ColumnCollations> | ||||
| </ColumnCollations> | ||||
|     </index> | ||||
|     <index id="62" parent="10" name="IDX_note_images_noteId"> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="63" parent="10" name="IDX_note_images_imageId"> | ||||
|       <ColNames>imageId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="64" parent="10"> | ||||
|       <ColNames>noteImageId</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|       <UnderlyingIndexName>sqlite_autoindex_note_images_1</UnderlyingIndexName> | ||||
|     </key> | ||||
|     <column id="65" parent="11" name="noteRevisionId"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="66" parent="11" name="noteId"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="67" parent="11" name="title"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|     </column> | ||||
|     <column id="68" parent="11" name="content"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|     </column> | ||||
|     <column id="69" parent="11" name="isProtected"> | ||||
|       <Position>5</Position> | ||||
|       <DataType>INT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>0</DefaultExpression> | ||||
|     </column> | ||||
|     <column id="70" parent="11" name="dateModifiedFrom"> | ||||
|       <Position>6</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="71" parent="11" name="dateModifiedTo"> | ||||
|       <Position>7</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <index id="72" parent="11" name="sqlite_autoindex_note_revisions_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>noteRevisionId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="73" parent="11" name="IDX_note_revisions_noteId"> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="74" parent="11" name="IDX_note_revisions_dateModifiedFrom"> | ||||
|       <ColNames>dateModifiedFrom</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <index id="75" parent="11" name="IDX_note_revisions_dateModifiedTo"> | ||||
|       <ColNames>dateModifiedTo</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="76" parent="11"> | ||||
|       <ColNames>noteRevisionId</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|       <UnderlyingIndexName>sqlite_autoindex_note_revisions_1</UnderlyingIndexName> | ||||
|     </key> | ||||
|     <column id="77" parent="12" name="noteTreeId"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="78" parent="12" name="noteId"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="79" parent="12" name="parentNoteId"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="80" parent="12" name="notePosition"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>INTEGER|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="81" parent="12" name="prefix"> | ||||
|       <Position>5</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|     </column> | ||||
|     <column id="82" parent="12" name="isExpanded"> | ||||
|       <Position>6</Position> | ||||
|       <DataType>BOOLEAN|0s</DataType> | ||||
|     </column> | ||||
|     <column id="83" parent="12" name="isDeleted"> | ||||
|       <Position>7</Position> | ||||
|       <DataType>INTEGER|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>0</DefaultExpression> | ||||
|     </column> | ||||
|     <column id="84" parent="12" name="dateModified"> | ||||
|       <Position>8</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <index id="85" parent="12" name="sqlite_autoindex_note_tree_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>noteTreeId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="86" parent="12" name="IDX_note_tree_noteId_parentNoteId"> | ||||
|       <ColNames>noteId | ||||
| parentNoteId</ColNames> | ||||
|       <ColumnCollations> | ||||
| </ColumnCollations> | ||||
|     </index> | ||||
|     <index id="87" parent="12" name="IDX_note_tree_noteId"> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="88" parent="12"> | ||||
|       <ColNames>noteTreeId</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|       <UnderlyingIndexName>sqlite_autoindex_note_tree_1</UnderlyingIndexName> | ||||
|     </key> | ||||
|     <column id="89" parent="13" name="noteId"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="90" parent="13" name="title"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|     </column> | ||||
|     <column id="91" parent="13" name="content"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|     </column> | ||||
|     <column id="92" parent="13" name="isProtected"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>INT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>0</DefaultExpression> | ||||
|     </column> | ||||
|     <column id="93" parent="13" name="isDeleted"> | ||||
|       <Position>5</Position> | ||||
|       <DataType>INT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>0</DefaultExpression> | ||||
|     </column> | ||||
|     <column id="94" parent="13" name="dateCreated"> | ||||
|       <Position>6</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="95" parent="13" name="dateModified"> | ||||
|       <Position>7</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="96" parent="13" name="type"> | ||||
|       <Position>8</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>'text'</DefaultExpression> | ||||
|     </column> | ||||
|     <column id="97" parent="13" name="mime"> | ||||
|       <Position>9</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>'text/html'</DefaultExpression> | ||||
|     </column> | ||||
|     <index id="98" parent="13" name="sqlite_autoindex_notes_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="99" parent="13" name="IDX_notes_isDeleted"> | ||||
|       <ColNames>isDeleted</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="100" parent="13"> | ||||
|       <ColNames>noteId</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|       <UnderlyingIndexName>sqlite_autoindex_notes_1</UnderlyingIndexName> | ||||
|     </key> | ||||
|     <column id="101" parent="14" name="name"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="102" parent="14" name="value"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|     </column> | ||||
|     <column id="103" parent="14" name="dateModified"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>INT|0s</DataType> | ||||
|     </column> | ||||
|     <column id="104" parent="14" name="isSynced"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>INTEGER|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <DefaultExpression>0</DefaultExpression> | ||||
|     </column> | ||||
|     <index id="105" parent="14" name="sqlite_autoindex_options_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>name</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <key id="106" parent="14"> | ||||
|       <ColNames>name</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|       <UnderlyingIndexName>sqlite_autoindex_options_1</UnderlyingIndexName> | ||||
|     </key> | ||||
|     <column id="107" parent="15" name="noteTreeId"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="108" parent="15" name="notePath"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="109" parent="15" name="dateAccessed"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="110" parent="15" name="isDeleted"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>INT|0s</DataType> | ||||
|     </column> | ||||
|     <index id="111" parent="15" name="sqlite_autoindex_recent_notes_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>noteTreeId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <key id="112" parent="15"> | ||||
|       <ColNames>noteTreeId</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|       <UnderlyingIndexName>sqlite_autoindex_recent_notes_1</UnderlyingIndexName> | ||||
|     </key> | ||||
|     <column id="113" parent="16" name="sourceId"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="114" parent="16" name="dateCreated"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <index id="115" parent="16" name="sqlite_autoindex_source_ids_1"> | ||||
|       <NameSurrogate>1</NameSurrogate> | ||||
|       <ColNames>sourceId</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <key id="116" parent="16"> | ||||
|       <ColNames>sourceId</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|       <UnderlyingIndexName>sqlite_autoindex_source_ids_1</UnderlyingIndexName> | ||||
|     </key> | ||||
|     <column id="117" parent="17" name="type"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>text|0s</DataType> | ||||
|     </column> | ||||
|     <column id="118" parent="17" name="name"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>text|0s</DataType> | ||||
|     </column> | ||||
|     <column id="119" parent="17" name="tbl_name"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>text|0s</DataType> | ||||
|     </column> | ||||
|     <column id="120" parent="17" name="rootpage"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>integer|0s</DataType> | ||||
|     </column> | ||||
|     <column id="121" parent="17" name="sql"> | ||||
|       <Position>5</Position> | ||||
|       <DataType>text|0s</DataType> | ||||
|     </column> | ||||
|     <column id="122" parent="18" name="name"> | ||||
|       <Position>1</Position> | ||||
|     </column> | ||||
|     <column id="123" parent="18" name="seq"> | ||||
|       <Position>2</Position> | ||||
|     </column> | ||||
|     <column id="124" parent="19" name="id"> | ||||
|       <Position>1</Position> | ||||
|       <DataType>INTEGER|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|       <SequenceIdentity>1</SequenceIdentity> | ||||
|     </column> | ||||
|     <column id="125" parent="19" name="entityName"> | ||||
|       <Position>2</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="126" parent="19" name="entityId"> | ||||
|       <Position>3</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="127" parent="19" name="sourceId"> | ||||
|       <Position>4</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <column id="128" parent="19" name="syncDate"> | ||||
|       <Position>5</Position> | ||||
|       <DataType>TEXT|0s</DataType> | ||||
|       <NotNull>1</NotNull> | ||||
|     </column> | ||||
|     <index id="129" parent="19" name="IDX_sync_entityName_entityId"> | ||||
|       <ColNames>entityName | ||||
| entityId</ColNames> | ||||
|       <ColumnCollations> | ||||
| </ColumnCollations> | ||||
|       <Unique>1</Unique> | ||||
|     </index> | ||||
|     <index id="130" parent="19" name="IDX_sync_syncDate"> | ||||
|       <ColNames>syncDate</ColNames> | ||||
|       <ColumnCollations></ColumnCollations> | ||||
|     </index> | ||||
|     <key id="131" parent="19"> | ||||
|       <ColNames>id</ColNames> | ||||
|       <Primary>1</Primary> | ||||
|     </key> | ||||
|   </database-model> | ||||
| </dataSource> | ||||
							
								
								
									
										2
									
								
								.idea/dataSources/a2c75661-f9e2-478f-a69f-6a9409e69997/storage_v2/_src_/schema/main.uQUzAA.meta
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.idea/dataSources/a2c75661-f9e2-478f-a69f-6a9409e69997/storage_v2/_src_/schema/main.uQUzAA.meta
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| #n:main | ||||
| !<md> [0, 0, null, null, -2147483648, -2147483648] | ||||
							
								
								
									
										9
									
								
								.idea/jsLinters/jslint.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.idea/jsLinters/jslint.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="JSLintConfiguration"> | ||||
|     <option devel="true" /> | ||||
|     <option es6="true" /> | ||||
|     <option maxerr="50" /> | ||||
|     <option node="true" /> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										3
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,5 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="JavaScriptSettings"> | ||||
|     <option name="languageLevel" value="ES6" /> | ||||
|   </component> | ||||
|   <component name="ProjectRootManager"> | ||||
|     <output url="file://$PROJECT_DIR$/out" /> | ||||
|   </component> | ||||
|   | ||||
| @@ -1,6 +1,118 @@ | ||||
| "use strict"; | ||||
|  | ||||
| class TreeCache { | ||||
|     constructor(noteRows, noteTreeRows) { | ||||
|         this.parents = []; | ||||
|         this.children = []; | ||||
|         this.childParentToNoteTree = {}; | ||||
|  | ||||
|         this.notes = {}; | ||||
|         for (const noteRow of noteRows) { | ||||
|             const note = new NoteShort(this, noteRow); | ||||
|  | ||||
|             this.notes[note.noteId] = note; | ||||
|         } | ||||
|  | ||||
|         this.noteTree = {}; | ||||
|         for (const noteTreeRow of noteTreeRows) { | ||||
|             const nt = new NoteTree(this, noteTreeRow); | ||||
|  | ||||
|             this.noteTree[nt.noteTreeId] = nt; | ||||
|             this.addNoteTree(nt); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     getNote(noteId) { | ||||
|         return this.notes[noteId]; | ||||
|     } | ||||
|  | ||||
|     addNoteTree(nt) { | ||||
|         this.parents[nt.noteId] = this.parents[nt.noteId] || []; | ||||
|         this.parents[nt.noteId].push(this.notes[nt.parentNoteId]); | ||||
|  | ||||
|         this.children[nt.parentNoteId] = this.children[nt.parentNoteId] || []; | ||||
|         this.children[nt.parentNoteId].push(this.notes[nt.noteId]); | ||||
|  | ||||
|         this.childParentToNoteTree[nt.noteId + '-' + nt.parentNoteId] = nt; | ||||
|     } | ||||
|  | ||||
|     add(note, nt) { | ||||
|         this.notes[note.noteId] = note; | ||||
|     } | ||||
|  | ||||
|     async getNoteTree(childNoteId, parentNoteId) { | ||||
|         return this.childParentToNoteTree[childNoteId + '-' + parentNoteId]; | ||||
|     } | ||||
| } | ||||
|  | ||||
| class NoteShort { | ||||
|     constructor(treeCache, row) { | ||||
|         this.treeCache = treeCache; | ||||
|         this.noteId = row.noteId; | ||||
|         this.title = row.title; | ||||
|         this.isProtected = row.isProtected; | ||||
|         this.type = row.type; | ||||
|         this.mime = row.mime; | ||||
|         this.hideInAutocomplete = row.hideInAutocomplete; | ||||
|     } | ||||
|  | ||||
|     async getNoteTrees() { | ||||
|         const noteTrees = []; | ||||
|  | ||||
|         for (const parent of this.treeCache.parents[this.noteId]) { | ||||
|             noteTrees.push(await this.treeCache.getNoteTree(this.noteId, p.noteId)); | ||||
|         } | ||||
|  | ||||
|         return noteTrees; | ||||
|     } | ||||
|  | ||||
|     async getChildNoteTrees() { | ||||
|         const noteTrees = []; | ||||
|  | ||||
|         for (const child of this.treeCache.children[this.noteId]) { | ||||
|             noteTrees.push(await this.treeCache.getNoteTree(child.noteId, this.noteId)); | ||||
|         } | ||||
|  | ||||
|         return noteTrees; | ||||
|     } | ||||
|  | ||||
|     async getParentNotes() { | ||||
|         return this.treeCache.parents[this.noteId] || []; | ||||
|     } | ||||
|  | ||||
|     async getChildNotes() { | ||||
|         return this.treeCache.children[this.noteId] || []; | ||||
|     } | ||||
|  | ||||
|     get toString() { | ||||
|         return `Note(noteId=${this.noteId}, title=${this.title})`; | ||||
|     } | ||||
| } | ||||
|  | ||||
| class NoteTree { | ||||
|     constructor(treeCache, row) { | ||||
|         this.treeCache = treeCache; | ||||
|         this.noteTreeId = row.noteTreeId; | ||||
|         this.noteId = row.noteId; | ||||
|         this.note = null; | ||||
|         this.parentNoteId = row.parentNoteId; | ||||
|         this.notePosition = row.notePosition; | ||||
|         this.prefix = row.prefix; | ||||
|         this.isExpanded = row.isExpanded; | ||||
|     } | ||||
|  | ||||
|     async getNote() { | ||||
|         return this.treeCache.getNote(this.noteId); | ||||
|     } | ||||
|  | ||||
|     get toString() { | ||||
|         return `NoteTree(noteTreeId=${this.noteTreeId})`; | ||||
|     } | ||||
| } | ||||
|  | ||||
| const noteTree = (function() { | ||||
|     let treeCache; | ||||
|  | ||||
|     const $tree = $("#tree"); | ||||
|     const $parentList = $("#parent-list"); | ||||
|     const $parentListList = $("#parent-list-inner"); | ||||
| @@ -11,18 +123,14 @@ const noteTree = (function() { | ||||
|     let instanceName = null; // should have better place | ||||
|  | ||||
|     let startNotePath = null; | ||||
|     let notesTreeMap = {}; | ||||
|  | ||||
|     let parentToChildren = {}; | ||||
|     let childToParents = {}; | ||||
|  | ||||
|     let parentChildToNoteTreeId = {}; | ||||
|     let noteIdToNote = {}; | ||||
|  | ||||
|     let hiddenInAutocomplete = {}; | ||||
|     /** @type {Object.<string, NoteShort>} */ | ||||
|     let noteMap = {}; | ||||
|     /** @type {Object.<string, NoteTree>} */ | ||||
|     let noteTreeMap = {}; | ||||
|  | ||||
|     function getNote(noteId) { | ||||
|         const note = noteIdToNote[noteId]; | ||||
|         const note = noteMap[noteId]; | ||||
|  | ||||
|         if (!note) { | ||||
|             throwError("Can't find title for noteId='" + noteId + "'"); | ||||
| @@ -34,6 +142,8 @@ const noteTree = (function() { | ||||
|     function getNoteTreeId(parentNoteId, childNoteId) { | ||||
|         assertArguments(parentNoteId, childNoteId); | ||||
|  | ||||
|  | ||||
|  | ||||
|         const key = parentNoteId + "-" + childNoteId; | ||||
|  | ||||
|         // this can return undefined and client code should deal with it somehow | ||||
| @@ -44,13 +154,13 @@ const noteTree = (function() { | ||||
|     function getNoteTitle(noteId, parentNoteId = null) { | ||||
|         assertArguments(noteId); | ||||
|  | ||||
|         let title = getNote(noteId).title; | ||||
|         let title = treeCache.getNote(noteId).title; | ||||
|  | ||||
|         if (parentNoteId !== null) { | ||||
|             const noteTreeId = getNoteTreeId(parentNoteId, noteId); | ||||
|  | ||||
|             if (noteTreeId) { | ||||
|                 const noteTree = notesTreeMap[noteTreeId]; | ||||
|                 const noteTree = noteTreeMap[noteTreeId]; | ||||
|  | ||||
|                 if (noteTree.prefix) { | ||||
|                     title = noteTree.prefix + ' - ' + title; | ||||
| @@ -75,7 +185,7 @@ const noteTree = (function() { | ||||
|     function getNodesByNoteTreeId(noteTreeId) { | ||||
|         assertArguments(noteTreeId); | ||||
|  | ||||
|         const noteTree = notesTreeMap[noteTreeId]; | ||||
|         const noteTree = noteTreeMap[noteTreeId]; | ||||
|  | ||||
|         return getNodesByNoteId(noteTree.noteId).filter(node => node.data.noteTreeId === noteTreeId); | ||||
|     } | ||||
| @@ -90,14 +200,14 @@ const noteTree = (function() { | ||||
|     function setPrefix(noteTreeId, prefix) { | ||||
|         assertArguments(noteTreeId); | ||||
|  | ||||
|         notesTreeMap[noteTreeId].prefix = prefix; | ||||
|         noteTreeMap[noteTreeId].prefix = prefix; | ||||
|  | ||||
|         getNodesByNoteTreeId(noteTreeId).map(node => setNodeTitleWithPrefix(node)); | ||||
|     } | ||||
|  | ||||
|     function setNodeTitleWithPrefix(node) { | ||||
|         const noteTitle = getNoteTitle(node.data.noteId); | ||||
|         const noteTree = notesTreeMap[node.data.noteTreeId]; | ||||
|         const noteTree = noteTreeMap[node.data.noteTreeId]; | ||||
|  | ||||
|         const prefix = noteTree.prefix; | ||||
|  | ||||
| @@ -109,61 +219,38 @@ const noteTree = (function() { | ||||
|     function removeParentChildRelation(parentNoteId, childNoteId) { | ||||
|         assertArguments(parentNoteId, childNoteId); | ||||
|  | ||||
|         const key = parentNoteId + "-" + childNoteId; | ||||
|         const parentNote = noteMap[parentNoteId]; | ||||
|         const childNote = noteMap[childNoteId]; | ||||
|  | ||||
|         delete parentChildToNoteTreeId[key]; | ||||
|  | ||||
|         parentToChildren[parentNoteId] = parentToChildren[parentNoteId].filter(noteId => noteId !== childNoteId); | ||||
|         childToParents[childNoteId] = childToParents[childNoteId].filter(noteId => noteId !== parentNoteId); | ||||
|         parentNote.children = parentNote.children.filter(note => note.noteId !== childNoteId); | ||||
|         childNote.parents = childNote.parents.filter(note => note.noteId !== parentNoteId); | ||||
|         childNote.noteTree = childNote.noteTree.filter(nt => nt.parentNoteId !== parentNoteId); | ||||
|     } | ||||
|  | ||||
|     function setParentChildRelation(noteTreeId, parentNoteId, childNoteId) { | ||||
|         assertArguments(noteTreeId, parentNoteId, childNoteId); | ||||
|  | ||||
|         const key = parentNoteId + "-" + childNoteId; | ||||
|         const parentNote = noteMap[parentNoteId]; | ||||
|         const childNote = noteMap[childNoteId]; | ||||
|  | ||||
|         parentChildToNoteTreeId[key] = noteTreeId; | ||||
|         // FIXME: assert | ||||
|  | ||||
|         if (!parentToChildren[parentNoteId]) { | ||||
|             parentToChildren[parentNoteId] = []; | ||||
|         } | ||||
|         childNote.parents.push(parentNote); | ||||
|         parentNote.children.push(childNote); | ||||
|  | ||||
|         parentToChildren[parentNoteId].push(childNoteId); | ||||
|  | ||||
|         if (!childToParents[childNoteId]) { | ||||
|             childToParents[childNoteId] = []; | ||||
|         } | ||||
|  | ||||
|         childToParents[childNoteId].push(parentNoteId); | ||||
|         const noteTree = noteTreeMap[noteTreeId]; | ||||
|         childNote.noteTree.push(noteTree); | ||||
|     } | ||||
|  | ||||
|     function prepareNoteTree(notes) { | ||||
|         assertArguments(notes); | ||||
|     async function prepareNoteTree(noteRows, noteTreeRows) { | ||||
|         assertArguments(noteRows); | ||||
|  | ||||
|         parentToChildren = {}; | ||||
|         childToParents = {}; | ||||
|         notesTreeMap = {}; | ||||
|         treeCache = new TreeCache(noteRows, noteTreeRows); | ||||
|  | ||||
|         for (const note of notes) { | ||||
|             notesTreeMap[note.noteTreeId] = note; | ||||
|  | ||||
|             noteIdToNote[note.noteId] = { | ||||
|                 noteId: note.noteId, | ||||
|                 title: note.title, | ||||
|                 isProtected: note.isProtected, | ||||
|                 type: note.type, | ||||
|                 mime: note.mime | ||||
|             }; | ||||
|  | ||||
|             delete note.title; // this should not be used. Use noteIdToNote instead | ||||
|  | ||||
|             setParentChildRelation(note.noteTreeId, note.parentNoteId, note.noteId); | ||||
|         } | ||||
|  | ||||
|         return prepareNoteTreeInner('root'); | ||||
|         return await prepareNoteTreeInner(treeCache.getNote('root')); | ||||
|     } | ||||
|  | ||||
|     function getExtraClasses(note) { | ||||
|     async function getExtraClasses(note) { | ||||
|         assertArguments(note); | ||||
|  | ||||
|         const extraClasses = []; | ||||
| @@ -172,7 +259,7 @@ const noteTree = (function() { | ||||
|             extraClasses.push("protected"); | ||||
|         } | ||||
|  | ||||
|         if (childToParents[note.noteId].length > 1) { | ||||
|         if ((await note.getParentNotes()).length > 1) { | ||||
|             extraClasses.push("multiple-parents"); | ||||
|         } | ||||
|  | ||||
| @@ -181,42 +268,40 @@ const noteTree = (function() { | ||||
|         return extraClasses.join(" "); | ||||
|     } | ||||
|  | ||||
|     function prepareNoteTreeInner(parentNoteId) { | ||||
|         assertArguments(parentNoteId); | ||||
|     async function prepareNoteTreeInner(parentNote) { | ||||
|         assertArguments(parentNote); | ||||
|  | ||||
|         const childNoteIds = parentToChildren[parentNoteId]; | ||||
|         if (!childNoteIds) { | ||||
|             messaging.logError("No children for " + parentNoteId + ". This shouldn't happen."); | ||||
|         const childrenNoteTrees = await parentNote.getChildNoteTrees(); | ||||
|  | ||||
|         if (!childrenNoteTrees) { | ||||
|             messaging.logError(`No children for ${parentNote}. This shouldn't happen.`); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         const noteList = []; | ||||
|  | ||||
|         for (const noteId of childNoteIds) { | ||||
|             const note = getNote(noteId); | ||||
|             const noteTreeId = getNoteTreeId(parentNoteId, noteId); | ||||
|             const noteTree = notesTreeMap[noteTreeId]; | ||||
|  | ||||
|         for (const noteTree of childrenNoteTrees) { | ||||
|             const note = await noteTree.getNote(); | ||||
|             const title = (noteTree.prefix ? (noteTree.prefix + " - ") : "") + note.title; | ||||
|  | ||||
|             const node = { | ||||
|                 noteId: noteId, | ||||
|                 noteId: note.noteId, | ||||
|                 parentNoteId: noteTree.parentNoteId, | ||||
|                 noteTreeId: noteTree.noteTreeId, | ||||
|                 isProtected: note.isProtected, | ||||
|                 title: escapeHtml(title), | ||||
|                 extraClasses: getExtraClasses(note), | ||||
|                 refKey: noteId, | ||||
|                 refKey: note.noteId, | ||||
|                 expanded: note.type !== 'search' && noteTree.isExpanded | ||||
|             }; | ||||
|  | ||||
|             const hasChildren = parentToChildren[noteId] && parentToChildren[noteId].length > 0; | ||||
|             const hasChildren = (await note.getChildNotes()).length > 0; | ||||
|  | ||||
|             if (hasChildren || note.type === 'search') { | ||||
|                 node.folder = true; | ||||
|  | ||||
|                 if (node.expanded && note.type !== 'search') { | ||||
|                     node.children = prepareNoteTreeInner(noteId); | ||||
|                     node.children = await prepareNoteTreeInner(note); | ||||
|                 } | ||||
|                 else { | ||||
|                     node.lazy = true; | ||||
| @@ -609,7 +694,7 @@ const noteTree = (function() { | ||||
|             init: (event, data) => { | ||||
|                 const noteId = treeUtils.getNoteIdFromNotePath(startNotePath); | ||||
|  | ||||
|                 if (noteIdToNote[noteId] === undefined) { | ||||
|                 if (noteMap[noteId] === undefined) { | ||||
|                     // note doesn't exist so don't try to activate it | ||||
|                     startNotePath = null; | ||||
|                 } | ||||
| @@ -638,7 +723,7 @@ const noteTree = (function() { | ||||
|                 mode: "hide"       // Grayout unmatched nodes (pass "hide" to remove unmatched node instead) | ||||
|             }, | ||||
|             dnd: dragAndDropSetup, | ||||
|             lazyLoad: function(event, data){ | ||||
|             lazyLoad: async function(event, data){ | ||||
|                 const noteId = data.node.data.noteId; | ||||
|                 const note = getNote(noteId); | ||||
|  | ||||
| @@ -646,7 +731,7 @@ const noteTree = (function() { | ||||
|                     data.result = loadSearchNote(noteId); | ||||
|                 } | ||||
|                 else { | ||||
|                     data.result = prepareNoteTreeInner(noteId); | ||||
|                     data.result = await prepareNoteTreeInner(note); | ||||
|                 } | ||||
|             }, | ||||
|             clones: { | ||||
| @@ -667,7 +752,7 @@ const noteTree = (function() { | ||||
|         for (const noteId of noteIds) { | ||||
|             const noteTreeId = "virt" + randomString(10); | ||||
|  | ||||
|             notesTreeMap[noteTreeId] = { | ||||
|             noteTreeMap[noteTreeId] = { | ||||
|                 noteTreeId: noteTreeId, | ||||
|                 noteId: noteId, | ||||
|                 parentNoteId: searchNoteId, | ||||
| @@ -678,7 +763,7 @@ const noteTree = (function() { | ||||
|             setParentChildRelation(noteTreeId, searchNoteId, noteId); | ||||
|         } | ||||
|  | ||||
|         return prepareNoteTreeInner(searchNoteId); | ||||
|         return await prepareNoteTreeInner(searchNoteId); | ||||
|     } | ||||
|  | ||||
|     function getTree() { | ||||
| @@ -705,13 +790,7 @@ const noteTree = (function() { | ||||
|             startNotePath = getNotePathFromAddress(); | ||||
|         } | ||||
|  | ||||
|         hiddenInAutocomplete = {}; | ||||
|  | ||||
|         for (const noteId of resp.hiddenInAutocomplete) { | ||||
|             hiddenInAutocomplete[noteId] = true; | ||||
|         } | ||||
|  | ||||
|         return prepareNoteTree(resp.notes); | ||||
|         return await prepareNoteTree(resp.notes, resp.noteTree); | ||||
|     } | ||||
|  | ||||
|     $(() => loadTree().then(noteTree => initFancyTree(noteTree))); | ||||
| @@ -827,9 +906,9 @@ const noteTree = (function() { | ||||
|  | ||||
|         setParentChildRelation(result.noteTreeId, parentNoteId, result.noteId); | ||||
|  | ||||
|         notesTreeMap[result.noteTreeId] = result; | ||||
|         noteTreeMap[result.noteTreeId] = result; | ||||
|  | ||||
|         noteIdToNote[result.noteId] = { | ||||
|         noteMap[result.noteId] = { | ||||
|             noteId: result.noteId, | ||||
|             title: result.title, | ||||
|             isProtected: result.isProtected, | ||||
| @@ -889,11 +968,7 @@ const noteTree = (function() { | ||||
|     } | ||||
|  | ||||
|     function getNoteTree(noteTreeId) { | ||||
|         return notesTreeMap[noteTreeId]; | ||||
|     } | ||||
|  | ||||
|     function getNote(noteId) { | ||||
|         return noteIdToNote[noteId]; | ||||
|         return noteTreeMap[noteTreeId]; | ||||
|     } | ||||
|  | ||||
|     $(document).bind('keydown', 'ctrl+o', e => { | ||||
|   | ||||
| @@ -12,39 +12,56 @@ const sync_table = require('../../services/sync_table'); | ||||
| const wrap = require('express-promise-wrap').wrap; | ||||
|  | ||||
| router.get('/', auth.checkApiAuth, wrap(async (req, res, next) => { | ||||
|     const notes = await sql.getRows(` | ||||
|     const noteTree = await sql.getRows(` | ||||
|       SELECT  | ||||
|         note_tree.*,  | ||||
|         notes.title,  | ||||
|         notes.isProtected, | ||||
|         notes.type | ||||
|       FROM  | ||||
|         noteTreeId, | ||||
|         noteId, | ||||
|         parentNoteId, | ||||
|         notePosition, | ||||
|         prefix, | ||||
|         isExpanded | ||||
|       FROM | ||||
|         note_tree  | ||||
|       JOIN  | ||||
|         notes ON notes.noteId = note_tree.noteId | ||||
|       WHERE  | ||||
|         notes.isDeleted = 0  | ||||
|         AND note_tree.isDeleted = 0 | ||||
|         isDeleted = 0 | ||||
|       ORDER BY  | ||||
|         notePosition`); | ||||
|  | ||||
|     let notes = [{ | ||||
|         noteId: 'root', | ||||
|         title: 'root', | ||||
|         isProtected: false, | ||||
|         type: 'none', | ||||
|         mime: 'none' | ||||
|     }]; | ||||
|  | ||||
|     notes = notes.concat(await sql.getRows(` | ||||
|       SELECT  | ||||
|         notes.noteId, | ||||
|         notes.title, | ||||
|         notes.isProtected, | ||||
|         notes.type, | ||||
|         notes.mime, | ||||
|         hideInAutocomplete.attributeId AS 'hideInAutocomplete' | ||||
|       FROM | ||||
|         notes | ||||
|         LEFT JOIN attributes AS hideInAutocomplete ON hideInAutocomplete.noteId = notes.noteId | ||||
|                              AND hideInAutocomplete.name = 'hide_in_autocomplete' | ||||
|                              AND hideInAutocomplete.isDeleted = 0 | ||||
|       WHERE  | ||||
|         notes.isDeleted = 0`)); | ||||
|  | ||||
|     protected_session.decryptNotes(req, notes); | ||||
|  | ||||
|     const hiddenInAutocomplete = await sql.getColumn(` | ||||
|       SELECT  | ||||
|         DISTINCT noteId  | ||||
|       FROM  | ||||
|         attributes | ||||
|         JOIN notes USING(noteId) | ||||
|       WHERE | ||||
|         attributes.name = 'hide_in_autocomplete'  | ||||
|         AND attributes.isDeleted = 0 | ||||
|         AND notes.isDeleted = 0`); | ||||
|     notes.forEach(note => { | ||||
|         note.hideInAutocomplete = !!note.hideInAutocomplete; | ||||
|         note.isProtected = !!note.isProtected; | ||||
|     }); | ||||
|  | ||||
|     res.send({ | ||||
|         instanceName: config.General ? config.General.instanceName : null, | ||||
|         noteTree: noteTree, | ||||
|         notes: notes, | ||||
|         hiddenInAutocomplete: hiddenInAutocomplete, | ||||
|         start_note_path: await options.getOption('start_note_path') | ||||
|     }); | ||||
| })); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user