From 74697fcaaeabda8d16516ba09d2efdd21fbc7b77 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 9 Jun 2020 08:12:39 -0700 Subject: [PATCH 1/3] pooling --- js/constants.js | 7 +++++++ js/platform-provider.js | 20 ++++++++++++++++++++ js/platform-window.js | 11 +++++------ 3 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 js/constants.js diff --git a/js/constants.js b/js/constants.js new file mode 100644 index 0000000..1ed2200 --- /dev/null +++ b/js/constants.js @@ -0,0 +1,7 @@ + +const CHART_URL = 'https://cdn.openfin.co/embed-web/chart.html'; +const TRADEVIEW_URL = 'https://www.tradingview.com/chart/?symbol=NASDAQ:AAPL'; +const NEWS_URL = 'https://www.google.com/search?q=INDEXDJX:+.DJI'; +const URLS_ARRAY = [CHART_URL, TRADEVIEW_URL, NEWS_URL]; + +export { CHART_URL, TRADEVIEW_URL, NEWS_URL, URLS_ARRAY }; \ No newline at end of file diff --git a/js/platform-provider.js b/js/platform-provider.js index aad96ae..e255593 100644 --- a/js/platform-provider.js +++ b/js/platform-provider.js @@ -1,4 +1,5 @@ import { generateExternalWindowSnapshot, restoreExternalWindowPositionAndState } from './external-window-snapshot.js'; +import { URLS_ARRAY } from './constants.js'; //We have customized out platform provider to keep track of a specific notepad window. //Look for the "my_platform_notes.txt" file and launch it in notepad or add another external window to this array @@ -9,9 +10,28 @@ const externalWindowsToTrack = [ } ]; +const pooledViews = {}; +const createPooledView = async (url) => { + console.log('about to create'); + const view = await fin.Platform.getCurrentSync().createView({ url }, fin.me.identity); + pooledViews[url] = view.identity.name; +}; + +fin.Platform.getCurrentSync().once('platform-snapshot-applied', () => URLS_ARRAY.forEach(createPooledView)); + fin.Platform.init({ overrideCallback: async (Provider) => { class Override extends Provider { + async createView(payload) { + const { opts } = payload; + if (!opts.name && pooledViews[opts.url]) { + console.log('replacing name'); + opts.name = pooledViews[opts.url]; + delete pooledViews[opts.url]; + setTimeout(() => createPooledView(opts.url),1); + } + return super.createView(payload); + } async getSnapshot() { const snapshot = await super.getSnapshot(); diff --git a/js/platform-window.js b/js/platform-window.js index 19a6c50..3725342 100644 --- a/js/platform-window.js +++ b/js/platform-window.js @@ -1,7 +1,10 @@ import { html, render } from 'https://unpkg.com/lit-html@1.0.0/lit-html.js'; import { getTemplates, storeTemplate, getTemplateByName, onStoreUpdate } from './template-store.js'; +import { CHART_URL, TRADEVIEW_URL, NEWS_URL } from './constants.js'; + window.addEventListener('DOMContentLoaded', () => { + console.log('dom content'); fin.me.on('layout-ready', async () => { // Whenever a new layout is ready on this window (on init, replace, or applyPreset) @@ -17,7 +20,6 @@ window.addEventListener('DOMContentLoaded', () => { fin.Platform.Layout.init({containerId: CONTAINER_ID}); }); -const CHART_URL = 'https://cdn.openfin.co/embed-web/chart.html'; const LAYOUT_STORE_KEY = 'LayoutMenu'; const SNAPSHOT_STORE_KEY = 'SnapshotMenu'; const CONTAINER_ID = 'layout-container'; @@ -42,17 +44,14 @@ class LeftMenu extends HTMLElement { { url: CHART_URL, printName: 'OF Chart', - processAffinity: 'ps_1' }, { - url: 'https://www.tradingview.com/chart/?symbol=NASDAQ:AAPL', + url: TRADEVIEW_URL, printName: 'TradeView', - processAffinity: 'tv_1' }, { - url: 'https://www.google.com/search?q=INDEXDJX:+.DJI&stick=H4sIAAAAAAAAAONgecRozC3w8sc9YSmtSWtOXmNU4eIKzsgvd80rySypFBLjYoOyeKS4uDj0c_UNkgsry3kWsfJ5-rm4Rrh4RVgp6Ll4eQIAqJT5uUkAAAA&source=lnms&sa=X&ved=0ahUKEwii_NWT9fzoAhU3mHIEHWy3AWIQ_AUIDSgA&biw=1280&bih=1366&dpr=1', + url: NEWS_URL, printName: 'News', - processAffinity: 'mw_1' } ]; From 6fb3b2c2d92276c7946387cc8444290b6471cd64 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 17 Jun 2020 08:18:25 -0700 Subject: [PATCH 2/3] addd via snapshot --- app.json | 5 ++-- js/platform-provider.js | 56 ++++++++++++++++++++++++++++++++++++++--- js/platform-window.js | 6 ++--- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/app.json b/app.json index 0f7513a..cb13397 100644 --- a/app.json +++ b/app.json @@ -1,6 +1,6 @@ { "runtime": { - "arguments": "", + "arguments": "--v=1", "version": "canary" }, "shortcut": { @@ -38,7 +38,7 @@ "minWidth": 354 }, "defaultViewOptions": { - "experimental": { + "_experimental": { "childWindows": true } }, @@ -61,7 +61,6 @@ "content": [ { "type": "stack", - "id": "no-drop-target", "content": [ { "type": "component", diff --git a/js/platform-provider.js b/js/platform-provider.js index e255593..084c1f6 100644 --- a/js/platform-provider.js +++ b/js/platform-provider.js @@ -19,6 +19,41 @@ const createPooledView = async (url) => { fin.Platform.getCurrentSync().once('platform-snapshot-applied', () => URLS_ARRAY.forEach(createPooledView)); +function modifyContentItemName( + contentItem, + shouldReplace, + url +) { + const name = generateViewNameIfNeeded(contentItem.componentState.name, shouldReplace, url); + const newComponentState = { ...contentItem.componentState, name }; + return { ...contentItem, componentState: newComponentState }; +} + +function generateViewNameIfNeeded(name, shouldReplace, url) { + // either the view has no name OR it is being restored and has a generated name + if(!name || (shouldReplace && name.startsWith('internal-generated-view-'))) { + const name = pooledViews[url]; + setTimeout(() => createPooledView(url),1); + delete pooledViews[url]; + return name; + } + return name; +} + +function mapLayoutContentItems( + contentItems, + action +) { + return contentItems.reduce((res, contentItem) => { + let modifiedContentItemContent = contentItem.content; + const modifiedContentItem = contentItem.type === 'component' ? action(contentItem) : contentItem; + if (contentItem.content) { + modifiedContentItemContent = mapLayoutContentItems(contentItem.content, action); + } + return [...res, { ...modifiedContentItem, content: modifiedContentItemContent }]; + }, []); +} + fin.Platform.init({ overrideCallback: async (Provider) => { class Override extends Provider { @@ -32,6 +67,21 @@ fin.Platform.init({ } return super.createView(payload); } + + async createWindow(payload) { + if (payload.layout) { + payload.layout.content = mapLayoutContentItems( + payload.layout.content, + (contentItem) => + modifyContentItemName( + contentItem, + payload.reason !== 'tearout' && pooledViews[contentItem.componentState.url], + contentItem.componentState.url + ) + ); + } + super.createWindow(payload) + } async getSnapshot() { const snapshot = await super.getSnapshot(); @@ -48,9 +98,9 @@ fin.Platform.init({ const originalPromise = super.applySnapshot({ snapshot, options }); //if we have a section with external windows we will use it. - if (snapshot.externalWindows) { - await Promise.all(snapshot.externalWindows.map(async (i) => await restoreExternalWindowPositionAndState(i))); - } + // if (snapshot.externalWindows) { + // await Promise.all(snapshot.externalWindows.map(async (i) => await restoreExternalWindowPositionAndState(i))); + // } return originalPromise; } diff --git a/js/platform-window.js b/js/platform-window.js index 3725342..e46fb6a 100644 --- a/js/platform-window.js +++ b/js/platform-window.js @@ -10,13 +10,13 @@ window.addEventListener('DOMContentLoaded', () => { // Whenever a new layout is ready on this window (on init, replace, or applyPreset) const { settings } = await fin.Platform.Layout.getCurrentSync().getConfig(); // determine whether it is locked and update the icon + const lockIcon = document.getElementById('lock-button'); if(settings.hasHeaders && settings.reorderEnabled) { - document.getElementById('lock-button').classList.remove('layout-locked'); + lockIcon.classList.remove('layout-locked'); } else { - document.getElementById('lock-button').classList.add('layout-locked'); + lockIcon.classList.add('layout-locked'); } }); - // Before .50 AI version this may throw... fin.Platform.Layout.init({containerId: CONTAINER_ID}); }); From 26cab9fbd6abbd6ace85bdcfc9208acf00c27946 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 29 Jul 2020 14:24:53 -0700 Subject: [PATCH 3/3] hold --- app.json | 2 +- js/constants.js | 8 ++++++-- js/external-window-snapshot.js | 2 +- js/left-menu.js | 15 +++++++-------- js/platform-provider.js | 11 ++++++----- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app.json b/app.json index d5423a1..9e0fde5 100644 --- a/app.json +++ b/app.json @@ -1,6 +1,6 @@ { "runtime": { - "arguments": "--v=1 --inspect", + "arguments": "--v=1 --inspect --security-realm=demo", "version": "beta" }, "shortcut": { diff --git a/js/constants.js b/js/constants.js index 1ed2200..e57d10c 100644 --- a/js/constants.js +++ b/js/constants.js @@ -2,6 +2,10 @@ const CHART_URL = 'https://cdn.openfin.co/embed-web/chart.html'; const TRADEVIEW_URL = 'https://www.tradingview.com/chart/?symbol=NASDAQ:AAPL'; const NEWS_URL = 'https://www.google.com/search?q=INDEXDJX:+.DJI'; -const URLS_ARRAY = [CHART_URL, TRADEVIEW_URL, NEWS_URL]; +const DOCS_URL = `https://cdn.openfin.co/docs/javascript/${fin.desktop.getVersion()}` +const URLS_ARRAY = [CHART_URL, TRADEVIEW_URL, NEWS_URL, DOCS_URL]; -export { CHART_URL, TRADEVIEW_URL, NEWS_URL, URLS_ARRAY }; \ No newline at end of file +const LAYOUT_STORE_KEY = 'LayoutForm'; +const SNAPSHOT_STORE_KEY = 'SnapshotForm'; + +export { CHART_URL, TRADEVIEW_URL, NEWS_URL, URLS_ARRAY, LAYOUT_STORE_KEY, SNAPSHOT_STORE_KEY, DOCS_URL, }; \ No newline at end of file diff --git a/js/external-window-snapshot.js b/js/external-window-snapshot.js index c1d82a7..c18f178 100644 --- a/js/external-window-snapshot.js +++ b/js/external-window-snapshot.js @@ -21,7 +21,7 @@ async function getExternalWindowInfo(name, title) { } async function generateExternalWindowSnapshot(externalWins) { - return await Promise.all(externalWins.map(async (i) => await getExternalWindowInfo(i.name, i.title))); + return await Promise.all(externalWins.map(async (i) => await getExternalWindowInfo(i.name, i.title)).filter(e => !!e)); } async function restoreExternalWindowPositionAndState(info) { diff --git a/js/left-menu.js b/js/left-menu.js index 8460fcc..3830356 100644 --- a/js/left-menu.js +++ b/js/left-menu.js @@ -1,10 +1,8 @@ import { html, render } from 'https://unpkg.com/lit-html@1.0.0/lit-html.js'; import { getTemplates, getTemplateByName, onStoreUpdate } from './template-store.js'; import { CONTAINER_ID } from './platform-window.js'; - -const CHART_URL = 'https://cdn.openfin.co/embed-web/chart.html'; -const LAYOUT_STORE_KEY = 'LayoutForm'; -const SNAPSHOT_STORE_KEY = 'SnapshotForm'; +import { CHART_URL, LAYOUT_STORE_KEY, SNAPSHOT_STORE_KEY, TRADEVIEW_URL, DOCS_URL } from './constants.js'; +import { NEWS_URL } from './constants.js'; //Our Left Menu element @@ -21,12 +19,12 @@ class LeftMenu extends HTMLElement { processAffinity: 'ps_1' }, { - url: 'https://www.tradingview.com/chart/?symbol=NASDAQ:AAPL', + url: TRADEVIEW_URL, printName: 'TradeView', processAffinity: 'tv_1' }, { - url: 'https://www.google.com/search?q=INDEXDJX:+.DJI&stick=H4sIAAAAAAAAAONgecRozC3w8sc9YSmtSWtOXmNU4eIKzsgvd80rySypFBLjYoOyeKS4uDj0c_UNkgsry3kWsfJ5-rm4Rrh4RVgp6Ll4eQIAqJT5uUkAAAA&source=lnms&sa=X&ved=0ahUKEwii_NWT9fzoAhU3mHIEHWy3AWIQ_AUIDSgA&biw=1280&bih=1366&dpr=1', + url: NEWS_URL, printName: 'News', processAffinity: 'mw_1' }, @@ -36,7 +34,7 @@ class LeftMenu extends HTMLElement { processAffinity: 'cv_1' }, { - url: `https://cdn.openfin.co/docs/javascript/${fin.desktop.getVersion()}`, + url: DOCS_URL, printName: "Documentation", processAffinity: 'ps_1' } @@ -128,6 +126,7 @@ class LeftMenu extends HTMLElement { addView = async (printName) => { const viewOptions = this.appList.find(i => i.printName === printName); + viewOptions.detachOnClose = true; return fin.Platform.getCurrentSync().createView(viewOptions, fin.me.identity); } @@ -202,7 +201,7 @@ class LeftMenu extends HTMLElement { const contentUrl = res.headers.get('Location'); const { manifestUrl } = await fin.Application.getCurrentSync().getInfo(); - const startUrl = `https://openfin.github.io/start/?manifest=${encodeURIComponent(`${manifestUrl}?$$appManifestUrl=${contentUrl}`)}`; + const startUrl = `https://openfin.github.io/start/?manifest=${encodeURIComponent(`https://openfin.github.io/platform-api-project-seed/public.json?$$appManifestUrl=${contentUrl}`)}`; fin.System.openUrlWithBrowser(startUrl); } diff --git a/js/platform-provider.js b/js/platform-provider.js index 91dc30a..9078186 100644 --- a/js/platform-provider.js +++ b/js/platform-provider.js @@ -17,7 +17,7 @@ const externalWindowsToTrack = [ const pooledViews = {}; const createPooledView = async (url) => { console.log('about to create'); - const view = await fin.Platform.getCurrentSync().createView({ url }, fin.me.identity); + const view = await fin.Platform.getCurrentSync().createView({ url, detachOnClose: true }, fin.me.identity); pooledViews[url] = view.identity.name; }; @@ -35,7 +35,8 @@ function modifyContentItemName( function generateViewNameIfNeeded(name, shouldReplace, url) { // either the view has no name OR it is being restored and has a generated name - if(!name || (shouldReplace && name.startsWith('internal-generated-view-'))) { + if(shouldReplace && name.startsWith('internal-generated-view-')) { + console.log('replacing name'); const name = pooledViews[url]; setTimeout(() => createPooledView(url),1); delete pooledViews[url]; @@ -102,9 +103,9 @@ fin.Platform.init({ const originalPromise = super.applySnapshot({ snapshot, options }); //if we have a section with external windows we will use it. - // if (snapshot.externalWindows) { - // await Promise.all(snapshot.externalWindows.map(async (i) => await restoreExternalWindowPositionAndState(i))); - // } + if (snapshot.externalWindows && snapshot.externalWindows.length) { + await Promise.all(snapshot.externalWindows.map(async (i) => await restoreExternalWindowPositionAndState(i))); + } return originalPromise; }