From 6d847d22d336f19a54e61ae465f7bb70f65ff75e Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 15 Feb 2020 09:43:47 +0100 Subject: [PATCH] components now track their parent --- .../javascripts/services/app_context.js | 2 +- .../javascripts/services/entrypoints.js | 4 +- .../javascripts/services/tab_context.js | 2 +- .../javascripts/services/tab_manager.js | 4 +- src/public/javascripts/services/zoom.js | 4 +- src/public/javascripts/widgets/component.js | 13 +++- .../javascripts/widgets/flex_container.js | 6 +- src/public/javascripts/widgets/layout.js | 62 +++++++++---------- src/public/javascripts/widgets/note_detail.js | 4 +- src/public/javascripts/widgets/note_title.js | 4 +- src/public/javascripts/widgets/note_tree.js | 4 +- .../widgets/side_pane_container.js | 5 +- .../javascripts/widgets/side_pane_toggles.js | 4 +- .../javascripts/widgets/tab_caching_widget.js | 6 +- 14 files changed, 66 insertions(+), 58 deletions(-) diff --git a/src/public/javascripts/services/app_context.js b/src/public/javascripts/services/app_context.js index d924518fa..4f66cf9e6 100644 --- a/src/public/javascripts/services/app_context.js +++ b/src/public/javascripts/services/app_context.js @@ -47,7 +47,7 @@ class AppContext { ]; if (utils.isElectron()) { - this.components.push(new ZoomService(this)); + this.components.push(new ZoomService(this, this)); import("./spell_check.js").then(spellCheckService => spellCheckService.initSpellCheck()); } diff --git a/src/public/javascripts/services/entrypoints.js b/src/public/javascripts/services/entrypoints.js index d2b17b24a..1d986fa0b 100644 --- a/src/public/javascripts/services/entrypoints.js +++ b/src/public/javascripts/services/entrypoints.js @@ -8,8 +8,8 @@ import appContext from "./app_context.js"; import Component from "../widgets/component.js"; export default class Entrypoints extends Component { - constructor(appContext) { - super(appContext); + constructor(appContext, parent) { + super(appContext, parent); // hot keys are active also inside inputs and content editables jQuery.hotkeys.options.filterInputAcceptingElements = false; diff --git a/src/public/javascripts/services/tab_context.js b/src/public/javascripts/services/tab_context.js index 806be911b..43d7e6e68 100644 --- a/src/public/javascripts/services/tab_context.js +++ b/src/public/javascripts/services/tab_context.js @@ -15,7 +15,7 @@ class TabContext extends Component { * @param {string|null} tabId */ constructor(appContext, tabId = null) { - super(appContext); + super(appContext, parent); this.tabId = tabId || utils.randomString(4); diff --git a/src/public/javascripts/services/tab_manager.js b/src/public/javascripts/services/tab_manager.js index 2101a9108..655e74c0a 100644 --- a/src/public/javascripts/services/tab_manager.js +++ b/src/public/javascripts/services/tab_manager.js @@ -8,8 +8,8 @@ import utils from "./utils.js"; import TabContext from "./tab_context.js"; export default class TabManager extends Component { - constructor(appContext) { - super(appContext); + constructor(appContext, parent) { + super(appContext, parent); this.activeTabId = null; diff --git a/src/public/javascripts/services/zoom.js b/src/public/javascripts/services/zoom.js index 781189f01..f0fa83c66 100644 --- a/src/public/javascripts/services/zoom.js +++ b/src/public/javascripts/services/zoom.js @@ -5,8 +5,8 @@ const MIN_ZOOM = 0.5; const MAX_ZOOM = 2.0; export default class ZoomService extends Component { - constructor(appContext) { - super(appContext); + constructor(appContext, parent) { + super(appContext, parent); this.setZoomFactor(options.getFloat('zoomFactor')); } diff --git a/src/public/javascripts/widgets/component.js b/src/public/javascripts/widgets/component.js index 400113654..b7148bd4e 100644 --- a/src/public/javascripts/widgets/component.js +++ b/src/public/javascripts/widgets/component.js @@ -2,11 +2,16 @@ import utils from '../services/utils.js'; import Mutex from "../services/mutex.js"; export default class Component { - /** @param {AppContext} appContext */ - constructor(appContext) { + /** + * @param {AppContext} appContext + * @param {Component} parent + */ + constructor(appContext, parent) { this.componentId = `comp-${this.constructor.name}-` + utils.randomString(6); /** @type AppContext */ this.appContext = appContext; + /** @type Component */ + this.parent = parent; /** @type TabManager */ this.tabManager = appContext.tabManager; /** @type Component[] */ @@ -59,4 +64,8 @@ export default class Component { await Promise.all(promises); } + + triggerCommand(name, data) { + + } } \ No newline at end of file diff --git a/src/public/javascripts/widgets/flex_container.js b/src/public/javascripts/widgets/flex_container.js index 338787863..cc8854f22 100644 --- a/src/public/javascripts/widgets/flex_container.js +++ b/src/public/javascripts/widgets/flex_container.js @@ -1,11 +1,11 @@ import BasicWidget from "./basic_widget.js"; export default class FlexContainer extends BasicWidget { - constructor(appContext, attrs, widgets) { - super(appContext); + constructor(appContext, parent, attrs, widgetFactories) { + super(appContext, parent); this.attrs = attrs; - this.children = widgets; + this.children = widgetFactories.map(wf => wf(this)); } doRender() { diff --git a/src/public/javascripts/widgets/layout.js b/src/public/javascripts/widgets/layout.js index 012791fda..f3ee05afe 100644 --- a/src/public/javascripts/widgets/layout.js +++ b/src/public/javascripts/widgets/layout.js @@ -28,42 +28,42 @@ import SidePaneToggles from "./side_pane_toggles.js"; export default class Layout { getRootWidget(appContext) { - return new FlexContainer(appContext, { 'flex-direction': 'column', 'height': '100vh' }, [ - new FlexContainer(appContext, { 'flex-direction': 'row' }, [ - new GlobalMenuWidget(appContext), - new TabRowWidget(appContext), - new TitleBarButtonsWidget(appContext) + return new FlexContainer(appContext, appContext, { 'flex-direction': 'column', 'height': '100vh' }, [ + parent => new FlexContainer(appContext, parent, { 'flex-direction': 'row' }, [ + parent => new GlobalMenuWidget(appContext, parent), + parent => new TabRowWidget(appContext, parent), + parent => new TitleBarButtonsWidget(appContext, parent) ]), - new StandardTopWidget(appContext), - new FlexContainer(appContext, { 'flex-direction': 'row', 'overflow': 'hidden' }, [ - new SidePaneContainer(appContext, 'left', [ - new GlobalButtonsWidget(appContext), - new SearchBoxWidget(appContext), - new SearchResultsWidget(appContext), - new NoteTreeWidget(appContext) + parent => new StandardTopWidget(appContext, parent), + parent => new FlexContainer(appContext, parent, { 'flex-direction': 'row', 'overflow': 'hidden' }, [ + parent => new SidePaneContainer(appContext, parent, 'left', [ + parent => new GlobalButtonsWidget(appContext, parent), + parent => new SearchBoxWidget(appContext, parent), + parent => new SearchResultsWidget(appContext, parent), + parent => new NoteTreeWidget(appContext, parent) ]), - new FlexContainer(appContext, { id: 'center-pane', 'flex-direction': 'column' }, [ - new FlexContainer(appContext, { 'flex-direction': 'row' }, [ - new TabCachingWidget(appContext, () => new NotePathsWidget(appContext)), - new NoteTitleWidget(appContext), - new RunScriptButtonsWidget(appContext), - new ProtectedNoteSwitchWidget(appContext), - new NoteTypeWidget(appContext), - new NoteActionsWidget(appContext) + parent => new FlexContainer(appContext, parent, { id: 'center-pane', 'flex-direction': 'column' }, [ + parent => new FlexContainer(appContext, parent, { 'flex-direction': 'row' }, [ + parent => new TabCachingWidget(appContext, parent, parent => new NotePathsWidget(appContext, parent)), + parent => new NoteTitleWidget(appContext, parent), + parent => new RunScriptButtonsWidget(appContext, parent), + parent => new ProtectedNoteSwitchWidget(appContext, parent), + parent => new NoteTypeWidget(appContext, parent), + parent => new NoteActionsWidget(appContext, parent) ]), - new TabCachingWidget(appContext, () => new PromotedAttributesWidget(appContext)), - new TabCachingWidget(appContext, () => new NoteDetailWidget(appContext)) + parent => new TabCachingWidget(appContext, parent, parent => new PromotedAttributesWidget(appContext, parent)), + parent => new TabCachingWidget(appContext, parent, parent => new NoteDetailWidget(appContext, parent)) ]), - new SidePaneContainer(appContext, 'right', [ - new NoteInfoWidget(appContext), - new TabCachingWidget(appContext, () => new CalendarWidget(appContext)), - new TabCachingWidget(appContext, () => new AttributesWidget(appContext)), - new TabCachingWidget(appContext, () => new LinkMapWidget(appContext)), - new TabCachingWidget(appContext, () => new NoteRevisionsWidget(appContext)), - new TabCachingWidget(appContext, () => new SimilarNotesWidget(appContext)), - new TabCachingWidget(appContext, () => new WhatLinksHereWidget(appContext)) + parent => new SidePaneContainer(appContext, parent, 'right', [ + parent => new NoteInfoWidget(appContext, parent), + parent => new TabCachingWidget(appContext, parent, parent => new CalendarWidget(appContext, parent)), + parent => new TabCachingWidget(appContext, parent, parent => new AttributesWidget(appContext, parent)), + parent => new TabCachingWidget(appContext, parent, parent => new LinkMapWidget(appContext, parent)), + parent => new TabCachingWidget(appContext, parent, parent => new NoteRevisionsWidget(appContext, parent)), + parent => new TabCachingWidget(appContext, parent, parent => new SimilarNotesWidget(appContext, parent)), + parent => new TabCachingWidget(appContext, parent, parent => new WhatLinksHereWidget(appContext, parent)) ]), - new SidePaneToggles(appContext) + parent => new SidePaneToggles(appContext, parent) ]) ]) } diff --git a/src/public/javascripts/widgets/note_detail.js b/src/public/javascripts/widgets/note_detail.js index 0edcbcb0e..076d2b727 100644 --- a/src/public/javascripts/widgets/note_detail.js +++ b/src/public/javascripts/widgets/note_detail.js @@ -39,8 +39,8 @@ const typeWidgetClasses = { }; export default class NoteDetailWidget extends TabAwareWidget { - constructor(appContext) { - super(appContext); + constructor(appContext, parent) { + super(appContext, parent); this.typeWidgets = {}; diff --git a/src/public/javascripts/widgets/note_title.js b/src/public/javascripts/widgets/note_title.js index 798e62fd1..d614a845d 100644 --- a/src/public/javascripts/widgets/note_title.js +++ b/src/public/javascripts/widgets/note_title.js @@ -25,8 +25,8 @@ const TPL = ` `; export default class NoteTitleWidget extends TabAwareWidget { - constructor(appContext) { - super(appContext); + constructor(appContext, parent) { + super(appContext, parent); this.spacedUpdate = new SpacedUpdate(async () => { const title = this.$noteTitle.val(); diff --git a/src/public/javascripts/widgets/note_tree.js b/src/public/javascripts/widgets/note_tree.js index 03c1a27fc..d81ca9d88 100644 --- a/src/public/javascripts/widgets/note_tree.js +++ b/src/public/javascripts/widgets/note_tree.js @@ -29,8 +29,8 @@ const TPL = ` `; export default class NoteTreeWidget extends TabAwareWidget { - constructor(appContext) { - super(appContext); + constructor(appContext, parent) { + super(appContext, parent); window.glob.cutIntoNote = () => this.cutIntoNoteListener(); diff --git a/src/public/javascripts/widgets/side_pane_container.js b/src/public/javascripts/widgets/side_pane_container.js index cb250e6f4..e8c17b2df 100644 --- a/src/public/javascripts/widgets/side_pane_container.js +++ b/src/public/javascripts/widgets/side_pane_container.js @@ -2,11 +2,10 @@ import options from "../services/options.js"; import FlexContainer from "./flex_container.js"; export default class SidePaneContainer extends FlexContainer { - constructor(appContext, side, widgets) { - super(appContext, {id: side + '-pane', 'flex-direction': 'column', 'height': '100%'}, widgets); + constructor(appContext, parent, side, widgetFactories) { + super(appContext, parent, {id: side + '-pane', 'flex-direction': 'column', 'height': '100%'}, widgetFactories); this.side = side; - this.children = widgets; } isEnabled() { diff --git a/src/public/javascripts/widgets/side_pane_toggles.js b/src/public/javascripts/widgets/side_pane_toggles.js index ccb337cfd..9fe070c86 100644 --- a/src/public/javascripts/widgets/side_pane_toggles.js +++ b/src/public/javascripts/widgets/side_pane_toggles.js @@ -29,8 +29,8 @@ const TPL = ` `; export default class SidePaneToggles extends BasicWidget { - constructor(appContext) { - super(appContext); + constructor(appContext, parent) { + super(appContext, parent); this.paneVisible = {}; } diff --git a/src/public/javascripts/widgets/tab_caching_widget.js b/src/public/javascripts/widgets/tab_caching_widget.js index 494f12cc5..af2b9a719 100644 --- a/src/public/javascripts/widgets/tab_caching_widget.js +++ b/src/public/javascripts/widgets/tab_caching_widget.js @@ -1,8 +1,8 @@ import TabAwareWidget from "./tab_aware_widget.js"; export default class TabCachingWidget extends TabAwareWidget { - constructor(appContext, widgetFactory) { - super(appContext); + constructor(appContext, parent, widgetFactory) { + super(appContext, parent); this.widgetFactory = widgetFactory; this.widgets = {}; @@ -38,7 +38,7 @@ export default class TabCachingWidget extends TabAwareWidget { let widget = this.widgets[this.tabContext.tabId]; if (!widget) { - widget = this.widgets[this.tabContext.tabId] = this.widgetFactory(); + widget = this.widgets[this.tabContext.tabId] = this.widgetFactory(this); this.children.push(widget); this.$widget.after(widget.render());