Skip to content

Commit 33a41d2

Browse files
committed
Merge remote-tracking branch 'origin/main' into react/type_widgets
; Conflicts: ; apps/client/src/layouts/desktop_layout.tsx ; apps/client/src/layouts/mobile_layout.tsx ; apps/client/src/widgets/note_detail.ts ; apps/client/src/widgets/react/hooks.tsx
2 parents 319e283 + afa9255 commit 33a41d2

File tree

80 files changed

+1225
-513
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+1225
-513
lines changed

.github/workflows/nightly.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ jobs:
7777
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
7878

7979
- name: Publish release
80-
uses: softprops/[email protected].1
80+
uses: softprops/[email protected].2
8181
if: ${{ github.event_name != 'pull_request' }}
8282
with:
8383
make_latest: false
@@ -118,7 +118,7 @@ jobs:
118118
arch: ${{ matrix.arch }}
119119

120120
- name: Publish release
121-
uses: softprops/[email protected].1
121+
uses: softprops/[email protected].2
122122
if: ${{ github.event_name != 'pull_request' }}
123123
with:
124124
make_latest: false

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ jobs:
127127
path: upload
128128

129129
- name: Publish stable release
130-
uses: softprops/[email protected].1
130+
uses: softprops/[email protected].2
131131
with:
132132
draft: false
133133
body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md

_regroup/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"esm": "3.2.25",
4747
"jsdoc": "4.0.5",
4848
"lorem-ipsum": "2.0.8",
49-
"rcedit": "4.0.1",
49+
"rcedit": "5.0.0",
5050
"rimraf": "6.1.0",
5151
"tslib": "2.8.1"
5252
},

apps/client/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
"draggabilly": "3.0.0",
4444
"force-graph": "1.51.0",
4545
"globals": "16.5.0",
46-
"i18next": "25.6.0",
46+
"i18next": "25.6.1",
4747
"i18next-http-backend": "3.0.2",
4848
"jquery": "3.7.1",
4949
"jquery.fancytree": "2.38.5",
@@ -53,7 +53,7 @@
5353
"leaflet": "1.9.4",
5454
"leaflet-gpx": "2.2.0",
5555
"mark.js": "8.11.1",
56-
"marked": "16.4.1",
56+
"marked": "16.4.2",
5757
"mermaid": "11.12.1",
5858
"mind-elixir": "5.3.5",
5959
"normalize.css": "8.0.1",

apps/client/src/components/app_context.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,10 @@ type EventMappings = {
495495
noteIds: string[];
496496
};
497497
refreshData: { ntxId: string | null | undefined };
498+
contentSafeMarginChanged: {
499+
top: number;
500+
noteContext: NoteContext;
501+
}
498502
};
499503

500504
export type EventListener<T extends EventNames> = {

apps/client/src/components/root_command_executor.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ export default class RootCommandExecutor extends Component {
171171
}
172172

173173
toggleTrayCommand() {
174-
if (!utils.isElectron()) return;
174+
if (!utils.isElectron() || options.is("disableTray")) return;
175+
175176
const { BrowserWindow } = utils.dynamicRequire("@electron/remote");
176177
const windows = BrowserWindow.getAllWindows() as Electron.BaseWindow[];
177178
const isVisible = windows.every((w) => w.isVisible());

apps/client/src/layouts/desktop_layout.tsx

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,48 @@
1-
import FlexContainer from "../widgets/containers/flex_container.js";
2-
import TabRowWidget from "../widgets/tab_row.js";
3-
import LeftPaneContainer from "../widgets/containers/left_pane_container.js";
4-
import NoteTreeWidget from "../widgets/note_tree.js";
5-
import NoteTitleWidget from "../widgets/note_title.jsx";
6-
import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
7-
import NoteIconWidget from "../widgets/note_icon.jsx";
8-
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
9-
import RootContainer from "../widgets/containers/root_container.js";
10-
import WatchedFileUpdateStatusWidget from "../widgets/watched_file_update_status.js";
11-
import SpacerWidget from "../widgets/spacer.js";
12-
import QuickSearchWidget from "../widgets/quick_search.js";
13-
import SplitNoteContainer from "../widgets/containers/split_note_container.js";
14-
import CreatePaneButton from "../widgets/buttons/create_pane_button.js";
1+
import { applyModals } from "./layout_commons.js";
2+
import { DESKTOP_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx";
3+
import ApiLog from "../widgets/api_log.jsx";
154
import ClosePaneButton from "../widgets/buttons/close_pane_button.js";
16-
import RightPaneContainer from "../widgets/containers/right_pane_container.js";
17-
import NoteWrapperWidget from "../widgets/note_wrapper.js";
5+
import CloseZenModeButton from "../widgets/close_zen_button.jsx";
6+
import ContentHeader from "../widgets/containers/content-header.js";
7+
import CreatePaneButton from "../widgets/buttons/create_pane_button.js";
188
import FindWidget from "../widgets/find.js";
19-
import TocWidget from "../widgets/toc.js";
9+
import FlexContainer from "../widgets/containers/flex_container.js";
10+
import FloatingButtons from "../widgets/FloatingButtons.jsx";
11+
import GlobalMenu from "../widgets/buttons/global_menu.jsx";
2012
import HighlightsListWidget from "../widgets/highlights_list.js";
21-
import PasswordNoteSetDialog from "../widgets/dialogs/password_not_set.js";
2213
import LauncherContainer from "../widgets/containers/launcher_container.js";
14+
import LeftPaneContainer from "../widgets/containers/left_pane_container.js";
15+
import LeftPaneToggle from "../widgets/buttons/left_pane_toggle.js";
2316
import MovePaneButton from "../widgets/buttons/move_pane_button.js";
24-
import UploadAttachmentsDialog from "../widgets/dialogs/upload_attachments.js";
25-
import ScrollPadding from "../widgets/scroll_padding.js";
17+
import NoteIconWidget from "../widgets/note_icon.jsx";
18+
import NoteList from "../widgets/collections/NoteList.jsx";
19+
import NoteTitleWidget from "../widgets/note_title.jsx";
20+
import NoteTreeWidget from "../widgets/note_tree.js";
21+
import NoteWrapperWidget from "../widgets/note_wrapper.js";
2622
import options from "../services/options.js";
27-
import utils from "../services/utils.js";
28-
import type { AppContext } from "../components/app_context.js";
29-
import type { WidgetsByParent } from "../services/bundle.js";
30-
import { applyModals } from "./layout_commons.js";
23+
import PasswordNoteSetDialog from "../widgets/dialogs/password_not_set.js";
24+
import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
25+
import QuickSearchWidget from "../widgets/quick_search.js";
26+
import ReadOnlyNoteInfoBar from "../widgets/ReadOnlyNoteInfoBar.jsx";
3127
import Ribbon from "../widgets/ribbon/Ribbon.jsx";
32-
import FloatingButtons from "../widgets/FloatingButtons.jsx";
33-
import { DESKTOP_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx";
28+
import RightPaneContainer from "../widgets/containers/right_pane_container.js";
29+
import RootContainer from "../widgets/containers/root_container.js";
30+
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
31+
import ScrollPadding from "../widgets/scroll_padding.js";
3432
import SearchResult from "../widgets/search_result.jsx";
35-
import GlobalMenu from "../widgets/buttons/global_menu.jsx";
33+
import SharedInfo from "../widgets/shared_info.jsx";
34+
import SpacerWidget from "../widgets/spacer.js";
35+
import SplitNoteContainer from "../widgets/containers/split_note_container.js";
3636
import SqlResults from "../widgets/sql_result.js";
3737
import SqlTableSchemas from "../widgets/sql_table_schemas.js";
38+
import TabRowWidget from "../widgets/tab_row.js";
3839
import TitleBarButtons from "../widgets/title_bar_buttons.jsx";
39-
import LeftPaneToggle from "../widgets/buttons/left_pane_toggle.js";
40-
import ApiLog from "../widgets/api_log.jsx";
41-
import CloseZenModeButton from "../widgets/close_zen_button.jsx";
42-
import SharedInfo from "../widgets/shared_info.jsx";
43-
import NoteList from "../widgets/collections/NoteList.jsx";
40+
import TocWidget from "../widgets/toc.js";
41+
import type { AppContext } from "../components/app_context.js";
42+
import type { WidgetsByParent } from "../services/bundle.js";
43+
import UploadAttachmentsDialog from "../widgets/dialogs/upload_attachments.js";
44+
import utils from "../services/utils.js";
45+
import WatchedFileUpdateStatusWidget from "../widgets/watched_file_update_status.js";
4446
import NoteDetail from "../widgets/NoteDetail.jsx";
4547

4648
export default class DesktopLayout {
@@ -129,12 +131,15 @@ export default class DesktopLayout {
129131
.child(<CreatePaneButton />)
130132
)
131133
.child(<Ribbon />)
132-
.child(<SharedInfo />)
133134
.child(new WatchedFileUpdateStatusWidget())
134135
.child(<FloatingButtons items={DESKTOP_FLOATING_BUTTONS} />)
135136
.child(
136137
new ScrollingContainer()
137138
.filling()
139+
.child(new ContentHeader()
140+
.child(<ReadOnlyNoteInfoBar />)
141+
.child(<SharedInfo />)
142+
)
138143
.child(new PromotedAttributesWidget())
139144
.child(<SqlTableSchemas />)
140145
.child(<NoteDetail />)

apps/client/src/layouts/mobile_layout.tsx

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,34 @@
1+
import { applyModals } from "./layout_commons.js";
2+
import { MOBILE_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx";
3+
import { useNoteContext } from "../widgets/react/hooks.jsx";
4+
import CloseZenModeButton from "../widgets/close_zen_button.js";
5+
import FilePropertiesTab from "../widgets/ribbon/FilePropertiesTab.jsx";
16
import FlexContainer from "../widgets/containers/flex_container.js";
7+
import FloatingButtons from "../widgets/FloatingButtons.jsx";
8+
import GlobalMenuWidget from "../widgets/buttons/global_menu.js";
9+
import LauncherContainer from "../widgets/containers/launcher_container.js";
10+
import MobileDetailMenu from "../widgets/mobile_widgets/mobile_detail_menu.js";
11+
import MobileEditorToolbar from "../widgets/type_widgets/ckeditor/mobile_editor_toolbar.js";
12+
import NoteList from "../widgets/collections/NoteList.jsx";
213
import NoteTitleWidget from "../widgets/note_title.js";
3-
import QuickSearchWidget from "../widgets/quick_search.js";
14+
import ContentHeader from "../widgets/containers/content-header.js";
415
import NoteTreeWidget from "../widgets/note_tree.js";
16+
import NoteWrapperWidget from "../widgets/note_wrapper.js";
17+
import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
18+
import QuickSearchWidget from "../widgets/quick_search.js";
19+
import ReadOnlyNoteInfoBar from "../widgets/ReadOnlyNoteInfoBar.jsx";
20+
import RootContainer from "../widgets/containers/root_container.js";
521
import ScreenContainer from "../widgets/mobile_widgets/screen_container.js";
622
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
7-
import GlobalMenuWidget from "../widgets/buttons/global_menu.js";
8-
import LauncherContainer from "../widgets/containers/launcher_container.js";
9-
import RootContainer from "../widgets/containers/root_container.js";
23+
import SearchDefinitionTab from "../widgets/ribbon/SearchDefinitionTab.jsx";
24+
import SearchResult from "../widgets/search_result.jsx";
1025
import SharedInfoWidget from "../widgets/shared_info.js";
11-
import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
1226
import SidebarContainer from "../widgets/mobile_widgets/sidebar_container.js";
13-
import type AppContext from "../components/app_context.js";
27+
import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx";
1428
import TabRowWidget from "../widgets/tab_row.js";
15-
import MobileEditorToolbar from "../widgets/type_widgets/text/mobile_editor_toolbar.js";
16-
import { applyModals } from "./layout_commons.js";
17-
import FilePropertiesTab from "../widgets/ribbon/FilePropertiesTab.jsx";
18-
import { useNoteContext } from "../widgets/react/hooks.jsx";
19-
import FloatingButtons from "../widgets/FloatingButtons.jsx";
20-
import { MOBILE_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx";
2129
import ToggleSidebarButton from "../widgets/mobile_widgets/toggle_sidebar_button.jsx";
22-
import CloseZenModeButton from "../widgets/close_zen_button.js";
23-
import NoteWrapperWidget from "../widgets/note_wrapper.js";
24-
import MobileDetailMenu from "../widgets/mobile_widgets/mobile_detail_menu.js";
25-
import NoteList from "../widgets/collections/NoteList.jsx";
30+
import type AppContext from "../components/app_context.js";
2631
import NoteDetail from "../widgets/NoteDetail.jsx";
27-
import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx";
28-
import SearchDefinitionTab from "../widgets/ribbon/SearchDefinitionTab.jsx";
29-
import SearchResult from "../widgets/search_result.jsx";
3032

3133
const MOBILE_CSS = `
3234
<style>
@@ -149,13 +151,16 @@ export default class MobileLayout {
149151
.child(<NoteTitleWidget />)
150152
.child(<MobileDetailMenu />)
151153
)
152-
.child(<SharedInfoWidget />)
153154
.child(<FloatingButtons items={MOBILE_FLOATING_BUTTONS} />)
154155
.child(new PromotedAttributesWidget())
155156
.child(
156157
new ScrollingContainer()
157158
.filling()
158159
.contentSized()
160+
.child(new ContentHeader()
161+
.child(<ReadOnlyNoteInfoBar />)
162+
.child(<SharedInfoWidget />)
163+
)
159164
.child(<NoteDetail />)
160165
.child(<NoteList media="screen" />)
161166
.child(<StandaloneRibbonAdapter component={SearchDefinitionTab} />)

apps/client/src/print.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ function SingleNoteRenderer({ note, onReady }: RendererProps) {
7070
});
7171
})
7272
);
73+
74+
// Check custom CSS.
75+
await loadCustomCss(note);
7376
}
7477

7578
load().then(() => requestAnimationFrame(onReady))
@@ -89,7 +92,10 @@ function CollectionRenderer({ note, onReady }: RendererProps) {
8992
ntxId="print"
9093
highlightedTokens={null}
9194
media="print"
92-
onReady={onReady}
95+
onReady={async () => {
96+
await loadCustomCss(note);
97+
onReady();
98+
}}
9399
/>;
94100
}
95101

@@ -102,4 +108,25 @@ function Error404({ noteId }: { noteId: string }) {
102108
)
103109
}
104110

111+
async function loadCustomCss(note: FNote) {
112+
const printCssNotes = await note.getRelationTargets("printCss");
113+
let loadPromises: JQueryPromise<void>[] = [];
114+
115+
for (const printCssNote of printCssNotes) {
116+
if (!printCssNote || (printCssNote.type !== "code" && printCssNote.mime !== "text/css")) continue;
117+
118+
const linkEl = document.createElement("link");
119+
linkEl.href = `/api/notes/${printCssNote.noteId}/download`;
120+
linkEl.rel = "stylesheet";
121+
122+
const promise = $.Deferred();
123+
loadPromises.push(promise.promise());
124+
linkEl.onload = () => promise.resolve();
125+
126+
document.head.appendChild(linkEl);
127+
}
128+
129+
await Promise.allSettled(loadPromises);
130+
}
131+
105132
main();

0 commit comments

Comments
 (0)