Microsoft named a Leader in 2021 Gartner Magic Quadrant for Cloud AI Developer Services

Microsoft named a Leader in 2021 Gartner Magic Quadrant for Cloud AI Developer Services

This article is contributed. See the original author and article here.

 


Gartner CAIDS MQ graphic 2021.png


Gartner recently released their Magic Quadrant for 2021 Cloud AI Developer Services. Microsoft is in the Leaders quadrant and was positioned highest on the ability to execute axis. You can download a complimentary copy of the Magic Quadrant for Cloud AI Developer Services for the full report. In this post, we’ll look at why, we think, Microsoft was placed in the Leaders quadrant. 


 


According to the report, “Gartner defines cloud AI developer services (CAIDS) as cloud-hosted or containerized services/models that allow development teams and business users to leverage artificial intelligence models via APIs, SDKs, or applications without requiring deep data science expertise.”


 


They specifically evaluated services with capabilities in language, vision, and automated machine learning. For Azure, this includes Azure Cognitive Services, Azure Machine Learning, and Microsoft’s conversational AI portfolio. For Power Platform, this includes AI Builder and Power Virtual Agents.


 


“Gartner believes that enterprise development teams will increasingly incorporate models built using AI and ML into applications. These services currently fall into three main functional areas: language, vision and automated machine learning (autoML). The language services include natural language understanding (NLU), conversational agent frameworks, text analytics, sentiment analysis and other capabilities. The vision services include image recognition, video content analysis and optical character recognition (OCR). The autoML services include automated tools that will let developers do data preparation, feature engineering, create models, deploy, monitor and manage models without having to learn data science.”


 


Azure AI enables you to develop AI applications on your terms, apply AI responsibly, and deploy mission-critical AI solutions.


 


Develop on your terms


 


Azure AI allows you to build AI applications in your preferred software development language and deploy in the cloud, on-premises, or at the edge. Azure provides options for data scientists and developers of all skill levels – no machine learning expertise required. See the Microsoft section of the Magic Quadrant for Cloud AI Developer Services.


 


Apply AI responsibly


 


Azure offers tools and resources to help you understand, protect, and control your AI solutions, including responsible ML toolkits, responsible bot development guidelines, tools to help you explain model behavior and test for fairness, and more. We never use your data to train our models, and we keep principles like inclusiveness, fairness, transparency, and accountability in mind at every stage of our AI research, development, and deployment. See the Microsoft section of the Magic Quadrant for Cloud AI Developer Services.


 


Deploy mission-critical solutions


 


Azure lets you access the same AI services that power products like Microsoft Teams and Xbox, and that are proven at global scale. Azure leads the industry when it comes to security, and we have the most comprehensive compliance coverage of any cloud service provider. We continue to innovate and our Microsoft Research team has made significant breakthroughs, most recently reaching human parity with image captioning. See the Microsoft section of the Magic Quadrant for Cloud AI Developer Services.


 


Whether you’re a professional developer or data scientist, or just getting started, we hope that you can use Azure AI services to build impactful AI-powered applications that solve complex problems and enhance customer experience.


 


This graphic was published by Gartner, Inc. as part of a larger research document and should be evaluated in the context of the entire document. The Gartner document is available upon request from Microsoft. Gartner does not endorse any vendor, product or service depicted in its research publications, and does not advise technology users to select only those vendors with the highest ratings or other designation. Gartner research publications consist of the opinions of Gartner’s research organization and should not be construed as statements of fact. Gartner disclaims all warranties, expressed or implied, with respect to this research, including any warranties of merchantability or fitness for a particular purpose.

The Tenets of Knowledge Management Adoption

This article is contributed. See the original author and article here.

Knowledge Management Systems and Adoption Key Tenets: 


Sonia M. Ang – CSA 


 


In today’s competitive business environment organizations need a clear roadmap that aligns with their training needs and focuses on both short-and long-term objectives.  Knowledge Management is a tool that can be implemented to identify and appeal to the training needs of the modern employee.  A successful Enterprise Learning system goes beyond the organizational level and allows employees access to information and knowledge, thus creating better alignment at the enterprise level.   A well-designed Knowledge Management System can break down barriers by providing partners, clients, and customers with not only essential information and robust training, but also opportunities to promote and inform your organization’s products and services. 


Employee retention and customer satisfaction are essential to any organizations long-term success.   When considering your organization’s ROI, the benefits of Enterprise Learning are threefold:  retention (customers and employees), satisfaction, and improved profitability.  Enterprise Learning can be leveraged to provide better development and training opportunities thus promoting a feeling of empowerment amongst your team.  Enterprise Learning promotes efficiencies in training, in turn your organization will recognize the cost-saving benefits due to lower employee turnover and customer churn. 


Enterprise Knowledge Management Adoption  


1. Management Sponsorship and a COE   


 An executive sponsor provides that critical link between executive leadership and project management and helps support projects successfully to their completion at their expected performance.  Sponsorship of the Enterprise Knowledge Management Project will enhance your product base and create opportunities for your company in the rapidly advancing Knowledge Management sector.  Executive sponsorship will align with our company’s strategy to be experts in Knowledge Management.  Microsoft will be at the forefront of Knowledge Management as organizations rush to adopt more efficient and effective training strategies that better align to the modern worker’s needs. 


 


 2. Beyond Training but Execution  


Training programs at the company level are often too extensive in complexity and the amount of learning material can be downright overwhelming.  Training professionals need to venture beyond traditional learning and utilize learning strategies that support the needs of today’s modern professionals.  Microlearning, for example, provides a host of benefits to your organization in terms of increased learner participation, memorability of courses, and quick deployment with easy updates to your digital learning assets. 


Knowledge Management allows for learning concepts to be extracted from larger training programs and utilized as checklists and instructional videos that are easily accessible at a moment’s notice.  When learning material is successfully mined it allows the learning process to be refined, thus challenging concepts can be identified and made easier to process and understand. 


 


3. Collaborative and Social Learning 


How does your organization support collaboration, problem-solving and the co-creation of knowledge?  A successful Enterprise Learning Strategy will push an organization forward by improving collaboration via robust communities and meaningful discussion forums.   Building professional learning communities on platforms like Slack and Microsoft TEAMS can help break the walls down in organizations where ideas and knowledge may be siloed.  In addition to collaborative discussion platforms that give all community members a voice, the development of Expert Finders can be an important catalyst for creating a robust culture of collaboration.  Hidden ideas and knowledge will organically emerge from people in your organization that may hold previously unearthed niche expertise. 


 


4. Where is the Data?  


Generating data for analysis is the foundation of a robust Enterprise Learning strategy.  The key to success is to build data collection directly into technical systems supported by a centralized knowledge repository.  Data collection in the education sphere has traditionally focused on summative assessments like exams that are intended to measure a learner’s mastery of objectives.  Using the specifications in Enterprise Learning provides another set of metrics by allowing an organization to track formative assessments, such as data and social learning activity.  For example, these metrics allows an organization to collect new data, adding another layer of data to your knowledge repository to support the creation of more meaningful formative and summative assessments. 


 


 


5. Reusable Content and Reproducibility  


How do organizations move past the traditional content development models where bulky training manuals were the norm?  Learning data and insights help organizations to build learning solutions that are reusable and provide 24/7 access to learning.  Additionally, a Headless CMS allows your organization’s content creators to move away from the rigid templates that most traditional learning management systems utilize. This means content creators have more control over the quality of their content, and this streamlines the process of creating unique digital learning experiences for both your employees and customers.  Perhaps your organization releases a short instructional video on company’s rules and regulations.  This learning asset has value as both a stand-alone content object in a knowledge base as well as a learning module in a more extensive communications course.  Content creators in your organization, ranging from instructional designers to marketing professionals, often create multiple versions of the same material.  Creating content that is reusable and not redundant is more efficient as you are not reinventing the wheel.  Additionally, you are not burdened with trying to maintain and keep up-to-date multiple versions of the same learning assets.  


 


6. “Findability” of Learning Assets: Digitization and Technology 


The successful implementation of KM tools can enhance the user experience through successful mining and classification of metadata.  The power of KM is powerful in that it provides a taxonomy, ontology, and a finely tuned search system. A well-designed metadata strategy will take advantage of your learning assets which may include courses, webinars, professional learning communities (PLCs) and subject matter experts in your organization.  This myriad of data exits across multiple systems in your organization. Using metadata that is contextualized and consistent will ensure that your data is findable.  Taking it one-step further ontologies can be tapped to support a complete network of shareable and reusable knowledge across a domain for each unique user. 


 


 


Summary 


The adoption of an Enterprise Management system can reframe your organization’s knowledge and learning infrastructure.  Modern learners need to consume information quickly thus allowing them to efficiently apply and master essential skills and strategies.  A well-engineered Enterprise Learning Plan that focuses on empowering your community will result in higher learner engagement, enhanced workplace skills and a robust culture-of-knowledge across your organization.  Curiosity will drive success rather than traditional command and control training strategies.  Empower your community by giving them the autonomy to self-direct their own learning.  As a result, your organization will enjoy increased engagement, enhanced workforce skills and, in turn, a robust learning culture will grow and flourish 

Monitor your hybrid network with Network insights

Monitor your hybrid network with Network insights

This article is contributed. See the original author and article here.

Customers monitoring their networks must scramble across dashboards and resources to find monitoring data leading to frustrations and troubleshooting delays.


 


Presenting Network insights – a centralized console for network monitoring and troubleshooting. Customers get an agentless health monitoring experience and access to resource topologies along with key resource metrics – all with zero configuration. 


 


Network insights drilldownNetwork insights drilldown


 


 


Unified network monitoring and troubleshooting console



  • Single console to access all network monitoring and troubleshooting experiences

  • Unified health & alerts view across all networking resources. The one place to start your monitoring & troubleshooting journey

  • Integrated with NSG Flow Logs, Traffic Analytics and Connection Monitor – showing traffic and connectivity monitoring information in one place


Resource-specific troubleshooting



  • 1-click access to resource-specific metrics, functional views, diagnostics and documentation

  • Visually identify resource components using the topology to easily detect, diagnose and fix issues

  • Analyze issues and find root causes from resource metrics without writing queries or authoring workbooks


Integrated & ready from Day 1



  • No agent installation or configuration required

  • Available in all clouds – public and air-gapped

  • Harmonized with the overall Azure Monitor experience to provide easier debugging across compute, storage and networking


Network insights also surfaces information from configuration-based monitoring tools as shown below.


 


Connectivity Monitoring Connectivity tabConnectivity tab


In the Connectivity tab, customers get an aggregated view of all the connectivity tests they have setup in Connection Monitor along with any test-related alerts. Customers can filter out tests based on source type, destination type, connectivity status and round trip time. The test drilldown allows customers to view test details including exact source and destination names, protocol used, RTT history and more. Customer can clickthrough to the tests they are interested in investigating further.


 


Traffic Monitoring


Traffic tabTraffic tab


The Traffic tab allows customers to understand their traffic monitoring coverage in a single glance and review any alerts from Traffic Analytics. Customers can view NSGs grouped by regions and filter them based on the enablement status of NSG Flow Logs and Traffic Analytics. Using the drilldown customers can click through to individual NSGs and modify their traffic monitoring coverage as needed.


 


You’re invited to comment and share your thoughts on Network Insights and what you’d like to see coming next. 


 


Useful links



 


 

 

 

 

 

 

 

Getting started with SharePoint's custom view formatting

Getting started with SharePoint's custom view formatting

This article is contributed. See the original author and article here.

Introduction


In a previous blog post, the basic building blocks of custom column formatting were introduced to us. From that, we learned how to customize our columns to create some interesting visuals.


 


column-formatting-after.png


Things look better, but each column is still a separate component. What if we want to tie them all together into a more cohesive presentation?


 


The good news is that we can! Just like we customized our columns, we can also customize SharePoint list views! That will allow us to go from a traditional table/column/cell view, to something that looks ‘put together’, like so…


view-formatting-after.png


 


Preparing for your journey


Before you get going, there are a few things that will help prepare you for the trek ahead.


 


If you haven’t, I would highly recommend reading the first blog post in this series: Getting started with SharePoint’s custom column formatting.


 


You can also refer to the official documentation for view formatting to help fill in any gaps not covered here.


 


I should also warn you that your HTML and CSS skills are going to come into play a lot more here, as you’ll be trying to work with multiple elements to position them correctly.


 


If you’re not an expert, that’s perfectly okay – I’m not one either – you’ll just need an extra dose of patience. Trial and error will get you there, eventually. I’m not going to dwell on the particular CSS used in these examples except in cases where it’s a pattern that could be applied to other use cases.


 


And that’s pretty much it. There’s some new stuff we’ll learn about that only applies to View formatting, but everything we learned from the previous blog post will apply here as well.


 


Choose your own adventure


In case you weren’t aware, views in a Modern SharePoint list come in a few flavors.


 


list-view-flavors.png


 


Most of us are probably already very familiar with the List layout; It’s what we’ve been used to for decades. Compact List is the same as List…just smaller. The Tiles view, frequently referred to as the Gallery view, is somewhat newer. As you may expect, it will display your list items as cards/tiles in a classic grid view. There’s also a Calendar view/layout that was recently added, but is not currently customizable.


 


When it comes to custom formatting, we can customize both the List and Gallery layouts. They do need to be customized separately, as their schemas are slightly different, but they’re close enough that you can usually take your JSON from one and apply it to the other with minimal changes.


 


For our journey here, we’re going to start with a List view and then use it to create a Tile view.


 


I wisely started with a map


Before we get into defining our custom view formatting, it may be helpful to spend some time up front thinking about how we’ll structure our view. The more you want to transform your view, the more important it will be to plan things out in advance. This is where some understanding of HTML will come in handy.


 


To help guide myself, I created the following image to try and visualize how my various DIVs and other elements would be laid out.


 


blowout-witharrows.png


 


This isn’t necessary, obviously, but I personally find it helpful to have a blueprint in front of me (even if it’s only a mental one).


 


Formatting List views


If you recall from the column formatting article, each custom format followed the same basic structure: A $schema definition along with a parent HTML element and optional attributes, styles and children.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json”,
“elmType”: “div”,
“attributes”: {
“iconName”: “Game”
},
“style”: {
“font-size”: “48px”,
“color”: “red”
},
“children: []
}

 


List views aren’t that much different.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json”,
“hideSelection”: true,
“hideColumnHeader”: true,
“rowFormatter”: {}
}

We still have our $schema property, but it’s important to notice that it’s pointing to a different schema definition. We also have some new optional properties: hideSelection & hideColumnHeader. As you may suspect, hideSelection will do away with the ability to select a particular list item while hideColumnHeader will do away with the the column headers normally present on a list.


 


What’s a little different here is that we’re missing our parent element. Instead, we have this rowFormatter property. The reason for this is that we can choose between using this and an additionalRowClass property. If you choose the latter, you’re limited to applying CSS classes to the entire row, similar to what you can do with the out-of-box “Conditional formatting”. If all you want to do is make your row a different color, you’re probably better off using the design mode tools, but if you’re interested in learning more about the additionalRowClass property, it is covered well enough in the official documentation.


 


We, however, will not be satifisfied with applying some simplistic styling. NO! We are bound for greater rowFormatter glory!


 



NOTE: There are other properties available that are not covered in this blog, most notably the groupProps property. This allows you to customize the grouping header that appears when items are grouped together by some column. There are also footerFormatter and hideFooter properties that affect the “List Footer” that appears if you’re displaying item totals.



 


One container to rule them all


The rowFormatter property is simply an object that wraps all of the HTML elements we’re going to create our view. If, for some reason, we wanted every row in our list to just simply display the basic column formatting shown in the previous section, we’d end up with the following JSON definition.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json”,
“hideSelection”: true,
“hideColumnHeader”: true,
“rowFormatter”: {
“elmType”: “div”,
“attributes”: {
“iconName”: “Game”
},
“style”: {
“font-size”: “48px”,
“color”: “red”
},
“children: []
}
}

That’s probably not the greatest idea, but it does illustrate the point. Once we make it inside of the rowFormatter object, it’s almost business as usual. There’s one more difference we need to understand…how we reference columns.


 


How to reference fields


When we were dealing with formatting individual columns, we always used the built-in variable @currentField, but what about when we’re dealing with more than one view? @currentField is still there, but it holds a slightly different meaning in this context. It will always be a reference to the standard Title field.


 


LOTR-Meme.png


 


Instead of using @currentField to reference a column, we’ll need to use a slightly different format: [$InternalColumnName].


 


In our list, we have a handful of columns including a Member lookup column. If we want to reference that field, we’d use [$Member]. Even if we change the display name from “Member” to “Hero”, our variable would still be [$Member]. And, since Member is a lookup column, if we want to show the display name of the user, we need to use the title property. We’d do that in the following way [$Member.title].


 


The World Is Not In Your Books And Maps. It Is Out There.


Alright. Enough with the lessons, it’s time to get started.


 


We can use the “map” we created earlier and turn it into a rough skeleton. Each layer in that blowout represent a parent/child relationship. So, by looking at our map…


 


blowout-witharrows.png


 


We come up with this.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json”,
“hideColumnHeader”: true,
“hideSelection”: true,
“rowFormatter”: {
“elmType”: “div”,
“attributes”: { “title”: “Parent Container” },
“children”: [{
“elmType”: “img”,
“attributes”: { “title”: “Background Image” },
“children”: [{
“elmType”: “div”,
“attributes”: { “title”: “Column Container” },
“children”: [
{
“elmType”: “div”,
“attributes”: { “title”: “Member/Role DIV” },
“children”: [
{
“elmType”: “img”,
“attributes”: { “title”: “Large Member profile picture” }
},
{
“columnFormatterReference”: “[$Title]”
}
]
},
{
“elmType”: “div”,
“attributes”: { “title”: “Text DIV” },
“children”: [{
“elmType”: “div”,
“attributes”: { “title”: “Member Name row/div” }
},
{
“elmType”: “div”,
“attributes”: { “title”: “Age row/div” }
},
{
“elmType”: “div”,
“attributes”: { “title”: “From row/div” }
}

]
},
{
“elmType”: “div”,
“attributes”: {
“title”: “Race/Weapons DIV/Column”
},
“children”: [{
“elmType”: “div”,
“attributes”: { “title”: “Race icon DIV/Row” },
“children”: []
},
{
“elmType”: “div”,
“attributes”: { “title”: “Weapon icons DIV/Row” },
“children”: []
}
]
}
]
}]
}]
}
}


 


That’s the basic layout of our custom view, simply a series of parent and child divs. We’ll start filling this skeleton out with content shortly, but there are a couple of things to point out already.


 


First, there are several examples of this “attributes”: { “title”: “<TEXT>” } pattern. We can use this as a means of commenting about the purpose of the element, since comments aren’t allowed in valid JSON and would break our view. Again, this isn’t required and adds absolutely no value to the view itself. It does, however, help keep us (and any future adventurer) oriented as to where we are in our JSON.


 



NOTE: Using the title attribute will cause whatever you specify to be displayed as a tooltip when a user hovers over the element. You can remove your titles after you done, if that bothers you. Otherwise, just be aware that users may see your witty comments.



Also, in the “Member/Role DIV” children, the second child looks a little peculiar.


{
“columnFormatterReference”: “[$Title]”
}

This columnFormatterReference property is a nifty shortcut that tells the view formatter to display the referenced field (Title, in this case) as it normally would, including any custom column formatting that may have been configured. This is a great opportunity for some reusability, especially if you want the column to show exactly the same way on every view.


 


If you take our skeleton and put it into SharePoint, there’s not going to be much to look at. So let’s fix that.


 


Putting some meat on the bone


Now that we’ve got our skeleton all rigged up, it’s time to fill it out some.


 


It’s certainly a little short and skinny, so let’s start by defining some CSS on our parent div. We know we want a border around the whole thing, as well as a particular font style and size, so we can apply those things at the top level.


 


“style”: {
“position”: “relative”,
“border”: “5px solid black”,
“border-radius”: “10px”,
“width”: “600px”,
“height”: “175px”,
“font-family”: “Luminari, Papyrus, Brush Script MT”,
“font-size”: “24px”
}

We’re also specifying a position value of “relative”, which tells the browser to display that DIV relative to it’s parent container. In this case, that parent container will be the row in the list. It won’t have any noticeable effect here, but will help us later.


 


Let’s also go ahead and setup our second layer too, our background image. Normally, we’d just use the css property background-image and point it to a URL. Unfortunately, we can’t do that here because the ( character is prohibited in most use cases. So, instead, we have to use an img element and size it appropriately.


 


{
“elmType”: “img”,
“style”: {
“width”: “100%”,
“height”: “100%”,
“z-index”: “-3”,
“opacity”: “.5”
},
“attributes”: {
“title”: “Background Image”,
“src”: “=@currentWeb + ‘/SiteAssets/MiddleEarthLocales/’ + [$From.lookupValue] + ‘.jpg'”
},
“children”: […]
}

We’ve added the src attribute, which should look mostly familiar. Notice, though, that we’re referencing the [$From] variable.


 


We’re also setting the width and height to be 100% of the parent so the image fills the space and we’re setting the opacity to half so that the image is a little on the transparent side (this will help the text and images we lay on top of it stand out more).


 


Finally, we’re setting this z-index property to a negative value. Typically, HTML will render any content inside of the div on top of the div. Think of it like a stack of plates. That last thing you put on the stack is the most visible. We can use the z-index property to affect that, and by setting to a negative value here, we’re ensuring that out content will be rendered behind our parent div. Without this, the background image would cover up our border.


 


Stylin’ and Profilin’


Now that we’ve got our first two layers done, let’s take a look at our third layer. If we refer back to our skeleton, we can see that our img element has a single child titled “Column Container”, and that child has three children of its own. What we want to happen is to have a three-column layout and to do that, we’re going to style this “column container” like so.


 


“style”: {
“position”: “absolute”,
“width”: “100%”,
“height”: “100%”,
“display”: “flex”
}

 


We have to specify the width and height here as being “100%” because, without it, the DIV will only grow as large as the content and we want to ensure that it stays as large as it can. We’re also specifying a different position value here – absolute – which basically tells the browser to render our DIV at a specific position. In this case, we’re letting it default the starting point, which is the “top left corner” of the first ancestor element with a “position” attribute on it (in this case, our parent div, which we said was relative positioned).


 


We’re also specifying a display property with a value of flex. This creates what’s known as “Flexbox” which will help us deal with the concept of turning our child DIVs into “Columns” and “Rows”.


 


Now that we’ve got our container, let’s work on the next three children, which will represent our three columns.


 


First column


We’ll just div right into the definition for our first column, which is a simple parent div to hold our image and role icon.


 


{
“elmType”: “div”,
“attributes”: { “title”: “Member/Role DIV” },
“children”: [
{
“elmType”: “img”,
“attributes”: {
“src”: “=replace([$Member.picture], ‘MThumb’, ‘LThumb’)”
},
“style”: {
“height”: “175px”,
“width”: “175px”,
“border-style”: “solid”,
“border-color”: “black”,
“border-width”: “0px 5px 0px 0px”
}
},
{
“columnFormatterReference”: “[$Title]”
}
]
}

Two points of interest here.


 


First, for the src attribute for our img property, we’re using the replace() function to swap out the text ‘MTHUMB’ for ‘LTHUMB’. When a user uploads a profile picture, SharePoint will create three versions of it (large, medium, and small). For formatting, referencing the picture property will always return the medium thumbnail. Rather than stretching a smaller thumbnail, we can use pattern to retrieve the larger one instead.


 


Also, because we formatted the Role (which is a rename of the Title column), we don’t have specify the definition here. Instead, we’re using the columnFormatterReference property and referencing our field.


 



NOTE: The column formatting for Role was slightly updated from the previous blog.



Just for reference, here’s the definition we created for the custom column formatting used on the Role field.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json”,
“elmType”: “div”,
“style”: {
“width”: “24px”,
“height”: “24px”,
“font-size”: “24px”,
“background-color”: “green”,
“color”: “white”,
“position”: “absolute”,
“left”: “0”,
“bottom”: “0”,
“border-radius”: “4px”
},
“children”: [{
“elmType”: “div”,
“style”: {
“margin”: “auto”
},
“attributes”: {
“iconName”: “=if(@currentField == ‘Ring-bearer’, ‘StatusCircleRing’, if(@currentField == ‘Guardian’, ‘Shield’, if(@currentField == ‘Melee’, ‘DecisionSolid’, ‘Bullseye’)))”
}
}]
}

At this point, we have something like the below image.


 


column-1.png


 


Second column


Our second column consists of three rows, each containing a different bit of text relating information about the current member. Here’s the definition for this section.


 


{
“elmType”: “div”,
“attributes”: {
“title”: “Text DIV”
},
“style”: {
“padding-left”: “5px”,
“color”: “white”,
“width”: “inherit”,
“text-shadow”: “2px 2px 0 #000000”,
“font-weight”: “bolder”,
“display”: “flex”,
“flex-direction”: “column”,
“justify-content”: “space-between”
},
“children”: [
{
“elmType”: “div”,
“style”: {
“font-size”: “1.5em”
},
“txtContent”: “[$Member.title]”
},
{
“elmType”: “div”,
“style”: {
“font-size”: “1.25em”
},
“txtContent”: “=’Age: ‘ + [$Age.displayValue]”
},
{
“elmType”: “div”,
“style”: {
“font-size”: “1.25em”
},
“txtContent”: “=’From: ‘ + [$From.lookupValue]”
}
]
}

 


The only thing of real note here is that our parent container in this case is again defining a “Flexbox” with its display property. We’re also using two new properties, flex-direction and justify-content, to control how our children are displayed relative to one another.


We’re using the width property with a value of inherit to force our column to take up the maximum amount of width possible. It won’t have a noticeable affect here, but will come into play in the next section.


 


The flex-direction property tells the browser to make each child grow to take up the entire column, width wise. That will force each child div onto its own line.


 


The justify-content property, on the other hand, tells the browser to evenly distribute our rows across the available height.


We’re getting closer to our desired end result.


 


column-2.png


 


The final column


Our last column consists of two rows of equal size to hold our Race and Weapon Icons. Let’s take a look.


 


{
“elmType”: “div”,
“attributes”: { “title”: “Race/Weapons DIV/Column” },
“style”: {
“width”: “48px”,
“padding”: “5px 5px 5px 0px”,
“display”: “flex”,
“flex-direction”: “column”
},
“children”: [
{
“elmType”: “div”,
“attributes”: { “title”: “Race icon DIV/Row” },
“style”: {
“flex-grow”: “1”
},
“children”: [{
“columnFormatterReference”: “[$Race]”
}]
},
{
“elmType”: “div”,
“attributes”: { “title”: “Weapon icons DIV/Row” },
“children”: [{
“columnFormatterReference”: “[$Weapons]”
}]
}
]
}

There’s nothing new to discuss here, but it does finish off our sample.


 


column-3.png


 


The Complete Schema


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json”,
“hideColumnHeader”: true,
“hideSelection”: true,
“rowFormatter”: {
“elmType”: “div”,
“style”: {
“position”: “relative”,
“border”: “5px solid black”,
“border-radius”: “10px”,
“width”: “600px”,
“height”: “175px”,
“font-family”: “Luminari, Papyrus, Brush Script MT”,
“font-size”: “24px”
},
“attributes”: {
“title”: “Parent Container”
},
“children”: [{
“elmType”: “img”,
“style”: {
“width”: “100%”,
“height”: “100%”,
“z-index”: “-3”,
“opacity”: “.5”
},
“attributes”: {
“title”: “Background Image”,
“src”: “=@currentWeb + ‘/SiteAssets/MiddleEarthLocales/’ + [$From.lookupValue] + ‘.jpg'”
},
“children”: [{
“elmType”: “div”,
“attributes”: { “title”: “Column Container” },
“style”: {
“position”: “absolute”,
“width”: “100%”,
“height”: “100%”,
“display”: “flex”
},
“children”: [{
“elmType”: “div”,
“attributes”: {
“title”: “Member/Role DIV”
},
“children”: [{
“elmType”: “img”,
“attributes”: {
“src”: “=replace([$Member.picture], ‘MThumb’, ‘LThumb’)”
},
“style”: {
“height”: “175px”,
“width”: “175px”,
“border-style”: “solid”,
“border-color”: “black”,
“border-width”: “0px 5px 0px 0px”
}
},
{
“columnFormatterReference”: “[$Title]”
}
]
},
{
“elmType”: “div”,
“attributes”: {
“title”: “Text DIV”
},
“style”: {
“padding-left”: “5px”,
“color”: “white”,
“width”: “inherit”,
“text-shadow”: “2px 2px 0 #000000”,
“font-weight”: “bolder”,
“display”: “flex”,
“flex-direction”: “column”,
“justify-content”: “space-between”
},
“children”: [{
“elmType”: “div”,
“style”: {
“font-size”: “1.5em”
},
“txtContent”: “[$Member.title]”
},
{
“elmType”: “div”,
“style”: {
“font-size”: “1.25em”
},
“txtContent”: “=’Age: ‘ + [$Age.displayValue]”
},
{
“elmType”: “div”,
“style”: {
“font-size”: “1.25em”
},
“txtContent”: “=’From: ‘ + [$From.lookupValue]”
}
]
},
{
“elmType”: “div”,
“attributes”: { “title”: “Race/Weapons DIV/Column” },
“style”: {
“width”: “48px”,
“padding”: “5px 5px 5px 0px”,
“display”: “flex”,
“flex-direction”: “column”
},
“children”: [{
“elmType”: “div”,
“attributes”: { “title”: “Race icon DIV/Row” },
“style”: {
“flex-grow”: “1”
},
“children”: [{
“columnFormatterReference”: “[$Race]”
}]
},
{
“elmType”: “div”,
“attributes”: { “title”: “Weapon icons DIV/Row” },
“children”: [{
“columnFormatterReference”: “[$Weapons]”
}]
}
]
}
]
}]
}]
}
}

 


Our adventure draws near its end


Now that we’ve got our view formatted, we’re done, right? We could be, but the list view is off somehow…


 


list-view-complete.png


 


Look at all that empty white space! Such a waste, but showing each item in a row is what the list view does. Sometimes, that may be exactly what you need in some cases but here…we don’t need it.


 


Instead, we can use the “Gallery” (or “Tile)” view, which will display our items in a grid view.


 


We can copy the the schema we’ve already defined, and change the selected layout from “List” to “Gallery”


 


format-options.png


 


After that, we can paste it in, but we’ll need to modify things every so slightly, as the Gallery layout has some additional properties we need to specify. Let’s look at the basic schema for a gallery view.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/tile-formatting.schema.json”,
“height”: 175,
“width”: 650,
“fillHorizontally”: true,
“hideSelection”: true,
“formatter”: { }
}

Unlike columns and list view formats, the tile schema wants us to specify an exact width and height (in pixels) for each tile. It’s not strictly required, but we’ll want to supply our own values here to ensure that each card has the right dimensions.


 


We’re also using a new property, fillHorizontally, which will ensure that our cards do not overlap one another.


 


Finally, instead of the rowFormatter object we use in List views, we have a simple formatter property for our Tile views.


 


After that, we can simply copy the contents of the rowFormatter property in the list view example and paste them into the new formatter property.


 


Doing that should get us to where we want to be.


 


final-product.png


Prologue


Over the course of two blogs, we’ve covered the basic building blocks of custom column formatting as well as how to customize our list and gallery views. We turned a boring old list of text into far less boring visuals, and then turned those visuals into a “who’s who” of Middle Earth. 


 


And while our journey together might be coming to an end, it doesn’t mean your adventures are over. Take what you’ve learned, go out into the world, and make your lists beautiful!

Help shape the Universal Print roadmap

This article is contributed. See the original author and article here.

The Universal Print team tracks feature requests and ideas for improving Universal Print on the Tech Community at http://aka.ms/UPIdeas. This space allows Tech Community members to contribute new ideas and upvote or provide comments on existing ideas.


The idea board is very important to the Universal Print team. There are so many features we want to add in Universal Print, but we can’t work on everything at the same time. Submitting and upvoting ideas helps us decide what to work on first.


The meaning of the different idea states


The Universal Print team periodically reviews feature requests and assigns or updates the state of each idea. Here is the list of the states and their meaning:



  • New = Not yet reviewed.

  • Looking into it = Being considered.

  • Clarification needed = The Universal Print team needs more information about this idea. 

  • Feedback needed = The Universal Print team wants your feedback on this idea.

  • Planned = On our backlog. Work has not started.

  • In progress = in active development.

  • In progress: partner = Feature will first be available in partner solutions.

  • Duplicate = Another idea post contains this feature.

  • Not planned = We currently have no plans to introduce this feature.

  • Completed = Feature is currently available.


How to effectively use the ideas board


First, please search the idea board to see if the idea or feature request you have has been posted by someone else. If the idea exists, please upvote it. Otherwise, please submit it as a new idea.


When submitting new ideas, submit one post per idea. Posts with multiple ideas tend not to get upvoted and receive less attention.


Always add comments to ideas you submit or upvote. Let us know as much detail as possible about the scenario you would like to enable and the user flow you would like to see.


Providing feedback


Your comments on any of the idea posts are always appreciated. Especially, in the case when the Universal Print team submits an idea and marks it with the state “Feedback needed”. These posts will contain an idea we are investigating or a scenario we want to verify is important to our customers.


Please upvote these ideas if you believe they are important to your organization and leave a comment with any additional suggestions you have. Alternatively, you can comment to let us know why the suggested idea is not important to your organization.


Try it out


Go to http://aka.ms/UPIdeas now to view the list of ideas, upvote the ones you want to see in Universal Print and leave comments with your specific requirements.


By contributing to the idea board, you help shape the future of Universal Print into what you want it to be.