Information Architecture - Setup your term store to scale

December 19, 2016

In this post I am going to put together a list of best practices to consider when setting up a term store in Sharepoint Online. As you may already know term store is collection of term groups. And each term group consists of number term sets. Each term set contains a list/hierarchy of terms. Team group gives the flexibility in terms of access. You can assign permissions to users on their term group, rather than giving them access to the entire store. 
  • Always maintain a corporate/general term group which contains common term sets across organization. 
  • Every group/business unit should have a term group. Pin the terms from corporate term group as required into Business unit term groups. 
    • For example, you plan to maintain list of document types in common term group. Thus, there is a term set created. Marketing department want to use this term set. But, they want to add a few more terms. In this case, you should create another term set in Marketing department term group and pin the terms from common term group. You can add those extra terms to Marketing document type s term set. 
  • Always start with common term group, when approaching a new taxonomy requirement.  You can directly refer the term sets under common term group. This approach will ensure reuse and consistency. 
  • Lets say a term set is under department/business unit level, and another department/business unit requires the same term set. In this case move the term set to common term group. Refer the term set under common term group or pin the term set down to department term group. 
  • Another use case can be, one of the project's requirement is all satisfied with common term group. But, they don't need all terms under document types term set. The solution is to pin the terms from common term group to Business unit term group's new term set. 
  • Don't create a duplicate terms across term groups. It will ruin the integrity of term store and content consumption (search/tagging will obviously get confusing if a filter contains two tags with the same name)
  • Avoid "." in the term names. Search will return inappropriate results. 
  • Sharepoint Online only support strict hierarchies. Perfect example for this case is Nation and States. You can't have a state under multiple nations. On the contrast State and Rivers is an example of poly hierarchy. A river can flow through of multiple states. Or multiple states have same river. 
  • Don't go beyond three levels in Strict hierarchical term sets. 
  • There are hacks to achieve poly hierarchy in Sharepoint Online. But, the recommended approach is to create multiple term sets for each level. 
    • As per above example create on term set for Rivers and One for States.  
    • Create managed metadata columns for each of the term sets to tag the content.
    • Content admins may find it a little difficult to tag the content. But, the search/content consumption will be clean with this approach. 
  • Always enter a description and synonyms (Other Label). They will definitely help content admins when tagging the content. 
  • Don't create term groups at site collection level. You will soon end up chaos, if every site collection admin maintains their own term store. 
  • Until your company reaches a certain maturity hold the the governance centrally with IT. Because, deleting or renaming a term may have detrimental effects in the down stream applications/customizations. 
  • IT team should take consensus from other departments before editing or deleting terms in term store. To do this effectively, form a governance team with your key stakeholders and business users. 
  • Don't wait for taxonomy to be complete and refined. Get started with a basic structure and refine it as you move forward. 


Ionic 1.x - Custom scrollbar in ion-content

December 17, 2016

Write once and deploy everywhere. And, Ionic does a super job at it. With Cordova, Electron you can almost deploy your HTML5 based app anywhere with 10 - 20% change to source code. That 10 to 20% is the place where you grip across multiple platforms and browsers is tested. 

If you consider user experience, mobile is different from desktop. Most of the components in Ionic scale well from mobile to desktop. my struggle was always with scroll in ion-content. 

The scroll ion-content provides is not desktop friendly. Its is the scroll for touch. How to make it desktop friendly? Easiest option is to let ion-content user native scrolling (overflow-scroll=true) and use CSS (overflow-y) to get the scrollbar. My thought was whether that will look sophisticated enough to mach Ionic UX. So I explored other JS based scrollbars. I searched for some angular scrollbars and I found the following interesting. 

But they don't go well with Ionic. After multiple attempts to change to code to work with Ionic, the results were mediocre. So it came down to going back to square one and keeping things simple. 
  • If native scroll serves your need, replace ion-content with normal div. In my case, I want ion-content inside ion-slide-page. 
  • Use CSS to power your scrollbar and use viewport units to define height
    • overflow-y: auto;height: calc(69vh - 44px);
  • My target was to get the scrollbar look good in IE11 and webkit browsers. 


Pulling SharePoint Online List with Managed Metadata into Power BI

December 17, 2016

Recently, I started to work with Power BI for one of my projects. I am impressed and presently supersized. Product is simple and powerful keeping up to its name.  But, its not free from bugs.

Like I always wondered if SharePoint Online can be used as PaaS. One of the major backdrop for me was reporting until I explored Power BI. In this post I am going to cover a bug which will fail sync between  SharePoint Online List with Managed Metadata and Power BI. 


Expression.Error: We cannot convert a value of type Record to type Table.Details:Value=Record Type=Type

You may encounter this issue in another form. If you try to expand taxonomy column, it will take forever. 

Work Around: 

In Power BI Desktop, instead of using "Sharepoint List" under "Get Data" use "OData" and supply REST API URL instead.'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx')/Items

Login with Organization Account. It should work seamlessly. 

At the time of writing this post Power BI is facing syncing issues. If you run into one of them.

After you publish the data source to PowerBI online and check the settings, you see the following error. 

"Your data source can't be refreshed because the credentials are invalid, Please update your
credentials and try' again."

The solution is simple. Edit credentials. Select OAuth2 and reenter credentials. 


How to prepare your LOB app for Intune?

December 10, 2016

One of the aspects I struggled with Intune is to wrap an LOB app. In the first cut, it feels like just wrapping the app is enough. But, you need to understand some subtle architectural aspects to get your wrapping right. 

App features

To get started, let's start with app features. 

  • App uses Azure AD authentication
  • App is a hybrid and uses Cordova (Supports iOS and Android)
  • App communicates with Sharpoint online (via REST) and set up as a Azure AD native application. Thus, conditional access is involved here. 
  • "Send logs via email" - this feature is important as wrapping the application will restrict the email/data sharing capabilities based on the policy 

Intune Way

You can wrap the application in two ways
  • Using Intune Wrapping Tool
  • Use the Cordova plugin
Please visit the link for more details 

Intune wrapping tool is pretty straightforward. But, I had issues while wrapping Salesforce SDK based application. I could sail through iOS issues and make the application work. I could never get to make Android version work, as there are conflicts. I will share that experience for another post. 

When it came to Intune SDK, the integration experience was better. If you see the feature comparison, SDK has a little more to offer. But, I suggest you weigh your options based on the checklist provided in the article. 

There are two ways you can do this.

  1. Pure MAM (configured in Azure Portal)
  2. MAM with MDM (configured in Intune portal
Pure MAM is a straight forward thing and your job is done once you wrap the app. Tricky aspect here is to enable brokered authentication because the app access Sharepoint Online data and conditional access is enabled. 

But, the first things first. I need to use to wrap the application. 


Your Plist file looks as below. 

Brokered Authentication 

  • Please read to understand how it actually works. 
  • Android works with Company Portal App. iOS needs Azure Authenticator and Company Portal App to make it work. 
  • Android (app identifier: com.jda.internal.mytestapp)
    1. Microsoft.ADAL.AuthenticationSettings.setUseBroker(true) works only with Android. iOS doesn't need this. iOS works with URISchemes to get things done
    2. Next step is to prepare a redirect URI. Modified full code is @
    3. The above command will give you Base64UrlencodedSignature. But the actual url will look like msauth://com.jda.internal.mytestapp/ga0RGNYHvNM5d0SLGQfpQWAPGJ8=
    4. If your url is not right, please check your js console. An error will see right into you stating which URL should be configured in Azure AD redirect URI. 
  • iOS
    • There is nothing that should be at the app level for iOS. But, make sure you have Azure Authenticator app on the device along with Company Portal App. Otherwise, app will redirect adal to O365 login page and ask you to enroll. Once you click on enroll, it takes you to Company Poratal erroring the app is not setup in Intune Portal. 
    • But, the redirect URI should be configured in Azure AD redirect URI
      • x-msauth-com-jda-internal-mytestapp://com.jda.internal.mytestapp


Embedding Gist in Blogger

November 28, 2016

I tried to embed Gist into my blogger post. Everything looked fine except the overflow:scroll is not working. Interestingly, without setting fixed height (eg. height:100px) both x and y scrolls are not working. 

I tried the following override in blogger template and it somehow broke the overall scroll. 

.gist .blob-wrapper
    height: 100vh !important;
    height:500px !important;
    overflow-y: auto !important;

Finally I settled down to the following, which wrapped the text decently. 

.gist .blob-code-inner {
white-space:pre-wrap !important;


SPOnline Search REST API POST request

November 27, 2016

There is one thing about Sharepoint. It doesn't let you pass even if there is a slight formatting error in your request. And, most of the time error is not so appropriate or no error. 

I faced the same situation when i tried to compose a POST request for SPOnline Search REST API. The query text was quite complex as I was trying to retrieve search results based on a managed property which is in turn is generated from managed metadata column. The key here is not introduce + symbol in place of space as we would generally do in GET request. 

Code Snippet


ng-click doesn't work with ion-slides

November 26, 2016


Clicks doesn't work for elements inside ion-slides. Or you may experience slow clicks in the initial load, but eventually click event doesn't work. I tried to place ion-checkbox inside ion-slides. It used to work fine when the chrome is lightly loaded. Once the browser gets heavier, ion-checkbox doesn't respond. 


This relates to a bug in Swiper component which is used to build ion-slides. It relates to the bug file in their git repo.

The resolutions is as follows:

I've found the issue... This two options: preventClicks and preventClicksPropagation, are by default set to true. Setting them to false will solve the issue.

Popular Posts