...

Which Dojo Topics are published in the Episerver CMS UI?

If you, like me are venturing into the mythical and magical world of dojo-in-episerver-ui, where elfs and wizards rule, you might also find this list useful.

A key element in the Episerver UI are the dojo topic publish/subscribe system that is used to let all the components communicate. When it comes to dojo and Episerver, my skills usually only take me so far that I can get myself into trouble, but rarely out of it, so I'm not going to give a full explanation here, but leave that to someone who truly has studied the dark arts: Grzegorz Wiechec: 
https://gregwiechec.com/2015/08/using-dojo-topic-publish-and-topic-subscribe/.

But, I have learned that you can learn a lot by studying the Episerver UI Sources. They can either be downloaded as a nuget package, or you can (like me) unzip the file /modules/_protected/CMS/CMS.zip and take a look through the ClientResources (hidden below the folder with the current version number). Look for the .uncompressed.js files!

The topics for example are quite powerful as they can both be used to control the UI by sending them out through topic.publish, or you can react to any events going on in the system by setting up eventhandlers with topic.subscribe.

I did a search in files and cleaned up the results a bit to give a nice overview of which topics are published from where that I thought might come in handy to others than myself, so here goes:

asset\command\ChangeContextToSelection
"/epi/shell/context/request", { uri: target.uri }

asset\command\NewFolder
"/epi/cms/action/createlocalasset"

asset\command\TranslateSelectedContent
"/epi/shell/action/changeview", "epi-cms/contentediting/CreateLanguageBranch", null, data

asset\view-model\HierarchicalListViewModel
"/epi/cms/contentdata/childrenchanged", target.parentLink

BackContextHistory
"/epi/shell/context/request", uri, { sender: sender }

command\BackCommand
"/epi/shell/context/request", { uri: this._previousContent.uri }, { trigger: "back", sender: this }

command\DeleteContent
"/epi/cms/action/delete/error"

command\EditImage
"/epi/shell/context/request", { url: returnValue.src }, { forceReload: true }

command\NewContent
"/epi/shell/action/changeview", "epi-cms/contentediting/CreateContent", null, {

command\TogglePreviewMode
"/epi/shell/action/changeview", "view"
"/epi/shell/action/changeview", null

command\ToggleViewSettings
"/epi/cms/action/eyetoggle", this.model.getthis.property)

command\TranslateContent
"/epi/shell/action/changeview", "epi-cms/contentediting/CreateLanguageBranch", null, data

compare\command\CompareSettingsModel
"/epi/shell/action/changeview/updatestate", { viewName: null }
"/epi/shell/action/changeview", this.get"enabled") ? this.get"mode") : null, null, { forceReload: true }

compare\views\CompareView
"/epi/shell/context/request", { uri: uri }, { sender: this }
"/epi/shell/action/changeview", "formedit", null, null, true

compare\views\SideBySideCompareView
"/epi/shell/context/request", { url: url }, {

component\command\ChangeContext
"/epi/shell/context/request", { uri: this.model.uri }, {

component\command\GlobalToolbarCommandProvider
"/epi/layout/pinnable/navigation/toggle"
"/epi/layout/pinnable/tools/toggle"

component\command\SetCommonDraft
"/epi/cms/content/statuschange/", "common-draft", { id: item.contentLink }

component\command\ViewTrash
"/epi/shell/context/request",

component\ContentNavigationTree
"/epi/shell/context/request", { uri: page.uri }, {

component\Versions
"/epi/shell/context/request", { uri: uri }, callerData

content-approval\ApprovalService
"/epi/shell/context/request",

contentediting\AutoSaveButton
"/epi/cms/action/showerror"

contentediting\command\BlockEdit
"/epi/shell/context/request", {

contentediting\command\IgnoreInUseNotification
"/epi/shell/context/request", contextParameters, callerData

contentediting\command\Publish
"/epi/cms/contentdata/childrenchanged", versionAgnosticId

contentediting\command\SendForReview
"/epi/cms/action/disableundoredoactions"

contentediting\command\_ChangeContentStatus
"/epi/shell/context/request", contextParameters, callerData

contentediting\command\_LegacyDialogCommandBase
"/epi/cms/contentdata/updated", {

contentediting\ContentEditingValidator
"/epi/cms/action/showerror"
"/epi/cms/action/showerror"

contentediting\ContentModelServerSync
"beta/contentSaved", result

contentediting\ContentViewModel
"/epi/shell/context/request", contextParameters, { sender: this, contextIdSyncChange: true, trigger: "internal" }
"/epi/shell/context/request", contextParameters, { sender: this, forceReload: true }
"/epi/shell/context/request", contextParameters, { sender: this }
"/epi/cms/content/statuschange/", "common-draft", { id: newVersion.contentLink }
"/epi/shell/context/request", contextParameters, { sender: this }
"/epi/cms/content/statuschange/", status, resolveArgs
"/epi/cms/action/showerror" 

contentediting\CreateContent
"/epi/cms/action/createlocalasset"
"/epi/cms/action/showerror"
"/epi/shell/context/request", {
"/epi/shell/action/changeview/back"
"/epi/cms/action/togglecreatemode", true
"/epi/cms/action/togglecreatemode", false

contentediting\EditingBase
"/epi/layout/pinnable/propertyEditor/show", null

contentediting\editors\model\ContentReferenceListEditorModel
"/epi/shell/context/request", { uri: uri }, { sender: this }

contentediting\EditToolbar
"/epi/cms/action/undo", []
"/epi/cms/action/redo", []

contentediting\OnPageEditing
"/epi/cms/action/switcheditmode", null, { activePropertyOnStartup: property}

contentediting\PageDataController
"/epi/cms/action/disablepreview"
"/epi/cms/action/showerror"
"/epi/shell/action/changeview/updatestate", { viewName: viewName }
"/epi/shell/context/request", contextParameters, callerData

contentediting\viewmodel\DeviceSelectionSettingsModel
"/epi/cms/action/viewsettingvaluechanged", messageData

contentediting\viewmodel\LanguageSettingsModel
"/epi/cms/action/eyetoggle", enabled
"/epi/cms/action/viewsettingvaluechanged", "viewlanguage", value

ContextSynchronizer
"/epi/shell/context/updateRequest", data

notification\viewmodels\NotificationListViewModel
"/epi/shell/context/request", { uri: contextUri }, { sender: this, forceReload: true }

project\ProjectPreviewButton
"/epi/cms/action/viewsettingvaluechanged", "project", projectId

project\ProjectSchedulingDialogViewModel
"/epi/shell/context/request", { uri: item.contentUri }

project\viewmodels\OverviewViewModel
"/epi/shell/context/request", { uri: newProjectUri }, { sender: this }

project\viewmodels\ProjectModeToolbarViewModel
"/epi/shell/context/request", { uri: context.versionAgnosticUri }, { sender: this }
"/epi/shell/context/request", { uri: newProjectUri }, { sender: this }

project\viewmodels\_ProjectViewModel
"/epi/shell/context/request", context, { sender: this }

visitorgroups\command\VisitorGroupViewSettingsModel
"/epi/cms/action/viewsettingvaluechanged", "visitorgroup", this.selectedGroup

widget\Breadcrumb
"/epi/shell/context/request", { uri: content.uri }, { sender: this }

widget\command\CreateContentFromSelector
"/epi/shell/action/changeview", "epi-cms/contentediting/CreateContent", null, {

widget\ContentTreeStoreModel
"/epi/cms/contentdata/childrenchanged", targetItem.contentLink
"/epi/cms/contentdata/childrenchanged", sourceItem.parentLink
"/epi/cms/action/createlocalasset"
"/epi/shell/context/request", { uri: ViewSettings.settings.defaultContext }

widget\ContextualContentForestStoreModel
"/epi/cms/action/createlocalasset", self

widget\SearchBox
"/epi/shell/context/request", [contextParameters, { sender: null }]

widget\viewmodel\TrashViewModel
"/epi/cms/trash/empty", response.extraInformation

widget\ViewSelector
"/epi/cms/action/disablepreview"
"/epi/shell/action/changeview", view.key, null, null, true

widget\ViewSwitchButton
"/epi/cms/action/switcheditmode", null, null, true

widget\_GridWidgetBase
"/epi/shell/context/request", contextParameters, callerData

_SidePanelsToggleMixin
"/epi/layout/pinnable/navigation/toggle", this._isNavigationVisible
"/epi/layout/pinnable/tools/toggle", this._isToolsVisible
"/epi/layout/pinnable/navigation/toggle", false
"/epi/layout/pinnable/tools/toggle", false

Blog Posts

...

Webcast: Addons In Real Life @ CodeArt

Last week I did a couple of talks at Episerver User Group meetings in Denmark about how I've tweaked my Episerver installation at codeart.dk in order to work as a great blogging platform. I also showcase a few of the addons I'm currently working on. Now I recorded the talk, so if you have a 23 minutes to spare, then grab a coffee and make some popcorn and have a look.

...

Custom Views for an Interface

Ever played around with adding custom views in Episerver CMS? It's a really powerful way to extend the UI. But why does it work when you register your view for a model class, but not for an interface implemented by that model? I had a look and found out.

...

Admin Mode Plugin to Manage Content Type Suggestions

If you have a site with a lot of different content types, it can be a good idea to help Episervers Automatic Content Type suggestion feature along. Here is a basic Admin mode tool - in good old webforms (yes, I washed my hands after I made it) that will let administrators / and super-editors configure exactly which content types to suggest when.

...

Auto Tagging Using Search

You don't always have to go the full AI route to get AI like results. In this blog post I'll describe an approach I've used several times (and for multiple purposes) with pretty decent results. Instead of classification algorithms, deep learning or neural networks I'll just simply query my favorite search engine.

...

Which Dojo Topics are published in the Episerver CMS UI?

If you, like me are venturing into the mythical and magical world of dojo-in-episerver-ui, where elfs and wizards rule, you might also find this list useful.

...

Storage Performance Aftermath - ElasticSearch Joins the Fight

In 3 previous blog posts I compared various azure storage technologies with regards to performance and scalability in typical web usage scenarios. I was actually done with the series, but with all that interesting data, I decided to throw my current favorite search/storage/no-sql technology into the mix to get an idea about how it all compares. So - ElasticSearch enters the competition!

...

Azure Storage Performance Showdown (Post 3)

This is the 3rd post in my Azure Storage Performance comparison. So far we've examined the typical scenario of storing/retrieving data that most dynamic websites of today deal with. In this post, we'll take a closer look at Update and Delete - and finally review the financial aspects.

...

Azure Storage Performance Showdown (Post 2)

In this second post of my performance series looking at Azure storage we're going to take a good look at Read speeds for the various storage types.

...

Content Providers and Flat Content

A classic challenge in many CMS - and also in Episerver - has always been what do you do with large amounts of non-hierarchical/flat content?  There has been many workarounds along the way and I was just on my way to make yet another when I discovered a well hidden secret deep in the belly of Episervers UI: The Asset widget (that holds blocks and media items) does in fact have infinite scrolling - which in turn can support incredibly large flat structures!

...

Azure Storage Performance Showdown (Post 1)

Almost every project has some data you want to persist, then read, search through, update and eventually delete. With Azure there are loads of great possibilities - for example Blob Storage, Table Storage, CosmosDb, SQL Azure. I've decided to do some simple and fairly naive tests to compare these for some typical usage scenarios and see how they perform.

...

Understanding Episerver CMS - How are images rendered

When using reusable content such as images, the actual HTML rendering of them can happen multiple places. But when is what used? And how can you customize it?

...

VS2017 Debugger Timeout

A really annoying problem has been bothering me for a while with VS2017. When debugging most web apps, I often encounter time-outs. For some reason it happens nearly every time I do it with Episerver projects. Here is the solution.

Post Comments()