From 80bade29481d95dbe2cc922e19defabac86e4cc5 Mon Sep 17 00:00:00 2001 From: Piotr Zarzycki Date: Mon, 27 May 2024 18:39:36 +0200 Subject: [PATCH 1/4] Fixed issue where link to Nomad wasn't working for collapse Button (reference #53) --- .../mediator/bookmarks/MediatorBookmarks.as | 31 ++++++++++++++----- .../view/bookmarks/Bookmark.mxml | 3 +- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/mediator/bookmarks/MediatorBookmarks.as b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/mediator/bookmarks/MediatorBookmarks.as index 4cdcbd5..a19ef40 100644 --- a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/mediator/bookmarks/MediatorBookmarks.as +++ b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/mediator/bookmarks/MediatorBookmarks.as @@ -23,8 +23,7 @@ package mediator.bookmarks import view.applications.ConfigurationAppDetails; import view.bookmarks.Bookmark; import view.bookmarks.event.BookmarkEvent; - import org.apache.royale.net.navigateToURL; - import org.apache.royale.net.URLRequest; + import view.controls.LinkWithDescriptionAppButton; public class MediatorBookmarks extends Mediator implements IMediator { @@ -183,21 +182,37 @@ package mediator.bookmarks var listCount:int = view.bookmarksList.numElements - 1; for (var i:int = listCount; i >= 0; i--) { - var bookmarkItem:Object = view.bookmarksList.getElementAt(i); - bookmarkItem.removeEventListener(BookmarkEvent.EDIT_BOOKMARK, onModifyBookmark); - bookmarkItem.removeEventListener(BookmarkEvent.DELETE_BOOKMARK, onModifyBookmark); - bookmarkItem.removeEventListener("initComplete", onBookmarkInitComplete); - - view.bookmarksList.removeElement(bookmarkItem); + var bookmarkView:Object = view.bookmarksList.getElementAt(i); + bookmarkView.removeEventListener(BookmarkEvent.EDIT_BOOKMARK, onModifyBookmark); + bookmarkView.removeEventListener(BookmarkEvent.DELETE_BOOKMARK, onModifyBookmark); + bookmarkView.removeEventListener("initComplete", onBookmarkInitComplete); + if (bookmarkView.bookmark.defaultAction == "nomad") + { + bookmarkView.linkWithDesc.removeEventListener("linkClick", onOpenInNomadLink); + } + bookmarkView.configurationDetails.openInNomad.removeEventListener(MouseEvent.CLICK, onOpenNomadWeb); + + view.bookmarksList.removeElement(bookmarkView); } } private function onBookmarkInitComplete(event:Event):void { var bookmarkView:Bookmark = event.currentTarget as Bookmark; + if (bookmarkView.bookmark.defaultAction == "nomad") + { + bookmarkView.linkWithDesc.addEventListener("linkClick", onOpenInNomadLink); + } bookmarkView.configurationDetails.openInNomad.addEventListener(MouseEvent.CLICK, onOpenNomadWeb); } + private function onOpenInNomadLink(event:Event):void + { + var link:LinkWithDescriptionAppButton = event.currentTarget as LinkWithDescriptionAppButton; + + sendNotification(ApplicationConstants.COMMAND_LAUNCH_NOMAD_LINK, {name: link.appName, link: link.nomadURL}); + } + private function onOpenNomadWeb(event:MouseEvent):void { event.preventDefault(); diff --git a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/bookmarks/Bookmark.mxml b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/bookmarks/Bookmark.mxml index ee54935..f102aae 100644 --- a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/bookmarks/Bookmark.mxml +++ b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/bookmarks/Bookmark.mxml @@ -90,7 +90,8 @@ - + Date: Mon, 27 May 2024 20:19:24 +0200 Subject: [PATCH 2/4] Displaying message to the user when popup is blocked during opening nomad link (reference #53) --- .../controller/CommandLaunchNomadLink.as | 8 +- .../SnackbarNomadPopupBlocked.as | 25 ++++++ .../SnackbarNomadPopupBlockedContent.mxml | 43 ++++++++++ .../beads/SnackbarNomadPopupBlockedView.as | 84 +++++++++++++++++++ .../src/resources/app-styles.css | 6 ++ 5 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/SnackbarNomadPopupBlocked.as create mode 100644 Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/SnackbarNomadPopupBlockedContent.mxml create mode 100644 Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/beads/SnackbarNomadPopupBlockedView.as diff --git a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/controller/CommandLaunchNomadLink.as b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/controller/CommandLaunchNomadLink.as index 99eeba4..b07b1d5 100644 --- a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/controller/CommandLaunchNomadLink.as +++ b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/controller/CommandLaunchNomadLink.as @@ -12,6 +12,7 @@ package controller import org.puremvc.as3.multicore.patterns.command.SimpleCommand; import view.controls.snackbarNomadHelperUrl.SnackbarNomadHelperUrl; + import view.controls.snackbarNomadHelperUrl.SnackbarNomadPopupBlocked; /** * This is a workaround to open a Nomad link directly in an existing Nomad tab by using the Nomad service worker. @@ -65,7 +66,7 @@ package controller } catch(error:Error) { - + SnackbarNomadPopupBlocked.show(); } data = null; @@ -80,6 +81,7 @@ package controller // Retrieve the configred nomadhelper.html URL var loginProxy:ProxyLogin = facade.retrieveProxy(ProxyLogin.NAME) as ProxyLogin; var nomadHelperUrl:String = loginProxy.config.config.nomad_helper_url; + var nomadBaseUrl:String = loginProxy.config.config.nomad_base_url; // Cancel any later messages - not expected window["onmessage"] = null; @@ -105,9 +107,9 @@ package controller { navigateToURL(new URLRequest(data.link), "_blank"); } - catch(e:Error) + catch(error:Error) { - + SnackbarNomadPopupBlocked.show(); } } else if (successIndex > -1) diff --git a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/SnackbarNomadPopupBlocked.as b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/SnackbarNomadPopupBlocked.as new file mode 100644 index 0000000..8b2283d --- /dev/null +++ b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/SnackbarNomadPopupBlocked.as @@ -0,0 +1,25 @@ +package view.controls.snackbarNomadHelperUrl +{ + import org.apache.royale.jewel.Snackbar; + + public class SnackbarNomadPopupBlocked extends Snackbar + { + public function SnackbarNomadPopupBlocked() + { + super(); + + this.typeNames = "jewel snackbar layout SnackbarNomadPopupBlocked"; + } + + public static function show(message:String = "", parent:Object = null):SnackbarNomadPopupBlocked + { + var snackbar:SnackbarNomadPopupBlocked = new SnackbarNomadPopupBlocked(); + snackbar.message = message; + snackbar.duration = 0; + snackbar.action = "Close"; + + snackbar.show(parent); + return snackbar; + } + } +} \ No newline at end of file diff --git a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/SnackbarNomadPopupBlockedContent.mxml b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/SnackbarNomadPopupBlockedContent.mxml new file mode 100644 index 0000000..e1666cf --- /dev/null +++ b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/SnackbarNomadPopupBlockedContent.mxml @@ -0,0 +1,43 @@ + + + + ' + result.pop() + ''; + } + else + { + allowMessage.text = "Always allow pop-ups from this site."; + } + } + ]]> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/beads/SnackbarNomadPopupBlockedView.as b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/beads/SnackbarNomadPopupBlockedView.as new file mode 100644 index 0000000..95fd21e --- /dev/null +++ b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/view/controls/snackbarNomadHelperUrl/beads/SnackbarNomadPopupBlockedView.as @@ -0,0 +1,84 @@ +package view.controls.snackbarNomadHelperUrl.beads +{ + import org.apache.royale.core.IStrand; + import org.apache.royale.events.Event; + import org.apache.royale.html.elements.Div; + import org.apache.royale.jewel.Snackbar; + import org.apache.royale.jewel.beads.models.SnackbarModel; + import org.apache.royale.jewel.beads.views.SnackbarView; + + import view.controls.snackbarNomadHelperUrl.SnackbarNomadPopupBlockedContent; + + public class SnackbarNomadPopupBlockedView extends SnackbarView + { + public function SnackbarNomadPopupBlockedView() + { + super(); + } + + override public function set strand(value:IStrand):void + { + super.strand = value; + + var model:SnackbarNomadHelperUrlModel = host.model as SnackbarNomadHelperUrlModel; + model.addEventListener("messageChange", messageChangeHandler); + model.addEventListener("actionChange", actionChangeHandler); + + var content:NodeList = host.element.getElementsByClassName("snackbar-content"); + host.element.removeChild(content.item(0)); + + var snackbarMessage:SnackbarNomadPopupBlockedContent = new SnackbarNomadPopupBlockedContent(); + snackbarMessage.className = "jewel snackbar-message"; + + var snackbarContent:Div = new Div(); + snackbarContent.className = "jewel snackbar-content"; + snackbarContent.addElement(snackbarMessage); + host.addElement(snackbarContent); + + this.actionElement = null; + if (model.action) + { + actionChangeHandler(null); + } + } + + /** + * Update the text when message changed. + */ + override protected function messageChangeHandler(event:Event):void { + + } + + /** + * Show the action element or remove it, based on action text. + */ + override protected function actionChangeHandler(event:Event):void { + var model:SnackbarModel = host.model as SnackbarModel; + + if (model.action) { + if (!actionElement) { + actionElement = document.createElement("div"); + actionElement.className = "jewel snackbar-action"; + actionElement.addEventListener("click", actionClickHandler); + host.element.firstChild.appendChild(actionElement); + } + actionElement.innerText = model.action; + } else { + if (actionElement) { + actionElement.removeEventListener("click", actionClickHandler); + host.element.firstChild.removeChild(actionElement); + actionElement = null; + } + } + } + + /** + * Trigger event and dismiss the host when action clicked. + */ + override protected function actionClickHandler(event:Event):void { + actionElement.removeEventListener("click", actionClickHandler); + host.dispatchEvent(new Event(Snackbar.ACTION)); + SnackbarModel(host.model).duration = -1; // set -1 to dismiss + } + } +} \ No newline at end of file diff --git a/Super.Human.Portal_Royale/src/resources/app-styles.css b/Super.Human.Portal_Royale/src/resources/app-styles.css index e8209d1..01280ed 100644 --- a/Super.Human.Portal_Royale/src/resources/app-styles.css +++ b/Super.Human.Portal_Royale/src/resources/app-styles.css @@ -265,6 +265,12 @@ controlsSnackbarNomad|SnackbarNomadHelperUrl { IBeadView: ClassReference("view.controls.snackbarNomadHelperUrl.beads.SnackbarNomadHelperUrlView"); } +controlsSnackbarNomad|SnackbarNomadPopupBlocked { + IBeadModel: ClassReference("view.controls.snackbarNomadHelperUrl.beads.SnackbarNomadHelperUrlModel"); + IBeadController: ClassReference("org.apache.royale.jewel.beads.controllers.SnackbarController"); + IBeadView: ClassReference("view.controls.snackbarNomadHelperUrl.beads.SnackbarNomadPopupBlockedView"); +} + .jewel.slider.noSliderInput input { visibility: hidden; margin: 0px !important; From a8ca6d4b8c657691eac21c653c910ff192bba514 Mon Sep 17 00:00:00 2001 From: Piotr Zarzycki Date: Wed, 29 May 2024 11:45:00 +0200 Subject: [PATCH 3/4] Fix NPE during switching between Bookmarks groups (reference #53 ) --- .../mediator/bookmarks/MediatorBookmarks.as | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/mediator/bookmarks/MediatorBookmarks.as b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/mediator/bookmarks/MediatorBookmarks.as index a19ef40..6c70817 100644 --- a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/mediator/bookmarks/MediatorBookmarks.as +++ b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/mediator/bookmarks/MediatorBookmarks.as @@ -182,15 +182,19 @@ package mediator.bookmarks var listCount:int = view.bookmarksList.numElements - 1; for (var i:int = listCount; i >= 0; i--) { - var bookmarkView:Object = view.bookmarksList.getElementAt(i); + var bookmarkView:Bookmark = view.bookmarksList.getElementAt(i); bookmarkView.removeEventListener(BookmarkEvent.EDIT_BOOKMARK, onModifyBookmark); bookmarkView.removeEventListener(BookmarkEvent.DELETE_BOOKMARK, onModifyBookmark); bookmarkView.removeEventListener("initComplete", onBookmarkInitComplete); - if (bookmarkView.bookmark.defaultAction == "nomad") + if (bookmarkView.linkWithDesc && bookmarkView.bookmark.defaultAction == "nomad") { bookmarkView.linkWithDesc.removeEventListener("linkClick", onOpenInNomadLink); } - bookmarkView.configurationDetails.openInNomad.removeEventListener(MouseEvent.CLICK, onOpenNomadWeb); + + if (bookmarkView.configurationDetails) + { + bookmarkView.configurationDetails.openInNomad.removeEventListener(MouseEvent.CLICK, onOpenNomadWeb); + } view.bookmarksList.removeElement(bookmarkView); } @@ -199,11 +203,15 @@ package mediator.bookmarks private function onBookmarkInitComplete(event:Event):void { var bookmarkView:Bookmark = event.currentTarget as Bookmark; - if (bookmarkView.bookmark.defaultAction == "nomad") + if (bookmarkView.linkWithDesc && bookmarkView.bookmark.defaultAction == "nomad") { bookmarkView.linkWithDesc.addEventListener("linkClick", onOpenInNomadLink); } - bookmarkView.configurationDetails.openInNomad.addEventListener(MouseEvent.CLICK, onOpenNomadWeb); + + if (bookmarkView.configurationDetails) + { + bookmarkView.configurationDetails.openInNomad.addEventListener(MouseEvent.CLICK, onOpenNomadWeb); + } } private function onOpenInNomadLink(event:Event):void From 1f99b9a70713e53e596e796bfa6b1f921684efe8 Mon Sep 17 00:00:00 2001 From: Piotr Zarzycki Date: Wed, 29 May 2024 12:37:33 +0200 Subject: [PATCH 4/4] Remove onmessage earlier to avoid situation where it's still registered (reference #53) --- .../controller/CommandLaunchNomadLink.as | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/controller/CommandLaunchNomadLink.as b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/controller/CommandLaunchNomadLink.as index b07b1d5..390627d 100644 --- a/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/controller/CommandLaunchNomadLink.as +++ b/Super.Human.Portal_Royale/src/net/apacheRoyaleTemplatedApp/controller/CommandLaunchNomadLink.as @@ -30,7 +30,7 @@ package controller var loginProxy:ProxyLogin = facade.retrieveProxy(ProxyLogin.NAME) as ProxyLogin; data = note.getBody(); - var link:String = note.getBody().link; + var link:String = data.link; window["onmessage"] = null; if (loginProxy.isNomadHelperUrlExists()) // if a nomadhelper.html URL is configured, try to open the URL with nomadhelper.html first @@ -75,19 +75,22 @@ package controller // This triggers on any messages sent by nomadhelper.html private function onWindowMessage(event:Event):void - { - if (!data) return; + { + // Cancel any later messages - not expected + window["onmessage"] = null; + + if (!data) + { + return; + } // Retrieve the configred nomadhelper.html URL var loginProxy:ProxyLogin = facade.retrieveProxy(ProxyLogin.NAME) as ProxyLogin; var nomadHelperUrl:String = loginProxy.config.config.nomad_helper_url; var nomadBaseUrl:String = loginProxy.config.config.nomad_base_url; - - // Cancel any later messages - not expected - window["onmessage"] = null; + // Get the message from the event var winMessage:String = event["data"]; - // Parse the message as an error or success message var errorPrefix:String = "[Error]"; var successPrefix:String = "[Success]";