Skip to main content

Posts

Dynamics CRM Product. Plugin strategy.

Plugin strategy. Managed Steps Concept.           Most of modern products (managed solutions) for Dynamics crm, those we import into our environments, have some ways to be configured. By creating “setting” entity, Azure configuration for marketing solutions, changing templates or workflows. If we deal with off-line then workflow is not an option any more, but plugins are. In case of plugin we deal with hardly configurable component and have not many options to work around. Disable step, use unsecure/secure configuration (if vendor gives us such option), ask vendor for patch. This sort of workarounds.           Managed Steps Concept is an approach for dynamics crm plugins architecting and coding. Vendors can utilize it to improve products maintenance and make it more client friendly.           The proposed design is useful for any organi...

Refresh CRM 2016 Form after record save using JavaScript

      I had a need to refresh crm 2016 form right after initial save. Surprisingly all good old solution from my archive were not effective in crm 2016. Neither window.location.reload(), nor sdk’s refresh, nor trivial setTimeout. "setTimeout" would work if not bunch of heavy plugins and JavaScrippt validation on save event.     I found that Google knows about it as many as I do. Okay, no copy past this time J     After half an hour I found a nice solution with really minimal risk of browser leaking. The idea based on fact that OnLoad event occurs without form refresh right after change of form type. We need an independent flag to catch that. The code below does the trick. function refreshFormAfterInitialSave() { if (Xrm.Page.ui.getFormType() == 1) { top.callN = 1; } if (Xrm.Page.ui.getFormType() == 2 && top.callN == 1) { setTimeout(function () { top.callN = n...

Adx portal: Improve JavaScript Upload Experience

     While using "Custom Javascript" area in Web pages, Web Form Steps etc. I found it a little bit uncomfortable in use.      The max length of 10 000 characters not always enough and if I add a compiled content then debugging is blocked.      I ended up creating dynamic script loader. It picks up a url (like "~/Areas/FolderName/scriptName.min.js") from “Custom Javascript" area. Then script checks if such a namespace exists and object is loaded. If necessary, it loads the script. The idea is very simple. Have an object loaded with master page to load JavaScript and CSS files: if (typeof (gHelper) == "undefined") { gHelper = { __namespace: true }; } gHelper.data = { addedFiles: "", } gHelper.fn = (function (window, document) { function loadfile(filepath, filetype) { var fileref; // JavaScript file from solution ...

Dynamics Crm portals review

   In this post I’m not going to compare modern MS Dynamics Crm portals but two main models which vendors use to create their products. First one we’re going to call “crm data driven” model and let’s name another one “crm loosely coupling”. Data Driven model (DDM)         Data Driven model (DDM) means that frontend pages, views and controls replicate the crm forms and respect most of crm filters and validations. DDM dictates vendor develop a platform to reflect crm architecture and rules on the front end.       Vendor’s platform can provide additional enhancement inside portal and crm. It can be frontend content management system CMS, pre-installed solutions for better web engagement experience, deployment tools, ALM kits, portal plugins, service workflow etc.       The main benefit of the DDM is ability to manage portal design and create simple business flows without writing code. ...

Crm Service Impersonation: Shared Views Management

  Here is a note about an interesting project involving crm service impersonation . Client had an idea to allow users subscribe to the only views they need and unsubscribe from extra views freely.    Only view owner can share its views. The main issue here to give to user ability to share somebody’s views as the view owner without extending his security privileges.   The project had a number of custom controls and entities. Here I’m going to describe only the security workaround by using a service impersonation. Here is a “how to”, a very good example of service impersonation:    The plugin can be registered on “Calling User”. The minimum permission your customers will need is “Read Access” to “UserQuery” entity. All OOB roles have it.   First step : Get view owner .   Given you have a User Query id. I'm getting it from one of custom entities. //get query owner Entity userQuery = service.Retri...