refactored layouts for extra window

This commit is contained in:
zadam 2020-04-25 23:52:13 +02:00
parent 87a1e98fa2
commit 75c58cbf79
16 changed files with 193 additions and 318 deletions

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<dataSource name="document.db"> <dataSource name="document.db">
<database-model serializer="dbm" dbms="SQLITE" family-id="SQLITE" format-version="4.17"> <database-model serializer="dbm" dbms="SQLITE" family-id="SQLITE" format-version="4.18">
<root id="1"> <root id="1">
<ServerVersion>3.25.1</ServerVersion> <ServerVersion>3.16.1</ServerVersion>
</root> </root>
<schema id="2" parent="1" name="main"> <schema id="2" parent="1" name="main">
<Current>1</Current> <Current>1</Current>
@ -57,6 +57,7 @@
<index id="24" parent="6" name="sqlite_autoindex_api_tokens_1"> <index id="24" parent="6" name="sqlite_autoindex_api_tokens_1">
<NameSurrogate>1</NameSurrogate> <NameSurrogate>1</NameSurrogate>
<ColNames>apiTokenId</ColNames> <ColNames>apiTokenId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<key id="25" parent="6"> <key id="25" parent="6">
@ -130,17 +131,21 @@
<index id="38" parent="7" name="sqlite_autoindex_attributes_1"> <index id="38" parent="7" name="sqlite_autoindex_attributes_1">
<NameSurrogate>1</NameSurrogate> <NameSurrogate>1</NameSurrogate>
<ColNames>attributeId</ColNames> <ColNames>attributeId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<index id="39" parent="7" name="IDX_attributes_noteId_index"> <index id="39" parent="7" name="IDX_attributes_noteId_index">
<ColNames>noteId</ColNames> <ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="40" parent="7" name="IDX_attributes_name_value"> <index id="40" parent="7" name="IDX_attributes_name_value">
<ColNames>name <ColNames>name
value</ColNames> value</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="41" parent="7" name="IDX_attributes_value_index"> <index id="41" parent="7" name="IDX_attributes_value_index">
<ColNames>value</ColNames> <ColNames>value</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<key id="42" parent="7"> <key id="42" parent="7">
<ColNames>attributeId</ColNames> <ColNames>attributeId</ColNames>
@ -207,14 +212,17 @@ value</ColNames>
<index id="54" parent="8" name="sqlite_autoindex_branches_1"> <index id="54" parent="8" name="sqlite_autoindex_branches_1">
<NameSurrogate>1</NameSurrogate> <NameSurrogate>1</NameSurrogate>
<ColNames>branchId</ColNames> <ColNames>branchId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<index id="55" parent="8" name="IDX_branches_noteId_parentNoteId"> <index id="55" parent="8" name="IDX_branches_noteId_parentNoteId">
<ColNames>noteId <ColNames>noteId
parentNoteId</ColNames> parentNoteId</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="56" parent="8" name="IDX_branches_parentNoteId"> <index id="56" parent="8" name="IDX_branches_parentNoteId">
<ColNames>parentNoteId</ColNames> <ColNames>parentNoteId</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<key id="57" parent="8"> <key id="57" parent="8">
<ColNames>branchId</ColNames> <ColNames>branchId</ColNames>
@ -245,6 +253,7 @@ parentNoteId</ColNames>
<index id="62" parent="9" name="sqlite_autoindex_note_contents_1"> <index id="62" parent="9" name="sqlite_autoindex_note_contents_1">
<NameSurrogate>1</NameSurrogate> <NameSurrogate>1</NameSurrogate>
<ColNames>noteId</ColNames> <ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<key id="63" parent="9"> <key id="63" parent="9">
@ -275,6 +284,7 @@ parentNoteId</ColNames>
<index id="68" parent="10" name="sqlite_autoindex_note_revision_contents_1"> <index id="68" parent="10" name="sqlite_autoindex_note_revision_contents_1">
<NameSurrogate>1</NameSurrogate> <NameSurrogate>1</NameSurrogate>
<ColNames>noteRevisionId</ColNames> <ColNames>noteRevisionId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<key id="69" parent="10"> <key id="69" parent="10">
@ -359,22 +369,28 @@ parentNoteId</ColNames>
<index id="84" parent="11" name="sqlite_autoindex_note_revisions_1"> <index id="84" parent="11" name="sqlite_autoindex_note_revisions_1">
<NameSurrogate>1</NameSurrogate> <NameSurrogate>1</NameSurrogate>
<ColNames>noteRevisionId</ColNames> <ColNames>noteRevisionId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<index id="85" parent="11" name="IDX_note_revisions_noteId"> <index id="85" parent="11" name="IDX_note_revisions_noteId">
<ColNames>noteId</ColNames> <ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="86" parent="11" name="IDX_note_revisions_utcDateLastEdited"> <index id="86" parent="11" name="IDX_note_revisions_utcDateLastEdited">
<ColNames>utcDateLastEdited</ColNames> <ColNames>utcDateLastEdited</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="87" parent="11" name="IDX_note_revisions_utcDateCreated"> <index id="87" parent="11" name="IDX_note_revisions_utcDateCreated">
<ColNames>utcDateCreated</ColNames> <ColNames>utcDateCreated</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="88" parent="11" name="IDX_note_revisions_dateLastEdited"> <index id="88" parent="11" name="IDX_note_revisions_dateLastEdited">
<ColNames>dateLastEdited</ColNames> <ColNames>dateLastEdited</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="89" parent="11" name="IDX_note_revisions_dateCreated"> <index id="89" parent="11" name="IDX_note_revisions_dateCreated">
<ColNames>dateCreated</ColNames> <ColNames>dateCreated</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<key id="90" parent="11"> <key id="90" parent="11">
<ColNames>noteRevisionId</ColNames> <ColNames>noteRevisionId</ColNames>
@ -461,28 +477,36 @@ parentNoteId</ColNames>
<index id="105" parent="12" name="sqlite_autoindex_notes_1"> <index id="105" parent="12" name="sqlite_autoindex_notes_1">
<NameSurrogate>1</NameSurrogate> <NameSurrogate>1</NameSurrogate>
<ColNames>noteId</ColNames> <ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<index id="106" parent="12" name="IDX_notes_title"> <index id="106" parent="12" name="IDX_notes_title">
<ColNames>title</ColNames> <ColNames>title</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="107" parent="12" name="IDX_notes_type"> <index id="107" parent="12" name="IDX_notes_type">
<ColNames>type</ColNames> <ColNames>type</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="108" parent="12" name="IDX_notes_isDeleted"> <index id="108" parent="12" name="IDX_notes_isDeleted">
<ColNames>isDeleted</ColNames> <ColNames>isDeleted</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="109" parent="12" name="IDX_notes_dateCreated"> <index id="109" parent="12" name="IDX_notes_dateCreated">
<ColNames>dateCreated</ColNames> <ColNames>dateCreated</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="110" parent="12" name="IDX_notes_dateModified"> <index id="110" parent="12" name="IDX_notes_dateModified">
<ColNames>dateModified</ColNames> <ColNames>dateModified</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="111" parent="12" name="IDX_notes_utcDateCreated"> <index id="111" parent="12" name="IDX_notes_utcDateCreated">
<ColNames>utcDateCreated</ColNames> <ColNames>utcDateCreated</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<index id="112" parent="12" name="IDX_notes_utcDateModified"> <index id="112" parent="12" name="IDX_notes_utcDateModified">
<ColNames>utcDateModified</ColNames> <ColNames>utcDateModified</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<key id="113" parent="12"> <key id="113" parent="12">
<ColNames>noteId</ColNames> <ColNames>noteId</ColNames>
@ -523,6 +547,7 @@ parentNoteId</ColNames>
<index id="120" parent="13" name="sqlite_autoindex_options_1"> <index id="120" parent="13" name="sqlite_autoindex_options_1">
<NameSurrogate>1</NameSurrogate> <NameSurrogate>1</NameSurrogate>
<ColNames>name</ColNames> <ColNames>name</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<key id="121" parent="13"> <key id="121" parent="13">
@ -558,6 +583,7 @@ parentNoteId</ColNames>
<index id="127" parent="14" name="sqlite_autoindex_recent_notes_1"> <index id="127" parent="14" name="sqlite_autoindex_recent_notes_1">
<NameSurrogate>1</NameSurrogate> <NameSurrogate>1</NameSurrogate>
<ColNames>noteId</ColNames> <ColNames>noteId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<key id="128" parent="14"> <key id="128" parent="14">
@ -578,10 +604,12 @@ parentNoteId</ColNames>
<index id="131" parent="15" name="sqlite_autoindex_source_ids_1"> <index id="131" parent="15" name="sqlite_autoindex_source_ids_1">
<NameSurrogate>1</NameSurrogate> <NameSurrogate>1</NameSurrogate>
<ColNames>sourceId</ColNames> <ColNames>sourceId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<index id="132" parent="15" name="IDX_source_ids_utcDateCreated"> <index id="132" parent="15" name="IDX_source_ids_utcDateCreated">
<ColNames>utcDateCreated</ColNames> <ColNames>utcDateCreated</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<key id="133" parent="15"> <key id="133" parent="15">
<ColNames>sourceId</ColNames> <ColNames>sourceId</ColNames>
@ -602,7 +630,7 @@ parentNoteId</ColNames>
</column> </column>
<column id="137" parent="16" name="rootpage"> <column id="137" parent="16" name="rootpage">
<Position>4</Position> <Position>4</Position>
<DataType>int|0s</DataType> <DataType>integer|0s</DataType>
</column> </column>
<column id="138" parent="16" name="sql"> <column id="138" parent="16" name="sql">
<Position>5</Position> <Position>5</Position>
@ -649,10 +677,12 @@ parentNoteId</ColNames>
<index id="147" parent="18" name="IDX_sync_entityName_entityId"> <index id="147" parent="18" name="IDX_sync_entityName_entityId">
<ColNames>entityName <ColNames>entityName
entityId</ColNames> entityId</ColNames>
<ColumnCollations></ColumnCollations>
<Unique>1</Unique> <Unique>1</Unique>
</index> </index>
<index id="148" parent="18" name="IDX_sync_utcSyncDate"> <index id="148" parent="18" name="IDX_sync_utcSyncDate">
<ColNames>utcSyncDate</ColNames> <ColNames>utcSyncDate</ColNames>
<ColumnCollations></ColumnCollations>
</index> </index>
<key id="149" parent="18"> <key id="149" parent="18">
<ColNames>id</ColNames> <ColNames>id</ColNames>

86
package-lock.json generated
View File

@ -3327,9 +3327,12 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
}, },
"ejs": { "ejs": {
"version": "3.0.2", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.0.2.tgz", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.2.tgz",
"integrity": "sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA==" "integrity": "sha512-zFuywxrAWtX5Mk2KAuoJNkXXbfezpNA0v7i+YC971QORguPekpjpAgeOv99YWSdKXwj7JxI2QAWDeDkE8fWtXw==",
"requires": {
"jake": "^10.6.1"
}
}, },
"electron": { "electron": {
"version": "9.0.0-beta.18", "version": "9.0.0-beta.18",
@ -4445,6 +4448,14 @@
"typedarray-to-buffer": "^3.1.5" "typedarray-to-buffer": "^3.1.5"
} }
}, },
"filelist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz",
"integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==",
"requires": {
"minimatch": "^3.0.4"
}
},
"filename-regex": { "filename-regex": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
@ -6146,6 +6157,55 @@
"is-object": "^1.0.1" "is-object": "^1.0.1"
} }
}, },
"jake": {
"version": "10.6.1",
"resolved": "https://registry.npmjs.org/jake/-/jake-10.6.1.tgz",
"integrity": "sha512-pHUK3+V0BjOb1XSi95rbBksrMdIqLVC9bJqDnshVyleYsET3H0XAq+3VB2E3notcYvv4wRdRHn13p7vobG+wfQ==",
"requires": {
"async": "0.9.x",
"chalk": "^2.4.2",
"filelist": "^1.0.1",
"minimatch": "^3.0.4"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": {
"color-convert": "^1.9.0"
}
},
"async": {
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
"integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"jest-worker": { "jest-worker": {
"version": "25.4.0", "version": "25.4.0",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.4.0.tgz", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.4.0.tgz",
@ -7017,17 +7077,17 @@
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
}, },
"mime-types": { "mime-types": {
"version": "2.1.26", "version": "2.1.27",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
"integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
"requires": { "requires": {
"mime-db": "1.43.0" "mime-db": "1.44.0"
}, },
"dependencies": { "dependencies": {
"mime-db": { "mime-db": {
"version": "1.43.0", "version": "1.44.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
"integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
} }
} }
}, },
@ -11850,9 +11910,9 @@
} }
}, },
"ws": { "ws": {
"version": "7.2.3", "version": "7.2.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz",
"integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA=="
}, },
"x-xss-protection": { "x-xss-protection": {
"version": "1.3.0", "version": "1.3.0",

View File

@ -30,7 +30,7 @@
"csurf": "1.11.0", "csurf": "1.11.0",
"dayjs": "1.8.25", "dayjs": "1.8.25",
"debug": "4.1.1", "debug": "4.1.1",
"ejs": "3.0.2", "ejs": "3.1.2",
"electron-debug": "3.0.1", "electron-debug": "3.0.1",
"electron-dl": "3.0.0", "electron-dl": "3.0.0",
"electron-find": "1.0.6", "electron-find": "1.0.6",
@ -52,7 +52,7 @@
"ini": "1.3.5", "ini": "1.3.5",
"is-svg": "4.2.1", "is-svg": "4.2.1",
"jimp": "0.10.3", "jimp": "0.10.3",
"mime-types": "2.1.26", "mime-types": "2.1.27",
"multer": "1.4.2", "multer": "1.4.2",
"node-abi": "2.16.0", "node-abi": "2.16.0",
"open": "7.0.3", "open": "7.0.3",
@ -73,7 +73,7 @@
"turndown": "6.0.0", "turndown": "6.0.0",
"turndown-plugin-gfm": "1.0.2", "turndown-plugin-gfm": "1.0.2",
"unescape": "1.0.1", "unescape": "1.0.1",
"ws": "7.2.3", "ws": "7.2.5",
"yauzl": "^2.10.0", "yauzl": "^2.10.0",
"yazl": "^2.5.1" "yazl": "^2.5.1"
}, },

View File

@ -5,8 +5,9 @@ import bundleService from "./services/bundle.js";
import noteAutocompleteService from './services/note_autocomplete.js'; import noteAutocompleteService from './services/note_autocomplete.js';
import macInit from './services/mac_init.js'; import macInit from './services/mac_init.js';
import contextMenu from "./services/context_menu.js"; import contextMenu from "./services/context_menu.js";
import DesktopLayout from "./widgets/desktop_layout.js"; import DesktopMainWindowLayout from "./layouts/desktop_main_window_layout.js";
import glob from "./services/glob.js"; import glob from "./services/glob.js";
import DesktopExtraWindowLayout from "./layouts/desktop_extra_window_layout.js";
glob.setupGlobs(); glob.setupGlobs();
@ -23,9 +24,11 @@ $('[data-toggle="tooltip"]').tooltip({
macInit.init(); macInit.init();
bundleService.getWidgetBundlesByParent().then(widgetBundles => { bundleService.getWidgetBundlesByParent().then(widgetBundles => {
const desktopLayout = new DesktopLayout(widgetBundles); const layout = window.glob.isMainWindow
? new DesktopMainWindowLayout(widgetBundles)
: new DesktopExtraWindowLayout(widgetBundles);
appContext.setLayout(desktopLayout); appContext.setLayout(layout);
appContext.start(); appContext.start();
}); });

View File

@ -1,144 +0,0 @@
import appContext from "./services/app_context.js";
import utils from './services/utils.js';
import noteTooltipService from './services/note_tooltip.js';
import bundleService from "./services/bundle.js";
import noteAutocompleteService from './services/note_autocomplete.js';
import macInit from './services/mac_init.js';
import contextMenu from "./services/context_menu.js";
import ExtraLayout from "./widgets/extra_layout.js";
import glob from "./services/glob.js";
glob.setupGlobs();
if (utils.isElectron()) {
utils.dynamicRequire('electron').ipcRenderer.on('globalShortcut', async function(event, actionName) {
appContext.triggerCommand(actionName);
});
}
$('[data-toggle="tooltip"]').tooltip({
html: true
});
macInit.init();
bundleService.getWidgetBundlesByParent().then(widgetBundles => {
const extraLayout = new ExtraLayout(widgetBundles);
appContext.setLayout(extraLayout);
appContext.start(false);
});
noteTooltipService.setupGlobalTooltip();
noteAutocompleteService.init();
if (utils.isElectron()) {
const electron = utils.dynamicRequire('electron');
const {webContents} = electron.remote.getCurrentWindow();
webContents.on('context-menu', (event, params) => {
const {editFlags} = params;
const hasText = params.selectionText.trim().length > 0;
const isMac = process.platform === "darwin";
const platformModifier = isMac ? 'Meta' : 'Ctrl';
const items = [];
if (params.misspelledWord) {
for (const suggestion of params.dictionarySuggestions) {
items.push({
title: suggestion,
command: "replaceMisspelling",
spellingSuggestion: suggestion,
uiIcon: "empty"
});
}
items.push({
title: `Add "${params.misspelledWord}" to dictionary`,
uiIcon: "plus",
handler: () => webContents.session.addWordToSpellCheckerDictionary(params.misspelledWord)
});
items.push({ title: `----` });
}
if (params.isEditable) {
items.push({
enabled: editFlags.canCut && hasText,
title: `Cut <kbd>${platformModifier}+X`,
uiIcon: "cut",
handler: () => webContents.cut()
});
}
if (params.isEditable || hasText) {
items.push({
enabled: editFlags.canCopy && hasText,
title: `Copy <kbd>${platformModifier}+C`,
uiIcon: "copy",
handler: () => webContents.copy()
});
}
if (params.linkURL.length !== 0 && params.mediaType === 'none') {
items.push({
title: `Copy link`,
uiIcon: "copy",
handler: () => {
electron.clipboard.write({
bookmark: params.linkText,
text: params.linkURL
});
}
});
}
if (params.isEditable) {
items.push({
enabled: editFlags.canPaste,
title: `Paste <kbd>${platformModifier}+V`,
uiIcon: "paste",
handler: () => webContents.paste()
});
}
if (params.isEditable) {
items.push({
enabled: editFlags.canPaste,
title: `Paste as plain text <kbd>${platformModifier}+Shift+V`,
uiIcon: "paste",
handler: () => webContents.pasteAndMatchStyle()
});
}
if (hasText) {
const shortenedSelection = params.selectionText.length > 15
? (params.selectionText.substr(0, 13) + "…")
: params.selectionText;
items.push({
enabled: editFlags.canPaste,
title: `Search for "${shortenedSelection}" with DuckDuckGo`,
uiIcon: "search-alt",
handler: () => electron.shell.openExternal(`https://duckduckgo.com/?q=${encodeURIComponent(params.selectionText)}`)
});
}
if (items.length === 0) {
return;
}
contextMenu.show({
x: params.x,
y: params.y,
items,
selectMenuItemHandler: ({command, spellingSuggestion}) => {
if (command === 'replaceMisspelling') {
webContents.insertText(spellingSuggestion);
}
}
});
});
}

View File

@ -1,18 +1,18 @@
import FlexContainer from "./flex_container.js"; import FlexContainer from "../widgets/flex_container.js";
import GlobalMenuWidget from "./global_menu.js"; import GlobalMenuWidget from "../widgets/global_menu.js";
import TabRowWidget from "./tab_row.js"; import TabRowWidget from "../widgets/tab_row.js";
import TitleBarButtonsWidget from "./title_bar_buttons.js"; import TitleBarButtonsWidget from "../widgets/title_bar_buttons.js";
import NoteTreeWidget from "./note_tree.js"; import NoteTreeWidget from "../widgets/note_tree.js";
import TabCachingWidget from "./tab_caching_widget.js"; import TabCachingWidget from "../widgets/tab_caching_widget.js";
import NoteTitleWidget from "./note_title.js"; import NoteTitleWidget from "../widgets/note_title.js";
import RunScriptButtonsWidget from "./run_script_buttons.js"; import RunScriptButtonsWidget from "../widgets/run_script_buttons.js";
import ProtectedNoteSwitchWidget from "./protected_note_switch.js"; import ProtectedNoteSwitchWidget from "../widgets/protected_note_switch.js";
import NoteTypeWidget from "./note_type.js"; import NoteTypeWidget from "../widgets/note_type.js";
import NoteActionsWidget from "./note_actions.js"; import NoteActionsWidget from "../widgets/note_actions.js";
import PromotedAttributesWidget from "./promoted_attributes.js"; import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
import NoteDetailWidget from "./note_detail.js"; import NoteDetailWidget from "../widgets/note_detail.js";
export default class ExtraLayout { export default class DesktopExtraWindowLayout {
constructor(customWidgets) { constructor(customWidgets) {
this.customWidgets = customWidgets; this.customWidgets = customWidgets;
} }

View File

@ -1,30 +1,30 @@
import FlexContainer from "./flex_container.js"; import FlexContainer from "../widgets/flex_container.js";
import GlobalMenuWidget from "./global_menu.js"; import GlobalMenuWidget from "../widgets/global_menu.js";
import TabRowWidget from "./tab_row.js"; import TabRowWidget from "../widgets/tab_row.js";
import TitleBarButtonsWidget from "./title_bar_buttons.js"; import TitleBarButtonsWidget from "../widgets/title_bar_buttons.js";
import StandardTopWidget from "./standard_top_widget.js"; import StandardTopWidget from "../widgets/standard_top_widget.js";
import SidePaneContainer from "./side_pane_container.js"; import SidePaneContainer from "../widgets/side_pane_container.js";
import GlobalButtonsWidget from "./global_buttons.js"; import GlobalButtonsWidget from "../widgets/global_buttons.js";
import SearchBoxWidget from "./search_box.js"; import SearchBoxWidget from "../widgets/search_box.js";
import SearchResultsWidget from "./search_results.js"; import SearchResultsWidget from "../widgets/search_results.js";
import NoteTreeWidget from "./note_tree.js"; import NoteTreeWidget from "../widgets/note_tree.js";
import TabCachingWidget from "./tab_caching_widget.js"; import TabCachingWidget from "../widgets/tab_caching_widget.js";
import NotePathsWidget from "./note_paths.js"; import NotePathsWidget from "../widgets/note_paths.js";
import NoteTitleWidget from "./note_title.js"; import NoteTitleWidget from "../widgets/note_title.js";
import RunScriptButtonsWidget from "./run_script_buttons.js"; import RunScriptButtonsWidget from "../widgets/run_script_buttons.js";
import ProtectedNoteSwitchWidget from "./protected_note_switch.js"; import ProtectedNoteSwitchWidget from "../widgets/protected_note_switch.js";
import NoteTypeWidget from "./note_type.js"; import NoteTypeWidget from "../widgets/note_type.js";
import NoteActionsWidget from "./note_actions.js"; import NoteActionsWidget from "../widgets/note_actions.js";
import PromotedAttributesWidget from "./promoted_attributes.js"; import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
import NoteDetailWidget from "./note_detail.js"; import NoteDetailWidget from "../widgets/note_detail.js";
import NoteInfoWidget from "./note_info.js"; import NoteInfoWidget from "../widgets/note_info.js";
import CalendarWidget from "./calendar.js"; import CalendarWidget from "../widgets/calendar.js";
import AttributesWidget from "./attributes.js"; import AttributesWidget from "../widgets/attributes.js";
import LinkMapWidget from "./link_map.js"; import LinkMapWidget from "../widgets/link_map.js";
import NoteRevisionsWidget from "./note_revisions.js"; import NoteRevisionsWidget from "../widgets/note_revisions.js";
import SimilarNotesWidget from "./similar_notes.js"; import SimilarNotesWidget from "../widgets/similar_notes.js";
import WhatLinksHereWidget from "./what_links_here.js"; import WhatLinksHereWidget from "../widgets/what_links_here.js";
import SidePaneToggles from "./side_pane_toggles.js"; import SidePaneToggles from "../widgets/side_pane_toggles.js";
import appContext from "../services/app_context.js"; import appContext from "../services/app_context.js";
const RIGHT_PANE_CSS = ` const RIGHT_PANE_CSS = `
@ -98,7 +98,7 @@ const RIGHT_PANE_CSS = `
} }
</style>`; </style>`;
export default class DesktopLayout { export default class DesktopMainWindowLayout {
constructor(customWidgets) { constructor(customWidgets) {
this.customWidgets = customWidgets; this.customWidgets = customWidgets;
} }

View File

@ -1,11 +1,11 @@
import FlexContainer from "./flex_container.js"; import FlexContainer from "../widgets/flex_container.js";
import NoteTitleWidget from "./note_title.js"; import NoteTitleWidget from "../widgets/note_title.js";
import NoteDetailWidget from "./note_detail.js"; import NoteDetailWidget from "../widgets/note_detail.js";
import NoteTreeWidget from "./note_tree.js"; import NoteTreeWidget from "../widgets/note_tree.js";
import MobileGlobalButtonsWidget from "./mobile_global_buttons.js"; import MobileGlobalButtonsWidget from "../widgets/mobile_global_buttons.js";
import CloseDetailButtonWidget from "./close_detail_button.js"; import CloseDetailButtonWidget from "../widgets/close_detail_button.js";
import MobileDetailMenuWidget from "./mobile_detail_menu.js"; import MobileDetailMenuWidget from "../widgets/mobile_detail_menu.js";
import ScreenContainer from "./screen_container.js"; import ScreenContainer from "../widgets/screen_container.js";
const MOBILE_CSS = ` const MOBILE_CSS = `
<style> <style>

View File

@ -1,5 +1,5 @@
import appContext from "./services/app_context.js"; import appContext from "./services/app_context.js";
import MobileLayout from "./widgets/mobile_layout.js"; import MobileLayout from "./layouts/mobile_layout.js";
import glob from "./services/glob.js"; import glob from "./services/glob.js";
glob.setupGlobs(); glob.setupGlobs();

View File

@ -13,18 +13,24 @@ import MobileScreenSwitcherExecutor from "../widgets/mobile_screen_switcher.js";
import MainTreeExecutors from "./main_tree_executors.js"; import MainTreeExecutors from "./main_tree_executors.js";
class AppContext extends Component { class AppContext extends Component {
constructor(isMainWindow) {
super();
this.isMainWindow = isMainWindow;
}
setLayout(layout) { setLayout(layout) {
this.layout = layout; this.layout = layout;
} }
async start(loadExistingTabs = true) { async start() {
await Promise.all([treeCache.initializedPromise, options.initializedPromise]); await Promise.all([treeCache.initializedPromise, options.initializedPromise]);
$("#loading-indicator").hide(); $("#loading-indicator").hide();
this.showWidgets(); this.showWidgets();
this.tabManager.loadTabs(loadExistingTabs); this.tabManager.loadTabs();
if (utils.isDesktop()) { if (utils.isDesktop()) {
setTimeout(() => bundleService.executeStartupBundles(), 2000); setTimeout(() => bundleService.executeStartupBundles(), 2000);
@ -115,7 +121,7 @@ class AppContext extends Component {
} }
} }
const appContext = new AppContext(); const appContext = new AppContext(window.glob.isMainWindow);
// we should save all outstanding changes before the page/app is closed // we should save all outstanding changes before the page/app is closed
$(window).on('beforeunload', () => { $(window).on('beforeunload', () => {

View File

@ -6,6 +6,7 @@ import treeCache from "./tree_cache.js";
import treeService from "./tree.js"; import treeService from "./tree.js";
import utils from "./utils.js"; import utils from "./utils.js";
import TabContext from "./tab_context.js"; import TabContext from "./tab_context.js";
import appContext from "./app_context.js";
export default class TabManager extends Component { export default class TabManager extends Component {
constructor() { constructor() {
@ -14,6 +15,10 @@ export default class TabManager extends Component {
this.activeTabId = null; this.activeTabId = null;
this.tabsUpdate = new SpacedUpdate(async () => { this.tabsUpdate = new SpacedUpdate(async () => {
if (!appContext.isMainWindow) {
return;
}
const openTabs = this.tabContexts const openTabs = this.tabContexts
.map(tc => tc.getTabState()) .map(tc => tc.getTabState())
.filter(t => !!t); .filter(t => !!t);
@ -29,8 +34,8 @@ export default class TabManager extends Component {
return this.children; return this.children;
} }
async loadTabs(loadExistingTabs) { async loadTabs() {
const openTabs = loadExistingTabs const tabsToOpen = appContext.isMainWindow
? (options.getJson('openTabs') || []) ? (options.getJson('openTabs') || [])
: []; : [];
@ -41,17 +46,17 @@ export default class TabManager extends Component {
const noteId = treeService.getNoteIdFromNotePath(notePath); const noteId = treeService.getNoteIdFromNotePath(notePath);
if (noteId && await treeCache.noteExists(noteId)) { if (noteId && await treeCache.noteExists(noteId)) {
for (const tab of openTabs) { for (const tab of tabsToOpen) {
tab.active = false; tab.active = false;
} }
const foundTab = openTabs.find(tab => noteId === treeService.getNoteIdFromNotePath(tab.notePath)); const foundTab = tabsToOpen.find(tab => noteId === treeService.getNoteIdFromNotePath(tab.notePath));
if (foundTab) { if (foundTab) {
foundTab.active = true; foundTab.active = true;
} }
else { else {
openTabs.push({ tabsToOpen.push({
notePath: notePath, notePath: notePath,
active: true active: true
}); });
@ -61,7 +66,7 @@ export default class TabManager extends Component {
let filteredTabs = []; let filteredTabs = [];
for (const openTab of openTabs) { for (const openTab of tabsToOpen) {
const noteId = treeService.getNoteIdFromNotePath(openTab.notePath); const noteId = treeService.getNoteIdFromNotePath(openTab.notePath);
if (await treeCache.noteExists(noteId)) { if (await treeCache.noteExists(noteId)) {

View File

@ -13,10 +13,6 @@ async function index(req, res) {
let view = req.cookies['trilium-device'] === 'mobile' ? 'mobile' : 'desktop'; let view = req.cookies['trilium-device'] === 'mobile' ? 'mobile' : 'desktop';
if (req.query.extra) {
view = 'extra';
}
const csrfToken = req.csrfToken(); const csrfToken = req.csrfToken();
log.info(`Generated CSRF token ${csrfToken} with secret ${res.getHeader('set-cookie')}`); log.info(`Generated CSRF token ${csrfToken} with secret ${res.getHeader('set-cookie')}`);
@ -30,7 +26,8 @@ async function index(req, res) {
maxSyncIdAtLoad: await sql.getValue("SELECT MAX(id) FROM sync"), maxSyncIdAtLoad: await sql.getValue("SELECT MAX(id) FROM sync"),
instanceName: config.General ? config.General.instanceName : null, instanceName: config.General ? config.General.instanceName : null,
appCssNoteIds: await getAppCssNoteIds(), appCssNoteIds: await getAppCssNoteIds(),
isDev: env.isDev() isDev: env.isDev(),
isMainWindow: !req.query.extra
}); });
} }

View File

@ -35,7 +35,7 @@ module.exports = function(filters, selectedColumns = 'notes.*') {
// forcing to use particular index since SQLite query planner would often choose something pretty bad // forcing to use particular index since SQLite query planner would often choose something pretty bad
joins[alias] = `LEFT JOIN attributes AS ${alias} INDEXED BY IDX_attributes_noteId_index ` joins[alias] = `LEFT JOIN attributes AS ${alias} INDEXED BY IDX_attributes_noteId_index `
+ `ON ${alias}.noteId = notes.noteId AND ${alias}.isDeleted = 0` + `ON ${alias}.noteId = notes.noteId AND ${alias}.isDeleted = 0 `
+ `AND ${alias}.name = '${property}' `; + `AND ${alias}.name = '${property}' `;
accessor = `${alias}.value`; accessor = `${alias}.value`;

View File

@ -46,8 +46,9 @@
maxSyncIdAtLoad: <%= maxSyncIdAtLoad %>, maxSyncIdAtLoad: <%= maxSyncIdAtLoad %>,
instanceName: '<%= instanceName %>', instanceName: '<%= instanceName %>',
csrfToken: '<%= csrfToken %>', csrfToken: '<%= csrfToken %>',
isDev: '<%= isDev %>', isDev: <%= isDev %>,
appCssNoteIds: <%- JSON.stringify(appCssNoteIds) %> appCssNoteIds: <%- JSON.stringify(appCssNoteIds) %>,
isMainWindow: <%= isMainWindow %>
}; };
</script> </script>

View File

@ -1,83 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="shortcut icon" href="favicon.ico">
<title>Trilium Notes</title>
</head>
<body class="desktop theme-<%= theme %>" style="display: none; --main-font-size: <%= mainFontSize %>%; --tree-font-size: <%= treeFontSize %>%; --detail-font-size: <%= detailFontSize %>%;">
<noscript>Trilium requires JavaScript to be enabled.</noscript>
<div id="toast-container" class="d-flex flex-column justify-content-center align-items-center"></div>
<div class="dropdown-menu dropdown-menu-sm" id="context-menu-container"></div>
<%- include('dialogs/about.ejs') %>
<%- include('dialogs/add_link.ejs') %>
<%- include('dialogs/attributes.ejs') %>
<%- include('dialogs/branch_prefix.ejs') %>
<%- include('dialogs/export.ejs') %>
<%- include('dialogs/import.ejs') %>
<%- include('dialogs/jump_to_note.ejs') %>
<%- include('dialogs/markdown_import.ejs') %>
<%- include('dialogs/note_revisions.ejs') %>
<%- include('dialogs/note_source.ejs') %>
<%- include('dialogs/options.ejs') %>
<%- include('dialogs/protected_session_password.ejs') %>
<%- include('dialogs/recent_changes.ejs') %>
<%- include('dialogs/sql_console.ejs') %>
<%- include('dialogs/info.ejs') %>
<%- include('dialogs/prompt.ejs') %>
<%- include('dialogs/confirm.ejs') %>
<%- include('dialogs/help.ejs') %>
<%- include('dialogs/note_info.ejs') %>
<%- include('dialogs/link_map.ejs') %>
<%- include('dialogs/clone_to.ejs') %>
<%- include('dialogs/move_to.ejs') %>
<%- include('dialogs/backend_log.ejs') %>
<%- include('dialogs/include_note.ejs') %>
<script type="text/javascript">
window.baseApiUrl = 'api/';
window.device = "desktop";
window.glob = {
activeDialog: null,
sourceId: '<%= sourceId %>',
maxSyncIdAtLoad: <%= maxSyncIdAtLoad %>,
instanceName: '<%= instanceName %>',
csrfToken: '<%= csrfToken %>',
isDev: '<%= isDev %>',
appCssNoteIds: <%- JSON.stringify(appCssNoteIds) %>
};
</script>
<!-- Required for correct loading of scripts in Electron -->
<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script>
<script src="libraries/jquery.min.js"></script>
<link href="libraries/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<script src="libraries/bootstrap/js/bootstrap.bundle.min.js"></script>
<link href="libraries/ckeditor/ckeditor-content.css" rel="stylesheet">
<script src="libraries/jquery.hotkeys.js"></script>
<script src="libraries/autocomplete.jquery.min.js"></script>
<script src="libraries/dayjs.min.js"></script>
<link href="stylesheets/themes.css" rel="stylesheet">
<link href="stylesheets/style.css" rel="stylesheet">
<link href="stylesheets/detail.css" rel="stylesheet">
<script src="app/extra.js" crossorigin type="module"></script>
<link rel="stylesheet" type="text/css" href="libraries/boxicons/css/boxicons.min.css">
<script>
$("body").show();
</script>
</body>
</html>

View File

@ -114,7 +114,7 @@
maxSyncIdAtLoad: <%= maxSyncIdAtLoad %>, maxSyncIdAtLoad: <%= maxSyncIdAtLoad %>,
instanceName: '<%= instanceName %>', instanceName: '<%= instanceName %>',
csrfToken: '<%= csrfToken %>', csrfToken: '<%= csrfToken %>',
isDev: '<%= isDev %>', isDev: <%= isDev %>,
appCssNoteIds: <%- JSON.stringify(appCssNoteIds) %> appCssNoteIds: <%- JSON.stringify(appCssNoteIds) %>
}; };
</script> </script>