<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Blog posts by Ha Bui</title><link href="https://world.optimizely.com/blogs/ha-bui/" /><updated>2023-02-16T09:12:27.0000000Z</updated><id>https://world.optimizely.com/blogs/ha-bui/</id><generator uri="https://world.optimizely.com/blogs/ha-bui/" version="2.0">Optimizely World</generator><entry><title>Global Notification</title><link href="https://world.optimizely.com/blogs/ha-bui/dates/20222/12/global-notification/" /><id>https://world.optimizely.com/blogs/ha-bui/dates/20222/12/global-notification/</id><published>2023-02-16T09:12:27.0000000Z</published><updated>2023-02-16T09:12:27.0000000Z</updated><author><name>Ha.Bui@episerver.com</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;Great day everyone!&lt;/p&gt;
&lt;p&gt;If you familiar with &lt;a href="https://docs.developers.optimizely.com/content-cloud/v12.0.0-content-cloud/docs/using-notifications"&gt;Using user notifications&lt;/a&gt;, I'm glad to introduce the new &lt;em&gt;global notification&lt;/em&gt; UI. Notifications are moved to the navigation bar, so it is no longer only for the CMS UI.&lt;/p&gt;
&lt;p&gt;You can get the new release version here: &lt;a href="https://nuget.optimizely.com/package/?id=EPiServer.CMS&amp;amp;amp;amp;v=12.17.0"&gt;EPiServer.CMS 12.17.0 (optimizely.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The new UI has the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A bell icon, moved to the top navigation bar&lt;br /&gt;&lt;img src="/link/b5a45818ed5045a38853ae62d327b132.aspx" /&gt;&lt;/li&gt;
&lt;li&gt;An indicator for new or unread messages&lt;/li&gt;
&lt;li&gt;A notification panel&lt;br /&gt;&lt;img src="/link/763563404fbd4c95999cb876bf6b0c20.aspx" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you click an unread notification, it is marked as read. Click &lt;strong&gt;Mark as Read&lt;/strong&gt; to change all unread messages statuses to read.&amp;nbsp;&lt;/p&gt;
&lt;div class="note"&gt;
&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the notication contains &lt;strong&gt;content uri&lt;/strong&gt; then you can click on the notification to go to the link.&lt;/li&gt;
&lt;li&gt;The list is &lt;em&gt;lazy load on demand&lt;/em&gt;; just scoll to see more.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Global notification also exposes broadcastchannel API (&lt;em&gt;/global/notification/message&lt;/em&gt;), Just join it and you can use the pub/sub pattern.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.developers.optimizely.com/content-cloud/v11.0.0-content-cloud/docs/message-service-pool"&gt;MessageHub.js&lt;/a&gt; already has it inside:&lt;/p&gt;
&lt;pre class="language-javascript"&gt;&lt;code&gt;this._globalNotificationBroadcaster = new BroadcastChannel(this.statusTopic.globalnotificationmessage);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See also &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API"&gt;Broadcast Channel API - Web APIs | MDN (mozilla.org)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Last but not least: all changes for UI are on the client side to pub/sub message. Nothing changes for the server side. Isn't that good news?&lt;/p&gt;
&lt;p&gt;Thank for reading!&lt;/p&gt;</summary></entry><entry><title>How to integrate TinyMCE cloud plugin with EPiServer</title><link href="https://world.optimizely.com/blogs/ha-bui/dates/20222/8/how-to-integrate-tinymce-cloud-plugin-with-episerver/" /><id>https://world.optimizely.com/blogs/ha-bui/dates/20222/8/how-to-integrate-tinymce-cloud-plugin-with-episerver/</id><published>2022-08-24T06:45:00.0000000Z</published><updated>2022-08-24T06:45:00.0000000Z</updated><author><name>Ha.Bui@episerver.com</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;Recently, we got many questions regarding How to integrate the TinyMCE external cloud plugin (SpellCheckerPro for instance) with EPiServer CMS and EPiServer.CMS.TinyMCE add-on.&lt;/p&gt;
&lt;p&gt;Did you try that before? And got a headache with kind of below errors?&lt;/p&gt;
&lt;p&gt;&lt;img src="/link/61ebaf06b52c4230bfde03b675ff5a46.aspx" /&gt;&lt;/p&gt;
&lt;p&gt;Don't worry! No more headaches&lt;span class="f1bfdkwi&amp;#32;regular_ft444xb"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;with the recent release of EPiServer TinyMCE!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EPiServer.CMS.TinyMce 2.13.8 (NET FRAMEWORK) (&lt;a href="https://nuget.optimizely.com/package/?id=EPiServer.CMS.TinyMce&amp;amp;amp;v=2.13.8"&gt;EPiServer.CMS.TinyMce 2.13.8&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the SpellCheckerPro plugin then few lines of the configuration below will help you easy to integrate with EPiServer CMS:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Prerequisites&lt;br /&gt;TinyMCE cloud API Key&lt;/li&gt;
&lt;li&gt;EPiServer TinyMCE Initialization&lt;br /&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;context.Services.Configure&amp;lt;TinyMceConfiguration&amp;gt;(config =&amp;gt;
            {
                config.Default()
                    .AddExternalPlugin("tinymcespellchecker", "https://cdn.tiny.cloud/1/&amp;lt;YOUR_API_KEY&amp;gt;/tinymce/4.9.11-104/plugins/tinymcespellchecker/plugin.min.js")
                    .AddEpiserverSupport()
                    .Toolbar("spellchecker language spellcheckdialog")
                    .AddSetting("spellchecker_rpc_url", "https://spelling.tiny.cloud")
                    .AddSetting("spellchecker_api_key", "&amp;lt;YOUR_API_KEY&amp;gt;");
            }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Because EPiServer CMS TinyMCE is using TinyMCE v4 so please choose the correct version of the SpellCheckerPro plugin. Otherwise, it won't work as expected!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Screenshots&lt;br /&gt;&lt;img src="/link/3c3b773ce0424d599ee5b6e235a8692f.aspx" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Easy right? I hope that helped you!&lt;/p&gt;</summary></entry><entry><title>CMS 12 Optimizely CMP Integration UI addon</title><link href="https://world.optimizely.com/blogs/ha-bui/dates/20222/7/welcome-integration-ui/" /><id>https://world.optimizely.com/blogs/ha-bui/dates/20222/7/welcome-integration-ui/</id><published>2022-07-06T09:15:24.0000000Z</published><updated>2022-07-06T09:15:24.0000000Z</updated><author><name>Ha.Bui@episerver.com</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;Hi everyone, do you know about the great blogpost from &lt;strong&gt;Kate&lt;/strong&gt;: &lt;a href="/link/8c7807ea45b444048bfeb74b735fadde.aspx"&gt;CMS 12 integration with Welcome&amp;rsquo;s Digital Asset Management Librar (optimizely.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If not then I would suggest you please go throught that first to get overview of main purpose and user case of CMS 12 and Welcome DAM integration!&lt;/p&gt;
&lt;p&gt;After reading but you still got struggling about: &lt;strong&gt;How to enable it in your template&lt;/strong&gt;? then you are in right place. Here is detailed instruction for you:&lt;/p&gt;
&lt;h1&gt;Optimizely CMP UI integration&lt;/h1&gt;
&lt;p&gt;This will describes standard setup that you need for a template site in order to able to use Optimizely DAM UI integration packages.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;EPiServer.CMS.Core 12.8 or later&lt;/li&gt;
&lt;li&gt;EPiServer.CMS.UI 12.9 or later&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Install from command line&lt;/p&gt;
&lt;pre class="language-powershell"&gt;&lt;code&gt;$ dotnet add package EPiServer.CMS.WelcomeIntegration.UI&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In `Startup.cs` add following line:&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;services.AddDAMUi();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Start your site and use!&lt;/p&gt;
&lt;h2&gt;Configuration Options&lt;/h2&gt;
&lt;p&gt;Customize option can be done via `application.json` under `EPiServer\Cms` section, now we are supporting:&lt;/p&gt;
&lt;pre class="language-markup"&gt;&lt;code&gt;{
  "DAMUi":{
    "Enabled":true,
    "Settings":{
      "Welcome":{
        "IconClass":"dijitNoIcon",
        "AvailableTypes":"episerver.core.imagedata",
        "StoreName":"episervercmsdamcontentcreation",
        "Endpoint":"https://cmp.optimizely.com",
        "PathAndQuery":"/cloud/library-picker?assetTypes=image"
      }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Under "DAMUi", with Settings options then you can:&lt;br /&gt;1. Change icon class so can use whatever icon you wants (default is "dijitNoIcon")&lt;br /&gt;2. Change "AvailableTypes" so the new editor command only be added if it is (or inherited from) one of available type. (default is "episerver.core.imagedata" so all properties that allow an image to be added will have the new command)&lt;br /&gt;3. Change store via "StoreName" so that you can customize server side code (with your new store) to add more your business logic into. (default is "episervercmsdamcontentcreation")&lt;br /&gt;4. Change end point via "Endpoint" so that you can transform the root DAM domain for each environment you have (inte, preprod or prod) (default is "cmp.optimizely.com")&lt;br /&gt;5. Change path and query so that you can add default filter for the DAM library picker by image, video or all (default is "image")&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;From Optimizely CMP DAM... for ContentArea&lt;/p&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/32920385/174870027-68cb52a7-bc6f-449d-a06a-3a37675b4711.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;From Optimizely CMP DAM... for ContentReference property with thumbnail editor&lt;/p&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/32920385/174870358-8122e9ea-effe-4ab9-ac31-addddc54273d.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Popup open when click (Optimizely CMP &lt;em&gt;DAM login is required for the 1st time&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/32920385/174870598-dc28c0a0-8b57-4194-af3c-8a871f6a4a3f.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;After login then next time, library picker will be shown&lt;/p&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/32920385/174870808-f8138d6b-7749-4e16-b3f5-9f3135554082.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Select your asset then click `Choose`, popup will be closed then content will be saved (thumbnail will display after a while)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/32920385/174871228-109af525-689b-4971-b6c5-0d8baba356ea.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Related topics&lt;/h2&gt;
&lt;p&gt;1. &lt;a href="https://docs.developers.optimizely.com/content-cloud/v12.0.0-content-cloud/docs/configuration"&gt;Configuration&lt;/a&gt;&lt;br /&gt;2.&lt;a href="https://docs.developers.optimizely.com/content-cloud/v12.0.0-content-cloud/docs/configuring-cms"&gt;EPiServer CMS configuration section&lt;/a&gt;&lt;br /&gt;3.&lt;a href="https://docs.developers.optimizely.com/content-cloud/v12.0.0-content-cloud/docs/add-ons"&gt;Addon Overview&lt;/a&gt;&lt;/p&gt;</summary></entry><entry><title>Loading indicator whenever view or context is changed</title><link href="https://world.optimizely.com/blogs/ha-bui/dates/2021/11/loading-indicator-whenever-view-or-context-is-changed/" /><id>https://world.optimizely.com/blogs/ha-bui/dates/2021/11/loading-indicator-whenever-view-or-context-is-changed/</id><published>2021-11-02T12:19:48.0000000Z</published><updated>2021-11-02T12:19:48.0000000Z</updated><author><name>Ha.Bui@episerver.com</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;Hi everyone! As you may know, sometimes the CMS Edit UI can take time to complete loading (depending on network, infrastructure or site data), especially page for edit mode in a complexed page view (such as a Start page).&lt;/p&gt;
&lt;p&gt;Slow loading can occur a&lt;span style="font-size: 1rem;"&gt;fter an editor clicks Edit on a content page, or changes view or content context, or i&lt;/span&gt;&lt;span style="font-size: 1rem;"&gt;f new content is requested while still in edit view.&amp;nbsp;&lt;/span&gt;&lt;span&gt;This can confuse and annoy editors when they edit content.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In CMS UI 12.2.0, we introduced a new &lt;span class="classLib"&gt;StandableBorderContainer&lt;/span&gt;&amp;nbsp;that should resolve the issues!&lt;/p&gt;
&lt;p&gt;To see the loading indicator in action see &lt;a href="https://webm.red/view/0I2w.webm"&gt;Video: Loading indicator&lt;/a&gt;.&lt;img src="/epiui/CMS/~/link/3c6cb0badde44cbab71fc6a6f6eda68a.aspx" alt="" /&gt;&lt;img src="/link/72bd09f21e0b426f83c3f85fb3b8cf8f.aspx" width="960" alt="" height="392" /&gt;&lt;/p&gt;
&lt;h2&gt;How to use this?&lt;/h2&gt;
&lt;p&gt;Change &lt;span class="classLib"&gt;BorderContainer&lt;/span&gt; from your custom view component to &lt;span class="classLib"&gt;StandableBorderContainer&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;...

var mainContentContainer = new StandableBorderContainer()
  .Add(new ContentPane { PlugInArea = "/episerver/cms/action" }, new BorderSettingsDictionary(BorderContainerRegion.Top))
  .Add(new ContentPane { PlugInArea = "/episerver/cms/maincontent" }, new BorderSettingsDictionary(BorderContainerRegion.Center));
...&lt;/code&gt;&lt;/pre&gt;</summary></entry></feed>