From a227a792c0f7b4661678d199b802a4ef68109431 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 22 May 2024 15:54:01 -0400 Subject: [PATCH 1/9] Replace print redirect with print contentWindow on all pages --- client/homebrew/brewRenderer/brewRenderer.less | 13 +++++++++++++ client/homebrew/navbar/print.navitem.jsx | 7 ++++++- client/homebrew/pages/editPage/editPage.jsx | 6 +++--- client/homebrew/pages/newPage/newPage.jsx | 11 +++-------- client/homebrew/pages/sharePage/sharePage.jsx | 6 +++--- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.less b/client/homebrew/brewRenderer/brewRenderer.less index 0406cad29..ed29047f3 100644 --- a/client/homebrew/brewRenderer/brewRenderer.less +++ b/client/homebrew/brewRenderer/brewRenderer.less @@ -64,3 +64,16 @@ color : white; background-color : #333333; } + +@media print { + .brewRenderer { + height: 100%; + overflow-y: unset; + .pages { + margin: 0px; + &>.page { + box-shadow: unset; + } + } + } +} \ No newline at end of file diff --git a/client/homebrew/navbar/print.navitem.jsx b/client/homebrew/navbar/print.navitem.jsx index 54af0bb41..0bfb62138 100644 --- a/client/homebrew/navbar/print.navitem.jsx +++ b/client/homebrew/navbar/print.navitem.jsx @@ -2,7 +2,12 @@ const React = require('react'); const Nav = require('naturalcrit/nav/nav.jsx'); module.exports = function(props){ - return + const printPage = () => { + if (window.typeof !== 'undefined') + window.frames['BrewRenderer'].contentWindow.print(); + }; + + return get PDF ; }; diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 3e7bd0c2a..b5c82217c 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -11,7 +11,7 @@ const Navbar = require('../../navbar/navbar.jsx'); const NewBrew = require('../../navbar/newbrew.navitem.jsx'); const HelpNavItem = require('../../navbar/help.navitem.jsx'); -const PrintLink = require('../../navbar/print.navitem.jsx'); +const PrintNavItem = require('../../navbar/print.navitem.jsx'); const ErrorNavItem = require('../../navbar/error-navitem.jsx'); const Account = require('../../navbar/account.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; @@ -95,7 +95,7 @@ const EditPage = createClass({ const S_KEY = 83; const P_KEY = 80; if(e.keyCode == S_KEY) this.trySave(true); - if(e.keyCode == P_KEY) window.open(`/print/${this.processShareId()}?dialog=true`, '_blank').focus(); + if(e.keyCode == P_KEY) window.frames['BrewRenderer'].contentWindow.print(); if(e.keyCode == P_KEY || e.keyCode == S_KEY){ e.stopPropagation(); e.preventDefault(); @@ -378,7 +378,7 @@ const EditPage = createClass({ post to reddit - + diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 99a1beb64..85ca62500 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -7,6 +7,7 @@ const request = require('../../utils/request-middleware.js'); const Markdown = require('naturalcrit/markdown.js'); const Nav = require('naturalcrit/nav/nav.jsx'); +const PrintNavItem = require('../../navbar/print.navitem.jsx'); const Navbar = require('../../navbar/navbar.jsx'); const AccountNavItem = require('../../navbar/account.navitem.jsx'); const ErrorNavItem = require('../../navbar/error-navitem.jsx'); @@ -89,7 +90,7 @@ const NewPage = createClass({ const S_KEY = 83; const P_KEY = 80; if(e.keyCode == S_KEY) this.save(); - if(e.keyCode == P_KEY) this.print(); + if(e.keyCode == P_KEY) window.frames['BrewRenderer'].contentWindow.print(); if(e.keyCode == P_KEY || e.keyCode == S_KEY){ e.stopPropagation(); e.preventDefault(); @@ -184,12 +185,6 @@ const NewPage = createClass({ window.open('/print?dialog=true&local=print', '_blank'); }, - renderLocalPrintButton : function(){ - return - get PDF - ; - }, - renderNavbar : function(){ return @@ -202,7 +197,7 @@ const NewPage = createClass({ : this.renderSaveButton() } - {this.renderLocalPrintButton()} + diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 2eab5f34a..ec998a821 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -6,7 +6,7 @@ const { Meta } = require('vitreum/headtags'); const Nav = require('naturalcrit/nav/nav.jsx'); const Navbar = require('../../navbar/navbar.jsx'); const MetadataNav = require('../../navbar/metadata.navitem.jsx'); -const PrintLink = require('../../navbar/print.navitem.jsx'); +const PrintNavItem = require('../../navbar/print.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; const Account = require('../../navbar/account.navitem.jsx'); @@ -35,7 +35,7 @@ const SharePage = createClass({ if(!(e.ctrlKey || e.metaKey)) return; const P_KEY = 80; if(e.keyCode == P_KEY){ - window.open(`/print/${this.processShareId()}?dialog=true`, '_blank').focus(); + if(e.keyCode == P_KEY) window.frames['BrewRenderer'].contentWindow.print(); e.stopPropagation(); e.preventDefault(); } @@ -72,7 +72,7 @@ const SharePage = createClass({ {this.props.brew.shareId && <> - + source From 24769d69d42b64c8d9fbb671dbb7a63a5dd2b4c2 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 23 May 2024 17:08:24 -0400 Subject: [PATCH 2/9] Force browser repaint after closing Print dialog --- .../homebrew/brewRenderer/brewRenderer.less | 2 +- client/homebrew/navbar/print.navitem.jsx | 9 ++------- client/homebrew/pages/editPage/editPage.jsx | 15 +++++++++++++-- client/homebrew/pages/newPage/newPage.jsx | 19 +++++++++++++------ client/homebrew/pages/sharePage/sharePage.jsx | 15 +++++++++++++-- 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.less b/client/homebrew/brewRenderer/brewRenderer.less index ed29047f3..28ea8005e 100644 --- a/client/homebrew/brewRenderer/brewRenderer.less +++ b/client/homebrew/brewRenderer/brewRenderer.less @@ -72,7 +72,7 @@ .pages { margin: 0px; &>.page { - box-shadow: unset; + box-shadow: unset; } } } diff --git a/client/homebrew/navbar/print.navitem.jsx b/client/homebrew/navbar/print.navitem.jsx index 0bfb62138..42b47b88e 100644 --- a/client/homebrew/navbar/print.navitem.jsx +++ b/client/homebrew/navbar/print.navitem.jsx @@ -1,13 +1,8 @@ const React = require('react'); const Nav = require('naturalcrit/nav/nav.jsx'); -module.exports = function(props){ - const printPage = () => { - if (window.typeof !== 'undefined') - window.frames['BrewRenderer'].contentWindow.print(); - }; - - return +module.exports = function({printFunction}){ + return get PDF ; }; diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index b5c82217c..dfce74e48 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -95,13 +95,24 @@ const EditPage = createClass({ const S_KEY = 83; const P_KEY = 80; if(e.keyCode == S_KEY) this.trySave(true); - if(e.keyCode == P_KEY) window.frames['BrewRenderer'].contentWindow.print(); + if(e.keyCode == P_KEY) this.printPage(); if(e.keyCode == P_KEY || e.keyCode == S_KEY){ e.stopPropagation(); e.preventDefault(); } }, + printPage : function(){ + if (window.typeof !== 'undefined') { + window.frames['BrewRenderer'].contentWindow.print(); + //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear + let node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); + node.style.display='none'; + node.offsetHeight; // accessing this is enough to trigger a reflow + node.style.display=''; + } + }, + handleSplitMove : function(){ this.editor.current.update(); }, @@ -378,7 +389,7 @@ const EditPage = createClass({ post to reddit - + diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 85ca62500..85303ae2d 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -90,13 +90,24 @@ const NewPage = createClass({ const S_KEY = 83; const P_KEY = 80; if(e.keyCode == S_KEY) this.save(); - if(e.keyCode == P_KEY) window.frames['BrewRenderer'].contentWindow.print(); + if(e.keyCode == P_KEY) this.printPage(); if(e.keyCode == P_KEY || e.keyCode == S_KEY){ e.stopPropagation(); e.preventDefault(); } }, + printPage : function(){ + if (window.typeof !== 'undefined') { + window.frames['BrewRenderer'].contentWindow.print(); + //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear + let node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); + node.style.display='none'; + node.offsetHeight; // accessing this is enough to trigger a reflow + node.style.display=''; + } + }, + handleSplitMove : function(){ this.editor.current.update(); }, @@ -181,10 +192,6 @@ const NewPage = createClass({ } }, - print : function(){ - window.open('/print?dialog=true&local=print', '_blank'); - }, - renderNavbar : function(){ return @@ -197,7 +204,7 @@ const NewPage = createClass({ : this.renderSaveButton() } - + diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index ec998a821..dccea796c 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -35,12 +35,23 @@ const SharePage = createClass({ if(!(e.ctrlKey || e.metaKey)) return; const P_KEY = 80; if(e.keyCode == P_KEY){ - if(e.keyCode == P_KEY) window.frames['BrewRenderer'].contentWindow.print(); + if(e.keyCode == P_KEY) this.printPage(); e.stopPropagation(); e.preventDefault(); } }, + printPage : function(){ + if (window.typeof !== 'undefined') { + window.frames['BrewRenderer'].contentWindow.print(); + //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear + let node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); + node.style.display='none'; + node.offsetHeight; // accessing this is enough to trigger a reflow + node.style.display=''; + } + }, + processShareId : function() { return this.props.brew.googleId && !this.props.brew.stubbed ? this.props.brew.googleId + this.props.brew.shareId : @@ -72,7 +83,7 @@ const SharePage = createClass({ {this.props.brew.shareId && <> - + source From 4ce68b86ed40cf7c34aab455cc590b7d6d2d7e1a Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 23 May 2024 17:09:03 -0400 Subject: [PATCH 3/9] Fix hotkey printing on focused iframe --- client/homebrew/brewRenderer/brewRenderer.jsx | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 38d7454a4..5445292ec 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -159,6 +159,27 @@ const BrewRenderer = (props)=>{ return renderedPages; }; + const handleControlKeys = (e)=>{ + if(!(e.ctrlKey || e.metaKey)) return; + const P_KEY = 80; + if(e.keyCode == P_KEY) printPage(); + if(e.keyCode == P_KEY) { + e.stopPropagation(); + e.preventDefault(); + } + }; + + const printPage = ()=>{ + if (window.typeof !== 'undefined') { + window.frames['BrewRenderer'].contentWindow.print(); + //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear + let node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); + node.style.display='none'; + node.offsetHeight; // accessing this is enough to trigger a reflow + node.style.display=''; + } + }; + const frameDidMount = ()=>{ //This triggers when iFrame finishes internal "componentDidMount" setTimeout(()=>{ //We still see a flicker where the style isn't applied yet, so wait 100ms before showing iFrame updateSize(); @@ -200,6 +221,8 @@ const BrewRenderer = (props)=>{ >
From e396211f9297bd439573e9ec1c7ac8bacdeb6b39 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 23 May 2024 17:13:44 -0400 Subject: [PATCH 4/9] remove duplicate button --- client/homebrew/pages/newPage/newPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 85303ae2d..d28ccc697 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -204,7 +204,7 @@ const NewPage = createClass({ : this.renderSaveButton() } - + From ac3168e3651c0efcc5fbdf8f4831c92f24ae49a5 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 24 May 2024 19:28:02 -0400 Subject: [PATCH 5/9] Move "printPage()" to `helpers.js` for reuse in multiple pages --- client/homebrew/brewRenderer/brewRenderer.jsx | 12 +----------- client/homebrew/navbar/print.navitem.jsx | 5 +++-- client/homebrew/pages/editPage/editPage.jsx | 16 +++------------- client/homebrew/pages/newPage/newPage.jsx | 16 +++------------- client/homebrew/pages/sharePage/sharePage.jsx | 18 +++--------------- shared/helpers.js | 16 ++++++++++++++-- 6 files changed, 27 insertions(+), 56 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 5445292ec..571790391 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -13,6 +13,7 @@ const RenderWarnings = require('homebrewery/renderWarnings/renderWarnings.jsx'); const NotificationPopup = require('./notificationPopup/notificationPopup.jsx'); const Frame = require('react-frame-component').default; const dedent = require('dedent-tabs').default; +const { printPage } = require('../../../shared/helpers.js'); const DOMPurify = require('dompurify'); const purifyConfig = { FORCE_BODY: true, SANITIZE_DOM: false }; @@ -169,17 +170,6 @@ const BrewRenderer = (props)=>{ } }; - const printPage = ()=>{ - if (window.typeof !== 'undefined') { - window.frames['BrewRenderer'].contentWindow.print(); - //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear - let node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); - node.style.display='none'; - node.offsetHeight; // accessing this is enough to trigger a reflow - node.style.display=''; - } - }; - const frameDidMount = ()=>{ //This triggers when iFrame finishes internal "componentDidMount" setTimeout(()=>{ //We still see a flicker where the style isn't applied yet, so wait 100ms before showing iFrame updateSize(); diff --git a/client/homebrew/navbar/print.navitem.jsx b/client/homebrew/navbar/print.navitem.jsx index 42b47b88e..a573b1069 100644 --- a/client/homebrew/navbar/print.navitem.jsx +++ b/client/homebrew/navbar/print.navitem.jsx @@ -1,8 +1,9 @@ const React = require('react'); const Nav = require('naturalcrit/nav/nav.jsx'); +const { printPage } = require('../../../shared/helpers.js'); -module.exports = function({printFunction}){ - return +module.exports = function(){ + return get PDF ; }; diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index dfce74e48..0774efaa2 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -23,6 +23,7 @@ const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); const Markdown = require('naturalcrit/markdown.js'); const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js'); +const { printPage } = require('../../../../shared/helpers.js'); const googleDriveIcon = require('../../googleDrive.svg'); @@ -95,24 +96,13 @@ const EditPage = createClass({ const S_KEY = 83; const P_KEY = 80; if(e.keyCode == S_KEY) this.trySave(true); - if(e.keyCode == P_KEY) this.printPage(); + if(e.keyCode == P_KEY) printPage(); if(e.keyCode == P_KEY || e.keyCode == S_KEY){ e.stopPropagation(); e.preventDefault(); } }, - printPage : function(){ - if (window.typeof !== 'undefined') { - window.frames['BrewRenderer'].contentWindow.print(); - //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear - let node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); - node.style.display='none'; - node.offsetHeight; // accessing this is enough to trigger a reflow - node.style.display=''; - } - }, - handleSplitMove : function(){ this.editor.current.update(); }, @@ -389,7 +379,7 @@ const EditPage = createClass({ post to reddit - + diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index d28ccc697..5c8f4ad73 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -19,6 +19,7 @@ const Editor = require('../../editor/editor.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); const { DEFAULT_BREW } = require('../../../../server/brewDefaults.js'); +const { printPage } = require('../../../../shared/helpers.js'); const BREWKEY = 'homebrewery-new'; const STYLEKEY = 'homebrewery-new-style'; @@ -90,24 +91,13 @@ const NewPage = createClass({ const S_KEY = 83; const P_KEY = 80; if(e.keyCode == S_KEY) this.save(); - if(e.keyCode == P_KEY) this.printPage(); + if(e.keyCode == P_KEY) printPage(); if(e.keyCode == P_KEY || e.keyCode == S_KEY){ e.stopPropagation(); e.preventDefault(); } }, - printPage : function(){ - if (window.typeof !== 'undefined') { - window.frames['BrewRenderer'].contentWindow.print(); - //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear - let node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); - node.style.display='none'; - node.offsetHeight; // accessing this is enough to trigger a reflow - node.style.display=''; - } - }, - handleSplitMove : function(){ this.editor.current.update(); }, @@ -204,7 +194,7 @@ const NewPage = createClass({ : this.renderSaveButton() } - + diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index dccea796c..a8a52bf2a 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -9,11 +9,10 @@ const MetadataNav = require('../../navbar/metadata.navitem.jsx'); const PrintNavItem = require('../../navbar/print.navitem.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; const Account = require('../../navbar/account.navitem.jsx'); - - const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js'); +const { printPage } = require('../../../../shared/helpers.js'); const SharePage = createClass({ displayName : 'SharePage', @@ -35,23 +34,12 @@ const SharePage = createClass({ if(!(e.ctrlKey || e.metaKey)) return; const P_KEY = 80; if(e.keyCode == P_KEY){ - if(e.keyCode == P_KEY) this.printPage(); + if(e.keyCode == P_KEY) printPage(); e.stopPropagation(); e.preventDefault(); } }, - printPage : function(){ - if (window.typeof !== 'undefined') { - window.frames['BrewRenderer'].contentWindow.print(); - //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear - let node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); - node.style.display='none'; - node.offsetHeight; // accessing this is enough to trigger a reflow - node.style.display=''; - } - }, - processShareId : function() { return this.props.brew.googleId && !this.props.brew.stubbed ? this.props.brew.googleId + this.props.brew.shareId : @@ -83,7 +71,7 @@ const SharePage = createClass({ {this.props.brew.shareId && <> - + source diff --git a/shared/helpers.js b/shared/helpers.js index 42dd09e3f..680df94fe 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -17,6 +17,18 @@ const splitTextStyleAndMetadata = (brew)=>{ } }; -module.exports = { - splitTextStyleAndMetadata +const printPage = ()=>{ + if (window.typeof !== 'undefined') { + window.frames['BrewRenderer'].contentWindow.print(); + //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear + let node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); + node.style.display='none'; + node.offsetHeight; // accessing this is enough to trigger a reflow + node.style.display=''; + } +}; + +module.exports = { + splitTextStyleAndMetadata, + printPage }; From 695b9916dd1563d71a3b9bcdb00ec3a6c18fcd1d Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 28 May 2024 12:39:43 -0400 Subject: [PATCH 6/9] Remove old /print page --- client/homebrew/homebrew.jsx | 20 +--- client/homebrew/pages/hijackPrint.js | 12 -- client/homebrew/pages/printPage/printPage.jsx | 112 ------------------ .../homebrew/pages/printPage/printPage.less | 3 - server/app.js | 7 -- 5 files changed, 3 insertions(+), 151 deletions(-) delete mode 100644 client/homebrew/pages/hijackPrint.js delete mode 100644 client/homebrew/pages/printPage/printPage.jsx delete mode 100644 client/homebrew/pages/printPage/printPage.less diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index 8c82f33e7..2489bc1ca 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -10,7 +10,6 @@ const UserPage = require('./pages/userPage/userPage.jsx'); const SharePage = require('./pages/sharePage/sharePage.jsx'); const NewPage = require('./pages/newPage/newPage.jsx'); const ErrorPage = require('./pages/errorPage/errorPage.jsx'); -const PrintPage = require('./pages/printPage/printPage.jsx'); const AccountPage = require('./pages/accountPage/accountPage.jsx'); const WithRoute = (props)=>{ @@ -72,15 +71,13 @@ const Homebrew = createClass({ } /> } /> } /> - } /> - } /> } /> } /> } /> } /> } /> - } /> - } /> + } /> + } />
@@ -88,15 +85,4 @@ const Homebrew = createClass({ } }); -module.exports = Homebrew; - -//TODO: Nicer Error page instead of just "cant get that" -// '/share/:id' : (args)=>{ -// if(!this.props.brew.shareId){ -// return ; -// } -// -// return ; -// }, +module.exports = Homebrew; \ No newline at end of file diff --git a/client/homebrew/pages/hijackPrint.js b/client/homebrew/pages/hijackPrint.js deleted file mode 100644 index c59076413..000000000 --- a/client/homebrew/pages/hijackPrint.js +++ /dev/null @@ -1,12 +0,0 @@ -//TODO: Depricate - -module.exports = function(shareId){ - return function(event){ - event = event || window.event; - if((event.ctrlKey || event.metaKey) && event.keyCode == 80){ - const win = window.open(`/homebrew/print/${shareId}?dialog=true`, '_blank'); - win.focus(); - event.preventDefault(); - } - }; -}; \ No newline at end of file diff --git a/client/homebrew/pages/printPage/printPage.jsx b/client/homebrew/pages/printPage/printPage.jsx deleted file mode 100644 index 7cda5d8c0..000000000 --- a/client/homebrew/pages/printPage/printPage.jsx +++ /dev/null @@ -1,112 +0,0 @@ -require('./printPage.less'); -const React = require('react'); -const createClass = require('create-react-class'); -const _ = require('lodash'); -const { Meta } = require('vitreum/headtags'); -const MarkdownLegacy = require('naturalcrit/markdownLegacy.js'); -const Markdown = require('naturalcrit/markdown.js'); - -const Themes = require('themes/themes.json'); - -const BREWKEY = 'homebrewery-new'; -const STYLEKEY = 'homebrewery-new-style'; -const METAKEY = 'homebrewery-new-meta'; - -const PrintPage = createClass({ - displayName : 'PrintPage', - getDefaultProps : function() { - return { - query : {}, - brew : { - text : '', - style : '', - renderer : 'legacy', - lang : '' - } - }; - }, - - getInitialState : function() { - return { - brew : { - text : this.props.brew.text || '', - style : this.props.brew.style || undefined, - renderer : this.props.brew.renderer || 'legacy', - theme : this.props.brew.theme || '5ePHB', - lang : this.props.brew.lang || 'en' - } - }; - }, - - componentDidMount : function() { - if(this.props.query.local == 'print'){ - const brewStorage = localStorage.getItem(BREWKEY); - const styleStorage = localStorage.getItem(STYLEKEY); - const metaStorage = JSON.parse(localStorage.getItem(METAKEY)); - - this.setState((prevState, prevProps)=>{ - return { - brew : { - text : brewStorage, - style : styleStorage, - renderer : metaStorage?.renderer || 'legacy', - theme : metaStorage?.theme || '5ePHB', - lang : metaStorage?.lang || 'en' - } - }; - }); - } - - if(this.props.query.dialog) window.print(); - }, - - renderStyle : function() { - if(!this.state.brew.style) return; - //return
@layer styleTab {\n${this.state.brew.style}\n} ` }} />; - return
\n${this.state.brew.style}\n` }} />; - }, - - renderPages : function(){ - if(this.state.brew.renderer == 'legacy') { - return _.map(this.state.brew.text.split('\\page'), (pageText, index)=>{ - return
; - }); - } else { - return _.map(this.state.brew.text.split(/^\\page$/gm), (pageText, index)=>{ - pageText += `\n\n \n\\column\n `; //Artificial column break at page end to emulate column-fill:auto (until `wide` is used, when column-fill:balance will reappear) - return ( -
-
-
- ); - }); - } - - }, - - render : function(){ - const rendererPath = this.state.brew.renderer == 'V3' ? 'V3' : 'Legacy'; - const themePath = this.state.brew.theme ?? '5ePHB'; - const baseThemePath = Themes[rendererPath][themePath].baseTheme; - - return
- - - {baseThemePath && - - } - - {/* Apply CSS from Style tab */} - {this.renderStyle()} -
- {this.renderPages()} -
-
; - } -}); - -module.exports = PrintPage; diff --git a/client/homebrew/pages/printPage/printPage.less b/client/homebrew/pages/printPage/printPage.less deleted file mode 100644 index 0d9e7b68b..000000000 --- a/client/homebrew/pages/printPage/printPage.less +++ /dev/null @@ -1,3 +0,0 @@ -.printPage{ - -} \ No newline at end of file diff --git a/server/app.js b/server/app.js index a08ab4404..e26c98f54 100644 --- a/server/app.js +++ b/server/app.js @@ -331,13 +331,6 @@ app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, r return next(); })); -//Print Page -app.get('/print/:id', asyncHandler(getBrew('share')), (req, res, next)=>{ - sanitizeBrew(req.brew, 'share'); - splitTextStyleAndMetadata(req.brew); - next(); -}); - //Account Page app.get('/account', asyncHandler(async (req, res, next)=>{ const data = {}; From b4349a0476266189875445b9832195c9fdcc45ce Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 28 May 2024 12:51:58 -0400 Subject: [PATCH 7/9] iframe hotkey printing only works in Edit/Share/New Default browser printing still works --- client/homebrew/brewRenderer/brewRenderer.jsx | 2 +- client/homebrew/pages/editPage/editPage.jsx | 1 + client/homebrew/pages/newPage/newPage.jsx | 1 + client/homebrew/pages/sharePage/sharePage.jsx | 8 +++++++- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 571790391..624bc2aeb 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -163,7 +163,7 @@ const BrewRenderer = (props)=>{ const handleControlKeys = (e)=>{ if(!(e.ctrlKey || e.metaKey)) return; const P_KEY = 80; - if(e.keyCode == P_KEY) printPage(); + if(e.keyCode == P_KEY && props.allowPrint) printPage(); if(e.keyCode == P_KEY) { e.stopPropagation(); e.preventDefault(); diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 0774efaa2..0b3c10a57 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -411,6 +411,7 @@ const EditPage = createClass({ errors={this.state.htmlErrors} lang={this.state.brew.lang} currentEditorPage={this.state.currentEditorPage} + allowPrint={true} />
diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 5c8f4ad73..8c785de0a 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -223,6 +223,7 @@ const NewPage = createClass({ errors={this.state.htmlErrors} lang={this.state.brew.lang} currentEditorPage={this.state.currentEditorPage} + allowPrint={true} />
diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index a8a52bf2a..d29308b4e 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -94,7 +94,13 @@ const SharePage = createClass({
- +
; } From 01d60c452092d0d3944b97dd0712f1ea95e32562 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 28 May 2024 13:22:33 -0400 Subject: [PATCH 8/9] lint --- shared/helpers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/helpers.js b/shared/helpers.js index 680df94fe..724832485 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -18,10 +18,10 @@ const splitTextStyleAndMetadata = (brew)=>{ }; const printPage = ()=>{ - if (window.typeof !== 'undefined') { + if(window.typeof !== 'undefined') { window.frames['BrewRenderer'].contentWindow.print(); //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear - let node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); + const node = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0); node.style.display='none'; node.offsetHeight; // accessing this is enough to trigger a reflow node.style.display=''; From 8a55658bd743fae00bf3243323ef10d8577817d9 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 28 May 2024 16:11:18 -0400 Subject: [PATCH 9/9] Rename `printPage` function to `printCurrentBrew()` Avoid confusion with other "page" components. --- client/homebrew/brewRenderer/brewRenderer.jsx | 4 ++-- client/homebrew/navbar/print.navitem.jsx | 4 ++-- client/homebrew/pages/editPage/editPage.jsx | 4 ++-- client/homebrew/pages/newPage/newPage.jsx | 4 ++-- client/homebrew/pages/sharePage/sharePage.jsx | 4 ++-- shared/helpers.js | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 624bc2aeb..6a4040b4d 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -13,7 +13,7 @@ const RenderWarnings = require('homebrewery/renderWarnings/renderWarnings.jsx'); const NotificationPopup = require('./notificationPopup/notificationPopup.jsx'); const Frame = require('react-frame-component').default; const dedent = require('dedent-tabs').default; -const { printPage } = require('../../../shared/helpers.js'); +const { printCurrentBrew } = require('../../../shared/helpers.js'); const DOMPurify = require('dompurify'); const purifyConfig = { FORCE_BODY: true, SANITIZE_DOM: false }; @@ -163,7 +163,7 @@ const BrewRenderer = (props)=>{ const handleControlKeys = (e)=>{ if(!(e.ctrlKey || e.metaKey)) return; const P_KEY = 80; - if(e.keyCode == P_KEY && props.allowPrint) printPage(); + if(e.keyCode == P_KEY && props.allowPrint) printCurrentBrew(); if(e.keyCode == P_KEY) { e.stopPropagation(); e.preventDefault(); diff --git a/client/homebrew/navbar/print.navitem.jsx b/client/homebrew/navbar/print.navitem.jsx index a573b1069..f80c1aa66 100644 --- a/client/homebrew/navbar/print.navitem.jsx +++ b/client/homebrew/navbar/print.navitem.jsx @@ -1,9 +1,9 @@ const React = require('react'); const Nav = require('naturalcrit/nav/nav.jsx'); -const { printPage } = require('../../../shared/helpers.js'); +const { printCurrentBrew } = require('../../../shared/helpers.js'); module.exports = function(){ - return + return get PDF ; }; diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 0b3c10a57..20282f9b5 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -23,7 +23,7 @@ const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); const Markdown = require('naturalcrit/markdown.js'); const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js'); -const { printPage } = require('../../../../shared/helpers.js'); +const { printCurrentBrew } = require('../../../../shared/helpers.js'); const googleDriveIcon = require('../../googleDrive.svg'); @@ -96,7 +96,7 @@ const EditPage = createClass({ const S_KEY = 83; const P_KEY = 80; if(e.keyCode == S_KEY) this.trySave(true); - if(e.keyCode == P_KEY) printPage(); + if(e.keyCode == P_KEY) printCurrentBrew(); if(e.keyCode == P_KEY || e.keyCode == S_KEY){ e.stopPropagation(); e.preventDefault(); diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 8c785de0a..f2525c425 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -19,7 +19,7 @@ const Editor = require('../../editor/editor.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); const { DEFAULT_BREW } = require('../../../../server/brewDefaults.js'); -const { printPage } = require('../../../../shared/helpers.js'); +const { printCurrentBrew } = require('../../../../shared/helpers.js'); const BREWKEY = 'homebrewery-new'; const STYLEKEY = 'homebrewery-new-style'; @@ -91,7 +91,7 @@ const NewPage = createClass({ const S_KEY = 83; const P_KEY = 80; if(e.keyCode == S_KEY) this.save(); - if(e.keyCode == P_KEY) printPage(); + if(e.keyCode == P_KEY) printCurrentBrew(); if(e.keyCode == P_KEY || e.keyCode == S_KEY){ e.stopPropagation(); e.preventDefault(); diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index d29308b4e..9695ee810 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -12,7 +12,7 @@ const Account = require('../../navbar/account.navitem.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js'); -const { printPage } = require('../../../../shared/helpers.js'); +const { printCurrentBrew } = require('../../../../shared/helpers.js'); const SharePage = createClass({ displayName : 'SharePage', @@ -34,7 +34,7 @@ const SharePage = createClass({ if(!(e.ctrlKey || e.metaKey)) return; const P_KEY = 80; if(e.keyCode == P_KEY){ - if(e.keyCode == P_KEY) printPage(); + if(e.keyCode == P_KEY) printCurrentBrew(); e.stopPropagation(); e.preventDefault(); } diff --git a/shared/helpers.js b/shared/helpers.js index 724832485..8ca185046 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -17,7 +17,7 @@ const splitTextStyleAndMetadata = (brew)=>{ } }; -const printPage = ()=>{ +const printCurrentBrew = ()=>{ if(window.typeof !== 'undefined') { window.frames['BrewRenderer'].contentWindow.print(); //Force DOM reflow; Print dialog causes a repaint, and @media print CSS somehow makes out-of-view pages disappear @@ -30,5 +30,5 @@ const printPage = ()=>{ module.exports = { splitTextStyleAndMetadata, - printPage + printCurrentBrew };